tower-studio 0.2.44 → 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 +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 +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.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 +4 -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 -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 +4 -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 +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 +2 -2
- 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 +66 -66
- 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 +111 -111
- 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 +96 -96
- 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 +79 -79
- 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 +79 -79
- 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 +69 -69
- 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 +79 -79
- 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 +54 -54
- 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/{[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]__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]__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]__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]__0_zfnj0._.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]__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/{_12537g8._.js → _02hac5p._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_0q10iet._.js → _0je3dz2._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_0qk_esg._.js +2 -2
- 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_05balzk._.js +3 -0
- 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_0gif-f5._.js +3 -0
- package/.next/standalone/.next/server/chunks/src_0vp6.co._.js +3 -0
- 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_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]__04ednzb._.js → [root-of-the-server]__0tb.1li._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0zzqn5z._.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/{_0kojxno._.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/{_11osha9._.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/{_0foto06._.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/{_0r4_qn~._.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_00wjv6n._.js → src_lib_0-x.wbd._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_lib_005uqbe._.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_01sr8_t._.js → src_lib_03xtona._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{src_lib_0.~.oo-._.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/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 +594 -342
- package/.next/standalone/.next/static/chunks/0-nppzqp-r.9c.js +1 -0
- package/.next/standalone/.next/static/chunks/{11pe3kpxuj33f.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/{041o.dh2lc-k3.js → 00.eotegra08r.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0rcuiuax31_uh.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/{0uj-3ckujwaiy.js → 09bezwcb__18t.js} +1 -1
- package/.next/standalone/.next/static/chunks/0bvhkgitn__gl.js +1 -0
- package/.next/standalone/.next/static/chunks/0c.t.evwah_m4.js +1 -0
- package/.next/standalone/.next/static/chunks/{0346xrw6i2bwo.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/{0gvfb.b8m_i8t.js → 0gy79dfi~lnig.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0xg6rcq6g4bbh.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/{0cpwtqzrjdgvs.js → 0nw8nx8kafy79.js} +1 -1
- 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/package.json +5 -5
- package/dist/mcp-server.cjs +206 -23
- 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/[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]__0657y50._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06ndn7a._.js +0 -4
- 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]__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]__0i34gbs._.js +0 -4
- 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]__0pl.c5.._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0r~9.7c._.js +0 -4
- 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]__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]__0zi3~a8._.js +0 -3
- 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_0fq3zjg._.js +0 -3
- package/.next/standalone/.next/server/chunks/src_0weytpz._.js +0 -3
- package/.next/standalone/.next/server/chunks/src_0wlyw0g._.js +0 -3
- package/.next/standalone/.next/server/chunks/src_0~ey84y._.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]__00ebsjb._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01fmnse._.js +0 -3
- 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]__049n47u._.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]__081e5n~._.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]__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]__0ugledi._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vxlsec._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w0.sdz._.js +0 -3
- 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]__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]__13ce7v2._.js +0 -30
- package/.next/standalone/.next/server/chunks/ssr/_02vz78l._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_04~mjmb._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_070t_mh._.js +0 -6
- package/.next/standalone/.next/server/chunks/ssr/_0_nhdgs._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0cj9a7y._.js +0 -7
- package/.next/standalone/.next/server/chunks/ssr/_0i4xdso._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0rxeqmo._.js +0 -17
- package/.next/standalone/.next/server/chunks/ssr/_0u3yt.5._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/_0ye1-r-._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0zr81mw._.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-tuek2jqf0el.js +0 -1
- package/.next/standalone/.next/static/chunks/0.-.jc~0b~hy0.js +0 -1
- package/.next/standalone/.next/static/chunks/0.lqb7y9kz5z6.js +0 -1
- package/.next/standalone/.next/static/chunks/0.~03w.uxge40.js +0 -1
- package/.next/standalone/.next/static/chunks/01hdj_kw4z2zq.js +0 -2
- package/.next/standalone/.next/static/chunks/01yoibobkdz3x.js +0 -1
- package/.next/standalone/.next/static/chunks/07i9j5yyg4vs3.js +0 -1
- package/.next/standalone/.next/static/chunks/08ooaq~-.8fzu.js +0 -1
- package/.next/standalone/.next/static/chunks/0bylodlncwfpb.js +0 -5
- package/.next/standalone/.next/static/chunks/0clewc5ifaruu.js +0 -12
- package/.next/standalone/.next/static/chunks/0c~e1-nst-ze-.js +0 -1
- package/.next/standalone/.next/static/chunks/0ddt-snh45031.js +0 -1
- package/.next/standalone/.next/static/chunks/0dv4anj-j523o.js +0 -1
- package/.next/standalone/.next/static/chunks/0h77-u2vvr-a1.js +0 -1
- package/.next/standalone/.next/static/chunks/0jrje~1gt6w85.css +0 -1
- package/.next/standalone/.next/static/chunks/0lqp~-dlfenad.js +0 -1
- package/.next/standalone/.next/static/chunks/0p4w5b_p_yju8.js +0 -1
- package/.next/standalone/.next/static/chunks/0qkr26yz3bocs.js +0 -1
- package/.next/standalone/.next/static/chunks/0uf~7eqel0zra.js +0 -1
- package/.next/standalone/.next/static/chunks/0w71r_sj_fibx.js +0 -1
- package/.next/standalone/.next/static/chunks/0xejm4ge9~cn..js +0 -1
- package/.next/standalone/.next/static/chunks/0yff8rwmrl5m4.js +0 -1
- package/.next/standalone/.next/static/chunks/0ymipmkk2uqby.js +0 -1
- package/.next/standalone/.next/static/chunks/0znfclapbniaa.js +0 -1
- package/.next/standalone/.next/static/chunks/172s9cg35qt7i.js +0 -1
- package/.next/standalone/.next/static/chunks/184-zu89wwa4u.js +0 -1
- /package/.next/standalone/.next/static/{dinNvsaC6aoPK_B7ZTeBv → f1860bJqnbYj-1WLMj7F-}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{dinNvsaC6aoPK_B7ZTeBv → f1860bJqnbYj-1WLMj7F-}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{dinNvsaC6aoPK_B7ZTeBv → 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
|
});
|
|
@@ -26590,7 +26596,12 @@ var init_config_defaults = __esm({
|
|
|
26590
26596
|
"",
|
|
26591
26597
|
"## Scope Boundary",
|
|
26592
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:",
|
|
26593
|
-
'"\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"
|
|
26594
26605
|
].join("\n"),
|
|
26595
26606
|
type: "string",
|
|
26596
26607
|
label: "Assistant System Prompt"
|
|
@@ -26622,6 +26633,74 @@ var init_config_defaults = __esm({
|
|
|
26622
26633
|
defaultValue: false,
|
|
26623
26634
|
type: "boolean",
|
|
26624
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)"
|
|
26625
26704
|
}
|
|
26626
26705
|
};
|
|
26627
26706
|
}
|
|
@@ -29270,7 +29349,7 @@ var require_websocket = __commonJS({
|
|
|
29270
29349
|
var http = require("http");
|
|
29271
29350
|
var net = require("net");
|
|
29272
29351
|
var tls = require("tls");
|
|
29273
|
-
var { randomBytes, createHash } = require("crypto");
|
|
29352
|
+
var { randomBytes, createHash: createHash2 } = require("crypto");
|
|
29274
29353
|
var { Duplex, Readable } = require("stream");
|
|
29275
29354
|
var { URL: URL2 } = require("url");
|
|
29276
29355
|
var PerMessageDeflate2 = require_permessage_deflate();
|
|
@@ -29930,7 +30009,7 @@ var require_websocket = __commonJS({
|
|
|
29930
30009
|
abortHandshake(websocket, socket, "Invalid Upgrade header");
|
|
29931
30010
|
return;
|
|
29932
30011
|
}
|
|
29933
|
-
const digest =
|
|
30012
|
+
const digest = createHash2("sha1").update(key + GUID).digest("base64");
|
|
29934
30013
|
if (res.headers["sec-websocket-accept"] !== digest) {
|
|
29935
30014
|
abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header");
|
|
29936
30015
|
return;
|
|
@@ -30297,7 +30376,7 @@ var require_websocket_server = __commonJS({
|
|
|
30297
30376
|
var EventEmitter = require("events");
|
|
30298
30377
|
var http = require("http");
|
|
30299
30378
|
var { Duplex } = require("stream");
|
|
30300
|
-
var { createHash } = require("crypto");
|
|
30379
|
+
var { createHash: createHash2 } = require("crypto");
|
|
30301
30380
|
var extension2 = require_extension();
|
|
30302
30381
|
var PerMessageDeflate2 = require_permessage_deflate();
|
|
30303
30382
|
var subprotocol2 = require_subprotocol();
|
|
@@ -30598,7 +30677,7 @@ var require_websocket_server = __commonJS({
|
|
|
30598
30677
|
);
|
|
30599
30678
|
}
|
|
30600
30679
|
if (this._state > RUNNING) return abortHandshake(socket, 503);
|
|
30601
|
-
const digest =
|
|
30680
|
+
const digest = createHash2("sha1").update(key + GUID).digest("base64");
|
|
30602
30681
|
const headers = [
|
|
30603
30682
|
"HTTP/1.1 101 Switching Protocols",
|
|
30604
30683
|
"Upgrade: websocket",
|
|
@@ -32216,14 +32295,14 @@ async function clearSessionPid(sessionKey) {
|
|
|
32216
32295
|
} catch {
|
|
32217
32296
|
}
|
|
32218
32297
|
}
|
|
32219
|
-
var import_promises,
|
|
32298
|
+
var import_promises, import_node_path4, SIGNAL_DIR, PID_PREFIX;
|
|
32220
32299
|
var init_orphan_reaper = __esm({
|
|
32221
32300
|
"src/lib/pty/orphan-reaper.ts"() {
|
|
32222
32301
|
"use strict";
|
|
32223
32302
|
import_promises = require("node:fs/promises");
|
|
32224
|
-
import_node_os3 = require("node:os");
|
|
32225
32303
|
import_node_path4 = require("node:path");
|
|
32226
|
-
|
|
32304
|
+
init_tower_dir();
|
|
32305
|
+
SIGNAL_DIR = getSignalDir();
|
|
32227
32306
|
PID_PREFIX = "pid-";
|
|
32228
32307
|
}
|
|
32229
32308
|
});
|
|
@@ -32295,6 +32374,13 @@ var init_session_store = __esm({
|
|
|
32295
32374
|
}
|
|
32296
32375
|
});
|
|
32297
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
|
+
|
|
32298
32384
|
// src/lib/assistant-constants.ts
|
|
32299
32385
|
var init_assistant_constants = __esm({
|
|
32300
32386
|
"src/lib/assistant-constants.ts"() {
|
|
@@ -32370,6 +32456,7 @@ var init_ws_server = __esm({
|
|
|
32370
32456
|
"use strict";
|
|
32371
32457
|
init_wrapper();
|
|
32372
32458
|
init_session_store();
|
|
32459
|
+
init_strip_device_queries();
|
|
32373
32460
|
init_config_reader();
|
|
32374
32461
|
init_assistant_constants();
|
|
32375
32462
|
init_session_store2();
|
|
@@ -32483,9 +32570,9 @@ var init_claude_cli_adapter = __esm({
|
|
|
32483
32570
|
const settings = this.readSettings();
|
|
32484
32571
|
const hooks = settings["hooks"] ?? {};
|
|
32485
32572
|
const root = getPackageRoot().replace(/\\/g, "/");
|
|
32486
|
-
const sessionStart = path4.join(root, "scripts", "session-start-hook.js").replace(/\\/g, "/");
|
|
32487
|
-
const postTool = path4.join(root, "scripts", "post-tool-hook.js").replace(/\\/g, "/");
|
|
32488
|
-
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, "/");
|
|
32489
32576
|
let changed = false;
|
|
32490
32577
|
changed = this.upsertHook(hooks, "SessionStart", "session-start-hook.js", {
|
|
32491
32578
|
hooks: [{ command: `node "${sessionStart}"`, timeout: 5, type: "command" }]
|
|
@@ -32524,18 +32611,18 @@ var init_claude_cli_adapter = __esm({
|
|
|
32524
32611
|
const hooks = settings["hooks"] ?? {};
|
|
32525
32612
|
const root = getPackageRoot().replace(/\\/g, "/");
|
|
32526
32613
|
const map2 = [
|
|
32527
|
-
["SessionStart", "session-start-hook.js"],
|
|
32528
|
-
["PostToolUse", "post-tool-hook.js"],
|
|
32529
|
-
["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"]
|
|
32530
32617
|
];
|
|
32531
32618
|
let changed = false;
|
|
32532
|
-
for (const [event,
|
|
32619
|
+
for (const [event, matchName, wantedName] of map2) {
|
|
32533
32620
|
const entries = this.getHookArray(hooks, event);
|
|
32534
32621
|
const idx = entries.findIndex(
|
|
32535
|
-
(e2) => e2?.hooks?.some?.((h10) => h10.command?.includes(
|
|
32622
|
+
(e2) => e2?.hooks?.some?.((h10) => h10.command?.includes(matchName))
|
|
32536
32623
|
);
|
|
32537
32624
|
if (idx < 0) continue;
|
|
32538
|
-
const wantedPath = path4.join(root, "scripts",
|
|
32625
|
+
const wantedPath = path4.join(root, "scripts", wantedName).replace(/\\/g, "/");
|
|
32539
32626
|
const wantedCmd = `node "${wantedPath}"`;
|
|
32540
32627
|
const hookCmd = entries[idx]?.hooks?.[0];
|
|
32541
32628
|
if (!hookCmd || hookCmd.command === wantedCmd) continue;
|
|
@@ -54309,7 +54396,8 @@ var taskTools = {
|
|
|
54309
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."),
|
|
54310
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."),
|
|
54311
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."),
|
|
54312
|
-
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.")
|
|
54313
54401
|
}),
|
|
54314
54402
|
handler: async (args) => {
|
|
54315
54403
|
const explicitWorktree = args.useWorktree !== void 0;
|
|
@@ -54350,6 +54438,15 @@ var taskTools = {
|
|
|
54350
54438
|
}
|
|
54351
54439
|
}
|
|
54352
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
|
+
}
|
|
54353
54450
|
const task = await db.task.create({
|
|
54354
54451
|
data: {
|
|
54355
54452
|
title: args.title,
|
|
@@ -54359,7 +54456,9 @@ var taskTools = {
|
|
|
54359
54456
|
status: args.status ?? "TODO",
|
|
54360
54457
|
baseBranch,
|
|
54361
54458
|
versionId,
|
|
54362
|
-
subPath: args.subPath ?? null
|
|
54459
|
+
subPath: args.subPath ?? null,
|
|
54460
|
+
parentTaskId: resolvedParentId,
|
|
54461
|
+
unattended: args.unattended ?? false
|
|
54363
54462
|
}
|
|
54364
54463
|
});
|
|
54365
54464
|
if (args.labelIds && args.labelIds.length > 0) {
|
|
@@ -54441,10 +54540,10 @@ ${refText}`;
|
|
|
54441
54540
|
}
|
|
54442
54541
|
const attachmentInfo = attachmentFailures.length > 0 ? { attachmentFailures } : {};
|
|
54443
54542
|
if (autoStart) {
|
|
54444
|
-
const
|
|
54543
|
+
const PORT3 = process.env.PORT ?? "3000";
|
|
54445
54544
|
const prompt = args.title;
|
|
54446
54545
|
try {
|
|
54447
|
-
const res = await fetch(`http://localhost:${
|
|
54546
|
+
const res = await fetch(`http://localhost:${PORT3}/api/internal/terminal/${task.id}/start`, {
|
|
54448
54547
|
method: "POST",
|
|
54449
54548
|
headers: { "Content-Type": "application/json" },
|
|
54450
54549
|
body: JSON.stringify({ prompt })
|
|
@@ -55581,6 +55680,89 @@ var reportTools = {
|
|
|
55581
55680
|
}
|
|
55582
55681
|
};
|
|
55583
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
|
+
|
|
55584
55766
|
// src/mcp/server.ts
|
|
55585
55767
|
function createServer() {
|
|
55586
55768
|
const server = new import_mcp.McpServer({ name: "tower", version: "0.1.0" });
|
|
@@ -55593,7 +55775,8 @@ function createServer() {
|
|
|
55593
55775
|
...knowledgeTools,
|
|
55594
55776
|
...noteAssetTools,
|
|
55595
55777
|
...terminalTools,
|
|
55596
|
-
...reportTools
|
|
55778
|
+
...reportTools,
|
|
55779
|
+
...harnessTools
|
|
55597
55780
|
};
|
|
55598
55781
|
for (const [name, tool] of Object.entries(allTools)) {
|
|
55599
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({
|
package/skills/tower/SKILL.md
CHANGED
|
@@ -39,6 +39,7 @@ Use Tower tools when the user wants to:
|
|
|
39
39
|
- Organize tasks with labels or status changes
|
|
40
40
|
- Get daily work summary or pending todo list
|
|
41
41
|
- Check what was done today or what's left to do
|
|
42
|
+
- **Run or relay unattended tasks** — when `TOWER_UNATTENDED=1`, or you need to push an `ask_human` / `notify_human` to a person, or relay a human's reply back into a parked task (`reply_to_ask`): read [`references/unattended-messaging.md`](references/unattended-messaging.md) for the send/receive contract.
|
|
42
43
|
|
|
43
44
|
---
|
|
44
45
|
|
|
@@ -255,6 +256,23 @@ section so we can always trace **why** a task exists and **who** asked for it.
|
|
|
255
256
|
hard locators (chat id / message id / link) verbatim — they are what makes the
|
|
256
257
|
task traceable later.
|
|
257
258
|
|
|
259
|
+
#### Parent task derivation (派生子任务)
|
|
260
|
+
|
|
261
|
+
If `TOWER_TASK_ID` is set in your environment (run `echo $TOWER_TASK_ID` to check),
|
|
262
|
+
you are operating **inside a Tower task terminal** — so any task you create here is
|
|
263
|
+
a **child task derived from the current (parent) task**. Render its source as:
|
|
264
|
+
|
|
265
|
+
```
|
|
266
|
+
## 来源
|
|
267
|
+
|
|
268
|
+
- 渠道:父任务派生
|
|
269
|
+
- 父任务:{当前任务标题,知道就填}(id: $TOWER_TASK_ID)
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Tower also records this link structurally on the new task's `parentTaskId`
|
|
273
|
+
automatically (used for parent→child completion notifications) — this `## 来源`
|
|
274
|
+
is just the human-readable mirror. The id alone is enough if you don't know the title.
|
|
275
|
+
|
|
258
276
|
#### Bridge metadata contract (`<task-source>` block)
|
|
259
277
|
|
|
260
278
|
External bridges (Feishu/Lark, etc.) inject a machine-readable block into the
|
|
@@ -468,6 +486,19 @@ Categories: `task`, `project`, `repository`, `note`, `asset`, `all`. Result coun
|
|
|
468
486
|
|
|
469
487
|
---
|
|
470
488
|
|
|
489
|
+
## 无人值守收发消息(Unattended messaging)
|
|
490
|
+
|
|
491
|
+
When operating in unattended mode (`TOWER_UNATTENDED=1`) or acting as the bridge that relays a
|
|
492
|
+
human's reply back to a parked task, follow the send/receive contract in
|
|
493
|
+
[`references/unattended-messaging.md`](references/unattended-messaging.md). Key points:
|
|
494
|
+
|
|
495
|
+
- Tower **only records + parks/resumes** — it never sends platform messages. You (the agent/bridge)
|
|
496
|
+
send via the platform's own MCP (Feishu/WeChat/OpenClaw…).
|
|
497
|
+
- Every outbound ask/notify **must** carry the correlation token `[[tower:task=<taskId>]]`.
|
|
498
|
+
- Relay a human's reply with the **`reply_to_ask(taskId, text)`** MCP tool (not raw
|
|
499
|
+
`send_task_terminal_input`) so Tower records the reply. If it returns `{ no_pending: true }`,
|
|
500
|
+
handle the message as an ordinary request.
|
|
501
|
+
|
|
471
502
|
## Important Rules
|
|
472
503
|
|
|
473
504
|
- **Scope boundary**: You are a **task management operator only**. If the user asks you to write code, explain code, debug, search the web, read/write files, or anything outside Tower task management, reply: "抱歉,我只能帮你管理工作区、项目和任务。编码、调试等操作请在任务终端中完成。" Do NOT attempt to answer out-of-scope questions.
|