alchemylab 1.0.11 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +10 -5
- package/dist/http-server.js +42 -37
- package/dist/index.js +7 -2
- package/dist/mcp-direct.js +7 -2
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -920,10 +920,15 @@ e&&(this.pollingStatus=n.AUTHENTICATED,this.tokenResult=e,this.stopPolling(),s&&
|
|
|
920
920
|
function s(){const e=process.env.ALCHEMY_OPENCODE_DIR
|
|
921
921
|
if(e)return e
|
|
922
922
|
try{const e=("undefined"!=typeof require?require:t(4245)).resolve("alchemylab-opencode/package.json")
|
|
923
|
-
return(0,o.dirname)(e)}catch{}}function r(e,t){return{command:
|
|
923
|
+
return(0,o.dirname)(e)}catch{}}function r(e,t){return{command:function(){try{const e=(0,i.execFileSync)("node",["--version"],{encoding:"utf8"}).trim()
|
|
924
|
+
if(parseInt(e.replace("v","").split(".")[0],10)>=a)return"node"}catch{}const e=process.env.NVM_DIR||(0,o.join)(process.env.HOME||"",".nvm"),t=(0,o.join)(e,"versions","node")
|
|
925
|
+
if((0,n.existsSync)(t))try{const e=(0,n.readdirSync)(t).filter((e=>parseInt(e.replace("v","").split(".")[0],10)>=a)).sort(((e,t)=>{const s=parseInt(e.replace("v","").split(".")[0],10)
|
|
926
|
+
return parseInt(t.replace("v","").split(".")[0],10)-s}))
|
|
927
|
+
if(e.length>0){const s=(0,o.join)(t,e[0],"bin","node")
|
|
928
|
+
if((0,n.existsSync)(s))return s}}catch{}throw Error(`AlchemyLab requires Node.js >= ${a} to run the OpenCode server.\nYour current version: ${process.version}\nInstall Node ${a}+: nvm install ${a} (or download from https://nodejs.org)`)}(),prependArgs:["--experimental-strip-types","--experimental-transform-types","--no-warnings","--import",(0,o.join)(e,"node-preload.mjs"),(0,o.join)(e,t)]}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveServeCommand=function(){const e=s()
|
|
924
929
|
return e?r((0,o.join)(e,"packages","opencode","src"),"serve.ts"):{command:"opencode",prependArgs:["serve"]}},exports.resolveRunCommand=function(){const e=s()
|
|
925
930
|
return e?r((0,o.join)(e,"packages","opencode","src"),"run.ts"):{command:"opencode",prependArgs:[]}}
|
|
926
|
-
const o=t(6928)},9266(e,exports,t){"use strict"
|
|
931
|
+
const o=t(6928),n=t(9896),i=t(5317),a=24},9266(e,exports,t){"use strict"
|
|
927
932
|
var s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}}
|
|
928
933
|
Object.defineProperty(exports,"__esModule",{value:!0}),exports.handleOpenCodeProxyAction=async function(e,t){const{method:s,path:i,body:a,headers:c}=e
|
|
929
934
|
if(!s||!i)return{success:!1,message:"method and path are required in proxy payload"}
|
|
@@ -1008,9 +1013,9 @@ const r=(0,h.join)(process.env.HOME||"/usr/local/bin",".local","bin")
|
|
|
1008
1013
|
await(0,u.mkdir)(r,{recursive:!0})
|
|
1009
1014
|
const o=(0,h.join)(r,"opencode")
|
|
1010
1015
|
return(0,g.execFileSync)("curl",["-fsSL","-o",o,t],{stdio:"inherit",timeout:6e4}),(0,g.execFileSync)("chmod",["+x",o],{stdio:"pipe"}),(process.env.PATH||"").split(":").includes(r)||(console.log(` \u26a0\ufe0f Add ${r} to your PATH:`),console.log(` export PATH="${r}:$PATH"`),console.log(""),process.env.PATH=`${r}:${process.env.PATH}`),void console.log("\u2705 OpenCode installed successfully")}}catch(e){console.log("\u26a0\ufe0f Binary download failed: "+(0,C.getErrorMessage)(e))}console.log(""),console.log("\u26a0\ufe0f Could not auto-install OpenCode."),console.log(""),console.log(" Install manually:"),console.log(" go install github.com/sst/opencode@latest"),console.log(" Or download from:"),console.log(" https://github.com/sst/opencode/releases"),console.log("")}(i)
|
|
1011
|
-
const
|
|
1012
|
-
console.log(["\n .oo 8 8 o 8 \n .P 8 8 8 8 8 \n .P 8 8 .oPYo. 8oPYo. .oPYo. ooYoYo. o o 8 .oPYo. 8oPYo. \n oPooo8 8 8 ' 8 8 8oooo8 8' 8 8 8 8 8 .oooo8 8 8 \n .P 8 8 8 . 8 8 8. 8 8 8 8 8 8 8 8 8 8 \n.P 8 8 `YooP' 8 8 `Yooo' 8 8 8 `YooP8 8oooo `YooP8 `YooP' \n..:::::....:.....:..:::..:.....:..:..:..:....8 ......:.....::.....:","::::::::::::::::::::::::::::::::::::::::::ooP'.::::::::::::::::::: v"+
|
|
1013
|
-
const
|
|
1016
|
+
const O=t()
|
|
1017
|
+
console.log(["\n .oo 8 8 o 8 \n .P 8 8 8 8 8 \n .P 8 8 .oPYo. 8oPYo. .oPYo. ooYoYo. o o 8 .oPYo. 8oPYo. \n oPooo8 8 8 ' 8 8 8oooo8 8' 8 8 8 8 8 .oooo8 8 8 \n .P 8 8 8 . 8 8 8. 8 8 8 8 8 8 8 8 8 8 \n.P 8 8 `YooP' 8 8 `Yooo' 8 8 8 `YooP8 8oooo `YooP8 `YooP' \n..:::::....:.....:..:::..:.....:..:..:..:....8 ......:.....::.....:","::::::::::::::::::::::::::::::::::::::::::ooP'.::::::::::::::::::: v"+O,"::::::::::::::::::::::::::::::::::::::::::...::::::::::::::::::::::\n"].join("\n")),console.log("\u{1f4c1} Project: "+i)
|
|
1018
|
+
const _=s.port||await(0,k.findAvailablePort)(3456),x=new y.AlchemyActionServer(b,{projectPath:i,remoteServerUrl:E,port:_,authToken:P})
|
|
1014
1019
|
try{await x.start()
|
|
1015
1020
|
let t=process.env.FRONTEND_URL
|
|
1016
1021
|
if(!t)if(E.includes("api.alchemylabcode.com"))t="https://alchemylabcode.com"
|
package/dist/http-server.js
CHANGED
|
@@ -2337,14 +2337,14 @@ const i=await l.default.readFile(o,"utf8"),{newContent:a,results:c}=await n(i,e.
|
|
|
2337
2337
|
r.replacements=c,r.successfulReplacements=c.filter((e=>e.success)).length,r.failedReplacements=c.filter((e=>!e.success)).length,a!==i?(await l.default.writeFile(o,a,"utf8"),t.documentFileManager.markForSync(e.documentId),r.success=!0,L++,y.info("Document updated successfully",{documentId:e.documentId,filename:r.filename,successfulReplacements:r.successfulReplacements,failedReplacements:r.failedReplacements})):0===r.failedReplacements&&(r.success=!0),N+=r.failedReplacements}catch(t){r.error=(0,m.getErrorMessage)(t),r.failedReplacements=e.replacements.length,N+=r.failedReplacements,y.error("Document operation failed",{documentId:e.documentId,error:r.error})}F.push(r)}if(P.length>0)try{for(const e of P){const r=F.find((t=>t.documentId===e.documentId))
|
|
2338
2338
|
r?.success&&await t.documentFileManager.syncDocument(e.documentId)}}catch(e){y.warn("Some documents may not have synced properly",{error:e})}const z=await d.handleMultiFileGitCommit(C,T,F,L,{operationType:"Replace strings",toolRecordId:b,successField:"successfulReplacements",logger:y,metrics:a,metricsPrefix:"replace_strings"},t),B=d.processMultiFileOperationResults(F,"successfulReplacements"),{successfulOperations:H,failedOperations:W,totalSuccessfulChanges:U,overallSuccess:G,successfulFiles:V,failedFiles:J}=B
|
|
2339
2339
|
try{await o.updateToolRecord(b,{metadata:{path:T.length>0?T[0].path:"document:"+P[0]?.documentId,status:G?"completed":"failed",error:G?void 0:W+" operations failed",totalOperations:F.length,successfulFiles:V,failedFiles:J,operations:D,totalSuccessfulReplacements:U,totalFailedReplacements:N,operationsWithChanges:L,processingTime:Date.now()-w,userComment:E,...T.length>0&&z.success&&z.commitHash&&{commitHash:z.commitHash,previousCommitHash:z.previousCommitHash||void 0}},note:G?`String replacement completed: ${H}/${F.length} operations successful${T.length>0?" (committed to git)":""}`:`String replacement partially failed: ${W}/${F.length} operations failed`})}catch(e){y.warn("Failed to update tool record",{recordError:e})}d.formatMultiFileToolResponse("String Replacement",{successfulOperations:H,failedOperations:W,totalSuccessfulChanges:U,overallSuccess:G,successfulFiles:V,failedFiles:J},z,A)
|
|
2340
|
-
let
|
|
2341
|
-
if(t.workspaceManager&&(
|
|
2342
|
-
if(
|
|
2343
|
-
for(const t of e.replacements.filter((e=>!e.success)))
|
|
2344
|
-
for(const e of F){if("file"===e.type?
|
|
2345
|
-
for(const t of e.replacements.filter((e=>!e.success)))
|
|
2346
|
-
const
|
|
2347
|
-
return y.info("Replace strings operation completed",{duration:
|
|
2340
|
+
let Y="## String Replacement Results\n\n"
|
|
2341
|
+
if(t.workspaceManager&&(Y+=`**Branch:** \`${t.workspaceManager.getCurrentContext().branchName}\`\n\n`),Y+="**Summary:**\n",Y+=`- **Files processed:** ${H+W}\n`,Y+=`- **Successful operations:** ${H}\n`,Y+=`- **Failed operations:** ${W}\n`,Y+=`- **Total replacements:** ${U} successful, ${N} failed\n\n`,z.success&&z.commitHash&&(Y+="**Git Commit:**\n",Y+=`- **Commit Hash:** ${z.commitHash.substring(0,8)}\n`,Y+=`- **Files Committed:** ${z.filesCommitted.length}\n`,z.previousCommitHash&&(Y+=`- **Previous Commit:** ${z.previousCommitHash.substring(0,8)}\n`),Y+="\n"),A.lockAcquired&&A.lockedRequestId&&(Y+=`\u{1f512} **Locked request:** ${A.lockedRequestId}\n\n`),1===F.length){const e=F[0]
|
|
2342
|
+
if(Y+=`**Operation:** ${e.success?"\u2705 Success":"\u274c Failed"}\n`,"file"===e.type?Y+=`**File:** ${e.path}\n`:(Y+="**Document:** "+e.documentId,e.filename&&(Y+=` (${e.filename})`),Y+="\n"),e.error?Y+=`**Error:** ${e.error}\n`:(Y+=`**Replacements:** ${e.successfulReplacements} successful`,e.failedReplacements>0&&(Y+=`, ${e.failedReplacements} failed`),Y+="\n"),e.replacements.some((e=>!e.success))){Y+="**Failed Replacement Details:**\n"
|
|
2343
|
+
for(const t of e.replacements.filter((e=>!e.success)))Y+=`- "${t.old_str}" \u2192 "${t.new_str}": ${t.error}\n`}}else{Y+="**Summary:**\n",Y+=`- **Total Operations:** ${F.length}\n`,Y+=`- **Successful:** ${H}\n`,Y+=`- **Failed:** ${W}\n`,Y+=`- **Total Replacements:** ${U} successful, ${N} failed\n\n`,Y+="**Detailed Results:**\n\n"
|
|
2344
|
+
for(const e of F){if("file"===e.type?Y+=`### File: ${e.path}\n`:(Y+="### Document: "+e.documentId,e.filename&&(Y+=` (${e.filename})`),Y+="\n"),Y+=`- **Status:** ${e.success?"\u2705 Success":"\u274c Failed"}\n`,e.error?Y+=`- **Error:** ${e.error}\n`:(Y+=`- **Replacements:** ${e.successfulReplacements} successful`,e.failedReplacements>0&&(Y+=`, ${e.failedReplacements} failed`),Y+="\n"),e.replacements.some((e=>!e.success))){Y+="- **Failed Replacement Details:**\n"
|
|
2345
|
+
for(const t of e.replacements.filter((e=>!e.success)))Y+=` - "${t.old_str}" \u2192 "${t.new_str}": ${t.error}\n`}Y+="\n"}}P.length>0&&(Y+="\u{1f4c4} **Document Changes:** Modified documents have been automatically synced back to the tracking system.\n\n")
|
|
2346
|
+
const K=Date.now()-w
|
|
2347
|
+
return y.info("Replace strings operation completed",{duration:K,success:G,totalOperations:F.length,successfulOperations:H,failedOperations:W}),a.incrementCounter("replace_strings_total",1,{success:G}),{content:[{type:"text",text:Y}],isError:!G}}catch(t){const r=Date.now()-w
|
|
2348
2348
|
if(y.error("Replace strings operation failed",{error:t instanceof Error?t.stack:t+"",duration:r,phase:I}),b)try{await o.updateToolRecord(b,{metadata:{path:e?.operations?.[0]?.path||e?.operations?.[0]?.documentId,status:"failed",error:(0,m.getErrorMessage)(t),phase:I,duration:r,userComment:e?.comment},note:"String replacement failed: "+(0,m.getErrorMessage)(t)})}catch(e){}return a.incrementCounter("replace_strings_errors",1,{phase:I}),{content:[{type:"text",text:"\u274c **Replace Strings Failed:** "+(0,m.getErrorMessage)(t)}],isError:!0}}}
|
|
2349
2349
|
const l=c(t(1943)),u=t(6183),d=a(t(5967)),h=t(9860),g=t(5003),p=t(7478),f=t(9949),m=t(8824)},3322(e,exports,t){"use strict"
|
|
2350
2350
|
var r,n=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r)
|
|
@@ -2699,11 +2699,11 @@ const e=await(0,g.commitUserChangesBeforeToolOperation)(t.git,"write_file",{requ
|
|
|
2699
2699
|
e.userChangesCommitted&&(w.debug("[WRITE-FILE] User changes committed before write operation",{commitHash:e.commitHash?.substring(0,8),filesCommitted:e.filesCommitted}),w.info("User changes committed before write-file operation",{taskId:i,path:R,userCommitHash:e.commitHash?.substring(0,8),userFilesCommitted:e.filesCommitted}))}catch(e){w.debug("[WRITE-FILE] Pre-tool commit failed, continuing with write",{error:e instanceof Error?e.message:e+""}),w.warn("Pre-tool user changes commit failed, continuing with write operation",{taskId:i,path:R,error:e instanceof Error?e.message:e+""})}if(!A)throw Error("Target path not properly initialized")
|
|
2700
2700
|
if(w.debug("[WRITE-FILE] Proceeding with file write operation",{targetPath:A}),T&&$)try{V=await c.default.readFile(A,"utf8")+G}catch(e){w.warn("Failed to read existing content for append",{error:e})}const J=a.default.dirname(A)
|
|
2701
2701
|
if(await c.default.mkdir(J,{recursive:!0}),await c.default.writeFile(A,V,"utf8"),w.info("Content written successfully",{path:j?R:"document:"+E,finalLength:V.length,append:T,wasCreated:D}),M){t.documentFileManager.markForSync(E)
|
|
2702
|
-
try{await t.documentFileManager.syncDocument(E),w.info("Document synced successfully",{documentId:E})}catch(e){w.warn("Failed to sync document immediately",{documentId:E,error:e})}}let K,
|
|
2702
|
+
try{await t.documentFileManager.syncDocument(E),w.info("Document synced successfully",{documentId:E})}catch(e){w.warn("Failed to sync document immediately",{documentId:E,error:e})}}let Y,K,Q=null
|
|
2703
2703
|
if(j){if(C=u.FileOperationPhase.GIT_COMMIT,m.incrementCounter("write_file_phase",1,{phase:C}),t.workspaceManager){const e=t.workspaceManager.getCurrentContext()
|
|
2704
|
-
|
|
2705
|
-
|
|
2706
|
-
Z+=`**Content Length:** ${V.length} characters\n`,j&&
|
|
2704
|
+
K=e.branchName,w.debug("Retrieved branch name from workspace manager",{branchName:K,requestId:e.requestId,mode:e.mode,isMainBranch:e.isMainBranch})}try{const e=`${D?"Create":T?"Append to":"Update"} ${R} (${v})`,r=await u.commitToGit(i,R,v,v,e,t,w,m,_.metricsPrefix)
|
|
2705
|
+
Y=r.commitHash,Q=r.previousCommitHash,w.info("Changes committed to git via shared utility",{path:R,commitMessage:e,commitHash:Y?.substring(0,8),previousCommitHash:Q?.substring(0,8),branchName:K,toolRecordId:v})}catch(e){w.warn("Git operations failed via shared utility",{error:e})}}try{await o.updateToolRecord(v,{metadata:{path:j?R:"document:"+E,status:"completed",finalContentLength:V.length,wasFileCreated:D,wasAppended:T&&$,operationType:M?"document":"file",processingTime:Date.now()-b,userComment:P,...j&&Y&&{commitHash:Y,previousCommitHash:Q||void 0}},note:"Write operation completed successfully"+(M?" (document synced)":" (committed to git)")})}catch(e){w.warn("Failed to update tool record",{recordError:e})}let Z=`**${D?"Created":T?"Appended to":"Updated"} ${M?`document ${E}${O?` (${O})`:""}`:"file "+R}**\n`
|
|
2706
|
+
Z+=`**Content Length:** ${V.length} characters\n`,j&&K&&(Z+=`**Branch:** ${K}\n`),W.lockAcquired&&W.lockedRequestId&&(Z+=`**Locked request:** ${W.lockedRequestId}\n`),j&&Y&&(Z+=`**Commit Hash:** ${Y.substring(0,8)}\n`,Q&&(Z+=`**Previous Commit:** ${Q.substring(0,8)}\n`)),v&&(Z+=`[RECORD:${v}]\n`),M&&(Z+=`\n**Document Update:** The document content has been updated and synced back to the tracking system. You can continue editing using other file modification tools with documentId \`${E}\`.`)
|
|
2707
2707
|
const X=Date.now()
|
|
2708
2708
|
return w.info("Write operation completed successfully",{duration:X-b,path:j?R:"document:"+E,contentLength:V.length,wasCreated:D}),k({tool:"write_file",success:!0}),m.incrementCounter("write_file_total",1,{success:!0}),t.workspaceManager?.largeFileWarning&&(Z+=t.workspaceManager.largeFileWarning,t.workspaceManager.largeFileWarning=""),{content:[{type:"text",text:Z}]}}catch(t){const r=Date.now()-b
|
|
2709
2709
|
if(w.error("Write operation failed",{error:t instanceof Error?t.stack:t+"",duration:r,phase:C}),v)try{await o.updateToolRecord(v,{metadata:{path:e?.path,status:"failed",error:(0,f.getErrorMessage)(t),phase:C,duration:r,userComment:e?.comment},note:"Write operation failed: "+(0,f.getErrorMessage)(t)})}catch(e){}return k({tool:"write_file",success:!1}),m.incrementCounter("write_file_errors",1,{phase:C}),{content:[{type:"text",text:"\u274c **Write Operation Failed:** "+(0,f.getErrorMessage)(t)}],isError:!0}}}
|
|
@@ -3512,13 +3512,13 @@ let s
|
|
|
3512
3512
|
s=r>0&&n>0?`Delete ${r} files and ${n} documents - ${q}`:r>0?1===r?"Delete file - "+q:`Delete ${r} files - ${q}`:1===n?"Delete document - "+q:`Delete ${n} documents - ${q}`,G=await l.commitToGit(C,x,L,z,s,t,i,o,b.metricsPrefix)}k=l.FileOperationPhase.RECORD_UPDATE_SUCCESS,o.incrementCounter("delete_files_phase",1,{phase:k})
|
|
3513
3513
|
const V=B.filter((e=>e.success)),J=B.filter((e=>!e.success))
|
|
3514
3514
|
await l.updateFileOperationRecords(C,y,w,x,b.recordType,H===M?`Successfully deleted all ${M} operations`:`Deleted ${H}/${M} operations successfully`,{status:H===M?"completed":"partial_success",commitHash:G?.commitHash,previousCommitHash:G?.previousCommitHash,totalOperations:M,fileOperations:T.length,documentOperations:P.length,successCount:H,failureCount:M-H,successfulOperations:V.map((e=>({type:e.type,path:e.path,documentId:e.documentId,filename:e.filename}))),failedOperations:J.map((e=>({type:e.type,path:e.path,documentId:e.documentId,filename:e.filename,error:e.error}))),userComment:q,hadUserMods:N.hadUserMods,userModsCommitHash:N.userModsCommitHash},H===M?`Successfully deleted all ${M} operations`:`Deleted ${H}/${M} operations successfully`,n,d,i,o,b.metricsPrefix)
|
|
3515
|
-
const
|
|
3516
|
-
let
|
|
3515
|
+
const Y=t.getCurrentBranchContext?await t.getCurrentBranchContext():{branch:null,requestId:null,isMain:!0}
|
|
3516
|
+
let K=""
|
|
3517
3517
|
if(H===M){const e=V.filter((e=>"file"===e.type)).length,t=V.filter((e=>"document"===e.type)).length
|
|
3518
|
-
|
|
3518
|
+
K=e>0&&t>0?`Successfully deleted ${e} files and ${t} documents`:e>0?`Successfully deleted all ${e} ${1===e?"file":"files"}`:`Successfully archived all ${t} ${1===t?"document":"documents"}`}else K=H>0?`Successfully deleted ${H}/${M} operations.\n\nFailed operations:\n`+B.filter((e=>!e.success)).map((e=>{const t="file"===e.type?e.path:`${e.filename||e.documentId} (${e.documentId})`
|
|
3519
3519
|
return`\u2022 ${e.type}: ${t}: ${e.error}`})).join("\n"):"All delete operations failed:\n"+B.map((e=>{const t="file"===e.type?e.path:`${e.filename||e.documentId} (${e.documentId})`
|
|
3520
3520
|
return`\u2022 ${e.type}: ${t}: ${e.error}`})).join("\n")
|
|
3521
|
-
return G?.commitHash&&(
|
|
3521
|
+
return G?.commitHash&&(K+="\nCommit: "+G.commitHash.substring(0,8)),Y.requestId&&(K+="\nBranch: "+Y.requestId),F.lockAcquired&&F.lockedRequestId&&(K+="\n\u{1f512} **Locked request:** "+F.lockedRequestId),{content:[{type:"text",text:K}],isError:0===H}}catch(n){if(e.taskId&&r)try{const o=r.getToolRecordClient(),s=n instanceof u.NotFoundError||n instanceof u.ValidationError||n instanceof d.ZodError
|
|
3522
3522
|
await o.createToolRecord({...s?{}:{taskId:e.taskId},projectId:t.projectId,type:"delete-files",metadata:{status:"failed",timestamp:(new Date).toISOString(),totalOperations:e.operations?.length||e.paths?.length||0,fileOperations:e.paths?.length||e.operations?.filter((e=>e.path))?.length||0,documentOperations:e.operations?.filter((e=>e.documentId))?.length||0,paths:e.paths||e.operations?.filter((e=>e.path))?.map((e=>e.path))||[],documentIds:e.operations?.filter((e=>e.documentId))?.map((e=>e.documentId))||[],userComment:e.comment,error:(0,f.getErrorMessage)(n),errorDetails:n instanceof Error?n.stack:n+"",phase:k,attemptedTaskId:e.taskId,taskIdValidationFailed:s},note:"Failed to delete files - "+(0,f.getErrorMessage)(n)})}catch(t){i.error("Failed to create failure record for delete-files operation",{error:t instanceof Error?t.message:t+"",taskId:e.taskId,totalOperations:e.operations?.length||e.paths?.length||0,fileOperations:e.paths?.length||e.operations?.filter((e=>e.path))?.length||0,documentOperations:e.operations?.filter((e=>e.documentId))?.length||0})}const s=Date.now()-m
|
|
3523
3523
|
if(o.recordValue("delete_files_time",s),o.incrementCounter("delete_files_errors",1),i.error("Error in delete-files operation:",{error:(0,f.getErrorMessage)(n),time:s}),(y||w)&&e.taskId){k=l.FileOperationPhase.RECORD_UPDATE_FAILURE
|
|
3524
3524
|
try{const t=r.getTaskClient(),s=r.getToolRecordClient()
|
|
@@ -3779,17 +3779,17 @@ try{const o=await t.documentFileManager.getDocumentAsFile(e.documentId),s=t.docu
|
|
|
3779
3779
|
n.filename=s?.filename
|
|
3780
3780
|
const i=await c.default.readFile(o,"utf8"),{newContent:a,results:l}=await r(i,e.insertions)
|
|
3781
3781
|
n.insertions=l,n.successfulInsertions=l.filter((e=>e.success)).length,n.failedInsertions=l.filter((e=>!e.success)).length,n.totalLinesAdded=l.filter((e=>e.success)).reduce(((e,t)=>e+(t.linesAdded||0)),0),a!==i&&n.successfulInsertions>0?(await c.default.writeFile(o,a,"utf8"),t.documentFileManager.markForSync(e.documentId),n.success=!0,z++,y.info("Document updated successfully",{documentId:e.documentId,filename:n.filename,successfulInsertions:n.successfulInsertions,failedInsertions:n.failedInsertions,linesAdded:n.totalLinesAdded})):0===n.failedInsertions&&(n.success=!0),N+=n.failedInsertions,L+=n.totalLinesAdded}catch(t){n.error=(0,f.getErrorMessage)(t),n.failedInsertions=e.insertions.length,N+=n.failedInsertions,y.error("Document operation failed",{documentId:e.documentId,error:n.error})}F.push(n)}if(P.length>0)try{for(const e of P){const r=F.find((t=>t.documentId===e.documentId))
|
|
3782
|
-
r?.success&&await t.documentFileManager.syncDocument(e.documentId)}}catch(e){y.warn("Some documents may not have synced properly",{error:e})}const B=await u.handleMultiFileGitCommit(C,T,F,z,{operationType:"Insert lines",toolRecordId:b,successField:"successfulInsertions",logger:y,metrics:a,metricsPrefix:"insert_lines"},t),H=u.processMultiFileOperationResults(F,"successfulInsertions"),{successfulOperations:W,failedOperations:U,totalSuccessfulChanges:G,overallSuccess:V,successfulFiles:J,failedFiles:
|
|
3783
|
-
try{await o.updateToolRecord(b,{metadata:{path:T.length>0?T[0].path:"document:"+P[0]?.documentId,status:V?"completed":"failed",error:V?void 0:U+" operations failed",totalOperations:F.length,successfulFiles:J,failedFiles:
|
|
3784
|
-
if(t.workspaceManager&&(
|
|
3785
|
-
if(
|
|
3782
|
+
r?.success&&await t.documentFileManager.syncDocument(e.documentId)}}catch(e){y.warn("Some documents may not have synced properly",{error:e})}const B=await u.handleMultiFileGitCommit(C,T,F,z,{operationType:"Insert lines",toolRecordId:b,successField:"successfulInsertions",logger:y,metrics:a,metricsPrefix:"insert_lines"},t),H=u.processMultiFileOperationResults(F,"successfulInsertions"),{successfulOperations:W,failedOperations:U,totalSuccessfulChanges:G,overallSuccess:V,successfulFiles:J,failedFiles:Y}=H
|
|
3783
|
+
try{await o.updateToolRecord(b,{metadata:{path:T.length>0?T[0].path:"document:"+P[0]?.documentId,status:V?"completed":"failed",error:V?void 0:U+" operations failed",totalOperations:F.length,successfulFiles:J,failedFiles:Y,operations:D,totalSuccessfulInsertions:G,totalFailedInsertions:N,totalLinesAdded:L,operationsWithChanges:z,processingTime:Date.now()-w,userComment:E,...T.length>0&&B.success&&B.commitHash&&{commitHash:B.commitHash,previousCommitHash:B.previousCommitHash||void 0}},note:V?`Line insertion completed: ${W}/${F.length} operations successful${T.length>0?" (committed to git)":""}`:`Line insertion partially failed: ${U}/${F.length} operations failed`})}catch(e){y.warn("Failed to update tool record",{recordError:e})}let K="## Line Insertion Results\n\n"
|
|
3784
|
+
if(t.workspaceManager&&(K+=`**Branch:** \`${t.workspaceManager.getCurrentContext().branchName}\`\n\n`),K+="**Summary:**\n",K+=`- **Files processed:** ${W+U}\n`,K+=`- **Successful operations:** ${W}\n`,K+=`- **Failed operations:** ${U}\n`,K+=`- **Total insertions:** ${G} successful, ${N} failed\n`,K+=`- **Total Lines Added:** ${L}\n`,K+="\n",B.success&&B.commitHash&&(K+="**Git Commit:**\n",K+=`- **Commit Hash:** ${B.commitHash.substring(0,8)}\n`,K+=`- **Files Committed:** ${B.filesCommitted.length}\n`,B.previousCommitHash&&(K+=`- **Previous Commit:** ${B.previousCommitHash.substring(0,8)}\n`),K+="\n"),A.lockAcquired&&A.lockedRequestId&&(K+=`\u{1f512} **Locked request:** ${A.lockedRequestId}\n\n`),1===F.length){const e=F[0]
|
|
3785
|
+
if(K+=`**Operation:** ${e.success?"\u2705 Success":"\u274c Failed"}\n`,"file"===e.type?K+=`**File:** ${e.path}\n`:(K+="**Document:** "+e.documentId,e.filename&&(K+=` (${e.filename})`),K+="\n"),e.error?K+=`**Error:** ${e.error}\n`:(K+=`**Insertions:** ${e.successfulInsertions} successful`,e.failedInsertions>0&&(K+=`, ${e.failedInsertions} failed`),K+="\n",K+=`**Lines Added:** ${e.totalLinesAdded}\n`),e.insertions.some((e=>!e.success))){K+="**Failed Insertion Details:**\n"
|
|
3786
3786
|
for(const t of e.insertions.filter((e=>!e.success))){const e="between"===t.type?`between lines ${t.afterLine} and ${t.beforeLine}`:`${t.type} line ${t.line}`
|
|
3787
|
-
|
|
3788
|
-
for(const e of F){if("file"===e.type?
|
|
3787
|
+
K+=`- ${t.type} insertion ${e}: ${t.error}\n`}}}else{K+="**Summary:**\n",K+=`- **Total Operations:** ${F.length}\n`,K+=`- **Successful:** ${W}\n`,K+=`- **Failed:** ${U}\n`,K+=`- **Total Insertions:** ${G} successful, ${N} failed\n`,K+=`- **Total Lines Added:** ${L}\n\n`,K+="**Detailed Results:**\n\n"
|
|
3788
|
+
for(const e of F){if("file"===e.type?K+=`### File: ${e.path}\n`:(K+="### Document: "+e.documentId,e.filename&&(K+=` (${e.filename})`),K+="\n"),K+=`- **Status:** ${e.success?"\u2705 Success":"\u274c Failed"}\n`,e.error?K+=`- **Error:** ${e.error}\n`:(K+=`- **Insertions:** ${e.successfulInsertions} successful`,e.failedInsertions>0&&(K+=`, ${e.failedInsertions} failed`),K+="\n",K+=`- **Lines Added:** ${e.totalLinesAdded}\n`),e.insertions.some((e=>!e.success))){K+="- **Failed Insertion Details:**\n"
|
|
3789
3789
|
for(const t of e.insertions.filter((e=>!e.success))){const e="between"===t.type?`between lines ${t.afterLine} and ${t.beforeLine}`:`${t.type} line ${t.line}`
|
|
3790
|
-
|
|
3790
|
+
K+=` - ${t.type} insertion ${e}: ${t.error}\n`}}K+="\n"}}P.length>0&&(K+="\u{1f4c4} **Document Changes:** Modified documents have been automatically synced back to the tracking system.\n\n")
|
|
3791
3791
|
const Q=Date.now()-w
|
|
3792
|
-
return y.info("Insert lines operation completed",{duration:Q,success:V,totalOperations:F.length,successfulOperations:W,failedOperations:U}),a.incrementCounter("insert_lines_total",1,{success:V}),{content:[{type:"text",text:
|
|
3792
|
+
return y.info("Insert lines operation completed",{duration:Q,success:V,totalOperations:F.length,successfulOperations:W,failedOperations:U}),a.incrementCounter("insert_lines_total",1,{success:V}),{content:[{type:"text",text:K}],isError:!V}}catch(t){const r=Date.now()-w
|
|
3793
3793
|
if(y.error("Insert lines operation failed",{error:t instanceof Error?t.stack:t+"",duration:r,phase:I}),b)try{await o.updateToolRecord(b,{metadata:{path:e?.operations?.[0]?.path||e?.operations?.[0]?.documentId,status:"failed",error:(0,f.getErrorMessage)(t),phase:I,duration:r,userComment:e?.comment},note:"Line insertion failed: "+(0,f.getErrorMessage)(t)})}catch(e){}return a.incrementCounter("insert_lines_errors",1,{phase:I}),{content:[{type:"text",text:"\u274c **Insert Lines Failed:** "+(0,f.getErrorMessage)(t)}],isError:!0}}}
|
|
3794
3794
|
const c=a(t(1943)),l=t(6183),u=i(t(5967)),d=t(9860),h=t(5003),g=t(7478),p=t(9949),f=t(8824),m=t(3255)},6539(e,exports,t){"use strict"
|
|
3795
3795
|
Object.defineProperty(exports,"__esModule",{value:!0}),exports.ClientFactory=void 0
|
|
@@ -3899,15 +3899,15 @@ try{const o=await t.documentFileManager.getDocumentAsFile(e.documentId),s=t.docu
|
|
|
3899
3899
|
n.filename=s?.filename
|
|
3900
3900
|
const i=await c.default.readFile(o,"utf8"),{newContent:a,results:l}=await r(i,e.replacements)
|
|
3901
3901
|
n.replacements=l,n.successfulReplacements=l.filter((e=>e.success)).length,n.failedReplacements=l.filter((e=>!e.success)).length,n.totalLinesReplaced=l.filter((e=>e.success)).reduce(((e,t)=>e+(t.linesReplaced||0)),0),n.totalLinesAdded=l.filter((e=>e.success)).reduce(((e,t)=>e+(t.linesAdded||0)),0),a!==i&&n.successfulReplacements>0?(await c.default.writeFile(o,a,"utf8"),t.documentFileManager.markForSync(e.documentId),n.success=!0,H++,w.info("Document updated successfully",{documentId:e.documentId,filename:n.filename,successfulReplacements:n.successfulReplacements,failedReplacements:n.failedReplacements,linesReplaced:n.totalLinesReplaced,linesAdded:n.totalLinesAdded})):0===n.failedReplacements&&(n.success=!0),L+=n.failedReplacements,z+=n.totalLinesReplaced,B+=n.totalLinesAdded}catch(t){n.error=(0,f.getErrorMessage)(t),n.failedReplacements=e.replacements.length,L+=n.failedReplacements,w.error("Document operation failed",{documentId:e.documentId,error:n.error})}N.push(n)}if(M.length>0)try{for(const e of M){const r=N.find((t=>t.documentId===e.documentId))
|
|
3902
|
-
r?.success&&await t.documentFileManager.syncDocument(e.documentId)}}catch(e){w.warn("Some documents may not have synced properly",{error:e})}const W=await u.handleMultiFileGitCommit(_,P,N,H,{operationType:"Replace lines",toolRecordId:I,successField:"successfulReplacements",logger:w,metrics:a,metricsPrefix:"replace_lines"},t),U=u.processMultiFileOperationResults(N,"successfulReplacements"),{successfulOperations:G,failedOperations:V,totalSuccessfulChanges:J,overallSuccess:
|
|
3903
|
-
try{await o.updateToolRecord(I,{metadata:{path:P.length>0?P[0].path:"document:"+M[0]?.documentId,status:
|
|
3902
|
+
r?.success&&await t.documentFileManager.syncDocument(e.documentId)}}catch(e){w.warn("Some documents may not have synced properly",{error:e})}const W=await u.handleMultiFileGitCommit(_,P,N,H,{operationType:"Replace lines",toolRecordId:I,successField:"successfulReplacements",logger:w,metrics:a,metricsPrefix:"replace_lines"},t),U=u.processMultiFileOperationResults(N,"successfulReplacements"),{successfulOperations:G,failedOperations:V,totalSuccessfulChanges:J,overallSuccess:Y,successfulFiles:K,failedFiles:Q}=U
|
|
3903
|
+
try{await o.updateToolRecord(I,{metadata:{path:P.length>0?P[0].path:"document:"+M[0]?.documentId,status:Y?"completed":"failed",error:Y?void 0:V+" operations failed",totalOperations:N.length,successfulFiles:K,failedFiles:Q,operations:$,totalSuccessfulReplacements:J,totalFailedReplacements:L,totalLinesReplaced:z,totalLinesAdded:B,operationsWithChanges:H,processingTime:Date.now()-k,userComment:q,...P.length>0&&W.success&&W.commitHash&&{commitHash:W.commitHash,previousCommitHash:W.previousCommitHash||void 0}},note:Y?`Line replacement completed: ${G}/${N.length} operations successful${P.length>0?" (committed to git)":""}`:`Line replacement partially failed: ${V}/${N.length} operations failed`})}catch(e){w.warn("Failed to update tool record",{recordError:e})}let Z="## Line Replacement Results\n\n"
|
|
3904
3904
|
if(t.workspaceManager&&(Z+=`**Branch:** \`${t.workspaceManager.getCurrentContext().branchName}\`\n\n`),Z+="**Summary:**\n",Z+=`- **Files processed:** ${G+V}\n`,Z+=`- **Successful operations:** ${G}\n`,Z+=`- **Failed operations:** ${V}\n`,Z+=`- **Total replacements:** ${J} successful, ${L} failed\n`,Z+=`- **Total Lines Replaced:** ${z}\n`,B>0&&(Z+=`- **Total Lines Added:** ${B}\n`),Z+="\n",W.success&&W.commitHash&&(Z+="**Git Commit:**\n",Z+=`- **Commit Hash:** ${W.commitHash.substring(0,8)}\n`,Z+=`- **Files Committed:** ${W.filesCommitted.length}\n`,W.previousCommitHash&&(Z+=`- **Previous Commit:** ${W.previousCommitHash.substring(0,8)}\n`),Z+="\n"),D.lockAcquired&&D.lockedRequestId&&(Z+=`\u{1f512} **Locked request:** ${D.lockedRequestId}\n\n`),1===N.length){const e=N[0]
|
|
3905
3905
|
if(Z+=`**Operation:** ${e.success?"\u2705 Success":"\u274c Failed"}\n`,"file"===e.type?Z+=`**File:** ${e.path}\n`:(Z+="**Document:** "+e.documentId,e.filename&&(Z+=` (${e.filename})`),Z+="\n"),e.error?Z+=`**Error:** ${e.error}\n`:(Z+=`**Replacements:** ${e.successfulReplacements} successful`,e.failedReplacements>0&&(Z+=`, ${e.failedReplacements} failed`),Z+="\n",Z+=`**Lines Replaced:** ${e.totalLinesReplaced}\n`,e.totalLinesAdded>0&&(Z+=`**Lines Added:** ${e.totalLinesAdded}\n`)),e.replacements.some((e=>!e.success))){Z+="**Failed Replacement Details:**\n"
|
|
3906
3906
|
for(const t of e.replacements.filter((e=>!e.success)))Z+=`- Replace ${"number"==typeof t.lines?"line "+t.lines:Array.isArray(t.lines)?`lines [${t.lines.join(", ")}]`:`lines ${t.lines.start}-${t.lines.end}`}: ${t.error}\n`}}else{Z+="**Summary:**\n",Z+=`- **Total Operations:** ${N.length}\n`,Z+=`- **Successful:** ${G}\n`,Z+=`- **Failed:** ${V}\n`,Z+=`- **Total Replacements:** ${J} successful, ${L} failed\n`,Z+=`- **Total Lines Replaced:** ${z}\n`,B>0&&(Z+=`- **Total Lines Added:** ${B}\n`),Z+="\n",Z+="**Detailed Results:**\n\n"
|
|
3907
3907
|
for(const e of N){if("file"===e.type?Z+=`### File: ${e.path}\n`:(Z+="### Document: "+e.documentId,e.filename&&(Z+=` (${e.filename})`),Z+="\n"),Z+=`- **Status:** ${e.success?"\u2705 Success":"\u274c Failed"}\n`,e.error&&(Z+=`- **Error:** ${e.error}\n`),Z+=`- **Replacements:** ${e.successfulReplacements} successful`,e.failedReplacements>0&&(Z+=`, ${e.failedReplacements} failed`),Z+="\n",Z+=`- **Lines Replaced:** ${e.totalLinesReplaced}\n`,e.totalLinesAdded>0&&(Z+=`- **Lines Added:** ${e.totalLinesAdded}\n`),e.replacements.some((e=>!e.success))){Z+="- **Failed Replacement Details:**\n"
|
|
3908
3908
|
for(const t of e.replacements.filter((e=>!e.success)))Z+=` - Replace ${"number"==typeof t.lines?"line "+t.lines:Array.isArray(t.lines)?`lines [${t.lines.join(", ")}]`:`lines ${t.lines.start}-${t.lines.end}`}: ${t.error}\n`}Z+="\n"}}M.length>0&&(Z+="\u{1f4c4} **Document Changes:** Modified documents have been automatically synced back to the tracking system.\n\n")
|
|
3909
3909
|
const X=Date.now()-k
|
|
3910
|
-
return w.info("Replace lines operation completed",{duration:X,success:
|
|
3910
|
+
return w.info("Replace lines operation completed",{duration:X,success:Y,totalOperations:N.length,successfulOperations:G,failedOperations:V}),a.incrementCounter("replace_lines_total",1,{success:Y}),{content:[{type:"text",text:Z}],isError:!Y}}catch(t){const r=Date.now()-k
|
|
3911
3911
|
if(w.error("Replace lines operation failed",{error:t instanceof Error?t.stack:t+"",duration:r,phase:v}),I)try{await o.updateToolRecord(I,{metadata:{path:e?.operations?.[0]?.path||e?.operations?.[0]?.documentId,status:"failed",error:(0,f.getErrorMessage)(t),phase:v,duration:r,userComment:e?.comment},note:"Line replacement failed: "+(0,f.getErrorMessage)(t)})}catch(e){}return a.incrementCounter("replace_lines_errors",1,{phase:v}),{content:[{type:"text",text:"\u274c **Replace Lines Failed:** "+(0,f.getErrorMessage)(t)}],isError:!0}}}
|
|
3912
3912
|
const c=a(t(1943)),l=t(6183),u=i(t(5967)),d=t(9860),h=t(5003),g=t(7478),p=t(9949),f=t(8824),m=t(3255),y=t(9470)},6688(e,exports,t){"use strict"
|
|
3913
3913
|
Object.defineProperty(exports,"__esModule",{value:!0}),exports.sessionIdentity=void 0
|
|
@@ -4050,10 +4050,10 @@ const N=new Map
|
|
|
4050
4050
|
F.forEach((e=>{e.recordId&&e.record?.metadata?.status&&(N.has(e.recordId)||N.set(e.recordId,[]),N.get(e.recordId)?.push(e.record.metadata.status))})),N.forEach(((e,t)=>{s.info(`Record ${t} status updates: ${e.join(" -> ")}`)}))
|
|
4051
4051
|
const L=F.filter((e=>e.commitHash))
|
|
4052
4052
|
if(s.info(`Found ${L.length} records with commit hash for ${$}`),0===L.length){s.info(`No commit hashes found in record metadata for ${$}, trying git log`)
|
|
4053
|
-
try{if(t.git){const J={file:$,n:10},
|
|
4054
|
-
if(
|
|
4055
|
-
const Y
|
|
4056
|
-
if(
|
|
4053
|
+
try{if(t.git){const J={file:$,n:10},Y=await t.git.log(J)
|
|
4054
|
+
if(Y&&Y.all&&Y.all.length>0){s.info(`Found ${Y.all.length} commits for ${$} using git log`)
|
|
4055
|
+
const K=Y.all.map((e=>({filePath:$,recordId:"git-"+e.hash.substring(0,8),type:"git-commit",timestamp:new Date(e.date).toISOString(),commitHash:e.hash,status:"completed",record:{id:"git-"+e.hash.substring(0,8),type:"git-commit",content:e.message,createdAt:new Date(e.date).toISOString(),metadata:{commitHash:e.hash}}})))
|
|
4056
|
+
if(K.length>0){const Q=K.length>1?K[K.length-1]:K[0],Z=K[0],X=1===K.length
|
|
4057
4057
|
s.info(X?`Using single git commit for ${$}: ${Z.commitHash?Z.commitHash.substring(0,8):"unknown"}`:`Using git commits for ${$}: ${Q.commitHash?Q.commitHash.substring(0,8):"unknown"} to ${Z.commitHash?Z.commitHash.substring(0,8):"unknown"}`)
|
|
4058
4058
|
let ee=""
|
|
4059
4059
|
try{if(X)try{const te=[`${Z.commitHash}:${$}`],re=await t.git.show(te)
|
|
@@ -5262,10 +5262,15 @@ e&&(this.pollingStatus=s.AUTHENTICATED,this.tokenResult=e,this.stopPolling(),r&&
|
|
|
5262
5262
|
function r(){const e=process.env.ALCHEMY_OPENCODE_DIR
|
|
5263
5263
|
if(e)return e
|
|
5264
5264
|
try{const e=("undefined"!=typeof require?require:t(4245)).resolve("alchemylab-opencode/package.json")
|
|
5265
|
-
return(0,o.dirname)(e)}catch{}}function n(e,t){return{command:
|
|
5265
|
+
return(0,o.dirname)(e)}catch{}}function n(e,t){return{command:function(){try{const e=(0,i.execFileSync)("node",["--version"],{encoding:"utf8"}).trim()
|
|
5266
|
+
if(parseInt(e.replace("v","").split(".")[0],10)>=a)return"node"}catch{}const e=process.env.NVM_DIR||(0,o.join)(process.env.HOME||"",".nvm"),t=(0,o.join)(e,"versions","node")
|
|
5267
|
+
if((0,s.existsSync)(t))try{const e=(0,s.readdirSync)(t).filter((e=>parseInt(e.replace("v","").split(".")[0],10)>=a)).sort(((e,t)=>{const r=parseInt(e.replace("v","").split(".")[0],10)
|
|
5268
|
+
return parseInt(t.replace("v","").split(".")[0],10)-r}))
|
|
5269
|
+
if(e.length>0){const r=(0,o.join)(t,e[0],"bin","node")
|
|
5270
|
+
if((0,s.existsSync)(r))return r}}catch{}throw Error(`AlchemyLab requires Node.js >= ${a} to run the OpenCode server.\nYour current version: ${process.version}\nInstall Node ${a}+: nvm install ${a} (or download from https://nodejs.org)`)}(),prependArgs:["--experimental-strip-types","--experimental-transform-types","--no-warnings","--import",(0,o.join)(e,"node-preload.mjs"),(0,o.join)(e,t)]}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveServeCommand=function(){const e=r()
|
|
5266
5271
|
return e?n((0,o.join)(e,"packages","opencode","src"),"serve.ts"):{command:"opencode",prependArgs:["serve"]}},exports.resolveRunCommand=function(){const e=r()
|
|
5267
5272
|
return e?n((0,o.join)(e,"packages","opencode","src"),"run.ts"):{command:"opencode",prependArgs:[]}}
|
|
5268
|
-
const o=t(6928)},9072(e,exports,t){"use strict"
|
|
5273
|
+
const o=t(6928),s=t(9896),i=t(5317),a=24},9072(e,exports,t){"use strict"
|
|
5269
5274
|
async function r(e,t,r,n){try{const o=await(0,u.getServerUrl)(r,n)
|
|
5270
5275
|
if(!o)return n.warn("Could not get server URL for notification",{sessionId:e}),!1
|
|
5271
5276
|
let s,i
|
|
@@ -5517,9 +5522,9 @@ for(const e of E){const r=e.path?D.get(e.path):void 0,o=await n(e,q,t,0,0,r?.mes
|
|
|
5517
5522
|
F.push(o),o.successfulReplacements>0&&"file"===o.type&&o.path&&N.push(o.path)}Date.now(),j=Date.now()
|
|
5518
5523
|
const L=E.filter((e=>e.path&&!e.documentId)).map((e=>({path:e.path}))),z=await d.handleMultiFileGitCommit(_,L,F,N.length,{operationType:"Replace in files",toolRecordId:$||v||"unknown",successField:"successfulReplacements",logger:b,metrics:a,metricsPrefix:"replace_in_files"},t),B=z.commitHash
|
|
5519
5524
|
Date.now(),Date.now()
|
|
5520
|
-
const H=F.filter((e=>e.success)).length,W=F.length-H,U=F.reduce(((e,t)=>e+t.successfulReplacements),0),G=F.reduce(((e,t)=>e+t.failedReplacements),0),V=F.map((e=>({type:e.type,path:e.path,documentId:e.documentId,filename:e.filename,replacements:e.replacements.map((e=>({old_str:e.old,new_str:e.new,success:e.success,error:e.error,matchesFound:e.matchesFound,matchType:e.matchType,lines:e.lines})))}))),J=F.filter((e=>e.success)).map((e=>({path:e.path,documentId:e.documentId,filename:e.filename,successfulReplacements:e.successfulReplacements,failedReplacements:e.failedReplacements}))),
|
|
5521
|
-
await o.updateToolRecord(v,{metadata:{path:M,status:0===W?"completed":"partial",operationCount:E.length,operations:V,successfulFiles:J,failedFiles:
|
|
5522
|
-
const
|
|
5525
|
+
const H=F.filter((e=>e.success)).length,W=F.length-H,U=F.reduce(((e,t)=>e+t.successfulReplacements),0),G=F.reduce(((e,t)=>e+t.failedReplacements),0),V=F.map((e=>({type:e.type,path:e.path,documentId:e.documentId,filename:e.filename,replacements:e.replacements.map((e=>({old_str:e.old,new_str:e.new,success:e.success,error:e.error,matchesFound:e.matchesFound,matchType:e.matchType,lines:e.lines})))}))),J=F.filter((e=>e.success)).map((e=>({path:e.path,documentId:e.documentId,filename:e.filename,successfulReplacements:e.successfulReplacements,failedReplacements:e.failedReplacements}))),Y=F.filter((e=>!e.success)).map((e=>({path:e.path,documentId:e.documentId,filename:e.filename,error:e.error,successfulReplacements:e.successfulReplacements,failedReplacements:e.failedReplacements})))
|
|
5526
|
+
await o.updateToolRecord(v,{metadata:{path:M,status:0===W?"completed":"partial",operationCount:E.length,operations:V,successfulFiles:J,failedFiles:Y,successfulReplacements:U,failedReplacements:G,processingTime:Date.now()-I,userComment:S,...z.success&&z.commitHash&&{commitHash:z.commitHash,previousCommitHash:z.previousCommitHash||void 0}}})
|
|
5527
|
+
const K=await async function(e,t,r,n,o,s){const i=e.filter((e=>e.success)).length,a=e.length-i,c=e.filter((e=>!e.success&&!e.error&&e.successfulReplacements>0)).length
|
|
5523
5528
|
let l="## Replace In Files - Batch Results\n\n"
|
|
5524
5529
|
if(o.getCurrentBranchContext)try{const e=await o.getCurrentBranchContext()
|
|
5525
5530
|
e.branch&&(l+=`**Current Branch:** ${e.branch}\n\n`)}catch(e){}l+="**Summary:**\n",l+=`- **Files/Documents:** ${e.length} total`,l+=c>0?` (\u2705 ${i} fully succeeded, \u26a0\ufe0f ${c} partial, \u274c ${a-c} failed)\n`:` (\u2705 ${i} successful, \u274c ${a} failed)\n`,l+=`- **Replacements:** ${r+n} total (\u2705 ${r} successful, \u274c ${n} failed)\n`,t&&(l+=`- **Git Commit:** ${t.substring(0,8)}\n`),s&&(l+=`[RECORD:${s}]\n`),l+="\n---\n\n"
|
|
@@ -5531,7 +5536,7 @@ for(const e of o)l+=`- \u2705 \`${e.old.substring(0,40)}${e.old.length>40?"...":
|
|
|
5531
5536
|
if(s.length>0){l+="\n**Failed Replacement Details:**\n"
|
|
5532
5537
|
for(const e of s)l+=`- \u274c \`${e.old.substring(0,40)}${e.old.length>40?"...":""}\` \u2192 \`${e.new.substring(0,40)}${e.new.length>40?"...":""}\`: ${e.error}\n`,e.details&&e.details.length>0&&(l+=" **Candidates found:**\n",l+=e.details.slice(0,5).map((e=>` - Line ${e.line}: \`${e.actually_matched.substring(0,40)}${e.actually_matched.length>40?"...":""}\` (${e.match_type})`)).join("\n")+"\n",e.details.length>5&&(l+=` ... and ${e.details.length-5} more matches\n`)),e.similarMatches&&e.similarMatches.length>0&&(l+=" **Did you mean? (Similar matches found):**\n",l+=e.similarMatches.map((e=>` - Line ${e.line}: \`${e.text.substring(0,60)}${e.text.length>60?"...":""}\` (${e.reason}, similarity: ${(100*e.similarity).toFixed(0)}%)`)).join("\n")+"\n")}l+="\n"}const u=e.filter((e=>"document"===e.type&&(e.success||e.successfulReplacements>0)))
|
|
5533
5538
|
return u.length>0&&(l+=`\n**Document Changes:** ${u.length} modified document(s) synced back to tracking system.\n`),o.workspaceManager?.largeFileWarning&&(l+=o.workspaceManager.largeFileWarning,o.workspaceManager.largeFileWarning=""),l}(F,B,U,G,t,v)
|
|
5534
|
-
return{content:[{type:"text",text:
|
|
5539
|
+
return{content:[{type:"text",text:K}],isError:0===U}}catch(e){const t=Date.now()-I
|
|
5535
5540
|
if(b.error("Replace in files batch operation failed",{error:e instanceof Error?e.stack:e+"",duration:t,phase:C}),v)try{await o.updateToolRecord(v,{metadata:{status:"failed",error:(0,k.getErrorMessage)(e),phase:C,duration:t}})}catch(e){}return a.incrementCounter("replace_in_files_errors",1,{phase:C}),{content:[{type:"text",text:"\u274c **Replace In Files Failed:** "+(0,k.getErrorMessage)(e)}],isError:!0}}}
|
|
5536
5541
|
const l=c(t(1943)),u=(a(t(9896)),a(t(6928)),c(t(6982)),t(6183)),d=a(t(5967)),h=t(3626),g=t(9860),p=t(5003),f=t(7478),m=t(9949),y=t(9947),w=t(1318),k=t(8824)},9470(e,exports){"use strict"
|
|
5537
5542
|
Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseLineSpec=function(e){if(!e||""===e.trim())throw Error("Line specification cannot be empty")
|
package/dist/index.js
CHANGED
|
@@ -5332,10 +5332,15 @@ e&&(this.pollingStatus=s.AUTHENTICATED,this.tokenResult=e,this.stopPolling(),r&&
|
|
|
5332
5332
|
function r(){const e=process.env.ALCHEMY_OPENCODE_DIR
|
|
5333
5333
|
if(e)return e
|
|
5334
5334
|
try{const e=("undefined"!=typeof require?require:t(4245)).resolve("alchemylab-opencode/package.json")
|
|
5335
|
-
return(0,o.dirname)(e)}catch{}}function n(e,t){return{command:
|
|
5335
|
+
return(0,o.dirname)(e)}catch{}}function n(e,t){return{command:function(){try{const e=(0,i.execFileSync)("node",["--version"],{encoding:"utf8"}).trim()
|
|
5336
|
+
if(parseInt(e.replace("v","").split(".")[0],10)>=a)return"node"}catch{}const e=process.env.NVM_DIR||(0,o.join)(process.env.HOME||"",".nvm"),t=(0,o.join)(e,"versions","node")
|
|
5337
|
+
if((0,s.existsSync)(t))try{const e=(0,s.readdirSync)(t).filter((e=>parseInt(e.replace("v","").split(".")[0],10)>=a)).sort(((e,t)=>{const r=parseInt(e.replace("v","").split(".")[0],10)
|
|
5338
|
+
return parseInt(t.replace("v","").split(".")[0],10)-r}))
|
|
5339
|
+
if(e.length>0){const r=(0,o.join)(t,e[0],"bin","node")
|
|
5340
|
+
if((0,s.existsSync)(r))return r}}catch{}throw Error(`AlchemyLab requires Node.js >= ${a} to run the OpenCode server.\nYour current version: ${process.version}\nInstall Node ${a}+: nvm install ${a} (or download from https://nodejs.org)`)}(),prependArgs:["--experimental-strip-types","--experimental-transform-types","--no-warnings","--import",(0,o.join)(e,"node-preload.mjs"),(0,o.join)(e,t)]}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveServeCommand=function(){const e=r()
|
|
5336
5341
|
return e?n((0,o.join)(e,"packages","opencode","src"),"serve.ts"):{command:"opencode",prependArgs:["serve"]}},exports.resolveRunCommand=function(){const e=r()
|
|
5337
5342
|
return e?n((0,o.join)(e,"packages","opencode","src"),"run.ts"):{command:"opencode",prependArgs:[]}}
|
|
5338
|
-
const o=t(6928)},9072(e,exports,t){"use strict"
|
|
5343
|
+
const o=t(6928),s=t(9896),i=t(5317),a=24},9072(e,exports,t){"use strict"
|
|
5339
5344
|
async function r(e,t,r,n){try{const o=await(0,u.getServerUrl)(r,n)
|
|
5340
5345
|
if(!o)return n.warn("Could not get server URL for notification",{sessionId:e}),!1
|
|
5341
5346
|
let s,i
|
package/dist/mcp-direct.js
CHANGED
|
@@ -5028,10 +5028,15 @@ e&&(this.pollingStatus=s.AUTHENTICATED,this.tokenResult=e,this.stopPolling(),r&&
|
|
|
5028
5028
|
function r(){const e=process.env.ALCHEMY_OPENCODE_DIR
|
|
5029
5029
|
if(e)return e
|
|
5030
5030
|
try{const e=("undefined"!=typeof require?require:t(4245)).resolve("alchemylab-opencode/package.json")
|
|
5031
|
-
return(0,o.dirname)(e)}catch{}}function n(e,t){return{command:
|
|
5031
|
+
return(0,o.dirname)(e)}catch{}}function n(e,t){return{command:function(){try{const e=(0,i.execFileSync)("node",["--version"],{encoding:"utf8"}).trim()
|
|
5032
|
+
if(parseInt(e.replace("v","").split(".")[0],10)>=a)return"node"}catch{}const e=process.env.NVM_DIR||(0,o.join)(process.env.HOME||"",".nvm"),t=(0,o.join)(e,"versions","node")
|
|
5033
|
+
if((0,s.existsSync)(t))try{const e=(0,s.readdirSync)(t).filter((e=>parseInt(e.replace("v","").split(".")[0],10)>=a)).sort(((e,t)=>{const r=parseInt(e.replace("v","").split(".")[0],10)
|
|
5034
|
+
return parseInt(t.replace("v","").split(".")[0],10)-r}))
|
|
5035
|
+
if(e.length>0){const r=(0,o.join)(t,e[0],"bin","node")
|
|
5036
|
+
if((0,s.existsSync)(r))return r}}catch{}throw Error(`AlchemyLab requires Node.js >= ${a} to run the OpenCode server.\nYour current version: ${process.version}\nInstall Node ${a}+: nvm install ${a} (or download from https://nodejs.org)`)}(),prependArgs:["--experimental-strip-types","--experimental-transform-types","--no-warnings","--import",(0,o.join)(e,"node-preload.mjs"),(0,o.join)(e,t)]}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveServeCommand=function(){const e=r()
|
|
5032
5037
|
return e?n((0,o.join)(e,"packages","opencode","src"),"serve.ts"):{command:"opencode",prependArgs:["serve"]}},exports.resolveRunCommand=function(){const e=r()
|
|
5033
5038
|
return e?n((0,o.join)(e,"packages","opencode","src"),"run.ts"):{command:"opencode",prependArgs:[]}}
|
|
5034
|
-
const o=t(6928)},9072(e,exports,t){"use strict"
|
|
5039
|
+
const o=t(6928),s=t(9896),i=t(5317),a=24},9072(e,exports,t){"use strict"
|
|
5035
5040
|
async function r(e,t,r,n){try{const o=await(0,u.getServerUrl)(r,n)
|
|
5036
5041
|
if(!o)return n.warn("Could not get server URL for notification",{sessionId:e}),!1
|
|
5037
5042
|
let s,i
|