viba-cli 0.39.0 → 0.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/fallback-build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error/page.js +1 -1
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +2 -2
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/component-source/resolve/route.js +1 -1
- package/.next/server/app/api/component-source/resolve/route.js.nft.json +1 -1
- package/.next/server/app/api/credentials/github/repos/route.js +1 -1
- package/.next/server/app/api/credentials/github/repos/route.js.nft.json +1 -1
- package/.next/server/app/api/credentials/route.js +1 -1
- package/.next/server/app/api/credentials/route.js.nft.json +1 -1
- package/.next/server/app/api/custom-scripts/route.js +2 -2
- package/.next/server/app/api/custom-scripts/route.js.nft.json +1 -1
- package/.next/server/app/api/git/action/route.js +3 -3
- package/.next/server/app/api/git/action/route.js.nft.json +1 -1
- package/.next/server/app/api/git/branches/route.js +3 -3
- package/.next/server/app/api/git/branches/route.js.nft.json +1 -1
- package/.next/server/app/api/git/diff/route.js +2 -2
- package/.next/server/app/api/git/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/git/log/route.js +2 -2
- package/.next/server/app/api/git/log/route.js.nft.json +1 -1
- package/.next/server/app/api/git/status/route.js +3 -3
- package/.next/server/app/api/git/status/route.js.nft.json +1 -1
- package/.next/server/app/api/preview-proxy/start/route.js +1 -1
- package/.next/server/app/api/preview-proxy/start/route.js.nft.json +1 -1
- package/.next/server/app/api/repos/clone/route.js +2 -2
- package/.next/server/app/api/repos/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repos/route.js +2 -2
- package/.next/server/app/api/repos/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/route.js +1 -1
- package/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/server/app/credentials/page/server-reference-manifest.json +7 -7
- package/.next/server/app/credentials/page.js +1 -1
- package/.next/server/app/credentials/page.js.nft.json +1 -1
- package/.next/server/app/credentials/page_client-reference-manifest.js +1 -1
- package/.next/server/app/credentials.html +2 -2
- package/.next/server/app/credentials.rsc +4 -4
- package/.next/server/app/credentials.segments/_full.segment.rsc +4 -4
- package/.next/server/app/credentials.segments/_head.segment.rsc +1 -1
- package/.next/server/app/credentials.segments/_index.segment.rsc +2 -2
- package/.next/server/app/credentials.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/credentials.segments/credentials/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/credentials.segments/credentials.segment.rsc +1 -1
- package/.next/server/app/git/changes/page.js +1 -1
- package/.next/server/app/git/changes/page.js.nft.json +1 -1
- package/.next/server/app/git/changes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/git/changes.html +2 -2
- package/.next/server/app/git/changes.rsc +4 -4
- package/.next/server/app/git/changes.segments/_full.segment.rsc +4 -4
- package/.next/server/app/git/changes.segments/_head.segment.rsc +1 -1
- package/.next/server/app/git/changes.segments/_index.segment.rsc +2 -2
- package/.next/server/app/git/changes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/git/changes.segments/git/changes/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/git/changes.segments/git/changes.segment.rsc +1 -1
- package/.next/server/app/git/changes.segments/git.segment.rsc +1 -1
- package/.next/server/app/git/custom-scripts/page.js +1 -1
- package/.next/server/app/git/custom-scripts/page.js.nft.json +1 -1
- package/.next/server/app/git/custom-scripts/page_client-reference-manifest.js +1 -1
- package/.next/server/app/git/custom-scripts.html +2 -2
- package/.next/server/app/git/custom-scripts.rsc +2 -2
- package/.next/server/app/git/custom-scripts.segments/_full.segment.rsc +2 -2
- package/.next/server/app/git/custom-scripts.segments/_head.segment.rsc +1 -1
- package/.next/server/app/git/custom-scripts.segments/_index.segment.rsc +2 -2
- package/.next/server/app/git/custom-scripts.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/git/custom-scripts.segments/git/custom-scripts/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/git/custom-scripts.segments/git/custom-scripts.segment.rsc +1 -1
- package/.next/server/app/git/custom-scripts.segments/git.segment.rsc +1 -1
- package/.next/server/app/git/history/page/server-reference-manifest.json +17 -1
- package/.next/server/app/git/history/page.js +3 -2
- package/.next/server/app/git/history/page.js.nft.json +1 -1
- package/.next/server/app/git/history/page_client-reference-manifest.js +1 -1
- package/.next/server/app/git/history.html +2 -2
- package/.next/server/app/git/history.rsc +4 -4
- package/.next/server/app/git/history.segments/_full.segment.rsc +4 -4
- package/.next/server/app/git/history.segments/_head.segment.rsc +1 -1
- package/.next/server/app/git/history.segments/_index.segment.rsc +2 -2
- package/.next/server/app/git/history.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/git/history.segments/git/history/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/git/history.segments/git/history.segment.rsc +1 -1
- package/.next/server/app/git/history.segments/git.segment.rsc +1 -1
- package/.next/server/app/git/page/server-reference-manifest.json +17 -1
- package/.next/server/app/git/page.js +3 -2
- package/.next/server/app/git/page.js.nft.json +1 -1
- package/.next/server/app/git/page_client-reference-manifest.js +1 -1
- package/.next/server/app/git/stashes/page.js +1 -1
- package/.next/server/app/git/stashes/page.js.nft.json +1 -1
- package/.next/server/app/git/stashes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/git/stashes.html +2 -2
- package/.next/server/app/git/stashes.rsc +2 -2
- package/.next/server/app/git/stashes.segments/_full.segment.rsc +2 -2
- package/.next/server/app/git/stashes.segments/_head.segment.rsc +1 -1
- package/.next/server/app/git/stashes.segments/_index.segment.rsc +2 -2
- package/.next/server/app/git/stashes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/git/stashes.segments/git/stashes/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/git/stashes.segments/git/stashes.segment.rsc +1 -1
- package/.next/server/app/git/stashes.segments/git.segment.rsc +1 -1
- package/.next/server/app/git.html +2 -2
- package/.next/server/app/git.rsc +4 -4
- package/.next/server/app/git.segments/_full.segment.rsc +4 -4
- package/.next/server/app/git.segments/_head.segment.rsc +1 -1
- package/.next/server/app/git.segments/_index.segment.rsc +2 -2
- package/.next/server/app/git.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/git.segments/git/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/git.segments/git.segment.rsc +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +4 -4
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/new/page/server-reference-manifest.json +29 -29
- package/.next/server/app/new/page.js +4 -4
- package/.next/server/app/new/page.js.nft.json +1 -1
- package/.next/server/app/new/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page/server-reference-manifest.json +29 -29
- package/.next/server/app/page.js +3 -3
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/session/[sessionId]/page/server-reference-manifest.json +34 -19
- package/.next/server/app/session/[sessionId]/page.js +2 -2
- package/.next/server/app/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/server/app/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/[externals]__4610b07e._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__093d29e3._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__7f2f8f49._.js.map → [root-of-the-server]__093d29e3._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__2bdd2171._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__8de57231._.js.map → [root-of-the-server]__2bdd2171._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__2ea0148f._.js +7 -0
- package/.next/server/chunks/{[root-of-the-server]__b17e6c62._.js.map → [root-of-the-server]__2ea0148f._.js.map} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__ceda8fbc._.js → [root-of-the-server]__34da758c._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__52f9b7e2._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__2dcb1454._.js.map → [root-of-the-server]__52f9b7e2._.js.map} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__9af2c9bf._.js → [root-of-the-server]__5ebd9b2a._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__3ffc9919._.js → [root-of-the-server]__6a2576a8._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__7147e7f8._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__7324fe0b._.js.map → [root-of-the-server]__7147e7f8._.js.map} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__1bf60374._.js → [root-of-the-server]__93d494cc._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__952874bc._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__187f37c1._.js.map → [root-of-the-server]__952874bc._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__05e6fb4c._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__2f5cb477._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__79a7a15d._.js.map → [root-of-the-server]__2f5cb477._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__32cb19cb._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__05b3451a._.js.map → [root-of-the-server]__32cb19cb._.js.map} +1 -1
- package/.next/server/chunks/ssr/{[root-of-the-server]__5be652da._.js → [root-of-the-server]__35dc6469._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__46af1502._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__46af1502._.js.map +1 -1
- package/.next/server/chunks/ssr/{_476e86d1._.js → [root-of-the-server]__4928d640._.js} +3 -3
- package/.next/server/chunks/ssr/{_476e86d1._.js.map → [root-of-the-server]__4928d640._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__6e6c1134._.js +4 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__6e6c1134._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__e86a1b81._.js → [root-of-the-server]__79ab29ee._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__8d19726f._.js +4 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8d19726f._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__96a8b4aa._.js → [root-of-the-server]__905c5090._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__2798aa4d._.js → [root-of-the-server]__afccdb61._.js} +3 -3
- package/.next/server/chunks/ssr/{[root-of-the-server]__2798aa4d._.js.map → [root-of-the-server]__afccdb61._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__d52659cf._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__d52659cf._.js.map +1 -0
- package/.next/server/chunks/ssr/_1232faca._.js +3 -0
- package/.next/server/chunks/ssr/_1232faca._.js.map +1 -0
- package/.next/server/chunks/ssr/_21376a5e._.js +3 -0
- package/.next/server/chunks/ssr/_21376a5e._.js.map +1 -0
- package/.next/server/chunks/ssr/_25f614f9._.js +3 -0
- package/.next/server/chunks/ssr/_25f614f9._.js.map +1 -0
- package/.next/server/chunks/ssr/{_5147763c._.js → _4e480580._.js} +2 -2
- package/.next/server/chunks/ssr/_4e480580._.js.map +1 -0
- package/.next/server/chunks/ssr/_707e5fab._.js +1 -1
- package/.next/server/chunks/ssr/_707e5fab._.js.map +1 -1
- package/.next/server/chunks/ssr/_7e1d1983._.js +3 -0
- package/.next/server/chunks/ssr/_7e1d1983._.js.map +1 -0
- package/.next/server/chunks/ssr/_9493de08._.js +1 -1
- package/.next/server/chunks/ssr/_9493de08._.js.map +1 -1
- package/.next/server/chunks/ssr/{_9a7bd3c8._.js → _979edf0c._.js} +2 -2
- package/.next/server/chunks/ssr/_979edf0c._.js.map +1 -0
- package/.next/server/chunks/ssr/_9db6d532._.js +3 -0
- package/.next/server/chunks/ssr/_9db6d532._.js.map +1 -0
- package/.next/server/chunks/ssr/{_439918bb._.js → _a30f8faf._.js} +2 -2
- package/.next/server/chunks/ssr/_a30f8faf._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_bf7b09f8._.js → node_modules_3aaf320c._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_3aaf320c._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_50fa454f._.js → node_modules_f0d9388d._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_f0d9388d._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_3e692bb2._.js → node_modules_fae6b458._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_fae6b458._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_35575f97._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_35575f97._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_b34e0340._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_b34e0340._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js +1 -1
- package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_git_changes_page_tsx_f6dc28dc._.js +1 -1
- package/.next/server/chunks/ssr/src_app_git_changes_page_tsx_f6dc28dc._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js +1 -1
- package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js.map +1 -1
- package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js +3 -3
- package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js.map +1 -1
- package/.next/server/chunks/ssr/src_components_git_history-view_tsx_fd62126a._.js +6 -6
- package/.next/server/chunks/ssr/src_components_git_history-view_tsx_fd62126a._.js.map +1 -1
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +2 -2
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +77 -48
- package/.next/static/chunks/15bbad1a4cefc870.js +3 -0
- package/.next/static/chunks/1f428267926cd032.js +3 -0
- package/.next/static/chunks/{d09578ecf3b80b9d.js → 2ca45fcc772c4ea0.js} +2 -2
- package/.next/static/chunks/3df671a7fdd91e3e.js +1 -0
- package/.next/static/chunks/53f66f12a3d0dc7f.js +3 -0
- package/.next/static/chunks/6242d36c3f387ddb.js +1 -0
- package/.next/static/chunks/697655e0e9336655.js +1 -0
- package/.next/static/chunks/c08840e14b1e627c.css +1 -0
- package/.next/static/chunks/d6c7a0b35251160d.js +8 -0
- package/.next/static/chunks/dcba19c95b8bc155.js +1 -0
- package/.next/static/chunks/e45cecb04475a86a.js +9 -0
- package/.next/static/chunks/f31a3f4a435e3f86.js +3 -0
- package/README.md +4 -0
- package/bin/viba.mjs +124 -4
- package/package.json +1 -1
- package/.next/server/chunks/[externals]__7ece43c5._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__187f37c1._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__2dcb1454._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__7324fe0b._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__7f2f8f49._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__8de57231._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__afea2116._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__afea2116._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__b17e6c62._.js +0 -7
- package/.next/server/chunks/ssr/[root-of-the-server]__05b3451a._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__30652385._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__30652385._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__79a7a15d._.js +0 -3
- package/.next/server/chunks/ssr/_439918bb._.js.map +0 -1
- package/.next/server/chunks/ssr/_4a66db4a._.js +0 -3
- package/.next/server/chunks/ssr/_4a66db4a._.js.map +0 -1
- package/.next/server/chunks/ssr/_5147763c._.js.map +0 -1
- package/.next/server/chunks/ssr/_8d41d1fd._.js +0 -3
- package/.next/server/chunks/ssr/_8d41d1fd._.js.map +0 -1
- package/.next/server/chunks/ssr/_9a7bd3c8._.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_git_history_page_actions_9e9b26bc.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_git_history_page_actions_9e9b26bc.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_git_page_actions_511f286b.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_git_page_actions_511f286b.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_3e692bb2._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_50fa454f._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_8e38eac2._.js +0 -5
- package/.next/server/chunks/ssr/node_modules_8e38eac2._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_bf7b09f8._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_0ff44e32._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_0ff44e32._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_f6fd30d1._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_f6fd30d1._.js.map +0 -1
- package/.next/server/chunks/ssr/src_408d74ba._.js +0 -3
- package/.next/server/chunks/ssr/src_408d74ba._.js.map +0 -1
- package/.next/server/chunks/ssr/src_49325427._.js +0 -3
- package/.next/server/chunks/ssr/src_49325427._.js.map +0 -1
- package/.next/static/chunks/0ce2e7006253186a.js +0 -9
- package/.next/static/chunks/0f9834bd2f6f4c6e.js +0 -3
- package/.next/static/chunks/1958a10518af04a4.js +0 -1
- package/.next/static/chunks/3205a3bbc11c3146.css +0 -1
- package/.next/static/chunks/369aa92811a706db.js +0 -3
- package/.next/static/chunks/4aab1f3ea2ed1aef.js +0 -1
- package/.next/static/chunks/5e0dada5236f9065.js +0 -8
- package/.next/static/chunks/977137e155012c13.js +0 -1
- package/.next/static/chunks/b18cc1247b979318.js +0 -1
- package/.next/static/chunks/b926978a88c43bac.js +0 -3
- package/.next/static/chunks/f7914ab5db08b8dd.js +0 -3
- /package/.next/server/chunks/{[externals]__7ece43c5._.js.map → [externals]__4610b07e._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__ceda8fbc._.js.map → [root-of-the-server]__34da758c._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__9af2c9bf._.js.map → [root-of-the-server]__5ebd9b2a._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__3ffc9919._.js.map → [root-of-the-server]__6a2576a8._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__1bf60374._.js.map → [root-of-the-server]__93d494cc._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{[root-of-the-server]__5be652da._.js.map → [root-of-the-server]__35dc6469._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{[root-of-the-server]__e86a1b81._.js.map → [root-of-the-server]__79ab29ee._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{[root-of-the-server]__96a8b4aa._.js.map → [root-of-the-server]__905c5090._.js.map} +0 -0
- /package/.next/static/{gMV0bFe8zKqVaStUpkI04 → f6hBCO8U8SWC5F77QTqGY}/_buildManifest.js +0 -0
- /package/.next/static/{gMV0bFe8zKqVaStUpkI04 → f6hBCO8U8SWC5F77QTqGY}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{gMV0bFe8zKqVaStUpkI04 → f6hBCO8U8SWC5F77QTqGY}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/actions/repository.ts","../../../../src/lib/repo-resolver.ts","../../../../src/app/actions/draft.ts","../../../../.next-internal/server/app/new/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["'use server';\n\nimport fs from 'fs/promises';\nimport os from 'os';\nimport path from 'path';\nimport simpleGit from 'simple-git';\nimport { resolveRepositoryPathByName } from '@/lib/repo-resolver';\nimport { getAllCredentials, getCredentialById, getCredentialToken } from '@/lib/credentials';\nimport type { Credential } from '@/lib/credentials';\nimport { detectGitRemoteProvider, parseGitRemoteHost } from '@/lib/terminal-session';\n\ntype ResolveRepositoryResult = {\n success: boolean;\n repoPath: string | null;\n error?: string;\n};\n\ntype CloneRemoteRepositoryResult = {\n success: boolean;\n repoPath: string | null;\n error?: string;\n};\n\nexport async function resolveRepositoryByName(repoName: string): Promise<ResolveRepositoryResult> {\n try {\n const resolvedPath = await resolveRepositoryPathByName(repoName);\n return {\n success: true,\n repoPath: resolvedPath,\n };\n } catch (error) {\n console.error('Failed to resolve repository by name:', error);\n return {\n success: false,\n repoPath: null,\n error: 'Failed to search repositories. Please try again.',\n };\n }\n}\n\nfunction getGitLabCredentialHost(credential: Credential): string | null {\n if (credential.type !== 'gitlab') return null;\n\n try {\n return new URL(credential.serverUrl).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nfunction pickCandidateCredential(\n credentials: Credential[],\n provider: 'github' | 'gitlab',\n remoteHost: string | null,\n): Credential | null {\n if (provider === 'github') {\n return credentials.find((credential) => credential.type === 'github') || null;\n }\n\n if (remoteHost) {\n const hostMatch = credentials.find((credential) => (\n credential.type === 'gitlab'\n && getGitLabCredentialHost(credential) === remoteHost\n ));\n if (hostMatch) return hostMatch;\n }\n\n return credentials.find((credential) => credential.type === 'gitlab') || null;\n}\n\nfunction getRepoNameFromRemoteUrl(remoteUrl: string): string | null {\n const trimmed = remoteUrl.trim();\n if (!trimmed) return null;\n\n let rawPath = '';\n\n try {\n const parsed = new URL(trimmed);\n rawPath = parsed.pathname;\n } catch {\n const scpLikeMatch = trimmed.match(/^([^@]+@)?([^:]+):(.+)$/);\n if (scpLikeMatch) {\n rawPath = scpLikeMatch[3];\n } else {\n rawPath = trimmed;\n }\n }\n\n const normalized = rawPath.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n if (!normalized) return null;\n\n let baseName = path.posix.basename(normalized);\n if (!baseName || baseName === '.' || baseName === '..') return null;\n\n if (baseName.toLowerCase().endsWith('.git')) {\n baseName = baseName.slice(0, -4);\n }\n\n const sanitized = baseName\n .replace(/[^a-zA-Z0-9._-]/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n\n return sanitized || null;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction sanitizeErrorMessage(message: string, secretValues: string[]): string {\n let sanitized = message;\n\n for (const value of secretValues) {\n if (!value) continue;\n sanitized = sanitized.replace(new RegExp(escapeRegExp(value), 'g'), '***');\n }\n\n return sanitized.replace(/:\\/\\/[^/\\s@]+@/g, '://***@');\n}\n\nfunction buildAuthenticatedCloneUrl(remoteUrl: string, credential: Credential, token: string): string {\n let parsed: URL;\n try {\n parsed = new URL(remoteUrl);\n } catch {\n return remoteUrl;\n }\n\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n return remoteUrl;\n }\n\n if (credential.type === 'github') {\n parsed.username = 'x-access-token';\n parsed.password = token;\n return parsed.toString();\n }\n\n parsed.username = 'oauth2';\n parsed.password = token;\n return parsed.toString();\n}\n\ntype CloneCredentialResolution =\n | { success: true; credential: Credential | null; token: string | null }\n | { success: false; error: string };\n\nasync function resolveCloneCredential(\n remoteUrl: string,\n credentialId: string | null,\n): Promise<CloneCredentialResolution> {\n const allCredentials = await getAllCredentials();\n const provider = detectGitRemoteProvider(remoteUrl, {\n gitlabHosts: allCredentials.flatMap((credential) => {\n if (credential.type !== 'gitlab') return [];\n const host = getGitLabCredentialHost(credential);\n return host ? [host] : [];\n }),\n });\n const remoteHost = parseGitRemoteHost(remoteUrl);\n\n if (credentialId) {\n const selectedCredential = await getCredentialById(credentialId);\n if (!selectedCredential) {\n return { success: false, error: 'Selected credential was not found. Please choose another credential.' };\n }\n\n if (provider === 'github' && selectedCredential.type !== 'github') {\n return { success: false, error: 'Selected credential does not match this GitHub repository.' };\n }\n if (provider === 'gitlab' && selectedCredential.type !== 'gitlab') {\n return { success: false, error: 'Selected credential does not match this GitLab repository.' };\n }\n\n if (selectedCredential.type === 'gitlab' && remoteHost) {\n const credentialHost = getGitLabCredentialHost(selectedCredential);\n if (credentialHost && credentialHost !== remoteHost) {\n return {\n success: false,\n error: `Selected GitLab credential targets ${credentialHost}, but this repository uses ${remoteHost}.`,\n };\n }\n }\n\n const token = await getCredentialToken(selectedCredential.id);\n if (!token) {\n return { success: false, error: 'Could not load token for selected credential.' };\n }\n\n return { success: true, credential: selectedCredential, token };\n }\n\n if (!provider) {\n return { success: true, credential: null, token: null };\n }\n\n const candidate = pickCandidateCredential(allCredentials, provider, remoteHost);\n if (!candidate) {\n return { success: true, credential: null, token: null };\n }\n\n const token = await getCredentialToken(candidate.id);\n if (!token) {\n return { success: true, credential: null, token: null };\n }\n\n return { success: true, credential: candidate, token };\n}\n\nexport async function cloneRemoteRepository(\n remoteUrl: string,\n credentialId: string | null,\n): Promise<CloneRemoteRepositoryResult> {\n const trimmedRemoteUrl = remoteUrl.trim();\n if (!trimmedRemoteUrl) {\n return { success: false, repoPath: null, error: 'Please enter a remote repository URL.' };\n }\n\n const repoName = getRepoNameFromRemoteUrl(trimmedRemoteUrl);\n if (!repoName) {\n return { success: false, repoPath: null, error: 'Could not determine repository name from URL.' };\n }\n\n const cloneRoot = path.join(os.homedir(), '.viba', 'repos');\n await fs.mkdir(cloneRoot, { recursive: true });\n\n const targetPath = path.join(cloneRoot, repoName);\n try {\n await fs.access(targetPath);\n return {\n success: false,\n repoPath: null,\n error: `Repository already exists at ${targetPath}.`,\n };\n } catch {\n // Path does not exist yet.\n }\n\n const credentialResolution = await resolveCloneCredential(trimmedRemoteUrl, credentialId);\n if (!credentialResolution.success) {\n return { success: false, repoPath: null, error: credentialResolution.error };\n }\n\n const cloneUrl = (credentialResolution.credential && credentialResolution.token)\n ? buildAuthenticatedCloneUrl(trimmedRemoteUrl, credentialResolution.credential, credentialResolution.token)\n : trimmedRemoteUrl;\n\n const git = simpleGit();\n\n try {\n await git.clone(cloneUrl, targetPath);\n\n if (cloneUrl !== trimmedRemoteUrl) {\n const clonedRepoGit = simpleGit(targetPath);\n await clonedRepoGit.remote(['set-url', 'origin', trimmedRemoteUrl]);\n }\n\n return {\n success: true,\n repoPath: targetPath,\n };\n } catch (error) {\n const rawMessage = error instanceof Error ? error.message : String(error);\n const safeMessage = sanitizeErrorMessage(rawMessage, [\n cloneUrl,\n credentialResolution.token ?? '',\n ]);\n\n try {\n await fs.rm(targetPath, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors.\n }\n\n return {\n success: false,\n repoPath: null,\n error: safeMessage || 'Failed to clone repository.',\n };\n }\n}\n","import fs from 'fs/promises';\nimport type { Dirent } from 'fs';\nimport path from 'path';\nimport { getConfig } from '@/app/actions/config';\n\nconst MAX_SCAN_DEPTH = 5;\nconst MAX_SCANNED_DIRECTORIES = 5000;\nconst RESOLUTION_CACHE_TTL_MS = 5 * 60 * 1000;\nconst SKIPPED_DIR_NAMES = new Set([\n '.git',\n 'node_modules',\n '.next',\n '.viba',\n 'dist',\n 'build',\n 'coverage',\n]);\n\ntype RepoResolutionCacheEntry = {\n repoPath: string;\n resolvedAt: number;\n};\n\ndeclare global {\n var repoResolutionCache: Map<string, RepoResolutionCacheEntry> | undefined;\n}\n\nfunction getResolutionCache(): Map<string, RepoResolutionCacheEntry> {\n if (!global.repoResolutionCache) {\n global.repoResolutionCache = new Map<string, RepoResolutionCacheEntry>();\n }\n return global.repoResolutionCache;\n}\n\nfunction cacheResolution(repoName: string, repoPath: string): void {\n getResolutionCache().set(repoName.toLowerCase(), {\n repoPath,\n resolvedAt: Date.now(),\n });\n}\n\nasync function getValidCachedResolution(repoName: string): Promise<string | null> {\n const entry = getResolutionCache().get(repoName.toLowerCase());\n if (!entry) return null;\n if (Date.now() - entry.resolvedAt > RESOLUTION_CACHE_TTL_MS) {\n getResolutionCache().delete(repoName.toLowerCase());\n return null;\n }\n\n if (await isGitRepository(entry.repoPath)) {\n return entry.repoPath;\n }\n\n getResolutionCache().delete(repoName.toLowerCase());\n return null;\n}\n\nasync function isGitRepository(dirPath: string): Promise<boolean> {\n try {\n await fs.access(path.join(dirPath, '.git'));\n return true;\n } catch {\n return false;\n }\n}\n\nfunction hasMatchingName(repoPath: string, repoName: string): boolean {\n return path.basename(repoPath).toLowerCase() === repoName.toLowerCase();\n}\n\nfunction shouldSkipDirectory(entryName: string, targetName: string): boolean {\n const lowerName = entryName.toLowerCase();\n if (lowerName === targetName) return false;\n if (SKIPPED_DIR_NAMES.has(lowerName)) return true;\n if (entryName.startsWith('.')) return true;\n return false;\n}\n\nasync function findByNameWithinRoot(rootPath: string, repoName: string): Promise<string | null> {\n const directCandidate = path.join(rootPath, repoName);\n if (await isGitRepository(directCandidate)) {\n return directCandidate;\n }\n\n const queue: Array<{ dirPath: string; depth: number }> = [{ dirPath: rootPath, depth: 0 }];\n let scannedCount = 0;\n const targetName = repoName.toLowerCase();\n\n for (let index = 0; index < queue.length; index += 1) {\n const current = queue[index];\n scannedCount += 1;\n if (scannedCount > MAX_SCANNED_DIRECTORIES) {\n break;\n }\n\n let entries: Dirent[];\n try {\n entries = await fs.readdir(current.dirPath, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (shouldSkipDirectory(entry.name, targetName)) continue;\n\n const nextDirPath = path.join(current.dirPath, entry.name);\n\n if (entry.name.toLowerCase() === targetName && await isGitRepository(nextDirPath)) {\n return nextDirPath;\n }\n\n if (current.depth + 1 <= MAX_SCAN_DEPTH) {\n queue.push({ dirPath: nextDirPath, depth: current.depth + 1 });\n }\n }\n }\n\n return null;\n}\n\nexport async function resolveRepositoryPathByName(repoName: string): Promise<string | null> {\n const trimmedName = repoName.trim();\n if (!trimmedName) return null;\n\n const cachedResolution = await getValidCachedResolution(trimmedName);\n if (cachedResolution) {\n return cachedResolution;\n }\n\n const config = await getConfig();\n\n const recentMatches = config.recentRepos.filter((repoPath) => hasMatchingName(repoPath, trimmedName));\n for (const repoPath of recentMatches) {\n if (await isGitRepository(repoPath)) {\n cacheResolution(trimmedName, repoPath);\n return repoPath;\n }\n }\n\n const searchRoots: string[] = [];\n const visitedRoots = new Set<string>();\n for (const repoPath of config.recentRepos) {\n const parentPath = path.dirname(repoPath);\n if (!visitedRoots.has(parentPath)) {\n visitedRoots.add(parentPath);\n searchRoots.push(parentPath);\n }\n }\n if (config.defaultRoot && !visitedRoots.has(config.defaultRoot)) {\n visitedRoots.add(config.defaultRoot);\n searchRoots.push(config.defaultRoot);\n }\n\n for (const rootPath of searchRoots) {\n const resolvedPath = await findByNameWithinRoot(rootPath, trimmedName);\n if (resolvedPath) {\n cacheResolution(trimmedName, resolvedPath);\n return resolvedPath;\n }\n }\n\n return null;\n}\n","'use server';\n\nimport fs from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\n\nexport type DraftMetadata = {\n id: string;\n repoPath: string;\n branchName: string;\n message: string;\n attachmentPaths: string[];\n agentProvider: string;\n model: string;\n timestamp: string;\n title: string;\n startupScript: string;\n devServerScript: string;\n sessionMode: 'fast' | 'plan';\n};\n\nasync function getDraftsDir(): Promise<string> {\n const homedir = os.homedir();\n const draftsDir = path.join(homedir, '.viba', 'drafts');\n try {\n await fs.mkdir(draftsDir, { recursive: true });\n } catch {\n // Ignore if exists\n }\n return draftsDir;\n}\n\nexport async function saveDraft(draft: DraftMetadata): Promise<{ success: boolean; error?: string }> {\n try {\n const draftsDir = await getDraftsDir();\n const safeId = path.basename(draft.id);\n const filePath = path.join(draftsDir, `${safeId}.json`);\n await fs.writeFile(filePath, JSON.stringify(draft, null, 2), 'utf-8');\n return { success: true };\n } catch (e) {\n console.error('Failed to save draft:', e);\n return { success: false, error: 'Failed to save draft' };\n }\n}\n\nexport async function listDrafts(repoPath?: string): Promise<DraftMetadata[]> {\n try {\n const draftsDir = await getDraftsDir();\n const entries = await fs.readdir(draftsDir);\n\n const draftPromises = entries\n .filter((entry) => entry.endsWith('.json'))\n .map(async (entry) => {\n try {\n const filePath = path.join(draftsDir, entry);\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as DraftMetadata;\n } catch (e) {\n console.error(`Failed to parse draft file ${entry}:`, e);\n return null;\n }\n });\n\n const drafts = (await Promise.all(draftPromises)).filter((d): d is DraftMetadata => d !== null);\n\n if (repoPath) {\n return drafts.filter((d) => d.repoPath === repoPath).sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n }\n\n return drafts.sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n } catch (e: any) {\n if (e.code === 'ENOENT') {\n return [];\n }\n console.error('Failed to list drafts:', e);\n return [];\n }\n}\n\nexport async function deleteDraft(id: string): Promise<{ success: boolean; error?: string }> {\n try {\n const draftsDir = await getDraftsDir();\n const safeId = path.basename(id);\n const filePath = path.join(draftsDir, `${safeId}.json`);\n await fs.rm(filePath, { force: true });\n return { success: true };\n } catch (e) {\n console.error('Failed to delete draft:', e);\n return { success: false, error: 'Failed to delete draft' };\n }\n}\n","export {checkDirectoryAccessible as '40ea0299c4b573cf8e6b0f6e850a11cf72d0a2614f'} from 'ACTIONS_MODULE0'\nexport {listDirectories as '4001029958bcf3af70bb6dd37f8edb654b55c2117d'} from 'ACTIONS_MODULE0'\nexport {getHomeDirectory as '003f59d9b072ba439a66065346d259ab83d25d897d'} from 'ACTIONS_MODULE0'\nexport {checkIsGitRepo as '40402e350533ce09024ae8299de5deccda87e7e955'} from 'ACTIONS_MODULE0'\nexport {getBranches as '40db6a36c9bb96a23f2cad151164d1b7ebe1af88a8'} from 'ACTIONS_MODULE0'\nexport {checkoutBranch as '60ceedca9359f7e545655189a4df3dec0697724fa5'} from 'ACTIONS_MODULE0'\nexport {startTtydProcess as '7f4e2d8cbfea83c90a943b7d1ad26051afd667020b'} from 'ACTIONS_MODULE0'\nexport {getStartupScript as '7f436fd72bd8226a2f176bcb7ba20b215d559d6065'} from 'ACTIONS_MODULE0'\nexport {getDefaultDevServerScript as '7fadf441b373188b3dace3ae48b8d30a428868a738'} from 'ACTIONS_MODULE0'\nexport {listRepoFiles as '7fd73dc371c3550ad517787595adb3897f68ba2f8f'} from 'ACTIONS_MODULE0'\nexport {checkAgentCliInstalled as '4044c7057435fea28c0b9bb1f0058d51b909feabfb'} from 'ACTIONS_MODULE0'\nexport {installAgentCli as '40d3fb934ccbd71e41a15fbeda23bcaa134db0ad02'} from 'ACTIONS_MODULE0'\nexport {cloneRemoteRepository as '609756f1c99ec557bf570c2d894c4a6dceaec2a0fa'} from 'ACTIONS_MODULE1'\nexport {resolveRepositoryByName as '40addd6e01d77ba35c824c87a58a5139275b97b8c3'} from 'ACTIONS_MODULE1'\nexport {createSession as '7080e3f8edb2130b45f4816972ccaf426c84be7510'} from 'ACTIONS_MODULE2'\nexport {deleteSession as '4006c8c1f97e58e11136be766e5901a5c0ed9cf64a'} from 'ACTIONS_MODULE2'\nexport {getSessionPrefillContext as '408c10d86a69e8a886e15b3179eb4e8d91a8e52bb7'} from 'ACTIONS_MODULE2'\nexport {listSessions as '40dc98753e736251a2dce196c07929485ef21f9e19'} from 'ACTIONS_MODULE2'\nexport {saveSessionLaunchContext as '6037a38506b04adf0f2857a08b5e4cbaca8e724f4b'} from 'ACTIONS_MODULE2'\nexport {deleteDraft as '40010fe89d6528642fe87900ab9ae5c8796c16e5bd'} from 'ACTIONS_MODULE3'\nexport {listDrafts as '40047b3107438da9a66c14d0c7d3e02ecd487c4686'} from 'ACTIONS_MODULE3'\nexport {saveDraft as '40f310df50f9f2df74747dcc5b1b6fc9c5404c1f14'} from 'ACTIONS_MODULE3'\nexport {getConfig as '00f8d9271ab0088f183a1494ee1e57a9c9bf395836'} from 'ACTIONS_MODULE4'\nexport {updateConfig as '40839453baab94a23bf39433a552dbe7f519a44449'} from 'ACTIONS_MODULE4'\nexport {updateRepoSettings as '60720766262fbc3bb33550cfafe06868422a53109d'} from 'ACTIONS_MODULE4'\nexport {listAgentApiCredentials as '001b884a80812d1f61dbae458988c02181906ec73c'} from 'ACTIONS_MODULE5'\nexport {listCredentials as '0024cd8264923ac29ca23ec9b72eb8f41d4e4f5b3c'} from 'ACTIONS_MODULE5'\nexport {listPathEntries as '40cd192901c59313dcda53d8937596378060397f11'} from 'ACTIONS_MODULE0'\nexport {saveAttachments as '7f8d431455c1da2fbe5358c50ae9b8c5259dd93aca'} from 'ACTIONS_MODULE0'\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/actions/repository.ts","../../../../src/lib/repo-resolver.ts","../../../../src/app/actions/draft.ts","../../../../.next-internal/server/app/new/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["'use server';\n\nimport fs from 'fs/promises';\nimport os from 'os';\nimport path from 'path';\nimport simpleGit from 'simple-git';\nimport { resolveRepositoryPathByName } from '@/lib/repo-resolver';\nimport { getAllCredentials, getCredentialById, getCredentialToken } from '@/lib/credentials';\nimport type { Credential } from '@/lib/credentials';\nimport { detectGitRemoteProvider, parseGitRemoteHost } from '@/lib/terminal-session';\n\ntype ResolveRepositoryResult = {\n success: boolean;\n repoPath: string | null;\n error?: string;\n};\n\ntype CloneRemoteRepositoryResult = {\n success: boolean;\n repoPath: string | null;\n error?: string;\n};\n\nexport async function resolveRepositoryByName(repoName: string): Promise<ResolveRepositoryResult> {\n try {\n const resolvedPath = await resolveRepositoryPathByName(repoName);\n return {\n success: true,\n repoPath: resolvedPath,\n };\n } catch (error) {\n console.error('Failed to resolve repository by name:', error);\n return {\n success: false,\n repoPath: null,\n error: 'Failed to search repositories. Please try again.',\n };\n }\n}\n\nfunction getGitLabCredentialHost(credential: Credential): string | null {\n if (credential.type !== 'gitlab') return null;\n\n try {\n return new URL(credential.serverUrl).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nfunction pickCandidateCredential(\n credentials: Credential[],\n provider: 'github' | 'gitlab',\n remoteHost: string | null,\n): Credential | null {\n if (provider === 'github') {\n return credentials.find((credential) => credential.type === 'github') || null;\n }\n\n if (remoteHost) {\n const hostMatch = credentials.find((credential) => (\n credential.type === 'gitlab'\n && getGitLabCredentialHost(credential) === remoteHost\n ));\n if (hostMatch) return hostMatch;\n }\n\n return credentials.find((credential) => credential.type === 'gitlab') || null;\n}\n\nfunction getRepoNameFromRemoteUrl(remoteUrl: string): string | null {\n const trimmed = remoteUrl.trim();\n if (!trimmed) return null;\n\n let rawPath = '';\n\n try {\n const parsed = new URL(trimmed);\n rawPath = parsed.pathname;\n } catch {\n const scpLikeMatch = trimmed.match(/^([^@]+@)?([^:]+):(.+)$/);\n if (scpLikeMatch) {\n rawPath = scpLikeMatch[3];\n } else {\n rawPath = trimmed;\n }\n }\n\n const normalized = rawPath.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n if (!normalized) return null;\n\n let baseName = path.posix.basename(normalized);\n if (!baseName || baseName === '.' || baseName === '..') return null;\n\n if (baseName.toLowerCase().endsWith('.git')) {\n baseName = baseName.slice(0, -4);\n }\n\n const sanitized = baseName\n .replace(/[^a-zA-Z0-9._-]/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n\n return sanitized || null;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction sanitizeErrorMessage(message: string, secretValues: string[]): string {\n let sanitized = message;\n\n for (const value of secretValues) {\n if (!value) continue;\n sanitized = sanitized.replace(new RegExp(escapeRegExp(value), 'g'), '***');\n }\n\n return sanitized.replace(/:\\/\\/[^/\\s@]+@/g, '://***@');\n}\n\nfunction buildAuthenticatedCloneUrl(remoteUrl: string, credential: Credential, token: string): string {\n let parsed: URL;\n try {\n parsed = new URL(remoteUrl);\n } catch {\n return remoteUrl;\n }\n\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n return remoteUrl;\n }\n\n if (credential.type === 'github') {\n parsed.username = 'x-access-token';\n parsed.password = token;\n return parsed.toString();\n }\n\n parsed.username = 'oauth2';\n parsed.password = token;\n return parsed.toString();\n}\n\ntype CloneCredentialResolution =\n | { success: true; credential: Credential | null; token: string | null }\n | { success: false; error: string };\n\nasync function resolveCloneCredential(\n remoteUrl: string,\n credentialId: string | null,\n): Promise<CloneCredentialResolution> {\n const allCredentials = await getAllCredentials();\n const provider = detectGitRemoteProvider(remoteUrl, {\n gitlabHosts: allCredentials.flatMap((credential) => {\n if (credential.type !== 'gitlab') return [];\n const host = getGitLabCredentialHost(credential);\n return host ? [host] : [];\n }),\n });\n const remoteHost = parseGitRemoteHost(remoteUrl);\n\n if (credentialId) {\n const selectedCredential = await getCredentialById(credentialId);\n if (!selectedCredential) {\n return { success: false, error: 'Selected credential was not found. Please choose another credential.' };\n }\n\n if (provider === 'github' && selectedCredential.type !== 'github') {\n return { success: false, error: 'Selected credential does not match this GitHub repository.' };\n }\n if (provider === 'gitlab' && selectedCredential.type !== 'gitlab') {\n return { success: false, error: 'Selected credential does not match this GitLab repository.' };\n }\n\n if (selectedCredential.type === 'gitlab' && remoteHost) {\n const credentialHost = getGitLabCredentialHost(selectedCredential);\n if (credentialHost && credentialHost !== remoteHost) {\n return {\n success: false,\n error: `Selected GitLab credential targets ${credentialHost}, but this repository uses ${remoteHost}.`,\n };\n }\n }\n\n const token = await getCredentialToken(selectedCredential.id);\n if (!token) {\n return { success: false, error: 'Could not load token for selected credential.' };\n }\n\n return { success: true, credential: selectedCredential, token };\n }\n\n if (!provider) {\n return { success: true, credential: null, token: null };\n }\n\n const candidate = pickCandidateCredential(allCredentials, provider, remoteHost);\n if (!candidate) {\n return { success: true, credential: null, token: null };\n }\n\n const token = await getCredentialToken(candidate.id);\n if (!token) {\n return { success: true, credential: null, token: null };\n }\n\n return { success: true, credential: candidate, token };\n}\n\nexport async function cloneRemoteRepository(\n remoteUrl: string,\n credentialId: string | null,\n): Promise<CloneRemoteRepositoryResult> {\n const trimmedRemoteUrl = remoteUrl.trim();\n if (!trimmedRemoteUrl) {\n return { success: false, repoPath: null, error: 'Please enter a remote repository URL.' };\n }\n\n const repoName = getRepoNameFromRemoteUrl(trimmedRemoteUrl);\n if (!repoName) {\n return { success: false, repoPath: null, error: 'Could not determine repository name from URL.' };\n }\n\n const cloneRoot = path.join(os.homedir(), '.viba', 'repos');\n await fs.mkdir(cloneRoot, { recursive: true });\n\n const targetPath = path.join(cloneRoot, repoName);\n try {\n await fs.access(targetPath);\n return {\n success: false,\n repoPath: null,\n error: `Repository already exists at ${targetPath}.`,\n };\n } catch {\n // Path does not exist yet.\n }\n\n const credentialResolution = await resolveCloneCredential(trimmedRemoteUrl, credentialId);\n if (!credentialResolution.success) {\n return { success: false, repoPath: null, error: credentialResolution.error };\n }\n\n const cloneUrl = (credentialResolution.credential && credentialResolution.token)\n ? buildAuthenticatedCloneUrl(trimmedRemoteUrl, credentialResolution.credential, credentialResolution.token)\n : trimmedRemoteUrl;\n\n const git = simpleGit();\n\n try {\n await git.clone(cloneUrl, targetPath);\n\n if (cloneUrl !== trimmedRemoteUrl) {\n const clonedRepoGit = simpleGit(targetPath);\n await clonedRepoGit.remote(['set-url', 'origin', trimmedRemoteUrl]);\n }\n\n return {\n success: true,\n repoPath: targetPath,\n };\n } catch (error) {\n const rawMessage = error instanceof Error ? error.message : String(error);\n const safeMessage = sanitizeErrorMessage(rawMessage, [\n cloneUrl,\n credentialResolution.token ?? '',\n ]);\n\n try {\n await fs.rm(targetPath, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors.\n }\n\n return {\n success: false,\n repoPath: null,\n error: safeMessage || 'Failed to clone repository.',\n };\n }\n}\n","import fs from 'fs/promises';\nimport type { Dirent } from 'fs';\nimport path from 'path';\nimport { getConfig } from '@/app/actions/config';\n\nconst MAX_SCAN_DEPTH = 5;\nconst MAX_SCANNED_DIRECTORIES = 5000;\nconst RESOLUTION_CACHE_TTL_MS = 5 * 60 * 1000;\nconst SKIPPED_DIR_NAMES = new Set([\n '.git',\n 'node_modules',\n '.next',\n '.viba',\n 'dist',\n 'build',\n 'coverage',\n]);\n\ntype RepoResolutionCacheEntry = {\n repoPath: string;\n resolvedAt: number;\n};\n\ndeclare global {\n var repoResolutionCache: Map<string, RepoResolutionCacheEntry> | undefined;\n}\n\nfunction getResolutionCache(): Map<string, RepoResolutionCacheEntry> {\n if (!global.repoResolutionCache) {\n global.repoResolutionCache = new Map<string, RepoResolutionCacheEntry>();\n }\n return global.repoResolutionCache;\n}\n\nfunction cacheResolution(repoName: string, repoPath: string): void {\n getResolutionCache().set(repoName.toLowerCase(), {\n repoPath,\n resolvedAt: Date.now(),\n });\n}\n\nasync function getValidCachedResolution(repoName: string): Promise<string | null> {\n const entry = getResolutionCache().get(repoName.toLowerCase());\n if (!entry) return null;\n if (Date.now() - entry.resolvedAt > RESOLUTION_CACHE_TTL_MS) {\n getResolutionCache().delete(repoName.toLowerCase());\n return null;\n }\n\n if (await isGitRepository(entry.repoPath)) {\n return entry.repoPath;\n }\n\n getResolutionCache().delete(repoName.toLowerCase());\n return null;\n}\n\nasync function isGitRepository(dirPath: string): Promise<boolean> {\n try {\n await fs.access(path.join(dirPath, '.git'));\n return true;\n } catch {\n return false;\n }\n}\n\nfunction hasMatchingName(repoPath: string, repoName: string): boolean {\n return path.basename(repoPath).toLowerCase() === repoName.toLowerCase();\n}\n\nfunction shouldSkipDirectory(entryName: string, targetName: string): boolean {\n const lowerName = entryName.toLowerCase();\n if (lowerName === targetName) return false;\n if (SKIPPED_DIR_NAMES.has(lowerName)) return true;\n if (entryName.startsWith('.')) return true;\n return false;\n}\n\nasync function findByNameWithinRoot(rootPath: string, repoName: string): Promise<string | null> {\n const directCandidate = path.join(rootPath, repoName);\n if (await isGitRepository(directCandidate)) {\n return directCandidate;\n }\n\n const queue: Array<{ dirPath: string; depth: number }> = [{ dirPath: rootPath, depth: 0 }];\n let scannedCount = 0;\n const targetName = repoName.toLowerCase();\n\n for (let index = 0; index < queue.length; index += 1) {\n const current = queue[index];\n scannedCount += 1;\n if (scannedCount > MAX_SCANNED_DIRECTORIES) {\n break;\n }\n\n let entries: Dirent[];\n try {\n entries = await fs.readdir(current.dirPath, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (shouldSkipDirectory(entry.name, targetName)) continue;\n\n const nextDirPath = path.join(current.dirPath, entry.name);\n\n if (entry.name.toLowerCase() === targetName && await isGitRepository(nextDirPath)) {\n return nextDirPath;\n }\n\n if (current.depth + 1 <= MAX_SCAN_DEPTH) {\n queue.push({ dirPath: nextDirPath, depth: current.depth + 1 });\n }\n }\n }\n\n return null;\n}\n\nexport async function resolveRepositoryPathByName(repoName: string): Promise<string | null> {\n const trimmedName = repoName.trim();\n if (!trimmedName) return null;\n\n const cachedResolution = await getValidCachedResolution(trimmedName);\n if (cachedResolution) {\n return cachedResolution;\n }\n\n const config = await getConfig();\n\n const recentMatches = config.recentRepos.filter((repoPath) => hasMatchingName(repoPath, trimmedName));\n for (const repoPath of recentMatches) {\n if (await isGitRepository(repoPath)) {\n cacheResolution(trimmedName, repoPath);\n return repoPath;\n }\n }\n\n const searchRoots: string[] = [];\n const visitedRoots = new Set<string>();\n for (const repoPath of config.recentRepos) {\n const parentPath = path.dirname(repoPath);\n if (!visitedRoots.has(parentPath)) {\n visitedRoots.add(parentPath);\n searchRoots.push(parentPath);\n }\n }\n if (config.defaultRoot && !visitedRoots.has(config.defaultRoot)) {\n visitedRoots.add(config.defaultRoot);\n searchRoots.push(config.defaultRoot);\n }\n\n for (const rootPath of searchRoots) {\n const resolvedPath = await findByNameWithinRoot(rootPath, trimmedName);\n if (resolvedPath) {\n cacheResolution(trimmedName, resolvedPath);\n return resolvedPath;\n }\n }\n\n return null;\n}\n","'use server';\n\nimport fs from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\n\nexport type DraftMetadata = {\n id: string;\n repoPath: string;\n branchName: string;\n message: string;\n attachmentPaths: string[];\n agentProvider: string;\n model: string;\n timestamp: string;\n title: string;\n startupScript: string;\n devServerScript: string;\n sessionMode: 'fast' | 'plan';\n};\n\nasync function getDraftsDir(): Promise<string> {\n const homedir = os.homedir();\n const draftsDir = path.join(homedir, '.viba', 'drafts');\n try {\n await fs.mkdir(draftsDir, { recursive: true });\n } catch {\n // Ignore if exists\n }\n return draftsDir;\n}\n\nexport async function saveDraft(draft: DraftMetadata): Promise<{ success: boolean; error?: string }> {\n try {\n const draftsDir = await getDraftsDir();\n const safeId = path.basename(draft.id);\n const filePath = path.join(draftsDir, `${safeId}.json`);\n await fs.writeFile(filePath, JSON.stringify(draft, null, 2), 'utf-8');\n return { success: true };\n } catch (e) {\n console.error('Failed to save draft:', e);\n return { success: false, error: 'Failed to save draft' };\n }\n}\n\nexport async function listDrafts(repoPath?: string): Promise<DraftMetadata[]> {\n try {\n const draftsDir = await getDraftsDir();\n const entries = await fs.readdir(draftsDir);\n\n const draftPromises = entries\n .filter((entry) => entry.endsWith('.json'))\n .map(async (entry) => {\n try {\n const filePath = path.join(draftsDir, entry);\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as DraftMetadata;\n } catch (e) {\n console.error(`Failed to parse draft file ${entry}:`, e);\n return null;\n }\n });\n\n const drafts = (await Promise.all(draftPromises)).filter((d): d is DraftMetadata => d !== null);\n\n if (repoPath) {\n return drafts.filter((d) => d.repoPath === repoPath).sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n }\n\n return drafts.sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n } catch (e: any) {\n if (e.code === 'ENOENT') {\n return [];\n }\n console.error('Failed to list drafts:', e);\n return [];\n }\n}\n\nexport async function deleteDraft(id: string): Promise<{ success: boolean; error?: string }> {\n try {\n const draftsDir = await getDraftsDir();\n const safeId = path.basename(id);\n const filePath = path.join(draftsDir, `${safeId}.json`);\n await fs.rm(filePath, { force: true });\n return { success: true };\n } catch (e) {\n console.error('Failed to delete draft:', e);\n return { success: false, error: 'Failed to delete draft' };\n }\n}\n","export {checkDirectoryAccessible as '40b67eda0795e9a0247fd06f52d2fdc28ce3f1ee53'} from 'ACTIONS_MODULE0'\nexport {listDirectories as '408eeaba46545e12ea20d609bc4f1260ff905d33ad'} from 'ACTIONS_MODULE0'\nexport {getHomeDirectory as '000b08f887beb71637c519c04ba6aac330ab8dadc4'} from 'ACTIONS_MODULE0'\nexport {checkIsGitRepo as '4012caea17b47eb1a3e66525da9f605ed00831eaa1'} from 'ACTIONS_MODULE0'\nexport {getBranches as '40c6812f9b7117d479f53a38ff9c4d93ee2a36e441'} from 'ACTIONS_MODULE0'\nexport {checkoutBranch as '60e1900f3b162d274440b6e9dcda3bc04e456c4990'} from 'ACTIONS_MODULE0'\nexport {startTtydProcess as '7f31a55e7198df30c30fb1e5c4e4bce8cc4c850be3'} from 'ACTIONS_MODULE0'\nexport {getStartupScript as '7f426225d430b57a96d465f4956afee53ef35ce925'} from 'ACTIONS_MODULE0'\nexport {getDefaultDevServerScript as '7fe78908212d15cbd04c86a31bcc76c5c4e10a17bf'} from 'ACTIONS_MODULE0'\nexport {listRepoFiles as '7fb8cdef5fb143cc0be7e0888fcdae8e1214255963'} from 'ACTIONS_MODULE0'\nexport {checkAgentCliInstalled as '401cefb9f2f0230875166691a524fe6a1c9457b10f'} from 'ACTIONS_MODULE0'\nexport {installAgentCli as '40a380b3bfd1d08852776603d9b824ccca68aa3497'} from 'ACTIONS_MODULE0'\nexport {cloneRemoteRepository as '6034f4cb6f9c641315b0b93c4ad6d19cd435b40c2c'} from 'ACTIONS_MODULE1'\nexport {resolveRepositoryByName as '4041027bcd06f365363767978a14ebe8d79dc833bb'} from 'ACTIONS_MODULE1'\nexport {createSession as '709d3e1159b28d903cbd543d10dd494a03b2de82fa'} from 'ACTIONS_MODULE2'\nexport {deleteSession as '4020240f2dbe1fdeee222fde06319090eb0534b5d1'} from 'ACTIONS_MODULE2'\nexport {getSessionPrefillContext as '40f34f53981ef162b3c211fe00853beb380e52eacb'} from 'ACTIONS_MODULE2'\nexport {listSessions as '402485c1b18b9d295d9618d8dadc71e24b1e8eb418'} from 'ACTIONS_MODULE2'\nexport {saveSessionLaunchContext as '60b2d1ea1848faa022602fefbf20f5e82112955f45'} from 'ACTIONS_MODULE2'\nexport {deleteDraft as '40d8dd2f28cb52127d582a5fd4b10a0efe2f938d8f'} from 'ACTIONS_MODULE3'\nexport {listDrafts as '401556bf39c72550b87c239401589366f61872b689'} from 'ACTIONS_MODULE3'\nexport {saveDraft as '40ab3155e870c7e311a3bfe4c18a6dc8c31ca04cee'} from 'ACTIONS_MODULE3'\nexport {getConfig as '004acab2eb117a3c8c7fba404ec67a5dfe26f40b82'} from 'ACTIONS_MODULE4'\nexport {updateConfig as '405739648f8e6d83ff3dd63c8065867bf798683868'} from 'ACTIONS_MODULE4'\nexport {updateRepoSettings as '60752430c56f23b5025818800618a799c078518f98'} from 'ACTIONS_MODULE4'\nexport {listAgentApiCredentials as '003561691afb672a539b4c94ff1a37b71e49c9afb7'} from 'ACTIONS_MODULE5'\nexport {listCredentials as '002628302974b1d9d0c05eefc202ccbb2efcc2cbe0'} from 'ACTIONS_MODULE5'\nexport {listPathEntries as '4024414bd5ce3f38f0cbd12e1805db9036135657fa'} from 'ACTIONS_MODULE0'\nexport {saveAttachments as '7f11884f46af44b93d51ab8916ae86d7e181a9c336'} from 'ACTIONS_MODULE0'\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},46786,(a,b,c)=>{b.exports=a.x("os",()=>require("os"))},22734,(a,b,c)=>{b.exports=a.x("fs",()=>require("fs"))},33405,(a,b,c)=>{b.exports=a.x("child_process",()=>require("child_process"))},70722,(a,b,c)=>{b.exports=a.x("tty",()=>require("tty"))},51615,(a,b,c)=>{b.exports=a.x("node:buffer",()=>require("node:buffer"))},87769,(a,b,c)=>{b.exports=a.x("node:events",()=>require("node:events"))},98624,54569,a=>{"use strict";var b=a.i(37936),c=a.i(24868),d=a.i(46786),e=a.i(14747),f=a.i(4503),g=a.i(38642);let h=new Set([".git","node_modules",".next",".viba","dist","build","coverage"]);function i(){return global.repoResolutionCache||(global.repoResolutionCache=new Map),global.repoResolutionCache}function j(a,b){i().set(a.toLowerCase(),{repoPath:b,resolvedAt:Date.now()})}async function k(a){let b=i().get(a.toLowerCase());return b?Date.now()-b.resolvedAt>3e5?(i().delete(a.toLowerCase()),null):await l(b.repoPath)?b.repoPath:(i().delete(a.toLowerCase()),null):null}async function l(a){try{return await c.default.access(e.default.join(a,".git")),!0}catch{return!1}}async function m(a,b){let d=e.default.join(a,b);if(await l(d))return d;let f=[{dirPath:a,depth:0}],g=0,i=b.toLowerCase();for(let a=0;a<f.length;a+=1){let b,d=f[a];if((g+=1)>5e3)break;try{b=await c.default.readdir(d.dirPath,{withFileTypes:!0})}catch{continue}for(let a of b){if(!a.isDirectory()||function(a,b){let c=a.toLowerCase();return c!==b&&!!(h.has(c)||a.startsWith("."))}(a.name,i))continue;let b=e.default.join(d.dirPath,a.name);if(a.name.toLowerCase()===i&&await l(b))return b;d.depth+1<=5&&f.push({dirPath:b,depth:d.depth+1})}}return null}async function n(a){let b=a.trim();if(!b)return null;let c=await k(b);if(c)return c;let d=await (0,g.getConfig)();for(let a of d.recentRepos.filter(a=>e.default.basename(a).toLowerCase()===b.toLowerCase()))if(await l(a))return j(b,a),a;let f=[],h=new Set;for(let a of d.recentRepos){let b=e.default.dirname(a);h.has(b)||(h.add(b),f.push(b))}for(let a of(d.defaultRoot&&!h.has(d.defaultRoot)&&(h.add(d.defaultRoot),f.push(d.defaultRoot)),f)){let c=await m(a,b);if(c)return j(b,c),c}return null}var o=a.i(70798),p=a.i(46534),q=a.i(13095);async function r(a){try{let b=await n(a);return{success:!0,repoPath:b}}catch(a){return console.error("Failed to resolve repository by name:",a),{success:!1,repoPath:null,error:"Failed to search repositories. Please try again."}}}function s(a){if("gitlab"!==a.type)return null;try{return new URL(a.serverUrl).hostname.toLowerCase()}catch{return null}}async function t(a,b){let c=await (0,o.getAllCredentials)(),d=(0,p.detectGitRemoteProvider)(a,{gitlabHosts:c.flatMap(a=>{if("gitlab"!==a.type)return[];let b=s(a);return b?[b]:[]})}),e=(0,p.parseGitRemoteHost)(a);if(b){let a=await (0,o.getCredentialById)(b);if(!a)return{success:!1,error:"Selected credential was not found. Please choose another credential."};if("github"===d&&"github"!==a.type)return{success:!1,error:"Selected credential does not match this GitHub repository."};if("gitlab"===d&&"gitlab"!==a.type)return{success:!1,error:"Selected credential does not match this GitLab repository."};if("gitlab"===a.type&&e){let b=s(a);if(b&&b!==e)return{success:!1,error:`Selected GitLab credential targets ${b}, but this repository uses ${e}.`}}let c=await (0,o.getCredentialToken)(a.id);return c?{success:!0,credential:a,token:c}:{success:!1,error:"Could not load token for selected credential."}}if(!d)return{success:!0,credential:null,token:null};let f=function(a,b,c){if("github"===b)return a.find(a=>"github"===a.type)||null;if(c){let b=a.find(a=>"gitlab"===a.type&&s(a)===c);if(b)return b}return a.find(a=>"gitlab"===a.type)||null}(c,d,e);if(!f)return{success:!0,credential:null,token:null};let g=await (0,o.getCredentialToken)(f.id);return g?{success:!0,credential:f,token:g}:{success:!0,credential:null,token:null}}async function u(a,b){let g=a.trim();if(!g)return{success:!1,repoPath:null,error:"Please enter a remote repository URL."};let h=function(a){let b=a.trim();if(!b)return null;let c="";try{c=new URL(b).pathname}catch{let a=b.match(/^([^@]+@)?([^:]+):(.+)$/);c=a?a[3]:b}let d=c.replace(/\\/g,"/").replace(/\/+$/,"");if(!d)return null;let f=e.default.posix.basename(d);return f&&"."!==f&&".."!==f?(f.toLowerCase().endsWith(".git")&&(f=f.slice(0,-4)),f.replace(/[^a-zA-Z0-9._-]/g,"-").replace(/^-+/,"").replace(/-+$/,"")||null):null}(g);if(!h)return{success:!1,repoPath:null,error:"Could not determine repository name from URL."};let i=e.default.join(d.default.homedir(),".viba","repos");await c.default.mkdir(i,{recursive:!0});let j=e.default.join(i,h);try{return await c.default.access(j),{success:!1,repoPath:null,error:`Repository already exists at ${j}.`}}catch{}let k=await t(g,b);if(!k.success)return{success:!1,repoPath:null,error:k.error};let l=k.credential&&k.token?function(a,b,c){let d;try{d=new URL(a)}catch{return a}return"https:"!==d.protocol&&"http:"!==d.protocol?a:("github"===b.type?d.username="x-access-token":d.username="oauth2",d.password=c,d.toString())}(g,k.credential,k.token):g,m=(0,f.default)();try{if(await m.clone(l,j),l!==g){let a=(0,f.default)(j);await a.remote(["set-url","origin",g])}return{success:!0,repoPath:j}}catch(b){let a=function(a,b){let c=a;for(let a of b)a&&(c=c.replace(RegExp(a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),"***"));return c.replace(/:\/\/[^/\s@]+@/g,"://***@")}(b instanceof Error?b.message:String(b),[l,k.token??""]);try{await c.default.rm(j,{recursive:!0,force:!0})}catch{}return{success:!1,repoPath:null,error:a||"Failed to clone repository."}}}async function v(){let a=d.default.homedir(),b=e.default.join(a,".viba","drafts");try{await c.default.mkdir(b,{recursive:!0})}catch{}return b}async function w(a){try{let b=await v(),d=e.default.basename(a.id),f=e.default.join(b,`${d}.json`);return await c.default.writeFile(f,JSON.stringify(a,null,2),"utf-8"),{success:!0}}catch(a){return console.error("Failed to save draft:",a),{success:!1,error:"Failed to save draft"}}}async function x(a){try{let b=await v(),d=(await c.default.readdir(b)).filter(a=>a.endsWith(".json")).map(async a=>{try{let d=e.default.join(b,a),f=await c.default.readFile(d,"utf-8");return JSON.parse(f)}catch(b){return console.error(`Failed to parse draft file ${a}:`,b),null}}),f=(await Promise.all(d)).filter(a=>null!==a);if(a)return f.filter(b=>b.repoPath===a).sort((a,b)=>b.timestamp.localeCompare(a.timestamp));return f.sort((a,b)=>b.timestamp.localeCompare(a.timestamp))}catch(a){if("ENOENT"===a.code)return[];return console.error("Failed to list drafts:",a),[]}}async function y(a){try{let b=await v(),d=e.default.basename(a),f=e.default.join(b,`${d}.json`);return await c.default.rm(f,{force:!0}),{success:!0}}catch(a){return console.error("Failed to delete draft:",a),{success:!1,error:"Failed to delete draft"}}}(0,q.ensureServerEntryExports)([r,u]),(0,b.registerServerReference)(r,"4041027bcd06f365363767978a14ebe8d79dc833bb",null),(0,b.registerServerReference)(u,"6034f4cb6f9c641315b0b93c4ad6d19cd435b40c2c",null),a.s(["cloneRemoteRepository",()=>u,"resolveRepositoryByName",()=>r],98624),(0,q.ensureServerEntryExports)([w,x,y]),(0,b.registerServerReference)(w,"40ab3155e870c7e311a3bfe4c18a6dc8c31ca04cee",null),(0,b.registerServerReference)(x,"401556bf39c72550b87c239401589366f61872b689",null),(0,b.registerServerReference)(y,"40d8dd2f28cb52127d582a5fd4b10a0efe2f938d8f",null),a.s(["deleteDraft",()=>y,"listDrafts",()=>x,"saveDraft",()=>w],54569)},11129,a=>{"use strict";var b=a.i(15271),c=a.i(98624),d=a.i(51817),e=a.i(54569),f=a.i(38642),g=a.i(37359);a.s([],53565),a.i(53565),a.s(["000b08f887beb71637c519c04ba6aac330ab8dadc4",()=>b.getHomeDirectory,"002628302974b1d9d0c05eefc202ccbb2efcc2cbe0",()=>g.listCredentials,"003561691afb672a539b4c94ff1a37b71e49c9afb7",()=>g.listAgentApiCredentials,"004acab2eb117a3c8c7fba404ec67a5dfe26f40b82",()=>f.getConfig,"4012caea17b47eb1a3e66525da9f605ed00831eaa1",()=>b.checkIsGitRepo,"401556bf39c72550b87c239401589366f61872b689",()=>e.listDrafts,"401cefb9f2f0230875166691a524fe6a1c9457b10f",()=>b.checkAgentCliInstalled,"4020240f2dbe1fdeee222fde06319090eb0534b5d1",()=>d.deleteSession,"4024414bd5ce3f38f0cbd12e1805db9036135657fa",()=>b.listPathEntries,"402485c1b18b9d295d9618d8dadc71e24b1e8eb418",()=>d.listSessions,"4041027bcd06f365363767978a14ebe8d79dc833bb",()=>c.resolveRepositoryByName,"405739648f8e6d83ff3dd63c8065867bf798683868",()=>f.updateConfig,"408eeaba46545e12ea20d609bc4f1260ff905d33ad",()=>b.listDirectories,"40a380b3bfd1d08852776603d9b824ccca68aa3497",()=>b.installAgentCli,"40ab3155e870c7e311a3bfe4c18a6dc8c31ca04cee",()=>e.saveDraft,"40b67eda0795e9a0247fd06f52d2fdc28ce3f1ee53",()=>b.checkDirectoryAccessible,"40c6812f9b7117d479f53a38ff9c4d93ee2a36e441",()=>b.getBranches,"40d8dd2f28cb52127d582a5fd4b10a0efe2f938d8f",()=>e.deleteDraft,"40f34f53981ef162b3c211fe00853beb380e52eacb",()=>d.getSessionPrefillContext,"6034f4cb6f9c641315b0b93c4ad6d19cd435b40c2c",()=>c.cloneRemoteRepository,"60752430c56f23b5025818800618a799c078518f98",()=>f.updateRepoSettings,"60b2d1ea1848faa022602fefbf20f5e82112955f45",()=>d.saveSessionLaunchContext,"60e1900f3b162d274440b6e9dcda3bc04e456c4990",()=>b.checkoutBranch,"709d3e1159b28d903cbd543d10dd494a03b2de82fa",()=>d.createSession,"7f11884f46af44b93d51ab8916ae86d7e181a9c336",()=>b.saveAttachments,"7f31a55e7198df30c30fb1e5c4e4bce8cc4c850be3",()=>b.startTtydProcess,"7f426225d430b57a96d465f4956afee53ef35ce925",()=>b.getStartupScript,"7fb8cdef5fb143cc0be7e0888fcdae8e1214255963",()=>b.listRepoFiles,"7fe78908212d15cbd04c86a31bcc76c5c4e10a17bf",()=>b.getDefaultDevServerScript],11129)},45581,a=>{a.v(b=>Promise.all(["server/chunks/ssr/[externals]_keytar_23140f5c._.js"].map(b=>a.l(b))).then(()=>b(83034)))},44264,a=>{a.v(a=>Promise.resolve().then(()=>a(33405)))},37706,a=>{a.v(b=>Promise.all(["server/chunks/ssr/[root-of-the-server]__edf0aa7a._.js"].map(b=>a.l(b))).then(()=>b(78775)))}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__32cb19cb._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/actions/repository.ts","../../../../src/lib/repo-resolver.ts","../../../../src/app/actions/draft.ts","../../../../.next-internal/server/app/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["'use server';\n\nimport fs from 'fs/promises';\nimport os from 'os';\nimport path from 'path';\nimport simpleGit from 'simple-git';\nimport { resolveRepositoryPathByName } from '@/lib/repo-resolver';\nimport { getAllCredentials, getCredentialById, getCredentialToken } from '@/lib/credentials';\nimport type { Credential } from '@/lib/credentials';\nimport { detectGitRemoteProvider, parseGitRemoteHost } from '@/lib/terminal-session';\n\ntype ResolveRepositoryResult = {\n success: boolean;\n repoPath: string | null;\n error?: string;\n};\n\ntype CloneRemoteRepositoryResult = {\n success: boolean;\n repoPath: string | null;\n error?: string;\n};\n\nexport async function resolveRepositoryByName(repoName: string): Promise<ResolveRepositoryResult> {\n try {\n const resolvedPath = await resolveRepositoryPathByName(repoName);\n return {\n success: true,\n repoPath: resolvedPath,\n };\n } catch (error) {\n console.error('Failed to resolve repository by name:', error);\n return {\n success: false,\n repoPath: null,\n error: 'Failed to search repositories. Please try again.',\n };\n }\n}\n\nfunction getGitLabCredentialHost(credential: Credential): string | null {\n if (credential.type !== 'gitlab') return null;\n\n try {\n return new URL(credential.serverUrl).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nfunction pickCandidateCredential(\n credentials: Credential[],\n provider: 'github' | 'gitlab',\n remoteHost: string | null,\n): Credential | null {\n if (provider === 'github') {\n return credentials.find((credential) => credential.type === 'github') || null;\n }\n\n if (remoteHost) {\n const hostMatch = credentials.find((credential) => (\n credential.type === 'gitlab'\n && getGitLabCredentialHost(credential) === remoteHost\n ));\n if (hostMatch) return hostMatch;\n }\n\n return credentials.find((credential) => credential.type === 'gitlab') || null;\n}\n\nfunction getRepoNameFromRemoteUrl(remoteUrl: string): string | null {\n const trimmed = remoteUrl.trim();\n if (!trimmed) return null;\n\n let rawPath = '';\n\n try {\n const parsed = new URL(trimmed);\n rawPath = parsed.pathname;\n } catch {\n const scpLikeMatch = trimmed.match(/^([^@]+@)?([^:]+):(.+)$/);\n if (scpLikeMatch) {\n rawPath = scpLikeMatch[3];\n } else {\n rawPath = trimmed;\n }\n }\n\n const normalized = rawPath.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n if (!normalized) return null;\n\n let baseName = path.posix.basename(normalized);\n if (!baseName || baseName === '.' || baseName === '..') return null;\n\n if (baseName.toLowerCase().endsWith('.git')) {\n baseName = baseName.slice(0, -4);\n }\n\n const sanitized = baseName\n .replace(/[^a-zA-Z0-9._-]/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n\n return sanitized || null;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction sanitizeErrorMessage(message: string, secretValues: string[]): string {\n let sanitized = message;\n\n for (const value of secretValues) {\n if (!value) continue;\n sanitized = sanitized.replace(new RegExp(escapeRegExp(value), 'g'), '***');\n }\n\n return sanitized.replace(/:\\/\\/[^/\\s@]+@/g, '://***@');\n}\n\nfunction buildAuthenticatedCloneUrl(remoteUrl: string, credential: Credential, token: string): string {\n let parsed: URL;\n try {\n parsed = new URL(remoteUrl);\n } catch {\n return remoteUrl;\n }\n\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n return remoteUrl;\n }\n\n if (credential.type === 'github') {\n parsed.username = 'x-access-token';\n parsed.password = token;\n return parsed.toString();\n }\n\n parsed.username = 'oauth2';\n parsed.password = token;\n return parsed.toString();\n}\n\ntype CloneCredentialResolution =\n | { success: true; credential: Credential | null; token: string | null }\n | { success: false; error: string };\n\nasync function resolveCloneCredential(\n remoteUrl: string,\n credentialId: string | null,\n): Promise<CloneCredentialResolution> {\n const allCredentials = await getAllCredentials();\n const provider = detectGitRemoteProvider(remoteUrl, {\n gitlabHosts: allCredentials.flatMap((credential) => {\n if (credential.type !== 'gitlab') return [];\n const host = getGitLabCredentialHost(credential);\n return host ? [host] : [];\n }),\n });\n const remoteHost = parseGitRemoteHost(remoteUrl);\n\n if (credentialId) {\n const selectedCredential = await getCredentialById(credentialId);\n if (!selectedCredential) {\n return { success: false, error: 'Selected credential was not found. Please choose another credential.' };\n }\n\n if (provider === 'github' && selectedCredential.type !== 'github') {\n return { success: false, error: 'Selected credential does not match this GitHub repository.' };\n }\n if (provider === 'gitlab' && selectedCredential.type !== 'gitlab') {\n return { success: false, error: 'Selected credential does not match this GitLab repository.' };\n }\n\n if (selectedCredential.type === 'gitlab' && remoteHost) {\n const credentialHost = getGitLabCredentialHost(selectedCredential);\n if (credentialHost && credentialHost !== remoteHost) {\n return {\n success: false,\n error: `Selected GitLab credential targets ${credentialHost}, but this repository uses ${remoteHost}.`,\n };\n }\n }\n\n const token = await getCredentialToken(selectedCredential.id);\n if (!token) {\n return { success: false, error: 'Could not load token for selected credential.' };\n }\n\n return { success: true, credential: selectedCredential, token };\n }\n\n if (!provider) {\n return { success: true, credential: null, token: null };\n }\n\n const candidate = pickCandidateCredential(allCredentials, provider, remoteHost);\n if (!candidate) {\n return { success: true, credential: null, token: null };\n }\n\n const token = await getCredentialToken(candidate.id);\n if (!token) {\n return { success: true, credential: null, token: null };\n }\n\n return { success: true, credential: candidate, token };\n}\n\nexport async function cloneRemoteRepository(\n remoteUrl: string,\n credentialId: string | null,\n): Promise<CloneRemoteRepositoryResult> {\n const trimmedRemoteUrl = remoteUrl.trim();\n if (!trimmedRemoteUrl) {\n return { success: false, repoPath: null, error: 'Please enter a remote repository URL.' };\n }\n\n const repoName = getRepoNameFromRemoteUrl(trimmedRemoteUrl);\n if (!repoName) {\n return { success: false, repoPath: null, error: 'Could not determine repository name from URL.' };\n }\n\n const cloneRoot = path.join(os.homedir(), '.viba', 'repos');\n await fs.mkdir(cloneRoot, { recursive: true });\n\n const targetPath = path.join(cloneRoot, repoName);\n try {\n await fs.access(targetPath);\n return {\n success: false,\n repoPath: null,\n error: `Repository already exists at ${targetPath}.`,\n };\n } catch {\n // Path does not exist yet.\n }\n\n const credentialResolution = await resolveCloneCredential(trimmedRemoteUrl, credentialId);\n if (!credentialResolution.success) {\n return { success: false, repoPath: null, error: credentialResolution.error };\n }\n\n const cloneUrl = (credentialResolution.credential && credentialResolution.token)\n ? buildAuthenticatedCloneUrl(trimmedRemoteUrl, credentialResolution.credential, credentialResolution.token)\n : trimmedRemoteUrl;\n\n const git = simpleGit();\n\n try {\n await git.clone(cloneUrl, targetPath);\n\n if (cloneUrl !== trimmedRemoteUrl) {\n const clonedRepoGit = simpleGit(targetPath);\n await clonedRepoGit.remote(['set-url', 'origin', trimmedRemoteUrl]);\n }\n\n return {\n success: true,\n repoPath: targetPath,\n };\n } catch (error) {\n const rawMessage = error instanceof Error ? error.message : String(error);\n const safeMessage = sanitizeErrorMessage(rawMessage, [\n cloneUrl,\n credentialResolution.token ?? '',\n ]);\n\n try {\n await fs.rm(targetPath, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors.\n }\n\n return {\n success: false,\n repoPath: null,\n error: safeMessage || 'Failed to clone repository.',\n };\n }\n}\n","import fs from 'fs/promises';\nimport type { Dirent } from 'fs';\nimport path from 'path';\nimport { getConfig } from '@/app/actions/config';\n\nconst MAX_SCAN_DEPTH = 5;\nconst MAX_SCANNED_DIRECTORIES = 5000;\nconst RESOLUTION_CACHE_TTL_MS = 5 * 60 * 1000;\nconst SKIPPED_DIR_NAMES = new Set([\n '.git',\n 'node_modules',\n '.next',\n '.viba',\n 'dist',\n 'build',\n 'coverage',\n]);\n\ntype RepoResolutionCacheEntry = {\n repoPath: string;\n resolvedAt: number;\n};\n\ndeclare global {\n var repoResolutionCache: Map<string, RepoResolutionCacheEntry> | undefined;\n}\n\nfunction getResolutionCache(): Map<string, RepoResolutionCacheEntry> {\n if (!global.repoResolutionCache) {\n global.repoResolutionCache = new Map<string, RepoResolutionCacheEntry>();\n }\n return global.repoResolutionCache;\n}\n\nfunction cacheResolution(repoName: string, repoPath: string): void {\n getResolutionCache().set(repoName.toLowerCase(), {\n repoPath,\n resolvedAt: Date.now(),\n });\n}\n\nasync function getValidCachedResolution(repoName: string): Promise<string | null> {\n const entry = getResolutionCache().get(repoName.toLowerCase());\n if (!entry) return null;\n if (Date.now() - entry.resolvedAt > RESOLUTION_CACHE_TTL_MS) {\n getResolutionCache().delete(repoName.toLowerCase());\n return null;\n }\n\n if (await isGitRepository(entry.repoPath)) {\n return entry.repoPath;\n }\n\n getResolutionCache().delete(repoName.toLowerCase());\n return null;\n}\n\nasync function isGitRepository(dirPath: string): Promise<boolean> {\n try {\n await fs.access(path.join(dirPath, '.git'));\n return true;\n } catch {\n return false;\n }\n}\n\nfunction hasMatchingName(repoPath: string, repoName: string): boolean {\n return path.basename(repoPath).toLowerCase() === repoName.toLowerCase();\n}\n\nfunction shouldSkipDirectory(entryName: string, targetName: string): boolean {\n const lowerName = entryName.toLowerCase();\n if (lowerName === targetName) return false;\n if (SKIPPED_DIR_NAMES.has(lowerName)) return true;\n if (entryName.startsWith('.')) return true;\n return false;\n}\n\nasync function findByNameWithinRoot(rootPath: string, repoName: string): Promise<string | null> {\n const directCandidate = path.join(rootPath, repoName);\n if (await isGitRepository(directCandidate)) {\n return directCandidate;\n }\n\n const queue: Array<{ dirPath: string; depth: number }> = [{ dirPath: rootPath, depth: 0 }];\n let scannedCount = 0;\n const targetName = repoName.toLowerCase();\n\n for (let index = 0; index < queue.length; index += 1) {\n const current = queue[index];\n scannedCount += 1;\n if (scannedCount > MAX_SCANNED_DIRECTORIES) {\n break;\n }\n\n let entries: Dirent[];\n try {\n entries = await fs.readdir(current.dirPath, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (shouldSkipDirectory(entry.name, targetName)) continue;\n\n const nextDirPath = path.join(current.dirPath, entry.name);\n\n if (entry.name.toLowerCase() === targetName && await isGitRepository(nextDirPath)) {\n return nextDirPath;\n }\n\n if (current.depth + 1 <= MAX_SCAN_DEPTH) {\n queue.push({ dirPath: nextDirPath, depth: current.depth + 1 });\n }\n }\n }\n\n return null;\n}\n\nexport async function resolveRepositoryPathByName(repoName: string): Promise<string | null> {\n const trimmedName = repoName.trim();\n if (!trimmedName) return null;\n\n const cachedResolution = await getValidCachedResolution(trimmedName);\n if (cachedResolution) {\n return cachedResolution;\n }\n\n const config = await getConfig();\n\n const recentMatches = config.recentRepos.filter((repoPath) => hasMatchingName(repoPath, trimmedName));\n for (const repoPath of recentMatches) {\n if (await isGitRepository(repoPath)) {\n cacheResolution(trimmedName, repoPath);\n return repoPath;\n }\n }\n\n const searchRoots: string[] = [];\n const visitedRoots = new Set<string>();\n for (const repoPath of config.recentRepos) {\n const parentPath = path.dirname(repoPath);\n if (!visitedRoots.has(parentPath)) {\n visitedRoots.add(parentPath);\n searchRoots.push(parentPath);\n }\n }\n if (config.defaultRoot && !visitedRoots.has(config.defaultRoot)) {\n visitedRoots.add(config.defaultRoot);\n searchRoots.push(config.defaultRoot);\n }\n\n for (const rootPath of searchRoots) {\n const resolvedPath = await findByNameWithinRoot(rootPath, trimmedName);\n if (resolvedPath) {\n cacheResolution(trimmedName, resolvedPath);\n return resolvedPath;\n }\n }\n\n return null;\n}\n","'use server';\n\nimport fs from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\n\nexport type DraftMetadata = {\n id: string;\n repoPath: string;\n branchName: string;\n message: string;\n attachmentPaths: string[];\n agentProvider: string;\n model: string;\n timestamp: string;\n title: string;\n startupScript: string;\n devServerScript: string;\n sessionMode: 'fast' | 'plan';\n};\n\nasync function getDraftsDir(): Promise<string> {\n const homedir = os.homedir();\n const draftsDir = path.join(homedir, '.viba', 'drafts');\n try {\n await fs.mkdir(draftsDir, { recursive: true });\n } catch {\n // Ignore if exists\n }\n return draftsDir;\n}\n\nexport async function saveDraft(draft: DraftMetadata): Promise<{ success: boolean; error?: string }> {\n try {\n const draftsDir = await getDraftsDir();\n const safeId = path.basename(draft.id);\n const filePath = path.join(draftsDir, `${safeId}.json`);\n await fs.writeFile(filePath, JSON.stringify(draft, null, 2), 'utf-8');\n return { success: true };\n } catch (e) {\n console.error('Failed to save draft:', e);\n return { success: false, error: 'Failed to save draft' };\n }\n}\n\nexport async function listDrafts(repoPath?: string): Promise<DraftMetadata[]> {\n try {\n const draftsDir = await getDraftsDir();\n const entries = await fs.readdir(draftsDir);\n\n const draftPromises = entries\n .filter((entry) => entry.endsWith('.json'))\n .map(async (entry) => {\n try {\n const filePath = path.join(draftsDir, entry);\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as DraftMetadata;\n } catch (e) {\n console.error(`Failed to parse draft file ${entry}:`, e);\n return null;\n }\n });\n\n const drafts = (await Promise.all(draftPromises)).filter((d): d is DraftMetadata => d !== null);\n\n if (repoPath) {\n return drafts.filter((d) => d.repoPath === repoPath).sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n }\n\n return drafts.sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n } catch (e: any) {\n if (e.code === 'ENOENT') {\n return [];\n }\n console.error('Failed to list drafts:', e);\n return [];\n }\n}\n\nexport async function deleteDraft(id: string): Promise<{ success: boolean; error?: string }> {\n try {\n const draftsDir = await getDraftsDir();\n const safeId = path.basename(id);\n const filePath = path.join(draftsDir, `${safeId}.json`);\n await fs.rm(filePath, { force: true });\n return { success: true };\n } catch (e) {\n console.error('Failed to delete draft:', e);\n return { success: false, error: 'Failed to delete draft' };\n }\n}\n","export {checkDirectoryAccessible as '40ea0299c4b573cf8e6b0f6e850a11cf72d0a2614f'} from 'ACTIONS_MODULE0'\nexport {listDirectories as '4001029958bcf3af70bb6dd37f8edb654b55c2117d'} from 'ACTIONS_MODULE0'\nexport {getHomeDirectory as '003f59d9b072ba439a66065346d259ab83d25d897d'} from 'ACTIONS_MODULE0'\nexport {checkIsGitRepo as '40402e350533ce09024ae8299de5deccda87e7e955'} from 'ACTIONS_MODULE0'\nexport {getBranches as '40db6a36c9bb96a23f2cad151164d1b7ebe1af88a8'} from 'ACTIONS_MODULE0'\nexport {checkoutBranch as '60ceedca9359f7e545655189a4df3dec0697724fa5'} from 'ACTIONS_MODULE0'\nexport {startTtydProcess as '7f4e2d8cbfea83c90a943b7d1ad26051afd667020b'} from 'ACTIONS_MODULE0'\nexport {getStartupScript as '7f436fd72bd8226a2f176bcb7ba20b215d559d6065'} from 'ACTIONS_MODULE0'\nexport {getDefaultDevServerScript as '7fadf441b373188b3dace3ae48b8d30a428868a738'} from 'ACTIONS_MODULE0'\nexport {listRepoFiles as '7fd73dc371c3550ad517787595adb3897f68ba2f8f'} from 'ACTIONS_MODULE0'\nexport {checkAgentCliInstalled as '4044c7057435fea28c0b9bb1f0058d51b909feabfb'} from 'ACTIONS_MODULE0'\nexport {installAgentCli as '40d3fb934ccbd71e41a15fbeda23bcaa134db0ad02'} from 'ACTIONS_MODULE0'\nexport {cloneRemoteRepository as '609756f1c99ec557bf570c2d894c4a6dceaec2a0fa'} from 'ACTIONS_MODULE1'\nexport {resolveRepositoryByName as '40addd6e01d77ba35c824c87a58a5139275b97b8c3'} from 'ACTIONS_MODULE1'\nexport {createSession as '7080e3f8edb2130b45f4816972ccaf426c84be7510'} from 'ACTIONS_MODULE2'\nexport {deleteSession as '4006c8c1f97e58e11136be766e5901a5c0ed9cf64a'} from 'ACTIONS_MODULE2'\nexport {getSessionPrefillContext as '408c10d86a69e8a886e15b3179eb4e8d91a8e52bb7'} from 'ACTIONS_MODULE2'\nexport {listSessions as '40dc98753e736251a2dce196c07929485ef21f9e19'} from 'ACTIONS_MODULE2'\nexport {saveSessionLaunchContext as '6037a38506b04adf0f2857a08b5e4cbaca8e724f4b'} from 'ACTIONS_MODULE2'\nexport {deleteDraft as '40010fe89d6528642fe87900ab9ae5c8796c16e5bd'} from 'ACTIONS_MODULE3'\nexport {listDrafts as '40047b3107438da9a66c14d0c7d3e02ecd487c4686'} from 'ACTIONS_MODULE3'\nexport {saveDraft as '40f310df50f9f2df74747dcc5b1b6fc9c5404c1f14'} from 'ACTIONS_MODULE3'\nexport {getConfig as '00f8d9271ab0088f183a1494ee1e57a9c9bf395836'} from 'ACTIONS_MODULE4'\nexport {updateConfig as '40839453baab94a23bf39433a552dbe7f519a44449'} from 'ACTIONS_MODULE4'\nexport {updateRepoSettings as '60720766262fbc3bb33550cfafe06868422a53109d'} from 'ACTIONS_MODULE4'\nexport {listAgentApiCredentials as '001b884a80812d1f61dbae458988c02181906ec73c'} from 'ACTIONS_MODULE5'\nexport {listCredentials as '0024cd8264923ac29ca23ec9b72eb8f41d4e4f5b3c'} from 'ACTIONS_MODULE5'\nexport {listPathEntries as '40cd192901c59313dcda53d8937596378060397f11'} from 'ACTIONS_MODULE0'\nexport {saveAttachments as '7f8d431455c1da2fbe5358c50ae9b8c5259dd93aca'} from 'ACTIONS_MODULE0'\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/actions/repository.ts","../../../../src/lib/repo-resolver.ts","../../../../src/app/actions/draft.ts","../../../../.next-internal/server/app/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["'use server';\n\nimport fs from 'fs/promises';\nimport os from 'os';\nimport path from 'path';\nimport simpleGit from 'simple-git';\nimport { resolveRepositoryPathByName } from '@/lib/repo-resolver';\nimport { getAllCredentials, getCredentialById, getCredentialToken } from '@/lib/credentials';\nimport type { Credential } from '@/lib/credentials';\nimport { detectGitRemoteProvider, parseGitRemoteHost } from '@/lib/terminal-session';\n\ntype ResolveRepositoryResult = {\n success: boolean;\n repoPath: string | null;\n error?: string;\n};\n\ntype CloneRemoteRepositoryResult = {\n success: boolean;\n repoPath: string | null;\n error?: string;\n};\n\nexport async function resolveRepositoryByName(repoName: string): Promise<ResolveRepositoryResult> {\n try {\n const resolvedPath = await resolveRepositoryPathByName(repoName);\n return {\n success: true,\n repoPath: resolvedPath,\n };\n } catch (error) {\n console.error('Failed to resolve repository by name:', error);\n return {\n success: false,\n repoPath: null,\n error: 'Failed to search repositories. Please try again.',\n };\n }\n}\n\nfunction getGitLabCredentialHost(credential: Credential): string | null {\n if (credential.type !== 'gitlab') return null;\n\n try {\n return new URL(credential.serverUrl).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nfunction pickCandidateCredential(\n credentials: Credential[],\n provider: 'github' | 'gitlab',\n remoteHost: string | null,\n): Credential | null {\n if (provider === 'github') {\n return credentials.find((credential) => credential.type === 'github') || null;\n }\n\n if (remoteHost) {\n const hostMatch = credentials.find((credential) => (\n credential.type === 'gitlab'\n && getGitLabCredentialHost(credential) === remoteHost\n ));\n if (hostMatch) return hostMatch;\n }\n\n return credentials.find((credential) => credential.type === 'gitlab') || null;\n}\n\nfunction getRepoNameFromRemoteUrl(remoteUrl: string): string | null {\n const trimmed = remoteUrl.trim();\n if (!trimmed) return null;\n\n let rawPath = '';\n\n try {\n const parsed = new URL(trimmed);\n rawPath = parsed.pathname;\n } catch {\n const scpLikeMatch = trimmed.match(/^([^@]+@)?([^:]+):(.+)$/);\n if (scpLikeMatch) {\n rawPath = scpLikeMatch[3];\n } else {\n rawPath = trimmed;\n }\n }\n\n const normalized = rawPath.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n if (!normalized) return null;\n\n let baseName = path.posix.basename(normalized);\n if (!baseName || baseName === '.' || baseName === '..') return null;\n\n if (baseName.toLowerCase().endsWith('.git')) {\n baseName = baseName.slice(0, -4);\n }\n\n const sanitized = baseName\n .replace(/[^a-zA-Z0-9._-]/g, '-')\n .replace(/^-+/, '')\n .replace(/-+$/, '');\n\n return sanitized || null;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction sanitizeErrorMessage(message: string, secretValues: string[]): string {\n let sanitized = message;\n\n for (const value of secretValues) {\n if (!value) continue;\n sanitized = sanitized.replace(new RegExp(escapeRegExp(value), 'g'), '***');\n }\n\n return sanitized.replace(/:\\/\\/[^/\\s@]+@/g, '://***@');\n}\n\nfunction buildAuthenticatedCloneUrl(remoteUrl: string, credential: Credential, token: string): string {\n let parsed: URL;\n try {\n parsed = new URL(remoteUrl);\n } catch {\n return remoteUrl;\n }\n\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n return remoteUrl;\n }\n\n if (credential.type === 'github') {\n parsed.username = 'x-access-token';\n parsed.password = token;\n return parsed.toString();\n }\n\n parsed.username = 'oauth2';\n parsed.password = token;\n return parsed.toString();\n}\n\ntype CloneCredentialResolution =\n | { success: true; credential: Credential | null; token: string | null }\n | { success: false; error: string };\n\nasync function resolveCloneCredential(\n remoteUrl: string,\n credentialId: string | null,\n): Promise<CloneCredentialResolution> {\n const allCredentials = await getAllCredentials();\n const provider = detectGitRemoteProvider(remoteUrl, {\n gitlabHosts: allCredentials.flatMap((credential) => {\n if (credential.type !== 'gitlab') return [];\n const host = getGitLabCredentialHost(credential);\n return host ? [host] : [];\n }),\n });\n const remoteHost = parseGitRemoteHost(remoteUrl);\n\n if (credentialId) {\n const selectedCredential = await getCredentialById(credentialId);\n if (!selectedCredential) {\n return { success: false, error: 'Selected credential was not found. Please choose another credential.' };\n }\n\n if (provider === 'github' && selectedCredential.type !== 'github') {\n return { success: false, error: 'Selected credential does not match this GitHub repository.' };\n }\n if (provider === 'gitlab' && selectedCredential.type !== 'gitlab') {\n return { success: false, error: 'Selected credential does not match this GitLab repository.' };\n }\n\n if (selectedCredential.type === 'gitlab' && remoteHost) {\n const credentialHost = getGitLabCredentialHost(selectedCredential);\n if (credentialHost && credentialHost !== remoteHost) {\n return {\n success: false,\n error: `Selected GitLab credential targets ${credentialHost}, but this repository uses ${remoteHost}.`,\n };\n }\n }\n\n const token = await getCredentialToken(selectedCredential.id);\n if (!token) {\n return { success: false, error: 'Could not load token for selected credential.' };\n }\n\n return { success: true, credential: selectedCredential, token };\n }\n\n if (!provider) {\n return { success: true, credential: null, token: null };\n }\n\n const candidate = pickCandidateCredential(allCredentials, provider, remoteHost);\n if (!candidate) {\n return { success: true, credential: null, token: null };\n }\n\n const token = await getCredentialToken(candidate.id);\n if (!token) {\n return { success: true, credential: null, token: null };\n }\n\n return { success: true, credential: candidate, token };\n}\n\nexport async function cloneRemoteRepository(\n remoteUrl: string,\n credentialId: string | null,\n): Promise<CloneRemoteRepositoryResult> {\n const trimmedRemoteUrl = remoteUrl.trim();\n if (!trimmedRemoteUrl) {\n return { success: false, repoPath: null, error: 'Please enter a remote repository URL.' };\n }\n\n const repoName = getRepoNameFromRemoteUrl(trimmedRemoteUrl);\n if (!repoName) {\n return { success: false, repoPath: null, error: 'Could not determine repository name from URL.' };\n }\n\n const cloneRoot = path.join(os.homedir(), '.viba', 'repos');\n await fs.mkdir(cloneRoot, { recursive: true });\n\n const targetPath = path.join(cloneRoot, repoName);\n try {\n await fs.access(targetPath);\n return {\n success: false,\n repoPath: null,\n error: `Repository already exists at ${targetPath}.`,\n };\n } catch {\n // Path does not exist yet.\n }\n\n const credentialResolution = await resolveCloneCredential(trimmedRemoteUrl, credentialId);\n if (!credentialResolution.success) {\n return { success: false, repoPath: null, error: credentialResolution.error };\n }\n\n const cloneUrl = (credentialResolution.credential && credentialResolution.token)\n ? buildAuthenticatedCloneUrl(trimmedRemoteUrl, credentialResolution.credential, credentialResolution.token)\n : trimmedRemoteUrl;\n\n const git = simpleGit();\n\n try {\n await git.clone(cloneUrl, targetPath);\n\n if (cloneUrl !== trimmedRemoteUrl) {\n const clonedRepoGit = simpleGit(targetPath);\n await clonedRepoGit.remote(['set-url', 'origin', trimmedRemoteUrl]);\n }\n\n return {\n success: true,\n repoPath: targetPath,\n };\n } catch (error) {\n const rawMessage = error instanceof Error ? error.message : String(error);\n const safeMessage = sanitizeErrorMessage(rawMessage, [\n cloneUrl,\n credentialResolution.token ?? '',\n ]);\n\n try {\n await fs.rm(targetPath, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors.\n }\n\n return {\n success: false,\n repoPath: null,\n error: safeMessage || 'Failed to clone repository.',\n };\n }\n}\n","import fs from 'fs/promises';\nimport type { Dirent } from 'fs';\nimport path from 'path';\nimport { getConfig } from '@/app/actions/config';\n\nconst MAX_SCAN_DEPTH = 5;\nconst MAX_SCANNED_DIRECTORIES = 5000;\nconst RESOLUTION_CACHE_TTL_MS = 5 * 60 * 1000;\nconst SKIPPED_DIR_NAMES = new Set([\n '.git',\n 'node_modules',\n '.next',\n '.viba',\n 'dist',\n 'build',\n 'coverage',\n]);\n\ntype RepoResolutionCacheEntry = {\n repoPath: string;\n resolvedAt: number;\n};\n\ndeclare global {\n var repoResolutionCache: Map<string, RepoResolutionCacheEntry> | undefined;\n}\n\nfunction getResolutionCache(): Map<string, RepoResolutionCacheEntry> {\n if (!global.repoResolutionCache) {\n global.repoResolutionCache = new Map<string, RepoResolutionCacheEntry>();\n }\n return global.repoResolutionCache;\n}\n\nfunction cacheResolution(repoName: string, repoPath: string): void {\n getResolutionCache().set(repoName.toLowerCase(), {\n repoPath,\n resolvedAt: Date.now(),\n });\n}\n\nasync function getValidCachedResolution(repoName: string): Promise<string | null> {\n const entry = getResolutionCache().get(repoName.toLowerCase());\n if (!entry) return null;\n if (Date.now() - entry.resolvedAt > RESOLUTION_CACHE_TTL_MS) {\n getResolutionCache().delete(repoName.toLowerCase());\n return null;\n }\n\n if (await isGitRepository(entry.repoPath)) {\n return entry.repoPath;\n }\n\n getResolutionCache().delete(repoName.toLowerCase());\n return null;\n}\n\nasync function isGitRepository(dirPath: string): Promise<boolean> {\n try {\n await fs.access(path.join(dirPath, '.git'));\n return true;\n } catch {\n return false;\n }\n}\n\nfunction hasMatchingName(repoPath: string, repoName: string): boolean {\n return path.basename(repoPath).toLowerCase() === repoName.toLowerCase();\n}\n\nfunction shouldSkipDirectory(entryName: string, targetName: string): boolean {\n const lowerName = entryName.toLowerCase();\n if (lowerName === targetName) return false;\n if (SKIPPED_DIR_NAMES.has(lowerName)) return true;\n if (entryName.startsWith('.')) return true;\n return false;\n}\n\nasync function findByNameWithinRoot(rootPath: string, repoName: string): Promise<string | null> {\n const directCandidate = path.join(rootPath, repoName);\n if (await isGitRepository(directCandidate)) {\n return directCandidate;\n }\n\n const queue: Array<{ dirPath: string; depth: number }> = [{ dirPath: rootPath, depth: 0 }];\n let scannedCount = 0;\n const targetName = repoName.toLowerCase();\n\n for (let index = 0; index < queue.length; index += 1) {\n const current = queue[index];\n scannedCount += 1;\n if (scannedCount > MAX_SCANNED_DIRECTORIES) {\n break;\n }\n\n let entries: Dirent[];\n try {\n entries = await fs.readdir(current.dirPath, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (shouldSkipDirectory(entry.name, targetName)) continue;\n\n const nextDirPath = path.join(current.dirPath, entry.name);\n\n if (entry.name.toLowerCase() === targetName && await isGitRepository(nextDirPath)) {\n return nextDirPath;\n }\n\n if (current.depth + 1 <= MAX_SCAN_DEPTH) {\n queue.push({ dirPath: nextDirPath, depth: current.depth + 1 });\n }\n }\n }\n\n return null;\n}\n\nexport async function resolveRepositoryPathByName(repoName: string): Promise<string | null> {\n const trimmedName = repoName.trim();\n if (!trimmedName) return null;\n\n const cachedResolution = await getValidCachedResolution(trimmedName);\n if (cachedResolution) {\n return cachedResolution;\n }\n\n const config = await getConfig();\n\n const recentMatches = config.recentRepos.filter((repoPath) => hasMatchingName(repoPath, trimmedName));\n for (const repoPath of recentMatches) {\n if (await isGitRepository(repoPath)) {\n cacheResolution(trimmedName, repoPath);\n return repoPath;\n }\n }\n\n const searchRoots: string[] = [];\n const visitedRoots = new Set<string>();\n for (const repoPath of config.recentRepos) {\n const parentPath = path.dirname(repoPath);\n if (!visitedRoots.has(parentPath)) {\n visitedRoots.add(parentPath);\n searchRoots.push(parentPath);\n }\n }\n if (config.defaultRoot && !visitedRoots.has(config.defaultRoot)) {\n visitedRoots.add(config.defaultRoot);\n searchRoots.push(config.defaultRoot);\n }\n\n for (const rootPath of searchRoots) {\n const resolvedPath = await findByNameWithinRoot(rootPath, trimmedName);\n if (resolvedPath) {\n cacheResolution(trimmedName, resolvedPath);\n return resolvedPath;\n }\n }\n\n return null;\n}\n","'use server';\n\nimport fs from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\n\nexport type DraftMetadata = {\n id: string;\n repoPath: string;\n branchName: string;\n message: string;\n attachmentPaths: string[];\n agentProvider: string;\n model: string;\n timestamp: string;\n title: string;\n startupScript: string;\n devServerScript: string;\n sessionMode: 'fast' | 'plan';\n};\n\nasync function getDraftsDir(): Promise<string> {\n const homedir = os.homedir();\n const draftsDir = path.join(homedir, '.viba', 'drafts');\n try {\n await fs.mkdir(draftsDir, { recursive: true });\n } catch {\n // Ignore if exists\n }\n return draftsDir;\n}\n\nexport async function saveDraft(draft: DraftMetadata): Promise<{ success: boolean; error?: string }> {\n try {\n const draftsDir = await getDraftsDir();\n const safeId = path.basename(draft.id);\n const filePath = path.join(draftsDir, `${safeId}.json`);\n await fs.writeFile(filePath, JSON.stringify(draft, null, 2), 'utf-8');\n return { success: true };\n } catch (e) {\n console.error('Failed to save draft:', e);\n return { success: false, error: 'Failed to save draft' };\n }\n}\n\nexport async function listDrafts(repoPath?: string): Promise<DraftMetadata[]> {\n try {\n const draftsDir = await getDraftsDir();\n const entries = await fs.readdir(draftsDir);\n\n const draftPromises = entries\n .filter((entry) => entry.endsWith('.json'))\n .map(async (entry) => {\n try {\n const filePath = path.join(draftsDir, entry);\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as DraftMetadata;\n } catch (e) {\n console.error(`Failed to parse draft file ${entry}:`, e);\n return null;\n }\n });\n\n const drafts = (await Promise.all(draftPromises)).filter((d): d is DraftMetadata => d !== null);\n\n if (repoPath) {\n return drafts.filter((d) => d.repoPath === repoPath).sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n }\n\n return drafts.sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n } catch (e: any) {\n if (e.code === 'ENOENT') {\n return [];\n }\n console.error('Failed to list drafts:', e);\n return [];\n }\n}\n\nexport async function deleteDraft(id: string): Promise<{ success: boolean; error?: string }> {\n try {\n const draftsDir = await getDraftsDir();\n const safeId = path.basename(id);\n const filePath = path.join(draftsDir, `${safeId}.json`);\n await fs.rm(filePath, { force: true });\n return { success: true };\n } catch (e) {\n console.error('Failed to delete draft:', e);\n return { success: false, error: 'Failed to delete draft' };\n }\n}\n","export {checkDirectoryAccessible as '40b67eda0795e9a0247fd06f52d2fdc28ce3f1ee53'} from 'ACTIONS_MODULE0'\nexport {listDirectories as '408eeaba46545e12ea20d609bc4f1260ff905d33ad'} from 'ACTIONS_MODULE0'\nexport {getHomeDirectory as '000b08f887beb71637c519c04ba6aac330ab8dadc4'} from 'ACTIONS_MODULE0'\nexport {checkIsGitRepo as '4012caea17b47eb1a3e66525da9f605ed00831eaa1'} from 'ACTIONS_MODULE0'\nexport {getBranches as '40c6812f9b7117d479f53a38ff9c4d93ee2a36e441'} from 'ACTIONS_MODULE0'\nexport {checkoutBranch as '60e1900f3b162d274440b6e9dcda3bc04e456c4990'} from 'ACTIONS_MODULE0'\nexport {startTtydProcess as '7f31a55e7198df30c30fb1e5c4e4bce8cc4c850be3'} from 'ACTIONS_MODULE0'\nexport {getStartupScript as '7f426225d430b57a96d465f4956afee53ef35ce925'} from 'ACTIONS_MODULE0'\nexport {getDefaultDevServerScript as '7fe78908212d15cbd04c86a31bcc76c5c4e10a17bf'} from 'ACTIONS_MODULE0'\nexport {listRepoFiles as '7fb8cdef5fb143cc0be7e0888fcdae8e1214255963'} from 'ACTIONS_MODULE0'\nexport {checkAgentCliInstalled as '401cefb9f2f0230875166691a524fe6a1c9457b10f'} from 'ACTIONS_MODULE0'\nexport {installAgentCli as '40a380b3bfd1d08852776603d9b824ccca68aa3497'} from 'ACTIONS_MODULE0'\nexport {cloneRemoteRepository as '6034f4cb6f9c641315b0b93c4ad6d19cd435b40c2c'} from 'ACTIONS_MODULE1'\nexport {resolveRepositoryByName as '4041027bcd06f365363767978a14ebe8d79dc833bb'} from 'ACTIONS_MODULE1'\nexport {createSession as '709d3e1159b28d903cbd543d10dd494a03b2de82fa'} from 'ACTIONS_MODULE2'\nexport {deleteSession as '4020240f2dbe1fdeee222fde06319090eb0534b5d1'} from 'ACTIONS_MODULE2'\nexport {getSessionPrefillContext as '40f34f53981ef162b3c211fe00853beb380e52eacb'} from 'ACTIONS_MODULE2'\nexport {listSessions as '402485c1b18b9d295d9618d8dadc71e24b1e8eb418'} from 'ACTIONS_MODULE2'\nexport {saveSessionLaunchContext as '60b2d1ea1848faa022602fefbf20f5e82112955f45'} from 'ACTIONS_MODULE2'\nexport {deleteDraft as '40d8dd2f28cb52127d582a5fd4b10a0efe2f938d8f'} from 'ACTIONS_MODULE3'\nexport {listDrafts as '401556bf39c72550b87c239401589366f61872b689'} from 'ACTIONS_MODULE3'\nexport {saveDraft as '40ab3155e870c7e311a3bfe4c18a6dc8c31ca04cee'} from 'ACTIONS_MODULE3'\nexport {getConfig as '004acab2eb117a3c8c7fba404ec67a5dfe26f40b82'} from 'ACTIONS_MODULE4'\nexport {updateConfig as '405739648f8e6d83ff3dd63c8065867bf798683868'} from 'ACTIONS_MODULE4'\nexport {updateRepoSettings as '60752430c56f23b5025818800618a799c078518f98'} from 'ACTIONS_MODULE4'\nexport {listAgentApiCredentials as '003561691afb672a539b4c94ff1a37b71e49c9afb7'} from 'ACTIONS_MODULE5'\nexport {listCredentials as '002628302974b1d9d0c05eefc202ccbb2efcc2cbe0'} from 'ACTIONS_MODULE5'\nexport {listPathEntries as '4024414bd5ce3f38f0cbd12e1805db9036135657fa'} from 'ACTIONS_MODULE0'\nexport {saveAttachments as '7f11884f46af44b93d51ab8916ae86d7e181a9c336'} from 'ACTIONS_MODULE0'\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[20460,(a,b,c)=>{(()=>{"use strict";"u">typeof __nccwpck_require__&&(__nccwpck_require__.ab="/ROOT/node_modules/next/dist/compiled/cookie/");var a,c,d,e,f={};f.parse=function(b,c){if("string"!=typeof b)throw TypeError("argument str must be a string");for(var e={},f=b.split(d),g=(c||{}).decode||a,h=0;h<f.length;h++){var i=f[h],j=i.indexOf("=");if(!(j<0)){var k=i.substr(0,j).trim(),l=i.substr(++j,i.length).trim();'"'==l[0]&&(l=l.slice(1,-1)),void 0==e[k]&&(e[k]=function(a,b){try{return b(a)}catch(b){return a}}(l,g))}}return e},f.serialize=function(a,b,d){var f=d||{},g=f.encode||c;if("function"!=typeof g)throw TypeError("option encode is invalid");if(!e.test(a))throw TypeError("argument name is invalid");var h=g(b);if(h&&!e.test(h))throw TypeError("argument val is invalid");var i=a+"="+h;if(null!=f.maxAge){var j=f.maxAge-0;if(isNaN(j)||!isFinite(j))throw TypeError("option maxAge is invalid");i+="; Max-Age="+Math.floor(j)}if(f.domain){if(!e.test(f.domain))throw TypeError("option domain is invalid");i+="; Domain="+f.domain}if(f.path){if(!e.test(f.path))throw TypeError("option path is invalid");i+="; Path="+f.path}if(f.expires){if("function"!=typeof f.expires.toUTCString)throw TypeError("option expires is invalid");i+="; Expires="+f.expires.toUTCString()}if(f.httpOnly&&(i+="; HttpOnly"),f.secure&&(i+="; Secure"),f.sameSite)switch("string"==typeof f.sameSite?f.sameSite.toLowerCase():f.sameSite){case!0:case"strict":i+="; SameSite=Strict";break;case"lax":i+="; SameSite=Lax";break;case"none":i+="; SameSite=None";break;default:throw TypeError("option sameSite is invalid")}return i},a=decodeURIComponent,c=encodeURIComponent,d=/; */,e=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,b.exports=f})()},20635,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/action-async-storage.external.js",()=>require("next/dist/server/app-render/action-async-storage.external.js"))},43285,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/dynamic-access-async-storage.external.js",()=>require("next/dist/server/app-render/dynamic-access-async-storage.external.js"))},
|
|
1
|
+
module.exports=[20460,(a,b,c)=>{(()=>{"use strict";"u">typeof __nccwpck_require__&&(__nccwpck_require__.ab="/ROOT/node_modules/next/dist/compiled/cookie/");var a,c,d,e,f={};f.parse=function(b,c){if("string"!=typeof b)throw TypeError("argument str must be a string");for(var e={},f=b.split(d),g=(c||{}).decode||a,h=0;h<f.length;h++){var i=f[h],j=i.indexOf("=");if(!(j<0)){var k=i.substr(0,j).trim(),l=i.substr(++j,i.length).trim();'"'==l[0]&&(l=l.slice(1,-1)),void 0==e[k]&&(e[k]=function(a,b){try{return b(a)}catch(b){return a}}(l,g))}}return e},f.serialize=function(a,b,d){var f=d||{},g=f.encode||c;if("function"!=typeof g)throw TypeError("option encode is invalid");if(!e.test(a))throw TypeError("argument name is invalid");var h=g(b);if(h&&!e.test(h))throw TypeError("argument val is invalid");var i=a+"="+h;if(null!=f.maxAge){var j=f.maxAge-0;if(isNaN(j)||!isFinite(j))throw TypeError("option maxAge is invalid");i+="; Max-Age="+Math.floor(j)}if(f.domain){if(!e.test(f.domain))throw TypeError("option domain is invalid");i+="; Domain="+f.domain}if(f.path){if(!e.test(f.path))throw TypeError("option path is invalid");i+="; Path="+f.path}if(f.expires){if("function"!=typeof f.expires.toUTCString)throw TypeError("option expires is invalid");i+="; Expires="+f.expires.toUTCString()}if(f.httpOnly&&(i+="; HttpOnly"),f.secure&&(i+="; Secure"),f.sameSite)switch("string"==typeof f.sameSite?f.sameSite.toLowerCase():f.sameSite){case!0:case"strict":i+="; SameSite=Strict";break;case"lax":i+="; SameSite=Lax";break;case"none":i+="; SameSite=None";break;default:throw TypeError("option sameSite is invalid")}return i},a=decodeURIComponent,c=encodeURIComponent,d=/; */,e=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,b.exports=f})()},20635,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/action-async-storage.external.js",()=>require("next/dist/server/app-render/action-async-storage.external.js"))},43285,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/dynamic-access-async-storage.external.js",()=>require("next/dist/server/app-render/dynamic-access-async-storage.external.js"))},70406,(a,b,c)=>{b.exports=a.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},18622,(a,b,c)=>{b.exports=a.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(a,b,c)=>{b.exports=a.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},14747,(a,b,c)=>{b.exports=a.x("path",()=>require("path"))},24361,(a,b,c)=>{b.exports=a.x("util",()=>require("util"))},24951,(a,b,c)=>{"use strict";b.exports=a.r(18622)},11857,(a,b,c)=>{"use strict";b.exports=a.r(24951).vendored["react-rsc"].ReactServerDOMTurbopackServer},7997,(a,b,c)=>{"use strict";b.exports=a.r(24951).vendored["react-rsc"].ReactJsxRuntime},717,(a,b,c)=>{"use strict";b.exports=a.r(24951).vendored["react-rsc"].React},4276,(a,b,c)=>{let{createClientModuleProxy:d}=a.r(11857);a.n(d("[project]/node_modules/next/dist/client/components/builtin/global-error.js <module evaluation>"))},82509,(a,b,c)=>{let{createClientModuleProxy:d}=a.r(11857);a.n(d("[project]/node_modules/next/dist/client/components/builtin/global-error.js"))},66114,a=>{"use strict";a.i(4276);var b=a.i(82509);a.n(b)}];
|
|
2
2
|
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__35dc6469._.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[57891,a=>{"use strict";var b=a.i(37359);a.s([],24481),a.i(24481),a.s(["
|
|
1
|
+
module.exports=[57891,a=>{"use strict";var b=a.i(37359);a.s([],24481),a.i(24481),a.s(["002628302974b1d9d0c05eefc202ccbb2efcc2cbe0",()=>b.listCredentials,"003561691afb672a539b4c94ff1a37b71e49c9afb7",()=>b.listAgentApiCredentials,"400c4b96511a4d2c3511e7666d5ef557e65f4d7dee",()=>b.saveGitHubCredential,"4049bac91fd5c044e275d0eb097e55ba4b66b01242",()=>b.removeAgentApiCredential,"4058c5e187754f0abe1e61ffa924a1d03253df8797",()=>b.removeCredential,"6069a71e57100a15e5efc93b245c1b0a4e2c5e5df9",()=>b.saveGitLabCredential,"705f45058d29a347e1fae0fe711c60a922bded3683",()=>b.saveAgentApiCredential],57891)},45581,a=>{a.v(b=>Promise.all(["server/chunks/ssr/[externals]_keytar_23140f5c._.js"].map(b=>a.l(b))).then(()=>b(83034)))}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=%5Broot-of-the-server%5D__46af1502._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../.next-internal/server/app/credentials/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["export {listAgentApiCredentials as '
|
|
1
|
+
{"version":3,"sources":["../../../../.next-internal/server/app/credentials/page/actions.js%20%28server%20actions%20loader%29"],"sourcesContent":["export {listAgentApiCredentials as '003561691afb672a539b4c94ff1a37b71e49c9afb7'} from 'ACTIONS_MODULE0'\nexport {listCredentials as '002628302974b1d9d0c05eefc202ccbb2efcc2cbe0'} from 'ACTIONS_MODULE0'\nexport {removeAgentApiCredential as '4049bac91fd5c044e275d0eb097e55ba4b66b01242'} from 'ACTIONS_MODULE0'\nexport {removeCredential as '4058c5e187754f0abe1e61ffa924a1d03253df8797'} from 'ACTIONS_MODULE0'\nexport {saveAgentApiCredential as '705f45058d29a347e1fae0fe711c60a922bded3683'} from 'ACTIONS_MODULE0'\nexport {saveGitHubCredential as '400c4b96511a4d2c3511e7666d5ef557e65f4d7dee'} from 'ACTIONS_MODULE0'\nexport {saveGitLabCredential as '6069a71e57100a15e5efc93b245c1b0a4e2c5e5df9'} from 'ACTIONS_MODULE0'\n"],"names":[],"mappings":"uCAAA,IAAA,EAAA,EAAA,CAAA,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module.exports=[37936,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"registerServerReference",{enumerable:!0,get:function(){return d.registerServerReference}});let d=a.r(11857)},13095,(a,b,c)=>{"use strict";function d(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
|
|
2
|
-
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},66085,a=>{"use strict";var b=a.i(24868),c=a.i(46786),d=a.i(14747);let e="viba-agent-api-credentials",f=["codex"],g=null,h=null,i=!1;function j(a){return f.includes(a)}function k(){return h?`Secure credential storage is unavailable: ${h}`:"Secure credential storage is unavailable in this runtime."}async function l(){return g||(g=a.A(45581).then(a=>a.default??a).catch(a=>(h=a instanceof Error?a.message:String(a),i||(i=!0,console.warn(`[agent-api-credentials] ${k()}`)),null))),g}async function m(){let a=await l();if(!a)throw Error(k());return a}function n(a){return`agent-api-${a}`}function o(a){return a.keytarAccount||n(a.agent)}function p(a){return{agent:a.agent,apiProxy:a.apiProxy,createdAt:a.createdAt,updatedAt:a.updatedAt}}function q(a){return!!a&&"object"==typeof a&&"string"==typeof a.agent&&!!j(a.agent)&&"string"==typeof a.createdAt&&"string"==typeof a.updatedAt&&(void 0===a.apiProxy||"string"==typeof a.apiProxy)&&(void 0===a.keytarAccount||"string"==typeof a.keytarAccount)}async function r(){let a=d.default.join(c.default.homedir(),".viba");return await b.default.mkdir(a,{recursive:!0}),d.default.join(a,"agent-api-configs.json")}async function s(a){let c=await r();await b.default.writeFile(c,JSON.stringify(a,null,2),"utf-8")}async function t(){let a=await r();try{let c=await b.default.readFile(a,"utf-8"),d=JSON.parse(c);if(Array.isArray(d))return d.filter(q);if(!d||"object"!=typeof d)return[];let e=Object.entries(d).filter(([a])=>j(a)).map(([a,b])=>b&&"object"==typeof b?void 0===b.agent?{...b,agent:a}:b:null).filter(q);return e.length>0&&await s(e),e}catch(a){if(a?.code==="ENOENT")return[];return console.error("Failed to parse agent API credential metadata:",a),[]}}async function u(){return(await t()).map(p).sort((a,b)=>b.updatedAt.localeCompare(a.updatedAt))}async function v(a,b,c){let d,f;if(!j(a))return{success:!1,error:`Unsupported agent: ${a}`};let g=b.trim();if(!g)return{success:!1,error:"API key is required."};try{d=function(a){let b=a.trim();if(b){try{new URL(b)}catch{throw Error("API proxy must be a valid URL.")}return b}}(c)}catch(a){return{success:!1,error:a.message}}try{f=await m()}catch(a){return{success:!1,error:a.message}}let h=await t(),i=new Date().toISOString(),k=h.findIndex(b=>b.agent===a),l=k>=0?o(h[k]):n(a);if(await f.setPassword(e,l,g),k>=0){let a=h[k];h[k]={...a,apiProxy:d,updatedAt:i,keytarAccount:l}}else h.push({agent:a,apiProxy:d,createdAt:i,updatedAt:i,keytarAccount:l});await s(h);let q=h.find(b=>b.agent===a);return q?{success:!0,credential:p(q)}:{success:!1,error:"Failed to persist agent API credential."}}async function w(a){if(!j(a))return{success:!1,error:`Unsupported agent: ${a}`};let b=await t(),c=b.findIndex(b=>b.agent===a);if(-1===c)return{success:!1,error:"Agent API credential not found."};let[d]=b.splice(c,1);await s(b);let f=await l();return f&&await f.deletePassword(e,o(d)),{success:!0}}async function x(a){if(!j(a))return null;let b=(await t()).find(b=>b.agent===a);if(!b)return null;let c=await l();if(!c)return null;let d=await c.getPassword(e,o(b));return d?{agent:b.agent,apiKey:d,apiProxy:b.apiProxy}:null}a.s(["createOrUpdateAgentApiCredential",()=>v,"deleteAgentApiCredential",()=>w,"getAgentApiCredentialSecret",()=>x,"getAllAgentApiCredentials",()=>u])},70798,a=>{"use strict";var b=a.i(24868),c=a.i(46786),d=a.i(14747);let e="viba-git-credentials",f=null,g=null,h=!1;function i(){return g?`Secure credential storage is unavailable: ${g}`:"Secure credential storage is unavailable in this runtime."}async function j(){return f||(f=a.A(45581).then(a=>a.default??a).catch(a=>(g=a instanceof Error?a.message:String(a),h||(h=!0,console.warn(`[credentials] ${i()}`)),null))),f}async function k(){let a=await j();if(!a)throw Error(i());return a}function l(){return`${Date.now()}-${Math.random().toString(36).slice(2,9)}`}function m(a){return a.trim().replace(/\/$/,"")}function n(a){return`credential-${a}`}function o(a){return`credential-${a}`}function p(a){return a.keytarAccount||n(a.id)}function q(a){return"gitlab"===a.type?{id:a.id,type:"gitlab",username:a.username,serverUrl:a.serverUrl||"https://gitlab.com",createdAt:a.createdAt,updatedAt:a.updatedAt}:{id:a.id,type:"github",username:a.username,createdAt:a.createdAt,updatedAt:a.updatedAt}}async function r(){let a=d.default.join(c.default.homedir(),".viba");return await b.default.mkdir(a,{recursive:!0}),d.default.join(a,"credentials.json")}function s(a,b){return!!a&&"object"==typeof a&&a.type===b&&"string"==typeof a.username&&"string"==typeof a.createdAt&&"string"==typeof a.updatedAt&&("gitlab"!==b||"string"==typeof a.serverUrl)}function t(a){return!!a&&"object"==typeof a&&"string"==typeof a.id&&!!a.id.trim()&&("github"===a.type||"gitlab"===a.type)&&"string"==typeof a.username&&"string"==typeof a.createdAt&&"string"==typeof a.updatedAt&&(void 0===a.keytarAccount||"string"==typeof a.keytarAccount)&&("gitlab"!==a.type||"string"==typeof a.serverUrl)}async function u(a){let c=await r();await b.default.writeFile(c,JSON.stringify(a,null,2),"utf-8")}async function v(){let a=await r();try{let c=await b.default.readFile(a,"utf-8"),d=JSON.parse(c);if(Array.isArray(d))return d.filter(t);if(!d||"object"!=typeof d)return[];let e=[];if(s(d.github,"github")){let a=d.github;e.push({id:l(),type:"github",username:a.username,createdAt:a.createdAt,updatedAt:a.updatedAt,keytarAccount:o("github")})}if(s(d.gitlab,"gitlab")){let a=d.gitlab;e.push({id:l(),type:"gitlab",username:a.username,serverUrl:a.serverUrl,createdAt:a.createdAt,updatedAt:a.updatedAt,keytarAccount:o("gitlab")})}return e.length>0&&await u(e),e}catch(a){if(a?.code==="ENOENT")return[];return console.error("Failed to parse credentials metadata:",a),[]}}async function w(){return(await v()).map(q).sort((a,b)=>b.updatedAt.localeCompare(a.updatedAt))}async function x(a){let b=(await v()).find(b=>b.id===a);return b?q(b):null}async function y(a){let b=(await v()).find(b=>b.id===a);if(!b)return null;let c=await j();return c?c.getPassword(e,p(b)):null}async function z(a){try{let b=await fetch("https://api.github.com/user",{headers:{Authorization:`Bearer ${a}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"}});if(!b.ok){if(401===b.status)return{valid:!1,error:"Invalid or expired GitHub token."};return{valid:!1,error:`GitHub API returned ${b.status}.`}}let c=await b.json(),d="string"==typeof c?.login?c.login:null;if(!d)return{valid:!1,error:"GitHub API response did not include a username."};return{valid:!0,username:d}}catch(a){return{valid:!1,error:`Failed to verify GitHub token: ${a.message}`}}}async function A(a,b){try{let c=m(a),d=await fetch(`${c}/api/v4/user`,{headers:{"PRIVATE-TOKEN":b}});if(!d.ok){if(401===d.status)return{valid:!1,error:"Invalid or expired GitLab token."};return{valid:!1,error:`GitLab API returned ${d.status}.`}}let e=await d.json(),f="string"==typeof e?.username?e.username:null;if(!f)return{valid:!1,error:"GitLab API response did not include a username."};return{valid:!0,username:f}}catch(a){return{valid:!1,error:`Failed to verify GitLab token: ${a.message}`}}}async function B(a){let b,c=a.trim();if(!c)return{success:!1,error:"GitHub token is required."};try{b=await k()}catch(a){return{success:!1,error:a.message}}let d=await z(c);if(!d.valid||!d.username)return{success:!1,error:d.error||"Failed to verify GitHub token."};let f=await v();if(f.find(a=>"github"===a.type&&a.username===d.username))return{success:!1,error:`A GitHub credential for ${d.username} already exists.`};let g=l(),h=new Date().toISOString(),i=n(g);await b.setPassword(e,i,c);let j={id:g,type:"github",username:d.username,createdAt:h,updatedAt:h,keytarAccount:i};return f.push(j),await u(f),{success:!0,credential:{id:j.id,type:"github",username:j.username,createdAt:j.createdAt,updatedAt:j.updatedAt}}}async function C(a,b){let c,d=m(a),f=b.trim();if(!d)return{success:!1,error:"GitLab server URL is required."};try{new URL(d)}catch{return{success:!1,error:"GitLab server URL must be a valid URL."}}if(!f)return{success:!1,error:"GitLab token is required."};try{c=await k()}catch(a){return{success:!1,error:a.message}}let g=await A(d,f);if(!g.valid||!g.username)return{success:!1,error:g.error||"Failed to verify GitLab token."};let h=await v();if(h.find(a=>"gitlab"===a.type&&a.username===g.username&&a.serverUrl===d))return{success:!1,error:`A GitLab credential for ${g.username} on ${d} already exists.`};let i=l(),j=new Date().toISOString(),o=n(i);await c.setPassword(e,o,f);let p={id:i,type:"gitlab",username:g.username,serverUrl:d,createdAt:j,updatedAt:j,keytarAccount:o};return h.push(p),await u(h),{success:!0,credential:{id:p.id,type:"gitlab",username:p.username,serverUrl:p.serverUrl||d,createdAt:p.createdAt,updatedAt:p.updatedAt}}}async function D(a){let b=await v(),c=b.findIndex(b=>b.id===a);if(-1===c)return{success:!1,error:"Credential not found."};let d=b[c];b.splice(c,1),await u(b);let f=await j();return f&&await f.deletePassword(e,p(d)),{success:!0}}a.s(["createGitHubCredential",()=>B,"createGitLabCredential",()=>C,"deleteCredential",()=>D,"getAllCredentials",()=>w,"getCredentialById",()=>x,"getCredentialToken",()=>y])},37359,a=>{"use strict";var b=a.i(37936),c=a.i(70798),d=a.i(66085);async function e(){try{let a=await (0,c.getAllCredentials)();return{success:!0,credentials:a}}catch(a){return console.error("Failed to list credentials:",a),{success:!1,error:"Failed to load credentials."}}}async function f(a){let b=await (0,c.createGitHubCredential)(a);return b.success&&b.credential?{success:!0,credential:b.credential}:{success:!1,error:b.error||"Failed to save GitHub credential."}}async function g(a,b){let d=await (0,c.createGitLabCredential)(a,b);return d.success&&d.credential?{success:!0,credential:d.credential}:{success:!1,error:d.error||"Failed to save GitLab credential."}}async function h(){try{let a=await (0,d.getAllAgentApiCredentials)();return{success:!0,credentials:a}}catch(a){return console.error("Failed to list agent API credentials:",a),{success:!1,error:"Failed to load agent API credentials."}}}async function i(a,b,c){let e=await (0,d.createOrUpdateAgentApiCredential)(a,b,c);return e.success&&e.credential?{success:!0,credential:e.credential}:{success:!1,error:e.error||"Failed to save agent API credential."}}async function j(a){try{let b=await (0,c.deleteCredential)(a);if(!b.success)return{success:!1,error:b.error||"Failed to remove credential."};return{success:!0}}catch(a){return console.error("Failed to remove credential:",a),{success:!1,error:"Failed to remove credential."}}}async function k(a){try{let b=await (0,d.deleteAgentApiCredential)(a);if(!b.success)return{success:!1,error:b.error||"Failed to remove agent API credential."};return{success:!0}}catch(a){return console.error("Failed to remove agent API credential:",a),{success:!1,error:"Failed to remove agent API credential."}}}(0,a.i(13095).ensureServerEntryExports)([e,f,g,h,i,j,k]),(0,b.registerServerReference)(e,"0024cd8264923ac29ca23ec9b72eb8f41d4e4f5b3c",null),(0,b.registerServerReference)(f,"4051c0a28158f8a13e906979f4ce747a6742aec465",null),(0,b.registerServerReference)(g,"60a5c56e15d312abf810cd94da5c0d1ee2319b6d57",null),(0,b.registerServerReference)(h,"001b884a80812d1f61dbae458988c02181906ec73c",null),(0,b.registerServerReference)(i,"702c26c6b9bfd4c586d26c0ecfa3f8f7b5f4fe8e0e",null),(0,b.registerServerReference)(j,"4091a8490f9bd089a13eb2593806dc5116ab4cd96f",null),(0,b.registerServerReference)(k,"40011c9b66bdc21f5472590decf1be3cc9562cd1c5",null),a.s(["listAgentApiCredentials",()=>h,"listCredentials",()=>e,"removeAgentApiCredential",()=>k,"removeCredential",()=>j,"saveAgentApiCredential",()=>i,"saveGitHubCredential",()=>f,"saveGitLabCredential",()=>g])}];
|
|
1
|
+
module.exports=[24868,(a,b,c)=>{b.exports=a.x("fs/promises",()=>require("fs/promises"))},37936,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"registerServerReference",{enumerable:!0,get:function(){return d.registerServerReference}});let d=a.r(11857)},13095,(a,b,c)=>{"use strict";function d(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
|
|
2
|
+
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},66085,a=>{"use strict";var b=a.i(24868),c=a.i(46786),d=a.i(14747);let e="viba-agent-api-credentials",f=["codex"],g=null,h=null,i=!1;function j(a){return f.includes(a)}function k(){return h?`Secure credential storage is unavailable: ${h}`:"Secure credential storage is unavailable in this runtime."}async function l(){return g||(g=a.A(45581).then(a=>a.default??a).catch(a=>(h=a instanceof Error?a.message:String(a),i||(i=!0,console.warn(`[agent-api-credentials] ${k()}`)),null))),g}async function m(){let a=await l();if(!a)throw Error(k());return a}function n(a){return`agent-api-${a}`}function o(a){return a.keytarAccount||n(a.agent)}function p(a){return{agent:a.agent,apiProxy:a.apiProxy,createdAt:a.createdAt,updatedAt:a.updatedAt}}function q(a){return!!a&&"object"==typeof a&&"string"==typeof a.agent&&!!j(a.agent)&&"string"==typeof a.createdAt&&"string"==typeof a.updatedAt&&(void 0===a.apiProxy||"string"==typeof a.apiProxy)&&(void 0===a.keytarAccount||"string"==typeof a.keytarAccount)}async function r(){let a=d.default.join(c.default.homedir(),".viba");return await b.default.mkdir(a,{recursive:!0}),d.default.join(a,"agent-api-configs.json")}async function s(a){let c=await r();await b.default.writeFile(c,JSON.stringify(a,null,2),"utf-8")}async function t(){let a=await r();try{let c=await b.default.readFile(a,"utf-8"),d=JSON.parse(c);if(Array.isArray(d))return d.filter(q);if(!d||"object"!=typeof d)return[];let e=Object.entries(d).filter(([a])=>j(a)).map(([a,b])=>b&&"object"==typeof b?void 0===b.agent?{...b,agent:a}:b:null).filter(q);return e.length>0&&await s(e),e}catch(a){if(a?.code==="ENOENT")return[];return console.error("Failed to parse agent API credential metadata:",a),[]}}async function u(){return(await t()).map(p).sort((a,b)=>b.updatedAt.localeCompare(a.updatedAt))}async function v(a,b,c){let d,f;if(!j(a))return{success:!1,error:`Unsupported agent: ${a}`};let g=b.trim();if(!g)return{success:!1,error:"API key is required."};try{d=function(a){let b=a.trim();if(b){try{new URL(b)}catch{throw Error("API proxy must be a valid URL.")}return b}}(c)}catch(a){return{success:!1,error:a.message}}try{f=await m()}catch(a){return{success:!1,error:a.message}}let h=await t(),i=new Date().toISOString(),k=h.findIndex(b=>b.agent===a),l=k>=0?o(h[k]):n(a);if(await f.setPassword(e,l,g),k>=0){let a=h[k];h[k]={...a,apiProxy:d,updatedAt:i,keytarAccount:l}}else h.push({agent:a,apiProxy:d,createdAt:i,updatedAt:i,keytarAccount:l});await s(h);let q=h.find(b=>b.agent===a);return q?{success:!0,credential:p(q)}:{success:!1,error:"Failed to persist agent API credential."}}async function w(a){if(!j(a))return{success:!1,error:`Unsupported agent: ${a}`};let b=await t(),c=b.findIndex(b=>b.agent===a);if(-1===c)return{success:!1,error:"Agent API credential not found."};let[d]=b.splice(c,1);await s(b);let f=await l();return f&&await f.deletePassword(e,o(d)),{success:!0}}async function x(a){if(!j(a))return null;let b=(await t()).find(b=>b.agent===a);if(!b)return null;let c=await l();if(!c)return null;let d=await c.getPassword(e,o(b));return d?{agent:b.agent,apiKey:d,apiProxy:b.apiProxy}:null}a.s(["createOrUpdateAgentApiCredential",()=>v,"deleteAgentApiCredential",()=>w,"getAgentApiCredentialSecret",()=>x,"getAllAgentApiCredentials",()=>u])},70798,a=>{"use strict";var b=a.i(24868),c=a.i(46786),d=a.i(14747);let e="viba-git-credentials",f=null,g=null,h=!1;function i(){return g?`Secure credential storage is unavailable: ${g}`:"Secure credential storage is unavailable in this runtime."}async function j(){return f||(f=a.A(45581).then(a=>a.default??a).catch(a=>(g=a instanceof Error?a.message:String(a),h||(h=!0,console.warn(`[credentials] ${i()}`)),null))),f}async function k(){let a=await j();if(!a)throw Error(i());return a}function l(){return`${Date.now()}-${Math.random().toString(36).slice(2,9)}`}function m(a){return a.trim().replace(/\/$/,"")}function n(a){return`credential-${a}`}function o(a){return`credential-${a}`}function p(a){return a.keytarAccount||n(a.id)}function q(a){return"gitlab"===a.type?{id:a.id,type:"gitlab",username:a.username,serverUrl:a.serverUrl||"https://gitlab.com",createdAt:a.createdAt,updatedAt:a.updatedAt}:{id:a.id,type:"github",username:a.username,createdAt:a.createdAt,updatedAt:a.updatedAt}}async function r(){let a=d.default.join(c.default.homedir(),".viba");return await b.default.mkdir(a,{recursive:!0}),d.default.join(a,"credentials.json")}function s(a,b){return!!a&&"object"==typeof a&&a.type===b&&"string"==typeof a.username&&"string"==typeof a.createdAt&&"string"==typeof a.updatedAt&&("gitlab"!==b||"string"==typeof a.serverUrl)}function t(a){return!!a&&"object"==typeof a&&"string"==typeof a.id&&!!a.id.trim()&&("github"===a.type||"gitlab"===a.type)&&"string"==typeof a.username&&"string"==typeof a.createdAt&&"string"==typeof a.updatedAt&&(void 0===a.keytarAccount||"string"==typeof a.keytarAccount)&&("gitlab"!==a.type||"string"==typeof a.serverUrl)}async function u(a){let c=await r();await b.default.writeFile(c,JSON.stringify(a,null,2),"utf-8")}async function v(){let a=await r();try{let c=await b.default.readFile(a,"utf-8"),d=JSON.parse(c);if(Array.isArray(d))return d.filter(t);if(!d||"object"!=typeof d)return[];let e=[];if(s(d.github,"github")){let a=d.github;e.push({id:l(),type:"github",username:a.username,createdAt:a.createdAt,updatedAt:a.updatedAt,keytarAccount:o("github")})}if(s(d.gitlab,"gitlab")){let a=d.gitlab;e.push({id:l(),type:"gitlab",username:a.username,serverUrl:a.serverUrl,createdAt:a.createdAt,updatedAt:a.updatedAt,keytarAccount:o("gitlab")})}return e.length>0&&await u(e),e}catch(a){if(a?.code==="ENOENT")return[];return console.error("Failed to parse credentials metadata:",a),[]}}async function w(){return(await v()).map(q).sort((a,b)=>b.updatedAt.localeCompare(a.updatedAt))}async function x(a){let b=(await v()).find(b=>b.id===a);return b?q(b):null}async function y(a){let b=(await v()).find(b=>b.id===a);if(!b)return null;let c=await j();return c?c.getPassword(e,p(b)):null}async function z(a){try{let b=await fetch("https://api.github.com/user",{headers:{Authorization:`Bearer ${a}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"}});if(!b.ok){if(401===b.status)return{valid:!1,error:"Invalid or expired GitHub token."};return{valid:!1,error:`GitHub API returned ${b.status}.`}}let c=await b.json(),d="string"==typeof c?.login?c.login:null;if(!d)return{valid:!1,error:"GitHub API response did not include a username."};return{valid:!0,username:d}}catch(a){return{valid:!1,error:`Failed to verify GitHub token: ${a.message}`}}}async function A(a,b){try{let c=m(a),d=await fetch(`${c}/api/v4/user`,{headers:{"PRIVATE-TOKEN":b}});if(!d.ok){if(401===d.status)return{valid:!1,error:"Invalid or expired GitLab token."};return{valid:!1,error:`GitLab API returned ${d.status}.`}}let e=await d.json(),f="string"==typeof e?.username?e.username:null;if(!f)return{valid:!1,error:"GitLab API response did not include a username."};return{valid:!0,username:f}}catch(a){return{valid:!1,error:`Failed to verify GitLab token: ${a.message}`}}}async function B(a){let b,c=a.trim();if(!c)return{success:!1,error:"GitHub token is required."};try{b=await k()}catch(a){return{success:!1,error:a.message}}let d=await z(c);if(!d.valid||!d.username)return{success:!1,error:d.error||"Failed to verify GitHub token."};let f=await v();if(f.find(a=>"github"===a.type&&a.username===d.username))return{success:!1,error:`A GitHub credential for ${d.username} already exists.`};let g=l(),h=new Date().toISOString(),i=n(g);await b.setPassword(e,i,c);let j={id:g,type:"github",username:d.username,createdAt:h,updatedAt:h,keytarAccount:i};return f.push(j),await u(f),{success:!0,credential:{id:j.id,type:"github",username:j.username,createdAt:j.createdAt,updatedAt:j.updatedAt}}}async function C(a,b){let c,d=m(a),f=b.trim();if(!d)return{success:!1,error:"GitLab server URL is required."};try{new URL(d)}catch{return{success:!1,error:"GitLab server URL must be a valid URL."}}if(!f)return{success:!1,error:"GitLab token is required."};try{c=await k()}catch(a){return{success:!1,error:a.message}}let g=await A(d,f);if(!g.valid||!g.username)return{success:!1,error:g.error||"Failed to verify GitLab token."};let h=await v();if(h.find(a=>"gitlab"===a.type&&a.username===g.username&&a.serverUrl===d))return{success:!1,error:`A GitLab credential for ${g.username} on ${d} already exists.`};let i=l(),j=new Date().toISOString(),o=n(i);await c.setPassword(e,o,f);let p={id:i,type:"gitlab",username:g.username,serverUrl:d,createdAt:j,updatedAt:j,keytarAccount:o};return h.push(p),await u(h),{success:!0,credential:{id:p.id,type:"gitlab",username:p.username,serverUrl:p.serverUrl||d,createdAt:p.createdAt,updatedAt:p.updatedAt}}}async function D(a){let b=await v(),c=b.findIndex(b=>b.id===a);if(-1===c)return{success:!1,error:"Credential not found."};let d=b[c];b.splice(c,1),await u(b);let f=await j();return f&&await f.deletePassword(e,p(d)),{success:!0}}a.s(["createGitHubCredential",()=>B,"createGitLabCredential",()=>C,"deleteCredential",()=>D,"getAllCredentials",()=>w,"getCredentialById",()=>x,"getCredentialToken",()=>y])},37359,a=>{"use strict";var b=a.i(37936),c=a.i(70798),d=a.i(66085);async function e(){try{let a=await (0,c.getAllCredentials)();return{success:!0,credentials:a}}catch(a){return console.error("Failed to list credentials:",a),{success:!1,error:"Failed to load credentials."}}}async function f(a){let b=await (0,c.createGitHubCredential)(a);return b.success&&b.credential?{success:!0,credential:b.credential}:{success:!1,error:b.error||"Failed to save GitHub credential."}}async function g(a,b){let d=await (0,c.createGitLabCredential)(a,b);return d.success&&d.credential?{success:!0,credential:d.credential}:{success:!1,error:d.error||"Failed to save GitLab credential."}}async function h(){try{let a=await (0,d.getAllAgentApiCredentials)();return{success:!0,credentials:a}}catch(a){return console.error("Failed to list agent API credentials:",a),{success:!1,error:"Failed to load agent API credentials."}}}async function i(a,b,c){let e=await (0,d.createOrUpdateAgentApiCredential)(a,b,c);return e.success&&e.credential?{success:!0,credential:e.credential}:{success:!1,error:e.error||"Failed to save agent API credential."}}async function j(a){try{let b=await (0,c.deleteCredential)(a);if(!b.success)return{success:!1,error:b.error||"Failed to remove credential."};return{success:!0}}catch(a){return console.error("Failed to remove credential:",a),{success:!1,error:"Failed to remove credential."}}}async function k(a){try{let b=await (0,d.deleteAgentApiCredential)(a);if(!b.success)return{success:!1,error:b.error||"Failed to remove agent API credential."};return{success:!0}}catch(a){return console.error("Failed to remove agent API credential:",a),{success:!1,error:"Failed to remove agent API credential."}}}(0,a.i(13095).ensureServerEntryExports)([e,f,g,h,i,j,k]),(0,b.registerServerReference)(e,"002628302974b1d9d0c05eefc202ccbb2efcc2cbe0",null),(0,b.registerServerReference)(f,"400c4b96511a4d2c3511e7666d5ef557e65f4d7dee",null),(0,b.registerServerReference)(g,"6069a71e57100a15e5efc93b245c1b0a4e2c5e5df9",null),(0,b.registerServerReference)(h,"003561691afb672a539b4c94ff1a37b71e49c9afb7",null),(0,b.registerServerReference)(i,"705f45058d29a347e1fae0fe711c60a922bded3683",null),(0,b.registerServerReference)(j,"4058c5e187754f0abe1e61ffa924a1d03253df8797",null),(0,b.registerServerReference)(k,"4049bac91fd5c044e275d0eb097e55ba4b66b01242",null),a.s(["listAgentApiCredentials",()=>h,"listCredentials",()=>e,"removeAgentApiCredential",()=>k,"removeCredential",()=>j,"saveAgentApiCredential",()=>i,"saveGitHubCredential",()=>f,"saveGitLabCredential",()=>g])}];
|
|
3
3
|
|
|
4
|
-
//# sourceMappingURL
|
|
4
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__4928d640._.js.map
|