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.
Files changed (161) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +19 -23
  3. package/.next/app-path-routes-manifest.json +1 -1
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/cache/.tsbuildinfo +1 -1
  6. package/.next/cache/config.json +3 -3
  7. package/.next/cache/webpack/client-production/0.pack +0 -0
  8. package/.next/cache/webpack/client-production/1.pack +0 -0
  9. package/.next/cache/webpack/client-production/2.pack +0 -0
  10. package/.next/cache/webpack/client-production/index.pack +0 -0
  11. package/.next/cache/webpack/client-production/index.pack.old +0 -0
  12. package/.next/cache/webpack/edge-server-production/0.pack +0 -0
  13. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  14. package/.next/cache/webpack/server-production/0.pack +0 -0
  15. package/.next/cache/webpack/server-production/index.pack +0 -0
  16. package/.next/next-server.js.nft.json +1 -1
  17. package/.next/prerender-manifest.json +1 -1
  18. package/.next/react-loadable-manifest.json +69 -55
  19. package/.next/required-server-files.json +1 -1
  20. package/.next/server/app/_not-found/page.js +1 -1
  21. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/app/update-check/route.js +1 -1
  24. package/.next/server/app/api/repositories/clone/route.js +1 -1
  25. package/.next/server/app/api/repositories/route.js +8 -8
  26. package/.next/server/app/api/repositories/scan/route.js +1 -1
  27. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -2
  28. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  29. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  30. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  31. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  32. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  33. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  34. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  35. package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
  36. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  37. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  38. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  39. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  40. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  41. package/.next/server/app/api/worktrees/route.js +1 -1
  42. package/.next/server/app/login/page.js +1 -1
  43. package/.next/server/app/login/page.js.nft.json +1 -1
  44. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  45. package/.next/server/app/page.js +3 -3
  46. package/.next/server/app/page.js.nft.json +1 -1
  47. package/.next/server/app/page_client-reference-manifest.js +1 -1
  48. package/.next/server/app/proxy/[...path]/route.js +4 -4
  49. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
  50. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  51. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  52. package/.next/server/app/worktrees/[id]/page.js +6 -6
  53. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  54. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/worktrees/[id]/terminal/page.js +2 -4
  56. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  57. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  58. package/.next/server/app-paths-manifest.json +8 -8
  59. package/.next/server/chunks/{3294.js → 1628.js} +3 -3
  60. package/.next/server/chunks/185.js +36 -0
  61. package/.next/server/chunks/3860.js +1 -1
  62. package/.next/server/chunks/4893.js +2 -2
  63. package/.next/server/chunks/4952.js +1 -1
  64. package/.next/server/chunks/5488.js +6 -6
  65. package/.next/server/chunks/7425.js +34 -31
  66. package/.next/server/chunks/7566.js +2 -2
  67. package/.next/server/chunks/8199.js +1 -0
  68. package/.next/server/chunks/8585.js +1 -1
  69. package/.next/server/chunks/8693.js +1 -1
  70. package/.next/server/middleware-build-manifest.js +1 -1
  71. package/.next/server/middleware-manifest.json +5 -5
  72. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  73. package/.next/server/pages/500.html +1 -1
  74. package/.next/server/server-reference-manifest.json +1 -1
  75. package/.next/static/chunks/12-00c528d46a0a0a1d.js +1 -0
  76. package/.next/static/chunks/{13.feeafc7cc620f8c4.js → 13.b9521543496f4468.js} +1 -1
  77. package/.next/static/chunks/1334.bfedf44ee9fe2761.js +1 -0
  78. package/.next/static/chunks/143.eb6b4671490cd223.js +1 -0
  79. package/.next/static/chunks/{3574.7a94c27e6a496a56.js → 1442.74b5f4de9a4b4e1b.js} +1 -1
  80. package/.next/static/chunks/2083-b5bed0c77cc53281.js +1 -0
  81. package/.next/static/chunks/2725.eb2d236c8030711c.js +1 -0
  82. package/.next/static/chunks/3398-3d40a17387bd554b.js +1 -0
  83. package/.next/static/chunks/3516.3c576047408cae6b.js +1 -0
  84. package/.next/static/chunks/3559.422c6ca760b85750.js +1 -0
  85. package/.next/static/chunks/3956.52c5b9a0071a641d.js +1 -0
  86. package/.next/static/chunks/4012.32b576a4fa621774.js +1 -0
  87. package/.next/static/chunks/4212.e7ba1009bc1da62d.js +131 -0
  88. package/.next/static/chunks/4303.caf91e86105d5e70.js +1 -0
  89. package/.next/static/chunks/4327.4dcda9b6fab6a385.js +82 -0
  90. package/.next/static/chunks/4671.d86d21d0dfdace41.js +1 -0
  91. package/.next/static/chunks/5518.ec88dcb5a27b17fe.js +1 -0
  92. package/.next/static/chunks/6434.08d262283371d333.js +1 -0
  93. package/.next/static/chunks/{656.5e2de0173f5a06bd.js → 656.dc26b973d07d9627.js} +5 -5
  94. package/.next/static/chunks/7119.01777af21b55740c.js +1 -0
  95. package/.next/static/chunks/7293.fb88bb102af4aa04.js +1 -0
  96. package/.next/static/chunks/8913-40625650292eb3d0.js +1 -0
  97. package/.next/static/chunks/8977.fc18b8260cd8bc1f.js +1 -0
  98. package/.next/static/chunks/9552.d959149efd41e84b.js +1 -0
  99. package/.next/static/chunks/app/layout-7198a7a49aa21a97.js +1 -0
  100. package/.next/static/chunks/app/page-7498cf75e69d9227.js +1 -0
  101. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-0599f64a8e80d255.js +1 -0
  102. package/.next/static/chunks/app/worktrees/[id]/page-94ad7a1ce1f0c440.js +1 -0
  103. package/.next/static/chunks/app/worktrees/[id]/terminal/page-175b618c047bc992.js +1 -0
  104. package/.next/static/chunks/d3ac728e.daf595a898e9b720.js +1 -0
  105. package/.next/static/chunks/webpack-f7111aab807d73b9.js +1 -0
  106. package/.next/static/css/f7dc01350168df01.css +3 -0
  107. package/.next/trace +5 -5
  108. package/README.md +66 -56
  109. package/dist/server/server.js +5 -0
  110. package/dist/server/src/lib/auto-yes-manager.js +58 -18
  111. package/dist/server/src/lib/claude-session.js +9 -3
  112. package/dist/server/src/lib/cli-session.js +60 -10
  113. package/dist/server/src/lib/cli-tools/codex.js +7 -7
  114. package/dist/server/src/lib/cli-tools/gemini.js +3 -0
  115. package/dist/server/src/lib/cli-tools/opencode-config.js +179 -33
  116. package/dist/server/src/lib/cli-tools/opencode.js +5 -0
  117. package/dist/server/src/lib/cli-tools/vibe-local.js +3 -0
  118. package/dist/server/src/lib/cmate-parser.js +7 -7
  119. package/dist/server/src/lib/db-migrations.js +18 -1
  120. package/dist/server/src/lib/errors.js +153 -0
  121. package/dist/server/src/lib/prompt-answer-sender.js +3 -0
  122. package/dist/server/src/lib/prompt-detector.js +49 -7
  123. package/dist/server/src/lib/resource-cleanup.js +257 -0
  124. package/dist/server/src/lib/schedule-manager.js +269 -83
  125. package/dist/server/src/lib/tmux-capture-cache.js +221 -0
  126. package/dist/server/src/lib/tmux.js +41 -20
  127. package/dist/server/src/types/markdown-editor.js +9 -1
  128. package/package.json +11 -8
  129. package/.next/server/chunks/539.js +0 -35
  130. package/.next/server/chunks/7458.js +0 -1
  131. package/.next/server/chunks/7808.js +0 -1
  132. package/.next/static/chunks/1038-3509435b68c0967e.js +0 -1
  133. package/.next/static/chunks/1098.49268c9fe1b028fa.js +0 -1
  134. package/.next/static/chunks/2335-98a211e00b94c7ac.js +0 -1
  135. package/.next/static/chunks/3559.f073f72c4466ce0e.js +0 -1
  136. package/.next/static/chunks/3843.3fdda732987f7bb8.js +0 -1
  137. package/.next/static/chunks/4212.52c1bb34fc97d0d0.js +0 -131
  138. package/.next/static/chunks/4327.157a4c226d919531.js +0 -60
  139. package/.next/static/chunks/4362.7bd6f0282e49d79b.js +0 -1
  140. package/.next/static/chunks/4721.40615a5f4f32b5fb.js +0 -1
  141. package/.next/static/chunks/5112.17318d1c6b28044b.js +0 -1
  142. package/.next/static/chunks/6406.9653f0d41ab85059.js +0 -1
  143. package/.next/static/chunks/6792.3c01ac4dda4b5c6d.js +0 -1
  144. package/.next/static/chunks/8091-d65d2ab6daed23c6.js +0 -1
  145. package/.next/static/chunks/8125.245a9df052d274fb.js +0 -1
  146. package/.next/static/chunks/8522.1607e96011c66877.js +0 -1
  147. package/.next/static/chunks/8841.dadeb1ece8e46004.js +0 -1
  148. package/.next/static/chunks/8885.f8d9912b40d74811.js +0 -1
  149. package/.next/static/chunks/9178-88850a7c48deea07.js +0 -1
  150. package/.next/static/chunks/9552.b7dfb7903ead934b.js +0 -1
  151. package/.next/static/chunks/app/layout-9110f9a5e41c6bf4.js +0 -1
  152. package/.next/static/chunks/app/page-9e523a8f415bc707.js +0 -1
  153. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-4a3c0861367e0391.js +0 -1
  154. package/.next/static/chunks/app/worktrees/[id]/page-8fb4dc30b58a5681.js +0 -1
  155. package/.next/static/chunks/app/worktrees/[id]/terminal/page-5d85a7e508ce36d3.js +0 -1
  156. package/.next/static/chunks/d3ac728e.6c9c508274d4d2d5.js +0 -1
  157. package/.next/static/chunks/webpack-81c97591dd5567ac.js +0 -1
  158. package/.next/static/css/45b3a41370668314.css +0 -3
  159. /package/.next/static/chunks/{30d07d85-393352a92199f695.js → 30d07d85.1dc99a921fc18e34.js} +0 -0
  160. /package/.next/static/{p3hosTZoJ22r35fWwUoLr → dwGMLEU53HOvFOWqiZOT0}/_buildManifest.js +0 -0
  161. /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:()=>h});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"}},g=!1;class h{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?(g||(console.warn("[DEPRECATED] WORKTREE_BASE_PATH is deprecated. Set CM_ROOT_DIR in your .env file instead."),g=!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=this.validateCloneRequest(e);if(!r.valid)return{success:!1,error:r.error};let o=r.normalizedUrl,a=r.repoName,n=this.checkDuplicateRepository(o);if(n)return{success:!1,error:{...p.DUPLICATE_CLONE_URL,message:`This repository is already registered as "${n.name}"`}};let i=this.checkActiveCloneJob(o);if(i)return{success:!1,jobId:i.id,error:p.CLONE_IN_PROGRESS};let c=t||this.getTargetPath(a);if(t&&!(0,l.j)(t,this.config.basePath))return{success:!1,error:p.INVALID_TARGET_PATH};if((0,s.existsSync)(c))return{success:!1,error:p.DIRECTORY_EXISTS};let d=this.createCloneJob({cloneUrl:e,normalizedCloneUrl:o,targetPath:c});return this.executeClone(d.id,e,c).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:()=>_,Bm:()=>f,L_:()=>v,RT:()=>R,VZ:()=>h,fC:()=>b,h4:()=>c,mm:()=>E,nJ:()=>m,nb:()=>d,sN:()=>C});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(`
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 g(e){return a().resolve(e)}function h(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=g(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=g(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(g(e)))}(e,t),o=t.filter(e=>!r.includes(e));return{filteredPaths:r,excludedPaths:o,excludedCount:o.length}}function E(e,t){let r=g(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 _(e){return e.prepare("SELECT * FROM repositories WHERE enabled = 0 ORDER BY name ASC").all().map(i)}function R(e,t){let r=u(e,g(t));return r?(p(e,r.id,{enabled:!0}),{...r,enabled:!0}):null}function f(e,t){let r=(0,o.randomUUID)(),s=Date.now();return e.prepare(`
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 v(e,t){let r=e.prepare(`
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 C(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(`
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 b(e,t){let r=e.prepare(`
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,{j:()=>a});var o=r(55315),s=r.n(o);function a(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))}},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)}}}};
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:()=>o}),s(92048);var r=s(55315);function o(){let e=(0,r.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:()=>o});let r=["/etc","/usr","/bin","/sbin","/var","/tmp","/dev","/sys","/proc"];function o(e){return r.some(t=>e.startsWith(t))}},83513:(e,t,s)=>{s.d(t,{Ho:()=>a,Ns:()=>i,Y1:()=>l,ZP:()=>n,_7:()=>o,tK:()=>r});let r=["claude","codex","gemini","vibe-local","opencode"];function o(e){return r.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 r=s(85890),o=s.n(r),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(`
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),r=i().basename(t);s.run(t,r,e.id)}let r=e.prepare(`
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);r.run(e,t.timestamp,s.id)}}},down:e=>{e.exec(`
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),r=i().basename(t);s.run(t,r,e.id)}},down:()=>{console.log("No rollback needed for repository path fix")}},{version:4,name:"add-favorite-field",up:e=>{e.exec(`
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),r=e.prepare(`
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(),o=e.prepare(`
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)o.run(t(),e.id,e.memo,a,a);console.log(`✓ Created worktree_memos table`),console.log(`✓ Migrated ${r.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(`
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)")}}];function _(e){let t=s(92048),r=e;for(;r!==i().dirname(r);){let e=i().join(r,".git");if(t.existsSync(e)){let s=t.statSync(e);if(s.isDirectory())return r;if(s.isFile()){let s=t.readFileSync(e,"utf-8").trim().match(/^gitdir:\s*(.+)$/);if(s)return s[1].split("/.git/")[0]}}r=i().dirname(r)}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),r=i().dirname(e);t.existsSync(r)||t.mkdirSync(r,{recursive:!0,mode:448}),(T=new(o())(e)).pragma("foreign_keys = ON"),function(e){!function(e){e.exec(`
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:()=>b,ER:()=>l,Ek:()=>B,GA:()=>S,GP:()=>x,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 r=s(84770),o=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(`
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
- `,r=[];t&&(s+=" WHERE w.repository_path = ?",r.push(t)),s+=" ORDER BY w.updated_at DESC NULLS LAST";let a=e.prepare(s).all(...r),i=function(e,t){if(0===t.length)return new Map;let s=t.map(()=>"?").join(","),r=e.prepare(`
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),o=new Map;for(let e of t)o.set(e,{});for(let e of r){let t=o.get(e.worktree_id)||{};t[e.cli_tool_id]=e.content.substring(0,50),o.set(e.worktree_id,t)}return o}(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,o.e7)(e.selected_agents),vibeLocalModel:e.vibe_local_model??null,vibeLocalContextWindow:e.vibe_local_context_window??null}})}function l(e){return e.prepare(`
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,o.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(`
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,r.randomUUID)();return e.prepare(`
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,r=50,o){let i=`
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 o&&(i+=" AND cli_tool_id = ?",n.push(o)),i+=" ORDER BY timestamp DESC LIMIT ?",n.push(r),e.prepare(i).all(...n).map(a)}function m(e,t){let s=e.prepare(`
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 r=e.prepare(`
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 ${r.changes} messages for worktree: ${t}, cliTool: ${s}`),r.changes}function w(e,t,s="claude"){let r=e.prepare(`
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 r?{worktreeId:r.worktree_id,cliToolId:r.cli_tool_id,lastCapturedLine:r.last_captured_line,inProgressMessageId:r.in_progress_message_id||null}:null}function g(e,t,s,r){e.prepare(`
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,r)}function I(e,t,s){!function(e,t,s,r){e.prepare(`
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,r){let o=e.prepare(`
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);o.run(a,r.getTime(),t)}function D(e,t){let s=e.prepare(`
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 S(e,t,s){e.prepare(`
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 x(e,t,s){let r=e.prepare(`
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===r.length)return 0;let o=e.prepare(`
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 r)try{let t=JSON.parse(e.prompt_data);t.status="answered",t.answer="(answered via terminal)",t.answeredAt=new Date().toISOString(),o.run(JSON.stringify(t),e.id),a++}catch{}return a}function k(e,t,s){e.prepare(`
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 F(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 b(e,t){return e.prepare(`
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(F)}function v(e,t){let s=e.prepare(`
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?F(s):null}function y(e,t,s){let o=(0,r.randomUUID)(),a=Date.now(),i=s.title??"Memo",n=s.content??"";return e.prepare(`
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(o,t,i,n,s.position,a,a),{id:o,worktreeId:t,title:i,content:n,position:s.position,createdAt:new Date(a),updatedAt:new Date(a)}}function M(e,t,s){let r=Date.now(),o=["updated_at = ?"],a=[r];void 0!==s.title&&(o.push("title = ?"),a.push(s.title)),void 0!==s.content&&(o.push("content = ?"),a.push(s.content)),a.push(t),e.prepare(`
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 ${o.join(", ")}
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 r=s(55315),o=s.n(r),a=s(19801),i=s(16672),n=s(43753);function l(){return(0,i.ZP)()?o().join((0,a.homedir)(),".commandmate","data","cm.db"):o().resolve(process.cwd(),"data","cm.db")}function _(e){let t=o().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 r=process.env[t];if(void 0!==r)return d.has(t)||(console.warn(`[DEPRECATED] ${t} is deprecated, use ${e} instead`),d.add(t)),r}(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),r=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"!==r&&"0.0.0.0"!==r&&"localhost"!==r)throw Error(`Invalid CM_BIND: ${r}. 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:o().resolve(t),CM_PORT:s,CM_BIND:r,CM_DB_PATH:e}}},55483:(e,t,s)=>{s.d(t,{KE:()=>_,e7:()=>l});var r=s(83513);let o=/\x1b\[[0-9;]*[a-zA-Z]|\x1b\][^\x07]*\x07|\[[0-9;]*m/g;function a(e){return e.replace(o,"").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&&r.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"}}}};
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 u(n);let e=c(n);try{let n=(await a().readdir(e)).filter(e=>e.startsWith(`${t}-`)&&e.endsWith(".md")).map(t=>o().join(e,t));r.push(...n)}catch{}}return r.sort().reverse()}},43895:(t,e,r)=>{"use strict";r.d(e,{Y:()=>l,h:()=>c});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,o={debug:0,info:1,warn:2,error:3};function s(t,e,r,s,l){let c=(0,n.LI)().level;if(o[t]<o[c])return;let u=s?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}(s):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:o,worktreeId:s,cliToolId:l,requestId:c}=t,u=[s,l].filter(Boolean),d=u.length>0?` [${u.join(":")}]`:"",f=c?` (${c.slice(0,8)})`:"",h=o?` ${JSON.stringify(o)}`:"";return`[${e}] [${r.toUpperCase()}] [${a}]${d}${f} ${i}${h}`}({level:t,module:e,action:r,timestamp:new Date().toISOString(),...l,...u&&{data:u}});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 c(t){let e=r=>({debug:(e,n)=>s("debug",t,e,n,r),info:(e,n)=>s("info",t,e,n,r),warn:(e,n)=>s("warn",t,e,n,r),error:(e,n)=>s("error",t,e,n,r),withContext:t=>e({...r,...t})});return e()}},92900:(t,e,r)=>{"use strict";r.d(e,{N:()=>o});var n=r(10927),a=r(19377);let i=(0,r(43895).h)("pasted-text");async function o(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})}}},10927:(t,e,r)=>{"use strict";r.d(e,{AJ:()=>d,Hk:()=>i,Is:()=>s,ZV:()=>f,ed:()=>o,hL:()=>c,xq:()=>u});var n=r(61282);let a=(0,r(21764).promisify)(n.exec);async function i(t){try{return await a(`tmux has-session -t "${t}"`,{timeout:5e3}),!0}catch{return!1}}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 ${i}`,{timeout:5e3})}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to create tmux session: ${t}`)}}async function s(t,e,r=!0){let n=e.replace(/'/g,"'\\''"),i=r?`tmux send-keys -t "${t}" '${n}' C-m`:`tmux send-keys -t "${t}" '${n}'`;try{await a(i,{timeout:5e3})}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to send keys to tmux session: ${t}`)}}let l=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(!l.has(t))throw Error(`Invalid special key: ${t}`);try{for(let r=0;r<e.length;r++){let n=`tmux send-keys -t "${t}" ${e[r]}`;await a(n,{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 u(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 ${r} -E ${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 d(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}`)}}async function f(t,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:()=>h});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})$/,o=process.env.CM_ALLOWED_IPS?.trim()||"",s=process.env.CM_TRUST_PROXY?.trim()||"";""!==s&&"true"!==s&&"false"!==s&&console.warn(`[IP-RESTRICTION] CM_TRUST_PROXY has unexpected value: "${s}". Only "true" (lowercase) enables proxy trust.`),o.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,o=0===a?0:4294967295<<32-a>>>0;n.push({network:(i&o)>>>0,mask:o});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.`)}}(o);let l=new Map,c=new Map;function u(t,e){let r=c.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){u(t,e)}function f(t,e){e.worktreeId?u(e.worktreeId,{type:t,...e}):console.warn("broadcastMessage called without worktreeId")}function h(t){for(let e of t){let t=c.get(e);t&&(t.forEach(t=>{let r=l.get(t);r&&r.worktreeIds.delete(e)}),c.delete(e))}}}};
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))}}}};