prjct-cli 3.63.0 → 3.63.2
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/CHANGELOG.md +14 -0
- package/dist/bin/prjct-core.mjs +519 -519
- package/dist/bin/prjct-hooks.mjs +211 -211
- package/dist/bin/prjct.mjs +4 -1
- package/dist/daemon/entry.mjs +347 -347
- package/dist/mcp/server.mjs +2 -2
- package/package.json +1 -1
package/dist/mcp/server.mjs
CHANGED
|
@@ -1260,7 +1260,7 @@ CREATE TABLE velocity_sprints (
|
|
|
1260
1260
|
_No changes detected (clean tree / no base range)._
|
|
1261
1261
|
`;let e=["## Detect changes","",`- **Source**: ${t.source}`,`- **Changed**: ${t.changedFiles.length} file(s)`,`- **Blast radius**: ${t.affectedFiles.length} file(s) (imports + call-graph)`,`- **Risk**: critical ${t.summary.critical} \xB7 high ${t.summary.high} \xB7 medium ${t.summary.medium} \xB7 low ${t.summary.low}`,"","### Per-file risk",""];for(let n of t.changes){let r=n.touchedSymbols.length>0?` \xB7 symbols: ${n.touchedSymbols.slice(0,6).join(", ")}`:"";e.push(`- **${n.risk.toUpperCase()}** \`${n.file}\`${r}`,` - ${n.reasons.join("; ")}`)}if(t.affectedFiles.length>t.changedFiles.length){e.push("","### Affected beyond diff","");let n=t.affectedFiles.filter(r=>!t.changedFiles.includes(r)).slice(0,25);for(let r of n)e.push(`- \`${r}\``);t.affectedFiles.length-t.changedFiles.length>25&&e.push(`- _\u2026+${t.affectedFiles.length-t.changedFiles.length-25} more_`)}return e.push("","_Advisory. Expand with `prjct code trace <symbol>` or MCP `prjct_trace_path`._"),e.join(`
|
|
1262
1262
|
`)}function zR(t){if(t.changedFiles.length===0)return"detect-changes: no changes detected";let e=[`Detect changes (${t.source}): ${t.changedFiles.length} changed \u2192 blast ${t.affectedFiles.length}`,`Risk: critical=${t.summary.critical} high=${t.summary.high} medium=${t.summary.medium} low=${t.summary.low}`];for(let n of t.changes.slice(0,30)){let r=n.touchedSymbols.length?` [${n.touchedSymbols.slice(0,4).join(",")}]`:"";e.push(` [${n.risk.toUpperCase()}] ${n.file}${r} \u2014 ${n.reasons[0]??""}`)}return e.join(`
|
|
1263
|
-
`)}function QR(t){return t.changedFiles.length===0?null:t.summary.critical>0?`\u26A0\uFE0F Structural risk CRITICAL (${t.summary.critical} file(s), blast ${t.affectedFiles.length}). Review: \`prjct code impact --md\`.`:t.summary.high>0?`\u26A0\uFE0F Structural risk HIGH (${t.summary.high} file(s), blast ${t.affectedFiles.length}). Consider \`prjct code impact --md\`.`:null}var JR,KR,xl=h(()=>{"use strict";tn();Mt();le();a(ht,"safeGit");a(GR,"listWorkingTreeFiles");a(XR,"listCommittedFiles");a(qR,"resolveDiffBase");a(Zf,"parseChangedLinesFromUnifiedDiff");a(VR,"loadHunkLines");a(eh,"symbolsTouchedByHunks");JR=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,KR=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(YR,"classifyRisk");a(vl,"detectChanges");a(_l,"formatDetectChangesMd");a(zR,"formatDetectChangesText");a(QR,"shipStructuralRiskCue")});function ZR(t){return t instanceof Ks}function Se(t){return ZR(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var Ks,Po,Ys,nn=h(()=>{"use strict";Ks=class extends Error{static{a(this,"PrjctError")}code;isOperational;constructor(e,n="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=n,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Po=class t extends Ks{static{a(this,"ProjectError")}constructor(e,n="PROJECT_ERROR"){super(e,n),this.name="ProjectError"}static notInitialized(){return new t("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new t(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new t(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Ys=class t extends Ks{static{a(this,"AgentError")}constructor(e,n="AGENT_ERROR"){super(e,n),this.name="AgentError"}static notSupported(e){return new t(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new t(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};a(ZR,"isPrjctError");a(Se,"getErrorMessage")});function nh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function Rl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:nh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:nh(r.host),repoSlug:s}}catch{return{}}}async function eC(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function tC(t){try{let{stdout:e}=await U("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Yn(t){return typeof t=="string"&&t.length>0?t:void 0}function rh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function nC(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function sh(t){let e=w.getDoc(t,"project")||{},n=Yn(e.repoPath),{provider:r,repoSlug:s}=n?Rl(await eC(n)||""):{},i=n?await tC(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return nC({provider:r,repoSlug:s,currentBranch:Yn(e.currentBranch),defaultBranch:i,stack:Yn(e.stack),techStack:o&&o.length>0?o:void 0,version:Yn(e.version),commitCount:rh(e.commitCount),fileCount:rh(e.fileCount),lastCommit:Yn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Yn(e.cliVersion),syncedAt:Yn(e.lastSync)})}var Cl=h(()=>{"use strict";O();le();a(nh,"providerForHost");a(Rl,"parseRemote");a(eC,"gitRemoteUrl");a(tC,"gitDefaultBranch");a(Yn,"str");a(rh,"num");a(nC,"compact");a(sh,"buildProjectMeta")});import{execFile as rC}from"node:child_process";import sC from"node:crypto";import{promisify as iC}from"node:util";function cC(t,e=aC){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=sC.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function lC(t){let e;try{let{stdout:s}=await oC("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=Rl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function ih(t){let e=await lC(t);return e?cC(e):null}var oC,aC,oh=h(()=>{"use strict";Cl();oC=iC(rC),aC="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(cC,"uuidv5");a(lC,"repoKey");a(ih,"deriveProjectId")});var Il={};L(Il,{PACKAGE_ROOT:()=>An,VERSION:()=>Cn,getPackageRoot:()=>Nl,getVersion:()=>Lo,resetPackageRoot:()=>uC});import Al from"node:fs";import Do from"node:path";function Nl(){if(jr)return jr;let t=__dirname;for(let e=0;e<5;e++){let n=Do.join(t,"package.json");if(Al.existsSync(n))try{if(JSON.parse(Al.readFileSync(n,"utf-8")).name==="prjct-cli")return jr=t,t}catch{}t=Do.dirname(t)}return jr=Do.join(__dirname,"..","..",".."),jr}function Lo(){if(zn)return zn;let t="3.63.
|
|
1263
|
+
`)}function QR(t){return t.changedFiles.length===0?null:t.summary.critical>0?`\u26A0\uFE0F Structural risk CRITICAL (${t.summary.critical} file(s), blast ${t.affectedFiles.length}). Review: \`prjct code impact --md\`.`:t.summary.high>0?`\u26A0\uFE0F Structural risk HIGH (${t.summary.high} file(s), blast ${t.affectedFiles.length}). Consider \`prjct code impact --md\`.`:null}var JR,KR,xl=h(()=>{"use strict";tn();Mt();le();a(ht,"safeGit");a(GR,"listWorkingTreeFiles");a(XR,"listCommittedFiles");a(qR,"resolveDiffBase");a(Zf,"parseChangedLinesFromUnifiedDiff");a(VR,"loadHunkLines");a(eh,"symbolsTouchedByHunks");JR=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,KR=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(YR,"classifyRisk");a(vl,"detectChanges");a(_l,"formatDetectChangesMd");a(zR,"formatDetectChangesText");a(QR,"shipStructuralRiskCue")});function ZR(t){return t instanceof Ks}function Se(t){return ZR(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var Ks,Po,Ys,nn=h(()=>{"use strict";Ks=class extends Error{static{a(this,"PrjctError")}code;isOperational;constructor(e,n="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=n,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Po=class t extends Ks{static{a(this,"ProjectError")}constructor(e,n="PROJECT_ERROR"){super(e,n),this.name="ProjectError"}static notInitialized(){return new t("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new t(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new t(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Ys=class t extends Ks{static{a(this,"AgentError")}constructor(e,n="AGENT_ERROR"){super(e,n),this.name="AgentError"}static notSupported(e){return new t(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new t(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};a(ZR,"isPrjctError");a(Se,"getErrorMessage")});function nh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function Rl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:nh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:nh(r.host),repoSlug:s}}catch{return{}}}async function eC(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function tC(t){try{let{stdout:e}=await U("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Yn(t){return typeof t=="string"&&t.length>0?t:void 0}function rh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function nC(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function sh(t){let e=w.getDoc(t,"project")||{},n=Yn(e.repoPath),{provider:r,repoSlug:s}=n?Rl(await eC(n)||""):{},i=n?await tC(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return nC({provider:r,repoSlug:s,currentBranch:Yn(e.currentBranch),defaultBranch:i,stack:Yn(e.stack),techStack:o&&o.length>0?o:void 0,version:Yn(e.version),commitCount:rh(e.commitCount),fileCount:rh(e.fileCount),lastCommit:Yn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Yn(e.cliVersion),syncedAt:Yn(e.lastSync)})}var Cl=h(()=>{"use strict";O();le();a(nh,"providerForHost");a(Rl,"parseRemote");a(eC,"gitRemoteUrl");a(tC,"gitDefaultBranch");a(Yn,"str");a(rh,"num");a(nC,"compact");a(sh,"buildProjectMeta")});import{execFile as rC}from"node:child_process";import sC from"node:crypto";import{promisify as iC}from"node:util";function cC(t,e=aC){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=sC.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function lC(t){let e;try{let{stdout:s}=await oC("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=Rl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function ih(t){let e=await lC(t);return e?cC(e):null}var oC,aC,oh=h(()=>{"use strict";Cl();oC=iC(rC),aC="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(cC,"uuidv5");a(lC,"repoKey");a(ih,"deriveProjectId")});var Il={};L(Il,{PACKAGE_ROOT:()=>An,VERSION:()=>Cn,getPackageRoot:()=>Nl,getVersion:()=>Lo,resetPackageRoot:()=>uC});import Al from"node:fs";import Do from"node:path";function Nl(){if(jr)return jr;let t=__dirname;for(let e=0;e<5;e++){let n=Do.join(t,"package.json");if(Al.existsSync(n))try{if(JSON.parse(Al.readFileSync(n,"utf-8")).name==="prjct-cli")return jr=t,t}catch{}t=Do.dirname(t)}return jr=Do.join(__dirname,"..","..",".."),jr}function Lo(){if(zn)return zn;let t="3.63.2";if(t&&/^\d+\.\d+\.\d+/.test(t))return zn=t,zn;try{let e=Do.join(Nl(),"package.json");return zn=JSON.parse(Al.readFileSync(e,"utf-8")).version,zn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",x(e)),"0.0.0"}}function uC(t){jr=t,zn=null}var zn,jr,Cn,An,rn=h(()=>{"use strict";ie();zn=null,jr=null;a(Nl,"getPackageRoot");a(Lo,"getVersion");a(uC,"resetPackageRoot");Cn=Lo(),An=Nl()});async function Oo(t){try{let{stdout:e}=await H(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function dC(){let t=await Oo("gh api user --jq .login");return t.success&&t.output||(t=await Oo("git config --global github.user"),t.success&&t.output)?t.output:null}async function pC(){let t=await Oo("git config user.name");return t.success&&t.output?t.output:null}async function mC(){let t=await Oo("git config user.email");return t.success&&t.output?t.output:null}async function Mr(){let[t,e,n]=await Promise.all([dC(),pC(),mC()]);return{github:t,email:n,name:e||t||"Unknown"}}var jo=h(()=>{"use strict";le();a(Oo,"execCommand");a(dC,"detectGitHubUsername");a(pC,"detectGitName");a(mC,"detectGitEmail");a(Mr,"detect")});var Mo={};L(Mo,{worktreeService:()=>gC});import Dl from"node:fs/promises";import $t from"node:path";var ah,Ll,gC,$o=h(()=>{"use strict";le();se();ah=".worktrees",Ll=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=$t.join(s,ah,n),o=r.branch||`feat/${n}`;await Dl.mkdir($t.join(s,ah),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await H(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await H("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s;if(n)try{let{stdout:i}=await H("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await H(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await H(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await H("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await H("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await H("git rev-parse --git-dir",{cwd:e}),s=$t.resolve(e,n.trim()),i=$t.resolve(e,r.trim());if(s!==i){let{stdout:o}=await H("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await H("git rev-parse HEAD",{cwd:e}),{stdout:l}=await H("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=$t.basename(u);return{path:u,branch:o.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await H("git worktree list --porcelain",{cwd:e}),s=r.split(`
|
|
1264
1264
|
`)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:n}=await H("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=$t.join(n,".env");await N(r)&&await Dl.copyFile(r,$t.join(e,".env"));let s=$t.join(n,".prjct"),i=$t.join(e,".prjct");await N(s)&&!await N(i)&&await Dl.symlink(s,i,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await H("git worktree prune",{cwd:s});for(let i of n)i.isMain||await N(i.path)||r.push(i.slug);return r}parsePorcelainOutput(e,n){let r=[],s=e.trim().split(`
|
|
1265
1265
|
|
|
1266
1266
|
`);for(let i of s){if(!i.trim())continue;let o=i.trim().split(`
|
|
@@ -1647,7 +1647,7 @@ ${s}`:s,changed:!0}}async function Mw(t=Mi()){let e="";try{e=await hr.readFile(t
|
|
|
1647
1647
|
\u{1F50C} Configuring MCP servers...`);try{await $i.install();let e=t.verifyContext7===!1?null:await $i.verify();t.silent||(e?.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e?.message||""}`),console.log(" It will activate on the next time you open your AI client.")))}catch(e){t.silent||(console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${x(e)}`),console.log(" Run `prjct start` again to retry."))}for(let e of oL)try{let n=ds(),r=await Aw(e.name,n),s=await Oi(e.name,Jt[e.name],n);r&&!s.changed?t.silent||console.log(e.ready):t.silent||console.log(e.added)}catch(n){t.silent||(console.log(`\u26A0\uFE0F ${e.failed}: ${x(n)}`),console.log(e.manual))}try{if((await xn()).installed){let n=await Mw(),r=await Ka();t.silent||(n.skipped==="user-managed"?console.log("\u2705 prjct Codex config ready (MCP user-managed)"):n.changed||r.changed?console.log("\u2705 prjct Codex config updated in ~/.codex/config.toml"):console.log("\u2705 prjct Codex config already ready"))}}catch(e){t.silent||(console.log(`\u26A0\uFE0F Codex config setup failed: ${x(e)}`),console.log(" Run `prjct start` again to retry."))}try{if((await al()).installed){let n=await Xw();t.silent||console.log(n.changed?"\u2705 prjct Kimi config updated in ~/.kimi/mcp.json":"\u2705 prjct Kimi config already ready")}}catch(e){t.silent||(console.log(`\u26A0\uFE0F Kimi config setup failed: ${x(e)}`),console.log(" Run `prjct start` again to retry."))}}var oL,Jw=h(()=>{"use strict";gt();Jd();ie();Xd();qw();ji();oL=[{name:"prjct",ready:"\u2705 prjct MCP already configured",added:"\u2705 prjct MCP added to mcp.json",failed:"prjct MCP setup failed",manual:" Run `prjct start` again to retry."}];a(Vw,"setupMcpServers")});import Fi from"node:fs/promises";import aL from"node:os";import zw from"node:path";function Zw(){return zw.join(aL.homedir(),".codex","skills","prjct","SKILL.md")}function cL(t){return`<!-- ${Qw}: ${JSON.stringify({v:Cn,h:t})} -->`}function Yw(t){let e=t.match(new RegExp(`<!--\\s*${Qw}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{let n=JSON.parse(e[1]);return{version:n.v??n.version,templateHash:n.h??n.templateHash}}catch{return null}}function lL(t){return Di(t).slice(0,12)}async function eT(){return At("codex/SKILL.md")}function tT(t){let e=t.trimEnd(),n=lL(e),r=cL(n);return{content:`${e}
|
|
1648
1648
|
|
|
1649
1649
|
${r}
|
|
1650
|
-
`,templateHash:n}}async function uL(){try{let t=Zw(),e=zw.dirname(t);await Fi.mkdir(e,{recursive:!0});let n=await N(t),r=await eT();if(!r)return X.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=tT(r),i=Buffer.byteLength(s.content,"utf-8");return i>Kw&&X.warn(`Codex SKILL.md is ${i} bytes \u2014 over Codex's ~${Kw}-byte hard limit; the skill may be rejected. Trim editor-surfaces.ts.`),n&&await Fi.readFile(t,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await Fi.writeFile(t,s.content,"utf-8"),{success:!0,action:n?"updated":"created"})}catch(t){return X.warn(`Codex skill warning: ${x(t)}`),{success:!1,action:null}}}async function nT(t={}){let e=Zw();if(!(await xn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let r=await eT();if(!r)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=tT(r),i=a(async()=>t.autoRepair?(await uL()).success:!1,"maybeRepair"),o="";if(!await N(e)&&!await i())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};o=await Fi.readFile(e,"utf-8").catch(()=>"");let c=Yw(o);if(!(c?.version===Cn&&c?.templateHash===s.templateHash)){if(!await i())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(o=await Fi.readFile(e,"utf-8").catch(()=>""),c=Yw(o),!(c?.version===Cn&&c?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,message:"Codex p. router ready"}}var Qw,Kw,rT=h(()=>{"use strict";as();ie();se();us();yt();rn();gt();Qw="prjct-codex-router",Kw=1024;a(Zw,"getCodexSkillPath");a(cL,"getCodexSkillMetadata");a(Yw,"parseCodexSkillMetadata");a(lL,"hashContent");a(eT,"loadCodexSkillTemplate");a(tT,"buildCodexSkillContent");a(uL,"installCodexSkill");a(nT,"verifyCodexPRouterReady")});var aT={};L(aT,{CLOUD_GRAPH_MAX_LINKS:()=>oT,CLOUD_GRAPH_MAX_NODES:()=>iT,buildCloudCodeGraphSnapshot:()=>gL,isUploadableGraph:()=>fL});function pL(t){return dL[t.toLowerCase()]??"Symbol"}function mL(t){try{return y.query(t,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(e=>({src:e.src,dst:e.dst,edgeType:e.edge_type,confidence:e.confidence}))}catch{return[]}}function gL(t,e={}){if(!_e(t))return null;let n=e.maxNodes??iT,r=e.maxLinks??oT,s=jt(t);if(s.length===0)return null;let i=mL(t),o=rt(t),c=new Map;for(let k of i){let _=sT[k.edgeType]??1;c.set(k.src,(c.get(k.src)??0)+_),c.set(k.dst,(c.get(k.dst)??0)+_)}let l=a(k=>{switch(k){case"class":return 8;case"function":case"method":return 6;case"interface":case"type":return 4;case"route":return 5;default:return 2}},"kindWeight"),d=s.map(k=>{let _=c.get(k.id)??0,P=k.exported?4:0;return{s:k,score:_+P+l(k.kind)}}).sort((k,_)=>_.score-k.score||k.s.name.localeCompare(_.s.name)).slice(0,n).map(k=>k.s),p=new Set(d.map(k=>k.id)),m=new Map;for(let k of d)m.set(k.file,(m.get(k.file)??0)+1);let g=[...m.entries()].sort((k,_)=>_[1]-k[1]).slice(0,Math.min(80,Math.floor(n/5))).map(([k])=>k),f=a(k=>`file:${k}`,"fileNodeId"),E=[];for(let k of g){let _=k.split("/").pop()||k;E.push({id:f(k),name:_,kind:"File",file:k,exported:!1}),p.add(f(k))}for(let k of d)E.push({id:k.id,name:k.name,kind:pL(k.kind),file:k.file,exported:k.exported});let T=[],R=new Set(g);for(let k of d)R.has(k.file)&&T.push({source:f(k.file),target:k.id,type:"DEFINES"});let A=i.filter(k=>p.has(k.src)&&p.has(k.dst)&&k.src!==k.dst).map(k=>({source:k.src,target:k.dst,type:k.edgeType,prio:sT[k.edgeType]??0,conf:k.confidence})).sort((k,_)=>_.prio-k.prio||_.conf-k.conf),b=new Set,C=[];for(let k of T){let _=`${k.source}->${k.target}:${k.type}`;if(!b.has(_)&&(b.add(_),C.push({source:k.source,target:k.target,type:k.type}),C.length>=r))break}for(let k of A){if(C.length>=r)break;let _=`${k.source}->${k.target}:${k.type}`;b.has(_)||(b.add(_),C.push({source:k.source,target:k.target,type:k.type}))}return{version:1,builtAt:o?.builtAt??new Date().toISOString(),symbolCount:o?.symbolCount??s.length,edgeCount:o?.edgeCount??i.length,nodes:E,links:C}}function fL(t){return!!t&&t.nodes.length>0}var iT,oT,dL,sT,cT=h(()=>{"use strict";Mt();O();iT=400,oT=900,dL={function:"Function",method:"Method",class:"Class",interface:"Interface",type:"Type",enum:"Enum",const:"Const",route:"Route",file:"File"},sT={CALLS:5,IMPORTS:4,DEFINES:3,HANDLES:2,TESTS:1};a(pL,"mapKind");a(mL,"loadEdges");a(gL,"buildCloudCodeGraphSnapshot");a(fL,"isUploadableGraph")});function Er(t){if(t)return hL[t]}function uT(t,e){let n=yL[t];return n?{...lT,...e??{}}[n]!==!1:!0}var hL,yL,lT,JK,Kd=h(()=>{"use strict";hL={memories:"memories",tasks:"tasks",subtasks:"subtasks",ideas:"ideas",queue_tasks:"queue_tasks",custom_workflows:"custom_workflows",workflow_rules:"workflow_rules",archives:"archives",shipped_items:"shipped_items",shipped_features:"shipped_features",metrics_daily:"metrics_daily",work_cost_snapshots:"work_cost_snapshots",velocity_sprints:"velocity_sprints",analysis:"analysis",specs:"specs",memory:"memories",memory_entry:"memories",task:"tasks",paused_task:"tasks",subtask:"subtasks",idea:"ideas",queue:"queue_tasks",queue_task:"queue_tasks",shipped:"shipped_items",feature:"roadmap_features",workflow:"custom_workflows",workflow_rule:"workflow_rules",metric:"metrics_daily",work_cost_snapshot:"work_cost_snapshots",velocity:"velocity_sprints",spec:"specs",project:"projects",session:"sessions",agent:"agents"};a(Er,"toCloudTable");yL={memories:"memories",tasks:"tasks",subtasks:"tasks",queue_tasks:"tasks",ideas:"ideas",shipped_items:"shipped",shipped_features:"shipped",custom_workflows:"workflows",workflow_rules:"workflows",metrics_daily:"metrics",work_cost_snapshots:"metrics",velocity_sprints:"metrics",archives:"archives",analysis:"analysis",specs:"specs"},lT={memories:!0,tasks:!0,ideas:!0,shipped:!0,workflows:!0,metrics:!0,archives:!0,user_prompts:!1,agent_sessions:!1,analysis:!0,specs:!0};a(uT,"isTableIncluded");JK=Object.keys(lT)});function EL(t){return t.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function kL(t){let e={};for(let[n,r]of Object.entries(t))e[EL(n)]=r;return e}function wL(t,e){let[n,r]=e.type.split("."),s=Er(e.entityType)??Er(n);if(!s)return null;let o=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",c=e.data||{},l=kL(c),u=e.entityId||l.id||c.id||"",d={event_type:o,entity_type:s,entity_id:u,data:{...l,project_id:t},project_id:t};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function dT(t,e){return e.map(n=>wL(t,n)).filter(n=>n!==null)}var pT=h(()=>{"use strict";Kd();a(EL,"camelToSnake");a(kL,"snakeCaseKeys");a(wL,"mapCliEventToWebFormat");a(dT,"mapCliEventsToWebFormat")});var mT={};L(mT,{default:()=>TL,syncClient:()=>ps});var Yd,ps,TL,zd=h(()=>{"use strict";yd();ri();pT();Yd=class{static{a(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,n){let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=dT(e,n),c=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify({projectId:e,events:o})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async pullEvents(e,n,r){let{apiUrl:s,apiKey:i,deviceId:o}=await this.getAuthHeaders();if(!i)throw this.createError("AUTH_REQUIRED","No API key configured");let c={projectId:e};typeof n=="number"&&n>0&&(c.sinceEventId=n);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(i,o)},body:JSON.stringify(c)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:n,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${n}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async linkProject(e,n,r){let{apiUrl:s,apiKey:i,deviceId:o}=await this.getAuthHeaders();if(!i)throw this.createError("AUTH_REQUIRED","No API key configured");let c=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(i,o)},body:JSON.stringify({projectId:e,...n?{name:n}:{},...r?{meta:r}:{}})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async setCloudLifecycle(e,n){try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();return s?(await this.fetchWithRetry(`${r}/sync/projects/${e}/${n}`,{method:"POST",headers:{...this.authHeaders(s,i)}})).ok:!1}catch{return!1}}async uploadCodeGraph(e,n){try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)return{ok:!1};let o=await this.fetchWithRetry(`${r}/sync/projects/${e}/code-graph`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify(n)});if(!o.ok)return{ok:!1};let c=await o.json();return{ok:c.ok!==!1,nodes:c.nodes,links:c.links}}catch{return{ok:!1}}}async publishBenchmark(e,n){let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify({projectId:e,...n})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async testConnection(){let e=new AbortController,n=setTimeout(()=>e.abort(),Ra("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)return clearTimeout(n),!1;let o=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,i)},signal:e.signal});return clearTimeout(n),o.status===401||o.status===403?(await st.clearAuth(),!1):o.ok}catch{return clearTimeout(n),!1}}async hasAuth(){return await st.hasAuth()}async getAuthHeaders(){let[e,n,r]=await Promise.all([st.getApiUrl(),st.getApiKey(),st.getDeviceId()]);return{apiUrl:e,apiKey:n,deviceId:r}}authHeaders(e,n){return{"X-Api-Key":e,"X-Device-Id":n}}async fetchWithRetry(e,n,r=0){let s=new AbortController,i=setTimeout(()=>s.abort(),Ra("API_REQUEST")),o=(n.method??"GET").toUpperCase(),c=o==="GET"||o==="HEAD";try{let l=await fetch(e,{...n,signal:s.signal});if(clearTimeout(i),c&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,n,r+1)}return l}catch(l){if(clearTimeout(i),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Ra("API_REQUEST")}ms)`);if(c&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,n,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let n=await e.json(),r=n.detail||n.message||n.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await st.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await st.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,n,r){return{code:e,message:n,status:r}}sleep(e){return new Promise(n=>setTimeout(n,e))}},ps=new Yd,TL=ps});import Qd from"node:fs/promises";import gT from"node:path";import{gunzipSync as SL,gzipSync as bL}from"node:zlib";function fT(t){return gT.join(z.getGlobalProjectPath(t),vL)}async function _L(t){if(!_e(t))return null;let e=jt(t),n=[];try{n=y.query(t,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(l=>({src:l.src,dst:l.dst,edgeType:l.edge_type,confidence:l.confidence}))}catch{n=[]}let r=rt(t)??{symbolCount:e.length,edgeCount:n.length,fileCount:new Set(e.map(l=>l.file)).size,builtAt:new Date().toISOString()},s={version:1,projectId:t,exportedAt:new Date().toISOString(),meta:r,symbols:e,edges:n},i=Buffer.from(JSON.stringify(s),"utf-8"),o=bL(i,{level:6}),c=fT(t);return await Qd.mkdir(gT.dirname(c),{recursive:!0}),await Qd.writeFile(c,o),{path:c,bytes:o.length,symbols:e.length,edges:n.length}}async function xL(t){let e=fT(t),n;try{n=await Qd.readFile(e)}catch{return{imported:!1,symbols:0,edges:0,reason:"no per-project artifact"}}let r;try{let s=SL(n).toString("utf-8");r=JSON.parse(s)}catch(s){return{imported:!1,symbols:0,edges:0,reason:`corrupt artifact: ${s instanceof Error?s.message:String(s)}`}}return r.version!==1||!Array.isArray(r.symbols)?{imported:!1,symbols:0,edges:0,reason:"unsupported artifact version"}:r.projectId&&r.projectId!==t?{imported:!1,symbols:0,edges:0,reason:`artifact projectId mismatch (got ${r.projectId}, expected ${t})`}:(y.transaction(t,s=>{s.prepare("DELETE FROM code_symbols").run(),s.prepare("DELETE FROM code_symbol_edges").run();let i=s.prepare(`INSERT INTO code_symbols (id, file, kind, name, qname, start_line, end_line, exported)
|
|
1650
|
+
`,templateHash:n}}async function uL(){try{let t=Zw(),e=zw.dirname(t);await Fi.mkdir(e,{recursive:!0});let n=await N(t),r=await eT();if(!r)return X.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=tT(r),i=Buffer.byteLength(s.content,"utf-8");return i>Kw&&X.warn(`Codex SKILL.md is ${i} bytes \u2014 over Codex's ~${Kw}-byte hard limit; the skill may be rejected. Trim editor-surfaces.ts.`),n&&await Fi.readFile(t,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await Fi.writeFile(t,s.content,"utf-8"),{success:!0,action:n?"updated":"created"})}catch(t){return X.warn(`Codex skill warning: ${x(t)}`),{success:!1,action:null}}}async function nT(t={}){let e=Zw();if(!(await xn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let r=await eT();if(!r)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=tT(r),i=a(async()=>t.autoRepair?(await uL()).success:!1,"maybeRepair"),o="";if(!await N(e)&&!await i())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};o=await Fi.readFile(e,"utf-8").catch(()=>"");let c=Yw(o);if(!(c?.version===Cn&&c?.templateHash===s.templateHash)){if(!await i())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(o=await Fi.readFile(e,"utf-8").catch(()=>""),c=Yw(o),!(c?.version===Cn&&c?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,message:"Codex p. router ready"}}var Qw,Kw,rT=h(()=>{"use strict";as();ie();se();us();yt();rn();gt();Qw="prjct-codex-router",Kw=1024;a(Zw,"getCodexSkillPath");a(cL,"getCodexSkillMetadata");a(Yw,"parseCodexSkillMetadata");a(lL,"hashContent");a(eT,"loadCodexSkillTemplate");a(tT,"buildCodexSkillContent");a(uL,"installCodexSkill");a(nT,"verifyCodexPRouterReady")});var aT={};L(aT,{CLOUD_GRAPH_MAX_LINKS:()=>oT,CLOUD_GRAPH_MAX_NODES:()=>iT,buildCloudCodeGraphSnapshot:()=>gL,isUploadableGraph:()=>fL});function pL(t){return dL[t.toLowerCase()]??"Symbol"}function mL(t){try{return y.query(t,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(e=>({src:e.src,dst:e.dst,edgeType:e.edge_type,confidence:e.confidence}))}catch{return[]}}function gL(t,e={}){if(!_e(t))return null;let n=e.maxNodes??iT,r=e.maxLinks??oT,s=jt(t);if(s.length===0)return null;let i=mL(t),o=rt(t),c=new Map;for(let k of i){let _=sT[k.edgeType]??1;c.set(k.src,(c.get(k.src)??0)+_),c.set(k.dst,(c.get(k.dst)??0)+_)}let l=a(k=>{switch(k){case"class":return 8;case"function":case"method":return 6;case"interface":case"type":return 4;case"route":return 5;default:return 2}},"kindWeight"),d=s.map(k=>{let _=c.get(k.id)??0,P=k.exported?4:0;return{s:k,score:_+P+l(k.kind)}}).sort((k,_)=>_.score-k.score||k.s.name.localeCompare(_.s.name)).slice(0,n).map(k=>k.s),p=new Set(d.map(k=>k.id)),m=new Map;for(let k of d)m.set(k.file,(m.get(k.file)??0)+1);let g=[...m.entries()].sort((k,_)=>_[1]-k[1]).slice(0,Math.min(80,Math.floor(n/5))).map(([k])=>k),f=a(k=>`file:${k}`,"fileNodeId"),E=[];for(let k of g){let _=k.split("/").pop()||k;E.push({id:f(k),name:_,kind:"File",file:k,exported:!1}),p.add(f(k))}for(let k of d)E.push({id:k.id,name:k.name,kind:pL(k.kind),file:k.file,exported:k.exported});let T=[],R=new Set(g);for(let k of d)R.has(k.file)&&T.push({source:f(k.file),target:k.id,type:"DEFINES"});let A=i.filter(k=>p.has(k.src)&&p.has(k.dst)&&k.src!==k.dst).map(k=>({source:k.src,target:k.dst,type:k.edgeType,prio:sT[k.edgeType]??0,conf:k.confidence})).sort((k,_)=>_.prio-k.prio||_.conf-k.conf),b=new Set,C=[];for(let k of T){let _=`${k.source}->${k.target}:${k.type}`;if(!b.has(_)&&(b.add(_),C.push({source:k.source,target:k.target,type:k.type}),C.length>=r))break}for(let k of A){if(C.length>=r)break;let _=`${k.source}->${k.target}:${k.type}`;b.has(_)||(b.add(_),C.push({source:k.source,target:k.target,type:k.type}))}return{version:1,builtAt:o?.builtAt??new Date().toISOString(),symbolCount:o?.symbolCount??s.length,edgeCount:o?.edgeCount??i.length,nodes:E,links:C}}function fL(t){return!!t&&t.nodes.length>0}var iT,oT,dL,sT,cT=h(()=>{"use strict";Mt();O();iT=400,oT=900,dL={function:"Function",method:"Method",class:"Class",interface:"Interface",type:"Type",enum:"Enum",const:"Const",route:"Route",file:"File"},sT={CALLS:5,IMPORTS:4,DEFINES:3,HANDLES:2,TESTS:1};a(pL,"mapKind");a(mL,"loadEdges");a(gL,"buildCloudCodeGraphSnapshot");a(fL,"isUploadableGraph")});function Er(t){if(t)return hL[t]}function uT(t,e){let n=yL[t];return n?{...lT,...e??{}}[n]!==!1:!0}var hL,yL,lT,JK,Kd=h(()=>{"use strict";hL={memories:"memories",tasks:"tasks",subtasks:"subtasks",ideas:"ideas",queue_tasks:"queue_tasks",custom_workflows:"custom_workflows",workflow_rules:"workflow_rules",archives:"archives",shipped_items:"shipped_items",shipped_features:"shipped_features",metrics_daily:"metrics_daily",work_cost_snapshots:"work_cost_snapshots",velocity_sprints:"velocity_sprints",analysis:"analysis",specs:"specs",memory:"memories",memory_entry:"memories",task:"tasks",paused_task:"tasks",subtask:"subtasks",idea:"ideas",queue:"queue_tasks",queue_task:"queue_tasks",shipped:"shipped_items",feature:"roadmap_features",workflow:"custom_workflows",workflow_rule:"workflow_rules",metric:"metrics_daily",work_cost_snapshot:"work_cost_snapshots",velocity:"velocity_sprints",spec:"specs",project:"projects",session:"sessions",agent:"agents"};a(Er,"toCloudTable");yL={memories:"memories",tasks:"tasks",subtasks:"tasks",queue_tasks:"tasks",ideas:"ideas",shipped_items:"shipped",shipped_features:"shipped",custom_workflows:"workflows",workflow_rules:"workflows",metrics_daily:"metrics",work_cost_snapshots:"metrics",velocity_sprints:"metrics",archives:"archives",analysis:"analysis",specs:"specs"},lT={memories:!0,tasks:!0,ideas:!0,shipped:!0,workflows:!0,metrics:!0,archives:!0,user_prompts:!1,agent_sessions:!1,analysis:!0,specs:!0};a(uT,"isTableIncluded");JK=Object.keys(lT)});function EL(t){return t.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function kL(t){let e={};for(let[n,r]of Object.entries(t))e[EL(n)]=r;return e}function wL(t,e){let[n,r]=e.type.split("."),s=Er(e.entityType)??Er(n);if(!s)return null;let o=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",c=e.data||{},l=kL(c),u=e.entityId||(typeof l.id=="string"?l.id:"")||(typeof c.id=="string"?c.id:"")||(typeof l.task_id=="string"?l.task_id:"")||(typeof c.taskId=="string"?c.taskId:"")||(typeof l.entity_id=="string"?l.entity_id:"")||"";u&&l.id==null&&(l.id=u);let d={event_type:o,entity_type:s,entity_id:u,data:{...l,project_id:t},project_id:t};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function dT(t,e){return e.map(n=>wL(t,n)).filter(n=>n!==null)}var pT=h(()=>{"use strict";Kd();a(EL,"camelToSnake");a(kL,"snakeCaseKeys");a(wL,"mapCliEventToWebFormat");a(dT,"mapCliEventsToWebFormat")});var mT={};L(mT,{default:()=>TL,syncClient:()=>ps});var Yd,ps,TL,zd=h(()=>{"use strict";yd();ri();pT();Yd=class{static{a(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,n){let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=dT(e,n),c=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify({projectId:e,events:o})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async pullEvents(e,n,r){let{apiUrl:s,apiKey:i,deviceId:o}=await this.getAuthHeaders();if(!i)throw this.createError("AUTH_REQUIRED","No API key configured");let c={projectId:e};typeof n=="number"&&n>0&&(c.sinceEventId=n);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(i,o)},body:JSON.stringify(c)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:n,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${n}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async linkProject(e,n,r){let{apiUrl:s,apiKey:i,deviceId:o}=await this.getAuthHeaders();if(!i)throw this.createError("AUTH_REQUIRED","No API key configured");let c=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(i,o)},body:JSON.stringify({projectId:e,...n?{name:n}:{},...r?{meta:r}:{}})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async setCloudLifecycle(e,n){try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();return s?(await this.fetchWithRetry(`${r}/sync/projects/${e}/${n}`,{method:"POST",headers:{...this.authHeaders(s,i)}})).ok:!1}catch{return!1}}async uploadCodeGraph(e,n){try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)return{ok:!1};let o=await this.fetchWithRetry(`${r}/sync/projects/${e}/code-graph`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify(n)});if(!o.ok)return{ok:!1};let c=await o.json();return{ok:c.ok!==!1,nodes:c.nodes,links:c.links}}catch{return{ok:!1}}}async publishBenchmark(e,n){let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify({projectId:e,...n})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async testConnection(){let e=new AbortController,n=setTimeout(()=>e.abort(),Ra("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)return clearTimeout(n),!1;let o=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,i)},signal:e.signal});return clearTimeout(n),o.status===401||o.status===403?(await st.clearAuth(),!1):o.ok}catch{return clearTimeout(n),!1}}async hasAuth(){return await st.hasAuth()}async getAuthHeaders(){let[e,n,r]=await Promise.all([st.getApiUrl(),st.getApiKey(),st.getDeviceId()]);return{apiUrl:e,apiKey:n,deviceId:r}}authHeaders(e,n){return{"X-Api-Key":e,"X-Device-Id":n}}async fetchWithRetry(e,n,r=0){let s=new AbortController,i=setTimeout(()=>s.abort(),Ra("API_REQUEST")),o=(n.method??"GET").toUpperCase(),c=o==="GET"||o==="HEAD";try{let l=await fetch(e,{...n,signal:s.signal});if(clearTimeout(i),c&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,n,r+1)}return l}catch(l){if(clearTimeout(i),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Ra("API_REQUEST")}ms)`);if(c&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,n,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let n=await e.json(),r=n.detail||n.message||n.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await st.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await st.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,n,r){return{code:e,message:n,status:r}}sleep(e){return new Promise(n=>setTimeout(n,e))}},ps=new Yd,TL=ps});import Qd from"node:fs/promises";import gT from"node:path";import{gunzipSync as SL,gzipSync as bL}from"node:zlib";function fT(t){return gT.join(z.getGlobalProjectPath(t),vL)}async function _L(t){if(!_e(t))return null;let e=jt(t),n=[];try{n=y.query(t,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(l=>({src:l.src,dst:l.dst,edgeType:l.edge_type,confidence:l.confidence}))}catch{n=[]}let r=rt(t)??{symbolCount:e.length,edgeCount:n.length,fileCount:new Set(e.map(l=>l.file)).size,builtAt:new Date().toISOString()},s={version:1,projectId:t,exportedAt:new Date().toISOString(),meta:r,symbols:e,edges:n},i=Buffer.from(JSON.stringify(s),"utf-8"),o=bL(i,{level:6}),c=fT(t);return await Qd.mkdir(gT.dirname(c),{recursive:!0}),await Qd.writeFile(c,o),{path:c,bytes:o.length,symbols:e.length,edges:n.length}}async function xL(t){let e=fT(t),n;try{n=await Qd.readFile(e)}catch{return{imported:!1,symbols:0,edges:0,reason:"no per-project artifact"}}let r;try{let s=SL(n).toString("utf-8");r=JSON.parse(s)}catch(s){return{imported:!1,symbols:0,edges:0,reason:`corrupt artifact: ${s instanceof Error?s.message:String(s)}`}}return r.version!==1||!Array.isArray(r.symbols)?{imported:!1,symbols:0,edges:0,reason:"unsupported artifact version"}:r.projectId&&r.projectId!==t?{imported:!1,symbols:0,edges:0,reason:`artifact projectId mismatch (got ${r.projectId}, expected ${t})`}:(y.transaction(t,s=>{s.prepare("DELETE FROM code_symbols").run(),s.prepare("DELETE FROM code_symbol_edges").run();let i=s.prepare(`INSERT INTO code_symbols (id, file, kind, name, qname, start_line, end_line, exported)
|
|
1651
1651
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`),o=s.prepare(`INSERT OR IGNORE INTO code_symbol_edges (src, dst, edge_type, confidence)
|
|
1652
1652
|
VALUES (?, ?, ?, ?)`);for(let c of r.symbols)i.run(c.id,c.file,c.kind,c.name,c.qname,c.startLine,c.endLine,c.exported?1:0);for(let c of r.edges)o.run(c.src,c.dst,c.edgeType,c.confidence)}),y.setDoc(t,"symbol-graph",{...r.meta,builtAt:r.meta.builtAt??r.exportedAt}),{imported:!0,symbols:r.symbols.length,edges:r.edges.length})}async function hT(t){if(_e(t))return{bootstrapped:!1,detail:"local index already present"};let e=await xL(t);return e.imported?{bootstrapped:!0,detail:`imported ${e.symbols} symbols / ${e.edges} edges from per-project cache`}:{bootstrapped:!1,detail:e.reason??"import failed"}}async function yT(t){try{await _L(t)}catch{}try{await RL(t)}catch{}}async function RL(t){let{buildCloudCodeGraphSnapshot:e,isUploadableGraph:n}=await Promise.resolve().then(()=>(cT(),aT)),r=e(t);if(!n(r))return{uploaded:!1,reason:"no symbol index or empty graph"};try{let{default:s}=await Promise.resolve().then(()=>(zd(),mT)),i=await s.uploadCodeGraph(t,r);return i.ok?{uploaded:!0,nodes:i.nodes??r.nodes.length,links:i.links??r.links.length}:{uploaded:!1,reason:"upload failed or unauthenticated"}}catch(s){return{uploaded:!1,reason:s instanceof Error?s.message:String(s)}}}var vL,ET=h(()=>{"use strict";Mt();Ve();O();vL="code-graph.json.gz";a(fT,"artifactPath");a(_L,"exportCodeGraphArtifact");a(xL,"importCodeGraphArtifact");a(hT,"bootstrapCodeGraphFromArtifact");a(yT,"maybeExportAfterIndex");a(RL,"maybeUploadCodeGraphToCloud")});function AL(){let t=ep.map(e=>`"${e}"`).join(", ");return`---
|
|
1653
1653
|
description: "${Zd}"
|
package/package.json
CHANGED