commandmate 0.3.5 → 0.4.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/app-build-manifest.json +19 -23
- package/.next/app-path-routes-manifest.json +1 -1
- package/.next/build-manifest.json +5 -5
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/config.json +3 -3
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/1.pack +0 -0
- package/.next/cache/webpack/client-production/2.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +1 -1
- package/.next/react-loadable-manifest.json +69 -55
- package/.next/required-server-files.json +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/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/route.js +8 -8
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -2
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/login/page.js +1 -1
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- 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/proxy/[...path]/route.js +4 -4
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +6 -6
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +2 -4
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +8 -8
- package/.next/server/chunks/{3294.js → 1628.js} +3 -3
- package/.next/server/chunks/185.js +36 -0
- package/.next/server/chunks/3860.js +1 -1
- package/.next/server/chunks/4893.js +2 -2
- package/.next/server/chunks/4952.js +1 -1
- package/.next/server/chunks/5488.js +6 -6
- package/.next/server/chunks/7425.js +34 -31
- package/.next/server/chunks/7566.js +2 -2
- package/.next/server/chunks/8199.js +1 -0
- package/.next/server/chunks/8585.js +1 -1
- package/.next/server/chunks/8693.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/12-00c528d46a0a0a1d.js +1 -0
- package/.next/static/chunks/{13.feeafc7cc620f8c4.js → 13.b9521543496f4468.js} +1 -1
- package/.next/static/chunks/1334.bfedf44ee9fe2761.js +1 -0
- package/.next/static/chunks/143.eb6b4671490cd223.js +1 -0
- package/.next/static/chunks/{3574.7a94c27e6a496a56.js → 1442.74b5f4de9a4b4e1b.js} +1 -1
- package/.next/static/chunks/2083-b5bed0c77cc53281.js +1 -0
- package/.next/static/chunks/2725.eb2d236c8030711c.js +1 -0
- package/.next/static/chunks/3398-3d40a17387bd554b.js +1 -0
- package/.next/static/chunks/3516.3c576047408cae6b.js +1 -0
- package/.next/static/chunks/3559.422c6ca760b85750.js +1 -0
- package/.next/static/chunks/3956.52c5b9a0071a641d.js +1 -0
- package/.next/static/chunks/4012.32b576a4fa621774.js +1 -0
- package/.next/static/chunks/4212.e7ba1009bc1da62d.js +131 -0
- package/.next/static/chunks/4303.caf91e86105d5e70.js +1 -0
- package/.next/static/chunks/4327.4dcda9b6fab6a385.js +82 -0
- package/.next/static/chunks/4671.d86d21d0dfdace41.js +1 -0
- package/.next/static/chunks/5518.ec88dcb5a27b17fe.js +1 -0
- package/.next/static/chunks/6434.08d262283371d333.js +1 -0
- package/.next/static/chunks/{656.5e2de0173f5a06bd.js → 656.dc26b973d07d9627.js} +5 -5
- package/.next/static/chunks/7119.01777af21b55740c.js +1 -0
- package/.next/static/chunks/7293.fb88bb102af4aa04.js +1 -0
- package/.next/static/chunks/8913-40625650292eb3d0.js +1 -0
- package/.next/static/chunks/8977.fc18b8260cd8bc1f.js +1 -0
- package/.next/static/chunks/9552.d959149efd41e84b.js +1 -0
- package/.next/static/chunks/app/layout-7198a7a49aa21a97.js +1 -0
- package/.next/static/chunks/app/page-7498cf75e69d9227.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-0599f64a8e80d255.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-94ad7a1ce1f0c440.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-175b618c047bc992.js +1 -0
- package/.next/static/chunks/d3ac728e.daf595a898e9b720.js +1 -0
- package/.next/static/chunks/webpack-f7111aab807d73b9.js +1 -0
- package/.next/static/css/f7dc01350168df01.css +3 -0
- package/.next/trace +5 -5
- package/README.md +66 -56
- package/dist/server/server.js +5 -0
- package/dist/server/src/lib/auto-yes-manager.js +58 -18
- package/dist/server/src/lib/claude-session.js +9 -3
- package/dist/server/src/lib/cli-session.js +60 -10
- package/dist/server/src/lib/cli-tools/codex.js +7 -7
- package/dist/server/src/lib/cli-tools/gemini.js +3 -0
- package/dist/server/src/lib/cli-tools/opencode-config.js +179 -33
- package/dist/server/src/lib/cli-tools/opencode.js +5 -0
- package/dist/server/src/lib/cli-tools/vibe-local.js +3 -0
- package/dist/server/src/lib/cmate-parser.js +7 -7
- package/dist/server/src/lib/db-migrations.js +18 -1
- package/dist/server/src/lib/errors.js +153 -0
- package/dist/server/src/lib/prompt-answer-sender.js +3 -0
- package/dist/server/src/lib/prompt-detector.js +49 -7
- package/dist/server/src/lib/resource-cleanup.js +257 -0
- package/dist/server/src/lib/schedule-manager.js +269 -83
- package/dist/server/src/lib/tmux-capture-cache.js +221 -0
- package/dist/server/src/lib/tmux.js +41 -20
- package/dist/server/src/types/markdown-editor.js +9 -1
- package/package.json +11 -8
- package/.next/server/chunks/539.js +0 -35
- package/.next/server/chunks/7458.js +0 -1
- package/.next/server/chunks/7808.js +0 -1
- package/.next/static/chunks/1038-3509435b68c0967e.js +0 -1
- package/.next/static/chunks/1098.49268c9fe1b028fa.js +0 -1
- package/.next/static/chunks/2335-98a211e00b94c7ac.js +0 -1
- package/.next/static/chunks/3559.f073f72c4466ce0e.js +0 -1
- package/.next/static/chunks/3843.3fdda732987f7bb8.js +0 -1
- package/.next/static/chunks/4212.52c1bb34fc97d0d0.js +0 -131
- package/.next/static/chunks/4327.157a4c226d919531.js +0 -60
- package/.next/static/chunks/4362.7bd6f0282e49d79b.js +0 -1
- package/.next/static/chunks/4721.40615a5f4f32b5fb.js +0 -1
- package/.next/static/chunks/5112.17318d1c6b28044b.js +0 -1
- package/.next/static/chunks/6406.9653f0d41ab85059.js +0 -1
- package/.next/static/chunks/6792.3c01ac4dda4b5c6d.js +0 -1
- package/.next/static/chunks/8091-d65d2ab6daed23c6.js +0 -1
- package/.next/static/chunks/8125.245a9df052d274fb.js +0 -1
- package/.next/static/chunks/8522.1607e96011c66877.js +0 -1
- package/.next/static/chunks/8841.dadeb1ece8e46004.js +0 -1
- package/.next/static/chunks/8885.f8d9912b40d74811.js +0 -1
- package/.next/static/chunks/9178-88850a7c48deea07.js +0 -1
- package/.next/static/chunks/9552.b7dfb7903ead934b.js +0 -1
- package/.next/static/chunks/app/layout-9110f9a5e41c6bf4.js +0 -1
- package/.next/static/chunks/app/page-9e523a8f415bc707.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-4a3c0861367e0391.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-8fb4dc30b58a5681.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-5d85a7e508ce36d3.js +0 -1
- package/.next/static/chunks/d3ac728e.6c9c508274d4d2d5.js +0 -1
- package/.next/static/chunks/webpack-81c97591dd5567ac.js +0 -1
- package/.next/static/css/45b3a41370668314.css +0 -3
- /package/.next/static/chunks/{30d07d85-393352a92199f695.js → 30d07d85.1dc99a921fc18e34.js} +0 -0
- /package/.next/static/{p3hosTZoJ22r35fWwUoLr → dwGMLEU53HOvFOWqiZOT0}/_buildManifest.js +0 -0
- /package/.next/static/{p3hosTZoJ22r35fWwUoLr → dwGMLEU53HOvFOWqiZOT0}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";exports.id=5488,exports.ids=[5488],exports.modules={65488:(e,t,r)=>{r.d(t,{v9:()=>
|
|
1
|
+
"use strict";exports.id=5488,exports.ids=[5488],exports.modules={65488:(e,t,r)=>{r.d(t,{v9:()=>g});var o=r(61282),s=r(92048),a=r(55315),n=r.n(a);class i{constructor(){}static getInstance(){return i.instance||(i.instance=new i),i.instance}normalize(e){let t=e.match(/^ssh:\/\/git@([^:\/]+)(:\d+)?\/(.+?)(\.git)?$/);if(t)return`https://${t[1]}/${t[3]}`.toLowerCase().replace(/\/$/,"");let r=e.match(/^git@([^:]+):(.+?)(\.git)?$/);return r?`https://${r[1]}/${r[2]}`.toLowerCase().replace(/\/$/,""):e.replace(/\.git\/?$/,"").replace(/\/$/,"").toLowerCase()}isSameRepository(e,t){return this.normalize(e)===this.normalize(t)}extractRepoName(e){let t=e.match(/^ssh:\/\/git@[^\/]+\/(.+?)(\.git)?$/);if(t){let e=t[1].split("/");return e[e.length-1]}let r=e.match(/:(.+?)(\.git)?$/);if(r&&e.startsWith("git@")){let e=r[1].split("/");return e[e.length-1]}let o=e.match(/\/([^\/]+?)(\.git)?$/);return o?o[1]:""}getUrlType(e){return e.startsWith("https://")?"https":e.startsWith("git@")||e.startsWith("ssh://")?"ssh":null}validate(e){if(!e||"string"!=typeof e||""===e.trim())return{valid:!1,error:"EMPTY_URL"};let t=e.trim();return t.startsWith("https://")?/^https:\/\/[^\/]+\/[^\/]+\/[^\/]+(\.git)?$/.test(t)?{valid:!0}:{valid:!1,error:"INVALID_URL_FORMAT"}:t.startsWith("git@")?/^git@[^:]+:.+\/.+(\.git)?$/.test(t)?{valid:!0}:{valid:!1,error:"INVALID_URL_FORMAT"}:t.startsWith("ssh://")&&/^ssh:\/\/git@[^\/]+(:\d+)?\/[^\/]+\/.+(\.git)?$/.test(t)?{valid:!0}:{valid:!1,error:"INVALID_URL_FORMAT"}}}var l=r(57440),c=r(4709),d=r(67722);class u extends Error{constructor(e){super(e.message),this.name="CloneManagerError",this.category=e.category,this.code=e.code,this.recoverable=e.recoverable,this.suggestedAction=e.suggestedAction}}let p={EMPTY_URL:{category:"validation",code:"EMPTY_URL",message:"Clone URL is required",recoverable:!0,suggestedAction:"Please enter a valid git clone URL"},INVALID_URL_FORMAT:{category:"validation",code:"INVALID_URL_FORMAT",message:"Invalid URL format. Please use HTTPS or SSH URL.",recoverable:!0,suggestedAction:"Enter a valid URL like https://github.com/owner/repo or git@github.com:owner/repo"},DUPLICATE_CLONE_URL:{category:"validation",code:"DUPLICATE_CLONE_URL",message:"This repository is already registered",recoverable:!1,suggestedAction:"Use the existing repository instead"},CLONE_IN_PROGRESS:{category:"validation",code:"CLONE_IN_PROGRESS",message:"A clone operation is already in progress for this URL",recoverable:!1,suggestedAction:"Wait for the current clone to complete"},DIRECTORY_EXISTS:{category:"filesystem",code:"DIRECTORY_EXISTS",message:"Target directory already exists",recoverable:!0,suggestedAction:"Choose a different directory or remove the existing one"},INVALID_TARGET_PATH:{category:"validation",code:"INVALID_TARGET_PATH",message:"Target path is invalid or outside allowed directory",recoverable:!0,suggestedAction:"Use a path within the configured base directory"},AUTH_FAILED:{category:"auth",code:"AUTH_FAILED",message:"Authentication failed",recoverable:!0,suggestedAction:"Check your credentials or SSH keys"},NETWORK_ERROR:{category:"network",code:"NETWORK_ERROR",message:"Network error occurred",recoverable:!0,suggestedAction:"Check your internet connection and try again"},GIT_ERROR:{category:"git",code:"GIT_ERROR",message:"Git command failed",recoverable:!1,suggestedAction:"Check the error message for details"},CLONE_TIMEOUT:{category:"network",code:"CLONE_TIMEOUT",message:"Clone operation timed out",recoverable:!0,suggestedAction:"Try again or clone a smaller repository"}},h=!1;class g{constructor(e,t={}){this.db=e,this.urlNormalizer=i.getInstance(),this.config={basePath:t.basePath||this.resolveDefaultBasePath(),timeout:t.timeout||6e5},this.activeProcesses=new Map}resolveDefaultBasePath(){let e=process.env.WORKTREE_BASE_PATH;return e?(h||(console.warn("[DEPRECATED] WORKTREE_BASE_PATH is deprecated. Set CM_ROOT_DIR in your .env file instead."),h=!0),n().resolve(e)):process.cwd()}validateCloneRequest(e){let t=this.urlNormalizer.validate(e);return t.valid?{valid:!0,normalizedUrl:this.urlNormalizer.normalize(e),repoName:this.urlNormalizer.extractRepoName(e)}:{valid:!1,error:p[t.error||"INVALID_URL_FORMAT"]}}checkDuplicateRepository(e){return(0,c.nb)(this.db,e)}checkActiveCloneJob(e){return(0,c.fC)(this.db,e)}createCloneJob(e){return(0,c.Bm)(this.db,e)}getTargetPath(e){return n().join(this.config.basePath,e)}async startCloneJob(e,t){let r;let o=this.validateCloneRequest(e);if(!o.valid)return{success:!1,error:o.error};let a=o.normalizedUrl,n=o.repoName,i=this.checkDuplicateRepository(a);if(i)return{success:!1,error:{...p.DUPLICATE_CLONE_URL,message:`This repository is already registered as "${i.name}"`}};let c=this.checkActiveCloneJob(a);if(c)return{success:!1,jobId:c.id,error:p.CLONE_IN_PROGRESS};if(t){let e=function(e,t){try{return(0,l.kz)(e,t)}catch{return console.warn("[CloneManager] Invalid custom target path rejected"),null}}(t,this.config.basePath);if(!e)return{success:!1,error:p.INVALID_TARGET_PATH};r=e}else r=this.getTargetPath(n);if((0,s.existsSync)(r))return{success:!1,error:p.DIRECTORY_EXISTS};let d=this.createCloneJob({cloneUrl:e,normalizedCloneUrl:a,targetPath:r});return this.executeClone(d.id,e,r).catch(e=>{console.error(`[CloneManager] Clone failed for job ${d.id}:`,e)}),{success:!0,jobId:d.id}}async executeClone(e,t,r){(0,c.sN)(this.db,e,{status:"running",startedAt:new Date});let a=n().dirname(r);return(0,s.existsSync)(a)||(0,s.mkdirSync)(a,{recursive:!0}),new Promise((s,a)=>{let n=(0,o.spawn)("git",["clone","--progress",t,r],{stdio:["ignore","pipe","pipe"]});this.activeProcesses.set(e,n),n.pid&&(0,c.sN)(this.db,e,{pid:n.pid});let i="";n.stderr?.on("data",t=>{i+=t.toString();let r=this.parseGitProgress(t.toString());null!==r&&c.sN(this.db,e,{progress:r})});let l=setTimeout(()=>{n.kill("SIGTERM"),(0,c.sN)(this.db,e,{status:"failed",errorCategory:"network",errorCode:"CLONE_TIMEOUT",errorMessage:"Clone operation timed out",completedAt:new Date}),this.activeProcesses.delete(e),a(new u(p.CLONE_TIMEOUT))},this.config.timeout);n.on("close",async o=>{if(clearTimeout(l),this.activeProcesses.delete(e),0===o)await this.onCloneSuccess(e,t,r),s();else{let t=this.parseGitError(i,o);(0,c.sN)(this.db,e,{status:"failed",errorCategory:t.category,errorCode:t.code,errorMessage:t.message,completedAt:new Date}),a(new u(t))}}),n.on("error",t=>{clearTimeout(l),this.activeProcesses.delete(e);let r={category:"system",code:"SPAWN_ERROR",message:`Failed to spawn git process: ${t.message}`,recoverable:!1,suggestedAction:"Ensure git is installed and available in PATH"};(0,c.sN)(this.db,e,{status:"failed",errorCategory:r.category,errorCode:r.code,errorMessage:r.message,completedAt:new Date}),a(new u(r))})})}async onCloneSuccess(e,t,r){let o=(0,c.L_)(this.db,e);if(!o)return;let s=this.urlNormalizer.getUrlType(t),a=(0,c.h4)(this.db,{name:n().basename(r),path:r,cloneUrl:t,normalizedCloneUrl:o.normalizedCloneUrl,cloneSource:s||"https"});try{let e=await (0,d.e9)(r);e.length>0&&((0,d.h2)(this.db,e),console.log(`[CloneManager] Registered ${e.length} worktree(s) for ${r}`))}catch(e){console.error(`[CloneManager] Failed to scan worktrees for ${r}:`,e)}(0,c.sN)(this.db,e,{status:"completed",progress:100,repositoryId:a.id,completedAt:new Date})}parseGitProgress(e){let t=e.match(/(?:Receiving objects|Resolving deltas|Cloning into[^:]*?):\s*(\d+)%/);if(t){let e=parseInt(t[1],10);return isNaN(e)?null:e}return null}parseGitError(e,t){let r=e.toLowerCase(),o=e.substring(0,200);return["authentication failed","permission denied","could not read from remote repository"].some(e=>r.includes(e))?{...p.AUTH_FAILED,message:`Authentication failed: ${o}`}:["could not resolve host","connection refused","network is unreachable"].some(e=>r.includes(e))?{...p.NETWORK_ERROR,message:`Network error: ${o}`}:{...p.GIT_ERROR,message:`Git clone failed (exit code ${t}): ${o}`}}getCloneJobStatus(e){let t=(0,c.L_)(this.db,e);if(!t)return null;let r={jobId:t.id,status:t.status,progress:t.progress,repositoryId:t.repositoryId};return"failed"===t.status&&t.errorCode&&(r.error={category:t.errorCategory||"system",code:t.errorCode,message:t.errorMessage||"Unknown error"}),r}cancelCloneJob(e){let t=this.activeProcesses.get(e);if(t)return t.kill("SIGTERM"),this.activeProcesses.delete(e),(0,c.sN)(this.db,e,{status:"cancelled",completedAt:new Date}),!0;let r=(0,c.L_)(this.db,e);return!!r&&"pending"===r.status&&((0,c.sN)(this.db,e,{status:"cancelled",completedAt:new Date}),!0)}}},4709:(e,t,r)=>{r.d(t,{Bj:()=>f,Bm:()=>_,L_:()=>R,RT:()=>v,VZ:()=>g,fC:()=>C,h4:()=>c,mm:()=>E,nJ:()=>m,nb:()=>d,sN:()=>y});var o=r(84770),s=r(55315),a=r.n(s),n=r(43753);function i(e){return{id:e.id,name:e.name,path:e.path,enabled:1===e.enabled,cloneUrl:e.clone_url||void 0,normalizedCloneUrl:e.normalized_clone_url||void 0,cloneSource:e.clone_source,isEnvManaged:1===e.is_env_managed,createdAt:new Date(e.created_at),updatedAt:new Date(e.updated_at)}}function l(e){return{id:e.id,cloneUrl:e.clone_url,normalizedCloneUrl:e.normalized_clone_url,targetPath:e.target_path,repositoryId:e.repository_id||void 0,status:e.status,pid:e.pid||void 0,progress:e.progress,errorCategory:e.error_category||void 0,errorCode:e.error_code||void 0,errorMessage:e.error_message||void 0,startedAt:e.started_at?new Date(e.started_at):void 0,completedAt:e.completed_at?new Date(e.completed_at):void 0,createdAt:new Date(e.created_at)}}function c(e,t){let r=(0,o.randomUUID)(),s=Date.now();return e.prepare(`
|
|
2
2
|
INSERT INTO repositories (
|
|
3
3
|
id, name, path, enabled, clone_url, normalized_clone_url,
|
|
4
4
|
clone_source, is_env_managed, created_at, updated_at
|
|
@@ -14,23 +14,23 @@
|
|
|
14
14
|
UPDATE repositories
|
|
15
15
|
SET ${s.join(", ")}
|
|
16
16
|
WHERE id = ?
|
|
17
|
-
`).run(...a)}function
|
|
17
|
+
`).run(...a)}function h(e){return a().resolve(e)}function g(e){if(!e||"string"!=typeof e)return{valid:!1,error:"repositoryPath is required"};if(e.includes("\0"))return{valid:!1,error:"Invalid repository path"};let t=h(e);return(0,n.F)(t)?{valid:!1,error:"Invalid repository path"}:{valid:!0,resolvedPath:t}}function m(e,t){!function(e,t){for(let r of t){let t=h(r);u(e,t)||c(e,{name:a().basename(t),path:t,cloneSource:"local",isEnvManaged:!0,enabled:!0})}}(e,t);let r=function(e,t){let r=e.prepare("SELECT path FROM repositories WHERE enabled = 0").all().map(e=>e.path);return t.filter(e=>!r.includes(h(e)))}(e,t),o=t.filter(e=>!r.includes(e));return{filteredPaths:r,excludedPaths:o,excludedCount:o.length}}function E(e,t){let r=h(t),o=u(e,r);if(o)p(e,o.id,{enabled:!1});else{if(e.prepare("SELECT COUNT(*) as count FROM repositories WHERE enabled = 0").get().count>=1e3)throw Error("Disabled repository limit exceeded");c(e,{name:a().basename(r),path:r,cloneSource:"local",isEnvManaged:!1,enabled:!1})}}function f(e){return e.prepare("SELECT * FROM repositories WHERE enabled = 0 ORDER BY name ASC").all().map(i)}function v(e,t){let r=u(e,h(t));return r?(p(e,r.id,{enabled:!0}),{...r,enabled:!0}):null}function _(e,t){let r=(0,o.randomUUID)(),s=Date.now();return e.prepare(`
|
|
18
18
|
INSERT INTO clone_jobs (
|
|
19
19
|
id, clone_url, normalized_clone_url, target_path,
|
|
20
20
|
status, progress, created_at
|
|
21
21
|
)
|
|
22
22
|
VALUES (?, ?, ?, ?, 'pending', 0, ?)
|
|
23
|
-
`).run(r,t.cloneUrl,t.normalizedCloneUrl,t.targetPath,s),{id:r,cloneUrl:t.cloneUrl,normalizedCloneUrl:t.normalizedCloneUrl,targetPath:t.targetPath,status:"pending",progress:0,createdAt:new Date(s)}}function
|
|
23
|
+
`).run(r,t.cloneUrl,t.normalizedCloneUrl,t.targetPath,s),{id:r,cloneUrl:t.cloneUrl,normalizedCloneUrl:t.normalizedCloneUrl,targetPath:t.targetPath,status:"pending",progress:0,createdAt:new Date(s)}}function R(e,t){let r=e.prepare(`
|
|
24
24
|
SELECT * FROM clone_jobs
|
|
25
25
|
WHERE id = ?
|
|
26
|
-
`).get(t);return r?l(r):null}function
|
|
26
|
+
`).get(t);return r?l(r):null}function y(e,t,r){let o=[],s=[];void 0!==r.status&&(o.push("status = ?"),s.push(r.status)),void 0!==r.pid&&(o.push("pid = ?"),s.push(r.pid)),void 0!==r.progress&&(o.push("progress = ?"),s.push(r.progress)),void 0!==r.repositoryId&&(o.push("repository_id = ?"),s.push(r.repositoryId)),void 0!==r.errorCategory&&(o.push("error_category = ?"),s.push(r.errorCategory)),void 0!==r.errorCode&&(o.push("error_code = ?"),s.push(r.errorCode)),void 0!==r.errorMessage&&(o.push("error_message = ?"),s.push(r.errorMessage)),void 0!==r.startedAt&&(o.push("started_at = ?"),s.push(r.startedAt.getTime())),void 0!==r.completedAt&&(o.push("completed_at = ?"),s.push(r.completedAt.getTime())),0!==o.length&&(s.push(t),e.prepare(`
|
|
27
27
|
UPDATE clone_jobs
|
|
28
28
|
SET ${o.join(", ")}
|
|
29
29
|
WHERE id = ?
|
|
30
|
-
`).run(...s))}function
|
|
30
|
+
`).run(...s))}function C(e,t){let r=e.prepare(`
|
|
31
31
|
SELECT * FROM clone_jobs
|
|
32
32
|
WHERE normalized_clone_url = ?
|
|
33
33
|
AND status IN ('pending', 'running')
|
|
34
34
|
ORDER BY created_at DESC
|
|
35
35
|
LIMIT 1
|
|
36
|
-
`).get(t);return r?l(r):null}},57440:(e,t,r)=>{r.d(t,{
|
|
36
|
+
`).get(t);return r?l(r):null}},57440:(e,t,r)=>{r.d(t,{iH:()=>c,jj:()=>i,kz:()=>l});var o=r(55315),s=r.n(o),a=r(92048);function n(e,t){return e===t||e.startsWith(t+s().sep)}function i(e,t){if(!e||""===e.trim()||e.includes("\0"))return!1;let r=e;try{r=decodeURIComponent(e)}catch{r=e}if(r.includes("\0"))return!1;let o=s().resolve(t),a=s().resolve(t,r),n=s().relative(o,a);return!(n.startsWith("..")||s().isAbsolute(n))}function l(e,t){if(!e||""===e.trim())throw Error("Invalid path: Path cannot be empty");if(e.includes("\0"))throw Error("Invalid path: Null bytes not allowed");if(!i(e,t))throw Error(`Path is outside allowed directory: ${e} (allowed root: ${t})`);let r=e;try{r=decodeURIComponent(e)}catch{r=e}return s().resolve(t,r)}function c(e,t){let r;try{r=(0,a.realpathSync)(t)}catch{return!1}let o=s().resolve(t,e);if((0,a.existsSync)(o))try{let t=(0,a.realpathSync)(o),s=n(t,r);return s||console.warn(`[SEC-394] symlink traversal rejected: ${e} -> ${t}`),s}catch{return!1}try{if((0,a.lstatSync)(o).isSymbolicLink())try{let t=(0,a.readlinkSync)(o),i=s().resolve(s().dirname(o),t),l=n(i,r);return l||console.warn(`[SEC-394] dangling symlink traversal rejected: ${e} -> ${i}`),l}catch{return!1}}catch{}let i=s().dirname(o);for(;i!==s().dirname(i);){if((0,a.existsSync)(i))try{let e=(0,a.realpathSync)(i),t=n(e,r);return t||console.warn(`[SEC-394] symlink traversal rejected (ancestor): ${i} -> ${e}`),t}catch{break}i=s().dirname(i)}return!1}},67722:(e,t,r)=>{r.d(t,{Lj:()=>u,a$:()=>c,e9:()=>d,h2:()=>p});var o=r(61282),s=r(21764),a=r(55315),n=r.n(a),i=r(75748),l=r(98838);function c(){let e=process.env.WORKTREE_REPOS;if(e&&e.trim())return e.split(",").map(e=>e.trim()).filter(e=>e.length>0);let t=(0,l.Hb)("CM_ROOT_DIR");return t&&t.trim()?[t.trim()]:[]}async function d(e){let t=(0,s.promisify)(o.exec);try{let{stdout:r}=await t("git worktree list",{cwd:e}),o=function(e){if(!e||""===e.trim())return[];let t=e.trim().split("\n"),r=[];for(let e of t){let t=e.trim();if(!t)continue;let o=t.match(/^(.+?)\s+([a-z0-9]+)\s+(?:\[(.+?)\]|\(detached HEAD\))/);if(o){let[,e,t,s]=o;r.push({path:e.trim(),branch:s||`detached-${t}`,commit:t})}}return r}(r),s=n().resolve(e),a=n().basename(s);return o.map(e=>({id:function(e,t){if(!e)return"";let r=e=>e.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,""),o=r(e);if(t){let e=r(t);return`${e}-${o}`}return o}(e.branch,a),name:e.branch,path:n().resolve(e.path),repositoryPath:s,repositoryName:a})).filter(e=>["/etc","/root","/sys","/proc","/dev","/boot","/bin","/sbin","/usr/bin","/usr/sbin"].some(t=>e.path.startsWith(t))?(console.warn(`Skipping potentially unsafe worktree path: ${e.path}`),!1):!(e.path.includes("\0")||e.path.includes(".."))||(console.warn(`Skipping path with potentially malicious characters: ${e.path}`),!1))}catch(r){let e=r instanceof Error?r.message:String(r),t=r.code;if(e?.includes("not a git repository")||128===t)return[];throw r}}async function u(e){let t=[];for(let r of e)try{console.log(`Scanning repository: ${r}`);let e=await d(r);t.push(...e),console.log(` Found ${e.length} worktree(s)`)}catch(e){console.error(`Error scanning repository ${r}:`,e)}return t}function p(e,t){if(0===t.length)return;let r=new Map;for(let e of t){let t=e.repositoryPath||"";r.has(t)||r.set(t,[]),r.get(t).push(e)}for(let[t,o]of r){if(!t)continue;let r=(0,i.Pv)(e,t),s=new Set(o.map(e=>e.id)),a=r.filter(e=>!s.has(e));if(a.length>0){let r=(0,i.pM)(e,a);console.log(`Removed ${r.deletedCount} deleted worktree(s) from ${t}`)}for(let t of o)(0,i.ly)(e,t)}}}};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";exports.id=7425,exports.ids=[7425],exports.modules={16672:(e,t,s)=>{s.d(t,{ZP:()=>
|
|
1
|
+
"use strict";exports.id=7425,exports.ids=[7425],exports.modules={16672:(e,t,s)=>{s.d(t,{ZP:()=>r}),s(92048);var o=s(55315);function r(){let e=(0,o.dirname)(__dirname);return e.includes("/lib/node_modules/")||e.includes("\\node_modules\\")||e.includes("/node_modules/commandmate")}s(19801)},43753:(e,t,s)=>{s.d(t,{F:()=>r});let o=["/etc","/usr","/bin","/sbin","/var","/tmp","/dev","/sys","/proc"];function r(e){return o.some(t=>e.startsWith(t))}},83513:(e,t,s)=>{s.d(t,{Ho:()=>a,Ns:()=>i,Y1:()=>l,ZP:()=>n,_7:()=>r,tK:()=>o});let o=["claude","codex","gemini","vibe-local","opencode"];function r(e){return o.includes(e)}let a=128,i=2097152;function n(e){return"number"==typeof e&&Number.isInteger(e)&&e>=a&&e<=i}let l=/^[a-zA-Z0-9][a-zA-Z0-9._:/-]*$/},97425:(e,t,s)=>{s.r(t),s.d(t,{closeDbInstance:()=>p,getDbInstance:()=>c});var o=s(85890),r=s.n(o),a=s(55315),i=s.n(a),n=s(75748);let l=[{version:1,name:"initial-schema",up:e=>{(0,n.qZ)(e)},down:e=>{e.exec("DROP TABLE IF EXISTS session_states;"),e.exec("DROP TABLE IF EXISTS chat_messages;"),e.exec("DROP TABLE IF EXISTS worktrees;")}},{version:2,name:"add-multi-repo-and-memo-support",up:e=>{e.exec(`
|
|
2
2
|
ALTER TABLE worktrees ADD COLUMN repository_path TEXT;
|
|
3
3
|
ALTER TABLE worktrees ADD COLUMN repository_name TEXT;
|
|
4
4
|
ALTER TABLE worktrees ADD COLUMN memo TEXT;
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
SET repository_path = ?,
|
|
13
13
|
repository_name = ?
|
|
14
14
|
WHERE id = ?
|
|
15
|
-
`);for(let e of t){let t=_(e.path),
|
|
15
|
+
`);for(let e of t){let t=_(e.path),o=i().basename(t);s.run(t,o,e.id)}let o=e.prepare(`
|
|
16
16
|
UPDATE worktrees
|
|
17
17
|
SET last_user_message = ?,
|
|
18
18
|
last_user_message_at = ?
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
WHERE worktree_id = ? AND role = 'user'
|
|
24
24
|
ORDER BY timestamp DESC
|
|
25
25
|
LIMIT 1
|
|
26
|
-
`).get(s.id);if(t){let e=t.content.substring(0,200);
|
|
26
|
+
`).get(s.id);if(t){let e=t.content.substring(0,200);o.run(e,t.timestamp,s.id)}}},down:e=>{e.exec(`
|
|
27
27
|
-- Create backup table
|
|
28
28
|
CREATE TABLE worktrees_backup AS
|
|
29
29
|
SELECT id, name, path, last_message_summary, updated_at
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
SET repository_path = ?,
|
|
57
57
|
repository_name = ?
|
|
58
58
|
WHERE id = ?
|
|
59
|
-
`);for(let e of t){let t=_(e.path),
|
|
59
|
+
`);for(let e of t){let t=_(e.path),o=i().basename(t);s.run(t,o,e.id)}},down:()=>{console.log("No rollback needed for repository path fix")}},{version:4,name:"add-favorite-field",up:e=>{e.exec(`
|
|
60
60
|
ALTER TABLE worktrees ADD COLUMN favorite INTEGER DEFAULT 0;
|
|
61
61
|
`),e.exec(`
|
|
62
62
|
CREATE INDEX IF NOT EXISTS idx_worktrees_favorite
|
|
@@ -175,12 +175,12 @@
|
|
|
175
175
|
`),e.exec(`
|
|
176
176
|
CREATE INDEX idx_worktree_memos_worktree
|
|
177
177
|
ON worktree_memos(worktree_id, position);
|
|
178
|
-
`);let{randomUUID:t}=s(84770),
|
|
178
|
+
`);let{randomUUID:t}=s(84770),o=e.prepare(`
|
|
179
179
|
SELECT id, memo FROM worktrees WHERE memo IS NOT NULL AND memo != ''
|
|
180
|
-
`).all(),
|
|
180
|
+
`).all(),r=e.prepare(`
|
|
181
181
|
INSERT INTO worktree_memos (id, worktree_id, title, content, position, created_at, updated_at)
|
|
182
182
|
VALUES (?, ?, 'Memo', ?, 0, ?, ?)
|
|
183
|
-
`),a=Date.now();for(let e of r
|
|
183
|
+
`),a=Date.now();for(let e of o)r.run(t(),e.id,e.memo,a,a);console.log(`✓ Created worktree_memos table`),console.log(`✓ Migrated ${o.length} existing memos to new table`)},down:e=>{e.exec("DROP TABLE IF EXISTS worktree_memos"),console.log("✓ Dropped worktree_memos table")}},{version:11,name:"add-viewed-tracking",up:e=>{e.exec(`
|
|
184
184
|
ALTER TABLE worktrees ADD COLUMN last_viewed_at TEXT;
|
|
185
185
|
`),e.exec(`
|
|
186
186
|
CREATE INDEX IF NOT EXISTS idx_chat_messages_assistant_latest
|
|
@@ -440,7 +440,10 @@
|
|
|
440
440
|
ALTER TABLE worktrees ADD COLUMN vibe_local_model TEXT DEFAULT NULL;
|
|
441
441
|
`),console.log("✓ Added vibe_local_model column to worktrees table")},down:()=>{console.log("No rollback for vibe_local_model column (SQLite limitation)")}},{version:20,name:"add-vibe-local-context-window-column",up:e=>{e.exec(`
|
|
442
442
|
ALTER TABLE worktrees ADD COLUMN vibe_local_context_window INTEGER DEFAULT NULL;
|
|
443
|
-
`),console.log("✓ Added vibe_local_context_window column to worktrees table")},down:()=>{console.log("No rollback for vibe_local_context_window column (SQLite limitation)")}}
|
|
443
|
+
`),console.log("✓ Added vibe_local_context_window column to worktrees table")},down:()=>{console.log("No rollback for vibe_local_context_window column (SQLite limitation)")}},{version:21,name:"add-scheduled-executions-worktree-enabled-index",up:e=>{e.exec(`
|
|
444
|
+
CREATE INDEX IF NOT EXISTS idx_scheduled_executions_worktree_enabled
|
|
445
|
+
ON scheduled_executions(worktree_id, enabled);
|
|
446
|
+
`),console.log("✓ Created composite index idx_scheduled_executions_worktree_enabled")},down:e=>{e.exec("DROP INDEX IF EXISTS idx_scheduled_executions_worktree_enabled"),console.log("✓ Dropped idx_scheduled_executions_worktree_enabled index")}}];function _(e){let t=s(92048),o=e;for(;o!==i().dirname(o);){let e=i().join(o,".git");if(t.existsSync(e)){let s=t.statSync(e);if(s.isDirectory())return o;if(s.isFile()){let s=t.readFileSync(e,"utf-8").trim().match(/^gitdir:\s*(.+)$/);if(s)return s[1].split("/.git/")[0]}}o=i().dirname(o)}return e}function E(e){try{let t=e.prepare("SELECT MAX(version) as version FROM schema_version").get();return t?.version??0}catch{return 0}}var d=s(98838);let T=null;function c(){if(!T){let e=(0,d.dU)().CM_DB_PATH,t=s(92048),o=i().dirname(e);t.existsSync(o)||t.mkdirSync(o,{recursive:!0,mode:448}),(T=new(r())(e)).pragma("foreign_keys = ON"),function(e){!function(e){e.exec(`
|
|
444
447
|
CREATE TABLE IF NOT EXISTS schema_version (
|
|
445
448
|
version INTEGER PRIMARY KEY,
|
|
446
449
|
name TEXT NOT NULL,
|
|
@@ -449,7 +452,7 @@
|
|
|
449
452
|
`)}(e);let t=E(e);console.log(`Current schema version: ${t}`);let s=l.filter(e=>e.version>t);if(0===s.length){console.log("✓ Schema is up to date");return}for(let t of(console.log(`Found ${s.length} pending migration(s)`),s)){console.log(`Applying migration ${t.version}: ${t.name}...`);try{e.transaction(()=>{t.up(e),e.prepare(`
|
|
450
453
|
INSERT INTO schema_version (version, name, applied_at)
|
|
451
454
|
VALUES (?, ?, ?)
|
|
452
|
-
`).run(t.version,t.name,Date.now())})(),console.log(`✓ Migration ${t.version} applied successfully`)}catch(s){let e=s instanceof Error?s.message:String(s);throw console.error(`✗ Migration ${t.version} failed:`,e),Error(`Migration ${t.version} (${t.name}) failed: ${e}`)}}console.log(`✓ All migrations completed. Current version: ${E(e)}`)}(T)}return T}function p(){T&&(T.close(),T=null)}},75748:(e,t,s)=>{s.d(t,{DF:()=>W,Db:()=>
|
|
455
|
+
`).run(t.version,t.name,Date.now())})(),console.log(`✓ Migration ${t.version} applied successfully`)}catch(s){let e=s instanceof Error?s.message:String(s);throw console.error(`✗ Migration ${t.version} failed:`,e),Error(`Migration ${t.version} (${t.name}) failed: ${e}`)}}console.log(`✓ All migrations completed. Current version: ${E(e)}`)}(T)}return T}function p(){T&&(T.close(),T=null)}},75748:(e,t,s)=>{s.d(t,{DF:()=>W,Db:()=>F,ER:()=>l,Ek:()=>B,GA:()=>x,GP:()=>S,GZ:()=>R,HE:()=>N,IH:()=>g,Mf:()=>I,Nf:()=>C,Nr:()=>M,OK:()=>A,Of:()=>c,Pv:()=>G,Q7:()=>H,R3:()=>k,S$:()=>D,VW:()=>h,Xv:()=>n,Yg:()=>f,ZI:()=>v,_U:()=>u,_e:()=>P,dD:()=>y,dl:()=>U,ey:()=>X,gU:()=>_,j8:()=>O,ls:()=>L,ly:()=>E,pM:()=>Y,qZ:()=>i,tn:()=>p,vX:()=>m,xr:()=>d,y:()=>T,zl:()=>w});var o=s(84770),r=s(55483);function a(e){return{id:e.id,worktreeId:e.worktree_id,role:e.role,content:e.content,summary:e.summary||void 0,timestamp:new Date(e.timestamp),logFileName:e.log_file_name||void 0,requestId:e.request_id||void 0,messageType:e.message_type||"normal",promptData:e.prompt_data?JSON.parse(e.prompt_data):void 0,cliToolId:e.cli_tool_id??"claude"}}function i(e){e.exec(`
|
|
453
456
|
CREATE TABLE IF NOT EXISTS worktrees (
|
|
454
457
|
id TEXT PRIMARY KEY,
|
|
455
458
|
name TEXT NOT NULL,
|
|
@@ -506,7 +509,7 @@
|
|
|
506
509
|
(SELECT MAX(timestamp) FROM chat_messages
|
|
507
510
|
WHERE worktree_id = w.id AND role = 'assistant') as last_assistant_message_at
|
|
508
511
|
FROM worktrees w
|
|
509
|
-
`,
|
|
512
|
+
`,o=[];t&&(s+=" WHERE w.repository_path = ?",o.push(t)),s+=" ORDER BY w.updated_at DESC NULLS LAST";let a=e.prepare(s).all(...o),i=function(e,t){if(0===t.length)return new Map;let s=t.map(()=>"?").join(","),o=e.prepare(`
|
|
510
513
|
WITH ranked_messages AS (
|
|
511
514
|
SELECT
|
|
512
515
|
worktree_id,
|
|
@@ -523,7 +526,7 @@
|
|
|
523
526
|
SELECT worktree_id, cli_tool_id, content
|
|
524
527
|
FROM ranked_messages
|
|
525
528
|
WHERE rn = 1
|
|
526
|
-
`).all(...t),
|
|
529
|
+
`).all(...t),r=new Map;for(let e of t)r.set(e,{});for(let e of o){let t=r.get(e.worktree_id)||{};t[e.cli_tool_id]=e.content.substring(0,50),r.set(e.worktree_id,t)}return r}(e,a.map(e=>e.id));return a.map(e=>{let t=i.get(e.id)||{};return{id:e.id,name:e.name,path:e.path,repositoryPath:e.repository_path||"",repositoryName:e.repository_name||"",description:e.description||void 0,lastUserMessage:e.last_user_message||void 0,lastUserMessageAt:e.last_user_message_at?new Date(e.last_user_message_at):void 0,lastMessageSummary:e.last_message_summary||void 0,lastMessagesByCli:t,updatedAt:e.updated_at?new Date(e.updated_at):void 0,lastViewedAt:e.last_viewed_at?new Date(e.last_viewed_at):void 0,lastAssistantMessageAt:e.last_assistant_message_at?new Date(e.last_assistant_message_at):void 0,favorite:1===e.favorite,status:e.status||null,link:e.link||void 0,cliToolId:e.cli_tool_id??"claude",selectedAgents:(0,r.e7)(e.selected_agents),vibeLocalModel:e.vibe_local_model??null,vibeLocalContextWindow:e.vibe_local_context_window??null}})}function l(e){return e.prepare(`
|
|
527
530
|
SELECT
|
|
528
531
|
repository_path as path,
|
|
529
532
|
repository_name as name,
|
|
@@ -542,7 +545,7 @@
|
|
|
542
545
|
WHERE worktree_id = w.id AND role = 'assistant') as last_assistant_message_at
|
|
543
546
|
FROM worktrees w
|
|
544
547
|
WHERE w.id = ?
|
|
545
|
-
`).get(t);return s?{id:s.id,name:s.name,path:s.path,repositoryPath:s.repository_path||"",repositoryName:s.repository_name||"",description:s.description||void 0,lastUserMessage:s.last_user_message||void 0,lastUserMessageAt:s.last_user_message_at?new Date(s.last_user_message_at):void 0,lastMessageSummary:s.last_message_summary||void 0,updatedAt:s.updated_at?new Date(s.updated_at):void 0,lastViewedAt:s.last_viewed_at?new Date(s.last_viewed_at):void 0,lastAssistantMessageAt:s.last_assistant_message_at?new Date(s.last_assistant_message_at):void 0,favorite:1===s.favorite,status:s.status||null,link:s.link||void 0,cliToolId:s.cli_tool_id??"claude",selectedAgents:(0,
|
|
548
|
+
`).get(t);return s?{id:s.id,name:s.name,path:s.path,repositoryPath:s.repository_path||"",repositoryName:s.repository_name||"",description:s.description||void 0,lastUserMessage:s.last_user_message||void 0,lastUserMessageAt:s.last_user_message_at?new Date(s.last_user_message_at):void 0,lastMessageSummary:s.last_message_summary||void 0,updatedAt:s.updated_at?new Date(s.updated_at):void 0,lastViewedAt:s.last_viewed_at?new Date(s.last_viewed_at):void 0,lastAssistantMessageAt:s.last_assistant_message_at?new Date(s.last_assistant_message_at):void 0,favorite:1===s.favorite,status:s.status||null,link:s.link||void 0,cliToolId:s.cli_tool_id??"claude",selectedAgents:(0,r.e7)(s.selected_agents),vibeLocalModel:s.vibe_local_model??null,vibeLocalContextWindow:s.vibe_local_context_window??null}:null}function E(e,t){e.prepare("DELETE FROM worktrees WHERE path = ? AND id != ?").run(t.path,t.id),e.prepare(`
|
|
546
549
|
INSERT INTO worktrees (
|
|
547
550
|
id, name, path, repository_path, repository_name, description,
|
|
548
551
|
last_user_message, last_user_message_at, last_message_summary, updated_at, cli_tool_id
|
|
@@ -571,7 +574,7 @@
|
|
|
571
574
|
UPDATE worktrees
|
|
572
575
|
SET last_viewed_at = ?
|
|
573
576
|
WHERE id = ?
|
|
574
|
-
`).run(s.toISOString(),t)}function p(e,t){let s=(0,
|
|
577
|
+
`).run(s.toISOString(),t)}function p(e,t){let s=(0,o.randomUUID)();return e.prepare(`
|
|
575
578
|
INSERT INTO chat_messages
|
|
576
579
|
(id, worktree_id, role, content, summary, timestamp, log_file_name, request_id, message_type, prompt_data, cli_tool_id)
|
|
577
580
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
@@ -579,11 +582,11 @@
|
|
|
579
582
|
UPDATE worktrees
|
|
580
583
|
SET updated_at = ?
|
|
581
584
|
WHERE id = ?
|
|
582
|
-
`).run(s.getTime(),t)}(e,t.worktreeId,t.timestamp),"user"===t.role&&A(e,t.worktreeId,t.content,t.timestamp),{id:s,...t}}function u(e,t,s,
|
|
585
|
+
`).run(s.getTime(),t)}(e,t.worktreeId,t.timestamp),"user"===t.role&&A(e,t.worktreeId,t.content,t.timestamp),{id:s,...t}}function u(e,t,s,o=50,r){let i=`
|
|
583
586
|
SELECT id, worktree_id, role, content, summary, timestamp, log_file_name, request_id, message_type, prompt_data, cli_tool_id
|
|
584
587
|
FROM chat_messages
|
|
585
588
|
WHERE worktree_id = ? AND (? IS NULL OR timestamp < ?)
|
|
586
|
-
`,n=[t,s?.getTime()||null,s?.getTime()||null];return
|
|
589
|
+
`,n=[t,s?.getTime()||null,s?.getTime()||null];return r&&(i+=" AND cli_tool_id = ?",n.push(r)),i+=" ORDER BY timestamp DESC LIMIT ?",n.push(o),e.prepare(i).all(...n).map(a)}function m(e,t){let s=e.prepare(`
|
|
587
590
|
SELECT id, worktree_id, role, content, summary, timestamp, log_file_name, request_id, message_type, prompt_data, cli_tool_id
|
|
588
591
|
FROM chat_messages
|
|
589
592
|
WHERE worktree_id = ? AND role = 'user'
|
|
@@ -595,19 +598,19 @@
|
|
|
595
598
|
`).run(t),console.log(`[deleteAllMessages] Deleted all messages for worktree: ${t}`)}function L(e,t){return e.prepare(`
|
|
596
599
|
DELETE FROM chat_messages
|
|
597
600
|
WHERE id = ?
|
|
598
|
-
`).run(t).changes>0}function R(e,t,s){let
|
|
601
|
+
`).run(t).changes>0}function R(e,t,s){let o=e.prepare(`
|
|
599
602
|
DELETE FROM chat_messages
|
|
600
603
|
WHERE worktree_id = ? AND cli_tool_id = ?
|
|
601
|
-
`).run(t,s);return console.log(`[deleteMessagesByCliTool] Deleted ${
|
|
604
|
+
`).run(t,s);return console.log(`[deleteMessagesByCliTool] Deleted ${o.changes} messages for worktree: ${t}, cliTool: ${s}`),o.changes}function w(e,t,s="claude"){let o=e.prepare(`
|
|
602
605
|
SELECT worktree_id, cli_tool_id, last_captured_line, in_progress_message_id
|
|
603
606
|
FROM session_states
|
|
604
607
|
WHERE worktree_id = ? AND cli_tool_id = ?
|
|
605
|
-
`).get(t,s);return
|
|
608
|
+
`).get(t,s);return o?{worktreeId:o.worktree_id,cliToolId:o.cli_tool_id,lastCapturedLine:o.last_captured_line,inProgressMessageId:o.in_progress_message_id||null}:null}function g(e,t,s,o){e.prepare(`
|
|
606
609
|
INSERT INTO session_states (worktree_id, cli_tool_id, last_captured_line)
|
|
607
610
|
VALUES (?, ?, ?)
|
|
608
611
|
ON CONFLICT(worktree_id, cli_tool_id) DO UPDATE SET
|
|
609
612
|
last_captured_line = excluded.last_captured_line
|
|
610
|
-
`).run(t,s,
|
|
613
|
+
`).run(t,s,o)}function I(e,t,s){!function(e,t,s,o){e.prepare(`
|
|
611
614
|
INSERT INTO session_states (worktree_id, cli_tool_id, last_captured_line, in_progress_message_id)
|
|
612
615
|
VALUES (?, ?, 0, ?)
|
|
613
616
|
ON CONFLICT(worktree_id, cli_tool_id) DO UPDATE SET
|
|
@@ -618,20 +621,20 @@
|
|
|
618
621
|
`).run(t,s):e.prepare(`
|
|
619
622
|
DELETE FROM session_states
|
|
620
623
|
WHERE worktree_id = ?
|
|
621
|
-
`).run(t)}function A(e,t,s,
|
|
624
|
+
`).run(t)}function A(e,t,s,o){let r=e.prepare(`
|
|
622
625
|
UPDATE worktrees
|
|
623
626
|
SET last_user_message = ?,
|
|
624
627
|
last_user_message_at = ?
|
|
625
628
|
WHERE id = ?
|
|
626
|
-
`),a=s.substring(0,200);
|
|
629
|
+
`),a=s.substring(0,200);r.run(a,o.getTime(),t)}function D(e,t){let s=e.prepare(`
|
|
627
630
|
SELECT id, worktree_id, role, content, summary, timestamp, log_file_name, request_id, message_type, prompt_data, cli_tool_id
|
|
628
631
|
FROM chat_messages
|
|
629
632
|
WHERE id = ?
|
|
630
|
-
`).get(t);return s?a(s):null}function
|
|
633
|
+
`).get(t);return s?a(s):null}function x(e,t,s){e.prepare(`
|
|
631
634
|
UPDATE chat_messages
|
|
632
635
|
SET prompt_data = ?
|
|
633
636
|
WHERE id = ?
|
|
634
|
-
`).run(JSON.stringify(s),t)}function
|
|
637
|
+
`).run(JSON.stringify(s),t)}function S(e,t,s){let o=e.prepare(`
|
|
635
638
|
SELECT id, prompt_data
|
|
636
639
|
FROM chat_messages
|
|
637
640
|
WHERE worktree_id = ?
|
|
@@ -639,11 +642,11 @@
|
|
|
639
642
|
AND message_type = 'prompt'
|
|
640
643
|
AND json_extract(prompt_data, '$.status') = 'pending'
|
|
641
644
|
ORDER BY timestamp DESC
|
|
642
|
-
`).all(t,s);if(0===
|
|
645
|
+
`).all(t,s);if(0===o.length)return 0;let r=e.prepare(`
|
|
643
646
|
UPDATE chat_messages
|
|
644
647
|
SET prompt_data = ?
|
|
645
648
|
WHERE id = ?
|
|
646
|
-
`),a=0;for(let e of
|
|
649
|
+
`),a=0;for(let e of o)try{let t=JSON.parse(e.prompt_data);t.status="answered",t.answer="(answered via terminal)",t.answeredAt=new Date().toISOString(),r.run(JSON.stringify(t),e.id),a++}catch{}return a}function k(e,t,s){e.prepare(`
|
|
647
650
|
UPDATE worktrees
|
|
648
651
|
SET favorite = ?
|
|
649
652
|
WHERE id = ?
|
|
@@ -667,21 +670,21 @@
|
|
|
667
670
|
UPDATE worktrees
|
|
668
671
|
SET vibe_local_context_window = ?
|
|
669
672
|
WHERE id = ?
|
|
670
|
-
`).run(s,t)}function
|
|
673
|
+
`).run(s,t)}function b(e){return{id:e.id,worktreeId:e.worktree_id,title:e.title,content:e.content,position:e.position,createdAt:new Date(e.created_at),updatedAt:new Date(e.updated_at)}}function F(e,t){return e.prepare(`
|
|
671
674
|
SELECT id, worktree_id, title, content, position, created_at, updated_at
|
|
672
675
|
FROM worktree_memos
|
|
673
676
|
WHERE worktree_id = ?
|
|
674
677
|
ORDER BY position ASC
|
|
675
|
-
`).all(t).map(
|
|
678
|
+
`).all(t).map(b)}function v(e,t){let s=e.prepare(`
|
|
676
679
|
SELECT id, worktree_id, title, content, position, created_at, updated_at
|
|
677
680
|
FROM worktree_memos
|
|
678
681
|
WHERE id = ?
|
|
679
|
-
`).get(t);return s?
|
|
682
|
+
`).get(t);return s?b(s):null}function y(e,t,s){let r=(0,o.randomUUID)(),a=Date.now(),i=s.title??"Memo",n=s.content??"";return e.prepare(`
|
|
680
683
|
INSERT INTO worktree_memos (id, worktree_id, title, content, position, created_at, updated_at)
|
|
681
684
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
682
|
-
`).run(
|
|
685
|
+
`).run(r,t,i,n,s.position,a,a),{id:r,worktreeId:t,title:i,content:n,position:s.position,createdAt:new Date(a),updatedAt:new Date(a)}}function M(e,t,s){let o=Date.now(),r=["updated_at = ?"],a=[o];void 0!==s.title&&(r.push("title = ?"),a.push(s.title)),void 0!==s.content&&(r.push("content = ?"),a.push(s.content)),a.push(t),e.prepare(`
|
|
683
686
|
UPDATE worktree_memos
|
|
684
|
-
SET ${
|
|
687
|
+
SET ${r.join(", ")}
|
|
685
688
|
WHERE id = ?
|
|
686
689
|
`).run(...a)}function P(e,t){e.prepare(`
|
|
687
690
|
DELETE FROM worktree_memos
|
|
@@ -700,4 +703,4 @@
|
|
|
700
703
|
DELETE FROM worktrees WHERE repository_path = ?
|
|
701
704
|
`).run(t).changes}}function Y(e,t){if(0===t.length)return{deletedCount:0};let s=t.map(()=>"?").join(",");return{deletedCount:e.prepare(`
|
|
702
705
|
DELETE FROM worktrees WHERE id IN (${s})
|
|
703
|
-
`).run(...t).changes}}},98838:(e,t,s)=>{s.d(t,{dU:()=>u,Hb:()=>T,LI:()=>p});var
|
|
706
|
+
`).run(...t).changes}}},98838:(e,t,s)=>{s.d(t,{dU:()=>u,Hb:()=>T,LI:()=>p});var o=s(55315),r=s.n(o),a=s(19801),i=s(16672),n=s(43753);function l(){return(0,i.ZP)()?r().join((0,a.homedir)(),".commandmate","data","cm.db"):r().resolve(process.cwd(),"data","cm.db")}function _(e){let t=r().resolve(e);if((0,i.ZP)()){let e=(0,a.homedir)();if(!t.startsWith(e))throw Error(`Security error: DB path must be within home directory: ${t}`)}else if((0,n.F)(t))throw Error(`Security error: DB path cannot be in system directory: ${t}`);return t}let E={CM_ROOT_DIR:"MCBD_ROOT_DIR",CM_PORT:"MCBD_PORT",CM_BIND:"MCBD_BIND",CM_LOG_LEVEL:"MCBD_LOG_LEVEL",CM_LOG_FORMAT:"MCBD_LOG_FORMAT",CM_LOG_DIR:"MCBD_LOG_DIR",CM_DB_PATH:"MCBD_DB_PATH"},d=new Set;function T(e){return function(e,t){let s=process.env[e];if(void 0!==s)return s;let o=process.env[t];if(void 0!==o)return d.has(t)||(console.warn(`[DEPRECATED] ${t} is deprecated, use ${e} instead`),d.add(t)),o}(e,E[e])}let c=!1;function p(){let e=T("CM_LOG_LEVEL")?.toLowerCase(),t=T("CM_LOG_FORMAT")?.toLowerCase();return{level:void 0!==e&&["debug","info","warn","error"].includes(e)?e:"info",format:"json"===t?"json":"text"}}function u(){let e;let t=T("CM_ROOT_DIR")||process.cwd(),s=parseInt(T("CM_PORT")||"3000",10),o=T("CM_BIND")||"127.0.0.1",a=T("CM_DB_PATH")||function(){let e=process.env.DATABASE_PATH;return e&&!c&&(console.warn("[DEPRECATED] DATABASE_PATH is deprecated. Use CM_DB_PATH instead."),c=!0),e}()||l();if(!t)throw Error("CM_ROOT_DIR (or MCBD_ROOT_DIR) is required");if(isNaN(s)||s<1||s>65535)throw Error(`Invalid CM_PORT: ${T("CM_PORT")}. Must be between 1 and 65535.`);if("127.0.0.1"!==o&&"0.0.0.0"!==o&&"localhost"!==o)throw Error(`Invalid CM_BIND: ${o}. Must be '127.0.0.1', '0.0.0.0', or 'localhost'.`);try{e=_(a)}catch{console.warn(`[Security] Invalid DB path "${a}", using default.`),e=_(l())}return{CM_ROOT_DIR:r().resolve(t),CM_PORT:s,CM_BIND:o,CM_DB_PATH:e}}},55483:(e,t,s)=>{s.d(t,{KE:()=>_,e7:()=>l});var o=s(83513);let r=/\x1b\[[0-9;]*[a-zA-Z]|\x1b\][^\x07]*\x07|\[[0-9;]*m/g;function a(e){return e.replace(r,"").replace(/[\n\r]/g," ").substring(0,100)}let i=["claude","codex"];function n(e){return 2!==e.length?{valid:!1,error:"Must be 2 elements"}:e.every(e=>"string"==typeof e&&o.tK.includes(e))?e[0]===e[1]?{valid:!1,error:"Duplicate tool IDs not allowed"}:{valid:!0,value:e}:{valid:!1,error:"Invalid CLI tool ID"}}function l(e){if(!e)return i;try{let t=JSON.parse(e);if(!Array.isArray(t))return console.warn(`[selected-agents] Invalid format in DB, falling back to default: ${a(e)}`),i;let s=n(t);if(!s.valid)return console.warn(`[selected-agents] Invalid data in DB (${s.error}), falling back to default: ${a(e)}`),i;return s.value}catch{return console.warn(`[selected-agents] JSON parse error in DB, falling back to default: ${a(e)}`),i}}function _(e){return Array.isArray(e)&&2===e.length?n(e):{valid:!1,error:"selected_agents must be an array of 2 elements"}}}};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
exports.id=7566,exports.ids=[7566],exports.modules={58359:()=>{},93739:()=>{},98241:(t,e,r)=>{"use strict";r.d(e,{s:()=>o});var n=r(55315),a=r.n(n),i=r(98838);function o(){return(0,i.Hb)("CM_LOG_DIR")||a().join(process.cwd(),"data","logs")}},40824:(t,e,r)=>{"use strict";r.d(e,{HI:()=>i,pC:()=>l,Gn:()=>m,H2:()=>w,n8:()=>h,KL:()=>f,WX:()=>d});var n=r(84770),a=r.n(n);let i="cm_auth_token",o=/^[0-9a-f]{64}$/,s={maxAttempts:5,lockoutDuration:9e5,cleanupInterval:36e5},l=86400,c=(()=>{let t=process.env.CM_AUTH_TOKEN_HASH||void 0;if(t){if(!function(t){return!!t&&o.test(t)}(t)){console.error(`[Security] CM_AUTH_TOKEN_HASH is not a valid 64-character hex string (got ${t.length} chars). Authentication will be disabled.`);return}return t}})(),u=function(){let t=process.env.CM_AUTH_EXPIRE,e=Date.now();if(t)try{return e+function(t){let e=t.match(/^(\d+)([hdm])$/);if(!e)throw Error(`Invalid duration format: "${t}". Use Nh, Nd, or Nm (e.g., "24h", "7d", "90m")`);let r=parseInt(e[1],10),n=e[2],a={h:36e5,d:864e5,m:6e4}[n];if(void 0===a)throw Error(`Invalid duration unit: "${n}"`);let i=r*a;if(i<36e5)throw Error(`Duration too short: minimum is 1h (60m). Got: "${t}"`);if(i>2592e6)throw Error(`Duration too long: maximum is 30d (720h). Got: "${t}"`);return i}(t)}catch{return e+864e5}return process.env.CM_AUTH_TOKEN_HASH?e+864e5:null}();function d(t){if(!c||!t||"string"!=typeof t||null!==u&&Date.now()>u)return!1;let e=a().createHash("sha256").update(t).digest("hex"),r=Buffer.from(e,"hex"),n=Buffer.from(c,"hex");return r.length===n.length&&a().timingSafeEqual(r,n)}function f(){return!!c}function h(){if(null===u)return 0;let t=u-Date.now();return t<=0?0:Math.floor(t/1e3)}function m(t){return{httpOnly:!0,sameSite:"strict",secure:!!process.env.CM_HTTPS_CERT,maxAge:t,path:"/"}}function w(){let t=new Map,e=setInterval(()=>{let e=Date.now();for(let[r,n]of t){let a=null===n.lockedUntil||e>n.lockedUntil,i=e-n.lastAttempt>s.lockoutDuration;a&&i&&t.delete(r)}},s.cleanupInterval);return e.unref&&e.unref(),{checkLimit(e){let r=t.get(e);if(!r)return{allowed:!0};if(null!==r.lockedUntil){let t=Date.now();if(t<r.lockedUntil)return{allowed:!1,retryAfter:Math.ceil((r.lockedUntil-t)/1e3)};r.attempts=0,r.lockedUntil=null}return{allowed:!0}},recordFailure(e){let r=Date.now(),n=t.get(e)||{attempts:0,lockedUntil:null,lastAttempt:r};n.attempts++,n.lastAttempt=r,n.attempts>=s.maxAttempts&&(n.lockedUntil=r+s.lockoutDuration),t.set(e,n)},recordSuccess(e){t.delete(e)},destroy(){clearInterval(e),t.clear()}}}},89287:(t,e,r)=>{"use strict";r.d(e,{Z:()=>o});let n=/📄 Session log: (.+?\/([^\/\s]+\.jsonl))/,a=/Request ID: ([^\s\n]+)/,i=/Summary: (.+?)(?:\n─|$)/s;function o(t){let e={content:t},r=n.exec(t);r&&(e.logFileName=r[2]);let o=a.exec(t);o&&(e.requestId=o[1]);let s=i.exec(t);return s&&(e.summary=s[1].trim()),e}},62648:(t,e,r)=>{"use strict";r.d(e,{Lm:()=>I,Uv:()=>x,YI:()=>$,_f:()=>D,xd:()=>k,ym:()=>C});var n=r(10927),a=r(19377),i=r(92900),o=r(61282),s=r(21764),l=r(20629);let c=(0,s.promisify)(o.exec);function u(t){return t instanceof Error?t.message:String(t)}let d=["$","%","#"],f=null;async function h(){if(f)return f;let t=process.env.CLAUDE_PATH;if(t&&(/^[/a-zA-Z0-9._-]+$/.test(t)?!t.includes("..")||(console.log("[claude-session] CLAUDE_PATH contains path traversal sequence, ignoring"),!1):(console.log(`[claude-session] CLAUDE_PATH contains invalid characters, ignoring: ${t.substring(0,50)}`),!1)))try{return await (0,l.access)(t,l.constants.X_OK),f=t}catch{console.log(`[claude-session] CLAUDE_PATH is not executable: ${t}`)}try{let{stdout:t}=await c("which claude",{timeout:5e3});return f=t.trim()}catch{for(let t of["/opt/homebrew/bin/claude","/usr/local/bin/claude","/usr/bin/claude"])try{return await c(`test -x "${t}"`,{timeout:1e3}),f=t}catch{}throw Error("Claude CLI not found. Set CLAUDE_PATH environment variable or install Claude CLI.")}}async function m(t,e=50){let r=await (0,n.xq)(t,{startLine:-e});return(0,a.vp)(r)}async function w(t){try{let e=(await m(t)).trim();if(""===e)return{healthy:!1,reason:"empty output"};if(a.V7.test(e))return{healthy:!0};let r=e.split("\n").filter(t=>""!==t.trim()),n=r.slice(-10).join("\n");for(let t of a.KJ)if(n.includes(t))return{healthy:!1,reason:`error pattern: ${t}`};for(let t of a.dR)if(t.test(n))return{healthy:!1,reason:`error pattern: ${t.source}`};let i=r[r.length-1]?.trim()??"";if(i.length>=40)return{healthy:!0};if(d.some(t=>!(!i.endsWith(t)||"%"===t&&/\d+%$/.test(i))))return{healthy:!1,reason:`shell prompt ending detected: ${i}`};return{healthy:!0}}catch{return{healthy:!1,reason:"capture error"}}}async function p(t){let e=await w(t);return!!e.healthy||(console.warn(`[health-check] Session ${t} unhealthy: ${e.reason}`),await (0,n.AJ)(t),!1)}async function g(t){await c("tmux set-environment -g -u CLAUDECODE 2>/dev/null || true"),await (0,n.Is)(t,"unset CLAUDECODE",!0),await new Promise(t=>setTimeout(t,100))}function y(t){return`mcbd-claude-${t}`}async function x(){try{return await c("which claude",{timeout:5e3}),!0}catch{return!1}}async function $(t){let e=y(t);if(!await (0,n.Hk)(e))return!1;let r=await w(e);return!!r.healthy||(console.warn(`[isClaudeRunning] Session ${e} unhealthy: ${r.reason}`),!1)}async function E(t,e=5e3){let r=Date.now();for(;Date.now()-r<e;){let e=await m(t);if(a.V7.test(e))return;await new Promise(t=>setTimeout(t,200))}throw Error(`Prompt detection timeout (${e}ms)`)}async function C(t){let{worktreeId:e,worktreePath:r}=t;if(!await x())throw Error("Claude CLI is not installed or not in PATH");let i=y(e);if(await (0,n.Hk)(i)&&await p(i)){console.log(`Claude session ${i} already exists and is healthy`);return}try{await (0,n.ed)({sessionName:i,workingDirectory:r,historyLimit:5e4}),await g(i);let t=await h();await (0,n.Is)(i,t,!0);let e=Date.now(),o=!1,s=!1;for(;Date.now()-e<15e3;){await new Promise(t=>setTimeout(t,300));try{let t=await m(i);if(a.V7.test(t)){await new Promise(t=>setTimeout(t,500)),console.log(`Claude initialized in ${Date.now()-e}ms`),o=!0;break}!s&&a.H3.test(t)&&(await (0,n.Is)(i,"",!0),s=!0,console.log("Trust dialog detected, sending Enter to confirm"))}catch{}}if(!o)throw Error("Claude initialization timeout (15000ms)");console.log(`Started Claude session: ${i}`)}catch(t){throw f=null,console.log(`[claude-session] Session start failed: ${u(t)}`),Error("Failed to start Claude session")}}async function k(t,e){let r=y(t);if(!await (0,n.Hk)(r))throw Error(`Claude session ${r} does not exist. Start the session first.`);let o=await m(r);a.V7.test(o)||await E(r,1e4),await new Promise(t=>setTimeout(t,500)),await (0,n.Is)(r,e,!1),await (0,n.Is)(r,"",!0),e.includes("\n")&&await (0,i.N)(r),console.log(`Sent message to Claude session: ${r}`)}async function I(t,e=1e3){let r=y(t);if(!await (0,n.Hk)(r))throw Error(`Claude session ${r} does not exist`);try{return await (0,n.xq)(r,{startLine:-e})}catch(t){throw Error(`Failed to capture Claude output: ${u(t)}`)}}async function D(t){let e=y(t);try{await (0,n.Hk)(e)&&(await (0,n.Is)(e,"",!1),await c(`tmux send-keys -t "${e}" C-d`),await new Promise(t=>setTimeout(t,500)));let t=await (0,n.AJ)(e);return t&&console.log(`Stopped Claude session: ${e}`),t}catch(t){return console.error(`Error stopping Claude session: ${u(t)}`),!1}}},19377:(t,e,r)=>{"use strict";r.d(e,{BN:()=>v,H3:()=>l,Hm:()=>p,KJ:()=>P,Sg:()=>b,V7:()=>o,Wg:()=>D,_r:()=>f,bl:()=>g,bs:()=>function t(e){switch(e){case"claude":return{promptPattern:o,separatorPattern:s,thinkingPattern:a,skipPatterns:[/^─{10,}$/,/^[>❯]\s*$/,a,/^\s*[⎿⏋]\s+Tip:/,/^\s*Tip:/,/^\s*\?\s*for shortcuts/,/to interrupt\)/,d]};case"codex":return{promptPattern:c,separatorPattern:u,thinkingPattern:i,skipPatterns:[/^─.*─+$/,/^›\s*$/,/^›\s+(Implement|Find and fix|Type)/,i,/^\s*\d+%\s+context left/,/^\s*for shortcuts$/,/╭─+╮/,/╰─+╯/,/•\s*Ran\s+/,/^\s*└/,/^\s*│/,/\(.*esc to interrupt\)/,d]};case"gemini":return{promptPattern:m,separatorPattern:/^[─━]{3,}$/m,thinkingPattern:w,skipPatterns:[/^[>❯]\s*$/,w,/^\s*$/,/Gemini\s+\d+\.\d+/,d]};case"vibe-local":return{promptPattern:k,separatorPattern:/^[·]{10,}$/m,thinkingPattern:I,skipPatterns:[k,I,/^\s*$/,/vibe-local|vibe-coder/,/ctx:\s*\d+%/,/Model\s+\w/,/Engine\s+\w/,/Mode\s+/,/RAM\s+/,/CWD\s+/,/^[·]{10,}$/,/✦\s*Ready/,/ESC:\s*stop/,d]};case"opencode":return{promptPattern:p,separatorPattern:E,thinkingPattern:y,skipPatterns:[...C]};default:return t("claude")}},d8:()=>d,dR:()=>T,lr:()=>C,n9:()=>x,nT:()=>$,vp:()=>A,ww:()=>h});let n=(0,r(43895).h)("cli-patterns"),a=RegExp(`[✻✽⏺\xb7∴✢✳✶⦿◉●○◌◎⊙⊚⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]\\s+.+…|esc to interrupt`,"m"),i=/•\s*(Planning|Searching|Exploring|Running|Thinking|Working|Reading|Writing|Analyzing|Ran|Deciding)/m,o=/^[>❯](\s*$|\s+\S)/m,s=/^─{10,}$/m,l=/Yes, I trust this folder/m,c=/^›\s*/m,u=/^─.*Worked for.*─+$/m,d=/\[Pasted text #\d+/,f=500,h=3,m=/^[>❯]\s*$/m,w=/[\u2800-\u28FF]|Thinking\.\.\./,p=/Ask anything\.\.\./,g=/tab agents\s+ctrl\+p commands/,y=/Thinking:/,x=/\u25A3\s+\w+\s+\u00b7\s+\S+(?:\s+\u00b7\s+(?:[\d]+h\s*)?(?:[\d]+m\s*)?[\d.]+s)?/,$=/esc interrupt/,E=/^[\u2503\u2579\u25A3\u2580\u2500\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C]+$/,C=[E,/\u2B1D{4,}/,/^Build\s+/,g,$,p,d],k=/ctx:\d+%\s*[>❯]/m,I=/[\u2800-\u28FF]|Thinking|⠋|⠙|⠹|⠸|⠼|⠴|⠦|⠧|⠇|⠏|Running|Executing/;function D(t,e){let r;let o=n.withContext({cliToolId:t});switch(o.debug("detectThinking:check",{contentLength:e.length}),t){case"claude":default:r=a.test(e);break;case"codex":r=i.test(e);break;case"gemini":r=w.test(e);break;case"vibe-local":r=I.test(e);break;case"opencode":r=y.test(e)}return o.debug("detectThinking:result",{isThinking:r}),r}let S=/\x1b\[[0-9;]*[a-zA-Z]|\x1b\][^\x07]*\x07|\[[0-9;]*m/g;function A(t){return t.replace(S,"")}function v(t){return t.split("\n").map(t=>/^[\u2502\u2503\u256D\u256E\u256F\u2570\u2500\u2579\u2580\s]+$/.test(t)?"":t.replace(/^\s*[\u2502\u2503]\s?/,"").replace(/\s*[\u2502\u2503]$/,"")).join("\n")}let P=["Claude Code cannot be launched inside another Claude Code session"],T=[/^Error:.*Claude Code/];function b(t){if("claude"===t||"opencode"===t)return{requireDefaultIndicator:!1}}},76966:(t,e,r)=>{"use strict";r.d(e,{o:()=>i});var n=r(75748),a=r(98636);async function i(t,e,r,i="claude"){let o=(0,n.vX)(t,e);if(o)try{await (0,a.xN)(e,o.content,r,i)}catch(t){console.error("[recordClaudeConversation] Failed to create log file:",t)}}},98636:(t,e,r)=>{"use strict";r.d(e,{e7:()=>f,xN:()=>d});var n=r(20629),a=r.n(n),i=r(55315),o=r.n(i),s=r(73853),l=r(98241);function c(t="claude"){return o().join((0,l.s)(),t)}async function u(t="claude"){let e=c(t);try{await a().access(e)}catch{await a().mkdir(e,{recursive:!0})}}async function d(t,e,r,n="claude"){await u(n);let i=function(t,e="claude"){let r=(0,s.WU)(new Date,"yyyy-MM-dd"),n=`${t}-${r}.md`,a=c(e);return o().join(a,n)}(t,n),l=(0,s.WU)(new Date,"yyyy-MM-dd HH:mm:ss"),d="";try{d=await a().readFile(i,"utf-8")}catch{let e="claude"===n?"Claude Code":"codex"===n?"Codex CLI":"Gemini CLI";d=`# ${e} Conversation Log: ${t}
|
|
1
|
+
exports.id=7566,exports.ids=[7566],exports.modules={58359:()=>{},93739:()=>{},98241:(t,e,r)=>{"use strict";r.d(e,{s:()=>s});var n=r(55315),a=r.n(n),i=r(98838);function s(){return(0,i.Hb)("CM_LOG_DIR")||a().join(process.cwd(),"data","logs")}},40824:(t,e,r)=>{"use strict";r.d(e,{HI:()=>i,pC:()=>l,Gn:()=>h,H2:()=>p,n8:()=>m,KL:()=>f,WX:()=>d});var n=r(84770),a=r.n(n);let i="cm_auth_token",s=/^[0-9a-f]{64}$/,o={maxAttempts:5,lockoutDuration:9e5,cleanupInterval:36e5},l=86400,u=(()=>{let t=process.env.CM_AUTH_TOKEN_HASH||void 0;if(t){if(!function(t){return!!t&&s.test(t)}(t)){console.error(`[Security] CM_AUTH_TOKEN_HASH is not a valid 64-character hex string (got ${t.length} chars). Authentication will be disabled.`);return}return t}})(),c=function(){let t=process.env.CM_AUTH_EXPIRE,e=Date.now();if(t)try{return e+function(t){let e=t.match(/^(\d+)([hdm])$/);if(!e)throw Error(`Invalid duration format: "${t}". Use Nh, Nd, or Nm (e.g., "24h", "7d", "90m")`);let r=parseInt(e[1],10),n=e[2],a={h:36e5,d:864e5,m:6e4}[n];if(void 0===a)throw Error(`Invalid duration unit: "${n}"`);let i=r*a;if(i<36e5)throw Error(`Duration too short: minimum is 1h (60m). Got: "${t}"`);if(i>2592e6)throw Error(`Duration too long: maximum is 30d (720h). Got: "${t}"`);return i}(t)}catch{return e+864e5}return process.env.CM_AUTH_TOKEN_HASH?e+864e5:null}();function d(t){if(!u||!t||"string"!=typeof t||null!==c&&Date.now()>c)return!1;let e=a().createHash("sha256").update(t).digest("hex"),r=Buffer.from(e,"hex"),n=Buffer.from(u,"hex");return r.length===n.length&&a().timingSafeEqual(r,n)}function f(){return!!u}function m(){if(null===c)return 0;let t=c-Date.now();return t<=0?0:Math.floor(t/1e3)}function h(t){return{httpOnly:!0,sameSite:"strict",secure:!!process.env.CM_HTTPS_CERT,maxAge:t,path:"/"}}function p(){let t=new Map,e=setInterval(()=>{let e=Date.now();for(let[r,n]of t){let a=null===n.lockedUntil||e>n.lockedUntil,i=e-n.lastAttempt>o.lockoutDuration;a&&i&&t.delete(r)}},o.cleanupInterval);return e.unref&&e.unref(),{checkLimit(e){let r=t.get(e);if(!r)return{allowed:!0};if(null!==r.lockedUntil){let t=Date.now();if(t<r.lockedUntil)return{allowed:!1,retryAfter:Math.ceil((r.lockedUntil-t)/1e3)};r.attempts=0,r.lockedUntil=null}return{allowed:!0}},recordFailure(e){let r=Date.now(),n=t.get(e)||{attempts:0,lockedUntil:null,lastAttempt:r};n.attempts++,n.lastAttempt=r,n.attempts>=o.maxAttempts&&(n.lockedUntil=r+o.lockoutDuration),t.set(e,n)},recordSuccess(e){t.delete(e)},destroy(){clearInterval(e),t.clear()}}}},89287:(t,e,r)=>{"use strict";r.d(e,{Z:()=>s});let n=/📄 Session log: (.+?\/([^\/\s]+\.jsonl))/,a=/Request ID: ([^\s\n]+)/,i=/Summary: (.+?)(?:\n─|$)/s;function s(t){let e={content:t},r=n.exec(t);r&&(e.logFileName=r[2]);let s=a.exec(t);s&&(e.requestId=s[1]);let o=i.exec(t);return o&&(e.summary=o[1].trim()),e}},62648:(t,e,r)=>{"use strict";r.d(e,{Lm:()=>D,Uv:()=>E,YI:()=>$,_f:()=>S,i_:()=>w,xd:()=>I,ym:()=>k});var n=r(10927),a=r(19377),i=r(92900),s=r(4633),o=r(61282),l=r(21764),u=r(20629);let c=(0,l.promisify)(o.exec);function d(t){return t instanceof Error?t.message:String(t)}let f=["$","%","#"],m=null;async function h(){if(m)return m;let t=process.env.CLAUDE_PATH;if(t&&(/^[/a-zA-Z0-9._-]+$/.test(t)?!t.includes("..")||(console.log("[claude-session] CLAUDE_PATH contains path traversal sequence, ignoring"),!1):(console.log(`[claude-session] CLAUDE_PATH contains invalid characters, ignoring: ${t.substring(0,50)}`),!1)))try{return await (0,u.access)(t,u.constants.X_OK),m=t}catch{console.log(`[claude-session] CLAUDE_PATH is not executable: ${t}`)}try{let{stdout:t}=await c("which claude",{timeout:5e3});return m=t.trim()}catch{for(let t of["/opt/homebrew/bin/claude","/usr/local/bin/claude","/usr/bin/claude"])try{return await c(`test -x "${t}"`,{timeout:1e3}),m=t}catch{}throw Error("Claude CLI not found. Set CLAUDE_PATH environment variable or install Claude CLI.")}}async function p(t,e=50){let r=await (0,n.xq)(t,{startLine:-e});return(0,a.vp)(r)}async function w(t){try{let e=(await p(t)).trim();if(""===e)return{healthy:!1,reason:"empty output"};if(a.V7.test(e))return{healthy:!0};let r=e.split("\n").filter(t=>""!==t.trim()),n=r.slice(-10).join("\n");for(let t of a.KJ)if(n.includes(t))return{healthy:!1,reason:`error pattern: ${t}`};for(let t of a.dR)if(t.test(n))return{healthy:!1,reason:`error pattern: ${t.source}`};let i=r[r.length-1]?.trim()??"";if(i.length>=40)return{healthy:!0};if(f.some(t=>!(!i.endsWith(t)||"%"===t&&/\d+%$/.test(i))))return{healthy:!1,reason:`shell prompt ending detected: ${i}`};return{healthy:!0}}catch{return{healthy:!1,reason:"capture error"}}}async function g(t){let e=await w(t);return!!e.healthy||(console.warn(`[health-check] Session ${t} unhealthy: ${e.reason}`),await (0,n.AJ)(t),!1)}async function y(t){await c("tmux set-environment -g -u CLAUDECODE 2>/dev/null || true"),await (0,n.Is)(t,"unset CLAUDECODE",!0),await new Promise(t=>setTimeout(t,100))}function x(t){return`mcbd-claude-${t}`}async function E(){try{return await c("which claude",{timeout:5e3}),!0}catch{return!1}}async function $(t){let e=x(t);if(!await (0,n.Hk)(e))return!1;let r=await w(e);return!!r.healthy||(console.warn(`[isClaudeRunning] Session ${e} unhealthy: ${r.reason}`),!1)}async function C(t,e=5e3){let r=Date.now();for(;Date.now()-r<e;){let e=await p(t);if(a.V7.test(e))return;await new Promise(t=>setTimeout(t,200))}throw Error(`Prompt detection timeout (${e}ms)`)}async function k(t){let{worktreeId:e,worktreePath:r}=t;if(!await E())throw Error("Claude CLI is not installed or not in PATH");let i=x(e);if(await (0,n.Hk)(i)&&await g(i)){console.log(`Claude session ${i} already exists and is healthy`);return}try{await (0,n.ed)({sessionName:i,workingDirectory:r,historyLimit:5e4}),await y(i);let t=await h();await (0,n.Is)(i,t,!0);let e=Date.now(),s=!1,o=!1;for(;Date.now()-e<15e3;){await new Promise(t=>setTimeout(t,300));try{let t=await p(i);if(a.V7.test(t)){await new Promise(t=>setTimeout(t,500)),console.log(`Claude initialized in ${Date.now()-e}ms`),s=!0;break}!o&&a.H3.test(t)&&(await (0,n.Is)(i,"",!0),o=!0,console.log("Trust dialog detected, sending Enter to confirm"))}catch{}}if(!s)throw Error("Claude initialization timeout (15000ms)");console.log(`Started Claude session: ${i}`)}catch(t){throw m=null,console.log(`[claude-session] Session start failed: ${d(t)}`),Error("Failed to start Claude session")}}async function I(t,e){let r=x(t);if(!await (0,n.Hk)(r))throw Error(`Claude session ${r} does not exist. Start the session first.`);let o=await p(r);a.V7.test(o)||await C(r,1e4),await new Promise(t=>setTimeout(t,500)),await (0,n.Is)(r,e,!1),await (0,n.Is)(r,"",!0),e.includes("\n")&&await (0,i.N)(r),(0,s.e5)(r),console.log(`Sent message to Claude session: ${r}`)}async function D(t,e=1e3){let r=x(t);if(!await (0,n.Hk)(r))throw Error(`Claude session ${r} does not exist`);try{return await (0,n.xq)(r,{startLine:-e})}catch(t){throw Error(`Failed to capture Claude output: ${d(t)}`)}}async function S(t){let e=x(t);try{await (0,n.Hk)(e)&&(await (0,n.Is)(e,"",!1),await (0,n.ZV)(e,"C-d"),(0,s.e5)(e),await new Promise(t=>setTimeout(t,500)));let t=await (0,n.AJ)(e);return t&&console.log(`Stopped Claude session: ${e}`),t}catch(t){return console.error(`Error stopping Claude session: ${d(t)}`),!1}}},19377:(t,e,r)=>{"use strict";r.d(e,{BN:()=>v,H3:()=>l,Hm:()=>w,KJ:()=>_,Sg:()=>b,V7:()=>s,Wg:()=>D,_r:()=>f,bl:()=>g,bs:()=>function t(e){switch(e){case"claude":return{promptPattern:s,separatorPattern:o,thinkingPattern:a,skipPatterns:[/^─{10,}$/,/^[>❯]\s*$/,a,/^\s*[⎿⏋]\s+Tip:/,/^\s*Tip:/,/^\s*\?\s*for shortcuts/,/to interrupt\)/,d]};case"codex":return{promptPattern:u,separatorPattern:c,thinkingPattern:i,skipPatterns:[/^─.*─+$/,/^›\s*$/,/^›\s+(Implement|Find and fix|Type)/,i,/^\s*\d+%\s+context left/,/^\s*for shortcuts$/,/╭─+╮/,/╰─+╯/,/•\s*Ran\s+/,/^\s*└/,/^\s*│/,/\(.*esc to interrupt\)/,d]};case"gemini":return{promptPattern:h,separatorPattern:/^[─━]{3,}$/m,thinkingPattern:p,skipPatterns:[/^[>❯]\s*$/,p,/^\s*$/,/Gemini\s+\d+\.\d+/,d]};case"vibe-local":return{promptPattern:k,separatorPattern:/^[·]{10,}$/m,thinkingPattern:I,skipPatterns:[k,I,/^\s*$/,/vibe-local|vibe-coder/,/ctx:\s*\d+%/,/Model\s+\w/,/Engine\s+\w/,/Mode\s+/,/RAM\s+/,/CWD\s+/,/^[·]{10,}$/,/✦\s*Ready/,/ESC:\s*stop/,d]};case"opencode":return{promptPattern:w,separatorPattern:$,thinkingPattern:y,skipPatterns:[...C]};default:return t("claude")}},d8:()=>d,dR:()=>P,lr:()=>C,n9:()=>x,nT:()=>E,vp:()=>A,ww:()=>m});let n=(0,r(43895).h)("cli-patterns"),a=RegExp(`[✻✽⏺\xb7∴✢✳✶⦿◉●○◌◎⊙⊚⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]\\s+.+…|esc to interrupt`,"m"),i=/•\s*(Planning|Searching|Exploring|Running|Thinking|Working|Reading|Writing|Analyzing|Ran|Deciding)/m,s=/^[>❯](\s*$|\s+\S)/m,o=/^─{10,}$/m,l=/Yes, I trust this folder/m,u=/^›\s*/m,c=/^─.*Worked for.*─+$/m,d=/\[Pasted text #\d+/,f=500,m=3,h=/^[>❯]\s*$/m,p=/[\u2800-\u28FF]|Thinking\.\.\./,w=/Ask anything\.\.\./,g=/tab agents\s+ctrl\+p commands/,y=/Thinking:/,x=/\u25A3\s+\w+\s+\u00b7\s+\S+(?:\s+\u00b7\s+(?:[\d]+h\s*)?(?:[\d]+m\s*)?[\d.]+s)?/,E=/esc interrupt/,$=/^[\u2503\u2579\u25A3\u2580\u2500\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C]+$/,C=[$,/\u2B1D{4,}/,/^Build\s+/,g,E,w,d],k=/ctx:\d+%\s*[>❯]/m,I=/[\u2800-\u28FF]|Thinking|⠋|⠙|⠹|⠸|⠼|⠴|⠦|⠧|⠇|⠏|Running|Executing/;function D(t,e){let r;let s=n.withContext({cliToolId:t});switch(s.debug("detectThinking:check",{contentLength:e.length}),t){case"claude":default:r=a.test(e);break;case"codex":r=i.test(e);break;case"gemini":r=p.test(e);break;case"vibe-local":r=I.test(e);break;case"opencode":r=y.test(e)}return s.debug("detectThinking:result",{isThinking:r}),r}let S=/\x1b\[[0-9;]*[a-zA-Z]|\x1b\][^\x07]*\x07|\[[0-9;]*m/g;function A(t){return t.replace(S,"")}function v(t){return t.split("\n").map(t=>/^[\u2502\u2503\u256D\u256E\u256F\u2570\u2500\u2579\u2580\s]+$/.test(t)?"":t.replace(/^\s*[\u2502\u2503]\s?/,"").replace(/\s*[\u2502\u2503]$/,"")).join("\n")}let _=["Claude Code cannot be launched inside another Claude Code session"],P=[/^Error:.*Claude Code/];function b(t){if("claude"===t||"opencode"===t)return{requireDefaultIndicator:!1}}},76966:(t,e,r)=>{"use strict";r.d(e,{o:()=>i});var n=r(75748),a=r(98636);async function i(t,e,r,i="claude"){let s=(0,n.vX)(t,e);if(s)try{await (0,a.xN)(e,s.content,r,i)}catch(t){console.error("[recordClaudeConversation] Failed to create log file:",t)}}},98636:(t,e,r)=>{"use strict";r.d(e,{e7:()=>f,xN:()=>d});var n=r(20629),a=r.n(n),i=r(55315),s=r.n(i),o=r(73853),l=r(98241);function u(t="claude"){return s().join((0,l.s)(),t)}async function c(t="claude"){let e=u(t);try{await a().access(e)}catch{await a().mkdir(e,{recursive:!0})}}async function d(t,e,r,n="claude"){await c(n);let i=function(t,e="claude"){let r=(0,o.WU)(new Date,"yyyy-MM-dd"),n=`${t}-${r}.md`,a=u(e);return s().join(a,n)}(t,n),l=(0,o.WU)(new Date,"yyyy-MM-dd HH:mm:ss"),d="";try{d=await a().readFile(i,"utf-8")}catch{let e="claude"===n?"Claude Code":"codex"===n?"Codex CLI":"Gemini CLI";d=`# ${e} Conversation Log: ${t}
|
|
2
2
|
|
|
3
3
|
Created: ${l}
|
|
4
4
|
|
|
@@ -16,4 +16,4 @@ ${r}
|
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
19
|
-
`,await a().writeFile(i,d,"utf-8"),i}async function f(t,e="all"){let r=[];for(let n of"all"===e?["claude","codex","gemini"]:[e]){await
|
|
19
|
+
`,await a().writeFile(i,d,"utf-8"),i}async function f(t,e="all"){let r=[];for(let n of"all"===e?["claude","codex","gemini"]:[e]){await c(n);let e=u(n);try{let n=(await a().readdir(e)).filter(e=>e.startsWith(`${t}-`)&&e.endsWith(".md")).map(t=>s().join(e,t));r.push(...n)}catch{}}return r.sort().reverse()}},43895:(t,e,r)=>{"use strict";r.d(e,{Y:()=>l,h:()=>u});var n=r(98838);let a=[{pattern:/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi,replacement:"Bearer [REDACTED]"},{pattern:/(password|passwd|pwd)[=:]\s*\S+/gi,replacement:"$1=[REDACTED]"},{pattern:/(token|secret|api_key|apikey|auth)[=:]\s*\S+/gi,replacement:"$1=[REDACTED]"},{pattern:/Authorization:\s*\S+/gi,replacement:"Authorization: [REDACTED]"},{pattern:/-----BEGIN\s+\w+\s+PRIVATE\s+KEY-----[\s\S]*?-----END\s+\w+\s+PRIVATE\s+KEY-----/g,replacement:"[SSH_KEY_REDACTED]"}],i=/password|secret|token|key|auth/i,s={debug:0,info:1,warn:2,error:3};function o(t,e,r,o,l){let u=(0,n.LI)().level;if(s[t]<s[u])return;let c=o?function t(e){if("string"==typeof e){let t=e;for(let{pattern:e,replacement:r}of a)t=t.replace(e,r);return t}if("object"==typeof e&&null!==e){if(Array.isArray(e))return e.map(t);let r={};for(let[n,a]of Object.entries(e))i.test(n)?r[n]="[REDACTED]":r[n]=t(a);return r}return e}(o):void 0,d=function(t){if("json"===(0,n.LI)().format)return JSON.stringify(t);let{timestamp:e,level:r,module:a,action:i,data:s,worktreeId:o,cliToolId:l,requestId:u}=t,c=[o,l].filter(Boolean),d=c.length>0?` [${c.join(":")}]`:"",f=u?` (${u.slice(0,8)})`:"",m=s?` ${JSON.stringify(s)}`:"";return`[${e}] [${r.toUpperCase()}] [${a}]${d}${f} ${i}${m}`}({level:t,module:e,action:r,timestamp:new Date().toISOString(),...l,...c&&{data:c}});switch(t){case"error":console.error(d);break;case"warn":console.warn(d);break;default:console.log(d)}}function l(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)})}function u(t){let e=r=>({debug:(e,n)=>o("debug",t,e,n,r),info:(e,n)=>o("info",t,e,n,r),warn:(e,n)=>o("warn",t,e,n,r),error:(e,n)=>o("error",t,e,n,r),withContext:t=>e({...r,...t})});return e()}},92900:(t,e,r)=>{"use strict";r.d(e,{N:()=>s});var n=r(10927),a=r(19377);let i=(0,r(43895).h)("pasted-text");async function s(t){for(let e=0;e<a.ww;e++){await new Promise(t=>setTimeout(t,a._r));let r=await (0,n.xq)(t,{startLine:-10});if(!a.d8.test((0,a.vp)(r)))return;await (0,n.Is)(t,"",!0),e===a.ww-1&&i.warn("Pasted text detection: max retries reached",{sessionName:t,maxRetries:a.ww,finalAttempt:e})}}},4633:(t,e,r)=>{"use strict";r.d(e,{B$:()=>n,FI:()=>c,UE:()=>o,e5:()=>l,eK:()=>u,sB:()=>s});let n=1e4;function a(){return globalThis.__tmuxCaptureCache??=new Map}function i(){return globalThis.__tmuxCaptureCacheInflight??=new Map}function s(t,e){if(""===t)return"";let r=t.split("\n");return e>=r.length?t:r.slice(-e).join("\n")}function o(t,e,r){let n=a(),i=Date.now();for(let[t,e]of n)i-e.timestamp>2e3&&n.delete(t);if(n.size>=100&&!n.has(t)){let t=null,e=1/0;for(let[r,a]of n)a.timestamp<e&&(e=a.timestamp,t=r);t&&n.delete(t)}n.set(t,{output:e,capturedLines:r,timestamp:i})}function l(t){a().delete(t),console.debug("invalidateCache:",{sessionName:t})}function u(){a().clear(),i().clear()}async function c(t,e,r){let l=function(t,e){let r=a(),n=r.get(t);return n?Date.now()-n.timestamp>2e3?(r.delete(t),null):e>n.capturedLines?null:s(n.output,e):null}(t,e);if(null!==l)return l;let u=i(),c=u.get(t);if(c)return s(await c,e);let d=r();u.set(t,d);try{let r=await d;return r.length>0&&o(t,r,n),s(r,e)}finally{u.delete(t)}}},10927:(t,e,r)=>{"use strict";r.d(e,{AJ:()=>f,Hk:()=>i,Is:()=>l,LF:()=>s,ZV:()=>h,ed:()=>o,hL:()=>c,xq:()=>d});var n=r(61282);let a=(0,r(21764).promisify)(n.execFile);async function i(t){try{return await a("tmux",["has-session","-t",t],{timeout:5e3}),!0}catch{return!1}}async function s(){try{let{stdout:t}=await a("tmux",["list-sessions","-F","#{session_name}|#{session_windows}|#{session_attached}"],{timeout:5e3});if(!t||""===t.trim())return[];return t.trim().split("\n").map(t=>{let[e,r,n]=t.split("|");return{name:e,windows:parseInt(r,10)||0,attached:"1"===n}})}catch{return[]}}async function o(t,e){let r,n,i;"string"==typeof t?(r=t,n=e,i=5e4):(r=t.sessionName,n=t.workingDirectory,i=t.historyLimit||5e4);try{await a("tmux",["new-session","-d","-s",r,"-c",n],{timeout:5e3}),await a("tmux",["set-option","-t",r,"history-limit",String(i)],{timeout:5e3})}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to create tmux session: ${t}`)}}async function l(t,e,r=!0){try{await a("tmux",r?["send-keys","-t",t,e,"C-m"]:["send-keys","-t",t,e],{timeout:5e3})}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to send keys to tmux session: ${t}`)}}let u=new Set(["Up","Down","Left","Right","Enter","Space","Tab","Escape","BSpace","DC"]);async function c(t,e){if(0!==e.length){for(let t of e)if(!u.has(t))throw Error(`Invalid special key: ${t}`);try{for(let r=0;r<e.length;r++)await a("tmux",["send-keys","-t",t,e[r]],{timeout:5e3}),r<e.length-1&&await new Promise(t=>setTimeout(t,100))}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to send special keys to tmux session: ${t}`)}}}async function d(t,e){let r,n;"number"==typeof e?(r=-e,n="-"):e?(r=e.startLine??-1e4,n=e.endLine??"-"):(r=-1e3,n="-");try{let{stdout:e}=await a("tmux",["capture-pane","-t",t,"-p","-e","-S",String(r),"-E",String(n)],{timeout:5e3,maxBuffer:10485760});return e}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to capture pane: ${t}`)}}async function f(t){try{return await a("tmux",["kill-session","-t",t],{timeout:5e3}),!0}catch(e){let t=e instanceof Error?e.message:String(e);if(t?.includes("no server running")||t?.includes("can't find session"))return!1;throw Error(`Failed to kill tmux session: ${t}`)}}let m=new Set(["Escape","C-c","C-d","C-m","Enter"]);async function h(t,e){if(!m.has(e))throw Error(`Invalid special key: ${e}`);try{await a("tmux",["send-keys","-t",t,e],{timeout:5e3})}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to send special key: ${t}`)}}},68507:(t,e,r)=>{"use strict";r.d(e,{fM:()=>d,ps:()=>f,ZV:()=>m});var n=r(34893);r(40824);let a=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/,i=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\/(\d{1,2})$/,s=process.env.CM_ALLOWED_IPS?.trim()||"",o=process.env.CM_TRUST_PROXY?.trim()||"";""!==o&&"true"!==o&&"false"!==o&&console.warn(`[IP-RESTRICTION] CM_TRUST_PROXY has unexpected value: "${o}". Only "true" (lowercase) enables proxy trust.`),s.length>0&&function(t){let e=t.trim();if(0===e.length)return;let r=e.split(",").map(t=>t.trim()).filter(t=>t.length>0);if(r.length>256)throw Error(`CM_ALLOWED_IPS: too many entries (${r.length}). Maximum is 256.`);let n=[];for(let t of r){if(t.length>18)throw Error(`CM_ALLOWED_IPS: entry "${t}" exceeds maximum length of 18 characters.`);let e=t.match(i);if(e){let r=[parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3],10),parseInt(e[4],10)],a=parseInt(e[5],10);for(let e of r)if(e<0||e>255)throw Error(`CM_ALLOWED_IPS: invalid octet in "${t}". Octets must be 0-255.`);if(a<0||a>32)throw Error(`CM_ALLOWED_IPS: invalid prefix length in "${t}". Must be 0-32.`);let i=(r[0]<<24|r[1]<<16|r[2]<<8|r[3])>>>0,s=0===a?0:4294967295<<32-a>>>0;n.push({network:(i&s)>>>0,mask:s});continue}let r=t.match(a);if(r){let e=[parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10),parseInt(r[4],10)];for(let r of e)if(r<0||r>255)throw Error(`CM_ALLOWED_IPS: invalid octet in "${t}". Octets must be 0-255.`);let a=(e[0]<<24|e[1]<<16|e[2]<<8|e[3])>>>0;n.push({network:a,mask:4294967295});continue}throw Error(`CM_ALLOWED_IPS: invalid entry "${t}". Expected IPv4 address or CIDR notation.`)}}(s);let l=new Map,u=new Map;function c(t,e){let r=u.get(t);if(r&&0!==r.size)try{let a=JSON.stringify({type:"broadcast",worktreeId:t,data:e});r.forEach(t=>{if(t.readyState===n.XY.OPEN)try{t.send(a)}catch(t){console.error("Error sending WebSocket message to client:",t)}})}catch(e){console.error(`Error broadcasting to worktree ${t}:`,e);try{let e=JSON.stringify({type:"broadcast",worktreeId:t,data:{error:"Message encoding error"}});r.forEach(t=>{if(t.readyState===n.XY.OPEN)try{t.send(e)}catch{}})}catch(t){console.error("Failed to send fallback message:",t)}}}function d(t,e){c(t,e)}function f(t,e){e.worktreeId?c(e.worktreeId,{type:t,...e}):console.warn("broadcastMessage called without worktreeId")}function m(t){for(let e of t){let t=u.get(e);t&&(t.forEach(t=>{let r=l.get(t);r&&r.worktreeIds.delete(e)}),u.delete(e))}}}};
|