@linkaicli/linkai-cli 1.0.17 → 1.0.18
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/GUIDE.md +1 -2
- package/THIRD_PARTY_NOTICES.txt +1 -1
- package/dist/bundle/core.mjs +2 -3
- package/package.json +5 -2
- package/skills/linkai-usage/SKILL.md +2 -1
package/GUIDE.md
CHANGED
|
@@ -95,8 +95,7 @@ AI 会先给你看搭建计划(不会直接动手),你确认后才执行
|
|
|
95
95
|
|
|
96
96
|
## 升级
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
确实需要关闭时设置环境变量 `LINKAI_NO_AUTO_UPGRADE=1`。
|
|
98
|
+
**自动升级**:LinkAI-CLI 自动保持最新版本,不需要手动操作。发布了必须升级的版本时,下一条命令会先自动升级(约 10 秒)再执行;自动升级失败时命令会提示手动升级的方法。技能随之自动更新。
|
|
100
99
|
|
|
101
100
|
手动升级(自动升级不可用时):
|
|
102
101
|
|
package/THIRD_PARTY_NOTICES.txt
CHANGED
package/dist/bundle/core.mjs
CHANGED
|
@@ -37,7 +37,7 @@ complete -c linkai -f -a '(
|
|
|
37
37
|
`,{mode:384})}catch{}}function buildEvent(type2,data2,flowOverride){let s=state();return s.n+=1,{schema:OPLOG_SCHEMA,eventId:randomUUID2(),type:type2,ts:new Date().toISOString(),runId:s.runId,sessionId:s.sessionId,runSeq:s.runSeq,n:s.n,installId:s.installId,cli:{version:PKG_VERSION,node:process.versions.node,os:`${process.platform}-${process.arch}`},caller:s.caller,identity:s.identity,flow:flowOverride??s.flow,data:data2}}function emit(type2,data2={},flowOverride){if(uploaderMode())return;let s=state();if(type2==="command.start"&&typeof data2.command=="string"&&(s.command=data2.command,s.access=typeof data2.access=="string"?data2.access:null),type2==="build.stage"&&s.flow&&typeof data2.stage=="string"&&data2.stage!=="validate")try{buildProgress(s.flow.id,data2.stage,data2.ok!==!1)}catch{}let event=buildEvent(type2,data2,flowOverride);appendSpool(JSON.stringify(event)),scheduleFlush()}function setIdentity(identity){let s=state(),changed=JSON.stringify(s.identity)!==JSON.stringify(identity);s.identity=identity,changed&&identity&&emit("identity",{...identity})}function setTransport(fn){state().transport=fn,scheduleFlush()}function scheduleFlush(){let s=state();!s.transport||s.flushTimer||testMode()||inBackoff()||(s.flushTimer=setTimeout(()=>{s.flushTimer=null,flush()},FLUSH_DELAY_MS),s.flushTimer.unref?.())}function flush({force=!1}={}){let s=state();if(!s.transport||!force&&inBackoff())return Promise.resolve();if(s.flushing)return s.flushing;let abort=new AbortController;return s.abort=abort,s.flushing=(async()=>{try{let dir3=oplogDir(),now=Date.now(),claims=[];for(let name of fs6.existsSync(dir3)?fs6.readdirSync(dir3):[]){if(!name.startsWith("sending-"))continue;let full=path5.join(dir3,name);try{now-fs6.statSync(full).mtimeMs>STALE_CLAIM_MS&&claims.push(full)}catch{}}let mine=path5.join(dir3,`sending-${process.pid}-${now}.jsonl`);try{fs6.renameSync(spoolFile(),mine),claims.push(mine)}catch{}for(let file of claims){let lines;try{lines=fs6.readFileSync(file,"utf8").split(`
|
|
38
38
|
`).filter(Boolean)}catch{continue}let events=lines.map(l=>{try{return JSON.parse(l)}catch{return null}}).filter(e=>e!==null).map(e=>e.identity||e.runId!==s.runId||!s.identity?e:{...e,identity:s.identity}),failedFrom=-1;for(let i2=0;i2<events.length;i2+=BATCH_MAX){let ok=!1;try{ok=!abort.signal.aborted&&await s.transport(events.slice(i2,i2+BATCH_MAX),abort.signal)}catch{ok=!1}if(!ok){failedFrom=i2;break}}if(abort.signal.aborted||recordUpload(failedFrom<0),failedFrom>=0){let rest=events.slice(failedFrom).map(e=>JSON.stringify(e)).join(`
|
|
39
39
|
`);try{fs6.appendFileSync(spoolFile(),rest+`
|
|
40
|
-
`,{mode:384})}catch{}}try{fs6.rmSync(file,{force:!0})}catch{}if(failedFrom>=0)break}}finally{s.flushing=null,s.abort=null}})(),s.flushing}function startRun(argv){let s=state();s.n>0||(s.argv=argv,uploaderMode()||attachFlow(),emit("run.start",{argv:describeArgv(argv),cwdHash:sha256(process.cwd()).slice(0,16),pid:process.pid,worker:process.env.LINKAI_COLLAB_WORKER||null,processUptimeMs:Math.round(process.uptime()*1e3),parentRunId:process.env.LINKAI_PARENT_RUN_ID||null}),process.env.LINKAI_PARENT_RUN_ID=s.runId,process.once("exit",code=>{if(!s.ended){s.ended=!0;let outcome=finalOutcome(s,code);emit("run.end",{exitCode:code,durationMs:Date.now()-s.startedAt,...outcome,abrupt:!0}),flowRunEnded(s,outcome)}}))}function attachFlow(){let s=state();try{let idleMs=flowIdleMs(),worker=process.env.LINKAI_COLLAB_WORKER||null;s.flowKey=flowKey({installId:s.installId,agent:s.caller.agent,cwdHash:sha256(process.cwd()).slice(0,16),worker,toolSessionId:s.caller.toolSessionId??null});let selfReported=cleanModelName(process.env.LINKAI_AI_MODEL),begun=beginRun({key:s.flowKey,agent:s.caller.agent,worker,idleMs,explicitId:process.env.LINKAI_FLOW||null,board:boardForWorker(worker),runId:s.runId,pid:process.pid,model:selfReported});for(let f of begun.stalled)emit("flow.stalled",{status:f.status,reason:f.reason,source:f.source,goal:f.goal,type:f.type,plan:f.plan,lastActivity:new Date(f.lastActivity).toISOString(),lastCommand:f.lastCommand,lastErrorCode:f.lastErrorCode,build:f.build,openRuns:Object.keys(f.runsOpen).length,idleMinutes:idleMs/6e4},{id:f.id,attach:"detected"});s.flow={id:begun.id,attach:begun.attach},s.caller.model=begun.model?{name:begun.model,source:"self-reported"}:null}catch{}}function flowRunEnded(s,outcome){if(s.flow)try{runEnded(s.flow.id,s.runId,{command:s.command??describeArgv(s.argv).command,ok:typeof outcome.ok=="boolean"?outcome.ok:null,errorCode:typeof outcome.errorCode=="string"?outcome.errorCode:null,outcomeUnknown:outcome.outcomeUnknown===!0})}catch{}}function flowNotice(){let s=state();if(!s.flow||!s.command||NOTICE_EXEMPT.test(s.command)||s.access!=="write"&&s.command!=="linkai/status")return null;try{if(getFlow(s.flow.id)?.source!=="auto")return null}catch{return null}return flowNoticeDue(s.flow.id)?'\u5F53\u524D\u4EFB\u52A1\u5C1A\u672A\u5F00\u59CB\u5DE5\u4F5C\u6D41\u3002\u6BCF\u4E2A\u4E1A\u52A1\u4EFB\u52A1\u8BF7\u5148\u6267\u884C linkai flow-start --goal "<\u7528\u6237\u76EE\u6807>" --type create|modify|import|query --model "<\u4F60\u7684\u6A21\u578B\u4E0E\u7248\u672C>"\uFF0C\u4E4B\u540E\u7684\u547D\u4EE4\u81EA\u52A8\u5F52\u5165\uFF1B\u5B8C\u6210\u540E linkai flow-end --status delivered\uFF08\u653E\u5F03\u6216\u5931\u8D25\u7528 abandoned / failed\uFF09\u3002':null}function flowNoticeDue(flowId,now=Date.now()){let file=path5.join(oplogDir(),"hints.json");try{let hints={};try{hints=JSON.parse(fs6.readFileSync(file,"utf8"))||{}}catch{}let last=hints.flowNotice?.[flowId]??0;if(now-last>=0&&now-last<FLOW_NOTICE_INTERVAL_MS)return!1;let kept=Object.entries(hints.flowNotice||{}).sort((a,b)=>b[1]-a[1]).slice(0,19);return hints.flowNotice=Object.fromEntries([...kept,[flowId,now]]),fs6.writeFileSync(file,JSON.stringify(hints),{mode:384}),!0}catch{return!0}}function currentModel(){return state().caller.model?.name??null}function currentFlow(){return state().flow}function startFlow2(init){let s=state();if(!FLOW_TYPES.includes(init.type))throw new Error(`\u5DE5\u4F5C\u6D41\u7C7B\u578B\u53EA\u80FD\u662F ${FLOW_TYPES.join(" / ")}`);if(!String(init.goal||"").trim())throw new Error("\u9700\u8981 --goal\uFF08\u8FD9\u4E2A\u5DE5\u4F5C\u6D41\u8981\u5B8C\u6210\u4EC0\u4E48\uFF09");let worker=process.env.LINKAI_COLLAB_WORKER||null,previous=s.flow,f=startFlow({id:init.id,adoptId:previous?.id??null,source:init.source??"explicit",goal:String(init.goal).trim().slice(0,500),type:init.type,plan:init.plan??null,key:s.flowKey,agent:s.caller.agent,worker}),adopted=previous?.id===f.id;if(previous&&previous.id!==f.id){try{runEnded(previous.id,s.runId,{})}catch{}try{runStarted(f.id,s.runId,process.pid)}catch{}}s.flow={id:f.id,attach:init.source==="board"?"board":"flag"};let model=cleanModelName(init.model)??cleanModelName(process.env.LINKAI_AI_MODEL)??(previous?getFlow(previous.id)?.model:null)??null;return model&&(setModel(f.id,model),s.caller.model={name:model,source:"self-reported"}),emit("flow.start",{goal:f.goal,type:f.type,plan:f.plan,source:f.source,model,previousFlow:previous?.id!==f.id?previous?.id??null:null,adopted}),f}function endFlow2(init){let s=state(),id=init.id||s.flow?.id;if(!id)throw new Error("\u6CA1\u6709\u5F53\u524D\u5DE5\u4F5C\u6D41\uFF1B\u7528 --flow <id> \u6307\u5B9A");if(!FLOW_END_STATUSES.includes(init.status))throw new Error(`\u7ED3\u675F\u72B6\u6001\u53EA\u80FD\u662F ${FLOW_END_STATUSES.join(" / ")}`);let f=endFlow(id,init.status,init.result??null);return emit("flow.end",{status:f.status,result:f.result,goal:f.goal,type:f.type,plan:f.plan,source:f.source,runs:f.runs,durationMs:(f.endedAt??Date.now())-f.startedAt},{id:f.id,attach:s.flow?.id===f.id?s.flow.attach:"flag"}),f}function mark(phase){let s=state();s.marks[phase]=Date.now()-s.startedAt}function startupMarks(){let s=state();return{...s.marks,total:Date.now()-s.startedAt,sinceProcessStart:Math.round(process.uptime()*1e3)}}function finalOutcome(s,exitCode){if(s.outcome)return s.outcome;let help=s.argv.some(a=>HELP_FLAGS.has(a));return{ok:Number(exitCode??0)===0,...help?{kind:"help"}:{}}}function setOutcome(outcome){state().outcome=outcome}function pendingUpload(){try{return fs6.existsSync(spoolFile())&&fs6.statSync(spoolFile()).size>0?!0:fs6.readdirSync(oplogDir()).some(n=>n.startsWith("sending-"))}catch{return!1}}function uploaderRunning(){try{let{pid,at:at2}=JSON.parse(fs6.readFileSync(lockFile(),"utf8"));return Date.now()-at2>UPLOADER_TIMEOUT_MS+5e3?!1:(process.kill(pid,0),!0)}catch{return!1}}function spawnUploader(entry=process.argv[1]){if(testMode()||uploaderMode()||!entry||inBackoff()||!pendingUpload()||uploaderRunning())return!1;try{return spawn(process.execPath,[entry,"__oplog-upload"],{detached:!0,stdio:"ignore",windowsHide:!0,env:{...process.env,LINKAI_OPLOG_UPLOADER:"1"}}).unref(),!0}catch{return!1}}async function runUploader(timeoutMs=UPLOADER_TIMEOUT_MS){let s=state();if(!s.transport)return;try{ensureDir(),fs6.writeFileSync(lockFile(),JSON.stringify({pid:process.pid,at:Date.now()}),{mode:384})}catch{}let deadline=Date.now()+timeoutMs,timer=setTimeout(()=>s.abort?.abort(),timeoutMs);try{for(;Date.now()<deadline&&pendingUpload()&&!inBackoff();)await flush(),pendingUpload()&&await new Promise(r=>setTimeout(r,500))}finally{clearTimeout(timer);try{fs6.rmSync(lockFile(),{force:!0})}catch{}}}async function endRun(graceMs=300){let s=state();if(s.ended)return!1;s.ended=!0,s.flushTimer&&(clearTimeout(s.flushTimer),s.flushTimer=null);let outcome=finalOutcome(s,process.exitCode);emit("run.end",{exitCode:process.exitCode??0,durationMs:Date.now()-s.startedAt,...outcome}),flowRunEnded(s,outcome),s.flushTimer&&(clearTimeout(s.flushTimer),s.flushTimer=null);let aborted=!1;if(s.flushing){let pending=s.flushing,timer;await Promise.race([pending,new Promise(r=>{timer=setTimeout(()=>{aborted=!0,s.abort?.abort(),r()},graceMs)})]),clearTimeout(timer),await pending.catch(()=>{})}return spawnUploader(),aborted}function _resetForTests(){let s=globalThis.__linkai_oplog__;s?.flushTimer&&clearTimeout(s.flushTimer),globalThis.__linkai_oplog__=void 0}var OPLOG_SCHEMA,SESSION_IDLE_MS,SPOOL_MAX_BYTES,BATCH_MAX,FLUSH_DELAY_MS,STALE_CLAIM_MS,BACKOFF_BASE_MS,BACKOFF_MAX_MS,backoffFile,spoolFile,testMode,uploaderMode,UPLOADER_TIMEOUT_MS,lockFile,sha256,AGENT_ENV,AGENT_PROC,withLock2,SECRET_ARG,FILE_ARG,flowIdleMs,NOTICE_EXEMPT,FLOW_NOTICE_INTERVAL_MS,saveServerConfig2,listFlows2,unfinishedFlows2,flowIdleMinutes2,HELP_FLAGS,init_oplog=__esm({"dist/src/oplog.js"(){"use strict";init_version();init_oplog_flow();init_oplog_agent();init_notices();OPLOG_SCHEMA="linkai.oplog/1",SESSION_IDLE_MS=1800*1e3,SPOOL_MAX_BYTES=20*1024*1024,BATCH_MAX=200,FLUSH_DELAY_MS=300,STALE_CLAIM_MS=60*1e3,BACKOFF_BASE_MS=60*1e3,BACKOFF_MAX_MS=3600*1e3,backoffFile=()=>path5.join(oplogDir(),"upload-state.json");spoolFile=()=>path5.join(oplogDir(),"spool.jsonl"),testMode=()=>!!process.env.VITEST,uploaderMode=()=>process.env.LINKAI_OPLOG_UPLOADER==="1",UPLOADER_TIMEOUT_MS=30*1e3,lockFile=()=>path5.join(oplogDir(),"uploader.lock");sha256=s=>createHash("sha256").update(s).digest("hex"),AGENT_ENV=[[/WORKBUDDY/i,"workbuddy"],[/^CLAUDECODE$|^CLAUDE_CODE_/,"claude"],[/^CODEX_/,"codex"],[/CODEBUDDY/i,"codebuddy"],[/^CURSOR_/,"cursor"]],AGENT_PROC=[[/claude/i,"claude"],[/codex/i,"codex"],[/workbuddy/i,"workbuddy"],[/codebuddy/i,"codebuddy"],[/cursor/i,"cursor"],[/deepseek/i,"deepseek"]];withLock2=withLock;SECRET_ARG=/pass(word)?|token|secret|cookie|credential|authorization|api[-_]?key/i,FILE_ARG=/^(file|spec|body|sql|input|output|dir|image|path|config)$/i;flowIdleMs=()=>flowIdleMinutes()*60*1e3;NOTICE_EXEMPT=/^linkai\/(flow-|collab-|login$|logout$)/;FLOW_NOTICE_INTERVAL_MS=10*6e4;saveServerConfig2=saveServerConfig,listFlows2=listFlows,unfinishedFlows2=unfinishedFlows,flowIdleMinutes2=flowIdleMinutes;HELP_FLAGS=new Set(["--help","-h","help"])}});var command_output_exports={};__export(command_output_exports,{emitFailure:()=>emitFailure,emitResult:()=>emitResult,resultShape:()=>resultShape});function deliver(list2){for(let n of list2)emit("notice",{kind:n.kind,text:n.text.slice(0,200),chars:n.text.length});return list2.length?list2.map(n=>n.text).join(" "):null}function notices(){let flow=flowNotice();return deliver([...takeNotices(),...flow?[{text:flow,kind:"flow-start"}]:[]])}function resultShape(data2){return Array.isArray(data2)?{kind:"array",rows:data2.length}:data2&&typeof data2=="object"?{kind:"object",keys:Object.keys(data2).slice(0,30)}:{kind:data2==null?"null":typeof data2}}function emitResult(data2){let notice=notices(),text=JSON.stringify({ok:!0,data:data2??null,...notice?{notice}:{}});setOutcome({ok:!0,outputBytes:Buffer.byteLength(text),result:resultShape(data2)}),console.log(text)}function emitFailure(error,exitCode){let wire=error,previous=wire?.ok===!1&&wire.error&&typeof wire.error=="object"?wire:void 0;previous&&(error=previous.error);let envelope=toEnvelope(error);if(previous?.trace&&(envelope.trace=previous.trace),error&&typeof error=="object"){let details2=error;for(let key of["code","message","hint","candidates","matches_n","details","expected","actual","available","available_keys","download"])["code","message","hint"].includes(key)&&typeof details2[key]!="string"||details2[key]!==void 0&&(envelope.error[key]=details2[key])}["command_result_unknown","command_lost","result_evicted","outcome_unknown","detached_mid_command","cdp_timeout"].includes(envelope.error.code)&&(envelope.error.outcome="unknown");let details=envelope.error;envelope.error.help&&(details.hint??=envelope.error.help,delete envelope.error.help),(envelope.error.code==="usage_error"||envelope.error.code.startsWith("commander."))&&(envelope.error.exitCode=2),exitCode!==void 0&&(envelope.error.exitCode=exitCode),envelope.error.code==="UNKNOWN"&&envelope.error.exitCode===2&&(envelope.error.code="usage_error");let pending=deliver(takeNotices()),text=JSON.stringify(pending?{...envelope,notice:pending}:envelope);setOutcome({ok:!1,errorCode:envelope.error.code,errorExitCode:envelope.error.exitCode||1,message:String(envelope.error.message||"").slice(0,500),outcomeUnknown:details.outcome==="unknown"||void 0}),console.log(text),process.exitCode=envelope.error.exitCode||1}var init_command_output=__esm({"dist/src/command-output.js"(){"use strict";init_errors();init_oplog();init_notices()}});var self_upgrade_exports={};__export(self_upgrade_exports,{PACKAGE_NAME:()=>PACKAGE_NAME,autoUpgradeEnabled:()=>autoUpgradeEnabled,belowMinVersion:()=>belowMinVersion,checkAndUpgrade:()=>checkAndUpgrade,checkDue:()=>checkDue,compareVersions:()=>compareVersions,fetchLatest:()=>fetchLatest,installPrefix:()=>installPrefix,npmCommand:()=>npmCommand,readState:()=>readState,reexec:()=>reexec,registryUrl:()=>registryUrl,spawnBackgroundUpgrade:()=>spawnBackgroundUpgrade,takeResult:()=>takeResult,verifyIntegrity:()=>verifyIntegrity});import{spawn as spawn2,spawnSync}from"node:child_process";import{createHash as createHash2}from"node:crypto";import*as fs7 from"node:fs";import*as os4 from"node:os";import*as path6 from"node:path";function readState(){try{return JSON.parse(fs7.readFileSync(stateFile(),"utf8"))||{}}catch{return{}}}function writeState(patch){let next={...readState(),...patch};try{fs7.mkdirSync(dir2(),{recursive:!0,mode:448});let tmp=`${stateFile()}.${process.pid}.tmp`;fs7.writeFileSync(tmp,JSON.stringify(next),{mode:384}),fs7.renameSync(tmp,stateFile())}catch{}return next}function compareVersions(a,b){let p=v=>String(v).replace(/^v/,"").split("-")[0].split(".").map(n=>Number(n)||0),[x,y]=[p(a),p(b)];for(let i2=0;i2<3;i2++)if((x[i2]??0)!==(y[i2]??0))return(x[i2]??0)-(y[i2]??0);return 0}function registryUrl(env=process.env,pkgDir=PKG_DIR){if(env.LINKAI_REGISTRY)return env.LINKAI_REGISTRY.replace(/\/+$/,"");try{let pkg=JSON.parse(fs7.readFileSync(path6.join(pkgDir,"package.json"),"utf8"));return String(pkg.publishConfig?.registry||"").replace(/\/+$/,"")}catch{return""}}function installPrefix(pkgDir=PKG_DIR,platform2=process.platform){let parts=(platform2==="win32"?path6.win32:path6.posix).resolve(pkgDir).split(/[\\/]+/),n=parts.length;if(n<4||parts[n-1]!=="linkai-cli"||parts[n-2]!=="@linkaicli"||parts[n-3]!=="node_modules"||parts.includes("_npx")||parts.includes(".npm"))return null;let sep4=platform2==="win32"?"\\":"/",before=parts.slice(0,n-3);if(platform2!=="win32"){if(before[before.length-1]!=="lib")return null;before.pop()}return before.join(sep4)||sep4}function autoUpgradeEnabled(env=process.env){return env.LINKAI_NO_AUTO_UPGRADE==="1"||env.CI||env.CONTINUOUS_INTEGRATION||env.VITEST?!1:!!registryUrl(env)&&installPrefix()!==null}async function fetchLatest(registry=registryUrl()){let headers={Accept:"application/json"};process.env.LINKAI_REGISTRY_TOKEN&&(headers.Authorization=`Bearer ${process.env.LINKAI_REGISTRY_TOKEN}`);let res=await fetch(`${registry}/${PACKAGE_NAME.replace("/","%2f")}`,{headers,signal:AbortSignal.timeout(FETCH_TIMEOUT_MS)});if(!res.ok)throw new Error(`\u7248\u672C\u67E5\u8BE2\u5931\u8D25\uFF1AHTTP ${res.status}`);let doc=await res.json(),version2=doc["dist-tags"]?.latest,meta=version2?doc.versions?.[version2]:void 0;if(!version2||!meta?.dist?.tarball)throw new Error("\u6E90\u4E0A\u6CA1\u6709\u53EF\u7528\u7684\u7248\u672C\u4FE1\u606F");return{version:version2,tarball:meta.dist.tarball,integrity:meta.dist.integrity,shasum:meta.dist.shasum,minVersion:meta.linkaiUpgrade?.minVersion||null}}function verifyIntegrity(buf,m){let sri=String(m.integrity||"").split(/\s+/).find(x=>x.startsWith("sha512-"));return sri?`sha512-${createHash2("sha512").update(buf).digest("base64")}`===sri:m.shasum?createHash2("sha1").update(buf).digest("hex")===m.shasum:!1}async function download(m){let headers={};process.env.LINKAI_REGISTRY_TOKEN&&(headers.Authorization=`Bearer ${process.env.LINKAI_REGISTRY_TOKEN}`);let res=await fetch(m.tarball,{headers,signal:AbortSignal.timeout(INSTALL_TIMEOUT_MS)});if(!res.ok)throw new Error(`\u4E0B\u8F7D\u5931\u8D25\uFF1AHTTP ${res.status}`);let buf=Buffer.from(await res.arrayBuffer());if(!verifyIntegrity(buf,m))throw new Error("\u5B89\u88C5\u5305\u6821\u9A8C\u5931\u8D25\uFF08integrity \u4E0D\u5339\u914D\uFF09\uFF0C\u672A\u5B89\u88C5");fs7.mkdirSync(dir2(),{recursive:!0,mode:448});let file=path6.join(dir2(),`linkai-cli-${m.version}.tgz`);return fs7.writeFileSync(file,buf,{mode:384}),file}function npmCommand(execPath=process.execPath,platform2=process.platform){let bin=path6.dirname(execPath),cli2=(platform2==="win32"?[path6.join(bin,"node_modules","npm","bin","npm-cli.js")]:[path6.join(bin,"..","lib","node_modules","npm","bin","npm-cli.js"),path6.join(bin,"node_modules","npm","bin","npm-cli.js")]).find(c=>fs7.existsSync(c));return cli2?{cmd:execPath,args:[cli2],shell:!1}:{cmd:platform2==="win32"?"npm.cmd":"npm",args:[],shell:platform2==="win32"}}function npmInstall(tgz,prefix){let npm=npmCommand(),r=spawnSync(npm.cmd,[...npm.args,"install","-g",tgz,"--prefix",prefix,"--no-audit","--no-fund","--loglevel=error"],{encoding:"utf8",timeout:INSTALL_TIMEOUT_MS,shell:npm.shell,windowsHide:!0,env:{...process.env,npm_config_update_notifier:"false"}});if(r.status!==0)throw new Error(`npm \u5B89\u88C5\u5931\u8D25\uFF1A${String(r.stderr||r.error?.message||r.status).trim().slice(-300)}`)}function installedVersion(pkgDir){try{return JSON.parse(fs7.readFileSync(path6.join(pkgDir,"package.json"),"utf8")).version||null}catch{return null}}function acquireLock(){try{fs7.mkdirSync(dir2(),{recursive:!0,mode:448});try{let st=fs7.statSync(lockFile2());if(Date.now()-st.mtimeMs<LOCK_STALE_MS)return!1;fs7.rmSync(lockFile2(),{force:!0})}catch{}return fs7.writeFileSync(lockFile2(),String(process.pid),{flag:"wx"}),!0}catch{return!1}}async function checkAndUpgrade({force=!1,pkgDir=PKG_DIR,current:current2=PKG_VERSION,registry=registryUrl()}={}){let prefix=installPrefix(pkgDir);if(!registry||!prefix||!acquireLock())return null;let started=Date.now(),latest;try{writeState({lastAttempt:started}),latest=await fetchLatest(registry);let prev=readState();if(writeState({lastCheck:Date.now(),failures:0,latest:latest.version,minVersion:latest.minVersion}),compareVersions(latest.version,current2)<=0||!force&&prev.skip?.version===latest.version&&Date.now()<prev.skip.until)return releaseLock(),null}catch{let failures=(readState().failures||0)+1;return writeState({failures}),releaseLock(),null}let from=current2,result;try{let tgz=await download(latest);npmInstall(tgz,prefix);let now=installedVersion(pkgDir);if(now!==latest.version)throw new Error(`\u5B89\u88C5\u540E\u7248\u672C\u662F ${now??"\u672A\u77E5"}\uFF0C\u4E0D\u662F ${latest.version}`);result={ok:!0,from,to:latest.version,at:Date.now(),ms:Date.now()-started,prefix};try{fs7.rmSync(tgz,{force:!0})}catch{}}catch(error){let rolledBack=!1;if(installedVersion(pkgDir)!==from)try{let dist=(await fetch(`${registry}/${PACKAGE_NAME.replace("/","%2f")}`,{signal:AbortSignal.timeout(FETCH_TIMEOUT_MS)}).then(r=>r.json())).versions?.[from]?.dist;dist?.tarball&&(npmInstall(await download({version:from,tarball:dist.tarball,integrity:dist.integrity,shasum:dist.shasum,minVersion:null}),prefix),rolledBack=!0)}catch{}result={ok:!1,from,to:latest.version,at:Date.now(),ms:Date.now()-started,error:String(error.message).slice(0,300),rolledBack,prefix},writeState({skip:{version:latest.version,until:Date.now()+RETRY_MAX_MS}})}return writeState({result}),releaseLock(),result}function checkDue(state2=readState(),now=Date.now()){if(now-(state2.lastCheck||0)<CHECK_INTERVAL_MS)return!1;let backoff=Math.min(RETRY_MAX_MS,RETRY_BASE_MS*2**Math.max(0,(state2.failures||0)-1));return!state2.failures||now-(state2.lastAttempt||0)>=backoff}function spawnBackgroundUpgrade(entry=process.argv[1]){if(!entry||!autoUpgradeEnabled()||process.env.LINKAI_UPGRADER==="1"||!checkDue())return!1;try{return spawn2(process.execPath,[entry,"__self-upgrade"],{detached:!0,stdio:"ignore",windowsHide:!0,env:{...process.env,LINKAI_UPGRADER:"1"}}).unref(),!0}catch{return!1}}function belowMinVersion(state2=readState()){return!!(state2.minVersion&&compareVersions(state2.minVersion,PKG_VERSION)>0)}function takeResult(){let s=readState();return s.result?(writeState({result:null}),s.result):null}function reexec(entry,argv){return spawnSync(process.execPath,[entry,...argv],{stdio:"inherit",env:{...process.env,LINKAI_REEXEC:"1"}}).status??1}var PACKAGE_NAME,CHECK_INTERVAL_MS,RETRY_BASE_MS,RETRY_MAX_MS,LOCK_STALE_MS,FETCH_TIMEOUT_MS,INSTALL_TIMEOUT_MS,dir2,stateFile,lockFile2,releaseLock,init_self_upgrade=__esm({"dist/src/self-upgrade.js"(){"use strict";init_version();PACKAGE_NAME="@linkaicli/linkai-cli",CHECK_INTERVAL_MS=4*36e5,RETRY_BASE_MS=30*6e4,RETRY_MAX_MS=24*36e5,LOCK_STALE_MS=10*6e4,FETCH_TIMEOUT_MS=15e3,INSTALL_TIMEOUT_MS=18e4,dir2=()=>path6.join(os4.homedir(),".linkai","upgrade"),stateFile=()=>path6.join(dir2(),"state.json"),lockFile2=()=>path6.join(dir2(),"lock");releaseLock=()=>{try{fs7.rmSync(lockFile2(),{force:!0})}catch{}}}});function getDefaultExportFromCjs(x){return x&&x.__esModule&&Object.prototype.hasOwnProperty.call(x,"default")?x.default:x}function requireCommon(){if(hasRequiredCommon)return common;hasRequiredCommon=1;function isNothing(subject){return typeof subject>"u"||subject===null}function isObject(subject){return typeof subject=="object"&&subject!==null}function toArray(sequence){return Array.isArray(sequence)?sequence:isNothing(sequence)?[]:[sequence]}function extend2(target,source){if(source){let sourceKeys=Object.keys(source);for(let index=0,length=sourceKeys.length;index<length;index+=1){let key=sourceKeys[index];target[key]=source[key]}}return target}function repeat(string,count){let result="";for(let cycle=0;cycle<count;cycle+=1)result+=string;return result}function isNegativeZero(number){return number===0&&Number.NEGATIVE_INFINITY===1/number}return common.isNothing=isNothing,common.isObject=isObject,common.toArray=toArray,common.repeat=repeat,common.isNegativeZero=isNegativeZero,common.extend=extend2,common}function requireException(){if(hasRequiredException)return exception;hasRequiredException=1;function formatError(exception2,compact){let where="",message=exception2.reason||"(unknown reason)";return exception2.mark?(exception2.mark.name&&(where+='in "'+exception2.mark.name+'" '),where+="("+(exception2.mark.line+1)+":"+(exception2.mark.column+1)+")",!compact&&exception2.mark.snippet&&(where+=`
|
|
40
|
+
`,{mode:384})}catch{}}try{fs6.rmSync(file,{force:!0})}catch{}if(failedFrom>=0)break}}finally{s.flushing=null,s.abort=null}})(),s.flushing}function startRun(argv){let s=state();s.n>0||(s.argv=argv,uploaderMode()||attachFlow(),emit("run.start",{argv:describeArgv(argv),cwdHash:sha256(process.cwd()).slice(0,16),pid:process.pid,worker:process.env.LINKAI_COLLAB_WORKER||null,processUptimeMs:Math.round(process.uptime()*1e3),parentRunId:process.env.LINKAI_PARENT_RUN_ID||null}),process.env.LINKAI_PARENT_RUN_ID=s.runId,process.once("exit",code=>{if(!s.ended){s.ended=!0;let outcome=finalOutcome(s,code);emit("run.end",{exitCode:code,durationMs:Date.now()-s.startedAt,...outcome,abrupt:!0}),flowRunEnded(s,outcome)}}))}function attachFlow(){let s=state();try{let idleMs=flowIdleMs(),worker=process.env.LINKAI_COLLAB_WORKER||null;s.flowKey=flowKey({installId:s.installId,agent:s.caller.agent,cwdHash:sha256(process.cwd()).slice(0,16),worker,toolSessionId:s.caller.toolSessionId??null});let selfReported=cleanModelName(process.env.LINKAI_AI_MODEL),begun=beginRun({key:s.flowKey,agent:s.caller.agent,worker,idleMs,explicitId:process.env.LINKAI_FLOW||null,board:boardForWorker(worker),runId:s.runId,pid:process.pid,model:selfReported});for(let f of begun.stalled)emit("flow.stalled",{status:f.status,reason:f.reason,source:f.source,goal:f.goal,type:f.type,plan:f.plan,lastActivity:new Date(f.lastActivity).toISOString(),lastCommand:f.lastCommand,lastErrorCode:f.lastErrorCode,build:f.build,openRuns:Object.keys(f.runsOpen).length,idleMinutes:idleMs/6e4},{id:f.id,attach:"detected"});s.flow={id:begun.id,attach:begun.attach},s.caller.model=begun.model?{name:begun.model,source:"self-reported"}:null}catch{}}function flowRunEnded(s,outcome){if(s.flow)try{runEnded(s.flow.id,s.runId,{command:s.command??describeArgv(s.argv).command,ok:typeof outcome.ok=="boolean"?outcome.ok:null,errorCode:typeof outcome.errorCode=="string"?outcome.errorCode:null,outcomeUnknown:outcome.outcomeUnknown===!0})}catch{}}function flowNotice(){let s=state();if(!s.flow||!s.command||NOTICE_EXEMPT.test(s.command)||s.access!=="write"&&s.command!=="linkai/status")return null;try{if(getFlow(s.flow.id)?.source!=="auto")return null}catch{return null}return flowNoticeDue(s.flow.id)?'\u5F53\u524D\u4EFB\u52A1\u5C1A\u672A\u5F00\u59CB\u5DE5\u4F5C\u6D41\u3002\u6BCF\u4E2A\u4E1A\u52A1\u4EFB\u52A1\u8BF7\u5148\u6267\u884C linkai flow-start --goal "<\u7528\u6237\u76EE\u6807>" --type create|modify|import|query --model "<\u4F60\u7684\u6A21\u578B\u4E0E\u7248\u672C>"\uFF0C\u4E4B\u540E\u7684\u547D\u4EE4\u81EA\u52A8\u5F52\u5165\uFF1B\u5B8C\u6210\u540E linkai flow-end --status delivered\uFF08\u653E\u5F03\u6216\u5931\u8D25\u7528 abandoned / failed\uFF09\u3002':null}function flowNoticeDue(flowId,now=Date.now()){let file=path5.join(oplogDir(),"hints.json");try{let hints={};try{hints=JSON.parse(fs6.readFileSync(file,"utf8"))||{}}catch{}let last=hints.flowNotice?.[flowId]??0;if(now-last>=0&&now-last<FLOW_NOTICE_INTERVAL_MS)return!1;let kept=Object.entries(hints.flowNotice||{}).sort((a,b)=>b[1]-a[1]).slice(0,19);return hints.flowNotice=Object.fromEntries([...kept,[flowId,now]]),fs6.writeFileSync(file,JSON.stringify(hints),{mode:384}),!0}catch{return!0}}function currentModel(){return state().caller.model?.name??null}function currentFlow(){return state().flow}function startFlow2(init){let s=state();if(!FLOW_TYPES.includes(init.type))throw new Error(`\u5DE5\u4F5C\u6D41\u7C7B\u578B\u53EA\u80FD\u662F ${FLOW_TYPES.join(" / ")}`);if(!String(init.goal||"").trim())throw new Error("\u9700\u8981 --goal\uFF08\u8FD9\u4E2A\u5DE5\u4F5C\u6D41\u8981\u5B8C\u6210\u4EC0\u4E48\uFF09");let worker=process.env.LINKAI_COLLAB_WORKER||null,previous=s.flow,f=startFlow({id:init.id,adoptId:previous?.id??null,source:init.source??"explicit",goal:String(init.goal).trim().slice(0,500),type:init.type,plan:init.plan??null,key:s.flowKey,agent:s.caller.agent,worker}),adopted=previous?.id===f.id;if(previous&&previous.id!==f.id){try{runEnded(previous.id,s.runId,{})}catch{}try{runStarted(f.id,s.runId,process.pid)}catch{}}s.flow={id:f.id,attach:init.source==="board"?"board":"flag"};let model=cleanModelName(init.model)??cleanModelName(process.env.LINKAI_AI_MODEL)??(previous?getFlow(previous.id)?.model:null)??null;return model&&(setModel(f.id,model),s.caller.model={name:model,source:"self-reported"}),emit("flow.start",{goal:f.goal,type:f.type,plan:f.plan,source:f.source,model,previousFlow:previous?.id!==f.id?previous?.id??null:null,adopted}),f}function endFlow2(init){let s=state(),id=init.id||s.flow?.id;if(!id)throw new Error("\u6CA1\u6709\u5F53\u524D\u5DE5\u4F5C\u6D41\uFF1B\u7528 --flow <id> \u6307\u5B9A");if(!FLOW_END_STATUSES.includes(init.status))throw new Error(`\u7ED3\u675F\u72B6\u6001\u53EA\u80FD\u662F ${FLOW_END_STATUSES.join(" / ")}`);let f=endFlow(id,init.status,init.result??null);return emit("flow.end",{status:f.status,result:f.result,goal:f.goal,type:f.type,plan:f.plan,source:f.source,runs:f.runs,durationMs:(f.endedAt??Date.now())-f.startedAt},{id:f.id,attach:s.flow?.id===f.id?s.flow.attach:"flag"}),f}function mark(phase){let s=state();s.marks[phase]=Date.now()-s.startedAt}function startupMarks(){let s=state();return{...s.marks,total:Date.now()-s.startedAt,sinceProcessStart:Math.round(process.uptime()*1e3)}}function finalOutcome(s,exitCode){if(s.outcome)return s.outcome;let help=s.argv.some(a=>HELP_FLAGS.has(a));return{ok:Number(exitCode??0)===0,...help?{kind:"help"}:{}}}function setOutcome(outcome){state().outcome=outcome}function pendingUpload(){try{return fs6.existsSync(spoolFile())&&fs6.statSync(spoolFile()).size>0?!0:fs6.readdirSync(oplogDir()).some(n=>n.startsWith("sending-"))}catch{return!1}}function uploaderRunning(){try{let{pid,at:at2}=JSON.parse(fs6.readFileSync(lockFile(),"utf8"));return Date.now()-at2>UPLOADER_TIMEOUT_MS+5e3?!1:(process.kill(pid,0),!0)}catch{return!1}}function spawnUploader(entry=process.argv[1]){if(testMode()||uploaderMode()||!entry||inBackoff()||!pendingUpload()||uploaderRunning())return!1;try{return spawn(process.execPath,[entry,"__oplog-upload"],{detached:!0,stdio:"ignore",windowsHide:!0,env:{...process.env,LINKAI_OPLOG_UPLOADER:"1"}}).unref(),!0}catch{return!1}}async function runUploader(timeoutMs=UPLOADER_TIMEOUT_MS){let s=state();if(!s.transport)return;try{ensureDir(),fs6.writeFileSync(lockFile(),JSON.stringify({pid:process.pid,at:Date.now()}),{mode:384})}catch{}let deadline=Date.now()+timeoutMs,timer=setTimeout(()=>s.abort?.abort(),timeoutMs);try{for(;Date.now()<deadline&&pendingUpload()&&!inBackoff();)await flush(),pendingUpload()&&await new Promise(r=>setTimeout(r,500))}finally{clearTimeout(timer);try{fs6.rmSync(lockFile(),{force:!0})}catch{}}}async function endRun(graceMs=300){let s=state();if(s.ended)return!1;s.ended=!0,s.flushTimer&&(clearTimeout(s.flushTimer),s.flushTimer=null);let outcome=finalOutcome(s,process.exitCode);emit("run.end",{exitCode:process.exitCode??0,durationMs:Date.now()-s.startedAt,...outcome}),flowRunEnded(s,outcome),s.flushTimer&&(clearTimeout(s.flushTimer),s.flushTimer=null);let aborted=!1;if(s.flushing){let pending=s.flushing,timer;await Promise.race([pending,new Promise(r=>{timer=setTimeout(()=>{aborted=!0,s.abort?.abort(),r()},graceMs)})]),clearTimeout(timer),await pending.catch(()=>{})}return spawnUploader(),aborted}function _resetForTests(){let s=globalThis.__linkai_oplog__;s?.flushTimer&&clearTimeout(s.flushTimer),globalThis.__linkai_oplog__=void 0}var OPLOG_SCHEMA,SESSION_IDLE_MS,SPOOL_MAX_BYTES,BATCH_MAX,FLUSH_DELAY_MS,STALE_CLAIM_MS,BACKOFF_BASE_MS,BACKOFF_MAX_MS,backoffFile,spoolFile,testMode,uploaderMode,UPLOADER_TIMEOUT_MS,lockFile,sha256,AGENT_ENV,AGENT_PROC,withLock2,SECRET_ARG,FILE_ARG,flowIdleMs,NOTICE_EXEMPT,FLOW_NOTICE_INTERVAL_MS,saveServerConfig2,listFlows2,unfinishedFlows2,flowIdleMinutes2,HELP_FLAGS,init_oplog=__esm({"dist/src/oplog.js"(){"use strict";init_version();init_oplog_flow();init_oplog_agent();init_notices();OPLOG_SCHEMA="linkai.oplog/1",SESSION_IDLE_MS=1800*1e3,SPOOL_MAX_BYTES=20*1024*1024,BATCH_MAX=200,FLUSH_DELAY_MS=300,STALE_CLAIM_MS=60*1e3,BACKOFF_BASE_MS=60*1e3,BACKOFF_MAX_MS=3600*1e3,backoffFile=()=>path5.join(oplogDir(),"upload-state.json");spoolFile=()=>path5.join(oplogDir(),"spool.jsonl"),testMode=()=>!!process.env.VITEST,uploaderMode=()=>process.env.LINKAI_OPLOG_UPLOADER==="1",UPLOADER_TIMEOUT_MS=30*1e3,lockFile=()=>path5.join(oplogDir(),"uploader.lock");sha256=s=>createHash("sha256").update(s).digest("hex"),AGENT_ENV=[[/WORKBUDDY/i,"workbuddy"],[/^CLAUDECODE$|^CLAUDE_CODE_/,"claude"],[/^CODEX_/,"codex"],[/CODEBUDDY/i,"codebuddy"],[/^CURSOR_/,"cursor"]],AGENT_PROC=[[/claude/i,"claude"],[/codex/i,"codex"],[/workbuddy/i,"workbuddy"],[/codebuddy/i,"codebuddy"],[/cursor/i,"cursor"],[/deepseek/i,"deepseek"]];withLock2=withLock;SECRET_ARG=/pass(word)?|token|secret|cookie|credential|authorization|api[-_]?key/i,FILE_ARG=/^(file|spec|body|sql|input|output|dir|image|path|config)$/i;flowIdleMs=()=>flowIdleMinutes()*60*1e3;NOTICE_EXEMPT=/^linkai\/(flow-|collab-|login$|logout$)/;FLOW_NOTICE_INTERVAL_MS=10*6e4;saveServerConfig2=saveServerConfig,listFlows2=listFlows,unfinishedFlows2=unfinishedFlows,flowIdleMinutes2=flowIdleMinutes;HELP_FLAGS=new Set(["--help","-h","help"])}});var command_output_exports={};__export(command_output_exports,{emitFailure:()=>emitFailure,emitResult:()=>emitResult,resultShape:()=>resultShape});function deliver(list2){for(let n of list2)emit("notice",{kind:n.kind,text:n.text.slice(0,200),chars:n.text.length});return list2.length?list2.map(n=>n.text).join(" "):null}function notices(){let flow=flowNotice();return deliver([...takeNotices(),...flow?[{text:flow,kind:"flow-start"}]:[]])}function resultShape(data2){return Array.isArray(data2)?{kind:"array",rows:data2.length}:data2&&typeof data2=="object"?{kind:"object",keys:Object.keys(data2).slice(0,30)}:{kind:data2==null?"null":typeof data2}}function emitResult(data2){let notice=notices(),text=JSON.stringify({ok:!0,data:data2??null,...notice?{notice}:{}});setOutcome({ok:!0,outputBytes:Buffer.byteLength(text),result:resultShape(data2)}),console.log(text)}function emitFailure(error,exitCode){let wire=error,previous=wire?.ok===!1&&wire.error&&typeof wire.error=="object"?wire:void 0;previous&&(error=previous.error);let envelope=toEnvelope(error);if(previous?.trace&&(envelope.trace=previous.trace),error&&typeof error=="object"){let details2=error;for(let key of["code","message","hint","candidates","matches_n","details","expected","actual","available","available_keys","download"])["code","message","hint"].includes(key)&&typeof details2[key]!="string"||details2[key]!==void 0&&(envelope.error[key]=details2[key])}["command_result_unknown","command_lost","result_evicted","outcome_unknown","detached_mid_command","cdp_timeout"].includes(envelope.error.code)&&(envelope.error.outcome="unknown");let details=envelope.error;envelope.error.help&&(details.hint??=envelope.error.help,delete envelope.error.help),(envelope.error.code==="usage_error"||envelope.error.code.startsWith("commander."))&&(envelope.error.exitCode=2),exitCode!==void 0&&(envelope.error.exitCode=exitCode),envelope.error.code==="UNKNOWN"&&envelope.error.exitCode===2&&(envelope.error.code="usage_error");let pending=deliver(takeNotices()),text=JSON.stringify(pending?{...envelope,notice:pending}:envelope);setOutcome({ok:!1,errorCode:envelope.error.code,errorExitCode:envelope.error.exitCode||1,message:String(envelope.error.message||"").slice(0,500),outcomeUnknown:details.outcome==="unknown"||void 0}),console.log(text),process.exitCode=envelope.error.exitCode||1}var init_command_output=__esm({"dist/src/command-output.js"(){"use strict";init_errors();init_oplog();init_notices()}});var self_upgrade_exports={};__export(self_upgrade_exports,{GATE_EXEMPT:()=>GATE_EXEMPT,PACKAGE_NAME:()=>PACKAGE_NAME,UpgradeRequiredError:()=>UpgradeRequiredError,autoUpgradeEnabled:()=>autoUpgradeEnabled,belowMinVersion:()=>belowMinVersion,checkAndUpgrade:()=>checkAndUpgrade,checkDue:()=>checkDue,compareVersions:()=>compareVersions,enforceMinVersion:()=>enforceMinVersion,fetchLatest:()=>fetchLatest,installPrefix:()=>installPrefix,npmCommand:()=>npmCommand,readState:()=>readState,reexec:()=>reexec,registryUrl:()=>registryUrl,spawnBackgroundUpgrade:()=>spawnBackgroundUpgrade,takeResult:()=>takeResult,verifyIntegrity:()=>verifyIntegrity});import{spawn as spawn2,spawnSync}from"node:child_process";import{createHash as createHash2}from"node:crypto";import*as fs7 from"node:fs";import*as os4 from"node:os";import*as path6 from"node:path";function readState(){try{return JSON.parse(fs7.readFileSync(stateFile(),"utf8"))||{}}catch{return{}}}function writeState(patch){let next={...readState(),...patch};try{fs7.mkdirSync(dir2(),{recursive:!0,mode:448});let tmp=`${stateFile()}.${process.pid}.tmp`;fs7.writeFileSync(tmp,JSON.stringify(next),{mode:384}),fs7.renameSync(tmp,stateFile())}catch{}return next}function compareVersions(a,b){let p=v=>String(v).replace(/^v/,"").split("-")[0].split(".").map(n=>Number(n)||0),[x,y]=[p(a),p(b)];for(let i2=0;i2<3;i2++)if((x[i2]??0)!==(y[i2]??0))return(x[i2]??0)-(y[i2]??0);return 0}function registryUrl(env=process.env,pkgDir=PKG_DIR){if(env.LINKAI_REGISTRY)return env.LINKAI_REGISTRY.replace(/\/+$/,"");try{let pkg=JSON.parse(fs7.readFileSync(path6.join(pkgDir,"package.json"),"utf8"));return String(pkg.publishConfig?.registry||"").replace(/\/+$/,"")}catch{return""}}function installPrefix(pkgDir=PKG_DIR,platform2=process.platform){let parts=(platform2==="win32"?path6.win32:path6.posix).resolve(pkgDir).split(/[\\/]+/),n=parts.length;if(n<4||parts[n-1]!=="linkai-cli"||parts[n-2]!=="@linkaicli"||parts[n-3]!=="node_modules"||parts.includes("_npx")||parts.includes(".npm"))return null;let sep4=platform2==="win32"?"\\":"/",before=parts.slice(0,n-3);if(platform2!=="win32"){if(before[before.length-1]!=="lib")return null;before.pop()}return before.join(sep4)||sep4}function autoUpgradeEnabled(env=process.env){return env.LINKAI_NO_AUTO_UPGRADE==="1"||env.CI||env.CONTINUOUS_INTEGRATION||env.VITEST?!1:!!registryUrl(env)&&installPrefix()!==null}async function fetchLatest(registry=registryUrl(),timeoutMs=FETCH_TIMEOUT_MS){let headers={Accept:"application/json"};process.env.LINKAI_REGISTRY_TOKEN&&(headers.Authorization=`Bearer ${process.env.LINKAI_REGISTRY_TOKEN}`);let res=await fetch(`${registry}/${PACKAGE_NAME.replace("/","%2f")}`,{headers,signal:AbortSignal.timeout(timeoutMs)});if(!res.ok)throw new Error(`\u7248\u672C\u67E5\u8BE2\u5931\u8D25\uFF1AHTTP ${res.status}`);let doc=await res.json(),version2=doc["dist-tags"]?.latest,meta=version2?doc.versions?.[version2]:void 0;if(!version2||!meta?.dist?.tarball)throw new Error("\u6E90\u4E0A\u6CA1\u6709\u53EF\u7528\u7684\u7248\u672C\u4FE1\u606F");return{version:version2,tarball:meta.dist.tarball,integrity:meta.dist.integrity,shasum:meta.dist.shasum,minVersion:meta.linkaiUpgrade?.minVersion||null}}function verifyIntegrity(buf,m){let sri=String(m.integrity||"").split(/\s+/).find(x=>x.startsWith("sha512-"));return sri?`sha512-${createHash2("sha512").update(buf).digest("base64")}`===sri:m.shasum?createHash2("sha1").update(buf).digest("hex")===m.shasum:!1}async function download(m){let headers={};process.env.LINKAI_REGISTRY_TOKEN&&(headers.Authorization=`Bearer ${process.env.LINKAI_REGISTRY_TOKEN}`);let res=await fetch(m.tarball,{headers,signal:AbortSignal.timeout(INSTALL_TIMEOUT_MS)});if(!res.ok)throw new Error(`\u4E0B\u8F7D\u5931\u8D25\uFF1AHTTP ${res.status}`);let buf=Buffer.from(await res.arrayBuffer());if(!verifyIntegrity(buf,m))throw new Error("\u5B89\u88C5\u5305\u6821\u9A8C\u5931\u8D25\uFF08integrity \u4E0D\u5339\u914D\uFF09\uFF0C\u672A\u5B89\u88C5");fs7.mkdirSync(dir2(),{recursive:!0,mode:448});let file=path6.join(dir2(),`linkai-cli-${m.version}.tgz`);return fs7.writeFileSync(file,buf,{mode:384}),file}function npmCommand(execPath=process.execPath,platform2=process.platform){let bin=path6.dirname(execPath),cli2=(platform2==="win32"?[path6.join(bin,"node_modules","npm","bin","npm-cli.js")]:[path6.join(bin,"..","lib","node_modules","npm","bin","npm-cli.js"),path6.join(bin,"node_modules","npm","bin","npm-cli.js")]).find(c=>fs7.existsSync(c));return cli2?{cmd:execPath,args:[cli2],shell:!1}:{cmd:platform2==="win32"?"npm.cmd":"npm",args:[],shell:platform2==="win32"}}function npmInstall(tgz,prefix){let npm=npmCommand(),r=spawnSync(npm.cmd,[...npm.args,"install","-g",tgz,"--prefix",prefix,"--no-audit","--no-fund","--loglevel=error"],{encoding:"utf8",timeout:INSTALL_TIMEOUT_MS,shell:npm.shell,windowsHide:!0,env:{...process.env,npm_config_update_notifier:"false"}});if(r.status!==0)throw new Error(`npm \u5B89\u88C5\u5931\u8D25\uFF1A${String(r.stderr||r.error?.message||r.status).trim().slice(-300)}`)}function installedVersion(pkgDir){try{return JSON.parse(fs7.readFileSync(path6.join(pkgDir,"package.json"),"utf8")).version||null}catch{return null}}function acquireLock(){try{fs7.mkdirSync(dir2(),{recursive:!0,mode:448});try{let st=fs7.statSync(lockFile2());if(Date.now()-st.mtimeMs<LOCK_STALE_MS)return!1;fs7.rmSync(lockFile2(),{force:!0})}catch{}return fs7.writeFileSync(lockFile2(),String(process.pid),{flag:"wx"}),!0}catch{return!1}}async function checkAndUpgrade({force=!1,pkgDir=PKG_DIR,current:current2=PKG_VERSION,registry=registryUrl()}={}){let prefix=installPrefix(pkgDir);if(!registry||!prefix||!acquireLock())return null;let started=Date.now(),latest;try{writeState({lastAttempt:started}),latest=await fetchLatest(registry);let prev=readState();if(writeState({lastCheck:Date.now(),failures:0,latest:latest.version,minVersion:latest.minVersion}),compareVersions(latest.version,current2)<=0||!force&&prev.skip?.version===latest.version&&Date.now()<prev.skip.until)return releaseLock(),null}catch{let failures=(readState().failures||0)+1;return writeState({failures}),releaseLock(),null}let from=current2,result;try{let tgz=await download(latest);npmInstall(tgz,prefix);let now=installedVersion(pkgDir);if(now!==latest.version)throw new Error(`\u5B89\u88C5\u540E\u7248\u672C\u662F ${now??"\u672A\u77E5"}\uFF0C\u4E0D\u662F ${latest.version}`);result={ok:!0,from,to:latest.version,at:Date.now(),ms:Date.now()-started,prefix};try{fs7.rmSync(tgz,{force:!0})}catch{}}catch(error){let rolledBack=!1;if(installedVersion(pkgDir)!==from)try{let dist=(await fetch(`${registry}/${PACKAGE_NAME.replace("/","%2f")}`,{signal:AbortSignal.timeout(FETCH_TIMEOUT_MS)}).then(r=>r.json())).versions?.[from]?.dist;dist?.tarball&&(npmInstall(await download({version:from,tarball:dist.tarball,integrity:dist.integrity,shasum:dist.shasum,minVersion:null}),prefix),rolledBack=!0)}catch{}result={ok:!1,from,to:latest.version,at:Date.now(),ms:Date.now()-started,error:String(error.message).slice(0,300),rolledBack,prefix},writeState({skip:{version:latest.version,until:Date.now()+RETRY_MAX_MS}})}return writeState({result}),releaseLock(),result}function checkDue(state2=readState(),now=Date.now()){if(now-(state2.lastCheck||0)<CHECK_INTERVAL_MS)return!1;let backoff=Math.min(RETRY_MAX_MS,RETRY_BASE_MS*2**Math.max(0,(state2.failures||0)-1));return!state2.failures||now-(state2.lastAttempt||0)>=backoff}function spawnBackgroundUpgrade(entry=process.argv[1]){if(!entry||!autoUpgradeEnabled()||process.env.LINKAI_UPGRADER==="1")return!1;let state2=readState();if(!(state2.latest&&compareVersions(state2.latest,PKG_VERSION)>0&&!(state2.skip?.version===state2.latest&&Date.now()<state2.skip.until))&&!checkDue(state2))return!1;try{return spawn2(process.execPath,[entry,"__self-upgrade"],{detached:!0,stdio:"ignore",windowsHide:!0,env:{...process.env,LINKAI_UPGRADER:"1"}}).unref(),!0}catch{return!1}}function belowMinVersion(state2=readState()){return!!(state2.minVersion&&compareVersions(state2.minVersion,PKG_VERSION)>0)}function takeResult(){let s=readState();return s.result?(writeState({result:null}),s.result):null}function reexec(entry,argv){return spawnSync(process.execPath,[entry,...argv],{stdio:"inherit",env:{...process.env,LINKAI_REEXEC:"1"}}).status??1}async function enforceMinVersion(argv,{pkgDir=PKG_DIR,current:current2=PKG_VERSION,registry=registryUrl(),env=process.env,now=Date.now()}={}){if(!argv.length||argv[0].startsWith("__")||GATE_EXEMPT.has(argv[0])||env.LINKAI_SKIP_UPGRADE==="1"||env.LINKAI_REEXEC==="1"||env.LINKAI_NO_AUTO_UPGRADE==="1"||env.CI||env.CONTINUOUS_INTEGRATION||env.VITEST||!registry||installPrefix(pkgDir)===null)return"run";let state2=readState(),stale=now-(state2.lastCheck||0)>=GATE_CHECK_MS,retryOk=!state2.failures||now-(state2.lastAttempt||0)>=GATE_RETRY_MS;if(stale&&retryOk)try{let m=await fetchLatest(registry,GATE_TIMEOUT_MS);state2=writeState({lastCheck:Date.now(),failures:0,latest:m.version,minVersion:m.minVersion})}catch{return writeState({lastAttempt:Date.now(),failures:(state2.failures||0)+1}),"run"}let min=state2.minVersion;if(!min||compareVersions(min,current2)<=0)return"run";let r=await checkAndUpgrade({force:!0,pkgDir,current:current2,registry});if(r?.ok)return"reexec";if(!r){let until=Date.now()+GATE_WAIT_MS;for(;Date.now()<until;){let v=installedVersion(pkgDir);if(v&&compareVersions(v,min)>=0)return"reexec";await new Promise(res=>setTimeout(res,1e3))}}throw new UpgradeRequiredError(min,current2,r?.error||"\u7B49\u5F85\u5176\u5B83\u8FDB\u7A0B\u5B8C\u6210\u5347\u7EA7\u8D85\u65F6")}var PACKAGE_NAME,CHECK_INTERVAL_MS,RETRY_BASE_MS,RETRY_MAX_MS,LOCK_STALE_MS,FETCH_TIMEOUT_MS,INSTALL_TIMEOUT_MS,dir2,stateFile,lockFile2,releaseLock,GATE_CHECK_MS,GATE_RETRY_MS,GATE_TIMEOUT_MS,GATE_WAIT_MS,GATE_EXEMPT,UpgradeRequiredError,init_self_upgrade=__esm({"dist/src/self-upgrade.js"(){"use strict";init_version();PACKAGE_NAME="@linkaicli/linkai-cli",CHECK_INTERVAL_MS=4*36e5,RETRY_BASE_MS=30*6e4,RETRY_MAX_MS=24*36e5,LOCK_STALE_MS=10*6e4,FETCH_TIMEOUT_MS=15e3,INSTALL_TIMEOUT_MS=18e4,dir2=()=>path6.join(os4.homedir(),".linkai","upgrade"),stateFile=()=>path6.join(dir2(),"state.json"),lockFile2=()=>path6.join(dir2(),"lock");releaseLock=()=>{try{fs7.rmSync(lockFile2(),{force:!0})}catch{}};GATE_CHECK_MS=30*6e4,GATE_RETRY_MS=10*6e4,GATE_TIMEOUT_MS=5e3,GATE_WAIT_MS=6e4,GATE_EXEMPT=new Set(["-V","--version","-h","--help","help","doctor","daemon"]),UpgradeRequiredError=class extends Error{minVersion;current;reason;constructor(minVersion,current2,reason){super(`LinkAI-CLI ${current2} \u4F4E\u4E8E\u8981\u6C42\u7684\u6700\u4F4E\u7248\u672C ${minVersion}\uFF0C\u81EA\u52A8\u5347\u7EA7\u5931\u8D25\uFF1A${reason}`),this.minVersion=minVersion,this.current=current2,this.reason=reason,this.name="UpgradeRequiredError"}}}});function getDefaultExportFromCjs(x){return x&&x.__esModule&&Object.prototype.hasOwnProperty.call(x,"default")?x.default:x}function requireCommon(){if(hasRequiredCommon)return common;hasRequiredCommon=1;function isNothing(subject){return typeof subject>"u"||subject===null}function isObject(subject){return typeof subject=="object"&&subject!==null}function toArray(sequence){return Array.isArray(sequence)?sequence:isNothing(sequence)?[]:[sequence]}function extend2(target,source){if(source){let sourceKeys=Object.keys(source);for(let index=0,length=sourceKeys.length;index<length;index+=1){let key=sourceKeys[index];target[key]=source[key]}}return target}function repeat(string,count){let result="";for(let cycle=0;cycle<count;cycle+=1)result+=string;return result}function isNegativeZero(number){return number===0&&Number.NEGATIVE_INFINITY===1/number}return common.isNothing=isNothing,common.isObject=isObject,common.toArray=toArray,common.repeat=repeat,common.isNegativeZero=isNegativeZero,common.extend=extend2,common}function requireException(){if(hasRequiredException)return exception;hasRequiredException=1;function formatError(exception2,compact){let where="",message=exception2.reason||"(unknown reason)";return exception2.mark?(exception2.mark.name&&(where+='in "'+exception2.mark.name+'" '),where+="("+(exception2.mark.line+1)+":"+(exception2.mark.column+1)+")",!compact&&exception2.mark.snippet&&(where+=`
|
|
41
41
|
|
|
42
42
|
`+exception2.mark.snippet),message+" "+where):message}function YAMLException2(reason,mark2){Error.call(this),this.name="YAMLException",this.reason=reason,this.mark=mark2,this.message=formatError(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}return YAMLException2.prototype=Object.create(Error.prototype),YAMLException2.prototype.constructor=YAMLException2,YAMLException2.prototype.toString=function(compact){return this.name+": "+formatError(this,compact)},exception=YAMLException2,exception}function requireSnippet(){if(hasRequiredSnippet)return snippet;hasRequiredSnippet=1;let common2=requireCommon();function getLine(buffer,lineStart,lineEnd,position,maxLineLength){let head="",tail="",maxHalfLength=Math.floor(maxLineLength/2)-1;return position-lineStart>maxHalfLength&&(head=" ... ",lineStart=position-maxHalfLength+head.length),lineEnd-position>maxHalfLength&&(tail=" ...",lineEnd=position+maxHalfLength-tail.length),{str:head+buffer.slice(lineStart,lineEnd).replace(/\t/g,"\u2192")+tail,pos:position-lineStart+head.length}}function padStart(string,max){return common2.repeat(" ",max-string.length)+string}function makeSnippet(mark2,options){if(options=Object.create(options||null),!mark2.buffer)return null;options.maxLength||(options.maxLength=79),typeof options.indent!="number"&&(options.indent=1),typeof options.linesBefore!="number"&&(options.linesBefore=3),typeof options.linesAfter!="number"&&(options.linesAfter=2);let re=/\r?\n|\r|\0/g,lineStarts=[0],lineEnds=[],match,foundLineNo=-1;for(;match=re.exec(mark2.buffer);)lineEnds.push(match.index),lineStarts.push(match.index+match[0].length),mark2.position<=match.index&&foundLineNo<0&&(foundLineNo=lineStarts.length-2);foundLineNo<0&&(foundLineNo=lineStarts.length-1);let result="",lineNoLength=Math.min(mark2.line+options.linesAfter,lineEnds.length).toString().length,maxLineLength=options.maxLength-(options.indent+lineNoLength+3);for(let i2=1;i2<=options.linesBefore&&!(foundLineNo-i2<0);i2++){let line2=getLine(mark2.buffer,lineStarts[foundLineNo-i2],lineEnds[foundLineNo-i2],mark2.position-(lineStarts[foundLineNo]-lineStarts[foundLineNo-i2]),maxLineLength);result=common2.repeat(" ",options.indent)+padStart((mark2.line-i2+1).toString(),lineNoLength)+" | "+line2.str+`
|
|
43
43
|
`+result}let line=getLine(mark2.buffer,lineStarts[foundLineNo],lineEnds[foundLineNo],mark2.position,maxLineLength);result+=common2.repeat(" ",options.indent)+padStart((mark2.line+1).toString(),lineNoLength)+" | "+line.str+`
|
|
@@ -3419,8 +3419,7 @@ If the extension is not installed:
|
|
|
3419
3419
|
`}};rules.tableSection={filter:["thead","tbody","tfoot"],replacement:function(content){return content}};function isHeadingRow(tr){var parentNode=tr.parentNode;return parentNode.nodeName==="THEAD"||parentNode.firstChild===tr&&(parentNode.nodeName==="TABLE"||isFirstTbody(parentNode))&&every.call(tr.childNodes,function(n){return n.nodeName==="TH"})}function isFirstTbody(element){var previousSibling=element.previousSibling;return element.nodeName==="TBODY"&&(!previousSibling||previousSibling.nodeName==="THEAD"&&/^\s*$/i.test(previousSibling.textContent))}function cell(content,node){var index=indexOf.call(node.parentNode.childNodes,node),prefix=" ";return index===0&&(prefix="| "),prefix+content+" |"}function tables(turndownService){turndownService.keep(function(node){return node.nodeName==="TABLE"&&!isHeadingRow(node.rows[0])});for(var key in rules)turndownService.addRule(key,rules[key])}function taskListItems(turndownService){turndownService.addRule("taskListItems",{filter:function(node){return node.type==="checkbox"&&node.parentNode.nodeName==="LI"},replacement:function(content,node){return(node.checked?"[x]":"[ ]")+" "}})}function gfm2(turndownService){turndownService.use([highlightedCodeBlock,strikethrough,tables,taskListItems])}exports.gfm=gfm2;exports.highlightedCodeBlock=highlightedCodeBlock;exports.strikethrough=strikethrough;exports.tables=tables;exports.taskListItems=taskListItems}});import*as fs31 from"node:fs";import*as os18 from"node:os";import*as path30 from"node:path";import{fileURLToPath as fileURLToPath10}from"node:url";init_constants();init_completion_shared();import*as fs from"node:fs";function hasAllManifests(manifestPaths){for(let p of manifestPaths)try{fs.accessSync(p)}catch{return!1}return manifestPaths.length>0}function getCompletionsFromManifest(words,cursor,manifestPaths){let entries=loadManifestEntries(manifestPaths);if(entries===null)return null;if(cursor<=1){let sites=new Set;for(let entry of entries)sites.add(entry.site===ROOT_SITE?entry.name:entry.site);return[...BUILTIN_COMMANDS,...sites].sort()}let site=words[0];if(BUILTIN_COMMANDS.includes(site))return[];if(cursor===2){let subcommands=[];for(let entry of entries)entry.site===site&&(subcommands.push(entry.name),entry.aliases?.length&&subcommands.push(...entry.aliases));return[...new Set(subcommands)].sort()}return[]}var SHELL_SCRIPTS={bash:bashCompletionScript,zsh:zshCompletionScript,fish:fishCompletionScript};function printCompletionScriptFast(shell){let gen=SHELL_SCRIPTS[shell];return gen?(process.stdout.write(gen()),!0):!1}function loadManifestEntries(manifestPaths){let entries=[];if(manifestPaths.length===0)return null;for(let manifestPath of manifestPaths)try{let raw=fs.readFileSync(manifestPath,"utf-8"),manifest=JSON.parse(raw);if(!Array.isArray(manifest))return null;entries.push(...manifest)}catch{return null}return entries}init_package_paths();init_version();init_errors();init_runtime_detect();init_constants();async function main(){if(process.platform!=="win32"){let std=["/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin"],cur=new Set((process.env.PATH??"").split(":").filter(Boolean));for(let p of std)cur.add(p);process.env.PATH=[...cur].join(":")}let __filename2=fileURLToPath10(import.meta.url),BUILTIN_CLIS=path30.join(findPackageRoot(__filename2),"clis"),USER_CLIS=path30.join(os18.homedir(),".linkai","clis"),argv=process.argv.slice(2);if(typeof globalThis.Bun>"u"&&!isSupportedNodeVersion(process.version)){let{emitFailure:emitFailure2}=await Promise.resolve().then(()=>(init_command_output(),command_output_exports));emitFailure2({code:"CONFIG",message:`LinkAI requires Node.js >= ${20}.0.0; current runtime: ${process.version}.`,hint:"Upgrade Node.js, then retry."},EXIT_CODES.CONFIG_ERROR),process.exit(EXIT_CODES.CONFIG_ERROR)}if(!isIgnorableDaemonPortEnv(process.env.LINKAI_DAEMON_PORT)){let{emitFailure:emitFailure2}=await Promise.resolve().then(()=>(init_command_output(),command_output_exports));emitFailure2({code:"CONFIG",message:unsupportedDaemonPortEnvMessage(process.env.LINKAI_DAEMON_PORT)},EXIT_CODES.CONFIG_ERROR),process.exit(EXIT_CODES.CONFIG_ERROR)}(argv[0]==="--version"||argv[0]==="-V")&&(process.stdout.write(PKG_VERSION+`
|
|
3420
3420
|
`),process.exit(EXIT_CODES.SUCCESS)),argv[0]==="completion"&&argv.length>=2&&printCompletionScriptFast(argv[1])&&process.exit(EXIT_CODES.SUCCESS);let getCompIdx=process.argv.indexOf("--get-completions");if(getCompIdx!==-1){let manifestPaths=[getCliManifestPath(BUILTIN_CLIS)],userManifest=getCliManifestPath(USER_CLIS);try{fs31.accessSync(userManifest),manifestPaths.push(userManifest)}catch{}if(hasAllManifests(manifestPaths)){let rest=process.argv.slice(getCompIdx+1),cursor,words=[];for(let i2=0;i2<rest.length;i2++)rest[i2]==="--cursor"&&i2+1<rest.length?(cursor=parseInt(rest[i2+1],10),i2++):words.push(rest[i2]);cursor===void 0&&(cursor=words.length);let candidates=getCompletionsFromManifest(words,cursor,manifestPaths);candidates!==null&&(process.stdout.write(candidates.join(`
|
|
3421
3421
|
`)+`
|
|
3422
|
-
`),process.exit(EXIT_CODES.SUCCESS))}}for(let[flag,envName]of[["--worker","LINKAI_COLLAB_WORKER"],["--flow","LINKAI_FLOW"],["--ai-model","LINKAI_AI_MODEL"]]){let i2=process.argv.findIndex((tok2,idx)=>idx>=2&&(tok2===flag||tok2.startsWith(`${flag}=`)));if(i2<2)continue;let tok=process.argv[i2],value=tok.includes("=")?tok.slice(tok.indexOf("=")+1):process.argv[i2+1];process.argv.splice(i2,tok.includes("=")?1:2),value&&(process.env[envName]=value)}let oplog=await Promise.resolve().then(()=>(init_oplog(),oplog_exports));if(argv[0]==="__oplog-upload"){try{let{pathToFileURL:pathToFileURL4}=await import("node:url");await import(pathToFileURL4(path30.join(BUILTIN_CLIS,"linkai","core.js")).href),await oplog.runUploader()}catch{}process.exit(EXIT_CODES.SUCCESS)}if(argv[0]==="__self-upgrade"){try{await(await Promise.resolve().then(()=>(init_self_upgrade(),self_upgrade_exports))).checkAndUpgrade()}catch{}process.exit(EXIT_CODES.SUCCESS)}if(
|
|
3423
|
-
`),(await up.checkAndUpgrade({force:!0}))?.ok&&process.exit(up.reexec(process.argv[1],process.argv.slice(2))))}catch{}oplog.startRun(argv);try{let r=(await Promise.resolve().then(()=>(init_self_upgrade(),self_upgrade_exports))).takeResult();if(r&&(oplog.emit("upgrade",r),r.ok)){let{addNotice:addNotice2}=await Promise.resolve().then(()=>(init_notices(),notices_exports));addNotice2(`LinkAI-CLI \u5DF2\u81EA\u52A8\u5347\u7EA7\uFF1A${r.from} \u2192 ${r.to}\u3002`,"upgrade")}}catch{}try{let{autoSyncSkills:autoSyncSkills2}=await Promise.resolve().then(()=>(init_skills(),skills_exports)),synced=autoSyncSkills2(PKG_VERSION);if(synced){let updated=synced.filter(r=>r.updated.length);if(oplog.emit("skills.sync",{version:PKG_VERSION,results:synced.map(r=>({agent:r.agent,mode:r.mode,updated:r.updated,kept:r.kept}))}),updated.length){let{addNotice:addNotice2}=await Promise.resolve().then(()=>(init_notices(),notices_exports));addNotice2(`LinkAI-CLI \u5DF2\u5347\u7EA7\u5230 ${PKG_VERSION}\uFF0C\u5DF2\u81EA\u52A8\u66F4\u65B0 ${updated.map(r=>`${r.label}\uFF08${r.mode==="rules"?"\u89C4\u5219":r.updated.join("\u3001")}\uFF09`).join("\uFF1B")} \u7684\u6280\u80FD\uFF0C\u65B0\u5F00\u4E00\u4E2A\u4F1A\u8BDD\u540E\u6309\u65B0\u89C4\u5219\u6267\u884C\uFF1B\u672C\u4F1A\u8BDD\u8BF7\u5148\u91CD\u65B0\u8BFB\u53D6\u76F8\u5173\u6280\u80FD\uFF08linkai skills read <\u6280\u80FD\u540D> -f plain\uFF09\u3002`,"skills-sync")}}}catch{}oplog.mark("oplogStart");try{let{discoverClis:discoverClis2,discoverPlugins:discoverPlugins2,ensureUserCliCompatShims:ensureUserCliCompatShims2,ensureUserAdapters:ensureUserAdapters2}=await Promise.resolve().then(()=>(init_discovery(),discovery_exports)),{getCompletions:getCompletions2}=await Promise.resolve().then(()=>(init_completion(),completion_exports)),{runCli:runCli2}=await Promise.resolve().then(()=>(init_cli(),cli_exports)),{emitHook:emitHook2}=await Promise.resolve().then(()=>(init_hooks(),hooks_exports)),{installNodeNetwork:installNodeNetwork2}=await Promise.resolve().then(()=>(init_node_network(),node_network_exports)),{registerUpdateNoticeOnExit:registerUpdateNoticeOnExit2,checkForUpdateBackground:checkForUpdateBackground2}=await Promise.resolve().then(()=>(init_update_check(),update_check_exports));if(oplog.mark("imports"),installNodeNetwork2(),argv[0]==="convention-audit")await discoverClis2(BUILTIN_CLIS);else{let timed=(name,p)=>p.finally(()=>oplog.mark(name)),[,,]=await Promise.all([timed("userCliShims",ensureUserCliCompatShims2()),timed("userAdapters",ensureUserAdapters2()),timed("builtinDiscovery",discoverClis2(BUILTIN_CLIS))]);await discoverClis2(USER_CLIS),oplog.mark("userDiscovery"),await discoverPlugins2()}if(oplog.mark("plugins"),registerUpdateNoticeOnExit2(),checkForUpdateBackground2(),getCompIdx!==-1){let rest=process.argv.slice(getCompIdx+1),cursor,words=[];for(let i2=0;i2<rest.length;i2++)rest[i2]==="--cursor"&&i2+1<rest.length?(cursor=parseInt(rest[i2+1],10),i2++):words.push(rest[i2]);cursor===void 0&&(cursor=words.length);let candidates=getCompletions2(words,cursor);process.stdout.write(candidates.join(`
|
|
3422
|
+
`),process.exit(EXIT_CODES.SUCCESS))}}for(let[flag,envName]of[["--worker","LINKAI_COLLAB_WORKER"],["--flow","LINKAI_FLOW"],["--ai-model","LINKAI_AI_MODEL"]]){let i2=process.argv.findIndex((tok2,idx)=>idx>=2&&(tok2===flag||tok2.startsWith(`${flag}=`)));if(i2<2)continue;let tok=process.argv[i2],value=tok.includes("=")?tok.slice(tok.indexOf("=")+1):process.argv[i2+1];process.argv.splice(i2,tok.includes("=")?1:2),value&&(process.env[envName]=value)}let oplog=await Promise.resolve().then(()=>(init_oplog(),oplog_exports));if(argv[0]==="__oplog-upload"){try{let{pathToFileURL:pathToFileURL4}=await import("node:url");await import(pathToFileURL4(path30.join(BUILTIN_CLIS,"linkai","core.js")).href),await oplog.runUploader()}catch{}process.exit(EXIT_CODES.SUCCESS)}if(argv[0]==="__self-upgrade"){try{await(await Promise.resolve().then(()=>(init_self_upgrade(),self_upgrade_exports))).checkAndUpgrade()}catch{}process.exit(EXIT_CODES.SUCCESS)}oplog.startRun(argv);try{let up=await Promise.resolve().then(()=>(init_self_upgrade(),self_upgrade_exports));if(await up.enforceMinVersion(argv)==="reexec"){let code=up.reexec(process.argv[1],process.argv.slice(2));process.exitCode=code,await oplog.endRun(),process.exit(code)}}catch(error){if(error?.name==="UpgradeRequiredError"){let{emitFailure:emitFailure2}=await Promise.resolve().then(()=>(init_command_output(),command_output_exports)),{CliError:CliError2}=await Promise.resolve().then(()=>(init_errors(),errors_exports));emitFailure2(new CliError2("UPGRADE_REQUIRED",error.message,"\u8BF7\u7528\u6237\u624B\u52A8\u5347\u7EA7\u540E\u518D\u8BD5\uFF1A\u5148\u6267\u884C linkai daemon stop\uFF0C\u518D\u6267\u884C npm install -g @linkaicli/linkai-cli@latest\uFF08Mac \u63D0\u793A\u6743\u9650\u4E0D\u8DB3\u65F6\u5728\u547D\u4EE4\u524D\u52A0 sudo\uFF09\uFF1B\u516C\u53F8\u7F51\u7EDC\u8BBF\u95EE\u4E0D\u4E86 npm \u65F6\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u3002\u5347\u7EA7\u5B8C\u6210\u524D\u4E0D\u8981\u7EE7\u7EED\u6267\u884C\u5176\u5B83\u547D\u4EE4",EXIT_CODES.GENERIC_ERROR)),await oplog.endRun(),process.exit(EXIT_CODES.GENERIC_ERROR)}}try{let r=(await Promise.resolve().then(()=>(init_self_upgrade(),self_upgrade_exports))).takeResult();if(r&&(oplog.emit("upgrade",r),r.ok)){let{addNotice:addNotice2}=await Promise.resolve().then(()=>(init_notices(),notices_exports));addNotice2(`LinkAI-CLI \u5DF2\u81EA\u52A8\u5347\u7EA7\uFF1A${r.from} \u2192 ${r.to}\u3002`,"upgrade")}}catch{}try{let{autoSyncSkills:autoSyncSkills2}=await Promise.resolve().then(()=>(init_skills(),skills_exports)),synced=autoSyncSkills2(PKG_VERSION);if(synced){let updated=synced.filter(r=>r.updated.length);if(oplog.emit("skills.sync",{version:PKG_VERSION,results:synced.map(r=>({agent:r.agent,mode:r.mode,updated:r.updated,kept:r.kept}))}),updated.length){let{addNotice:addNotice2}=await Promise.resolve().then(()=>(init_notices(),notices_exports));addNotice2(`LinkAI-CLI \u5DF2\u5347\u7EA7\u5230 ${PKG_VERSION}\uFF0C\u5DF2\u81EA\u52A8\u66F4\u65B0 ${updated.map(r=>`${r.label}\uFF08${r.mode==="rules"?"\u89C4\u5219":r.updated.join("\u3001")}\uFF09`).join("\uFF1B")} \u7684\u6280\u80FD\uFF0C\u65B0\u5F00\u4E00\u4E2A\u4F1A\u8BDD\u540E\u6309\u65B0\u89C4\u5219\u6267\u884C\uFF1B\u672C\u4F1A\u8BDD\u8BF7\u5148\u91CD\u65B0\u8BFB\u53D6\u76F8\u5173\u6280\u80FD\uFF08linkai skills read <\u6280\u80FD\u540D> -f plain\uFF09\u3002`,"skills-sync")}}}catch{}oplog.mark("oplogStart");try{let{discoverClis:discoverClis2,discoverPlugins:discoverPlugins2,ensureUserCliCompatShims:ensureUserCliCompatShims2,ensureUserAdapters:ensureUserAdapters2}=await Promise.resolve().then(()=>(init_discovery(),discovery_exports)),{getCompletions:getCompletions2}=await Promise.resolve().then(()=>(init_completion(),completion_exports)),{runCli:runCli2}=await Promise.resolve().then(()=>(init_cli(),cli_exports)),{emitHook:emitHook2}=await Promise.resolve().then(()=>(init_hooks(),hooks_exports)),{installNodeNetwork:installNodeNetwork2}=await Promise.resolve().then(()=>(init_node_network(),node_network_exports)),{registerUpdateNoticeOnExit:registerUpdateNoticeOnExit2,checkForUpdateBackground:checkForUpdateBackground2}=await Promise.resolve().then(()=>(init_update_check(),update_check_exports));if(oplog.mark("imports"),installNodeNetwork2(),argv[0]==="convention-audit")await discoverClis2(BUILTIN_CLIS);else{let timed=(name,p)=>p.finally(()=>oplog.mark(name)),[,,]=await Promise.all([timed("userCliShims",ensureUserCliCompatShims2()),timed("userAdapters",ensureUserAdapters2()),timed("builtinDiscovery",discoverClis2(BUILTIN_CLIS))]);await discoverClis2(USER_CLIS),oplog.mark("userDiscovery"),await discoverPlugins2()}if(oplog.mark("plugins"),registerUpdateNoticeOnExit2(),checkForUpdateBackground2(),getCompIdx!==-1){let rest=process.argv.slice(getCompIdx+1),cursor,words=[];for(let i2=0;i2<rest.length;i2++)rest[i2]==="--cursor"&&i2+1<rest.length?(cursor=parseInt(rest[i2+1],10),i2++):words.push(rest[i2]);cursor===void 0&&(cursor=words.length);let candidates=getCompletions2(words,cursor);process.stdout.write(candidates.join(`
|
|
3424
3423
|
`)+`
|
|
3425
3424
|
`),process.exit(EXIT_CODES.SUCCESS)}{let{LEGACY_ROOT_SITE_ALIASES:LEGACY_ROOT_SITE_ALIASES2}=await Promise.resolve().then(()=>(init_constants(),constants_exports)),first=process.argv.findIndex((tok,idx)=>idx>=2&&!tok.startsWith("-"));first>=2&&LEGACY_ROOT_SITE_ALIASES2.includes(process.argv[first])&&(process.argv.splice(first,1),process.argv[first]==="doctor"&&(process.argv[first]="status"))}let{escapeLeadingDashPositional:escapeLeadingDashPositional2}=await Promise.resolve().then(()=>(init_cli_argv_preprocess(),cli_argv_preprocess_exports));try{let manifestPath=getCliManifestPath(BUILTIN_CLIS);if(fs31.existsSync(manifestPath)){let manifest=JSON.parse(fs31.readFileSync(manifestPath,"utf-8"));Array.isArray(manifest)&&process.argv.splice(2,process.argv.length-2,...escapeLeadingDashPositional2(process.argv.slice(2),manifest))}}catch{}await emitHook2("onStartup",{command:"__startup__",args:{}}),oplog.mark("beforeParse"),await runCli2(BUILTIN_CLIS,USER_CLIS)}catch(error){let{emitFailure:emitFailure2}=await Promise.resolve().then(()=>(init_command_output(),command_output_exports));emitFailure2(error)}try{(await Promise.resolve().then(()=>(init_self_upgrade(),self_upgrade_exports))).spawnBackgroundUpgrade()}catch{}await oplog.endRun()&&setTimeout(()=>process.exit(process.exitCode??0),100).unref()}var registry_api_exports={};__export(registry_api_exports,{Strategy:()=>Strategy,cli:()=>cli,fullName:()=>fullName,getRegistry:()=>getRegistry,onAfterExecute:()=>onAfterExecute,onBeforeExecute:()=>onBeforeExecute,onStartup:()=>onStartup,registerCommand:()=>registerCommand});init_registry();init_hooks();init_errors();var types_exports={};init_utils();init_logger();init_cdp();init_page();init_utils2();init_download();var article_download_exports={};__export(article_download_exports,{downloadArticle:()=>downloadArticle});var import_turndown2=__toESM(require_turndown_cjs(),1),import_turndown_plugin_gfm=__toESM(require_turndown_plugin_gfm_cjs(),1);init_download();init_progress();import*as fs32 from"node:fs";import*as path31 from"node:path";var IMAGE_CONCURRENCY=5,IMAGE_EXT_BY_CONTENT_TYPE={"image/avif":"avif","image/bmp":"bmp","image/gif":"gif","image/jpeg":"jpg","image/png":"png","image/svg+xml":"svg","image/webp":"webp","image/x-icon":"ico"},RELIABLE_IMAGE_EXTENSIONS=new Set(["avif","bmp","gif","ico","jpeg","jpg","png","svg","webp"]),DEFAULT_LABELS={author:"\u4F5C\u8005",publishTime:"\u53D1\u5E03\u65F6\u95F4",sourceUrl:"\u539F\u6587\u94FE\u63A5"},STRIPPED_TAGS=["script","style","noscript","canvas","form","button","dialog","header","footer","nav","aside"];function createTurndown(configure,cleanSelectors){let td=new import_turndown2.default({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});td.use(import_turndown_plugin_gfm.gfm),td.remove(STRIPPED_TAGS),td.addRule("rowlessTable",{filter:node=>node.nodeName==="TABLE"&&!node.rows?.length,replacement:content=>content.trim()?`
|
|
3426
3425
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@linkaicli/linkai-cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.18",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"registry": "https://registry.npmjs.org/",
|
|
6
6
|
"access": "public"
|
|
@@ -103,5 +103,8 @@
|
|
|
103
103
|
"overrides": {
|
|
104
104
|
"postcss": "^8.5.10"
|
|
105
105
|
},
|
|
106
|
-
"homepage": "https://bi.linkmore.com"
|
|
106
|
+
"homepage": "https://bi.linkmore.com",
|
|
107
|
+
"linkaiUpgrade": {
|
|
108
|
+
"minVersion": "1.0.18"
|
|
109
|
+
}
|
|
107
110
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linkai-usage
|
|
3
|
-
version: 2026.11.02.
|
|
3
|
+
version: 2026.11.02.4
|
|
4
4
|
description: LinkAI-CLI 通用用法:查找可用命令、查看参数、理解 JSON 返回与错误码、处理登录与后台服务问题。不确定该用哪个 linkai 命令时使用;领谋 BI 报表搭建请用 linkai-report-builder,网页操作请用 linkai-browser。
|
|
5
5
|
allowed-tools: Bash(linkai:*), Read
|
|
6
6
|
---
|
|
@@ -39,6 +39,7 @@ linkai build --help -f json # 查看某个命令的参数
|
|
|
39
39
|
- `READ_ONLY`:系统报表 / 系统方案(资源包下发到本租户)只读,本租户改不了。停下告诉用户到来源租户修改后重新下发,不要换接口反复尝试。
|
|
40
40
|
- `BAD_REQUEST`:请求体结构不对(多见于 `api` 透传)。查 `references/api-catalog.md` 或回读一条现有数据照抄结构,优先用已封装的命令。
|
|
41
41
|
- `KNOWLEDGE_INVALID`:方案知识文件不完整(缺卡片段落、缺 cardId、修改方案缺 changeSummary 等)。按 message 补齐后重新执行 `plan-knowledge`。
|
|
42
|
+
- `UPGRADE_REQUIRED`:当前版本低于要求的最低版本且自动升级失败,命令没有执行。把 message 和 hint 里的手动升级步骤转告用户,等用户升级完成后再继续,不要尝试绕过。
|
|
42
43
|
- `NETWORK_ERROR`:连不上领谋服务器(CLI 已自动重试过)。不要连续重复执行:等 1~2 分钟再试,仍不通就请用户检查网络或代理;写命令失败后先用只读命令确认结果,再决定是否重做。
|
|
43
44
|
- `DUPLICATE_DATASET`:当前租户已有完全一样的数据集。直接复用提示里的数据集 id(build spec 写 id 或加 `reuse: auto`);确需独立一份才加 `--allow-duplicate` 并向用户说明理由。
|
|
44
45
|
- `COLLAB_CONFLICT`:要写的对象正被别的会话(执行者)处理。按 `linkai-collab` 技能执行:`linkai collab-status --board <任务板>` 看分工,改做别的任务或等对方释放,不要绕过。
|