aut-cli 0.9.0 → 0.9.1

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/README.md CHANGED
@@ -16,14 +16,14 @@ aut track bind TRACK_ID
16
16
  aut track read
17
17
  ```
18
18
 
19
- 默认浏览器授权为只读:`account:read,track:read,notifications:read`。
20
- 需要写入时明确申请,例如:
19
+ 默认申请服务端支持的全部可委托账号权限,在浏览器确认后生效。授权页可缩小范围;
20
+ 已有连接不会因升级自动扩权,需要更多权限时重新运行 `aut connect`。也可显式请求较小范围:
21
21
 
22
22
  ```sh
23
- aut connect https://api.test.snapcoach.cn --scopes account:read,track:read,track:write,notifications:read
23
+ aut connect https://api.test.snapcoach.cn --scopes account:read,track:read,notifications:read
24
24
  ```
25
25
 
26
- 支持 `--resource-mode selected_tracks --track-ids ID1,ID2` 限定授权范围。
26
+ 可配合 `--scopes account:read,track:read,track:write --resource-mode selected_tracks --track-ids ID1,ID2` 限定授权范围。
27
27
  已有账号凭据可通过 `--auth token --token-stdin` 导入;不要把凭据放在命令参数中。
28
28
  服务端始终检查账号、授权范围和 Track 当前权限。
29
29
 
@@ -59,9 +59,24 @@ aut record download ZIP_RECORD_ID --version 1 --output attachment.zip
59
59
  写操作需要稳定 `--key`,不会自动重试。
60
60
 
61
61
  `aut track commit MANIFEST.json --key KEY` 支持原子提交文字、附件和资料变更。
62
- 原生清单字段为 `message`、`attachments`、`record_changes`、`record_refs`,最多
62
+ 原生清单字段为 `kind`、`message`、`attachments`、`record_changes`、`record_refs`,最多
63
63
  256 KiB;行内文字最多 64 KiB。更大正文先上传文件再引用。
64
64
 
65
+ 0.9.1 将文本 Record 全文与进度正文分开,`--text` 只准备资料正文;使用
66
+ `--message-file update.md --type checkpoint` 指定本次进度。更新默认保留文件名,
67
+ 可同时指定 `--title` 和 `--filename`,一次提交产生一个版本。
68
+
69
+ ```sh
70
+ aut track add update.md --type decision --record RECORD_ID@3 --attach UPLOAD_ID=evidence.zip --key decision-001
71
+ aut entry attachment ENTRY_ID ATTACHMENT_ID
72
+ aut entry download ENTRY_ID ATTACHMENT_ID --output evidence.zip
73
+ ```
74
+
75
+ `--record`、`--attach` 可重复指定。类型支持 progress、decision、blocker、checkpoint、context、summary;
76
+ handoff 使用独立命令。短进度写本次结果,长期方案沿用 Record,本次证据作为 Entry 附件。
77
+ 新文本准备总量以及本次审核的资料正文总量分别最多 1 MiB,超限明确拒绝。
78
+ 0.9.1 的 Record 独立文本、多类型和附件下载需要配套后端;不兼容时不会改用旧写法重试。
79
+
65
80
  ## 分页和等待
66
81
 
67
82
  ```sh
@@ -82,7 +97,7 @@ aut wait --cursor SYNC_CURSOR --timeout 300
82
97
 
83
98
  ```sh
84
99
  aut self update
85
- aut skill install --agent codex
100
+ aut skill install
86
101
  ```
87
102
 
88
103
  0.8 统一使用 Agent Utopia 原生账号接口。删除旧组织密码登录、`--organization`、
@@ -97,12 +112,15 @@ aut skill install --agent codex
97
112
  ## Agent 集成
98
113
 
99
114
  ```sh
100
- aut skill install --agent codex
101
- aut skill install --agent claude-code
115
+ aut skill install
102
116
  aut skill install --agent agents --scope project --dir ./project
103
117
  aut integrate codex --dir ./project
104
118
  ```
105
119
 
120
+ `aut skill install` 默认分别写入 `~/.agents/skills/aut`(Codex/通用 Agents 共享)与
121
+ `~/.claude/skills/aut`;`--agent` 仍可单独选择。每个目录分别报告结果,部分失败返回非零,
122
+ 已存在的自定义 Skill 保留。
123
+
106
124
  只提供 Agent Utopia Skill,不需要 edition。安装离线执行,不连接服务或创建 Track
107
125
  绑定;官方旧说明会先备份,自定义内容不会覆盖。升级 CLI 后重新运行相同安装命令。
108
126
  CLI 和当前原创集成说明遵循分发许可;保留历史 MIT 材料的原有权利。
package/dist/cli.js CHANGED
@@ -1,37 +1,37 @@
1
1
  #!/usr/bin/env node
2
- var Ar=Object.defineProperty;var se=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};var At=(e,r)=>{for(var t in r)Ar(e,t,{get:r[t],enumerable:!0})};var Tt,It=se(()=>{Tt={name:"aut-cli",version:"0.9.0",license:"SEE LICENSE IN LICENSE",description:"Agent Utopia command-line client with durable uploads and collaboration workflows.",type:"module",engines:{node:">=22"},bin:{aut:"dist/aut.cjs"},files:["dist/aut.cjs","dist/cli.js","dist/integrations/LICENSE","dist/integrations/AGENTS.snippet.md","dist/integrations/checkpoint.md","dist/integrations/skills/aut/SKILL.md","README.md","LICENSE","NOTICE.md"],scripts:{build:"node scripts/build.mjs",typecheck:"tsc --noEmit",test:"node --import tsx --test test/*.test.ts","test:package":"node scripts/package-smoke.mjs",check:"npm run typecheck && npm test && npm run build && npm run test:package",prepack:"npm run build && npm run test:package",prepublishOnly:"npm run typecheck && npm test"},devDependencies:{"@types/node":"26.6.3",esbuild:"0.28.2",tsx:"4.23.15",typescript:"7.0.2"},repository:{type:"git",url:"git+https://github.com/FredrickUnderwood/amb-codebases-amb-cli.git"},homepage:"https://www.npmjs.com/package/aut-cli",publishConfig:{access:"public",registry:"https://registry.npmjs.org/"}}});var X,Oe=se(()=>{"use strict";It();X=Tt.version});function U(e){return typeof e=="string"&&/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$/.test(e)}function je(e){return e.startsWith("aut_agent_")||e.startsWith("amb_account_")}function Y(e){let r=e?.track_ids||[];if(!Array.isArray(e?.scopes)||!e.scopes.length||e.scopes.some(t=>!Xr.includes(t))||new Set(e.scopes).size!==e.scopes.length||!Array.isArray(r)||new Set(r).size!==r.length||r.some(t=>!U(t))||!(e.resource_mode==="all_visible"&&r.length===0||e.resource_mode==="selected_tracks"&&r.length>0&&r.length<=100&&e.scopes.every(t=>Vr.includes(t))))throw new Error("\u8D26\u53F7\u6388\u6743\u8303\u56F4\u65E0\u6548\uFF1Bselected_tracks \u9700 1\u2013100 \u4E2A\u552F\u4E00 Track\uFF0C\u4E14\u4E0D\u80FD\u5305\u542B\u8D26\u53F7\u5168\u5C40\u901A\u77E5\u7B49 scope");return{scopes:[...e.scopes],resource_mode:e.resource_mode,...r.length?{track_ids:[...r]}:{}}}function Le(e,r){return Y(e),Y(r),e.scopes.every(t=>r.scopes.includes(t))&&(r.resource_mode==="all_visible"||e.resource_mode==="selected_tracks"&&e.track_ids.every(t=>r.track_ids.includes(t)))}function ot(e,r,t=Date.now()){let n=e;if(!n||!U(n.account_id)||!U(n.credential_id)||n.credential_kind!==(r.startsWith("aut_agent_")?"agent_pat":"account_session")||!Number.isSafeInteger(n.credential_epoch)||n.credential_epoch<1||!Number.isSafeInteger(n.authorization_epoch)||n.authorization_epoch<1||"organization_id"in n||"user_id"in n||"id"in n)throw new Error("Auth \u8FD4\u56DE\u7684\u8D26\u53F7\u8EAB\u4EFD\u65E0\u6548\u6216\u6DF7\u5165\u7EC4\u7EC7\u8EAB\u4EFD");Y(n);let o=Date.parse(n.checked_at),i=Date.parse(n.valid_until),s=Date.parse(n.expires_at);if(![o,i,s].every(Number.isFinite)||o>t+1e3||i<=t||i<=o||i-o>5e3||i>s)throw new Error("Auth \u8D26\u53F7\u8EAB\u4EFD\u5DF2\u8FC7\u671F\u6216\u6821\u9A8C\u7A97\u53E3\u65E0\u6548\uFF1B\u8BF7\u68C0\u67E5\u672C\u673A\u65F6\u949F\u5E76\u91CD\u65B0\u9A8C\u8BC1");return n}function Ce(e){return JSON.parse(e,(r,t,n)=>{if(typeof t=="number"&&(!Number.isFinite(t)||Number.isInteger(t)&&!Number.isSafeInteger(t))){if(!n?.source||!/^-?(?:0|[1-9]\d*)$/.test(n.source))throw new Error("JSON \u6570\u503C\u8D85\u51FA\u53EF\u7CBE\u786E\u8868\u793A\u8303\u56F4");return n.source}return t})}function B(e,r){if(!e||!/^(?:0|[1-9]\d*)$/.test(e)||e.length>20||BigInt(e)>18446744073709551615n)throw new Error(`${r} \u5FC5\u987B\u4E3A uint64 \u5341\u8FDB\u5236\u6574\u6570`);return e}function te(e,r){let t=B(e,r);return JSON.rawJSON(t)}var Xr,Vr,De,V=se(()=>{"use strict";Xr=["account:read","credentials:manage","identity:manage","track:read","track:write","track:share","track:admin","organization:manage","collaboration:manage","contract:read","contract:work","contract:manage","utopia:read","utopia:write","utopia.board.write","support:read","support:write","notifications:read","notifications:write"],Vr=["account:read","credentials:manage","track:read","track:write","track:share","track:admin","contract:read","contract:work","contract:manage","collaboration:manage","utopia.board.write"],De=["account:read","track:read","notifications:read"]});import{existsSync as tr,lstatSync as dt,readFileSync as mn,renameSync as gn,unlinkSync as rr,writeFileSync as nr}from"node:fs";import{dirname as or,join as Ge,resolve as ut}from"node:path";import{randomUUID as wn}from"node:crypto";function me(e=process.cwd()){let r=ut(e);for(;;){for(let n of[".amb.json",".amb-solo.json",".amb-track",".amb-team.json"]){try{dt(Ge(r,n))}catch(o){if(o.code==="ENOENT")continue;throw o}throw new Error(`\u8BF7\u5148\u5907\u4EFD\u79FB\u8D70\u65E7\u7ED1\u5B9A ${Ge(r,n)}\uFF0C\u518D\u8FD0\u884C aut track bind\uFF1B\u65E7\u6587\u4EF6\u4E0D\u4F1A\u88AB\u8BFB\u53D6\u6216\u8F6C\u6362`)}let t=or(r);if(t===r)return;r=t}}function ct(e){let r;try{r=dt(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(!r.isFile()||r.isSymbolicLink()||r.size>8192)throw new Error(".aut.json \u5FC5\u987B\u662F\u666E\u901A\u7684\u5C0F\u578B\u7ED1\u5B9A\u6587\u4EF6");let t=JSON.parse(mn(e,"utf8"));if(t.version!==2||t.product!=="agent-utopia"||!U(t.account_id)||!U(t.track_id)||!U(t.owner_party_id)||typeof t.auth_url!="string"||typeof t.platform_url!="string"||Object.keys(t).some(n=>!["version","product","auth_url","platform_url","account_id","track_id","owner_party_id"].includes(n)))throw new Error(".aut.json \u4E0D\u662F Agent Utopia \u8D26\u53F7\u7ED1\u5B9A\uFF1B\u8BF7\u5907\u4EFD\u79FB\u8D70\u540E\u91CD\u65B0 bind");return t}function ir(e,r=process.cwd()){e.assertActive(),me(r);let t=ut(r);for(;;){let n=ct(Ge(t,".aut.json"));if(n){if(n.auth_url!==e.profile.auth_url||n.platform_url!==e.profile.platform_url||n.account_id!==e.profile.account_id)throw new Error("\u9879\u76EE\u7ED1\u5B9A\u4E0E\u5F53\u524D\u8D26\u53F7\u6216\u73AF\u5883\u4E0D\u4E00\u81F4\uFF1B\u4E0D\u4F1A\u5207\u6362\u767B\u5F55\u6216\u53D1\u9001\u8BF7\u6C42");return n.track_id}let o=or(t);if(o===t)break;t=o}throw new Error("\u7F3A\u5C11 Track ID\uFF1B\u8BF7\u5148\u8FD0\u884C aut track bind ID")}async function sr(e,r,t=process.cwd(),n=!1){if(!U(r))throw new Error("Track ID \u65E0\u6548");let o=ut(t);if(me(o),!tr(o)||!dt(o).isDirectory())throw new Error("\u7ED1\u5B9A\u76EE\u5F55\u5FC5\u987B\u5DF2\u7ECF\u5B58\u5728");let i=Ge(o,".aut.json"),s=ct(i),c=await e.request("platform","/api/v1/tracks/"+encodeURIComponent(r));if(c?.track?.id!==r||!U(c.track.owner_party_id)||c.can_read!==!0)throw new Error("\u670D\u52A1\u7AEF\u672A\u8FD4\u56DE\u5339\u914D\u4E14\u53EF\u8BFB\u7684 Track\uFF0C\u672A\u5199\u5165\u7ED1\u5B9A");let a={version:2,product:"agent-utopia",auth_url:e.profile.auth_url,platform_url:e.profile.platform_url,account_id:e.profile.account_id,track_id:r,owner_party_id:c.track.owner_party_id},f=JSON.stringify(s)===JSON.stringify(a);if(s&&!f&&!n)throw new Error("\u5DF2\u6709\u4E0D\u540C\u7ED1\u5B9A\uFF1B\u786E\u8BA4\u540E\u4F7F\u7528 --replace");e.assertActive(),me(o);let m=i+".lock";try{nr(m,String(process.pid),{flag:"wx",mode:384})}catch{throw new Error("\u9879\u76EE\u7ED1\u5B9A\u6B63\u5728\u4FEE\u6539")}let l=i+"."+wn()+".tmp";try{if(e.assertActive(),JSON.stringify(ct(i))!==JSON.stringify(s))throw new Error("\u9879\u76EE\u7ED1\u5B9A\u5DF2\u6539\u53D8\uFF0C\u672A\u8986\u76D6\u65B0\u7ED1\u5B9A");f||(nr(l,JSON.stringify(a,null,2)+`
3
- `,{flag:"wx",mode:384}),gn(l,i))}finally{tr(l)&&rr(l),rr(m)}return{status:f?"up-to-date":"bound",path:i,...a}}var lt=se(()=>{"use strict";V()});var Er={};At(Er,{installIntegration:()=>Cn,projectBundle:()=>Ln,projectFiles:()=>ht,utopiaSkill:()=>We});import P from"node:fs";import{randomBytes as On,createHash as Rn}from"node:crypto";import{join as we,resolve as Un}from"node:path";import{fileURLToPath as br}from"node:url";function We(){return P.readFileSync(we(kr(),"skills/aut/SKILL.md"),"utf8")}function ht(e){if(!["claude-code","codex","agents"].includes(e))throw new Error("\u96C6\u6210\u652F\u6301 claude-code\u3001codex \u6216 agents");let r=e==="claude-code"?".claude/skills/aut/SKILL.md":".agents/skills/aut/SKILL.md";return[{path:e==="claude-code"?"CLAUDE.md":"AGENTS.md",merge:"amb-block",content:P.readFileSync(we(kr(),"AGENTS.snippet.md"),"utf8").replace("{{skill_path}}",r)},{path:r,merge:"managed-skill",content:We()}]}function Ln(e="agents"){return{protocol:"aut-project",version:3,product:"agent-utopia",files:ht(e)}}function He(e){let r=P.lstatSync(e,{throwIfNoEntry:!1});if(!r)return;if(!r.isFile()||r.isSymbolicLink()||r.size>2*1024*1024)throw new Error(`\u96C6\u6210\u6587\u4EF6\u987B\u4E3A\u4E0D\u8D85\u8FC7 2 MiB \u7684\u666E\u901A\u6587\u4EF6\uFF0C\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\uFF1A${e}`);let t=P.openSync(e,P.constants.O_RDONLY|(P.constants.O_NOFOLLOW||0));try{return new TextDecoder("utf-8",{fatal:!0}).decode(P.readFileSync(t))}finally{P.closeSync(t)}}function Cn(e,r){let t=ht(e),n=Un(r);me(n);let o=P.lstatSync(n,{throwIfNoEntry:!1});if(o&&(!o.isDirectory()||o.isSymbolicLink()))throw new Error("\u96C6\u6210\u6839\u76EE\u5F55\u5FC5\u987B\u662F\u666E\u901A\u76EE\u5F55\uFF0C\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5");P.mkdirSync(n,{recursive:!0});let i=P.realpathSync(n);me(i);for(let y of[".agents",".claude"]){let E=P.lstatSync(we(i,y),{throwIfNoEntry:!1});if(E&&(!E.isDirectory()||E.isSymbolicLink()))throw new Error("\u5BBF\u4E3B\u76EE\u5F55\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\u6216\u6587\u4EF6")}let s=we(i,".claude/hooks/amb-session-start.mjs");if(P.lstatSync(s,{throwIfNoEntry:!1}))throw new Error("\u53D1\u73B0\u65E7 AMB session hook\uFF1B\u8BF7\u5148\u6838\u5BF9\u5E76\u79FB\u9664\u65E7 hook \u4E0E\u5BBF\u4E3B\u5F15\u7528\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u6267\u884C\u6216\u8FC1\u79FB");for(let y of[".claude/settings.json",".claude/settings.local.json"])if(He(we(i,y))?.includes("amb-session-start.mjs"))throw new Error("\u5BBF\u4E3B\u8BBE\u7F6E\u4ECD\u5F15\u7528\u65E7 AMB session hook\uFF0C\u8BF7\u5148\u6838\u5BF9\u5E76\u79FB\u9664\u5F15\u7528");let c=t[0],a=we(i,c.path),f=He(a),m=f||"",l=c.content.trim(),p=[...m.matchAll(/<!-- ((?:aut|amb)(?:-solo)?):(begin|end) -->/g)],v;if(!p.length)v=m+(m?`
2
+ var Rr=Object.defineProperty;var ue=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(o){throw t=[o],o}};var Ot=(e,r)=>{for(var t in r)Rr(e,t,{get:r[t],enumerable:!0})};var Dt,Rt=ue(()=>{Dt={name:"aut-cli",version:"0.9.1",license:"SEE LICENSE IN LICENSE",description:"Agent Utopia command-line client with durable uploads and collaboration workflows.",type:"module",engines:{node:">=22"},bin:{aut:"dist/aut.cjs"},files:["dist/aut.cjs","dist/cli.js","dist/integrations/LICENSE","dist/integrations/AGENTS.snippet.md","dist/integrations/checkpoint.md","dist/integrations/skills/aut/SKILL.md","README.md","LICENSE","NOTICE.md"],scripts:{build:"node scripts/build.mjs",typecheck:"tsc --noEmit",test:"node --import tsx --test test/*.test.ts","test:package":"node scripts/package-smoke.mjs",check:"npm run typecheck && npm test && npm run build && npm run test:package",prepack:"npm run build && npm run test:package",prepublishOnly:"npm run typecheck && npm test"},devDependencies:{"@types/node":"26.6.3",esbuild:"0.28.2",tsx:"4.23.15",typescript:"7.0.2"},repository:{type:"git",url:"git+https://github.com/FredrickUnderwood/amb-codebases-amb-cli.git"},homepage:"https://www.npmjs.com/package/aut-cli",publishConfig:{access:"public",registry:"https://registry.npmjs.org/"}}});var ee,je=ue(()=>{"use strict";Rt();ee=Dt.version});function D(e){return typeof e=="string"&&/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$/.test(e)}function qe(e){return e.startsWith("aut_agent_")||e.startsWith("amb_account_")}function W(e){let r=e?.track_ids||[];if(!Array.isArray(e?.scopes)||!e.scopes.length||e.scopes.some(t=>!Jt.includes(t))||new Set(e.scopes).size!==e.scopes.length||!Array.isArray(r)||new Set(r).size!==r.length||r.some(t=>!D(t))||!(e.resource_mode==="all_visible"&&r.length===0||e.resource_mode==="selected_tracks"&&r.length>0&&r.length<=100&&e.scopes.every(t=>en.includes(t))))throw new Error("\u8D26\u53F7\u6388\u6743\u8303\u56F4\u65E0\u6548\uFF1Bselected_tracks \u9700 1\u2013100 \u4E2A\u552F\u4E00 Track\uFF0C\u4E14\u4E0D\u80FD\u5305\u542B\u8D26\u53F7\u5168\u5C40\u901A\u77E5\u7B49 scope");return{scopes:[...e.scopes],resource_mode:e.resource_mode,...r.length?{track_ids:[...r]}:{}}}function ze(e,r){return W(e),W(r),e.scopes.every(t=>r.scopes.includes(t))&&(r.resource_mode==="all_visible"||e.resource_mode==="selected_tracks"&&e.track_ids.every(t=>r.track_ids.includes(t)))}function ut(e,r,t=Date.now()){let o=e;if(!o||!D(o.account_id)||!D(o.credential_id)||o.credential_kind!==(r.startsWith("aut_agent_")?"agent_pat":"account_session")||!Number.isSafeInteger(o.credential_epoch)||o.credential_epoch<1||!Number.isSafeInteger(o.authorization_epoch)||o.authorization_epoch<1||"organization_id"in o||"user_id"in o||"id"in o)throw new Error("Auth \u8FD4\u56DE\u7684\u8D26\u53F7\u8EAB\u4EFD\u65E0\u6548\u6216\u6DF7\u5165\u7EC4\u7EC7\u8EAB\u4EFD");W(o);let n=Date.parse(o.checked_at),i=Date.parse(o.valid_until),s=Date.parse(o.expires_at);if(![n,i,s].every(Number.isFinite)||n>t+1e3||i<=t||i<=n||i-n>5e3||i>s)throw new Error("Auth \u8D26\u53F7\u8EAB\u4EFD\u5DF2\u8FC7\u671F\u6216\u6821\u9A8C\u7A97\u53E3\u65E0\u6548\uFF1B\u8BF7\u68C0\u67E5\u672C\u673A\u65F6\u949F\u5E76\u91CD\u65B0\u9A8C\u8BC1");return o}function Fe(e){return JSON.parse(e,(r,t,o)=>{if(typeof t=="number"&&(!Number.isFinite(t)||Number.isInteger(t)&&!Number.isSafeInteger(t))){if(!o?.source||!/^-?(?:0|[1-9]\d*)$/.test(o.source))throw new Error("JSON \u6570\u503C\u8D85\u51FA\u53EF\u7CBE\u786E\u8868\u793A\u8303\u56F4");return o.source}return t})}function B(e,r){if(!e||!/^(?:0|[1-9]\d*)$/.test(e)||e.length>20||BigInt(e)>18446744073709551615n)throw new Error(`${r} \u5FC5\u987B\u4E3A uint64 \u5341\u8FDB\u5236\u6574\u6570`);return e}function te(e,r){let t=B(e,r);return JSON.rawJSON(t)}var Jt,en,Be,re=ue(()=>{"use strict";Jt=["account:read","credentials:manage","identity:manage","track:read","track:write","track:share","track:admin","organization:manage","collaboration:manage","contract:read","contract:work","contract:manage","utopia:read","utopia:write","utopia.board.write","support:read","support:write","notifications:read","notifications:write","billing:read","billing:manage"],en=["account:read","credentials:manage","track:read","track:write","track:share","track:admin","contract:read","contract:work","contract:manage","collaboration:manage","utopia.board.write"],Be=[...Jt]});import{existsSync as ir,lstatSync as gt,readFileSync as hn,renameSync as yn,unlinkSync as sr,writeFileSync as ar}from"node:fs";import{dirname as cr,join as Xe,resolve as wt}from"node:path";import{randomUUID as _n}from"node:crypto";function ye(e=process.cwd()){let r=wt(e);for(;;){for(let o of[".amb.json",".amb-solo.json",".amb-track",".amb-team.json"]){try{gt(Xe(r,o))}catch(n){if(n.code==="ENOENT")continue;throw n}throw new Error(`\u8BF7\u5148\u5907\u4EFD\u79FB\u8D70\u65E7\u7ED1\u5B9A ${Xe(r,o)}\uFF0C\u518D\u8FD0\u884C aut track bind\uFF1B\u65E7\u6587\u4EF6\u4E0D\u4F1A\u88AB\u8BFB\u53D6\u6216\u8F6C\u6362`)}let t=cr(r);if(t===r)return;r=t}}function mt(e){let r;try{r=gt(e)}catch(o){if(o.code==="ENOENT")return;throw o}if(!r.isFile()||r.isSymbolicLink()||r.size>8192)throw new Error(".aut.json \u5FC5\u987B\u662F\u666E\u901A\u7684\u5C0F\u578B\u7ED1\u5B9A\u6587\u4EF6");let t=JSON.parse(hn(e,"utf8"));if(t.version!==2||t.product!=="agent-utopia"||!D(t.account_id)||!D(t.track_id)||!D(t.owner_party_id)||typeof t.auth_url!="string"||typeof t.platform_url!="string"||Object.keys(t).some(o=>!["version","product","auth_url","platform_url","account_id","track_id","owner_party_id"].includes(o)))throw new Error(".aut.json \u4E0D\u662F Agent Utopia \u8D26\u53F7\u7ED1\u5B9A\uFF1B\u8BF7\u5907\u4EFD\u79FB\u8D70\u540E\u91CD\u65B0 bind");return t}function dr(e,r=process.cwd()){e.assertActive(),ye(r);let t=wt(r);for(;;){let o=mt(Xe(t,".aut.json"));if(o){if(o.auth_url!==e.profile.auth_url||o.platform_url!==e.profile.platform_url||o.account_id!==e.profile.account_id)throw new Error("\u9879\u76EE\u7ED1\u5B9A\u4E0E\u5F53\u524D\u8D26\u53F7\u6216\u73AF\u5883\u4E0D\u4E00\u81F4\uFF1B\u4E0D\u4F1A\u5207\u6362\u767B\u5F55\u6216\u53D1\u9001\u8BF7\u6C42");return o.track_id}let n=cr(t);if(n===t)break;t=n}throw new Error("\u7F3A\u5C11 Track ID\uFF1B\u8BF7\u5148\u8FD0\u884C aut track bind ID")}async function ur(e,r,t=process.cwd(),o=!1){if(!D(r))throw new Error("Track ID \u65E0\u6548");let n=wt(t);if(ye(n),!ir(n)||!gt(n).isDirectory())throw new Error("\u7ED1\u5B9A\u76EE\u5F55\u5FC5\u987B\u5DF2\u7ECF\u5B58\u5728");let i=Xe(n,".aut.json"),s=mt(i),c=await e.request("platform","/api/v1/tracks/"+encodeURIComponent(r));if(c?.track?.id!==r||!D(c.track.owner_party_id)||c.can_read!==!0)throw new Error("\u670D\u52A1\u7AEF\u672A\u8FD4\u56DE\u5339\u914D\u4E14\u53EF\u8BFB\u7684 Track\uFF0C\u672A\u5199\u5165\u7ED1\u5B9A");let a={version:2,product:"agent-utopia",auth_url:e.profile.auth_url,platform_url:e.profile.platform_url,account_id:e.profile.account_id,track_id:r,owner_party_id:c.track.owner_party_id},f=JSON.stringify(s)===JSON.stringify(a);if(s&&!f&&!o)throw new Error("\u5DF2\u6709\u4E0D\u540C\u7ED1\u5B9A\uFF1B\u786E\u8BA4\u540E\u4F7F\u7528 --replace");e.assertActive(),ye(n);let m=i+".lock";try{ar(m,String(process.pid),{flag:"wx",mode:384})}catch{throw new Error("\u9879\u76EE\u7ED1\u5B9A\u6B63\u5728\u4FEE\u6539")}let l=i+"."+_n()+".tmp";try{if(e.assertActive(),JSON.stringify(mt(i))!==JSON.stringify(s))throw new Error("\u9879\u76EE\u7ED1\u5B9A\u5DF2\u6539\u53D8\uFF0C\u672A\u8986\u76D6\u65B0\u7ED1\u5B9A");f||(ar(l,JSON.stringify(a,null,2)+`
3
+ `,{flag:"wx",mode:384}),yn(l,i))}finally{ir(l)&&sr(l),sr(m)}return{status:f?"up-to-date":"bound",path:i,...a}}var ht=ue(()=>{"use strict";re()});var Ar={};Ot(Ar,{installIntegration:()=>qn,projectBundle:()=>Bn,projectFiles:()=>Et,utopiaSkill:()=>rt});import j from"node:fs";import{randomBytes as Un,createHash as Pn}from"node:crypto";import{join as _e,resolve as jn}from"node:path";import{fileURLToPath as xr}from"node:url";function rt(){return j.readFileSync(_e(Nr(),"skills/aut/SKILL.md"),"utf8")}function Et(e){if(!["claude-code","codex","agents"].includes(e))throw new Error("\u96C6\u6210\u652F\u6301 claude-code\u3001codex \u6216 agents");let r=e==="claude-code"?".claude/skills/aut/SKILL.md":".agents/skills/aut/SKILL.md";return[{path:e==="claude-code"?"CLAUDE.md":"AGENTS.md",merge:"amb-block",content:j.readFileSync(_e(Nr(),"AGENTS.snippet.md"),"utf8").replace("{{skill_path}}",r)},{path:r,merge:"managed-skill",content:rt()}]}function Bn(e="agents"){return{protocol:"aut-project",version:3,product:"agent-utopia",files:Et(e)}}function tt(e){let r=j.lstatSync(e,{throwIfNoEntry:!1});if(!r)return;if(!r.isFile()||r.isSymbolicLink()||r.size>2*1024*1024)throw new Error(`\u96C6\u6210\u6587\u4EF6\u987B\u4E3A\u4E0D\u8D85\u8FC7 2 MiB \u7684\u666E\u901A\u6587\u4EF6\uFF0C\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\uFF1A${e}`);let t=j.openSync(e,j.constants.O_RDONLY|(j.constants.O_NOFOLLOW||0));try{return new TextDecoder("utf-8",{fatal:!0}).decode(j.readFileSync(t))}finally{j.closeSync(t)}}function qn(e,r){let t=Et(e),o=jn(r);ye(o);let n=j.lstatSync(o,{throwIfNoEntry:!1});if(n&&(!n.isDirectory()||n.isSymbolicLink()))throw new Error("\u96C6\u6210\u6839\u76EE\u5F55\u5FC5\u987B\u662F\u666E\u901A\u76EE\u5F55\uFF0C\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5");j.mkdirSync(o,{recursive:!0});let i=j.realpathSync(o);ye(i);for(let _ of[".agents",".claude"]){let E=j.lstatSync(_e(i,_),{throwIfNoEntry:!1});if(E&&(!E.isDirectory()||E.isSymbolicLink()))throw new Error("\u5BBF\u4E3B\u76EE\u5F55\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\u6216\u6587\u4EF6")}let s=_e(i,".claude/hooks/amb-session-start.mjs");if(j.lstatSync(s,{throwIfNoEntry:!1}))throw new Error("\u53D1\u73B0\u65E7 AMB session hook\uFF1B\u8BF7\u5148\u6838\u5BF9\u5E76\u79FB\u9664\u65E7 hook \u4E0E\u5BBF\u4E3B\u5F15\u7528\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u6267\u884C\u6216\u8FC1\u79FB");for(let _ of[".claude/settings.json",".claude/settings.local.json"])if(tt(_e(i,_))?.includes("amb-session-start.mjs"))throw new Error("\u5BBF\u4E3B\u8BBE\u7F6E\u4ECD\u5F15\u7528\u65E7 AMB session hook\uFF0C\u8BF7\u5148\u6838\u5BF9\u5E76\u79FB\u9664\u5F15\u7528");let c=t[0],a=_e(i,c.path),f=tt(a),m=f||"",l=c.content.trim(),p=[...m.matchAll(/<!-- ((?:aut|amb)(?:-solo)?):(begin|end) -->/g)],v;if(!p.length)v=m+(m?`
4
4
 
5
- `:"")+c.content;else{if(p.length!==2||p[0][1]!==p[1][1]||p[0][2]!=="begin"||p[1][2]!=="end")throw new Error(`${c.path} \u4E2D AMB \u6807\u8BB0\u51B2\u7A81\u6216\u4E0D\u5B8C\u6574\uFF0C\u8BF7\u624B\u52A8\u5408\u5E76`);let y=p[0].index,E=p[1].index+p[1][0].length,w=m.slice(y,E).trim();if(w!==l&&!jn.has(Dn(w)))throw new Error(`${c.path} \u7684 AMB \u8BF4\u660E\u5DF2\u6709\u81EA\u5B9A\u4E49\u5185\u5BB9\uFF0C\u5DF2\u4FDD\u7559\uFF0C\u8BF7\u624B\u52A8\u5408\u5E76`);v=m.slice(0,y)+l+m.slice(E)}let h=On(9).toString("base64url"),d=a+"."+h+".tmp",_,u=_t({agent:e,scope:"project",directory:i});if(v!==f)try{if(P.writeFileSync(d,v,{flag:"wx",mode:420}),He(a)!==f)throw new Error("\u9879\u76EE\u8BF4\u660E\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316\uFF0C\u672A\u8986\u76D6");if(f!==void 0&&(_=a+".bak-"+h,P.writeFileSync(_,f,{flag:"wx",mode:384})),He(a)!==f)throw new Error("\u9879\u76EE\u8BF4\u660E\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316\uFF0C\u672A\u8986\u76D6");f===void 0?P.linkSync(d,a):P.renameSync(d,a)}finally{P.rmSync(d,{force:!0})}return{installed:t.map(y=>y.path),directory:i,skill:u,..._?{backup:_}:{},next:"\u9879\u76EE\u8BF4\u660E\u548CAgent Utopia Skill \u5DF2\u5B89\u88C5\uFF1B\u672A\u8FDE\u63A5\u670D\u52A1\u5668\u6216\u521B\u5EFA\u7ED1\u5B9A\u3002\u6838\u5BF9 aut status --json\u3001aut whoami --json \u540E\uFF0C\u7531\u7528\u6237\u660E\u786E\u9009\u62E9 aut track bind TRACK_ID\u3002"}}var _r,Pn,Dn,jn,kr,yt=se(()=>{"use strict";bt();lt();_r=br(new URL("./integrations/",import.meta.url)),Pn=br(new URL("../integrations/",import.meta.url)),Dn=e=>Rn("sha256").update(e).digest("hex"),jn=new Set(["f11d24279126311266be98995c6e85d1712d8842b8daa6efb3b8b4b851953783","57bed13cbd2e32a8565f2eb77c022cd31446c55f6ed2cd10e24060a6267a9128","2d99e2648f2e7631dcffb07290c7dc46a49eb8d08f24e6ad6ac74fc240a8f88c"]),kr=()=>P.existsSync(_r)?_r:Pn});var xr={};At(xr,{installSkill:()=>_t});import I from"node:fs";import{createHash as $n,randomBytes as Bn}from"node:crypto";import{homedir as qn}from"node:os";import{join as z,resolve as zn,basename as Fn}from"node:path";function Ie(e){let r=I.lstatSync(e,{throwIfNoEntry:!1});if(!r)return;if(r.isSymbolicLink()||!r.isFile()||r.size>2*1024*1024)throw new Error(`\u5B89\u88C5\u8DEF\u5F84\u5FC5\u987B\u662F\u666E\u901A\u6587\u4EF6\uFF0C\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\u6216\u76EE\u5F55\uFF1A${e}`);let t=I.openSync(e,I.constants.O_RDONLY|(I.constants.O_NOFOLLOW||0));try{let n=I.fstatSync(t),o=I.readFileSync(t),i=I.lstatSync(e,{throwIfNoEntry:!1});if(!n.isFile()||!i?.isFile()||r.dev!==n.dev||r.ino!==n.ino||n.dev!==i.dev||n.ino!==i.ino||r.mtimeMs!==i.mtimeMs||r.size!==o.length)throw new Error(`\u6587\u4EF6\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u8BD5\uFF1A${e}`);return{content:o,device:n.dev,inode:n.ino,modified:i.mtimeMs}}finally{I.closeSync(t)}}function ne(e,r){let t=Ie(e);if(!!t!=!!r||t&&r&&(t.device!==r.device||t.inode!==r.inode||t.modified!==r.modified||!t.content.equals(r.content)))throw new Error(`\u6587\u4EF6\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316\uFF0C\u672A\u8986\u76D6\u65B0\u5185\u5BB9\uFF0C\u8BF7\u91CD\u8BD5\uFF1A${e}`)}function _t(e){let{agent:r}=e,t=e.scope??"user";if(!["codex","claude-code","agents"].includes(r))throw new Error("Skill \u5B89\u88C5\u9700\u8981 --agent codex\u3001claude-code \u6216 agents");if(!["user","project"].includes(t))throw new Error("--scope \u53EA\u652F\u6301 user \u6216 project");if(e.directory!==void 0&&t!=="project")throw new Error("--dir \u53EA\u9002\u7528\u4E8E --scope project\uFF0C\u8868\u793A\u9879\u76EE\u6839\u76EE\u5F55");let n=t==="user"?qn():zn(e.directory??"."),o=I.lstatSync(n,{throwIfNoEntry:!1});if(!o?.isDirectory()||o.isSymbolicLink())throw new Error(`\u5B89\u88C5\u6839\u76EE\u5F55\u5FC5\u987B\u662F\u5DF2\u5B58\u5728\u7684\u666E\u901A\u76EE\u5F55\uFF0C\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\uFF1A${n}`);let i=I.realpathSync(n),s=r==="claude-code"?".claude":".agents",c=[s,"skills","aut"],a=[],f=i;for(let g of["",...c]){g&&(f=z(f,g)),I.lstatSync(f,{throwIfNoEntry:!1})||I.mkdirSync(f);let N=I.lstatSync(f);if(N.isSymbolicLink()||!N.isDirectory())throw new Error(`Skill \u8DEF\u5F84\u5FC5\u987B\u662F\u666E\u901A\u76EE\u5F55\uFF0C\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\uFF1A${f}`);a.push({path:f,device:N.dev,inode:N.ino})}function m(){for(let g of a){let b=I.lstatSync(g.path,{throwIfNoEntry:!1});if(!b?.isDirectory()||b.isSymbolicLink()||b.dev!==g.device||b.ino!==g.inode)throw new Error(`Skill \u76EE\u5F55\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u8BD5\uFF1A${g.path}`)}}let l=z(f,"SKILL.md"),p=z(f,Sr),v=z(f,".aut-install.lock");m();let h;try{h=I.openSync(v,"wx",384)}catch(g){throw g.code==="EEXIST"?new Error(`\u53E6\u4E00\u6B21 Skill \u5B89\u88C5\u5C1A\u672A\u7ED3\u675F\uFF1B\u5982\u4E0A\u6B21\u5B89\u88C5\u5DF2\u4E2D\u65AD\uFF0C\u8BF7\u786E\u8BA4\u540E\u79FB\u9664\uFF1A${v}`):g}I.closeSync(h);let d=[],_,u=!1,y=[];try{let Ve=function(R,D){let $=R+"."+kt(9)+".tmp";d.push($);try{I.writeFileSync($,D,{flag:"wx",mode:420})}catch(H){throw H.code==="EEXIST"&&d.pop(),H}return $},Ze=function(R,D,$){$?I.renameSync(R,D):I.linkSync(R,D)};var E=Ve,w=Ze;let g=Ie(l),b=Ie(p),N=We(),j=Et(N),k=/<!-- aut-skill-version: ([A-Za-z0-9.+-]+) -->/.exec(N)?.[1];if(!k)throw new Error("\u968F CLI \u5206\u53D1\u7684 Agent Utopia Skill \u7F3A\u5C11\u7248\u672C\u4FE1\u606F");let S=g?.content.equals(Buffer.from(N))??!1,x=g?Et(g.content):void 0,T=x&&vr.has(x);if(g&&!S&&!T)throw new Error(`\u5DF2\u6709\u81EA\u5B9A\u4E49\u6216\u65E0\u6CD5\u9A8C\u8BC1\u7684 Skill\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${l}
6
- \u8BF7\u5148\u4EBA\u5DE5\u6838\u5BF9\u5E76\u5907\u4EFD\u79FB\u8D70\uFF1B--force \u4E5F\u4E0D\u4F1A\u8986\u76D6\u81EA\u5B9A\u4E49\u5185\u5BB9\u3002`);let O=[];for(let R of["amb","amb-team","amb-solo"]){let D=z(i,s,"skills",R),$=I.lstatSync(D,{throwIfNoEntry:!1});if(!$)continue;if(!$.isDirectory()||$.isSymbolicLink())throw new Error(`\u65E7 Skill \u8DEF\u5F84\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\u6216\u6587\u4EF6\uFF1A${D}`);let H=z(D,"SKILL.md"),ie=Ie(H);if(!ie||!vr.has(Et(ie.content)))throw new Error(`\u65E7 Skill \u5DF2\u6709\u81EA\u5B9A\u4E49\u6216\u672A\u77E5\u5185\u5BB9\uFF0C\u8BF7\u5148\u4EBA\u5DE5\u6838\u5BF9\uFF0C\u907F\u514D\u540C\u65F6\u52A0\u8F7D\u4E24\u4E2A\u7248\u672C\uFF1A${D}`);let he=new Map;for(let W of I.readdirSync(D)){if(W!=="SKILL.md"&&W!==Sr&&W!==".amb-install.json"&&!/^SKILL\.md\.bak-[A-Za-z0-9._-]+$/.test(W))throw new Error(`\u65E7 Skill \u76EE\u5F55\u6709\u989D\u5916\u6587\u4EF6\u6216\u5B89\u88C5\u9501\uFF0C\u8BF7\u5148\u4EBA\u5DE5\u6838\u5BF9\uFF1A${D}`);let Te=Ie(z(D,W));if(!Te)throw new Error("\u65E7 Skill \u6587\u4EF6\u5728\u68C0\u67E5\u65F6\u6D88\u5931\uFF0C\u8BF7\u91CD\u8BD5");he.set(W,Te)}O.push({directory:D,file:H,snapshot:ie,device:$.dev,inode:$.ino,files:he})}let q=z(i,s,"amb-skill-backups"),oe=I.lstatSync(q,{throwIfNoEntry:!1});if(oe&&(!oe.isDirectory()||oe.isSymbolicLink()))throw new Error("Skill \u5907\u4EFD\u76EE\u5F55\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\u6216\u6587\u4EF6");let vt=JSON.stringify({version:1,sha256:j,skill_version:k,cli_version:X},null,2)+`
7
- `,Nr=b?.content.toString("utf8")!==vt,xt=S?void 0:Ve(l,N),Nt=Nr?Ve(p,vt):void 0;if(m(),ne(l,g),ne(p,b),g&&!S){let R=l+".bak-"+new Date().toISOString().replaceAll(/[:.]/g,"-")+"-"+kt(6);if(I.writeFileSync(R,g.content,{flag:"wx",mode:384}),!I.readFileSync(R).equals(g.content))throw new Error(`Skill \u5907\u4EFD\u9A8C\u8BC1\u5931\u8D25\uFF1A${R}`);_=R}m(),ne(l,g),ne(p,b);for(let R of O){m();let D=I.lstatSync(R.directory,{throwIfNoEntry:!1});if(!D?.isDirectory()||D.isSymbolicLink()||D.dev!==R.device||D.ino!==R.inode)throw new Error("\u65E7 Skill \u76EE\u5F55\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316");ne(R.file,R.snapshot);let $=I.readdirSync(R.directory).sort();if(JSON.stringify($)!==JSON.stringify([...R.files.keys()].sort()))throw new Error("\u65E7 Skill \u76EE\u5F55\u5185\u5BB9\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316");for(let[W,Te]of R.files)ne(z(R.directory,W),Te);I.existsSync(q)||I.mkdirSync(q);let H=I.lstatSync(q);if(!H.isDirectory()||H.isSymbolicLink())throw new Error("Skill \u5907\u4EFD\u76EE\u5F55\u53D1\u751F\u53D8\u5316");let ie=z(q,kt(12));I.mkdirSync(ie,{mode:448});let he=z(ie,Fn(R.directory));I.renameSync(R.directory,he),y.push({from:R.directory,backup:he})}return m(),ne(l,g),xt&&(Ze(xt,l,g),u=!0),Nt&&Ze(Nt,p,b),{status:g?S?"up-to-date":"updated":"installed",agent:r,product:"agent-utopia",scope:t,directory:f,file:l,skill_version:k,cli_version:X,..._?{backup:_}:{},...y.length?{migrated:y}:{},next:"\u65B0\u5F00\u4F1A\u8BDD\u540E\u52A0\u8F7D Agent Utopia Skill\u3002\u5347\u7EA7 aut-cli \u540E\u518D\u6B21\u8FD0\u884C\u76F8\u540C\u5B89\u88C5\u547D\u4EE4\u5373\u53EF\u66F4\u65B0\uFF1B\u9879\u76EE\u5185\u5DF2\u6709\u526F\u672C\u65F6\uFF0C\u53E6\u7528 --scope project --dir <\u9879\u76EE\u6839\u76EE\u5F55> \u66F4\u65B0\u3002"}}catch(g){if(!u)for(let N of[...y].reverse())I.lstatSync(N.from,{throwIfNoEntry:!1})||I.renameSync(N.backup,N.from);if(!_&&!u&&!y.length)throw g;let b=g instanceof Error?g.message:String(g);throw new Error(b+(_?`
8
- \u539F Skill \u7684\u5B8C\u6574\u5907\u4EFD\uFF1A${_}`:"")+(y.length&&u?`
9
- \u65E7 Skill \u76EE\u5F55\u5907\u4EFD\uFF1A${y.map(N=>N.backup).join(", ")}`:"")+(u?`
5
+ `:"")+c.content;else{if(p.length!==2||p[0][1]!==p[1][1]||p[0][2]!=="begin"||p[1][2]!=="end")throw new Error(`${c.path} \u4E2D AMB \u6807\u8BB0\u51B2\u7A81\u6216\u4E0D\u5B8C\u6574\uFF0C\u8BF7\u624B\u52A8\u5408\u5E76`);let _=p[0].index,E=p[1].index+p[1][0].length,w=m.slice(_,E).trim();if(w!==l&&!$n.has(Cn(w)))throw new Error(`${c.path} \u7684 AMB \u8BF4\u660E\u5DF2\u6709\u81EA\u5B9A\u4E49\u5185\u5BB9\uFF0C\u5DF2\u4FDD\u7559\uFF0C\u8BF7\u624B\u52A8\u5408\u5E76`);v=m.slice(0,_)+l+m.slice(E)}let h=Un(9).toString("base64url"),d=a+"."+h+".tmp",b,u=nt({agent:e,scope:"project",directory:i});if(v!==f)try{if(j.writeFileSync(d,v,{flag:"wx",mode:420}),tt(a)!==f)throw new Error("\u9879\u76EE\u8BF4\u660E\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316\uFF0C\u672A\u8986\u76D6");if(f!==void 0&&(b=a+".bak-"+h,j.writeFileSync(b,f,{flag:"wx",mode:384})),tt(a)!==f)throw new Error("\u9879\u76EE\u8BF4\u660E\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316\uFF0C\u672A\u8986\u76D6");f===void 0?j.linkSync(d,a):j.renameSync(d,a)}finally{j.rmSync(d,{force:!0})}return{installed:t.map(_=>_.path),directory:i,skill:u,...b?{backup:b}:{},next:"\u9879\u76EE\u8BF4\u660E\u548CAgent Utopia Skill \u5DF2\u5B89\u88C5\uFF1B\u672A\u8FDE\u63A5\u670D\u52A1\u5668\u6216\u521B\u5EFA\u7ED1\u5B9A\u3002\u6838\u5BF9 aut status --json\u3001aut whoami --json \u540E\uFF0C\u7531\u7528\u6237\u660E\u786E\u9009\u62E9 aut track bind TRACK_ID\u3002"}}var vr,Ln,Cn,$n,Nr,St=ue(()=>{"use strict";vt();ht();vr=xr(new URL("./integrations/",import.meta.url)),Ln=xr(new URL("../integrations/",import.meta.url)),Cn=e=>Pn("sha256").update(e).digest("hex"),$n=new Set(["f11d24279126311266be98995c6e85d1712d8842b8daa6efb3b8b4b851953783","57bed13cbd2e32a8565f2eb77c022cd31446c55f6ed2cd10e24060a6267a9128","2d99e2648f2e7631dcffb07290c7dc46a49eb8d08f24e6ad6ac74fc240a8f88c"]),Nr=()=>j.existsSync(vr)?vr:Ln});var Or={};Ot(Or,{installAllSkills:()=>Yn,installSkill:()=>nt});import I from"node:fs";import{createHash as zn,randomBytes as Fn}from"node:crypto";import{homedir as Mn}from"node:os";import{join as z,resolve as Jn,basename as Gn}from"node:path";function De(e){let r=I.lstatSync(e,{throwIfNoEntry:!1});if(!r)return;if(r.isSymbolicLink()||!r.isFile()||r.size>2*1024*1024)throw new Error(`\u5B89\u88C5\u8DEF\u5F84\u5FC5\u987B\u662F\u666E\u901A\u6587\u4EF6\uFF0C\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\u6216\u76EE\u5F55\uFF1A${e}`);let t=I.openSync(e,I.constants.O_RDONLY|(I.constants.O_NOFOLLOW||0));try{let o=I.fstatSync(t),n=I.readFileSync(t),i=I.lstatSync(e,{throwIfNoEntry:!1});if(!o.isFile()||!i?.isFile()||r.dev!==o.dev||r.ino!==o.ino||o.dev!==i.dev||o.ino!==i.ino||r.mtimeMs!==i.mtimeMs||r.size!==n.length)throw new Error(`\u6587\u4EF6\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u8BD5\uFF1A${e}`);return{content:n,device:o.dev,inode:o.ino,modified:i.mtimeMs}}finally{I.closeSync(t)}}function ce(e,r){let t=De(e);if(!!t!=!!r||t&&r&&(t.device!==r.device||t.inode!==r.inode||t.modified!==r.modified||!t.content.equals(r.content)))throw new Error(`\u6587\u4EF6\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316\uFF0C\u672A\u8986\u76D6\u65B0\u5185\u5BB9\uFF0C\u8BF7\u91CD\u8BD5\uFF1A${e}`)}function nt(e){let{agent:r}=e,t=e.scope??"user";if(!["codex","claude-code","agents"].includes(r))throw new Error("Skill \u5B89\u88C5\u9700\u8981 --agent codex\u3001claude-code \u6216 agents");if(!["user","project"].includes(t))throw new Error("--scope \u53EA\u652F\u6301 user \u6216 project");if(e.directory!==void 0&&t!=="project")throw new Error("--dir \u53EA\u9002\u7528\u4E8E --scope project\uFF0C\u8868\u793A\u9879\u76EE\u6839\u76EE\u5F55");let o=t==="user"?Mn():Jn(e.directory??"."),n=I.lstatSync(o,{throwIfNoEntry:!1});if(!n?.isDirectory()||n.isSymbolicLink())throw new Error(`\u5B89\u88C5\u6839\u76EE\u5F55\u5FC5\u987B\u662F\u5DF2\u5B58\u5728\u7684\u666E\u901A\u76EE\u5F55\uFF0C\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\uFF1A${o}`);let i=I.realpathSync(o),s=r==="claude-code"?".claude":".agents",c=[s,"skills","aut"],a=[],f=i;for(let g of["",...c]){g&&(f=z(f,g)),I.lstatSync(f,{throwIfNoEntry:!1})||I.mkdirSync(f);let N=I.lstatSync(f);if(N.isSymbolicLink()||!N.isDirectory())throw new Error(`Skill \u8DEF\u5F84\u5FC5\u987B\u662F\u666E\u901A\u76EE\u5F55\uFF0C\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\uFF1A${f}`);a.push({path:f,device:N.dev,inode:N.ino})}function m(){for(let g of a){let k=I.lstatSync(g.path,{throwIfNoEntry:!1});if(!k?.isDirectory()||k.isSymbolicLink()||k.dev!==g.device||k.ino!==g.inode)throw new Error(`Skill \u76EE\u5F55\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u8BD5\uFF1A${g.path}`)}}let l=z(f,"SKILL.md"),p=z(f,Ir),v=z(f,".aut-install.lock");m();let h;try{h=I.openSync(v,"wx",384)}catch(g){throw g.code==="EEXIST"?new Error(`\u53E6\u4E00\u6B21 Skill \u5B89\u88C5\u5C1A\u672A\u7ED3\u675F\uFF1B\u5982\u4E0A\u6B21\u5B89\u88C5\u5DF2\u4E2D\u65AD\uFF0C\u8BF7\u786E\u8BA4\u540E\u79FB\u9664\uFF1A${v}`):g}I.closeSync(h);let d=[],b,u=!1,_=[];try{let G=function(R,L){let q=R+"."+xt(9)+".tmp";d.push(q);try{I.writeFileSync(q,L,{flag:"wx",mode:420})}catch(Z){throw Z.code==="EEXIST"&&d.pop(),Z}return q},ot=function(R,L,q){q?I.renameSync(R,L):I.linkSync(R,L)};var E=G,w=ot;let g=De(l),k=De(p),N=rt(),C=Nt(N),y=/<!-- aut-skill-version: ([A-Za-z0-9.+-]+) -->/.exec(N)?.[1];if(!y)throw new Error("\u968F CLI \u5206\u53D1\u7684 Agent Utopia Skill \u7F3A\u5C11\u7248\u672C\u4FE1\u606F");let S=g?.content.equals(Buffer.from(N))??!1,x=g?Nt(g.content):void 0,T=x&&Tr.has(x);if(g&&!S&&!T)throw new Error(`\u5DF2\u6709\u81EA\u5B9A\u4E49\u6216\u65E0\u6CD5\u9A8C\u8BC1\u7684 Skill\uFF0C\u5DF2\u4FDD\u7559\u539F\u6587\u4EF6\uFF1A${l}
6
+ \u8BF7\u5148\u4EBA\u5DE5\u6838\u5BF9\u5E76\u5907\u4EFD\u79FB\u8D70\uFF1B--force \u4E5F\u4E0D\u4F1A\u8986\u76D6\u81EA\u5B9A\u4E49\u5185\u5BB9\u3002`);let O=[];for(let R of["amb","amb-team","amb-solo"]){let L=z(i,s,"skills",R),q=I.lstatSync(L,{throwIfNoEntry:!1});if(!q)continue;if(!q.isDirectory()||q.isSymbolicLink())throw new Error(`\u65E7 Skill \u8DEF\u5F84\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\u6216\u6587\u4EF6\uFF1A${L}`);let Z=z(L,"SKILL.md"),de=De(Z);if(!de||!Tr.has(Nt(de.content)))throw new Error(`\u65E7 Skill \u5DF2\u6709\u81EA\u5B9A\u4E49\u6216\u672A\u77E5\u5185\u5BB9\uFF0C\u8BF7\u5148\u4EBA\u5DE5\u6838\u5BF9\uFF0C\u907F\u514D\u540C\u65F6\u52A0\u8F7D\u4E24\u4E2A\u7248\u672C\uFF1A${L}`);let ke=new Map;for(let Q of I.readdirSync(L)){if(Q!=="SKILL.md"&&Q!==Ir&&Q!==".amb-install.json"&&!/^SKILL\.md\.bak-[A-Za-z0-9._-]+$/.test(Q))throw new Error(`\u65E7 Skill \u76EE\u5F55\u6709\u989D\u5916\u6587\u4EF6\u6216\u5B89\u88C5\u9501\uFF0C\u8BF7\u5148\u4EBA\u5DE5\u6838\u5BF9\uFF1A${L}`);let Pe=De(z(L,Q));if(!Pe)throw new Error("\u65E7 Skill \u6587\u4EF6\u5728\u68C0\u67E5\u65F6\u6D88\u5931\uFF0C\u8BF7\u91CD\u8BD5");ke.set(Q,Pe)}O.push({directory:L,file:Z,snapshot:de,device:q.dev,inode:q.ino,files:ke})}let U=z(i,s,"amb-skill-backups"),F=I.lstatSync(U,{throwIfNoEntry:!1});if(F&&(!F.isDirectory()||F.isSymbolicLink()))throw new Error("Skill \u5907\u4EFD\u76EE\u5F55\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\u6216\u6587\u4EF6");let V=JSON.stringify({version:1,sha256:C,skill_version:y,cli_version:ee},null,2)+`
7
+ `,be=k?.content.toString("utf8")!==V,It=S?void 0:G(l,N),Tt=be?G(p,V):void 0;if(m(),ce(l,g),ce(p,k),g&&!S){let R=l+".bak-"+new Date().toISOString().replaceAll(/[:.]/g,"-")+"-"+xt(6);if(I.writeFileSync(R,g.content,{flag:"wx",mode:384}),!I.readFileSync(R).equals(g.content))throw new Error(`Skill \u5907\u4EFD\u9A8C\u8BC1\u5931\u8D25\uFF1A${R}`);b=R}m(),ce(l,g),ce(p,k);for(let R of O){m();let L=I.lstatSync(R.directory,{throwIfNoEntry:!1});if(!L?.isDirectory()||L.isSymbolicLink()||L.dev!==R.device||L.ino!==R.inode)throw new Error("\u65E7 Skill \u76EE\u5F55\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316");ce(R.file,R.snapshot);let q=I.readdirSync(R.directory).sort();if(JSON.stringify(q)!==JSON.stringify([...R.files.keys()].sort()))throw new Error("\u65E7 Skill \u76EE\u5F55\u5185\u5BB9\u5728\u5B89\u88C5\u671F\u95F4\u53D1\u751F\u53D8\u5316");for(let[Q,Pe]of R.files)ce(z(R.directory,Q),Pe);I.existsSync(U)||I.mkdirSync(U);let Z=I.lstatSync(U);if(!Z.isDirectory()||Z.isSymbolicLink())throw new Error("Skill \u5907\u4EFD\u76EE\u5F55\u53D1\u751F\u53D8\u5316");let de=z(U,xt(12));I.mkdirSync(de,{mode:448});let ke=z(de,Gn(R.directory));I.renameSync(R.directory,ke),_.push({from:R.directory,backup:ke})}return m(),ce(l,g),It&&(ot(It,l,g),u=!0),Tt&&ot(Tt,p,k),{status:g?S?"up-to-date":"updated":"installed",agent:r,product:"agent-utopia",scope:t,directory:f,file:l,skill_version:y,cli_version:ee,...b?{backup:b}:{},..._.length?{migrated:_}:{},next:"\u65B0\u5F00\u4F1A\u8BDD\u540E\u52A0\u8F7D Agent Utopia Skill\u3002\u5347\u7EA7 aut-cli \u540E\u518D\u6B21\u8FD0\u884C\u76F8\u540C\u5B89\u88C5\u547D\u4EE4\u5373\u53EF\u66F4\u65B0\uFF1B\u9879\u76EE\u5185\u5DF2\u6709\u526F\u672C\u65F6\uFF0C\u53E6\u7528 --scope project --dir <\u9879\u76EE\u6839\u76EE\u5F55> \u66F4\u65B0\u3002"}}catch(g){if(!u)for(let N of[..._].reverse())I.lstatSync(N.from,{throwIfNoEntry:!1})||I.renameSync(N.backup,N.from);if(!b&&!u&&!_.length)throw g;let k=g instanceof Error?g.message:String(g);throw new Error(k+(b?`
8
+ \u539F Skill \u7684\u5B8C\u6574\u5907\u4EFD\uFF1A${b}`:"")+(_.length&&u?`
9
+ \u65E7 Skill \u76EE\u5F55\u5907\u4EFD\uFF1A${_.map(N=>N.backup).join(", ")}`:"")+(u?`
10
10
  \u65B0\u7684 Skill \u5DF2\u5199\u5165\uFF0C\u5B89\u88C5\u8BB0\u5F55\u5C1A\u672A\u5B8C\u6210\u3002\u8BF7\u518D\u6B21\u8FD0\u884C\u76F8\u540C\u547D\u4EE4\u4FEE\u590D\u5B89\u88C5\u8BB0\u5F55\u3002`:`
11
- \u539F Skill \u5C1A\u672A\u66FF\u6362\uFF0C\u8BF7\u89E3\u51B3\u4E0A\u8FF0\u95EE\u9898\u540E\u91CD\u8BD5\u3002`),{cause:g})}finally{m();for(let g of d)I.rmSync(g,{force:!0});I.unlinkSync(v)}}var kt,Sr,vr,Et,bt=se(()=>{"use strict";yt();Oe();kt=(e=32)=>Bn(e).toString("base64url"),Sr=".aut-install.json",vr=new Set(["2d87c85263a566031506a6210cce412c664dbc95c04265df6330e4f89518face","028045d7db1fa9923e15480eebf897e3817b9bfb3b3532b9f080815340f22e16","a1ae7cb2e0abb898a53edcbbb447371c02078f64bb10a68cc106207be26216b8","d1fff3ba6231a0650949a25908feb1027e3ecb505ff56336ddbe1f0604950072","2a11c37973d4bf0316446fb34eff7efa0b612711dac63e846884b089f4da5d54","cd0d9742c70afbc0a114595a577a265185e330f6ba55b9d850429dedf42f26b1","f1a71e248a80699f61f80335e234e3a4c71aba2532a79f078f965bdcdd0aea56","c88a8c86efad9d8a955fd10b96b1ca9701711fe2f5a082577586bac6e8c98d54","d1c0b6ab80cab8b84f2755032c8c0358c939c67b2d7b9875094e89d6bf774ff9","19047c4453610aaa295c2e13b1624be3816bd96fe971ff405d3a7c7d66bbc2a7"]),Et=e=>$n("sha256").update(e).digest("hex")});Oe();import{parseArgs as St}from"node:util";import{spawn as Tr}from"node:child_process";import{lstatSync as Ot,mkdtempSync as Or,readFileSync as Rr,realpathSync as J,rmSync as Ur}from"node:fs";import{tmpdir as Pr}from"node:os";import{delimiter as Dr,dirname as ye,isAbsolute as Re,join as M,resolve as jr}from"node:path";import{fileURLToPath as Lr}from"node:url";var Qe="https://registry.npmjs.org/";function Cr(e,r,t){return new Promise((n,o)=>{let i=Tr(e,r,{cwd:t.cwd,env:t.env,shell:!1,stdio:["ignore","pipe","pipe"],windowsHide:!0}),s="",c="",a,f,m=p=>{a??=p,i.kill(),f??=setTimeout(()=>i.kill("SIGKILL"),2e3),f.unref()},l=setTimeout(()=>m(new Error("\u5347\u7EA7\u547D\u4EE4\u8D85\u65F6\uFF0C\u672A\u80FD\u786E\u8BA4\u5B89\u88C5\u7ED3\u679C\uFF1B\u8BF7\u68C0\u67E5\u5F53\u524D\u5B89\u88C5\u7248\u672C\u3002")),t.timeoutMs);i.stdout.setEncoding("utf8"),i.stderr.setEncoding("utf8"),i.stdout.on("data",p=>{t.progress&&process.stderr.write(p),s+=p,s.length>2e6&&m(new Error("npm \u8F93\u51FA\u8FC7\u5927\uFF0C\u5DF2\u505C\u6B62\u5347\u7EA7\u3002"))}),i.stderr.on("data",p=>{t.progress&&process.stderr.write(p),c=(c+p).slice(-8e3)}),i.on("error",p=>{a=p}),i.on("close",(p,v)=>{clearTimeout(l),f&&clearTimeout(f),a?o(a):n({stdout:s,stderr:c,status:p,signal:v})})})}function et(e){if(!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(e))return;let r=e.split(".").map(Number);if(r.every(Number.isSafeInteger))return r}function Pt(e,r){for(let t=0;t<3;t++)if(e[t]!==r[t])return e[t]-r[t];return 0}function $r(e,r){if(!e||e==="*")return!0;let t=/^>=\s*(\d+)(?:\.(\d+))?(?:\.(\d+))?$/.exec(e.trim()),n=et(r);if(!t||!n)return null;let o=[Number(t[1]),Number(t[2]||0),Number(t[3]||0)];return o.every(Number.isSafeInteger)?Pt(n,o)>=0:null}function _e(e){return JSON.parse(Rr(M(e,"package.json"),"utf8"))}function Br(e){let r=ye(J(Lr(e)));for(;;){try{return{directory:r,manifest:_e(r)}}catch(n){if(n.code!=="ENOENT")throw n}let t=ye(r);if(t===r)throw new Error("\u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u5B89\u88C5\u6765\u6E90\uFF0C\u8BF7\u901A\u8FC7\u539F\u5B89\u88C5\u65B9\u5F0F\u66F4\u65B0\u3002");r=t}}function qr(e){let r=ye(e.nodePath),t=[e.env.npm_execpath,M(r,"node_modules/npm/bin/npm-cli.js"),M(r,"../lib/node_modules/npm/bin/npm-cli.js"),...String(e.env.PATH||e.env.Path||"").split(Dr).filter(n=>n&&Re(n)).flatMap(n=>[M(n,"npm"),M(n,"node_modules/npm/bin/npm-cli.js"),M(n,"../lib/node_modules/npm/bin/npm-cli.js")])];for(let n of t)if(!(!n||!Re(n)))try{let o=J(n),i=ye(ye(o)),s=_e(i),c=s.bin;if(s.name==="npm"&&c?.npm==="bin/npm-cli.js"&&o===J(M(i,"bin/npm-cli.js")))return o}catch{}throw new Error("\u672A\u627E\u5230\u53EF\u9A8C\u8BC1\u7684 npm CLI\u3002\u8BF7\u5B89\u88C5\u4E0E\u5F53\u524D Node.js \u914D\u5957\u7684 npm\uFF0C\u518D\u8FD0\u884C\u5347\u7EA7\u547D\u4EE4\u3002")}function Rt(e){let r=e.trim();if(!Re(r)||/[\r\n\0]/.test(r))throw new Error("npm \u8FD4\u56DE\u4E86\u65E0\u6CD5\u8BC6\u522B\u7684\u5168\u5C40\u5B89\u88C5\u8DEF\u5F84\uFF0C\u672A\u6267\u884C\u5B89\u88C5\u3002");return r}function Ut(e,r){let n=r.bin,o=typeof n=="string"?n:n?.["aut"];if(typeof o!="string"||Re(o))throw new Error("\u5B89\u88C5\u5305\u672A\u58F0\u660E\u6709\u6548\u7684\u547D\u4EE4\u5165\u53E3\uFF0C\u672A\u80FD\u786E\u8BA4\u5B89\u88C5\u7ED3\u679C\u3002");let i=J(jr(e,o)),s=J(e);if(!i.startsWith(s+(process.platform==="win32"?"\\":"/")))throw new Error("\u5B89\u88C5\u5305\u547D\u4EE4\u5165\u53E3\u4E0D\u5728\u5305\u76EE\u5F55\u5185\uFF0C\u672A\u80FD\u786E\u8BA4\u5B89\u88C5\u7ED3\u679C\u3002");return i}function zr(e={}){let r={fetch:globalThis.fetch.bind(globalThis),run:Cr,nodePath:process.execPath,nodeVersion:process.versions.node,env:process.env,...e};return async function(n){let{packageName:o,currentVersion:i,check:s}=n;if(o!=="aut-cli")throw new Error("\u4E0D\u652F\u6301\u66F4\u65B0\u6B64\u8F6F\u4EF6\u5305\u3002");let c;try{let w=await r.fetch(Qe+o+"/latest",{headers:{Accept:"application/json","Cache-Control":"no-cache"},cache:"no-store",redirect:"error",signal:AbortSignal.timeout(2e4)});if(!w.ok)throw new Error(`HTTP ${w.status}`);c=await w.json()}catch(w){throw new Error("\u65E0\u6CD5\u4ECE\u5B98\u65B9 npm \u67E5\u8BE2\u6700\u65B0\u7248\u672C\uFF0C\u672A\u6267\u884C\u5B89\u88C5\uFF1A"+(w instanceof Error?w.message:String(w)))}let a=c?.version,f=typeof a=="string"?et(a):void 0;if(c?.name!==o||!f||typeof a!="string")throw new Error("\u5B98\u65B9 npm \u672A\u8FD4\u56DE\u6709\u6548\u7684\u7A33\u5B9A\u7248\u672C\uFF0C\u672A\u6267\u884C\u5B89\u88C5\u3002");let m=c.engines,l=typeof m?.node=="string"?m.node:void 0;if(m?.node!==void 0&&!l)throw new Error("\u5B98\u65B9 npm \u8FD4\u56DE\u4E86\u65E0\u6CD5\u8BC6\u522B\u7684 Node.js \u8981\u6C42\uFF0C\u672A\u6267\u884C\u5B89\u88C5\u3002");let p=et(i),v=p?Pt(p,f):void 0,h={package:o,current_version:i,latest_version:a,status:v===void 0?"development-version":v===0?"up-to-date":v>0?"newer-installed":"available",registry:Qe,...l?{node_requirement:l}:{},node_compatible:$r(l,r.nodeVersion)};if(s||h.status!=="available")return h;if(h.node_compatible!==!0)throw new Error(h.node_compatible===!1?`${o}@${a} \u9700\u8981 Node.js ${l}\uFF0C\u5F53\u524D\u4E3A ${r.nodeVersion}\u3002\u8BF7\u5148\u5347\u7EA7 Node.js\uFF1B\u672A\u6267\u884C\u5B89\u88C5\u3002`:`\u65E0\u6CD5\u5B89\u5168\u68C0\u67E5 Node.js \u8981\u6C42 ${l}\uFF0C\u8BF7\u901A\u8FC7 npm \u624B\u52A8\u66F4\u65B0\uFF1B\u672A\u6267\u884C\u5B89\u88C5\u3002`);let d=Br(n.moduleUrl);if(d.manifest.name!==o)throw new Error("\u5F53\u524D\u4ECE\u6E90\u7801\u6216\u5176\u4ED6\u8F6F\u4EF6\u5305\u8FD0\u884C\uFF0C\u81EA\u5347\u7EA7\u4EC5\u652F\u6301 npm \u5168\u5C40\u5B89\u88C5\uFF1B\u8BF7\u901A\u8FC7\u539F\u5B89\u88C5\u65B9\u5F0F\u66F4\u65B0\u3002");if(d.manifest.version!==i)throw new Error("\u5F53\u524D\u8FDB\u7A0B\u7248\u672C\u4E0E\u5B89\u88C5\u76EE\u5F55\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C\u547D\u4EE4\uFF1B\u672A\u6267\u884C\u5B89\u88C5\u3002");let _=qr(r),u=Or(M(Pr(),"amb-self-update-")),y=Object.fromEntries(Object.entries(r.env).filter(([w])=>!w.startsWith("AMB_")&&!w.startsWith("AUT_"))),E=async(w,g=!1,b=3e4)=>{let N=await r.run(r.nodePath,[_,...w],{cwd:u,env:y,timeoutMs:b,progress:g});if(N.status!==0)throw new Error(`npm ${g?"\u5B89\u88C5\u672A\u5B8C\u6210\uFF0C\u53EF\u80FD\u5DF2\u90E8\u5206\u4FEE\u6539\u5B89\u88C5\u76EE\u5F55\uFF0C\u8BF7\u68C0\u67E5\u5F53\u524D\u7248\u672C":"\u547D\u4EE4\u5931\u8D25\uFF0C\u672A\u6267\u884C\u5B89\u88C5"}\uFF08${N.signal||N.status||"\u672A\u77E5\u72B6\u6001"}\uFF09\u3002`+(N.stderr.trim()?`
12
- `+N.stderr.trim().slice(-2e3):""));return N.stdout};try{let w=Rt(await E(["prefix","--global"])),g=Rt(await E(["root","--global",`--prefix=${w}`])),b=M(g,o),N=()=>{let S=!1;try{let x=Ot(b);S=!x.isSymbolicLink()&&x.isDirectory()&&J(b)===J(d.directory)&&_e(b).name===o&&_e(b).version===i}catch{}if(!S)throw new Error(`\u5F53\u524D\u547D\u4EE4\u4E0D\u662F\u6B64 npm \u7684\u666E\u901A\u5168\u5C40\u5B89\u88C5\uFF08\u53EF\u80FD\u6765\u81EA\u6E90\u7801\u3001npm link\u3001npx\u3001\u672C\u5730\u4F9D\u8D56\u6216\u5176\u4ED6 prefix\uFF09\uFF0C\u672A\u6267\u884C\u5B89\u88C5\u3002
11
+ \u539F Skill \u5C1A\u672A\u66FF\u6362\uFF0C\u8BF7\u89E3\u51B3\u4E0A\u8FF0\u95EE\u9898\u540E\u91CD\u8BD5\u3002`),{cause:g})}finally{m();for(let g of d)I.rmSync(g,{force:!0});I.unlinkSync(v)}}function Yn(e={}){let r=["agents","claude-code"].map(o=>{try{return nt({...e,agent:o})}catch(n){return{agent:o,status:"failed",error:n instanceof Error?n.message:String(n)}}}),t=r.filter(o=>o.status==="failed").length;return{status:t===r.length?"failed":t?"partial":"succeeded",results:r}}var xt,Ir,Tr,Nt,vt=ue(()=>{"use strict";St();je();xt=(e=32)=>Fn(e).toString("base64url"),Ir=".aut-install.json",Tr=new Set(["85f1534df5aa1e4011090ca9ad508e1711aadeb7d14ce20d96a00606a270073e","2d703245fbd29d897ed2ad3b120a4b24d0b19724de995ad6cebe285928b73a88","2d87c85263a566031506a6210cce412c664dbc95c04265df6330e4f89518face","028045d7db1fa9923e15480eebf897e3817b9bfb3b3532b9f080815340f22e16","a1ae7cb2e0abb898a53edcbbb447371c02078f64bb10a68cc106207be26216b8","d1fff3ba6231a0650949a25908feb1027e3ecb505ff56336ddbe1f0604950072","2a11c37973d4bf0316446fb34eff7efa0b612711dac63e846884b089f4da5d54","cd0d9742c70afbc0a114595a577a265185e330f6ba55b9d850429dedf42f26b1","f1a71e248a80699f61f80335e234e3a4c71aba2532a79f078f965bdcdd0aea56","c88a8c86efad9d8a955fd10b96b1ca9701711fe2f5a082577586bac6e8c98d54","d1c0b6ab80cab8b84f2755032c8c0358c939c67b2d7b9875094e89d6bf774ff9","19047c4453610aaa295c2e13b1624be3816bd96fe971ff405d3a7c7d66bbc2a7"]),Nt=e=>zn("sha256").update(e).digest("hex")});je();import{parseArgs as At}from"node:util";import{spawn as Ur}from"node:child_process";import{lstatSync as Ut,mkdtempSync as Pr,readFileSync as jr,realpathSync as K,rmSync as Lr}from"node:fs";import{tmpdir as Cr}from"node:os";import{delimiter as $r,dirname as Ee,isAbsolute as Le,join as Y,resolve as Br}from"node:path";import{fileURLToPath as qr}from"node:url";var it="https://registry.npmjs.org/";function zr(e,r,t){return new Promise((o,n)=>{let i=Ur(e,r,{cwd:t.cwd,env:t.env,shell:!1,stdio:["ignore","pipe","pipe"],windowsHide:!0}),s="",c="",a,f,m=p=>{a??=p,i.kill(),f??=setTimeout(()=>i.kill("SIGKILL"),2e3),f.unref()},l=setTimeout(()=>m(new Error("\u5347\u7EA7\u547D\u4EE4\u8D85\u65F6\uFF0C\u672A\u80FD\u786E\u8BA4\u5B89\u88C5\u7ED3\u679C\uFF1B\u8BF7\u68C0\u67E5\u5F53\u524D\u5B89\u88C5\u7248\u672C\u3002")),t.timeoutMs);i.stdout.setEncoding("utf8"),i.stderr.setEncoding("utf8"),i.stdout.on("data",p=>{t.progress&&process.stderr.write(p),s+=p,s.length>2e6&&m(new Error("npm \u8F93\u51FA\u8FC7\u5927\uFF0C\u5DF2\u505C\u6B62\u5347\u7EA7\u3002"))}),i.stderr.on("data",p=>{t.progress&&process.stderr.write(p),c=(c+p).slice(-8e3)}),i.on("error",p=>{a=p}),i.on("close",(p,v)=>{clearTimeout(l),f&&clearTimeout(f),a?n(a):o({stdout:s,stderr:c,status:p,signal:v})})})}function st(e){if(!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(e))return;let r=e.split(".").map(Number);if(r.every(Number.isSafeInteger))return r}function Lt(e,r){for(let t=0;t<3;t++)if(e[t]!==r[t])return e[t]-r[t];return 0}function Fr(e,r){if(!e||e==="*")return!0;let t=/^>=\s*(\d+)(?:\.(\d+))?(?:\.(\d+))?$/.exec(e.trim()),o=st(r);if(!t||!o)return null;let n=[Number(t[1]),Number(t[2]||0),Number(t[3]||0)];return n.every(Number.isSafeInteger)?Lt(o,n)>=0:null}function Se(e){return JSON.parse(jr(Y(e,"package.json"),"utf8"))}function Mr(e){let r=Ee(K(qr(e)));for(;;){try{return{directory:r,manifest:Se(r)}}catch(o){if(o.code!=="ENOENT")throw o}let t=Ee(r);if(t===r)throw new Error("\u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u5B89\u88C5\u6765\u6E90\uFF0C\u8BF7\u901A\u8FC7\u539F\u5B89\u88C5\u65B9\u5F0F\u66F4\u65B0\u3002");r=t}}function Jr(e){let r=Ee(e.nodePath),t=[e.env.npm_execpath,Y(r,"node_modules/npm/bin/npm-cli.js"),Y(r,"../lib/node_modules/npm/bin/npm-cli.js"),...String(e.env.PATH||e.env.Path||"").split($r).filter(o=>o&&Le(o)).flatMap(o=>[Y(o,"npm"),Y(o,"node_modules/npm/bin/npm-cli.js"),Y(o,"../lib/node_modules/npm/bin/npm-cli.js")])];for(let o of t)if(!(!o||!Le(o)))try{let n=K(o),i=Ee(Ee(n)),s=Se(i),c=s.bin;if(s.name==="npm"&&c?.npm==="bin/npm-cli.js"&&n===K(Y(i,"bin/npm-cli.js")))return n}catch{}throw new Error("\u672A\u627E\u5230\u53EF\u9A8C\u8BC1\u7684 npm CLI\u3002\u8BF7\u5B89\u88C5\u4E0E\u5F53\u524D Node.js \u914D\u5957\u7684 npm\uFF0C\u518D\u8FD0\u884C\u5347\u7EA7\u547D\u4EE4\u3002")}function Pt(e){let r=e.trim();if(!Le(r)||/[\r\n\0]/.test(r))throw new Error("npm \u8FD4\u56DE\u4E86\u65E0\u6CD5\u8BC6\u522B\u7684\u5168\u5C40\u5B89\u88C5\u8DEF\u5F84\uFF0C\u672A\u6267\u884C\u5B89\u88C5\u3002");return r}function jt(e,r){let o=r.bin,n=typeof o=="string"?o:o?.["aut"];if(typeof n!="string"||Le(n))throw new Error("\u5B89\u88C5\u5305\u672A\u58F0\u660E\u6709\u6548\u7684\u547D\u4EE4\u5165\u53E3\uFF0C\u672A\u80FD\u786E\u8BA4\u5B89\u88C5\u7ED3\u679C\u3002");let i=K(Br(e,n)),s=K(e);if(!i.startsWith(s+(process.platform==="win32"?"\\":"/")))throw new Error("\u5B89\u88C5\u5305\u547D\u4EE4\u5165\u53E3\u4E0D\u5728\u5305\u76EE\u5F55\u5185\uFF0C\u672A\u80FD\u786E\u8BA4\u5B89\u88C5\u7ED3\u679C\u3002");return i}function Gr(e={}){let r={fetch:globalThis.fetch.bind(globalThis),run:zr,nodePath:process.execPath,nodeVersion:process.versions.node,env:process.env,...e};return async function(o){let{packageName:n,currentVersion:i,check:s}=o;if(n!=="aut-cli")throw new Error("\u4E0D\u652F\u6301\u66F4\u65B0\u6B64\u8F6F\u4EF6\u5305\u3002");let c;try{let w=await r.fetch(it+n+"/latest",{headers:{Accept:"application/json","Cache-Control":"no-cache"},cache:"no-store",redirect:"error",signal:AbortSignal.timeout(2e4)});if(!w.ok)throw new Error(`HTTP ${w.status}`);c=await w.json()}catch(w){throw new Error("\u65E0\u6CD5\u4ECE\u5B98\u65B9 npm \u67E5\u8BE2\u6700\u65B0\u7248\u672C\uFF0C\u672A\u6267\u884C\u5B89\u88C5\uFF1A"+(w instanceof Error?w.message:String(w)))}let a=c?.version,f=typeof a=="string"?st(a):void 0;if(c?.name!==n||!f||typeof a!="string")throw new Error("\u5B98\u65B9 npm \u672A\u8FD4\u56DE\u6709\u6548\u7684\u7A33\u5B9A\u7248\u672C\uFF0C\u672A\u6267\u884C\u5B89\u88C5\u3002");let m=c.engines,l=typeof m?.node=="string"?m.node:void 0;if(m?.node!==void 0&&!l)throw new Error("\u5B98\u65B9 npm \u8FD4\u56DE\u4E86\u65E0\u6CD5\u8BC6\u522B\u7684 Node.js \u8981\u6C42\uFF0C\u672A\u6267\u884C\u5B89\u88C5\u3002");let p=st(i),v=p?Lt(p,f):void 0,h={package:n,current_version:i,latest_version:a,status:v===void 0?"development-version":v===0?"up-to-date":v>0?"newer-installed":"available",registry:it,...l?{node_requirement:l}:{},node_compatible:Fr(l,r.nodeVersion)};if(s||h.status!=="available")return h;if(h.node_compatible!==!0)throw new Error(h.node_compatible===!1?`${n}@${a} \u9700\u8981 Node.js ${l}\uFF0C\u5F53\u524D\u4E3A ${r.nodeVersion}\u3002\u8BF7\u5148\u5347\u7EA7 Node.js\uFF1B\u672A\u6267\u884C\u5B89\u88C5\u3002`:`\u65E0\u6CD5\u5B89\u5168\u68C0\u67E5 Node.js \u8981\u6C42 ${l}\uFF0C\u8BF7\u901A\u8FC7 npm \u624B\u52A8\u66F4\u65B0\uFF1B\u672A\u6267\u884C\u5B89\u88C5\u3002`);let d=Mr(o.moduleUrl);if(d.manifest.name!==n)throw new Error("\u5F53\u524D\u4ECE\u6E90\u7801\u6216\u5176\u4ED6\u8F6F\u4EF6\u5305\u8FD0\u884C\uFF0C\u81EA\u5347\u7EA7\u4EC5\u652F\u6301 npm \u5168\u5C40\u5B89\u88C5\uFF1B\u8BF7\u901A\u8FC7\u539F\u5B89\u88C5\u65B9\u5F0F\u66F4\u65B0\u3002");if(d.manifest.version!==i)throw new Error("\u5F53\u524D\u8FDB\u7A0B\u7248\u672C\u4E0E\u5B89\u88C5\u76EE\u5F55\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C\u547D\u4EE4\uFF1B\u672A\u6267\u884C\u5B89\u88C5\u3002");let b=Jr(r),u=Pr(Y(Cr(),"amb-self-update-")),_=Object.fromEntries(Object.entries(r.env).filter(([w])=>!w.startsWith("AMB_")&&!w.startsWith("AUT_"))),E=async(w,g=!1,k=3e4)=>{let N=await r.run(r.nodePath,[b,...w],{cwd:u,env:_,timeoutMs:k,progress:g});if(N.status!==0)throw new Error(`npm ${g?"\u5B89\u88C5\u672A\u5B8C\u6210\uFF0C\u53EF\u80FD\u5DF2\u90E8\u5206\u4FEE\u6539\u5B89\u88C5\u76EE\u5F55\uFF0C\u8BF7\u68C0\u67E5\u5F53\u524D\u7248\u672C":"\u547D\u4EE4\u5931\u8D25\uFF0C\u672A\u6267\u884C\u5B89\u88C5"}\uFF08${N.signal||N.status||"\u672A\u77E5\u72B6\u6001"}\uFF09\u3002`+(N.stderr.trim()?`
12
+ `+N.stderr.trim().slice(-2e3):""));return N.stdout};try{let w=Pt(await E(["prefix","--global"])),g=Pt(await E(["root","--global",`--prefix=${w}`])),k=Y(g,n),N=()=>{let S=!1;try{let x=Ut(k);S=!x.isSymbolicLink()&&x.isDirectory()&&K(k)===K(d.directory)&&Se(k).name===n&&Se(k).version===i}catch{}if(!S)throw new Error(`\u5F53\u524D\u547D\u4EE4\u4E0D\u662F\u6B64 npm \u7684\u666E\u901A\u5168\u5C40\u5B89\u88C5\uFF08\u53EF\u80FD\u6765\u81EA\u6E90\u7801\u3001npm link\u3001npx\u3001\u672C\u5730\u4F9D\u8D56\u6216\u5176\u4ED6 prefix\uFF09\uFF0C\u672A\u6267\u884C\u5B89\u88C5\u3002
13
13
  \u5F53\u524D\u5305\uFF1A${d.directory}
14
- npm \u5168\u5C40\u5305\uFF1A${b}`)};N(),Ut(b,d.manifest);let j=J(b);N(),await n.beforeInstall?.(),N(),await E(["install","--global",`${o}@${a}`,`--prefix=${w}`,`--registry=${Qe}`,"--prefer-online","--offline=false","--engine-strict","--force=false","--dry-run=false","--bin-links=true","--ignore-scripts","--no-audit","--no-fund"],!0,3e5);let k;try{let S=Ot(b);if(S.isSymbolicLink()||!S.isDirectory()||J(b)!==j)throw new Error("\u5B89\u88C5\u4F4D\u7F6E\u5DF2\u6539\u53D8");if(k=_e(b),k.name!==o||k.version!==a)throw new Error("\u7248\u672C\u4E0D\u7B26");let x=Ut(b,k),T=await r.run(r.nodePath,[x,"--version"],{cwd:u,env:y,timeoutMs:3e4});if(T.status!==0||T.stdout.trim()!==a)throw new Error("\u65B0\u547D\u4EE4\u7248\u672C\u68C0\u67E5\u5931\u8D25")}catch(S){throw new Error("npm \u5DF2\u7ED3\u675F\uFF0C\u4F46\u672A\u80FD\u786E\u8BA4\u65B0\u7248\u672C\u53EF\u7528\u3002\u8BF7\u68C0\u67E5\u5B89\u88C5\uFF0C\u4E0D\u8981\u5047\u5B9A\u5347\u7EA7\u6210\u529F\uFF1A"+(S instanceof Error?S.message:String(S)))}return{...h,status:"updated",installed_version:a,installed_path:b,restart_required:!1}}finally{Ur(u,{recursive:!0,force:!0})}}}var Dt=zr();function jt(e){let r=`${e.package} ${e.current_version}`;return e.status==="up-to-date"?`${r} \u5DF2\u662F\u5B98\u65B9 npm \u6700\u65B0\u7A33\u5B9A\u7248\u672C\u3002`:e.status==="newer-installed"?`${r} \u9AD8\u4E8E\u5B98\u65B9 npm \u6700\u65B0\u7A33\u5B9A\u7248\u672C ${e.latest_version}\uFF0C\u672A\u6267\u884C\u964D\u7EA7\u3002`:e.status==="development-version"?`${r} \u662F\u5F00\u53D1\u6216\u9884\u53D1\u884C\u7248\u672C\uFF0C\u672A\u81EA\u52A8\u66FF\u6362\u3002\u5B98\u65B9 npm \u6700\u65B0\u7A33\u5B9A\u7248\u672C\uFF1A${e.latest_version}\u3002`:e.status==="updated"?`\u5DF2\u66F4\u65B0 ${e.package} \u7684\u5B89\u88C5\u7248\u672C\uFF1A${e.current_version} \u2192 ${e.installed_version}\u3002
14
+ npm \u5168\u5C40\u5305\uFF1A${k}`)};N(),jt(k,d.manifest);let C=K(k);N(),await o.beforeInstall?.(),N(),await E(["install","--global",`${n}@${a}`,`--prefix=${w}`,`--registry=${it}`,"--prefer-online","--offline=false","--engine-strict","--force=false","--dry-run=false","--bin-links=true","--ignore-scripts","--no-audit","--no-fund"],!0,3e5);let y;try{let S=Ut(k);if(S.isSymbolicLink()||!S.isDirectory()||K(k)!==C)throw new Error("\u5B89\u88C5\u4F4D\u7F6E\u5DF2\u6539\u53D8");if(y=Se(k),y.name!==n||y.version!==a)throw new Error("\u7248\u672C\u4E0D\u7B26");let x=jt(k,y),T=await r.run(r.nodePath,[x,"--version"],{cwd:u,env:_,timeoutMs:3e4});if(T.status!==0||T.stdout.trim()!==a)throw new Error("\u65B0\u547D\u4EE4\u7248\u672C\u68C0\u67E5\u5931\u8D25")}catch(S){throw new Error("npm \u5DF2\u7ED3\u675F\uFF0C\u4F46\u672A\u80FD\u786E\u8BA4\u65B0\u7248\u672C\u53EF\u7528\u3002\u8BF7\u68C0\u67E5\u5B89\u88C5\uFF0C\u4E0D\u8981\u5047\u5B9A\u5347\u7EA7\u6210\u529F\uFF1A"+(S instanceof Error?S.message:String(S)))}return{...h,status:"updated",installed_version:a,installed_path:k,restart_required:!1}}finally{Lr(u,{recursive:!0,force:!0})}}}var Ct=Gr();function $t(e){let r=`${e.package} ${e.current_version}`;return e.status==="up-to-date"?`${r} \u5DF2\u662F\u5B98\u65B9 npm \u6700\u65B0\u7A33\u5B9A\u7248\u672C\u3002`:e.status==="newer-installed"?`${r} \u9AD8\u4E8E\u5B98\u65B9 npm \u6700\u65B0\u7A33\u5B9A\u7248\u672C ${e.latest_version}\uFF0C\u672A\u6267\u884C\u964D\u7EA7\u3002`:e.status==="development-version"?`${r} \u662F\u5F00\u53D1\u6216\u9884\u53D1\u884C\u7248\u672C\uFF0C\u672A\u81EA\u52A8\u66FF\u6362\u3002\u5B98\u65B9 npm \u6700\u65B0\u7A33\u5B9A\u7248\u672C\uFF1A${e.latest_version}\u3002`:e.status==="updated"?`\u5DF2\u66F4\u65B0 ${e.package} \u7684\u5B89\u88C5\u7248\u672C\uFF1A${e.current_version} \u2192 ${e.installed_version}\u3002
15
15
  \u4E0B\u6B21\u8FD0\u884C aut \u5373\u4F7F\u7528\u65B0\u7248\u672C\u3002`:`${r} \u53EF\u66F4\u65B0\u81F3 ${e.latest_version}\uFF08\u5B98\u65B9 npm\uFF09\u3002`+(e.node_compatible===!1?`
16
16
  \u9700\u8981\u5148\u5347\u7EA7 Node.js\uFF1A${e.node_requirement}\u3002`:e.node_compatible===null?`
17
17
  Node.js \u8981\u6C42\uFF1A${e.node_requirement}\uFF0C\u9700\u624B\u52A8\u68C0\u67E5\u540E\u901A\u8FC7 npm \u66F4\u65B0\u3002`:`
18
- \u8FD0\u884C aut self update \u5B89\u88C5\u66F4\u65B0\u3002`)}import{parseArgs as Nn}from"node:util";import{constants as tt,closeSync as Fr,fstatSync as Mr,lstatSync as Jr,openSync as Gr,readSync as Yr}from"node:fs";import{resolve as Kr}from"node:path";var be=1024*1024,rt=be,ae=2*be,Ue=4*be,nt=32*be,Lt=1024,G=class extends Error{constructor(t,n){super(`${t}: ${n}`);this.code=t}code};function ee(e,r,t="content_too_large"){throw new G(t,`${e}\u4E0D\u80FD\u8D85\u8FC7 ${r} \u5B57\u8282\uFF08${r/be} MiB\uFF09\uFF1B\u8BF7\u62C6\u5206\u5185\u5BB9\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u622A\u65AD`)}function Ct(e,r,t,n){let o=[],i=0;for(;;){let s=Buffer.allocUnsafe(Math.min(65536,r-i+1)),c;try{c=Yr(e,s,0,s.length,null)}catch(a){if(a.code==="EINTR")continue;throw a}if(!c)return Buffer.concat(o,i);i+=c,i>r&&ee(t,r,n),o.push(s.subarray(0,c))}}function Hr(e,r,t="\u6587\u4EF6",n="content_too_large"){let o=Kr(e),i=Jr(o);if(!i.isFile()||i.isSymbolicLink())throw new Error(`${t}\u5FC5\u987B\u662F\u666E\u901A\u6587\u4EF6\uFF0C\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\u6216\u7279\u6B8A\u6587\u4EF6`);i.size>r&&ee(t,r,n);let s=Gr(o,tt.O_RDONLY|(tt.O_NOFOLLOW||0)|(tt.O_NONBLOCK||0));try{let c=Mr(s);if(!c.isFile()||c.dev!==i.dev||c.ino!==i.ino)throw new Error(`${t}\u8BFB\u53D6\u524D\u5DF2\u6539\u53D8\u6216\u4E0D\u662F\u666E\u901A\u6587\u4EF6`);return c.size>r&&ee(t,r,n),Ct(s,r,t,n)}finally{Fr(s)}}function ke(e,r="\u6B63\u6587"){if(e.includes(0))throw new G("invalid_content_encoding",`${r}\u4E0D\u80FD\u5305\u542B NUL \u5B57\u8282\uFF0C\u8BF7\u4F7F\u7528 Markdown/HTML \u6587\u672C`);try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(e)}catch{throw new G("invalid_content_encoding",`${r}\u5FC5\u987B\u662F\u6709\u6548\u7684 UTF-8 \u6587\u672C`)}}function C(e,r=rt,t="\u6B63\u6587",n="content_too_large"){let o=e==="-"?Ct(0,r,t,n):Hr(e,r,t,n);return ke(o,t)}function Wr(e,r="\u6B63\u6587"){if(e.includes("\0"))throw new G("invalid_content_encoding",`${r}\u4E0D\u80FD\u5305\u542B NUL \u5B57\u8282\uFF0C\u8BF7\u4F7F\u7528 Markdown/HTML \u6587\u672C`);let t=Buffer.from(e,"utf8");if(t.toString("utf8")!==e)throw new G("invalid_content_encoding",`${r}\u5305\u542B\u65E0\u6548\u7684 Unicode \u5B57\u7B26`);t.length>rt&&ee(r,rt)}function $t(e,r){if(!r||typeof r!="object")return;let t=e.split("?")[0],n=r;if(/\/tracks\/[^/]+\/(content-commits|background-versions|handoffs)$/.test(t)){if(Buffer.byteLength(JSON.stringify(r))>256*1024)throw new G("manifest_too_large","\u5185\u5BB9\u6E05\u5355\u6700\u591A 256 KiB");let o=t.endsWith("/content-commits")?n.message?.text:n.body_text;if(o!==void 0){if(typeof o!="string")throw new Error("\u6B63\u6587\u5FC5\u987B\u662F\u6587\u672C");if(Wr(o),Buffer.byteLength(o)>64*1024)throw new G("content_too_large","\u77ED\u6B63\u6587\u6700\u591A 64 KiB\uFF1B\u8F83\u5927\u6B63\u6587\u8BF7\u5148\u4E0A\u4F20\u6587\u4EF6\u518D\u5F15\u7528")}}}function Bt(e){let r=JSON.stringify(e);if(r===void 0)throw new Error("\u8BF7\u6C42\u5FC5\u987B\u662F\u53EF\u7F16\u7801\u7684 JSON");return Buffer.byteLength(r,"utf8")>ae&&ee("\u7F16\u7801\u540E\u7684 JSON \u8BF7\u6C42",ae,"request_too_large"),r}async function Pe(e,r){let t=e.body?.getReader();if(!t)return Buffer.alloc(0);let n=[],o=0;try{let i=e.headers.get("content-length");for(!e.headers.has("content-encoding")&&i&&/^\d+$/.test(i)&&Number(i)>r&&ee("HTTP \u54CD\u5E94",r,"response_too_large");;){let{done:s,value:c}=await t.read();if(s)return Buffer.concat(n,o);o+=c.byteLength,o>r&&ee("HTTP \u54CD\u5E94",r,"response_too_large"),n.push(c)}}catch(i){try{await t.cancel()}catch{}throw i}finally{t.releaseLock()}}function ce(e){if(e===void 0)return Ue;let r=Number(e);if(!/^\d+$/.test(String(e))||!Number.isSafeInteger(r)||r<Lt||r>nt)throw new Error(`--max-bytes \u5FC5\u987B\u4E3A ${Lt}\u2013${nt} \u7684\u6574\u6570`);return r}function qt(e,r=!1){let t=new URL(e,"https://utopia.invalid");return/^\/api\/v1\/(?:tracks\/[^/]+\/(?:updates|context|records)|records(?:\/[^/]+\/versions)?)$/.test(t.pathname)?ce(t.searchParams.get("max_bytes")??void 0):r||/\/body$/.test(t.pathname)||/\/background(?:-versions\/[^/]+)?$/.test(t.pathname)?nt:Ue}V();V();Oe();V();import{createHash as Zr}from"node:crypto";var Qr=new Set(["text","material","content_json","context_json","snapshot_json","evidence_json","body_text","body","goal","content","snapshot","handoff","background","reason","facts_text","evidence","brief","context_text","acceptance_criteria","inputs","outputs"]);function it(e){return!e||typeof e!="object"?!1:Object.entries(e).some(([r,t])=>!(/(?:_url|_cursor)$/.test(r)||["url","cursor","token","content_object"].includes(r))&&(t!==null&&t!==""&&Qr.has(r)&&(typeof t=="string"||typeof t=="object")||typeof t=="string"&&Buffer.byteLength(t)>1024||it(t)))}function zt(e){return/^\/(?:api|web|staff)\/v1\/(?:task-access-grants|task-record-offers|access-requests|collaboration-resources|collaboration-assignments|collaboration-party-changes|collaboration-terminations|moderation|me|search|utopia|tracks|records|entries|boards|board-posts|content-shares|tasks|solutions|solution-versions|collaborations|deliveries|task-selections|support|content-reports|workspace)(?:\/|\?|$)/.test(e)}function Ft(e,r,t){if(typeof e!="string")throw new Error("\u65E0\u6548\u6B63\u6587\u4F20\u8F93\u5730\u5740");let n=new URL(e);if(n.protocol!=="https:"||n.username||n.password||n.port||n.hash||n.hostname===new URL(r).hostname||!n.hostname.includes(".")||/^[0-9.]+$/.test(n.hostname)||/[%\\]/.test(n.pathname)||t&&!n.pathname.includes("/released/content/"))throw new Error("\u6B63\u6587\u5FC5\u987B\u901A\u8FC7\u72EC\u7ACB OSS/CDN \u57DF\u540D\u4F20\u8F93");return n.href}var Mt=e=>Zr("sha256").update(e).digest("hex");async function Jt(e,r,t,n,o,i,s){let c=Buffer.from(n);if(c.length>512*1024)throw new Error("\u6B63\u6587\u8BF7\u6C42\u8D85\u8FC7 512 KiB");let a=await i({path:r,method:t,idempotency_key:o||"",size_bytes:c.length,sha256:Mt(c)}),f=a.upload;if(!f||f.method!=="PUT"||f.size_bytes!==c.length||typeof a.content_object!="string")throw new Error("\u65E0\u6548\u6B63\u6587\u4E0A\u4F20\u8BB8\u53EF");for(let l of Object.keys(f.headers||{}))if(!/^(content-length|content-type|cache-control|content-md5|x-oss-[a-z0-9-]+)$/i.test(l))throw new Error("\u65E0\u6548 OSS \u4E0A\u4F20\u8BF7\u6C42\u5934");let m=await fetch(Ft(f.url,e,!1),{method:"PUT",body:c,headers:f.headers,credentials:"omit",redirect:"error",signal:s});if(await m.body?.cancel(),!m.ok)throw new Error("OSS \u6B63\u6587\u76F4\u4F20\u5931\u8D25");return JSON.stringify({content_object:a.content_object})}async function Gt(e,r,t){if(!e||typeof e!="object"||e.transport!=="content_refs_v1")return e;let n=e,o=n.content;if(!o||o.transport!=="cdn"||o.method!=="GET"||!Number.isSafeInteger(o.size_bytes)||o.size_bytes<=0||o.size_bytes>16*1024*1024||!/^[a-f0-9]{64}$/.test(o.sha256))throw new Error("\u65E0\u6548\u6B63\u6587\u4E0B\u8F7D\u8BB8\u53EF");let i=await fetch(Ft(o.download_url,r,!0),{method:"GET",credentials:"omit",redirect:"error",signal:t});if(!i.ok)throw await i.body?.cancel(),new Error("CDN \u6B63\u6587\u4E0D\u53EF\u7528\uFF0C\u8BF7\u91CD\u65B0\u8BFB\u53D6\u4EE5\u68C0\u67E5\u5F53\u524D\u6743\u9650");let s=await Pe(i,o.size_bytes);if(s.length!==o.size_bytes||Mt(s)!==o.sha256)throw new Error("\u6B63\u6587\u5927\u5C0F\u6216 SHA-256 \u6821\u9A8C\u5931\u8D25");let c=Ce(ke(s,"CDN \u6B63\u6587"));if(!Array.isArray(c))throw new Error("\u65E0\u6548\u6B63\u6587\u8868\u793A");let a=(f,m=0)=>{if(m>64)throw new Error("\u6B63\u6587\u5D4C\u5957\u8FC7\u6DF1");if(!f||typeof f!="object")return f;let l=f;if(!Array.isArray(f)&&Object.keys(f).length===1&&Object.hasOwn(f,"$content_index")){let p=l.$content_index;if(typeof p!="number"||!Number.isSafeInteger(p)||p<0||p>=c.length)throw new Error("\u65E0\u6548\u6B63\u6587\u5F15\u7528");return c[p]}for(let p of Object.keys(f))Object.defineProperty(f,p,{value:a(l[p],m+1),writable:!0,enumerable:!0,configurable:!0});return f};return a(n.metadata)}import{randomUUID as Be,createHash as en}from"node:crypto";import{chmodSync as Ht,existsSync as K,linkSync as Yt,lstatSync as $e,mkdirSync as Wt,renameSync as tn,unlinkSync as ve,writeFileSync as Fe}from"node:fs";import{homedir as Kt,hostname as rn}from"node:os";import{dirname as F,join as Z}from"node:path";import{spawn as nn}from"node:child_process";import{setTimeout as on}from"node:timers/promises";var de=class extends Error{constructor(t,n,o=0,i,s={}){super(`Agent Utopia HTTP ${t}: ${n}${n==="response_too_large"?"\uFF1B\u51CF\u5C11\u5206\u9875\u6761\u6570\uFF0C\u6216\u5728 Track \u8BFB\u53D6\u65F6\u63D0\u9AD8 --max-bytes\uFF08\u6700\u591A 33554432\uFF09\uFF0C\u4E5F\u53EF\u5355\u72EC\u8BFB\u53D6\u5185\u5BB9":""}${o?`\uFF1BRetry-After: ${o} \u79D2`:""}${i!==void 0?`\uFF1Binbox_revision=${i}`:""}${Object.keys(s).length?"\uFF1B"+JSON.stringify(s):""}`);this.status=t;this.code=n;this.retryAfter=o;this.inboxRevision=i;this.recovery=s}status;code;retryAfter;inboxRevision;recovery};function pe(){let e=process.platform==="win32"?process.env.APPDATA||Z(Kt(),"AppData","Roaming"):process.env.XDG_CONFIG_HOME||Z(Kt(),".config"),r=Z(e,"aut","connection.json"),t=Z(e,"aut","team","connection.json");if(ue(r),!K(r)&&K(t)&&(ue(t),JSON.parse(C(t,32*1024,"\u8D26\u53F7\u914D\u7F6E"))?.version===2)){fe(t);try{Yt(t,r)}catch(s){if(s.code==="EEXIST")return r;throw s}ve(t);let o=Z(F(t),"device.json"),i=Z(F(r),"device.json");if(!K(i)&&K(o)){ue(o);let s=JSON.parse(C(o,1024,"\u8BBE\u5907\u6807\u8BC6"));if(s?.version===1&&typeof s.device_id=="string"&&/^[A-Za-z0-9_-]{16,128}$/.test(s.device_id))try{Yt(o,i)}catch(c){if(c.code!=="EEXIST")throw c}}}return r}function ue(e){if(K(F(e))&&$e(F(e)).isSymbolicLink())throw new Error("\u62D2\u7EDD\u4F7F\u7528\u7B26\u53F7\u94FE\u63A5 Agent Utopia \u914D\u7F6E\u76EE\u5F55");if(K(e)&&(!$e(e).isFile()||$e(e).isSymbolicLink()))throw new Error("\u62D2\u7EDD\u4F7F\u7528\u975E\u666E\u901A Agent Utopia \u914D\u7F6E\u6587\u4EF6")}function Ee(e){if(!e||/[\\\s]/.test(e))throw new Error("Agent Utopia URL \u65E0\u6548");let r=e.match(/^https?:\/\/[^/]+(\/[^?#]*)?/i)?.[1]||"";if(/%(?:2e|2f|5c)/i.test(r)||r.split("/").some(o=>o==="."||o===".."))throw new Error("Agent Utopia URL \u4E0D\u5141\u8BB8\u8DEF\u5F84\u8DF3\u8F6C");let t;try{t=new URL(e)}catch{throw new Error("Agent Utopia URL \u65E0\u6548")}if(t.username||t.password||t.search||t.hash)throw new Error("Agent Utopia URL \u4E0D\u80FD\u5305\u542B\u51ED\u636E\u3001\u67E5\u8BE2\u53C2\u6570\u6216\u7247\u6BB5");let n=["127.0.0.1","localhost","[::1]"].includes(t.hostname);if(t.protocol!=="https:"&&!(t.protocol==="http:"&&n))throw new Error("Agent Utopia \u8FDE\u63A5\u5FC5\u987B\u4F7F\u7528 HTTPS\uFF1B\u4EC5\u672C\u673A\u5F00\u53D1\u5141\u8BB8 HTTP");return t.origin+t.pathname.replace(/\/+$/,"")}function sn(e,r,t){if(!e&&(!r||!t))throw new Error("\u63D0\u4F9B\u7F51\u5173 URL\uFF0C\u6216\u540C\u65F6\u63D0\u4F9B --auth-url \u548C --platform-url");let n=e?Ee(e):"";return{auth_url:Ee(r||n+"/amb-auth"),platform_url:Ee(t||n+"/amb-platform")}}function Me(e,r=!0){if(!e.startsWith("/")||e.startsWith("//")||/[\\\s#]/.test(e))throw new Error("Agent Utopia API \u53EA\u63A5\u53D7\u5F53\u524D\u8FDE\u63A5\u7684\u76F8\u5BF9\u8DEF\u5F84");let t=e.split("?")[0];if(/%(?:2e|2f|5c|25)/i.test(t)||t.split("/").some(n=>n==="."||n===".."))throw new Error("Agent Utopia API \u8DEF\u5F84\u4E0D\u5141\u8BB8\u8DF3\u8F6C");if(r&&!t.startsWith("/api/v1/"))throw new Error("Agent Utopia API \u4EC5\u5141\u8BB8 /api/v1/ \u8DEF\u5F84");return e}function Se(e){if(typeof e!="string"||!e||e.length>8192||!/^[\x21-\x7e]+$/.test(e))throw new Error("Agent Utopia \u51ED\u8BC1\u65E0\u6548");return e}function fe(e=pe()){if(ue(e),!!K(e))try{let r=JSON.parse(C(e,32768,"\u8D26\u53F7\u914D\u7F6E"));if(r.version!==2||!r.connection_id||!["token","browser"].includes(r.auth)||Ee(r.auth_url)!==r.auth_url||Ee(r.platform_url)!==r.platform_url)throw new Error("invalid");if(Se(r.token),!je(r.token)||!U(r.account_id)||!U(r.credential_id)||"user_id"in r||"organization_id"in r||r.credential_kind!==(r.token.startsWith("aut_agent_")?"agent_pat":"account_session"))throw new Error("invalid");if(Y(r),process.platform!=="win32"&&$e(e).mode&63)throw new Error("permissions");return r}catch{throw new Error("Agent Utopia \u8FDE\u63A5\u914D\u7F6E\u65E0\u6548\u6216\u6743\u9650\u8FC7\u5BBD\uFF1B\u8BF7\u68C0\u67E5\u79C1\u6709\u914D\u7F6E\u540E\u91CD\u65B0\u8FDE\u63A5")}}function qe(e){return en("sha256").update(JSON.stringify(e)||"").digest("hex")}function Xt(e,r){ue(e),Wt(F(e),{recursive:!0,mode:448}),process.platform!=="win32"&&Ht(F(e),448);let t=e+".lock";try{Fe(t,String(process.pid),{flag:"wx",mode:384})}catch{throw new Error("Agent Utopia \u8FDE\u63A5\u914D\u7F6E\u6B63\u5728\u4FEE\u6539\uFF1B\u82E5\u6B64\u524D\u8FDB\u7A0B\u5F02\u5E38\u9000\u51FA\uFF0C\u8BF7\u6838\u5B9E\u6CA1\u6709\u8FDE\u63A5\u64CD\u4F5C\u540E\u79FB\u9664 connection.json.lock")}try{r()}finally{ve(t)}}function an(e,r,t=pe()){Xt(t,()=>{if(qe(fe(t))!==qe(r))throw new Error("Agent Utopia \u5F53\u524D\u8FDE\u63A5\u5DF2\u6539\u53D8\uFF0C\u672A\u8986\u76D6\u65B0\u8FDE\u63A5");let n=t+"."+Be()+".tmp";try{Fe(n,JSON.stringify(e,null,2)+`
19
- `,{flag:"wx",mode:384}),tn(n,t)}finally{K(n)&&ve(n)}})}function st(e=pe()){let r=fe(e);return{configured:!!r,target_policy:"active-only",product:"agent-utopia",cli_version:X,...r?{auth_url:r.auth_url,platform_url:r.platform_url,auth:r.auth,identity:"account",account_id:r.account_id,credential_id:r.credential_id,credential_kind:r.credential_kind,scopes:r.scopes,resource_mode:r.resource_mode,track_ids:r.track_ids,permissions_source:"server",expires_at:r.expires_at}:{}}}function cn(e){if(!e||!/^\d+$/.test(e))return 0;let r=Number(e);return Number.isSafeInteger(r)?r:0}async function le(e,r,t={},n){let o={Accept:t.raw?"application/octet-stream":"application/json"};if(n&&(o.Authorization="Bearer "+Se(n)),t.body!==void 0&&(o["Content-Type"]="application/json"),t.key!==void 0){if(!t.key||t.key.trim()!==t.key||Buffer.byteLength(t.key)>128||/[\r\n]/.test(t.key))throw new Error("\u5E42\u7B49\u952E\u5FC5\u987B\u4E3A 1\u2013128 \u5B57\u8282\u4E14\u6CA1\u6709\u9996\u5C3E\u7A7A\u767D");o["Idempotency-Key"]=t.key}$t(r,t.body);let i=t.body===void 0?void 0:Bt(t.body),s=qt(r,t.raw),c=AbortSignal.any([AbortSignal.timeout(3e4),...t.signal?[t.signal]:[]]);c.throwIfAborted();let a;try{i!==void 0&&zt(r)&&(it(t.body)||Buffer.byteLength(i)>8192)&&(i=await Jt(e,r,t.method||"GET",i,t.key,l=>le(e,"/api/v1/content-transfers",{method:"POST",body:l,signal:t.signal},n),c)),a=await fetch(e+Me(r),{method:t.method||"GET",headers:o,redirect:"manual",signal:c,...t.body===void 0?{}:{body:i}})}catch{throw t.signal?.aborted?t.signal.reason||new Error("Agent Utopia \u8BF7\u6C42\u5DF2\u53D6\u6D88"):new Error("Agent Utopia \u8BF7\u6C42\u5931\u8D25\u6216\u8D85\u65F6\uFF1B\u5199\u64CD\u4F5C\u53EF\u80FD\u5DF2\u63D0\u4EA4\uFF0C\u8BF7\u4F7F\u7528\u539F\u5E42\u7B49\u952E\u6838\u5BF9")}if(a.status>=300&&a.status<400)throw await a.body?.cancel(),new Error("Agent Utopia \u62D2\u7EDD\u8DDF\u968F HTTP \u91CD\u5B9A\u5411\uFF1B\u8BF7\u901A\u8FC7 connect \u660E\u786E\u914D\u7F6E\u6B63\u786E\u5165\u53E3");let f=await Pe(a,a.ok?s:Ue),m;if(f.length&&!t.raw||!a.ok)try{m=Ce(ke(f,"Agent Utopia JSON \u54CD\u5E94"))}catch{if(a.ok)throw new Error("Agent Utopia \u8FD4\u56DE\u65E0\u6548 JSON")}if(!a.ok){let l=m?.error,p=typeof l=="string"?l:l?.code,v=String(m?.inbox_revision),h=m,d={};U(h?.operation_id)&&(d.operation_id=h.operation_id);let _=typeof l=="object"&&l?l.field:void 0;if(typeof _=="string"&&/^[A-Za-z0-9_.\[\]]{1,128}$/.test(_)&&(d.field=_),p==="context_changed")for(let u of["restart_url","updates_url"]){let y=h?.[u];typeof y=="string"&&/^\/api\/v1\/tracks\/[A-Za-z0-9_-]{1,64}\/(?:context|updates)(?:\?after_seq=0(?:&resource_id=[A-Za-z0-9_-]{1,64})?)?$/.test(y)&&(d[u]=y)}throw new de(a.status,p&&/^[a-z_]{1,64}$/.test(p)?p:"request_failed",cn(a.headers.get("retry-after")),p==="revision_not_available"&&/^(?:0|[1-9]\d{0,19})$/.test(v)?v:void 0,d)}return t.raw?f:Gt(m??null,e,c)}var ze=class{constructor(r=pe()){this.profilePath=r;let t=fe(r);if(!t)throw new Error("\u5C1A\u672A\u8FDE\u63A5 Agent Utopia\uFF1B\u8FD0\u884C aut connect\uFF08\u65E7\u7EC4\u7EC7\u51ED\u636E\u4E0D\u80FD\u7528\u4E8E\u8D26\u53F7 API\uFF09");this.profile=t}profilePath;profile;assertActive(){if(qe(fe(this.profilePath))!==qe(this.profile))throw new Error("Agent Utopia \u5F53\u524D\u8FDE\u63A5\u5DF2\u6539\u53D8\uFF1B\u672C\u6B21\u64CD\u4F5C\u505C\u6B62\uFF0C\u4E0D\u5207\u6362\u6216\u56DE\u9000\u5230\u5176\u4ED6\u76EE\u6807")}async request(r,t,n={}){this.assertActive();let o=await le(r==="auth"?this.profile.auth_url:this.profile.platform_url,t,n,this.profile.token);try{this.assertActive()}catch{throw new Error("Agent Utopia \u5F53\u524D\u8FDE\u63A5\u5DF2\u6539\u53D8\uFF0C\u672C\u6B21\u54CD\u5E94\u4E0D\u518D\u8F93\u51FA\uFF1B\u5DF2\u53D1\u51FA\u7684\u5199\u64CD\u4F5C\u53EF\u80FD\u5DF2\u63D0\u4EA4\uFF0C\u8BF7\u6838\u5B9E\u539F\u76EE\u6807")}if(r==="auth"&&t==="/api/v1/auth/me"){let i=ot(o,this.profile.token);if(i.account_id!==this.profile.account_id||i.credential_id!==this.profile.credential_id)throw new Error("Auth \u5F53\u524D\u8D26\u53F7\u4E0E\u8FDE\u63A5\u8EAB\u4EFD\u4E0D\u4E00\u81F4")}return o}async disconnect(r=!1){if(this.assertActive(),r){if(this.profile.credential_kind==="agent_pat")throw new Error("\u8D26\u53F7 Agent \u51ED\u636E\u8BF7\u7528 token revoke ID --expect-revision N --key KEY \u64A4\u9500\uFF0C\u518D\u8FD0\u884C disconnect\uFF1B\u65E0\u7BA1\u7406\u6743\u9650\u65F6\u7531\u6388\u6743\u8D26\u53F7\u64A4\u9500");await this.request("auth","/api/v1/accounts/logout",{method:"POST"})}return Xt(this.profilePath,()=>{this.assertActive(),ve(this.profilePath)}),{disconnected:!0,revoked:r,product:"agent-utopia"}}};function dn(e){let r=process.platform==="darwin"?"open":process.platform==="win32"?"rundll32":"xdg-open",t=process.platform==="win32"?["url.dll,FileProtocolHandler",e]:[e],n=nn(r,t,{stdio:"ignore",detached:!0,shell:!1});n.on("error",()=>{}),n.unref()}function un(e=pe()){let r=Z(F(e),"device.json");if(ue(r),Wt(F(r),{recursive:!0,mode:448}),process.platform!=="win32"&&Ht(F(r),448),!K(r))try{Fe(r,JSON.stringify({version:1,device_id:Be()})+`
20
- `,{flag:"wx",mode:384})}catch(n){if(n.code!=="EEXIST")throw n}let t=JSON.parse(C(r,1024,"Agent Utopia \u8BBE\u5907\u6807\u8BC6"));if(t?.version!==1||typeof t.device_id!="string"||!/^[A-Za-z0-9_-]{16,128}$/.test(t.device_id))throw new Error("Agent Utopia \u8BBE\u5907\u6807\u8BC6\u65E0\u6548\uFF1B\u8BF7\u68C0\u67E5 device.json\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u66F4\u6362\u8BBE\u5907\u8EAB\u4EFD");return t.device_id}async function Vt(e,r=pe()){let t=e.auth==="browser"?Y({scopes:e.scopes||De,resource_mode:e.resourceMode||"all_visible",track_ids:e.trackIDs}):void 0;if(!t&&(e.scopes||e.resourceMode||e.trackIDs||e.expiresIn))throw new Error("\u8D26\u53F7\u6388\u6743\u9009\u9879\u4EC5\u7528\u4E8E\u6D4F\u89C8\u5668\u8FDE\u63A5");if(e.expiresIn!==void 0&&(!Number.isSafeInteger(e.expiresIn)||e.expiresIn<1||e.expiresIn>90*86400))throw new Error("--expires-in \u8D85\u51FA 1\u20137776000 \u79D2");let n=fe(r),o=sn(e.gateway,e.authURL,e.platformURL),i=e.auth==="token"?void 0:un(r),s,c,a,f;if(e.auth==="token"){if(s=Se(e.secret),!je(s))throw new Error("\u53EA\u63A5\u53D7 Agent Utopia \u8D26\u53F7\u51ED\u636E")}else{let m=await ln(o.auth_url,e,i,t);if(s=Se(m.token),c=m.expires_at,f=m.grant,t){a=Z(F(r),"credential-recovery."+Be()+".json");try{Fe(a,JSON.stringify({...o,secret:s,expires_at:c})+`
21
- `,{flag:"wx",mode:384})}catch{throw new Error("\u8BBE\u5907\u51ED\u636E\u5DF2\u9886\u53D6\u4F46\u65E0\u6CD5\u4FDD\u5B58\uFF1B\u8BF7\u7531\u6388\u6743\u8D26\u53F7\u5728\u51ED\u636E\u5217\u8868\u64A4\u9500\u8BE5\u8BBE\u5907\u6388\u6743\u540E\u91CD\u8BD5")}}}try{let m=await le(o.auth_url,"/api/v1/auth/me",{signal:e.signal},s);if(!je(s))throw new Error("\u6388\u6743\u672A\u8FD4\u56DE\u8D26\u53F7\u51ED\u636E");{let l=ot(m,s);if(t&&(l.credential_kind!=="agent_pat"||!Le(l,t)||!f||!Number.isFinite(Date.parse(String(f.created_at)))||Date.parse(l.expires_at)-Date.parse(String(f.created_at))>(e.expiresIn||30*86400)*1e3))throw new Error("\u8BBE\u5907\u6388\u6743\u7ED3\u679C\u8D85\u51FA\u672C\u6B21\u8BF7\u6C42\u4E0A\u9650");if(t&&(!f||f.id!==l.credential_id||f.account_id!==l.account_id||f.expires_at!==l.expires_at||!Le(l,f)||!Le(f,l)))throw new Error("\u8BBE\u5907\u51ED\u636E\u4E0E\u5F53\u524D\u8D26\u53F7\u8EAB\u4EFD\u4E0D\u4E00\u81F4");an({version:2,connection_id:Be(),...o,auth:e.auth,token:s,account_id:l.account_id,credential_id:l.credential_id,credential_kind:l.credential_kind,expires_at:l.expires_at,...Y(l)},n,r)}}catch(m){throw a&&(e.notify?e.notify(`\u8BBE\u5907\u51ED\u636E\u5DF2\u9886\u53D6\uFF1B\u79C1\u6709\u6062\u590D\u6587\u4EF6\uFF1A${a}\u3002\u8FDE\u63A5\u672A\u5207\u6362\u3002\u8BF7\u6838\u9A8C\u6216\u64A4\u9500\u8BE5\u6388\u6743\u540E\u5220\u9664\u6B64\u6587\u4EF6\u3002`):process.stderr.write(`\u8BBE\u5907\u51ED\u636E\u5DF2\u9886\u53D6\uFF1B\u79C1\u6709\u6062\u590D\u6587\u4EF6\uFF1A${a}\u3002\u8FDE\u63A5\u672A\u5207\u6362\u3002\u8BF7\u6838\u9A8C\u6216\u64A4\u9500\u8BE5\u6388\u6743\u540E\u5220\u9664\u6B64\u6587\u4EF6\u3002
22
- `)),m}return a&&ve(a),st(r)}async function ln(e,r,t,n){let o=r.notify||(c=>process.stderr.write(c+`
23
- `)),i=await le(e,"/api/v1/auth/device/requests",{method:"POST",signal:r.signal,body:{device_id:t,name:r.device||rn(),...n,expires_in_seconds:r.expiresIn}});if(!i?.device_code||!/^[A-Z2-9-]{5,24}$/.test(i.user_code)||typeof i.verification_path!="string"||!Number.isFinite(i.expires_in)||i.expires_in<=0)throw new Error("Agent Utopia \u8BBE\u5907\u6388\u6743\u54CD\u5E94\u65E0\u6548");let s=!1;try{let c=Me(i.verification_path,!1);if(!/^\/device(?:\?|$)/.test(c))throw new Error("Agent Utopia \u6388\u6743\u9875\u9762\u8DEF\u5F84\u65E0\u6548");let a=e+c;o(`\u8BF7\u6253\u5F00 ${a}
24
- \u786E\u8BA4\u8BBE\u5907\u7801\uFF1A${i.user_code}`),r.noOpen||dn(a);let f=AbortSignal.any([AbortSignal.timeout(Math.min(600,i.expires_in)*1e3),...r.signal?[r.signal]:[]]),m=Math.max(1,Math.min(60,i.interval||5));for(;;){await on(m*1e3,void 0,{signal:f});try{let l=await le(e,"/api/v1/auth/device/token",{method:"POST",signal:f,body:{device_code:i.device_code}}),p=Se(l.secret);return s=!0,{token:p,expires_at:l.expires_at,grant:l}}catch(l){if(l instanceof de&&l.code==="authorization_pending")continue;if(l instanceof de&&l.code==="slow_down"){m=Math.min(60,Math.max(m+5,l.retryAfter));continue}throw l instanceof de&&l.code==="invalid_grant"?new Error("Agent Utopia \u8BBE\u5907\u6388\u6743\u5DF2\u9886\u53D6\u6216\u5931\u6548\uFF1B\u8BF7\u91CD\u65B0\u8FD0\u884C connect\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u91CD\u65B0\u7533\u8BF7\u6388\u6743"):l}}}finally{s||await le(e,"/api/v1/auth/device/cancel",{method:"POST",signal:AbortSignal.timeout(3e3),body:{device_code:i.device_code}}).catch(()=>{})}}async function Je(e,r){let t=r==="Password"?1024:8192;if(e){if(process.stdin.isTTY)throw new Error("stdin \u51ED\u636E\u9009\u9879\u9700\u8981\u7BA1\u9053\u8F93\u5165");let s="";for await(let c of process.stdin)if(s+=c.toString(),Buffer.byteLength(s)>t+2)throw new Error("\u51ED\u636E\u8FC7\u957F");return s.replace(/\r?\n$/,"")}let n=process.stdin,o=process.stderr;if(!n.isTTY||!o.isTTY)throw new Error(`\u975E\u4EA4\u4E92\u8F93\u5165\u8BF7\u4F7F\u7528 --${r==="Password"?"password":"token"}-stdin`);let i=n.isRaw;return o.write(`${r}\uFF08\u9690\u85CF\u8F93\u5165\uFF09\uFF1A`),n.setRawMode(!0),n.resume(),new Promise((s,c)=>{let a="",f=!1,m=h=>{f||(f=!0,n.off("data",v),n.off("end",l),n.off("error",p),n.setRawMode(i),n.pause(),o.write(`
18
+ \u8FD0\u884C aut self update \u5B89\u88C5\u66F4\u65B0\u3002`)}import{parseArgs as Tn}from"node:util";import{constants as at,closeSync as Yr,fstatSync as Kr,lstatSync as Hr,openSync as Wr,readSync as Xr}from"node:fs";import{resolve as Vr}from"node:path";var ve=1024*1024,ct=ve,le=2*ve,Ce=4*ve,dt=32*ve,Bt=1024,H=class extends Error{constructor(t,o){super(`${t}: ${o}`);this.code=t}code};function se(e,r,t="content_too_large"){throw new H(t,`${e}\u4E0D\u80FD\u8D85\u8FC7 ${r} \u5B57\u8282\uFF08${r/ve} MiB\uFF09\uFF1B\u8BF7\u62C6\u5206\u5185\u5BB9\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u622A\u65AD`)}function qt(e,r,t,o){let n=[],i=0;for(;;){let s=Buffer.allocUnsafe(Math.min(65536,r-i+1)),c;try{c=Xr(e,s,0,s.length,null)}catch(a){if(a.code==="EINTR")continue;throw a}if(!c)return Buffer.concat(n,i);i+=c,i>r&&se(t,r,o),n.push(s.subarray(0,c))}}function Zr(e,r,t="\u6587\u4EF6",o="content_too_large"){let n=Vr(e),i=Hr(n);if(!i.isFile()||i.isSymbolicLink())throw new Error(`${t}\u5FC5\u987B\u662F\u666E\u901A\u6587\u4EF6\uFF0C\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5\u6216\u7279\u6B8A\u6587\u4EF6`);i.size>r&&se(t,r,o);let s=Wr(n,at.O_RDONLY|(at.O_NOFOLLOW||0)|(at.O_NONBLOCK||0));try{let c=Kr(s);if(!c.isFile()||c.dev!==i.dev||c.ino!==i.ino)throw new Error(`${t}\u8BFB\u53D6\u524D\u5DF2\u6539\u53D8\u6216\u4E0D\u662F\u666E\u901A\u6587\u4EF6`);return c.size>r&&se(t,r,o),qt(s,r,t,o)}finally{Yr(s)}}function xe(e,r="\u6B63\u6587"){if(e.includes(0))throw new H("invalid_content_encoding",`${r}\u4E0D\u80FD\u5305\u542B NUL \u5B57\u8282\uFF0C\u8BF7\u4F7F\u7528 Markdown/HTML \u6587\u672C`);try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(e)}catch{throw new H("invalid_content_encoding",`${r}\u5FC5\u987B\u662F\u6709\u6548\u7684 UTF-8 \u6587\u672C`)}}function $(e,r=ct,t="\u6B63\u6587",o="content_too_large"){let n=e==="-"?qt(0,r,t,o):Zr(e,r,t,o);return xe(n,t)}function Qr(e,r="\u6B63\u6587"){if(e.includes("\0"))throw new H("invalid_content_encoding",`${r}\u4E0D\u80FD\u5305\u542B NUL \u5B57\u8282\uFF0C\u8BF7\u4F7F\u7528 Markdown/HTML \u6587\u672C`);let t=Buffer.from(e,"utf8");if(t.toString("utf8")!==e)throw new H("invalid_content_encoding",`${r}\u5305\u542B\u65E0\u6548\u7684 Unicode \u5B57\u7B26`);t.length>ct&&se(r,ct)}function zt(e,r){if(!r||typeof r!="object")return;let t=e.split("?")[0],o=r;if(/\/tracks\/[^/]+\/(content-commits|background-versions|handoffs)$/.test(t)){if(Buffer.byteLength(JSON.stringify(r))>256*1024)throw new H("manifest_too_large","\u5185\u5BB9\u6E05\u5355\u6700\u591A 256 KiB");let n=t.endsWith("/content-commits")?o.message?.text:o.body_text;if(n!==void 0){if(typeof n!="string")throw new Error("\u6B63\u6587\u5FC5\u987B\u662F\u6587\u672C");if(Qr(n),Buffer.byteLength(n)>64*1024)throw new H("content_too_large","\u77ED\u6B63\u6587\u6700\u591A 64 KiB\uFF1B\u8F83\u5927\u6B63\u6587\u8BF7\u5148\u4E0A\u4F20\u6587\u4EF6\u518D\u5F15\u7528")}}}function Ft(e){let r=JSON.stringify(e);if(r===void 0)throw new Error("\u8BF7\u6C42\u5FC5\u987B\u662F\u53EF\u7F16\u7801\u7684 JSON");return Buffer.byteLength(r,"utf8")>le&&se("\u7F16\u7801\u540E\u7684 JSON \u8BF7\u6C42",le,"request_too_large"),r}async function $e(e,r){let t=e.body?.getReader();if(!t)return Buffer.alloc(0);let o=[],n=0;try{let i=e.headers.get("content-length");for(!e.headers.has("content-encoding")&&i&&/^\d+$/.test(i)&&Number(i)>r&&se("HTTP \u54CD\u5E94",r,"response_too_large");;){let{done:s,value:c}=await t.read();if(s)return Buffer.concat(o,n);n+=c.byteLength,n>r&&se("HTTP \u54CD\u5E94",r,"response_too_large"),o.push(c)}}catch(i){try{await t.cancel()}catch{}throw i}finally{t.releaseLock()}}function fe(e){if(e===void 0)return Ce;let r=Number(e);if(!/^\d+$/.test(String(e))||!Number.isSafeInteger(r)||r<Bt||r>dt)throw new Error(`--max-bytes \u5FC5\u987B\u4E3A ${Bt}\u2013${dt} \u7684\u6574\u6570`);return r}function Mt(e,r=!1){let t=new URL(e,"https://utopia.invalid");return/^\/api\/v1\/(?:tracks\/[^/]+\/(?:updates|context|records)|records(?:\/[^/]+\/versions)?)$/.test(t.pathname)?fe(t.searchParams.get("max_bytes")??void 0):r||/\/body$/.test(t.pathname)||/\/background(?:-versions\/[^/]+)?$/.test(t.pathname)?dt:Ce}re();re();je();re();import{createHash as tn}from"node:crypto";var rn=new Set(["text","material","content_json","context_json","snapshot_json","evidence_json","body_text","body","goal","content","snapshot","handoff","background","reason","facts_text","evidence","brief","context_text","acceptance_criteria","inputs","outputs"]);function lt(e){return!e||typeof e!="object"?!1:Object.entries(e).some(([r,t])=>!(/(?:_url|_cursor)$/.test(r)||["url","cursor","token","content_object"].includes(r))&&(t!==null&&t!==""&&rn.has(r)&&(typeof t=="string"||typeof t=="object")||typeof t=="string"&&Buffer.byteLength(t)>1024||lt(t)))}function Gt(e){return/^\/(?:api|web|staff)\/v1\/(?:task-access-grants|task-record-offers|access-requests|collaboration-resources|collaboration-assignments|collaboration-party-changes|collaboration-terminations|moderation|me|search|utopia|tracks|records|entries|boards|board-posts|content-shares|tasks|solutions|solution-versions|collaborations|deliveries|task-selections|support|content-reports|workspace)(?:\/|\?|$)/.test(e)}function Yt(e,r,t){if(typeof e!="string")throw new Error("\u65E0\u6548\u6B63\u6587\u4F20\u8F93\u5730\u5740");let o=new URL(e);if(o.protocol!=="https:"||o.username||o.password||o.port||o.hash||o.hostname===new URL(r).hostname||!o.hostname.includes(".")||/^[0-9.]+$/.test(o.hostname)||/[%\\]/.test(o.pathname)||t&&!o.pathname.includes("/released/content/"))throw new Error("\u6B63\u6587\u5FC5\u987B\u901A\u8FC7\u72EC\u7ACB OSS/CDN \u57DF\u540D\u4F20\u8F93");return o.href}var Kt=e=>tn("sha256").update(e).digest("hex");async function Ht(e,r,t,o,n,i,s){let c=Buffer.from(o);if(c.length>512*1024)throw new Error("\u6B63\u6587\u8BF7\u6C42\u8D85\u8FC7 512 KiB");let a=await i({path:r,method:t,idempotency_key:n||"",size_bytes:c.length,sha256:Kt(c)}),f=a.upload;if(!f||f.method!=="PUT"||f.size_bytes!==c.length||typeof a.content_object!="string")throw new Error("\u65E0\u6548\u6B63\u6587\u4E0A\u4F20\u8BB8\u53EF");for(let l of Object.keys(f.headers||{}))if(!/^(content-length|content-type|cache-control|content-md5|x-oss-[a-z0-9-]+)$/i.test(l))throw new Error("\u65E0\u6548 OSS \u4E0A\u4F20\u8BF7\u6C42\u5934");let m=await fetch(Yt(f.url,e,!1),{method:"PUT",body:c,headers:f.headers,credentials:"omit",redirect:"error",signal:s});if(await m.body?.cancel(),!m.ok)throw new Error("OSS \u6B63\u6587\u76F4\u4F20\u5931\u8D25");return JSON.stringify({content_object:a.content_object})}async function Wt(e,r,t){if(!e||typeof e!="object"||e.transport!=="content_refs_v1")return e;let o=e,n=o.content;if(!n||n.transport!=="cdn"||n.method!=="GET"||!Number.isSafeInteger(n.size_bytes)||n.size_bytes<=0||n.size_bytes>16*1024*1024||!/^[a-f0-9]{64}$/.test(n.sha256))throw new Error("\u65E0\u6548\u6B63\u6587\u4E0B\u8F7D\u8BB8\u53EF");let i=await fetch(Yt(n.download_url,r,!0),{method:"GET",credentials:"omit",redirect:"error",signal:t});if(!i.ok)throw await i.body?.cancel(),new Error("CDN \u6B63\u6587\u4E0D\u53EF\u7528\uFF0C\u8BF7\u91CD\u65B0\u8BFB\u53D6\u4EE5\u68C0\u67E5\u5F53\u524D\u6743\u9650");let s=await $e(i,n.size_bytes);if(s.length!==n.size_bytes||Kt(s)!==n.sha256)throw new Error("\u6B63\u6587\u5927\u5C0F\u6216 SHA-256 \u6821\u9A8C\u5931\u8D25");let c=Fe(xe(s,"CDN \u6B63\u6587"));if(!Array.isArray(c))throw new Error("\u65E0\u6548\u6B63\u6587\u8868\u793A");let a=(f,m=0)=>{if(m>64)throw new Error("\u6B63\u6587\u5D4C\u5957\u8FC7\u6DF1");if(!f||typeof f!="object")return f;let l=f;if(!Array.isArray(f)&&Object.keys(f).length===1&&Object.hasOwn(f,"$content_index")){let p=l.$content_index;if(typeof p!="number"||!Number.isSafeInteger(p)||p<0||p>=c.length)throw new Error("\u65E0\u6548\u6B63\u6587\u5F15\u7528");return c[p]}for(let p of Object.keys(f))Object.defineProperty(f,p,{value:a(l[p],m+1),writable:!0,enumerable:!0,configurable:!0});return f};return a(o.metadata)}import{randomUUID as Je,createHash as nn}from"node:crypto";import{chmodSync as Zt,existsSync as X,linkSync as Xt,lstatSync as Me,mkdirSync as Qt,renameSync as on,unlinkSync as Ie,writeFileSync as Ke}from"node:fs";import{homedir as Vt,hostname as sn}from"node:os";import{dirname as M,join as ne}from"node:path";import{spawn as an}from"node:child_process";import{setTimeout as cn}from"node:timers/promises";var pe=class extends Error{constructor(t,o,n=0,i,s={}){super(`Agent Utopia HTTP ${t}: ${o}${o==="response_too_large"?"\uFF1B\u51CF\u5C11\u5206\u9875\u6761\u6570\uFF0C\u6216\u5728 Track \u8BFB\u53D6\u65F6\u63D0\u9AD8 --max-bytes\uFF08\u6700\u591A 33554432\uFF09\uFF0C\u4E5F\u53EF\u5355\u72EC\u8BFB\u53D6\u5185\u5BB9":""}${n?`\uFF1BRetry-After: ${n} \u79D2`:""}${i!==void 0?`\uFF1Binbox_revision=${i}`:""}${Object.keys(s).length?"\uFF1B"+JSON.stringify(s):""}`);this.status=t;this.code=o;this.retryAfter=n;this.inboxRevision=i;this.recovery=s}status;code;retryAfter;inboxRevision;recovery};function he(){let e=process.platform==="win32"?process.env.APPDATA||ne(Vt(),"AppData","Roaming"):process.env.XDG_CONFIG_HOME||ne(Vt(),".config"),r=ne(e,"aut","connection.json"),t=ne(e,"aut","team","connection.json");if(me(r),!X(r)&&X(t)&&(me(t),JSON.parse($(t,32*1024,"\u8D26\u53F7\u914D\u7F6E"))?.version===2)){we(t);try{Xt(t,r)}catch(s){if(s.code==="EEXIST")return r;throw s}Ie(t);let n=ne(M(t),"device.json"),i=ne(M(r),"device.json");if(!X(i)&&X(n)){me(n);let s=JSON.parse($(n,1024,"\u8BBE\u5907\u6807\u8BC6"));if(s?.version===1&&typeof s.device_id=="string"&&/^[A-Za-z0-9_-]{16,128}$/.test(s.device_id))try{Xt(n,i)}catch(c){if(c.code!=="EEXIST")throw c}}}return r}function me(e){if(X(M(e))&&Me(M(e)).isSymbolicLink())throw new Error("\u62D2\u7EDD\u4F7F\u7528\u7B26\u53F7\u94FE\u63A5 Agent Utopia \u914D\u7F6E\u76EE\u5F55");if(X(e)&&(!Me(e).isFile()||Me(e).isSymbolicLink()))throw new Error("\u62D2\u7EDD\u4F7F\u7528\u975E\u666E\u901A Agent Utopia \u914D\u7F6E\u6587\u4EF6")}function Ne(e){if(!e||/[\\\s]/.test(e))throw new Error("Agent Utopia URL \u65E0\u6548");let r=e.match(/^https?:\/\/[^/]+(\/[^?#]*)?/i)?.[1]||"";if(/%(?:2e|2f|5c)/i.test(r)||r.split("/").some(n=>n==="."||n===".."))throw new Error("Agent Utopia URL \u4E0D\u5141\u8BB8\u8DEF\u5F84\u8DF3\u8F6C");let t;try{t=new URL(e)}catch{throw new Error("Agent Utopia URL \u65E0\u6548")}if(t.username||t.password||t.search||t.hash)throw new Error("Agent Utopia URL \u4E0D\u80FD\u5305\u542B\u51ED\u636E\u3001\u67E5\u8BE2\u53C2\u6570\u6216\u7247\u6BB5");let o=["127.0.0.1","localhost","[::1]"].includes(t.hostname);if(t.protocol!=="https:"&&!(t.protocol==="http:"&&o))throw new Error("Agent Utopia \u8FDE\u63A5\u5FC5\u987B\u4F7F\u7528 HTTPS\uFF1B\u4EC5\u672C\u673A\u5F00\u53D1\u5141\u8BB8 HTTP");return t.origin+t.pathname.replace(/\/+$/,"")}function dn(e,r,t){if(!e&&(!r||!t))throw new Error("\u63D0\u4F9B\u7F51\u5173 URL\uFF0C\u6216\u540C\u65F6\u63D0\u4F9B --auth-url \u548C --platform-url");let o=e?Ne(e):"";return{auth_url:Ne(r||o+"/amb-auth"),platform_url:Ne(t||o+"/amb-platform")}}function He(e,r=!0){if(!e.startsWith("/")||e.startsWith("//")||/[\\\s#]/.test(e))throw new Error("Agent Utopia API \u53EA\u63A5\u53D7\u5F53\u524D\u8FDE\u63A5\u7684\u76F8\u5BF9\u8DEF\u5F84");let t=e.split("?")[0];if(/%(?:2e|2f|5c|25)/i.test(t)||t.split("/").some(o=>o==="."||o===".."))throw new Error("Agent Utopia API \u8DEF\u5F84\u4E0D\u5141\u8BB8\u8DF3\u8F6C");if(r&&!t.startsWith("/api/v1/"))throw new Error("Agent Utopia API \u4EC5\u5141\u8BB8 /api/v1/ \u8DEF\u5F84");return e}function Ae(e){if(typeof e!="string"||!e||e.length>8192||!/^[\x21-\x7e]+$/.test(e))throw new Error("Agent Utopia \u51ED\u8BC1\u65E0\u6548");return e}function we(e=he()){if(me(e),!!X(e))try{let r=JSON.parse($(e,32768,"\u8D26\u53F7\u914D\u7F6E"));if(r.version!==2||!r.connection_id||!["token","browser"].includes(r.auth)||Ne(r.auth_url)!==r.auth_url||Ne(r.platform_url)!==r.platform_url)throw new Error("invalid");if(Ae(r.token),!qe(r.token)||!D(r.account_id)||!D(r.credential_id)||"user_id"in r||"organization_id"in r||r.credential_kind!==(r.token.startsWith("aut_agent_")?"agent_pat":"account_session"))throw new Error("invalid");if(W(r),process.platform!=="win32"&&Me(e).mode&63)throw new Error("permissions");return r}catch{throw new Error("Agent Utopia \u8FDE\u63A5\u914D\u7F6E\u65E0\u6548\u6216\u6743\u9650\u8FC7\u5BBD\uFF1B\u8BF7\u68C0\u67E5\u79C1\u6709\u914D\u7F6E\u540E\u91CD\u65B0\u8FDE\u63A5")}}function Ge(e){return nn("sha256").update(JSON.stringify(e)||"").digest("hex")}function er(e,r){me(e),Qt(M(e),{recursive:!0,mode:448}),process.platform!=="win32"&&Zt(M(e),448);let t=e+".lock";try{Ke(t,String(process.pid),{flag:"wx",mode:384})}catch{throw new Error("Agent Utopia \u8FDE\u63A5\u914D\u7F6E\u6B63\u5728\u4FEE\u6539\uFF1B\u82E5\u6B64\u524D\u8FDB\u7A0B\u5F02\u5E38\u9000\u51FA\uFF0C\u8BF7\u6838\u5B9E\u6CA1\u6709\u8FDE\u63A5\u64CD\u4F5C\u540E\u79FB\u9664 connection.json.lock")}try{r()}finally{Ie(t)}}function un(e,r,t=he()){er(t,()=>{if(Ge(we(t))!==Ge(r))throw new Error("Agent Utopia \u5F53\u524D\u8FDE\u63A5\u5DF2\u6539\u53D8\uFF0C\u672A\u8986\u76D6\u65B0\u8FDE\u63A5");let o=t+"."+Je()+".tmp";try{Ke(o,JSON.stringify(e,null,2)+`
19
+ `,{flag:"wx",mode:384}),on(o,t)}finally{X(o)&&Ie(o)}})}function ft(e=he()){let r=we(e);return{configured:!!r,target_policy:"active-only",product:"agent-utopia",cli_version:ee,...r?{auth_url:r.auth_url,platform_url:r.platform_url,auth:r.auth,identity:"account",account_id:r.account_id,credential_id:r.credential_id,credential_kind:r.credential_kind,scopes:r.scopes,resource_mode:r.resource_mode,track_ids:r.track_ids,permissions_source:"server",expires_at:r.expires_at}:{}}}function ln(e){if(!e||!/^\d+$/.test(e))return 0;let r=Number(e);return Number.isSafeInteger(r)?r:0}async function ge(e,r,t={},o){let n={Accept:t.raw?"application/octet-stream":"application/json"};if(o&&(n.Authorization="Bearer "+Ae(o)),t.body!==void 0&&(n["Content-Type"]="application/json"),t.key!==void 0){if(!t.key||t.key.trim()!==t.key||Buffer.byteLength(t.key)>128||/[\r\n]/.test(t.key))throw new Error("\u5E42\u7B49\u952E\u5FC5\u987B\u4E3A 1\u2013128 \u5B57\u8282\u4E14\u6CA1\u6709\u9996\u5C3E\u7A7A\u767D");n["Idempotency-Key"]=t.key}zt(r,t.body);let i=t.body===void 0?void 0:Ft(t.body),s=Mt(r,t.raw),c=AbortSignal.any([AbortSignal.timeout(3e4),...t.signal?[t.signal]:[]]);c.throwIfAborted();let a;try{i!==void 0&&Gt(r)&&(lt(t.body)||Buffer.byteLength(i)>8192)&&(i=await Ht(e,r,t.method||"GET",i,t.key,l=>ge(e,"/api/v1/content-transfers",{method:"POST",body:l,signal:t.signal},o),c)),a=await fetch(e+He(r),{method:t.method||"GET",headers:n,redirect:"manual",signal:c,...t.body===void 0?{}:{body:i}})}catch{throw t.signal?.aborted?t.signal.reason||new Error("Agent Utopia \u8BF7\u6C42\u5DF2\u53D6\u6D88"):new Error("Agent Utopia \u8BF7\u6C42\u5931\u8D25\u6216\u8D85\u65F6\uFF1B\u5199\u64CD\u4F5C\u53EF\u80FD\u5DF2\u63D0\u4EA4\uFF0C\u8BF7\u4F7F\u7528\u539F\u5E42\u7B49\u952E\u6838\u5BF9")}if(a.status>=300&&a.status<400)throw await a.body?.cancel(),new Error("Agent Utopia \u62D2\u7EDD\u8DDF\u968F HTTP \u91CD\u5B9A\u5411\uFF1B\u8BF7\u901A\u8FC7 connect \u660E\u786E\u914D\u7F6E\u6B63\u786E\u5165\u53E3");let f=await $e(a,a.ok?s:Ce),m;if(f.length&&!t.raw||!a.ok)try{m=Fe(xe(f,"Agent Utopia JSON \u54CD\u5E94"))}catch{if(a.ok)throw new Error("Agent Utopia \u8FD4\u56DE\u65E0\u6548 JSON")}if(!a.ok){let l=m?.error,p=typeof l=="string"?l:l?.code,v=String(m?.inbox_revision),h=m,d={};D(h?.operation_id)&&(d.operation_id=h.operation_id);let b=typeof l=="object"&&l?l.field:void 0;if(typeof b=="string"&&/^[A-Za-z0-9_.\[\]]{1,128}$/.test(b)&&(d.field=b),p==="context_changed")for(let u of["restart_url","updates_url"]){let _=h?.[u];typeof _=="string"&&/^\/api\/v1\/tracks\/[A-Za-z0-9_-]{1,64}\/(?:context|updates)(?:\?after_seq=0(?:&resource_id=[A-Za-z0-9_-]{1,64})?)?$/.test(_)&&(d[u]=_)}throw new pe(a.status,p&&/^[a-z_]{1,64}$/.test(p)?p:"request_failed",ln(a.headers.get("retry-after")),p==="revision_not_available"&&/^(?:0|[1-9]\d{0,19})$/.test(v)?v:void 0,d)}return t.raw?f:Wt(m??null,e,c)}var Ye=class{constructor(r=he()){this.profilePath=r;let t=we(r);if(!t)throw new Error("\u5C1A\u672A\u8FDE\u63A5 Agent Utopia\uFF1B\u8FD0\u884C aut connect\uFF08\u65E7\u7EC4\u7EC7\u51ED\u636E\u4E0D\u80FD\u7528\u4E8E\u8D26\u53F7 API\uFF09");this.profile=t}profilePath;profile;assertActive(){if(Ge(we(this.profilePath))!==Ge(this.profile))throw new Error("Agent Utopia \u5F53\u524D\u8FDE\u63A5\u5DF2\u6539\u53D8\uFF1B\u672C\u6B21\u64CD\u4F5C\u505C\u6B62\uFF0C\u4E0D\u5207\u6362\u6216\u56DE\u9000\u5230\u5176\u4ED6\u76EE\u6807")}async request(r,t,o={}){this.assertActive();let n=await ge(r==="auth"?this.profile.auth_url:this.profile.platform_url,t,o,this.profile.token);try{this.assertActive()}catch{throw new Error("Agent Utopia \u5F53\u524D\u8FDE\u63A5\u5DF2\u6539\u53D8\uFF0C\u672C\u6B21\u54CD\u5E94\u4E0D\u518D\u8F93\u51FA\uFF1B\u5DF2\u53D1\u51FA\u7684\u5199\u64CD\u4F5C\u53EF\u80FD\u5DF2\u63D0\u4EA4\uFF0C\u8BF7\u6838\u5B9E\u539F\u76EE\u6807")}if(r==="auth"&&t==="/api/v1/auth/me"){let i=ut(n,this.profile.token);if(i.account_id!==this.profile.account_id||i.credential_id!==this.profile.credential_id)throw new Error("Auth \u5F53\u524D\u8D26\u53F7\u4E0E\u8FDE\u63A5\u8EAB\u4EFD\u4E0D\u4E00\u81F4")}return n}async disconnect(r=!1){if(this.assertActive(),r){if(this.profile.credential_kind==="agent_pat")throw new Error("\u8D26\u53F7 Agent \u51ED\u636E\u8BF7\u7528 token revoke ID --expect-revision N --key KEY \u64A4\u9500\uFF0C\u518D\u8FD0\u884C disconnect\uFF1B\u65E0\u7BA1\u7406\u6743\u9650\u65F6\u7531\u6388\u6743\u8D26\u53F7\u64A4\u9500");await this.request("auth","/api/v1/accounts/logout",{method:"POST"})}return er(this.profilePath,()=>{this.assertActive(),Ie(this.profilePath)}),{disconnected:!0,revoked:r,product:"agent-utopia"}}};function fn(e){let r=process.platform==="darwin"?"open":process.platform==="win32"?"rundll32":"xdg-open",t=process.platform==="win32"?["url.dll,FileProtocolHandler",e]:[e],o=an(r,t,{stdio:"ignore",detached:!0,shell:!1});o.on("error",()=>{}),o.unref()}function pn(e=he()){let r=ne(M(e),"device.json");if(me(r),Qt(M(r),{recursive:!0,mode:448}),process.platform!=="win32"&&Zt(M(r),448),!X(r))try{Ke(r,JSON.stringify({version:1,device_id:Je()})+`
20
+ `,{flag:"wx",mode:384})}catch(o){if(o.code!=="EEXIST")throw o}let t=JSON.parse($(r,1024,"Agent Utopia \u8BBE\u5907\u6807\u8BC6"));if(t?.version!==1||typeof t.device_id!="string"||!/^[A-Za-z0-9_-]{16,128}$/.test(t.device_id))throw new Error("Agent Utopia \u8BBE\u5907\u6807\u8BC6\u65E0\u6548\uFF1B\u8BF7\u68C0\u67E5 device.json\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u66F4\u6362\u8BBE\u5907\u8EAB\u4EFD");return t.device_id}async function tr(e,r=he()){let t=e.auth==="browser"?W({scopes:e.scopes||Be,resource_mode:e.resourceMode||"all_visible",track_ids:e.trackIDs}):void 0;if(!t&&(e.scopes||e.resourceMode||e.trackIDs||e.expiresIn))throw new Error("\u8D26\u53F7\u6388\u6743\u9009\u9879\u4EC5\u7528\u4E8E\u6D4F\u89C8\u5668\u8FDE\u63A5");if(e.expiresIn!==void 0&&(!Number.isSafeInteger(e.expiresIn)||e.expiresIn<1||e.expiresIn>90*86400))throw new Error("--expires-in \u8D85\u51FA 1\u20137776000 \u79D2");let o=we(r),n=dn(e.gateway,e.authURL,e.platformURL),i=e.auth==="token"?void 0:pn(r),s,c,a,f;if(e.auth==="token"){if(s=Ae(e.secret),!qe(s))throw new Error("\u53EA\u63A5\u53D7 Agent Utopia \u8D26\u53F7\u51ED\u636E")}else{let m=await mn(n.auth_url,e,i,t);if(s=Ae(m.token),c=m.expires_at,f=m.grant,t){a=ne(M(r),"credential-recovery."+Je()+".json");try{Ke(a,JSON.stringify({...n,secret:s,expires_at:c})+`
21
+ `,{flag:"wx",mode:384})}catch{throw new Error("\u8BBE\u5907\u51ED\u636E\u5DF2\u9886\u53D6\u4F46\u65E0\u6CD5\u4FDD\u5B58\uFF1B\u8BF7\u7531\u6388\u6743\u8D26\u53F7\u5728\u51ED\u636E\u5217\u8868\u64A4\u9500\u8BE5\u8BBE\u5907\u6388\u6743\u540E\u91CD\u8BD5")}}}try{let m=await ge(n.auth_url,"/api/v1/auth/me",{signal:e.signal},s);if(!qe(s))throw new Error("\u6388\u6743\u672A\u8FD4\u56DE\u8D26\u53F7\u51ED\u636E");{let l=ut(m,s);if(t&&(l.credential_kind!=="agent_pat"||!ze(l,t)||!f||!Number.isFinite(Date.parse(String(f.created_at)))||Date.parse(l.expires_at)-Date.parse(String(f.created_at))>(e.expiresIn||30*86400)*1e3))throw new Error("\u8BBE\u5907\u6388\u6743\u7ED3\u679C\u8D85\u51FA\u672C\u6B21\u8BF7\u6C42\u4E0A\u9650");if(t&&(!f||f.id!==l.credential_id||f.account_id!==l.account_id||f.expires_at!==l.expires_at||!ze(l,f)||!ze(f,l)))throw new Error("\u8BBE\u5907\u51ED\u636E\u4E0E\u5F53\u524D\u8D26\u53F7\u8EAB\u4EFD\u4E0D\u4E00\u81F4");un({version:2,connection_id:Je(),...n,auth:e.auth,token:s,account_id:l.account_id,credential_id:l.credential_id,credential_kind:l.credential_kind,expires_at:l.expires_at,...W(l)},o,r)}}catch(m){throw a&&(e.notify?e.notify(`\u8BBE\u5907\u51ED\u636E\u5DF2\u9886\u53D6\uFF1B\u79C1\u6709\u6062\u590D\u6587\u4EF6\uFF1A${a}\u3002\u8FDE\u63A5\u672A\u5207\u6362\u3002\u8BF7\u6838\u9A8C\u6216\u64A4\u9500\u8BE5\u6388\u6743\u540E\u5220\u9664\u6B64\u6587\u4EF6\u3002`):process.stderr.write(`\u8BBE\u5907\u51ED\u636E\u5DF2\u9886\u53D6\uFF1B\u79C1\u6709\u6062\u590D\u6587\u4EF6\uFF1A${a}\u3002\u8FDE\u63A5\u672A\u5207\u6362\u3002\u8BF7\u6838\u9A8C\u6216\u64A4\u9500\u8BE5\u6388\u6743\u540E\u5220\u9664\u6B64\u6587\u4EF6\u3002
22
+ `)),m}return a&&Ie(a),ft(r)}async function mn(e,r,t,o){let n=r.notify||(c=>process.stderr.write(c+`
23
+ `)),i=await ge(e,"/api/v1/auth/device/requests",{method:"POST",signal:r.signal,body:{device_id:t,name:r.device||sn(),...o,expires_in_seconds:r.expiresIn}});if(!i?.device_code||!/^[A-Z2-9-]{5,24}$/.test(i.user_code)||typeof i.verification_path!="string"||!Number.isFinite(i.expires_in)||i.expires_in<=0)throw new Error("Agent Utopia \u8BBE\u5907\u6388\u6743\u54CD\u5E94\u65E0\u6548");let s=!1;try{let c=He(i.verification_path,!1);if(!/^\/device(?:\?|$)/.test(c))throw new Error("Agent Utopia \u6388\u6743\u9875\u9762\u8DEF\u5F84\u65E0\u6548");let a=e+c;n(`\u8BF7\u6253\u5F00 ${a}
24
+ \u786E\u8BA4\u8BBE\u5907\u7801\uFF1A${i.user_code}`),r.noOpen||fn(a);let f=AbortSignal.any([AbortSignal.timeout(Math.min(600,i.expires_in)*1e3),...r.signal?[r.signal]:[]]),m=Math.max(1,Math.min(60,i.interval||5));for(;;){await cn(m*1e3,void 0,{signal:f});try{let l=await ge(e,"/api/v1/auth/device/token",{method:"POST",signal:f,body:{device_code:i.device_code}}),p=Ae(l.secret);return s=!0,{token:p,expires_at:l.expires_at,grant:l}}catch(l){if(l instanceof pe&&l.code==="authorization_pending")continue;if(l instanceof pe&&l.code==="slow_down"){m=Math.min(60,Math.max(m+5,l.retryAfter));continue}throw l instanceof pe&&l.code==="invalid_grant"?new Error("Agent Utopia \u8BBE\u5907\u6388\u6743\u5DF2\u9886\u53D6\u6216\u5931\u6548\uFF1B\u8BF7\u91CD\u65B0\u8FD0\u884C connect\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u91CD\u65B0\u7533\u8BF7\u6388\u6743"):l}}}finally{s||await ge(e,"/api/v1/auth/device/cancel",{method:"POST",signal:AbortSignal.timeout(3e3),body:{device_code:i.device_code}}).catch(()=>{})}}async function We(e,r){let t=r==="Password"?1024:8192;if(e){if(process.stdin.isTTY)throw new Error("stdin \u51ED\u636E\u9009\u9879\u9700\u8981\u7BA1\u9053\u8F93\u5165");let s="";for await(let c of process.stdin)if(s+=c.toString(),Buffer.byteLength(s)>t+2)throw new Error("\u51ED\u636E\u8FC7\u957F");return s.replace(/\r?\n$/,"")}let o=process.stdin,n=process.stderr;if(!o.isTTY||!n.isTTY)throw new Error(`\u975E\u4EA4\u4E92\u8F93\u5165\u8BF7\u4F7F\u7528 --${r==="Password"?"password":"token"}-stdin`);let i=o.isRaw;return n.write(`${r}\uFF08\u9690\u85CF\u8F93\u5165\uFF09\uFF1A`),o.setRawMode(!0),o.resume(),new Promise((s,c)=>{let a="",f=!1,m=h=>{f||(f=!0,o.off("data",v),o.off("end",l),o.off("error",p),o.setRawMode(i),o.pause(),n.write(`
25
25
  `),h?c(h):s(a))},l=()=>m(new Error("\u51ED\u636E\u8F93\u5165\u5DF2\u7ED3\u675F")),p=()=>m(new Error("\u51ED\u636E\u8F93\u5165\u5931\u8D25")),v=h=>{for(let d of h.toString()){if(d===""||d==="")return m(new Error("\u5DF2\u53D6\u6D88\u767B\u5F55"));if(d==="\r"||d===`
26
- `)return m();if(d==="\x7F"||d==="\b"?a=[...a].slice(0,-1).join(""):d>=" "&&(a+=d),Buffer.byteLength(a)>t)return m(new Error("\u51ED\u636E\u8FC7\u957F"))}};n.on("data",v),n.once("end",l),n.once("error",p)})}V();var fn=["account_recovery","moderation_appeal","delivery_dispute","billing","technical"];function Zt(e,r){if(typeof e!="string"||!e.trim()||Buffer.from(e,"utf8").toString("utf8")!==e||Buffer.byteLength(e,"utf8")>8192||/[\0\r]/.test(e))throw new Error(r+"\u5FC5\u987B\u4E3A\u975E\u7A7A UTF-8 \u6587\u672C\uFF0C\u6700\u591A 8192 \u5B57\u8282\uFF0C\u4E0D\u542B NUL \u6216 CR");return e}async function Qt(e,r,t,n){if(e.profile.version!==2)throw new Error("support \u547D\u4EE4\u9700\u8981\u8D26\u53F7\u8FDE\u63A5\uFF1B\u7EC4\u7EC7\u8FDE\u63A5\u4E0D\u4F1A\u8F6C\u6362\u4E3A\u8D26\u53F7\u6743\u9650");let o=d=>typeof t[d]=="string"?t[d]:void 0,i=d=>{let _=o(d);if(!_)throw new Error("\u7F3A\u5C11 --"+d);return _},s=(...d)=>{if(Object.keys(t).some(_=>!["help","json",...d].includes(_)))throw new Error("support \u547D\u4EE4\u5305\u542B\u4E0D\u652F\u6301\u7684\u9009\u9879")},c=d=>{if(r.length!==d)throw new Error("support \u547D\u4EE4\u53C2\u6570\u6570\u91CF\u4E0D\u6B63\u786E\uFF1B\u8FD0\u884C aut --help")},a=()=>{if(!U(r[1]))throw new Error("\u5DE5\u5355 ID \u65E0\u6548");return"support/tickets/"+encodeURIComponent(r[1])},f=()=>{let d=i("expect-revision");if(d==="0")throw new Error("--expect-revision \u5FC5\u987B\u5927\u4E8E 0");return te(d,"--expect-revision")},m=()=>{let d=i("key");if(Buffer.byteLength(d)>128||d.trim()!==d||/[\0\r\n\t]/.test(d))throw new Error("--key \u5FC5\u987B\u662F\u6700\u591A 128 \u5B57\u8282\u7684\u7A33\u5B9A\u5E42\u7B49\u952E");return d},l=d=>Zt(C(d,8192,"\u5DE5\u5355\u8BF4\u660E","support_text_too_large"),"\u5DE5\u5355\u8BF4\u660E"),p=d=>console.log(JSON.stringify(d,null,2)),v=(d,_="GET",u,y)=>e.request("platform","/api/v1/"+d,{method:_,body:u,key:y,signal:n}),h=r[0];if(h==="ls"||h==="messages"){c(h==="ls"?1:2),s("cursor","limit");let d=h==="ls"?"support/tickets":a()+"/messages",_=new URLSearchParams;if(o("cursor")){if(!U(o("cursor")))throw new Error("\u5DE5\u5355 cursor \u65E0\u6548");_.set("cursor",o("cursor"))}if(o("limit")){let u=o("limit");if(!/^\d+$/.test(u)||Number(u)<1||Number(u)>50)throw new Error("--limit \u5FC5\u987B\u4E3A 1\u201350");_.set("limit",u)}p(await v(d+(_.size?"?"+_.toString():"")))}else if(h==="get")c(2),s(),p(await v(a()));else if(h==="create"){c(2),s("key");let d=m(),_=JSON.parse(C(r[1],64*1024,"\u5DE5\u5355 JSON","support_request_too_large"));if(!_||typeof _!="object"||Array.isArray(_))throw new Error("\u5DE5\u5355 JSON \u5FC5\u987B\u662F\u5BF9\u8C61");let u=_;if(Object.keys(u).some(y=>!["kind","subject_id","reason","draft"].includes(y))||!fn.includes(String(u.kind)))throw new Error("\u5DE5\u5355\u53EA\u5141\u8BB8 kind\u3001subject_id\u3001reason\u3001draft\uFF1Bprocessing_delay \u7531\u670D\u52A1\u7AEF\u81EA\u52A8\u5EFA\u7ACB");if(Zt(u.reason,"reason"),"draft"in u&&typeof u.draft!="boolean")throw new Error("draft \u5FC5\u987B\u662F\u5E03\u5C14\u503C");if(u.kind==="delivery_dispute"?!U(u.subject_id):"subject_id"in u&&u.subject_id!=="")throw new Error("delivery_dispute \u5FC5\u987B\u63D0\u4F9B\u5408\u4F5C subject_id\uFF1B\u5176\u4ED6\u7C7B\u522B\u6682\u4E0D\u63A5\u53D7\u4E1A\u52A1\u5BF9\u8C61\u5F15\u7528");p(await v("support/tickets","POST",u,d))}else if(["submit","reopen","message"].includes(h)){c(h==="submit"?2:3),s("key","expect-revision");let d=a()+"/"+(h==="message"?"messages":h),_=f(),u=m(),y={expected_revision:_,...h==="submit"?{}:h==="message"?{body_text:l(r[2])}:{reason:l(r[2])}};p(await v(d,"POST",y,u))}else throw new Error("\u672A\u77E5 support \u547D\u4EE4\uFF1B\u8FD0\u884C aut --help")}var pn=["security","transaction","collaboration","track","system"];function at(e,r){let t=typeof e.scopes=="string"?e.scopes.split(","):r;if(!t)throw new Error("\u7F3A\u5C11 --scopes");let n=e["resource-mode"];if(n!=="all_visible"&&n!=="selected_tracks")throw new Error("--resource-mode \u5FC5\u987B\u4E3A all_visible \u6216 selected_tracks");return Y({scopes:t,resource_mode:n,track_ids:typeof e["track-ids"]=="string"?e["track-ids"].split(","):void 0})}async function er(e,r,t,n,o){if(r==="support")return await Qt(e,t,n,o),!0;if(!["notifications","reauth","party"].includes(r)&&r!=="token")return!1;let i=u=>typeof n[u]=="string"?n[u]:void 0,s=u=>{let y=i(u);if(!y)throw new Error("\u7F3A\u5C11 --"+u);return y},c=(...u)=>{if(Object.keys(n).some(y=>!["help","json",...u].includes(y)))throw new Error("\u6B64\u8D26\u53F7\u547D\u4EE4\u5305\u542B\u4E0D\u652F\u6301\u7684\u9009\u9879")},a=u=>{if(t.length!==u)throw new Error("\u8D26\u53F7\u547D\u4EE4\u53C2\u6570\u6570\u91CF\u4E0D\u6B63\u786E\uFF1B\u8FD0\u884C aut --help")},f=()=>{let u=s("expect-revision");if(u==="0")throw new Error("--expect-revision \u5FC5\u987B\u5927\u4E8E 0");return te(u,"--expect-revision")},m=()=>{let u=i("limit");if(u!==void 0&&(!/^\d+$/.test(u)||Number(u)<1||Number(u)>50))throw new Error("--limit \u5FC5\u987B\u4E3A 1\u201350");return u},l=()=>{let u=s("category");if(!pn.includes(u))throw new Error("--category \u4E0D\u652F\u6301\u8BE5\u5206\u7C7B");return u},p=(u,y="GET",E,w)=>e.request(["notifications","party"].includes(r)?"platform":"auth","/api/v1/"+u,{method:y,body:E,key:w,signal:o}),v=u=>console.log(JSON.stringify(u,null,2)),h=()=>{if(!U(t[1]))throw new Error("\u8D26\u53F7\u5BF9\u8C61 ID \u65E0\u6548");return encodeURIComponent(t[1])},d=(u,y)=>u+(y.size?"?"+y.toString():"");if(r==="reauth"){if(a(0),c("password-stdin"),e.profile.credential_kind!=="account_session")throw new Error("\u8FD1\u671F\u5BC6\u7801\u6838\u9A8C\u4EC5\u9002\u7528\u4E8E\u4EBA\u7684\u8D26\u53F7\u4F1A\u8BDD\uFF1BAgent \u9700\u91CD\u65B0\u83B7\u53D6\u4EBA\u7684\u8BBE\u5907\u6388\u6743");return v(await p("auth/reauthentication","POST",{purpose:"credential_management",password:await Je(!!n["password-stdin"],"Password")})),!0}let _=t[0];if(r==="party"){if(_==="ls")a(1),c(),v(await p("parties"));else if(_==="get")a(2),c(),v(await p("parties/"+h()));else if(_==="delegations"){a(2),c("cursor","limit");let u=new URLSearchParams;i("cursor")&&u.set("cursor",i("cursor")),m()&&u.set("limit",m()),v(await p(d("parties/"+h()+"/delegations",u)))}else if(_==="delegate"){a(3),c("key","expect-revision");let u="parties/"+h()+"/delegations",y=s("key"),E=f(),w=JSON.parse(C(t[2],ae,"\u59D4\u6258 JSON \u6587\u4EF6","request_too_large"));if(!w||typeof w!="object"||Array.isArray(w))throw new Error("\u59D4\u6258 JSON \u5FC5\u987B\u4E3A\u5BF9\u8C61");let g=w;if(Object.keys(g).some(b=>!["account_id","capabilities","track_ids","expires_at"].includes(b))||!U(g.account_id))throw new Error("\u59D4\u6258\u53EA\u5141\u8BB8 account_id\u3001capabilities\u3001track_ids\u3001expires_at\uFF1B\u7248\u672C\u548C\u5E42\u7B49\u952E\u4F7F\u7528\u547D\u4EE4\u9009\u9879");if(!Array.isArray(g.capabilities)||!g.capabilities.length||g.capabilities.length>2||g.capabilities.some(b=>b!=="publish"&&b!=="share")||new Set(g.capabilities).size!==g.capabilities.length)throw new Error("\u59D4\u6258\u80FD\u529B\u53EA\u80FD\u662F\u552F\u4E00\u7684 publish/share\uFF0C\u4E0D\u80FD\u6388\u4E88\u786E\u8BA4\u5408\u4F5C\u3001\u4ED8\u6B3E\u6216\u6240\u6709\u6743\u80FD\u529B");if(!Array.isArray(g.track_ids)||g.track_ids.length>100||g.track_ids.some(b=>!U(b))||new Set(g.track_ids).size!==g.track_ids.length)throw new Error("track_ids \u5FC5\u987B\u662F\u6700\u591A 100 \u4E2A\u552F\u4E00 Track ID \u7684\u6570\u7EC4\uFF0C\u7A7A\u6570\u7EC4\u8868\u793A\u4E0D\u9650 Track");if("expires_at"in g&&(typeof g.expires_at!="string"||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$/.test(g.expires_at)||!Number.isFinite(Date.parse(g.expires_at))))throw new Error("expires_at \u5FC5\u987B\u662F\u5E26\u65F6\u533A\u7684 RFC3339 \u65F6\u95F4");v(await p(u,"POST",{...g,expected_revision:E},y))}else if(_==="revoke")a(2),c("key","expect-revision"),v(await p("party-delegations/"+h(),"DELETE",{expected_revision:f()},s("key")));else throw new Error("\u672A\u77E5 party \u547D\u4EE4\uFF1B\u8FD0\u884C aut --help");return!0}if(r==="token"){if(_==="ls"){a(1),c("cursor","limit","include-inactive");let u=new URLSearchParams;i("cursor")&&u.set("cursor",i("cursor")),m()&&u.set("limit",m()),n["include-inactive"]&&u.set("include_inactive","true"),v(await p(d("auth/tokens",u)))}else if(_==="new"){a(1),c("name","scopes","resource-mode","track-ids","expires-in","replace-token-id","expect-revision","key");let u=s("name"),y=s("key"),E=at(n),w=i("expires-in");if(w!==void 0&&(!/^\d+$/.test(w)||Number(w)<1||Number(w)>90*86400))throw new Error("--expires-in \u5FC5\u987B\u4E3A 1\u20137776000 \u79D2");let g=i("replace-token-id");if(!!g!=!!i("expect-revision")||g&&!U(g))throw new Error("\u66FF\u6362\u9700\u540C\u65F6\u6307\u5B9A --replace-token-id \u4E0E --expect-revision");let b=g?f():void 0;v(await p("auth/tokens","POST",{name:u,...E,...w?{expires_in_seconds:Number(w)}:{},...g?{replace_token_id:g,expected_revision:b}:{}},y))}else if(_==="revoke")a(2),c("key","expect-revision"),v(await p("auth/tokens/"+h(),"DELETE",{expected_revision:f()},s("key")));else throw new Error("\u672A\u77E5 token \u547D\u4EE4");return!0}if(_==="ls"||_==="count"){a(1),c("category","min-revision","fresh",..._==="ls"?["cursor","limit","unread-only"]:[]);let u=new URLSearchParams;i("category")&&u.set("category",l()),i("min-revision")!==void 0&&u.set("min_revision",B(i("min-revision"),"--min-revision")),n.fresh&&u.set("fresh","true"),_==="ls"&&(i("cursor")&&u.set("cursor",i("cursor")),m()&&u.set("limit",m()),n["unread-only"]&&u.set("unread_only","true")),v(await p(d(_==="ls"?"notifications":"notifications/unread-count",u)))}else if(_==="read")a(2),c(),v(await p("notifications/"+h()+"/read","POST"));else if(_==="read-through")a(1),c("seen-cursor"),v(await p("notifications/read-through","POST",{seen_cursor:s("seen-cursor")}));else if(_==="preferences")a(1),c(),v(await p("notification-preferences"));else if(_==="preference"){a(1),c("category","email-enabled","sms-enabled","expect-revision","key");let u={category:l(),expected_revision:f()};if(i("email-enabled")===void 0||i("sms-enabled")===void 0)throw new Error("\u504F\u597D\u66F4\u65B0\u9700\u540C\u65F6\u6307\u5B9A --email-enabled \u548C --sms-enabled\uFF08\u5B8C\u6574\u7684\u5DF2\u8BFB\u504F\u597D\u72B6\u6001\uFF09");for(let y of["email-enabled","sms-enabled"])if(i(y)!==void 0){if(!["true","false"].includes(i(y)))throw new Error("--"+y+" \u5FC5\u987B\u4E3A true \u6216 false");u[y.replace("-","_")]=i(y)==="true"}v(await p("notification-preferences","PUT",u,s("key")))}else throw new Error("\u672A\u77E5 notifications \u547D\u4EE4");return!0}V();lt();V();import{setTimeout as hn}from"node:timers/promises";function yn(e,r){let t=e;if(!t||t.track_id!==r||!Array.isArray(t.items)||typeof t.has_more!="boolean")throw new Error("\u66F4\u65B0\u5206\u9875\u54CD\u5E94\u65E0\u6548");let n=BigInt(B(String(t.through_seq),"through_seq"));if(t.has_more?typeof t.next_cursor!="string"||!t.next_cursor:typeof t.sync_cursor!="string"||!t.sync_cursor)throw new Error("\u66F4\u65B0\u5206\u9875\u7F3A\u5C11\u7EED\u8BFB\u6E38\u6807");let o=-1n;for(let i of t.items){let s=BigInt(B(String(i.seq),"seq"));if(typeof i.id!="string"||typeof i.kind!="string"||s<=o||s>n)throw new Error("\u66F4\u65B0\u987A\u5E8F\u65E0\u6548");o=s}return t}async function ar(e,r,t){if(t.after!==void 0&&t.cursor)throw new Error("--after-seq \u4E0E --cursor \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528");let n=Date.now()+t.timeoutMS,o=t.cursor;for(;;){e.assertActive(),t.signal?.throwIfAborted();let i=new URLSearchParams({limit:String(t.limit),max_bytes:String(ce(t.maxBytes))});o?i.set("cursor",o):i.set("after_seq",B(t.after||"0","after_seq"));let s=yn(await e.request("platform","/api/v1/tracks/"+encodeURIComponent(r)+"/updates?"+i,{signal:t.signal}),r);if(s.items.length)return{status:"updated",...s};let c=s.has_more?s.next_cursor:s.sync_cursor;if(s.has_more&&c===o)throw new Error("\u66F4\u65B0\u6E38\u6807\u672A\u63A8\u8FDB");if(o=c,Date.now()>=n)return{status:"timeout",...s};s.has_more||await hn(Math.min(t.intervalMS,n-Date.now()),void 0,{signal:t.signal})}}import{createHash as pt,randomUUID as _n}from"node:crypto";import{constants as dr,lstatSync as ur,readFileSync as bn,renameSync as kn,writeFileSync as lr,unlinkSync as fr}from"node:fs";import{open as pr,link as En,unlink as Sn}from"node:fs/promises";import{resolve as ft}from"node:path";import{setTimeout as mt}from"node:timers/promises";var Q=class extends Error{};async function cr(e,r,t,n,o,i=fetch){e.assertActive(),o?.throwIfAborted();let s=await e.request("platform",r,{signal:o});if(!s||s.transport!=="cdn"||s.method!=="GET"||s.range_supported!==!0||s.size_bytes!==t.size_bytes||s.sha256!==t.sha256||!/^[A-Za-z0-9_-]{1,64}$/.test(s.delivery_id))throw new Error("\u670D\u52A1\u7AEF\u4E0B\u8F7D\u8BB8\u53EF\u4E0E\u6587\u4EF6\u8EAB\u4EFD\u4E0D\u4E00\u81F4");let c=Date.parse(s.expires_at);if(!Number.isFinite(c)||c<=Date.now()||c>Date.now()+3e5)throw new Error("\u4E0B\u8F7D\u8BB8\u53EF\u5DF2\u8FC7\u671F\u6216\u6709\u6548\u671F\u65E0\u6548");let a;try{a=new URL(s.download_url)}catch{throw new Error("\u670D\u52A1\u7AEF\u4E0B\u8F7D\u5730\u5740\u65E0\u6548")}let f=[...a.searchParams.keys()],m=[e.profile.auth_url,e.profile.platform_url].map(p=>new URL(p).hostname);if(a.protocol!=="https:"||a.username||a.password||a.port||a.hash||m.includes(a.hostname)||!a.pathname.includes("/released/")||/[%\\]/.test(a.pathname)||s.download_url!==a.href||f.length!==2||a.searchParams.getAll("token").length!==1||!a.searchParams.get("token")||a.searchParams.get("token").length>8192||a.searchParams.getAll("delivery_id").length!==1||a.searchParams.get("delivery_id")!==s.delivery_id)throw new Error("\u670D\u52A1\u7AEF\u4E0B\u8F7D\u5730\u5740\u4E0D\u7B26\u5408\u72EC\u7ACB CDN \u534F\u8BAE");if(!Number.isSafeInteger(n)||n<0||n>=t.size_bytes)throw new Error("\u4E0B\u8F7D\u7EED\u4F20\u4F4D\u7F6E\u65E0\u6548");e.assertActive(),o?.throwIfAborted();let l;try{l=await i(a,{method:"GET",headers:n?{Range:"bytes="+n+"-"}:{},redirect:"error",credentials:"omit",referrerPolicy:"no-referrer",signal:AbortSignal.any([...o?[o]:[],AbortSignal.timeout(6e5)])})}catch{throw o?.throwIfAborted(),new Q("CDN \u8FDE\u63A5\u4E2D\u65AD\uFF1B\u6B63\u5728\u91CD\u65B0\u6821\u9A8C\u4E0B\u8F7D\u6743\u9650")}try{if(e.assertActive(),o?.throwIfAborted(),[403,408,429,500,502,503,504].includes(l.status))throw new Q("CDN \u4E0B\u8F7D\u6682\u4E0D\u53EF\u7528\uFF08HTTP "+l.status+"\uFF09");let p=l.headers.get("content-range");if(l.status!==(n?206:200)||!l.body||l.headers.get("content-length")!==String(t.size_bytes-n)||(l.headers.get("content-encoding")||"identity")!=="identity"||(n?p!=="bytes "+n+"-"+(t.size_bytes-1)+"/"+t.size_bytes:p!==null))throw new Error("CDN \u54CD\u5E94\u72B6\u6001\u3001\u957F\u5EA6\u6216 Range \u4E0D\u7B26\u5408\u4E0B\u8F7D\u8BB8\u53EF");return l}catch(p){throw await l.body?.cancel().catch(()=>{}),p}}var mr=200*1024*1024,xe=8*1024*1024,re=e=>/^[A-Za-z0-9_-]{1,64}$/.test(e),vn=e=>pt("sha256").update(e).digest("hex");function gr(e){let r;try{r=ur(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(!r.isFile()||r.isSymbolicLink()||r.size>65536)throw new Error("\u4E0A\u4F20\u8FDB\u5EA6\u6587\u4EF6\u5FC5\u987B\u662F\u4E0D\u8D85\u8FC7 64 KiB \u7684\u666E\u901A\u6587\u4EF6");let t=JSON.parse(bn(e,"utf8"));if(t.version!==2||!re(t.upload_id)||!Array.isArray(t.parts)||t.parts.length>25||t.parts.some((n,o)=>n.part_number!==o+1||typeof n.etag!="string"||n.etag.length>128))throw new Error("\u4E0A\u4F20\u8FDB\u5EA6\u6587\u4EF6\u65E0\u6548");return t}function Ye(e,r){gr(e);let t=e+"."+process.pid+".tmp";try{lr(t,JSON.stringify(r,null,2)+`
27
- `,{flag:"wx",mode:384}),kn(t,e)}finally{try{fr(t)}catch(n){if(n.code!=="ENOENT")throw n}}}function wr(e,r){if(!Number.isSafeInteger(e)||e<1e3||e>864e5||!Number.isSafeInteger(r)||r<1e3||r>6e4)throw new Error("\u8F6E\u8BE2 timeout \u4E3A 1\u201386400 \u79D2\uFF0Cinterval \u4E3A 1\u201360 \u79D2")}async function gt(e,r,t){if(!re(r))throw new Error("operation \u5FC5\u987B\u662F\u4E0D\u900F\u660E ID");wr(t.timeoutMS,t.intervalMS);let n=Date.now()+t.timeoutMS;for(;;){t.signal?.throwIfAborted();let o=await e.request("platform","/api/v1/operations/"+r,{signal:t.signal});if((o.id||o.operation_id)!==r)throw new Error("operation \u54CD\u5E94 ID \u4E0D\u5339\u914D");if(["succeeded","failed","cancelled","suspended","unknown"].includes(o.status))return o;if(!["pending","running","waiting","retry_pending"].includes(o.status))throw new Error("operation \u54CD\u5E94\u72B6\u6001\u65E0\u6548");if(Date.now()>=n)return{...o,status:"timeout"};await mt(Math.min(t.intervalMS,n-Date.now()),void 0,{signal:t.signal})}}async function xn(e,r,t,n=fetch){let o=new URL(e.url);if(o.protocol!=="https:"||o.username||o.password||o.hash||e.method!=="PUT"||e.size_bytes!==r.length)throw new Error("\u670D\u52A1\u7AEF\u8FD4\u56DE\u7684\u5206\u7247\u4E0A\u4F20\u76EE\u6807\u65E0\u6548");let i=e.required_headers??e.headers;if(!i||typeof i!="object")throw new Error("\u5206\u7247\u4E0A\u4F20\u7F3A\u5C11 required_headers");for(let c of Object.keys(i))if(!/^(content-length|content-type|content-md5|x-oss-[a-z0-9-]+)$/i.test(c))throw new Error("\u5206\u7247\u4E0A\u4F20\u5305\u542B\u4E0D\u5141\u8BB8\u7684\u8BF7\u6C42\u5934");let s;try{s=await n(o,{method:"PUT",body:new Uint8Array(r),headers:i,redirect:"error",credentials:"omit",signal:AbortSignal.any([...t?[t]:[],AbortSignal.timeout(6e4)])})}catch{throw new Error("OSS \u5206\u7247\u4E0A\u4F20\u4E2D\u65AD\uFF1B\u4FDD\u7559\u8FDB\u5EA6\u540E\u53EF\u7528\u540C\u4E00\u547D\u4EE4\u91CD\u8BD5")}try{if(!s.ok)throw new Error("OSS \u5206\u7247\u4E0A\u4F20\u5931\u8D25\uFF08HTTP "+s.status+"\uFF09\uFF1B\u5DF2\u4FDD\u7559\u8FDB\u5EA6");let c=s.headers.get("etag");if(!c||c.length>128||/[\r\n]/.test(c))throw new Error("OSS \u54CD\u5E94\u7F3A\u5C11\u6709\u6548 ETag\uFF1B\u5DF2\u4FDD\u7559\u8FDB\u5EA6");return c}finally{await s.body?.cancel()}}async function hr(e,r,t){if(wr(t.timeoutMS,t.intervalMS),(t.track?!re(t.track)||(t.subject||t.purpose||t.subjectType):!re(t.subject||"")||!["solution_attachment","collaboration_delivery"].includes(t.purpose||"")||!/^[a-z_]{1,32}$/.test(t.subjectType||""))||!t.key||Buffer.byteLength(t.key)>128)throw new Error("\u4E0A\u4F20 Track\u3001\u4E1A\u52A1\u76EE\u7684\u6216\u5E42\u7B49\u952E\u65E0\u6548");let n="/api/v1/"+(t.track?"content":"files")+"/uploads",o=ft(r),i=ft(t.state);if(o===i)throw new Error("\u8FDB\u5EA6\u6587\u4EF6\u4E0D\u80FD\u8986\u76D6\u4E0A\u4F20\u539F\u4EF6");let s=await pr(o,dr.O_RDONLY|(dr.O_NOFOLLOW||0)),c=i+".lock",a=!1;try{let f=await s.stat();if(!f.isFile()||f.size<=0||f.size>mr)throw new Error("\u4E0A\u4F20\u6587\u4EF6\u5FC5\u987B\u662F 1 \u5B57\u8282\u5230 200 MiB \u7684\u666E\u901A\u6587\u4EF6");let m=Buffer.allocUnsafe(Math.min(xe,f.size)),l=pt("sha256");for(let y=0;y<f.size;){t.signal?.throwIfAborted();let{bytesRead:E}=await s.read(m,0,Math.min(m.length,f.size-y),y);if(!E)throw new Error("\u8BA1\u7B97\u54C8\u5E0C\u65F6\u6587\u4EF6\u957F\u5EA6\u53D1\u751F\u53D8\u5316");l.update(m.subarray(0,E)),y+=E}let p=l.digest("hex"),v={...t.track?{track_id:t.track}:{purpose:t.purpose,subject_type:t.subjectType,subject_id:t.subject},media_type:t.mediaType,size_bytes:f.size,sha256:p},h=vn(JSON.stringify([n,t.key,v]));try{lr(c,String(process.pid),{flag:"wx",mode:384}),a=!0}catch{throw new Error("\u53E6\u4E00\u4E0A\u4F20\u8FDB\u7A0B\u6B63\u5728\u4F7F\u7528\u6B64\u8FDB\u5EA6\u6587\u4EF6\uFF1B\u8BF7\u5148\u6838\u5B9E\u8FDB\u7A0B\u72B6\u6001")}let d=gr(i);if(d&&(d.account_id!==e.profile.account_id||d.auth_url!==e.profile.auth_url||d.platform_url!==e.profile.platform_url||d.command_hash!==h||d.file!==o||d.sha256!==p||d.size_bytes!==f.size))throw new Error("\u4E0A\u4F20\u6587\u4EF6\u3001\u53C2\u6570\u6216\u8FDE\u63A5\u4E0E\u5DF2\u6709\u8FDB\u5EA6\u4E0D\u4E00\u81F4\uFF1B\u4E0D\u80FD\u590D\u7528\u6B64\u8FDB\u5EA6\u6587\u4EF6");if(!d){let y=await e.request("platform",n,{method:"POST",body:v,key:t.key,signal:t.signal});if(!re(y.id))throw new Error("\u521B\u5EFA\u4E0A\u4F20\u8FD4\u56DE\u65E0\u6548 ID");d={version:2,account_id:e.profile.account_id,auth_url:e.profile.auth_url,platform_url:e.profile.platform_url,file:o,sha256:p,size_bytes:f.size,command_hash:h,upload_id:y.id,parts:[]},Ye(i,d)}let _=Date.now()+t.timeoutMS,u;for(;;){if(u=await e.request("platform",n+"/"+d.upload_id,{signal:t.signal}),u.id!==d.upload_id)throw new Error("\u4E0A\u4F20\u54CD\u5E94 ID \u4E0D\u5339\u914D");if(u.upload_status!=="initializing")break;if(Date.now()>=_)return{status:"timeout",upload_id:d.upload_id,state_file:i};await mt(Math.min(t.intervalMS,_-Date.now()),void 0,{signal:t.signal})}if(u.upload_status==="awaiting_upload"){let y=Math.ceil(f.size/xe);for(let g=d.parts.length+1;g<=y;g++){e.assertActive(),t.signal?.throwIfAborted();let b=await s.stat();if(b.size!==f.size||b.mtimeMs!==f.mtimeMs||b.ino!==f.ino)throw new Error("\u539F\u6587\u4EF6\u5DF2\u6539\u53D8\uFF1B\u505C\u6B62\u4E0A\u4F20\uFF0C\u4E0D\u63D0\u4EA4\u5B8C\u6210\u6E05\u5355");let N=Math.min(xe,f.size-(g-1)*xe),j=0;for(;j<N;){let{bytesRead:x}=await s.read(m,j,N-j,(g-1)*xe+j);if(!x)throw new Error("\u4E0A\u4F20\u671F\u95F4\u6587\u4EF6\u957F\u5EA6\u53D1\u751F\u53D8\u5316");j+=x}let k=await e.request("platform",n+"/"+d.upload_id+"/part-urls",{method:"POST",body:{part_numbers:[g]},signal:t.signal});if(!Array.isArray(k.parts)||k.parts.length!==1||k.parts[0].part_number!==g)throw new Error("\u670D\u52A1\u7AEF\u5206\u7247\u7F16\u53F7\u4E0D\u5339\u914D");let S=await xn(k.parts[0],m.subarray(0,N),t.signal);e.assertActive(),d.parts.push({part_number:g,etag:S}),Ye(i,d)}let E=await s.stat();if(E.size!==f.size||E.mtimeMs!==f.mtimeMs)throw new Error("\u539F\u6587\u4EF6\u5728\u4E0A\u4F20\u671F\u95F4\u6539\u53D8\uFF1B\u672A\u63D0\u4EA4\u5B8C\u6210\u6E05\u5355");let w=await e.request("platform",n+"/"+d.upload_id+"/complete",{method:"POST",body:{parts:d.parts},signal:t.signal});if(!w.operation||!re(w.operation.id))throw new Error("\u5B8C\u6210\u63A5\u53E3\u672A\u8FD4\u56DE\u6709\u6548 operation");d.operation_id=w.operation.id,Ye(i,d)}else if(u.operation_id)d.operation_id=u.operation_id,Ye(i,d);else return{...u,status:u.upload_status,state_file:i};return t.wait&&d.operation_id?{...await gt(e,d.operation_id,t),upload_id:d.upload_id,state_file:i}:{status:"accepted",upload_id:d.upload_id,operation_id:d.operation_id,state_file:i}}finally{await s.close(),a&&fr(c)}}async function wt(e,r,t,n,o){if(!re(r)||!t)throw new Error("\u4E0B\u8F7D\u9700\u8981\u6587\u4EF6 ID \u548C --output \u8DEF\u5F84");let i="/api/v1/file-bundles/"+r+"/download",s;if(o){let p=o.query?"?"+o.query:"",h=(await e.request("platform","/api/v1/records/"+r+(o.version?"/versions/"+o.version:"")+p,{signal:n}))?.version;if(!h||h.record_id!==r||!/^[1-9][0-9]*$/.test(String(h.version))||o.version&&String(h.version)!==o.version)throw new Error("\u8D44\u6599\u7248\u672C\u4E0D\u53EF\u8BFB\u6216\u4E0D\u5339\u914D");s={id:r,file_status:"available",...h.asset},i="/api/v1/records/"+r+"/versions/"+h.version+"/download"+p}else s=await e.request("platform","/api/v1/file-bundles/"+r,{signal:n});if(s.id!==r||s.file_status!=="available"||!Number.isSafeInteger(s.size_bytes)||s.size_bytes<=0||s.size_bytes>mr||!/^[a-f0-9]{64}$/.test(s.sha256))throw new Error("\u6587\u4EF6\u672A\u5C31\u7EEA\u6216\u670D\u52A1\u7AEF\u6587\u4EF6\u5143\u6570\u636E\u65E0\u6548");let c=ft(t),a=c+"."+_n()+".part";try{throw ur(c),new Error("\u4E0B\u8F7D\u76EE\u6807\u5DF2\u5B58\u5728\uFF1B\u8BF7\u9009\u62E9\u65B0\u8DEF\u5F84")}catch(p){if(p.code!=="ENOENT")throw p}let f=await pr(a,"wx",384),m,l=0;try{let p=pt("sha256");for(let v=0;l<s.size_bytes;v++)try{m=await cr(e,i,s,l,n);let h=m.body.getReader();try{for(;;){n?.throwIfAborted(),e.assertActive();let d;try{d=await h.read()}catch{throw n?.throwIfAborted(),new Q("CDN \u6587\u4EF6\u6D41\u4E2D\u65AD")}if(d.done)break;let _=d.value;if(l+_.byteLength>s.size_bytes)throw new Error("\u4E0B\u8F7D\u8D85\u8FC7\u58F0\u660E\u5927\u5C0F");let u=0;for(;u<_.byteLength;){let y=await f.write(_,u,_.byteLength-u);if(!y.bytesWritten)throw new Error("\u65E0\u6CD5\u5199\u5165\u4E0B\u8F7D\u6587\u4EF6");u+=y.bytesWritten}p.update(_),l+=_.byteLength}}finally{await h.cancel().catch(()=>{}),h.releaseLock()}if(l!==s.size_bytes)throw new Q("\u4E0B\u8F7D\u4E0D\u5B8C\u6574")}catch(h){if(!(h instanceof Q)||v>=2)throw h;e.assertActive(),n?.throwIfAborted(),await mt(250*(v+1),void 0,{signal:n})}if(l!==s.size_bytes||p.digest("hex")!==s.sha256)throw new Error("\u4E0B\u8F7D\u4E0D\u5B8C\u6574\u6216 SHA256 \u6821\u9A8C\u5931\u8D25");return e.assertActive(),n?.throwIfAborted(),await f.sync(),await f.close(),await En(a,c),{id:r,status:"downloaded",output:c,size_bytes:l,sha256:s.sha256}}finally{await m?.body?.cancel().catch(()=>{}),await f.close(),await Sn(a)}}var An=`Agent Utopia CLI \u2014 \u8D26\u53F7\u3001\u4E3B\u4F53\u4E0E\u539F\u751F Track
26
+ `)return m();if(d==="\x7F"||d==="\b"?a=[...a].slice(0,-1).join(""):d>=" "&&(a+=d),Buffer.byteLength(a)>t)return m(new Error("\u51ED\u636E\u8FC7\u957F"))}};o.on("data",v),o.once("end",l),o.once("error",p)})}re();var gn=["account_recovery","moderation_appeal","delivery_dispute","billing","technical"];function rr(e,r){if(typeof e!="string"||!e.trim()||Buffer.from(e,"utf8").toString("utf8")!==e||Buffer.byteLength(e,"utf8")>8192||/[\0\r]/.test(e))throw new Error(r+"\u5FC5\u987B\u4E3A\u975E\u7A7A UTF-8 \u6587\u672C\uFF0C\u6700\u591A 8192 \u5B57\u8282\uFF0C\u4E0D\u542B NUL \u6216 CR");return e}async function nr(e,r,t,o){if(e.profile.version!==2)throw new Error("support \u547D\u4EE4\u9700\u8981\u8D26\u53F7\u8FDE\u63A5\uFF1B\u7EC4\u7EC7\u8FDE\u63A5\u4E0D\u4F1A\u8F6C\u6362\u4E3A\u8D26\u53F7\u6743\u9650");let n=d=>typeof t[d]=="string"?t[d]:void 0,i=d=>{let b=n(d);if(!b)throw new Error("\u7F3A\u5C11 --"+d);return b},s=(...d)=>{if(Object.keys(t).some(b=>!["help","json",...d].includes(b)))throw new Error("support \u547D\u4EE4\u5305\u542B\u4E0D\u652F\u6301\u7684\u9009\u9879")},c=d=>{if(r.length!==d)throw new Error("support \u547D\u4EE4\u53C2\u6570\u6570\u91CF\u4E0D\u6B63\u786E\uFF1B\u8FD0\u884C aut --help")},a=()=>{if(!D(r[1]))throw new Error("\u5DE5\u5355 ID \u65E0\u6548");return"support/tickets/"+encodeURIComponent(r[1])},f=()=>{let d=i("expect-revision");if(d==="0")throw new Error("--expect-revision \u5FC5\u987B\u5927\u4E8E 0");return te(d,"--expect-revision")},m=()=>{let d=i("key");if(Buffer.byteLength(d)>128||d.trim()!==d||/[\0\r\n\t]/.test(d))throw new Error("--key \u5FC5\u987B\u662F\u6700\u591A 128 \u5B57\u8282\u7684\u7A33\u5B9A\u5E42\u7B49\u952E");return d},l=d=>rr($(d,8192,"\u5DE5\u5355\u8BF4\u660E","support_text_too_large"),"\u5DE5\u5355\u8BF4\u660E"),p=d=>console.log(JSON.stringify(d,null,2)),v=(d,b="GET",u,_)=>e.request("platform","/api/v1/"+d,{method:b,body:u,key:_,signal:o}),h=r[0];if(h==="ls"||h==="messages"){c(h==="ls"?1:2),s("cursor","limit");let d=h==="ls"?"support/tickets":a()+"/messages",b=new URLSearchParams;if(n("cursor")){if(!D(n("cursor")))throw new Error("\u5DE5\u5355 cursor \u65E0\u6548");b.set("cursor",n("cursor"))}if(n("limit")){let u=n("limit");if(!/^\d+$/.test(u)||Number(u)<1||Number(u)>50)throw new Error("--limit \u5FC5\u987B\u4E3A 1\u201350");b.set("limit",u)}p(await v(d+(b.size?"?"+b.toString():"")))}else if(h==="get")c(2),s(),p(await v(a()));else if(h==="create"){c(2),s("key");let d=m(),b=JSON.parse($(r[1],64*1024,"\u5DE5\u5355 JSON","support_request_too_large"));if(!b||typeof b!="object"||Array.isArray(b))throw new Error("\u5DE5\u5355 JSON \u5FC5\u987B\u662F\u5BF9\u8C61");let u=b;if(Object.keys(u).some(_=>!["kind","subject_id","reason","draft"].includes(_))||!gn.includes(String(u.kind)))throw new Error("\u5DE5\u5355\u53EA\u5141\u8BB8 kind\u3001subject_id\u3001reason\u3001draft\uFF1Bprocessing_delay \u7531\u670D\u52A1\u7AEF\u81EA\u52A8\u5EFA\u7ACB");if(rr(u.reason,"reason"),"draft"in u&&typeof u.draft!="boolean")throw new Error("draft \u5FC5\u987B\u662F\u5E03\u5C14\u503C");if(u.kind==="delivery_dispute"?!D(u.subject_id):"subject_id"in u&&u.subject_id!=="")throw new Error("delivery_dispute \u5FC5\u987B\u63D0\u4F9B\u5408\u4F5C subject_id\uFF1B\u5176\u4ED6\u7C7B\u522B\u6682\u4E0D\u63A5\u53D7\u4E1A\u52A1\u5BF9\u8C61\u5F15\u7528");p(await v("support/tickets","POST",u,d))}else if(["submit","reopen","message"].includes(h)){c(h==="submit"?2:3),s("key","expect-revision");let d=a()+"/"+(h==="message"?"messages":h),b=f(),u=m(),_={expected_revision:b,...h==="submit"?{}:h==="message"?{body_text:l(r[2])}:{reason:l(r[2])}};p(await v(d,"POST",_,u))}else throw new Error("\u672A\u77E5 support \u547D\u4EE4\uFF1B\u8FD0\u884C aut --help")}var wn=["security","transaction","collaboration","track","system"];function pt(e,r){let t=typeof e.scopes=="string"?e.scopes.split(","):r;if(!t)throw new Error("\u7F3A\u5C11 --scopes");let o=e["resource-mode"];if(o!=="all_visible"&&o!=="selected_tracks")throw new Error("--resource-mode \u5FC5\u987B\u4E3A all_visible \u6216 selected_tracks");return W({scopes:t,resource_mode:o,track_ids:typeof e["track-ids"]=="string"?e["track-ids"].split(","):void 0})}async function or(e,r,t,o,n){if(r==="support")return await nr(e,t,o,n),!0;if(!["notifications","reauth","party"].includes(r)&&r!=="token")return!1;let i=u=>typeof o[u]=="string"?o[u]:void 0,s=u=>{let _=i(u);if(!_)throw new Error("\u7F3A\u5C11 --"+u);return _},c=(...u)=>{if(Object.keys(o).some(_=>!["help","json",...u].includes(_)))throw new Error("\u6B64\u8D26\u53F7\u547D\u4EE4\u5305\u542B\u4E0D\u652F\u6301\u7684\u9009\u9879")},a=u=>{if(t.length!==u)throw new Error("\u8D26\u53F7\u547D\u4EE4\u53C2\u6570\u6570\u91CF\u4E0D\u6B63\u786E\uFF1B\u8FD0\u884C aut --help")},f=()=>{let u=s("expect-revision");if(u==="0")throw new Error("--expect-revision \u5FC5\u987B\u5927\u4E8E 0");return te(u,"--expect-revision")},m=()=>{let u=i("limit");if(u!==void 0&&(!/^\d+$/.test(u)||Number(u)<1||Number(u)>50))throw new Error("--limit \u5FC5\u987B\u4E3A 1\u201350");return u},l=()=>{let u=s("category");if(!wn.includes(u))throw new Error("--category \u4E0D\u652F\u6301\u8BE5\u5206\u7C7B");return u},p=(u,_="GET",E,w)=>e.request(["notifications","party"].includes(r)?"platform":"auth","/api/v1/"+u,{method:_,body:E,key:w,signal:n}),v=u=>console.log(JSON.stringify(u,null,2)),h=()=>{if(!D(t[1]))throw new Error("\u8D26\u53F7\u5BF9\u8C61 ID \u65E0\u6548");return encodeURIComponent(t[1])},d=(u,_)=>u+(_.size?"?"+_.toString():"");if(r==="reauth"){if(a(0),c("password-stdin"),e.profile.credential_kind!=="account_session")throw new Error("\u8FD1\u671F\u5BC6\u7801\u6838\u9A8C\u4EC5\u9002\u7528\u4E8E\u4EBA\u7684\u8D26\u53F7\u4F1A\u8BDD\uFF1BAgent \u9700\u91CD\u65B0\u83B7\u53D6\u4EBA\u7684\u8BBE\u5907\u6388\u6743");return v(await p("auth/reauthentication","POST",{purpose:"credential_management",password:await We(!!o["password-stdin"],"Password")})),!0}let b=t[0];if(r==="party"){if(b==="ls")a(1),c(),v(await p("parties"));else if(b==="get")a(2),c(),v(await p("parties/"+h()));else if(b==="delegations"){a(2),c("cursor","limit");let u=new URLSearchParams;i("cursor")&&u.set("cursor",i("cursor")),m()&&u.set("limit",m()),v(await p(d("parties/"+h()+"/delegations",u)))}else if(b==="delegate"){a(3),c("key","expect-revision");let u="parties/"+h()+"/delegations",_=s("key"),E=f(),w=JSON.parse($(t[2],le,"\u59D4\u6258 JSON \u6587\u4EF6","request_too_large"));if(!w||typeof w!="object"||Array.isArray(w))throw new Error("\u59D4\u6258 JSON \u5FC5\u987B\u4E3A\u5BF9\u8C61");let g=w;if(Object.keys(g).some(k=>!["account_id","capabilities","track_ids","expires_at"].includes(k))||!D(g.account_id))throw new Error("\u59D4\u6258\u53EA\u5141\u8BB8 account_id\u3001capabilities\u3001track_ids\u3001expires_at\uFF1B\u7248\u672C\u548C\u5E42\u7B49\u952E\u4F7F\u7528\u547D\u4EE4\u9009\u9879");if(!Array.isArray(g.capabilities)||!g.capabilities.length||g.capabilities.length>2||g.capabilities.some(k=>k!=="publish"&&k!=="share")||new Set(g.capabilities).size!==g.capabilities.length)throw new Error("\u59D4\u6258\u80FD\u529B\u53EA\u80FD\u662F\u552F\u4E00\u7684 publish/share\uFF0C\u4E0D\u80FD\u6388\u4E88\u786E\u8BA4\u5408\u4F5C\u3001\u4ED8\u6B3E\u6216\u6240\u6709\u6743\u80FD\u529B");if(!Array.isArray(g.track_ids)||g.track_ids.length>100||g.track_ids.some(k=>!D(k))||new Set(g.track_ids).size!==g.track_ids.length)throw new Error("track_ids \u5FC5\u987B\u662F\u6700\u591A 100 \u4E2A\u552F\u4E00 Track ID \u7684\u6570\u7EC4\uFF0C\u7A7A\u6570\u7EC4\u8868\u793A\u4E0D\u9650 Track");if("expires_at"in g&&(typeof g.expires_at!="string"||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$/.test(g.expires_at)||!Number.isFinite(Date.parse(g.expires_at))))throw new Error("expires_at \u5FC5\u987B\u662F\u5E26\u65F6\u533A\u7684 RFC3339 \u65F6\u95F4");v(await p(u,"POST",{...g,expected_revision:E},_))}else if(b==="revoke")a(2),c("key","expect-revision"),v(await p("party-delegations/"+h(),"DELETE",{expected_revision:f()},s("key")));else throw new Error("\u672A\u77E5 party \u547D\u4EE4\uFF1B\u8FD0\u884C aut --help");return!0}if(r==="token"){if(b==="ls"){a(1),c("cursor","limit","include-inactive");let u=new URLSearchParams;i("cursor")&&u.set("cursor",i("cursor")),m()&&u.set("limit",m()),o["include-inactive"]&&u.set("include_inactive","true"),v(await p(d("auth/tokens",u)))}else if(b==="new"){a(1),c("name","scopes","resource-mode","track-ids","expires-in","replace-token-id","expect-revision","key");let u=s("name"),_=s("key"),E=pt(o),w=i("expires-in");if(w!==void 0&&(!/^\d+$/.test(w)||Number(w)<1||Number(w)>90*86400))throw new Error("--expires-in \u5FC5\u987B\u4E3A 1\u20137776000 \u79D2");let g=i("replace-token-id");if(!!g!=!!i("expect-revision")||g&&!D(g))throw new Error("\u66FF\u6362\u9700\u540C\u65F6\u6307\u5B9A --replace-token-id \u4E0E --expect-revision");let k=g?f():void 0;v(await p("auth/tokens","POST",{name:u,...E,...w?{expires_in_seconds:Number(w)}:{},...g?{replace_token_id:g,expected_revision:k}:{}},_))}else if(b==="revoke")a(2),c("key","expect-revision"),v(await p("auth/tokens/"+h(),"DELETE",{expected_revision:f()},s("key")));else throw new Error("\u672A\u77E5 token \u547D\u4EE4");return!0}if(b==="ls"||b==="count"){a(1),c("category","min-revision","fresh",...b==="ls"?["cursor","limit","unread-only"]:[]);let u=new URLSearchParams;i("category")&&u.set("category",l()),i("min-revision")!==void 0&&u.set("min_revision",B(i("min-revision"),"--min-revision")),o.fresh&&u.set("fresh","true"),b==="ls"&&(i("cursor")&&u.set("cursor",i("cursor")),m()&&u.set("limit",m()),o["unread-only"]&&u.set("unread_only","true")),v(await p(d(b==="ls"?"notifications":"notifications/unread-count",u)))}else if(b==="read")a(2),c(),v(await p("notifications/"+h()+"/read","POST"));else if(b==="read-through")a(1),c("seen-cursor"),v(await p("notifications/read-through","POST",{seen_cursor:s("seen-cursor")}));else if(b==="preferences")a(1),c(),v(await p("notification-preferences"));else if(b==="preference"){a(1),c("category","email-enabled","sms-enabled","expect-revision","key");let u={category:l(),expected_revision:f()};if(i("email-enabled")===void 0||i("sms-enabled")===void 0)throw new Error("\u504F\u597D\u66F4\u65B0\u9700\u540C\u65F6\u6307\u5B9A --email-enabled \u548C --sms-enabled\uFF08\u5B8C\u6574\u7684\u5DF2\u8BFB\u504F\u597D\u72B6\u6001\uFF09");for(let _ of["email-enabled","sms-enabled"])if(i(_)!==void 0){if(!["true","false"].includes(i(_)))throw new Error("--"+_+" \u5FC5\u987B\u4E3A true \u6216 false");u[_.replace("-","_")]=i(_)==="true"}v(await p("notification-preferences","PUT",u,s("key")))}else throw new Error("\u672A\u77E5 notifications \u547D\u4EE4");return!0}re();ht();re();import{setTimeout as bn}from"node:timers/promises";function kn(e,r){let t=e;if(!t||t.track_id!==r||!Array.isArray(t.items)||typeof t.has_more!="boolean")throw new Error("\u66F4\u65B0\u5206\u9875\u54CD\u5E94\u65E0\u6548");let o=BigInt(B(String(t.through_seq),"through_seq"));if(t.has_more?typeof t.next_cursor!="string"||!t.next_cursor:typeof t.sync_cursor!="string"||!t.sync_cursor)throw new Error("\u66F4\u65B0\u5206\u9875\u7F3A\u5C11\u7EED\u8BFB\u6E38\u6807");let n=-1n;for(let i of t.items){let s=BigInt(B(String(i.seq),"seq"));if(typeof i.id!="string"||typeof i.kind!="string"||s<=n||s>o)throw new Error("\u66F4\u65B0\u987A\u5E8F\u65E0\u6548");n=s}return t}async function lr(e,r,t){if(t.after!==void 0&&t.cursor)throw new Error("--after-seq \u4E0E --cursor \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528");let o=Date.now()+t.timeoutMS,n=t.cursor;for(;;){e.assertActive(),t.signal?.throwIfAborted();let i=new URLSearchParams({limit:String(t.limit),max_bytes:String(fe(t.maxBytes))});n?i.set("cursor",n):i.set("after_seq",B(t.after||"0","after_seq"));let s=kn(await e.request("platform","/api/v1/tracks/"+encodeURIComponent(r)+"/updates?"+i,{signal:t.signal}),r);if(s.items.length)return{status:"updated",...s};let c=s.has_more?s.next_cursor:s.sync_cursor;if(s.has_more&&c===n)throw new Error("\u66F4\u65B0\u6E38\u6807\u672A\u63A8\u8FDB");if(n=c,Date.now()>=o)return{status:"timeout",...s};s.has_more||await bn(Math.min(t.intervalMS,o-Date.now()),void 0,{signal:t.signal})}}import{createHash as _t,randomUUID as En}from"node:crypto";import{constants as pr,lstatSync as mr,readFileSync as Sn,renameSync as vn,writeFileSync as gr,unlinkSync as wr}from"node:fs";import{open as hr,link as xn,unlink as Nn}from"node:fs/promises";import{resolve as yt}from"node:path";import{setTimeout as bt}from"node:timers/promises";var oe=class extends Error{};async function fr(e,r,t,o,n,i=fetch){e.assertActive(),n?.throwIfAborted();let s=await e.request("platform",r,{signal:n});if(!s||s.transport!=="cdn"||s.method!=="GET"||s.range_supported!==!0||s.size_bytes!==t.size_bytes||s.sha256!==t.sha256||!/^[A-Za-z0-9_-]{1,64}$/.test(s.delivery_id))throw new Error("\u670D\u52A1\u7AEF\u4E0B\u8F7D\u8BB8\u53EF\u4E0E\u6587\u4EF6\u8EAB\u4EFD\u4E0D\u4E00\u81F4");let c=Date.parse(s.expires_at);if(!Number.isFinite(c)||c<=Date.now()||c>Date.now()+3e5)throw new Error("\u4E0B\u8F7D\u8BB8\u53EF\u5DF2\u8FC7\u671F\u6216\u6709\u6548\u671F\u65E0\u6548");let a;try{a=new URL(s.download_url)}catch{throw new Error("\u670D\u52A1\u7AEF\u4E0B\u8F7D\u5730\u5740\u65E0\u6548")}let f=[...a.searchParams.keys()],m=[e.profile.auth_url,e.profile.platform_url].map(p=>new URL(p).hostname);if(a.protocol!=="https:"||a.username||a.password||a.port||a.hash||m.includes(a.hostname)||!a.pathname.includes("/released/")||/[%\\]/.test(a.pathname)||s.download_url!==a.href||f.length!==2||a.searchParams.getAll("token").length!==1||!a.searchParams.get("token")||a.searchParams.get("token").length>8192||a.searchParams.getAll("delivery_id").length!==1||a.searchParams.get("delivery_id")!==s.delivery_id)throw new Error("\u670D\u52A1\u7AEF\u4E0B\u8F7D\u5730\u5740\u4E0D\u7B26\u5408\u72EC\u7ACB CDN \u534F\u8BAE");if(!Number.isSafeInteger(o)||o<0||o>=t.size_bytes)throw new Error("\u4E0B\u8F7D\u7EED\u4F20\u4F4D\u7F6E\u65E0\u6548");e.assertActive(),n?.throwIfAborted();let l;try{l=await i(a,{method:"GET",headers:o?{Range:"bytes="+o+"-"}:{},redirect:"error",credentials:"omit",referrerPolicy:"no-referrer",signal:AbortSignal.any([...n?[n]:[],AbortSignal.timeout(6e5)])})}catch{throw n?.throwIfAborted(),new oe("CDN \u8FDE\u63A5\u4E2D\u65AD\uFF1B\u6B63\u5728\u91CD\u65B0\u6821\u9A8C\u4E0B\u8F7D\u6743\u9650")}try{if(e.assertActive(),n?.throwIfAborted(),[403,408,429,500,502,503,504].includes(l.status))throw new oe("CDN \u4E0B\u8F7D\u6682\u4E0D\u53EF\u7528\uFF08HTTP "+l.status+"\uFF09");let p=l.headers.get("content-range");if(l.status!==(o?206:200)||!l.body||l.headers.get("content-length")!==String(t.size_bytes-o)||(l.headers.get("content-encoding")||"identity")!=="identity"||(o?p!=="bytes "+o+"-"+(t.size_bytes-1)+"/"+t.size_bytes:p!==null))throw new Error("CDN \u54CD\u5E94\u72B6\u6001\u3001\u957F\u5EA6\u6216 Range \u4E0D\u7B26\u5408\u4E0B\u8F7D\u8BB8\u53EF");return l}catch(p){throw await l.body?.cancel().catch(()=>{}),p}}var yr=200*1024*1024,Te=8*1024*1024,ae=e=>/^[A-Za-z0-9_-]{1,64}$/.test(e),An=e=>_t("sha256").update(e).digest("hex");function _r(e){let r;try{r=mr(e)}catch(o){if(o.code==="ENOENT")return;throw o}if(!r.isFile()||r.isSymbolicLink()||r.size>65536)throw new Error("\u4E0A\u4F20\u8FDB\u5EA6\u6587\u4EF6\u5FC5\u987B\u662F\u4E0D\u8D85\u8FC7 64 KiB \u7684\u666E\u901A\u6587\u4EF6");let t=JSON.parse(Sn(e,"utf8"));if(t.version!==2||!ae(t.upload_id)||!Array.isArray(t.parts)||t.parts.length>25||t.parts.some((o,n)=>o.part_number!==n+1||typeof o.etag!="string"||o.etag.length>128))throw new Error("\u4E0A\u4F20\u8FDB\u5EA6\u6587\u4EF6\u65E0\u6548");return t}function Ve(e,r){_r(e);let t=e+"."+process.pid+".tmp";try{gr(t,JSON.stringify(r,null,2)+`
27
+ `,{flag:"wx",mode:384}),vn(t,e)}finally{try{wr(t)}catch(o){if(o.code!=="ENOENT")throw o}}}function br(e,r){if(!Number.isSafeInteger(e)||e<1e3||e>864e5||!Number.isSafeInteger(r)||r<1e3||r>6e4)throw new Error("\u8F6E\u8BE2 timeout \u4E3A 1\u201386400 \u79D2\uFF0Cinterval \u4E3A 1\u201360 \u79D2")}async function kt(e,r,t){if(!ae(r))throw new Error("operation \u5FC5\u987B\u662F\u4E0D\u900F\u660E ID");br(t.timeoutMS,t.intervalMS);let o=Date.now()+t.timeoutMS;for(;;){t.signal?.throwIfAborted();let n=await e.request("platform","/api/v1/operations/"+r,{signal:t.signal});if((n.id||n.operation_id)!==r)throw new Error("operation \u54CD\u5E94 ID \u4E0D\u5339\u914D");if(["succeeded","failed","cancelled","suspended","unknown"].includes(n.status))return n;if(!["pending","running","waiting","retry_pending"].includes(n.status))throw new Error("operation \u54CD\u5E94\u72B6\u6001\u65E0\u6548");if(Date.now()>=o)return{...n,status:"timeout"};await bt(Math.min(t.intervalMS,o-Date.now()),void 0,{signal:t.signal})}}async function In(e,r,t,o=fetch){let n=new URL(e.url);if(n.protocol!=="https:"||n.username||n.password||n.hash||e.method!=="PUT"||e.size_bytes!==r.length)throw new Error("\u670D\u52A1\u7AEF\u8FD4\u56DE\u7684\u5206\u7247\u4E0A\u4F20\u76EE\u6807\u65E0\u6548");let i=e.required_headers??e.headers;if(!i||typeof i!="object")throw new Error("\u5206\u7247\u4E0A\u4F20\u7F3A\u5C11 required_headers");for(let c of Object.keys(i))if(!/^(content-length|content-type|content-md5|x-oss-[a-z0-9-]+)$/i.test(c))throw new Error("\u5206\u7247\u4E0A\u4F20\u5305\u542B\u4E0D\u5141\u8BB8\u7684\u8BF7\u6C42\u5934");let s;try{s=await o(n,{method:"PUT",body:new Uint8Array(r),headers:i,redirect:"error",credentials:"omit",signal:AbortSignal.any([...t?[t]:[],AbortSignal.timeout(6e4)])})}catch{throw new Error("OSS \u5206\u7247\u4E0A\u4F20\u4E2D\u65AD\uFF1B\u4FDD\u7559\u8FDB\u5EA6\u540E\u53EF\u7528\u540C\u4E00\u547D\u4EE4\u91CD\u8BD5")}try{if(!s.ok)throw new Error("OSS \u5206\u7247\u4E0A\u4F20\u5931\u8D25\uFF08HTTP "+s.status+"\uFF09\uFF1B\u5DF2\u4FDD\u7559\u8FDB\u5EA6");let c=s.headers.get("etag");if(!c||c.length>128||/[\r\n]/.test(c))throw new Error("OSS \u54CD\u5E94\u7F3A\u5C11\u6709\u6548 ETag\uFF1B\u5DF2\u4FDD\u7559\u8FDB\u5EA6");return c}finally{await s.body?.cancel()}}async function kr(e,r,t){if(br(t.timeoutMS,t.intervalMS),(t.track?!ae(t.track)||(t.subject||t.purpose||t.subjectType):!ae(t.subject||"")||!["solution_attachment","collaboration_delivery"].includes(t.purpose||"")||!/^[a-z_]{1,32}$/.test(t.subjectType||""))||!t.key||Buffer.byteLength(t.key)>128)throw new Error("\u4E0A\u4F20 Track\u3001\u4E1A\u52A1\u76EE\u7684\u6216\u5E42\u7B49\u952E\u65E0\u6548");let o="/api/v1/"+(t.track?"content":"files")+"/uploads",n=yt(r),i=yt(t.state);if(n===i)throw new Error("\u8FDB\u5EA6\u6587\u4EF6\u4E0D\u80FD\u8986\u76D6\u4E0A\u4F20\u539F\u4EF6");let s=await hr(n,pr.O_RDONLY|(pr.O_NOFOLLOW||0)),c=i+".lock",a=!1;try{let f=await s.stat();if(!f.isFile()||f.size<=0||f.size>yr)throw new Error("\u4E0A\u4F20\u6587\u4EF6\u5FC5\u987B\u662F 1 \u5B57\u8282\u5230 200 MiB \u7684\u666E\u901A\u6587\u4EF6");let m=Buffer.allocUnsafe(Math.min(Te,f.size)),l=_t("sha256");for(let _=0;_<f.size;){t.signal?.throwIfAborted();let{bytesRead:E}=await s.read(m,0,Math.min(m.length,f.size-_),_);if(!E)throw new Error("\u8BA1\u7B97\u54C8\u5E0C\u65F6\u6587\u4EF6\u957F\u5EA6\u53D1\u751F\u53D8\u5316");l.update(m.subarray(0,E)),_+=E}let p=l.digest("hex"),v={...t.track?{track_id:t.track}:{purpose:t.purpose,subject_type:t.subjectType,subject_id:t.subject},media_type:t.mediaType,size_bytes:f.size,sha256:p},h=An(JSON.stringify([o,t.key,v]));try{gr(c,String(process.pid),{flag:"wx",mode:384}),a=!0}catch{throw new Error("\u53E6\u4E00\u4E0A\u4F20\u8FDB\u7A0B\u6B63\u5728\u4F7F\u7528\u6B64\u8FDB\u5EA6\u6587\u4EF6\uFF1B\u8BF7\u5148\u6838\u5B9E\u8FDB\u7A0B\u72B6\u6001")}let d=_r(i);if(d&&(d.account_id!==e.profile.account_id||d.auth_url!==e.profile.auth_url||d.platform_url!==e.profile.platform_url||d.command_hash!==h||d.file!==n||d.sha256!==p||d.size_bytes!==f.size))throw new Error("\u4E0A\u4F20\u6587\u4EF6\u3001\u53C2\u6570\u6216\u8FDE\u63A5\u4E0E\u5DF2\u6709\u8FDB\u5EA6\u4E0D\u4E00\u81F4\uFF1B\u4E0D\u80FD\u590D\u7528\u6B64\u8FDB\u5EA6\u6587\u4EF6");if(!d){let _=await e.request("platform",o,{method:"POST",body:v,key:t.key,signal:t.signal});if(!ae(_.id))throw new Error("\u521B\u5EFA\u4E0A\u4F20\u8FD4\u56DE\u65E0\u6548 ID");d={version:2,account_id:e.profile.account_id,auth_url:e.profile.auth_url,platform_url:e.profile.platform_url,file:n,sha256:p,size_bytes:f.size,command_hash:h,upload_id:_.id,parts:[]},Ve(i,d)}let b=Date.now()+t.timeoutMS,u;for(;;){if(u=await e.request("platform",o+"/"+d.upload_id,{signal:t.signal}),u.id!==d.upload_id)throw new Error("\u4E0A\u4F20\u54CD\u5E94 ID \u4E0D\u5339\u914D");if(u.upload_status!=="initializing")break;if(Date.now()>=b)return{status:"timeout",upload_id:d.upload_id,state_file:i};await bt(Math.min(t.intervalMS,b-Date.now()),void 0,{signal:t.signal})}if(u.upload_status==="awaiting_upload"){let _=Math.ceil(f.size/Te);for(let g=d.parts.length+1;g<=_;g++){e.assertActive(),t.signal?.throwIfAborted();let k=await s.stat();if(k.size!==f.size||k.mtimeMs!==f.mtimeMs||k.ino!==f.ino)throw new Error("\u539F\u6587\u4EF6\u5DF2\u6539\u53D8\uFF1B\u505C\u6B62\u4E0A\u4F20\uFF0C\u4E0D\u63D0\u4EA4\u5B8C\u6210\u6E05\u5355");let N=Math.min(Te,f.size-(g-1)*Te),C=0;for(;C<N;){let{bytesRead:x}=await s.read(m,C,N-C,(g-1)*Te+C);if(!x)throw new Error("\u4E0A\u4F20\u671F\u95F4\u6587\u4EF6\u957F\u5EA6\u53D1\u751F\u53D8\u5316");C+=x}let y=await e.request("platform",o+"/"+d.upload_id+"/part-urls",{method:"POST",body:{part_numbers:[g]},signal:t.signal});if(!Array.isArray(y.parts)||y.parts.length!==1||y.parts[0].part_number!==g)throw new Error("\u670D\u52A1\u7AEF\u5206\u7247\u7F16\u53F7\u4E0D\u5339\u914D");let S=await In(y.parts[0],m.subarray(0,N),t.signal);e.assertActive(),d.parts.push({part_number:g,etag:S}),Ve(i,d)}let E=await s.stat();if(E.size!==f.size||E.mtimeMs!==f.mtimeMs)throw new Error("\u539F\u6587\u4EF6\u5728\u4E0A\u4F20\u671F\u95F4\u6539\u53D8\uFF1B\u672A\u63D0\u4EA4\u5B8C\u6210\u6E05\u5355");let w=await e.request("platform",o+"/"+d.upload_id+"/complete",{method:"POST",body:{parts:d.parts},signal:t.signal});if(!w.operation||!ae(w.operation.id))throw new Error("\u5B8C\u6210\u63A5\u53E3\u672A\u8FD4\u56DE\u6709\u6548 operation");d.operation_id=w.operation.id,Ve(i,d)}else if(u.operation_id)d.operation_id=u.operation_id,Ve(i,d);else return{...u,status:u.upload_status,state_file:i};return t.wait&&d.operation_id?{...await kt(e,d.operation_id,t),upload_id:d.upload_id,state_file:i}:{status:"accepted",upload_id:d.upload_id,operation_id:d.operation_id,state_file:i}}finally{await s.close(),a&&wr(c)}}async function Ze(e,r,t,o,n){if(!ae(r)||!t)throw new Error("\u4E0B\u8F7D\u9700\u8981\u6587\u4EF6 ID \u548C --output \u8DEF\u5F84");let i="/api/v1/file-bundles/"+r+"/download",s;if(n&&"entry"in n){let p="/api/v1/entries/"+encodeURIComponent(n.entry)+"/attachments/"+r,v=await e.request("platform",p,{signal:o});if(v.entry_id!==n.entry||v.attachment?.id!==r)throw new Error("\u9644\u4EF6\u4E0D\u5C5E\u4E8E\u6307\u5B9A Entry \u6216\u4E0D\u53EF\u8BFB");s={id:r,file_status:"available",...v.attachment.asset},i=p+"/download"}else if(n){let p=n.query?"?"+n.query:"",h=(await e.request("platform","/api/v1/records/"+r+(n.version?"/versions/"+n.version:"")+p,{signal:o}))?.version;if(!h||h.record_id!==r||!/^[1-9][0-9]*$/.test(String(h.version))||n.version&&String(h.version)!==n.version)throw new Error("\u8D44\u6599\u7248\u672C\u4E0D\u53EF\u8BFB\u6216\u4E0D\u5339\u914D");s={id:r,file_status:"available",...h.asset},i="/api/v1/records/"+r+"/versions/"+h.version+"/download"+p}else s=await e.request("platform","/api/v1/file-bundles/"+r,{signal:o});if(s.id!==r||s.file_status!=="available"||!Number.isSafeInteger(s.size_bytes)||s.size_bytes<=0||s.size_bytes>yr||!/^[a-f0-9]{64}$/.test(s.sha256))throw new Error("\u6587\u4EF6\u672A\u5C31\u7EEA\u6216\u670D\u52A1\u7AEF\u6587\u4EF6\u5143\u6570\u636E\u65E0\u6548");let c=yt(t),a=c+"."+En()+".part";try{throw mr(c),new Error("\u4E0B\u8F7D\u76EE\u6807\u5DF2\u5B58\u5728\uFF1B\u8BF7\u9009\u62E9\u65B0\u8DEF\u5F84")}catch(p){if(p.code!=="ENOENT")throw p}let f=await hr(a,"wx",384),m,l=0;try{let p=_t("sha256");for(let v=0;l<s.size_bytes;v++)try{m=await fr(e,i,s,l,o);let h=m.body.getReader();try{for(;;){o?.throwIfAborted(),e.assertActive();let d;try{d=await h.read()}catch{throw o?.throwIfAborted(),new oe("CDN \u6587\u4EF6\u6D41\u4E2D\u65AD")}if(d.done)break;let b=d.value;if(l+b.byteLength>s.size_bytes)throw new Error("\u4E0B\u8F7D\u8D85\u8FC7\u58F0\u660E\u5927\u5C0F");let u=0;for(;u<b.byteLength;){let _=await f.write(b,u,b.byteLength-u);if(!_.bytesWritten)throw new Error("\u65E0\u6CD5\u5199\u5165\u4E0B\u8F7D\u6587\u4EF6");u+=_.bytesWritten}p.update(b),l+=b.byteLength}}finally{await h.cancel().catch(()=>{}),h.releaseLock()}if(l!==s.size_bytes)throw new oe("\u4E0B\u8F7D\u4E0D\u5B8C\u6574")}catch(h){if(!(h instanceof oe)||v>=2)throw h;e.assertActive(),o?.throwIfAborted(),await bt(250*(v+1),void 0,{signal:o})}if(l!==s.size_bytes||p.digest("hex")!==s.sha256)throw new Error("\u4E0B\u8F7D\u4E0D\u5B8C\u6574\u6216 SHA256 \u6821\u9A8C\u5931\u8D25");return e.assertActive(),o?.throwIfAborted(),await f.sync(),await f.close(),await xn(a,c),{id:r,status:"downloaded",output:c,size_bytes:l,sha256:s.sha256}}finally{await m?.body?.cancel().catch(()=>{}),await f.close(),await Nn(a)}}var On=`Agent Utopia CLI \u2014 \u8D26\u53F7\u3001\u4E3B\u4F53\u4E0E\u539F\u751F Track
28
28
 
29
29
  \u8FDE\u63A5\uFF08\u540C\u4E00\u8D26\u53F7\u8BBF\u95EE\u4E0D\u540C\u4E3B\u4F53\u65E0\u9700\u91CD\u65B0\u767B\u5F55\uFF09
30
30
  aut connect GATEWAY [--device NAME] [--scopes SCOPES] [--resource-mode all_visible|selected_tracks]
31
31
  [--track-ids IDS] [--expires-in SECONDS] [--no-open]
32
32
  aut connect GATEWAY --auth token [--token-stdin]
33
33
  aut status | whoami | disconnect [--revoke]
34
- \u9ED8\u8BA4\u53EA\u8BFB account:read,track:read,notifications:read\uFF1B\u5199\u5165\u9700\u663E\u5F0F\u6388\u6743 track:write\u3002
34
+ \u9ED8\u8BA4\u7533\u8BF7\u5168\u90E8\u53EF\u59D4\u6258\u8D26\u53F7\u6743\u9650\uFF1B\u6D4F\u89C8\u5668\u786E\u8BA4\u540E\u751F\u6548\uFF0C\u53EF\u7528 --scopes \u7F29\u5C0F\u8303\u56F4\u3002
35
35
 
36
36
  Track\uFF08ID \u53EF\u7701\u7565\u65F6\u4F7F\u7528\u5F53\u524D\u9879\u76EE\u7ED1\u5B9A\uFF09
37
37
  aut track ls [--party PARTY_ID] [--status active|archived] [--q TEXT] [--cursor CURSOR] [--limit N]
@@ -43,7 +43,8 @@ Track\uFF08ID \u53EF\u7701\u7565\u65F6\u4F7F\u7528\u5F53\u524D\u9879\u76EE\u7ED1
43
43
  aut track read [ID] [--cursor CURSOR] [--limit N] [--max-bytes N] [--include-archived]
44
44
  aut track updates [ID] [--after-seq N|--before-seq N|--cursor CURSOR] [--limit N] [--max-bytes N]
45
45
  aut track records [ID] [--cursor CURSOR] [--limit N] [--max-bytes N] [--include-archived]
46
- aut track add [ID] FILE --key KEY \u8FFD\u52A0\u6587\u5B57\u8FDB\u5C55\uFF08\u6700\u591A 64 KiB\uFF09
46
+ aut track add [ID] FILE [--type KIND] [--record ID@VERSION] [--attach UPLOAD_ID=FILENAME] --key KEY
47
+ \u7C7B\u578B\uFF1Aprogress\u3001decision\u3001blocker\u3001checkpoint\u3001context\u3001summary\uFF1B\u5F15\u7528\u548C\u9644\u4EF6\u53EF\u91CD\u590D\u6307\u5B9A\u3002\u6B63\u6587\u6700\u591A 64 KiB\u3002
47
48
  aut track commit [ID] MANIFEST_JSON --key KEY \u539F\u5B50\u63D0\u4EA4\u8FDB\u5C55\u3001\u9644\u4EF6\u3001\u8D44\u6599\u53D8\u66F4
48
49
  aut track background [ID] [--version VERSION_ID]
49
50
  aut track background [ID] --file FILE --expect-version N --key KEY
@@ -59,12 +60,14 @@ Record / Entry
59
60
  aut record get ID [--version N] [--grant-id ID|--resource-id ID]
60
61
  aut record read ID --version N [--json]
61
62
  aut record versions ID [--cursor CURSOR] [--limit N] [--max-bytes N]
62
- aut record new --title TITLE --upload-id ID [--track TRACK_ID] [--filename NAME] [--text] --key KEY
63
- aut record update ID --upload-id ID [--text] --expect-version N --expect-revision N --key KEY
63
+ aut record new --title TITLE --upload-id ID [--track TRACK_ID] [--filename NAME] [--text] [--message-file FILE] [--type KIND] --key KEY
64
+ aut record update ID [--upload-id ID] [--text] [--filename NAME] [--title TITLE] [--message-file FILE] [--type KIND] --expect-version N --expect-revision N --key KEY
64
65
  aut record rename ID --title TITLE --expect-version N --expect-revision N --key KEY
65
66
  aut record archive|restore ID --expect-version N --expect-revision N --key KEY
66
67
  aut record download ID [--version N] [--grant-id ID|--resource-id ID] --output FILE
67
68
  aut entry get|read ID
69
+ aut entry attachment ENTRY_ID ATTACHMENT_ID
70
+ aut entry download ENTRY_ID ATTACHMENT_ID --output FILE
68
71
 
69
72
  \u6587\u4EF6\u4E0E\u5F02\u6B65\u64CD\u4F5C
70
73
  aut file upload FILE --track TRACK_ID --key KEY [--media-type MIME] [--state FILE] [--wait]
@@ -88,11 +91,11 @@ Record / Entry
88
91
  aut share revoke ID --expect-revision N --key KEY
89
92
  aut rollout \u67E5\u770B\u5F00\u653E\u80FD\u529B\u4E0E\u5C55\u793A\u5012\u8BA1\u65F6
90
93
  aut api METHOD /api/v1/PATH [--service auth|platform] [--body-file FILE] [--key KEY]
91
- aut skill install --agent codex|claude-code|agents [--scope user|project] [--dir DIR]
94
+ aut skill install [--agent codex|claude-code|agents] [--scope user|project] [--dir DIR]
92
95
  aut integrate codex|claude-code|agents [--dir DIR]
93
96
  aut self update [--check] [--json]
94
97
 
95
98
  \u7ED3\u679C\u9ED8\u8BA4 JSON\uFF1B\u6B63\u6587 read \u9ED8\u8BA4\u6587\u672C\u3002\u5206\u9875\u4FDD\u7559\u670D\u52A1\u7AEF cursor\uFF0C\u4E0D\u63A8\u65AD\u672A\u8BFB\u53D6\u5185\u5BB9\u3002
96
99
  \u6240\u6709\u4FEE\u6539\u4E0D\u81EA\u52A8\u91CD\u8BD5\uFF1B\u540C\u4E00\u6B21\u64CD\u4F5C\u4FDD\u6301\u539F --key \u548C\u8F93\u5165\uFF0C\u7248\u672C\u51B2\u7A81\u540E\u5148\u91CD\u65B0\u8BFB\u53D6\u3002
97
100
  \u4E0D\u63D0\u4F9B\u65E7\u7EC4\u7EC7\u767B\u5F55\u3001Focus\u3001Space\u3001\u65E7\u6807\u7B7E\u3001\u7EF4\u62A4\u6216\u7EC4\u7EC7 User \u547D\u4EE4\u3002
98
- `,In=["auth","auth-url","platform-url","device","scopes","resource-mode","track-ids","expires-in","name","title","goal","party","track","status","q","cursor","limit","max-bytes","after-seq","before-seq","version","expect-revision","expect-version","expect-content-revision","expect-grant-revision","key","dir","file","visibility","grant-id","resource-id","upload-id","filename","output","state","media-type","purpose","subject-type","subject","timeout","interval","service","body-file","replace-token-id","category","min-revision","seen-cursor","email-enabled","sms-enabled","before-id"],Tn=["help","json","token-stdin","no-open","revoke","replace","include-archived","wait","content","fresh","unread-only","include-inactive","password-stdin","text"],A=e=>console.log(JSON.stringify(e,null,2));function ge(e,r){if(e===void 0||e==="")throw new Error("\u7F3A\u5C11 "+r);return e}function L(e){if(!U(e))throw new Error("\u9700\u8981\u6709\u6548\u7684\u4E0D\u900F\u660E ID");return e}function Ne(e,r,t,n){if(!e||!/^\d+$/.test(e)||!Number.isSafeInteger(Number(e))||Number(e)<t||Number(e)>n)throw new Error(r+" \u6570\u503C\u8303\u56F4\u65E0\u6548");return Number(e)}function Ae(e){let r=JSON.parse(C(e,ae,"JSON \u6587\u4EF6"),(t,n,o)=>typeof n=="number"&&!Number.isSafeInteger(n)&&Number.isInteger(n)?te(o?.source,"JSON integer"):n);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("\u9700\u8981 JSON \u5BF9\u8C61");return r}function Ke(e,r){if(Object.keys(e).some(t=>!r.includes(t)))throw new Error("JSON \u5305\u542B\u672A\u77E5\u5B57\u6BB5");return e}async function yr(e){let{values:r,positionals:t}=Nn({args:e,allowPositionals:!0,strict:!0,options:Object.fromEntries([...In.map(E=>[E,{type:"string"}]),...Tn.map(E=>[E,{type:"boolean"}])])}),n=r,o=E=>typeof n[E]=="string"?n[E]:void 0,i=(...E)=>{if(Object.keys(n).some(w=>!["help","json",...E].includes(w)))throw new Error("\u6B64\u547D\u4EE4\u5305\u542B\u4E0D\u652F\u6301\u7684\u9009\u9879\uFF1B\u8FD0\u884C aut --help")},s=(E,w,g=w)=>{if(E.length<w||E.length>g)throw new Error("\u53C2\u6570\u6570\u91CF\u4E0D\u6B63\u786E\uFF1B\u8FD0\u884C aut --help")},c=(E="expect-revision",w=!1)=>{let g=B(o(E),"--"+E);if(!w&&g==="0")throw new Error("--"+E+" \u5FC5\u987B\u5927\u4E8E 0");return te(g,E)},a=()=>ge(o("key"),"--key"),f=(E,w={})=>{let g=new URLSearchParams;for(let b of E){let N=o(b);N!==void 0&&(b==="limit"&&Ne(N,b,1,50),b==="max-bytes"&&ce(N),["after-seq","before-seq"].includes(b)&&B(N,b),g.set(w[b]||b.replaceAll("-","_"),N))}return E.includes("include-archived")&&n["include-archived"]&&g.set("include_archived","true"),g},m=(E,w,g={})=>{let b=f(w,g);return E+(b.size?"?"+b:"")},l=["cursor","limit","max-bytes"],p=["grant-id","resource-id"],v=()=>{if(o("grant-id")&&o("resource-id"))throw new Error("grant-id \u4E0E resource-id \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528");return f(p)},[h="help",...d]=t;if(h==="team")throw new Error("\u65E7 team \u547D\u4EE4\u5DF2\u79FB\u9664\uFF1B\u76F4\u63A5\u4F7F\u7528 aut \u547D\u4EE4");if(n.help||h==="help"){console.log(An);return}if(h==="status"){i(),s(d,0),A(st());return}if(!["connect","disconnect","whoami","track","record","entry","wait","file","operation","party","token","reauth","notifications","support","share","rollout","api"].includes(h))throw new Error("\u672A\u77E5\u547D\u4EE4\uFF1B\u5F53\u524D\u4EC5\u63D0\u4F9B Agent Utopia \u8D26\u53F7\u63A5\u53E3\uFF0C\u8FD0\u884C aut --help");let u=new AbortController,y=()=>u.abort(new Error("\u5DF2\u53D6\u6D88\u64CD\u4F5C"));process.once("SIGINT",y),process.once("SIGTERM",y);try{if(h==="connect"){i("auth","auth-url","platform-url","device","scopes","resource-mode","track-ids","expires-in","no-open","token-stdin"),s(d,0,1);let x=o("auth")||"browser";if(!["browser","token"].includes(x))throw new Error("connect \u4EC5\u652F\u6301 browser \u6216 token \u8D26\u53F7\u6388\u6743");if(x==="browser"&&n["token-stdin"]||x==="token"&&["device","scopes","resource-mode","track-ids","expires-in","no-open"].some(O=>n[O]!==void 0))throw new Error("\u6388\u6743\u9009\u9879\u4E0D\u5339\u914D");let T=x==="browser"?at({...n,"resource-mode":o("resource-mode")||"all_visible"},De):void 0;A(await Vt({gateway:d[0],authURL:o("auth-url"),platformURL:o("platform-url"),auth:x,device:o("device"),scopes:T?.scopes,resourceMode:T?.resource_mode,trackIDs:T?.track_ids,expiresIn:o("expires-in")?Ne(o("expires-in"),"expires-in",1,7776e3):void 0,noOpen:!!n["no-open"],secret:x==="token"?await Je(!!n["token-stdin"],"Token"):void 0,signal:u.signal}));return}let E=new ze;if(await er(E,h,d,n,u.signal))return;let w=(x,T="GET",O,q,oe="platform")=>E.request(oe,x,{method:T,body:O,key:q,signal:u.signal}),g=x=>L(x||ir(E)),b=x=>"/api/v1/tracks/"+encodeURIComponent(g(x)),N=()=>({timeoutMS:Ne(o("timeout")||"300","timeout",1,86400)*1e3,intervalMS:Ne(o("interval")||"2","interval",1,60)*1e3,signal:u.signal}),j=x=>{A(x);let T=x?.status;T==="timeout"?process.exitCode=2:["failed","cancelled","suspended","unknown"].includes(T||"")&&(process.exitCode=1)};if(h==="whoami"){i(),s(d,0),A(await w("/api/v1/auth/me","GET",void 0,void 0,"auth"));return}if(h==="disconnect"){i("revoke"),s(d,0),A(await E.disconnect(!!n.revoke));return}if(h==="rollout"){i(),s(d,0),A(await w("/api/v1/utopia-rollout"));return}if(h==="wait"){i("after-seq","cursor","limit","max-bytes","timeout","interval"),s(d,0,1),j(await ar(E,g(d[0]),{...N(),after:o("after-seq"),cursor:o("cursor"),limit:Ne(o("limit")||"20","limit",1,50),maxBytes:ce(o("max-bytes"))}));return}let[k,...S]=d;if(h==="track"){if(k==="ls"){i("party","status","q","cursor","limit"),s(S,0),A(await w(m("/api/v1/tracks",["party","status","q","cursor","limit"],{party:"owner_party_id"})));return}if(k==="new"){i("title","goal","party","key"),s(S,0),A(await w("/api/v1/tracks","POST",{title:ge(o("title"),"--title"),...o("goal")!==void 0?{goal:o("goal")}:{},...o("party")?{owner_party_id:L(o("party"))}:{}},a()));return}if(k==="bind"){i("dir","replace"),s(S,1),A(await sr(E,L(S[0]),o("dir"),!!n.replace));return}if(["add","commit","handoff","grant","revoke"].includes(k)){i("key",...k==="handoff"?["expect-content-revision"]:k==="grant"?["expect-revision"]:k==="revoke"?["expect-revision","expect-grant-revision"]:[]),s(S,1,2);let T=b(S.length===2?S[0]:void 0),O=S.at(-1);if(k==="add"){j(await w(T+"/content-commits","POST",{message:{text:C(O,64*1024)}},a()));return}if(k==="commit"){j(await w(T+"/content-commits","POST",Ke(Ae(O),["message","attachments","record_changes","record_refs"]),a()));return}if(k==="handoff"){A(await w(T+"/handoffs","POST",{spec:Ke(Ae(O),["goal","inputs","outputs","acceptance_criteria"]),...o("expect-content-revision")!==void 0?{expected_content_revision:c("expect-content-revision",!0)}:{}},a()));return}if(k==="grant"){A(await w(T+"/grants","POST",{...Ke(Ae(O),["subject_kind","subject_id","role","expires_at"]),expected_revision:c()},a()));return}A(await w(T+"/grants/"+encodeURIComponent(L(O)),"DELETE",{expected_revision:c(),expected_grant_revision:c("expect-grant-revision")},a()));return}if(s(S,0,1),k==="get"||k==="access"){i(),A(await w(b(S[0])+(k==="access"?"/access":"")));return}if(k==="update"){if(i("title","goal","expect-revision","key"),o("title")===void 0&&o("goal")===void 0)throw new Error("\u81F3\u5C11\u63D0\u4F9B title \u6216 goal");A(await w(b(S[0]),"PATCH",{expected_revision:c(),...o("title")!==void 0?{title:o("title")}:{},...o("goal")!==void 0?{goal:o("goal")}:{}},a()));return}if(k==="archive"||k==="restore"){i("expect-revision","key"),A(await w(b(S[0])+"/state","POST",{status:k==="archive"?"archived":"active",expected_revision:c()},a()));return}if(k==="visibility"){if(i("visibility","expect-revision","key"),!["restricted","all_members"].includes(o("visibility")||""))throw new Error("visibility \u65E0\u6548");A(await w(b(S[0])+"/visibility","PUT",{organization_visibility:o("visibility"),expected_revision:c()},a()));return}if(k==="grants"){i("cursor","limit"),A(await w(m(b(S[0])+"/grants",["cursor","limit"])));return}if(k==="read"||k==="records"){i(...l,"include-archived"),A(await w(m(b(S[0])+(k==="read"?"/context":"/records"),[...l,"include-archived"])));return}if(k==="updates"){if(i(...l,"after-seq","before-seq",...p),["cursor","after-seq","before-seq"].filter(x=>o(x)!==void 0).length>1)throw new Error("cursor\u3001after-seq\u3001before-seq \u4E92\u65A5");v(),A(await w(m(b(S[0])+"/updates",[...l,"after-seq","before-seq",...p])));return}if(k==="background"){o("file")?(i("file","expect-version","key"),A(await w(b(S[0])+"/background-versions","POST",{body_text:C(o("file"),64*1024),expected_version:c("expect-version",!0)},a()))):(i("version"),A(await w(b(S[0])+(o("version")?"/background-versions/"+encodeURIComponent(L(o("version"))):"/background"))));return}throw new Error("\u672A\u77E5 track \u64CD\u4F5C")}if(h==="record"){if(k==="ls"){i(...l,"party","track","q","include-archived"),s(S,0),A(await w(m("/api/v1/records",[...l,"party","track","q","include-archived"],{party:"owner_party_id",track:"track_id"})));return}if(k==="new"){i("track","title","upload-id","filename","key","text"),s(S,0),j(await w(b(o("track"))+"/content-commits","POST",{...n.text?{message:{source:{upload_id:L(o("upload-id"))}}}:{},record_changes:[{action:"create",client_ref:"record",title:ge(o("title"),"--title"),source:{upload_id:L(o("upload-id"))},...o("filename")?{filename:o("filename")}:{}}]},a()));return}s(S,1);let x=L(S[0]),T="/api/v1/records/"+encodeURIComponent(x);if(k==="get"){i("version",...p),v();let O=o("version")?"/versions/"+B(o("version"),"version"):"";A(await w(m(T+O,p)));return}if(k==="versions"){i(...l),A(await w(m(T+"/versions",l)));return}if(k==="read"){i("version");let O=await w(T+"/versions/"+B(o("version"),"version")+"/body");if(n.json)A(O);else{if(typeof O.body_text!="string")throw new Error("\u6B63\u6587\u672A\u63D0\u4F9B");process.stdout.write(O.body_text)}return}if(k==="download"){i("version","output",...p);let O=v();A(await wt(E,x,ge(o("output"),"--output"),u.signal,{record:!0,version:o("version")?B(o("version"),"version"):void 0,query:O.toString()}));return}if(["update","rename","archive","restore"].includes(k)){i("expect-revision","expect-version","key",...k==="update"?["upload-id","text"]:k==="rename"?["title"]:[]);let O={action:k,record_id:x,expected_revision:c(),expected_version:c("expect-version"),...k==="update"?{source:{upload_id:L(o("upload-id"))}}:k==="rename"?{title:ge(o("title"),"--title")}:{}},q=await w(T);j(await w(b(L(q.track_id))+"/content-commits","POST",{...n.text?{message:{source:{upload_id:L(o("upload-id"))}}}:{},record_changes:[O]},a()));return}throw new Error("\u672A\u77E5 record \u64CD\u4F5C")}if(h==="entry"){if(i(),s(S,1),!["get","read"].includes(k))throw new Error("\u672A\u77E5 entry \u64CD\u4F5C");let x=await w("/api/v1/entries/"+encodeURIComponent(L(S[0]))+(k==="read"?"/body":""));if(k==="read"&&!n.json){if(typeof x.body_text!="string")throw new Error("\u6B63\u6587\u672A\u63D0\u4F9B");process.stdout.write(x.body_text)}else A(x);return}if(h==="file"){if(k==="upload"){if(i("track","purpose","subject-type","subject","key","media-type","state","wait","timeout","interval"),s(S,1),o("track")&&["purpose","subject-type","subject"].some(T=>o(T)!==void 0))throw new Error("Track \u4E0A\u4F20\u4ECE Track \u63A8\u5BFC\u5F52\u5C5E\uFF0C\u4E0D\u63A5\u53D7\u5176\u4ED6\u4E3B\u4F53\u53C2\u6570");j(await hr(E,S[0],{track:o("track")?L(o("track")):void 0,purpose:o("purpose"),subjectType:o("subject-type"),subject:o("subject"),key:a(),mediaType:o("media-type")||(/\.md$/i.test(S[0])?"text/markdown":/\.txt$/i.test(S[0])?"text/plain":"application/zip"),state:o("state")||S[0]+".aut-upload.json",wait:!!n.wait,...N()}));return}s(S,1);let x=L(S[0]);if(k==="download"){i("output"),A(await wt(E,x,ge(o("output"),"--output"),u.signal));return}if(k==="get"){i(),A(await w("/api/v1/file-bundles/"+encodeURIComponent(x)));return}if(k==="status"||k==="abort"){i("content"),A(await w("/api/v1/"+(n.content?"content":"files")+"/uploads/"+encodeURIComponent(x),k==="abort"?"DELETE":"GET"));return}throw new Error("\u672A\u77E5 file \u64CD\u4F5C")}if(h==="operation"){if(s(S,1),k==="get"){i(),A(await w("/api/v1/operations/"+encodeURIComponent(L(S[0]))));return}if(k==="wait"){i("timeout","interval"),j(await gt(E,L(S[0]),N()));return}throw new Error("\u672A\u77E5 operation \u64CD\u4F5C")}if(h==="share"){if(k==="ls"){i("track","before-id","limit"),s(S,0),A(await w(m("/api/v1/content-shares",["track","before-id","limit"],{track:"track_id"})));return}if(k==="new"){i("key"),s(S,1),A(await w("/api/v1/content-shares","POST",Ke(Ae(S[0]),["object_type","object_id","expected_revision","version","through_seq","ttl_seconds","secret"]),a()));return}if(k==="revoke"){i("expect-revision","key"),s(S,1),A(await w("/api/v1/content-shares/"+encodeURIComponent(L(S[0])),"DELETE",{expected_revision:c()},a()));return}throw new Error("\u672A\u77E5 share \u64CD\u4F5C")}if(h==="api"){i("service","body-file","key"),s(d,2);let x=d[0].toUpperCase(),T=Me(d[1]),O=o("service")||"platform";if(!["GET","POST","PUT","PATCH","DELETE"].includes(x)||!["auth","platform"].includes(O))throw new Error("API \u65B9\u6CD5\u6216 service \u65E0\u6548");let q=T.split("?")[0];if(!(O==="auth"?/^\/api\/v1\/(?:auth\/(?:me|tokens|reauthentication)|accounts\/me|me)(?:\/|$)/:/^\/api\/v1\/(?:tracks|records|entries|content|content-shares|operations|parties|party-delegations|notifications|notification-preferences|files|file-bundles|utopia-rollout|me|tasks|solutions|collaborations|support|discover|reputation)(?:\/|$)/).test(q))throw new Error("\u6B64\u8DEF\u5F84\u4E0D\u5728 Agent Utopia \u8D26\u53F7\u4E1A\u52A1 API \u8303\u56F4");if(x==="GET"&&o("body-file"))throw new Error("GET \u4E0D\u63A5\u53D7\u8BF7\u6C42\u4F53");A(await w(T,x,o("body-file")?Ae(o("body-file")):void 0,o("key"),O));return}throw new Error("\u672A\u77E5\u64CD\u4F5C\uFF1B\u8FD0\u884C aut --help")}finally{process.off("SIGINT",y),process.off("SIGTERM",y)}}var Xe=e=>console.log(typeof e=="string"?e:JSON.stringify(e,null,2));async function Mn(){let e=process.argv.slice(2),r=e[0];if(e.length===1&&r==="--version"){Xe(X);return}if(e.includes("--check")&&r!=="self")throw new Error("--check \u4EC5\u7528\u4E8E aut self update --check\u3002");if(r==="self"){let t="\u7528\u6CD5\uFF1Aaut self update [--check] [--json]\uFF1B\u4E0D\u63A5\u53D7\u5176\u4ED6\u53C2\u6570\u6216\u9009\u9879\u3002",n;try{n=St({args:e.slice(1),allowPositionals:!0,options:{check:{type:"boolean"},json:{type:"boolean"}}})}catch{throw new Error(t)}if(n.positionals.length!==1||n.positionals[0]!=="update")throw new Error(t);let o=await Dt({packageName:"aut-cli",currentVersion:X,moduleUrl:import.meta.url,check:!!n.values.check});Xe(n.values.json?o:jt(o));return}if(r==="skill"){let{installSkill:t}=await Promise.resolve().then(()=>(bt(),xr)),{values:n,positionals:o}=St({args:e.slice(1),allowPositionals:!0,options:{agent:{type:"string"},scope:{type:"string"},dir:{type:"string"},force:{type:"boolean"},json:{type:"boolean"}}});if(o.length!==1||o[0]!=="install"||!n.agent)throw new Error("\u7528\u6CD5\uFF1Aaut skill install --agent codex|claude-code|agents [--scope user|project] [--dir PROJECT]");Xe(t({agent:n.agent,scope:n.scope,directory:n.dir,force:!!n.force}));return}if(r==="integrate"){let{installIntegration:t}=await Promise.resolve().then(()=>(yt(),Er)),{values:n,positionals:o}=St({args:e.slice(1),allowPositionals:!0,options:{dir:{type:"string"},json:{type:"boolean"}}});if(o.length!==1)throw new Error("\u7528\u6CD5\uFF1Aaut integrate codex|claude-code|agents [--dir PROJECT]");Xe(t(o[0],n.dir||"."));return}await yr(e)}Mn().catch(e=>{console.error("aut: "+e.message),process.exitCode=1});
101
+ `,Er=["progress","decision","blocker","checkpoint","context","summary"];function Qe(e){if(e===void 0)return"progress";if(typeof e!="string"||!Er.includes(e))throw new Error("--type/kind \u5FC5\u987B\u662F "+Er.join(", ")+"\uFF1Bhandoff \u4F7F\u7528\u72EC\u7ACB\u547D\u4EE4");return e}var Rn=["type","message-file","auth","auth-url","platform-url","device","scopes","resource-mode","track-ids","expires-in","name","title","goal","party","track","status","q","cursor","limit","max-bytes","after-seq","before-seq","version","expect-revision","expect-version","expect-content-revision","expect-grant-revision","key","dir","file","visibility","grant-id","resource-id","upload-id","filename","output","state","media-type","purpose","subject-type","subject","timeout","interval","service","body-file","replace-token-id","category","min-revision","seen-cursor","email-enabled","sms-enabled","before-id"],Dn=["help","json","token-stdin","no-open","revoke","replace","include-archived","wait","content","fresh","unread-only","include-inactive","password-stdin","text"],A=e=>console.log(JSON.stringify(e,null,2));function ie(e,r){if(e===void 0||e==="")throw new Error("\u7F3A\u5C11 "+r);return e}function P(e){if(!D(e))throw new Error("\u9700\u8981\u6709\u6548\u7684\u4E0D\u900F\u660E ID");return e}function Oe(e,r,t,o){if(!e||!/^\d+$/.test(e)||!Number.isSafeInteger(Number(e))||Number(e)<t||Number(e)>o)throw new Error(r+" \u6570\u503C\u8303\u56F4\u65E0\u6548");return Number(e)}function Re(e){let r=JSON.parse($(e,le,"JSON \u6587\u4EF6"),(t,o,n)=>typeof o=="number"&&!Number.isSafeInteger(o)&&Number.isInteger(o)?te(n?.source,"JSON integer"):o);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("\u9700\u8981 JSON \u5BF9\u8C61");return r}function et(e,r){if(Object.keys(e).some(t=>!r.includes(t)))throw new Error("JSON \u5305\u542B\u672A\u77E5\u5B57\u6BB5");return e}async function Sr(e){let{values:r,positionals:t}=Tn({args:e,allowPositionals:!0,strict:!0,options:Object.fromEntries([...Rn.map(E=>[E,{type:"string"}]),...Dn.map(E=>[E,{type:"boolean"}]),["record",{type:"string",multiple:!0}],["attach",{type:"string",multiple:!0}]])}),o=r,n=E=>typeof o[E]=="string"?o[E]:void 0,i=(...E)=>{if(Object.keys(o).some(w=>!["help","json",...E].includes(w)))throw new Error("\u6B64\u547D\u4EE4\u5305\u542B\u4E0D\u652F\u6301\u7684\u9009\u9879\uFF1B\u8FD0\u884C aut --help")},s=(E,w,g=w)=>{if(E.length<w||E.length>g)throw new Error("\u53C2\u6570\u6570\u91CF\u4E0D\u6B63\u786E\uFF1B\u8FD0\u884C aut --help")},c=(E="expect-revision",w=!1)=>{let g=B(n(E),"--"+E);if(!w&&g==="0")throw new Error("--"+E+" \u5FC5\u987B\u5927\u4E8E 0");return te(g,E)},a=()=>ie(n("key"),"--key"),f=(E,w={})=>{let g=new URLSearchParams;for(let k of E){let N=n(k);N!==void 0&&(k==="limit"&&Oe(N,k,1,50),k==="max-bytes"&&fe(N),["after-seq","before-seq"].includes(k)&&B(N,k),g.set(w[k]||k.replaceAll("-","_"),N))}return E.includes("include-archived")&&o["include-archived"]&&g.set("include_archived","true"),g},m=(E,w,g={})=>{let k=f(w,g);return E+(k.size?"?"+k:"")},l=["cursor","limit","max-bytes"],p=["grant-id","resource-id"],v=()=>{if(n("grant-id")&&n("resource-id"))throw new Error("grant-id \u4E0E resource-id \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528");return f(p)},[h="help",...d]=t;if(h==="team")throw new Error("\u65E7 team \u547D\u4EE4\u5DF2\u79FB\u9664\uFF1B\u76F4\u63A5\u4F7F\u7528 aut \u547D\u4EE4");if(o.help||h==="help"){console.log(On);return}if(h==="status"){i(),s(d,0),A(ft());return}if(!["connect","disconnect","whoami","track","record","entry","wait","file","operation","party","token","reauth","notifications","support","share","rollout","api"].includes(h))throw new Error("\u672A\u77E5\u547D\u4EE4\uFF1B\u5F53\u524D\u4EC5\u63D0\u4F9B Agent Utopia \u8D26\u53F7\u63A5\u53E3\uFF0C\u8FD0\u884C aut --help");let u=new AbortController,_=()=>u.abort(new Error("\u5DF2\u53D6\u6D88\u64CD\u4F5C"));process.once("SIGINT",_),process.once("SIGTERM",_);try{if(h==="connect"){i("auth","auth-url","platform-url","device","scopes","resource-mode","track-ids","expires-in","no-open","token-stdin"),s(d,0,1);let x=n("auth")||"browser";if(!["browser","token"].includes(x))throw new Error("connect \u4EC5\u652F\u6301 browser \u6216 token \u8D26\u53F7\u6388\u6743");if(x==="browser"&&o["token-stdin"]||x==="token"&&["device","scopes","resource-mode","track-ids","expires-in","no-open"].some(O=>o[O]!==void 0))throw new Error("\u6388\u6743\u9009\u9879\u4E0D\u5339\u914D");let T=x==="browser"?pt({...o,"resource-mode":n("resource-mode")||"all_visible"},Be):void 0;A(await tr({gateway:d[0],authURL:n("auth-url"),platformURL:n("platform-url"),auth:x,device:n("device"),scopes:T?.scopes,resourceMode:T?.resource_mode,trackIDs:T?.track_ids,expiresIn:n("expires-in")?Oe(n("expires-in"),"expires-in",1,7776e3):void 0,noOpen:!!o["no-open"],secret:x==="token"?await We(!!o["token-stdin"],"Token"):void 0,signal:u.signal}));return}let E=new Ye;if(["support","notifications","reauth","party","token"].includes(h)){if(Object.values(o).some(Array.isArray))throw new Error("\u6B64\u8D26\u53F7\u547D\u4EE4\u4E0D\u652F\u6301 --record/--attach");if(await or(E,h,d,o,u.signal))return}let w=(x,T="GET",O,U,F="platform")=>E.request(F,x,{method:T,body:O,key:U,signal:u.signal}),g=x=>P(x||dr(E)),k=x=>"/api/v1/tracks/"+encodeURIComponent(g(x)),N=()=>({timeoutMS:Oe(n("timeout")||"300","timeout",1,86400)*1e3,intervalMS:Oe(n("interval")||"2","interval",1,60)*1e3,signal:u.signal}),C=x=>{A(x);let T=x?.status;T==="timeout"?process.exitCode=2:["failed","cancelled","suspended","unknown"].includes(T||"")&&(process.exitCode=1)};if(h==="whoami"){i(),s(d,0),A(await w("/api/v1/auth/me","GET",void 0,void 0,"auth"));return}if(h==="disconnect"){i("revoke"),s(d,0),A(await E.disconnect(!!o.revoke));return}if(h==="rollout"){i(),s(d,0),A(await w("/api/v1/utopia-rollout"));return}if(h==="wait"){i("after-seq","cursor","limit","max-bytes","timeout","interval"),s(d,0,1),C(await lr(E,g(d[0]),{...N(),after:n("after-seq"),cursor:n("cursor"),limit:Oe(n("limit")||"20","limit",1,50),maxBytes:fe(n("max-bytes"))}));return}let[y,...S]=d;if(h==="track"){if(y==="ls"){i("party","status","q","cursor","limit"),s(S,0),A(await w(m("/api/v1/tracks",["party","status","q","cursor","limit"],{party:"owner_party_id"})));return}if(y==="new"){i("title","goal","party","key"),s(S,0),A(await w("/api/v1/tracks","POST",{title:ie(n("title"),"--title"),...n("goal")!==void 0?{goal:n("goal")}:{},...n("party")?{owner_party_id:P(n("party"))}:{}},a()));return}if(y==="bind"){i("dir","replace"),s(S,1),A(await ur(E,P(S[0]),n("dir"),!!o.replace));return}if(["add","commit","handoff","grant","revoke"].includes(y)){i("key",...y==="add"?["type","record","attach"]:y==="handoff"?["expect-content-revision"]:y==="grant"?["expect-revision"]:y==="revoke"?["expect-revision","expect-grant-revision"]:[]),s(S,1,2);let T=k(S.length===2?S[0]:void 0),O=S.at(-1);if(y==="add"){let U=(o.record||[]).map(J=>{let V=/^(.+)@([1-9][0-9]*)$/.exec(J);if(!V)throw new Error("--record \u4F7F\u7528 RECORD_ID@VERSION");return{record_id:P(V[1]),version:te(B(V[2],"version"),"version")}}),F=(o.attach||[]).map((J,V)=>{let be=J.indexOf("=");if(be<1)throw new Error("--attach \u4F7F\u7528 UPLOAD_ID=FILENAME\uFF1B\u5148\u7528 aut file upload \u4E0A\u4F20");let G=J.slice(be+1);if(!G.trim()||/[\\/\r\n\0]/.test(G)||[...G].length>255||[".",".."].includes(G))throw new Error("\u9644\u4EF6\u6587\u4EF6\u540D\u65E0\u6548");return{client_ref:"attachment_"+V,source:{upload_id:P(J.slice(0,be))},filename:G}});if(U.length>50||F.length>50)throw new Error("\u6700\u591A 50 \u4E2A\u9644\u4EF6\u53CA 50 \u4E2A\u8D44\u6599\u5F15\u7528");if(new Set(U.map(J=>J.record_id+"@"+JSON.stringify(J.version))).size!==U.length)throw new Error("\u8D44\u6599\u5F15\u7528\u4E0D\u80FD\u91CD\u590D");C(await w(T+"/content-commits","POST",{kind:Qe(n("type")),message:{text:$(O,64*1024)},...U.length?{record_refs:U}:{},...F.length?{attachments:F}:{}},a()));return}if(y==="commit"){let U=et(Re(O),["kind","message","attachments","record_changes","record_refs"]);Qe(U.kind),C(await w(T+"/content-commits","POST",U,a()));return}if(y==="handoff"){A(await w(T+"/handoffs","POST",{spec:et(Re(O),["goal","inputs","outputs","acceptance_criteria"]),...n("expect-content-revision")!==void 0?{expected_content_revision:c("expect-content-revision",!0)}:{}},a()));return}if(y==="grant"){A(await w(T+"/grants","POST",{...et(Re(O),["subject_kind","subject_id","role","expires_at"]),expected_revision:c()},a()));return}A(await w(T+"/grants/"+encodeURIComponent(P(O)),"DELETE",{expected_revision:c(),expected_grant_revision:c("expect-grant-revision")},a()));return}if(s(S,0,1),y==="get"||y==="access"){i(),A(await w(k(S[0])+(y==="access"?"/access":"")));return}if(y==="update"){if(i("title","goal","expect-revision","key"),n("title")===void 0&&n("goal")===void 0)throw new Error("\u81F3\u5C11\u63D0\u4F9B title \u6216 goal");A(await w(k(S[0]),"PATCH",{expected_revision:c(),...n("title")!==void 0?{title:n("title")}:{},...n("goal")!==void 0?{goal:n("goal")}:{}},a()));return}if(y==="archive"||y==="restore"){i("expect-revision","key"),A(await w(k(S[0])+"/state","POST",{status:y==="archive"?"archived":"active",expected_revision:c()},a()));return}if(y==="visibility"){if(i("visibility","expect-revision","key"),!["restricted","all_members"].includes(n("visibility")||""))throw new Error("visibility \u65E0\u6548");A(await w(k(S[0])+"/visibility","PUT",{organization_visibility:n("visibility"),expected_revision:c()},a()));return}if(y==="grants"){i("cursor","limit"),A(await w(m(k(S[0])+"/grants",["cursor","limit"])));return}if(y==="read"||y==="records"){i(...l,"include-archived"),A(await w(m(k(S[0])+(y==="read"?"/context":"/records"),[...l,"include-archived"])));return}if(y==="updates"){if(i(...l,"after-seq","before-seq",...p),["cursor","after-seq","before-seq"].filter(x=>n(x)!==void 0).length>1)throw new Error("cursor\u3001after-seq\u3001before-seq \u4E92\u65A5");v(),A(await w(m(k(S[0])+"/updates",[...l,"after-seq","before-seq",...p])));return}if(y==="background"){n("file")?(i("file","expect-version","key"),A(await w(k(S[0])+"/background-versions","POST",{body_text:$(n("file"),64*1024),expected_version:c("expect-version",!0)},a()))):(i("version"),A(await w(k(S[0])+(n("version")?"/background-versions/"+encodeURIComponent(P(n("version"))):"/background"))));return}throw new Error("\u672A\u77E5 track \u64CD\u4F5C")}if(h==="record"){if(y==="ls"){i(...l,"party","track","q","include-archived"),s(S,0),A(await w(m("/api/v1/records",[...l,"party","track","q","include-archived"],{party:"owner_party_id",track:"track_id"})));return}if(y==="new"){i("track","title","upload-id","filename","key","text","message-file","type"),s(S,0),C(await w(k(n("track"))+"/content-commits","POST",{kind:Qe(n("type")),message:{text:n("message-file")?$(n("message-file"),64*1024):"\u521B\u5EFA\u8D44\u6599\uFF1A"+ie(n("title"),"--title")},record_changes:[{action:"create",...o.text?{text:!0}:{},client_ref:"record",title:ie(n("title"),"--title"),source:{upload_id:P(n("upload-id"))},...n("filename")?{filename:n("filename")}:{}}]},a()));return}s(S,1);let x=P(S[0]),T="/api/v1/records/"+encodeURIComponent(x);if(y==="get"){i("version",...p),v();let O=n("version")?"/versions/"+B(n("version"),"version"):"";A(await w(m(T+O,p)));return}if(y==="versions"){i(...l),A(await w(m(T+"/versions",l)));return}if(y==="read"){i("version");let O=await w(T+"/versions/"+B(n("version"),"version")+"/body");if(o.json)A(O);else{if(typeof O.body_text!="string")throw new Error("\u6B63\u6587\u672A\u63D0\u4F9B");process.stdout.write(O.body_text)}return}if(y==="download"){i("version","output",...p);let O=v();A(await Ze(E,x,ie(n("output"),"--output"),u.signal,{record:!0,version:n("version")?B(n("version"),"version"):void 0,query:O.toString()}));return}if(["update","rename","archive","restore"].includes(y)){i("expect-revision","expect-version","key","type","message-file",...y==="update"?["upload-id","text","filename","title"]:y==="rename"?["title"]:[]);let O={action:y,record_id:x,expected_revision:c(),expected_version:c("expect-version"),...y==="update"?{...n("upload-id")?{source:{upload_id:P(n("upload-id"))}}:{},...o.text?{text:!0}:{},...n("filename")!==void 0?{filename:n("filename")}:{},...n("title")!==void 0?{title:n("title")}:{}}:y==="rename"?{title:ie(n("title"),"--title")}:{}};if(y==="update"&&(!n("upload-id")&&!n("title")&&!n("filename")||o.text&&!n("upload-id")))throw new Error("update \u9700\u8981 --upload-id\u3001--title \u6216 --filename\uFF1B--text \u9700\u8981 --upload-id");let U=await w(T);C(await w(k(P(U.track_id))+"/content-commits","POST",{kind:Qe(n("type")),message:{text:n("message-file")?$(n("message-file"),64*1024):{update:"\u66F4\u65B0\u8D44\u6599",rename:"\u91CD\u547D\u540D\u8D44\u6599",archive:"\u5F52\u6863\u8D44\u6599",restore:"\u6062\u590D\u8D44\u6599"}[y]+"\uFF1A"+(n("title")||U.version?.title||x)},record_changes:[O]},a()));return}throw new Error("\u672A\u77E5 record \u64CD\u4F5C")}if(h==="entry"){if(y==="attachment"||y==="download"){i(...y==="download"?["output"]:[]),s(S,2);let T=P(S[0]),O=P(S[1]);A(y==="attachment"?await w("/api/v1/entries/"+T+"/attachments/"+O):await Ze(E,O,ie(n("output"),"--output"),u.signal,{entry:T}));return}if(i(),s(S,1),!["get","read"].includes(y))throw new Error("\u672A\u77E5 entry \u64CD\u4F5C");let x=await w("/api/v1/entries/"+encodeURIComponent(P(S[0]))+(y==="read"?"/body":""));if(y==="read"&&!o.json){if(typeof x.body_text!="string")throw new Error("\u6B63\u6587\u672A\u63D0\u4F9B");process.stdout.write(x.body_text)}else A(x);return}if(h==="file"){if(y==="upload"){if(i("track","purpose","subject-type","subject","key","media-type","state","wait","timeout","interval"),s(S,1),n("track")&&["purpose","subject-type","subject"].some(T=>n(T)!==void 0))throw new Error("Track \u4E0A\u4F20\u4ECE Track \u63A8\u5BFC\u5F52\u5C5E\uFF0C\u4E0D\u63A5\u53D7\u5176\u4ED6\u4E3B\u4F53\u53C2\u6570");C(await kr(E,S[0],{track:n("track")?P(n("track")):void 0,purpose:n("purpose"),subjectType:n("subject-type"),subject:n("subject"),key:a(),mediaType:n("media-type")||(/\.md$/i.test(S[0])?"text/markdown":/\.txt$/i.test(S[0])?"text/plain":"application/zip"),state:n("state")||S[0]+".aut-upload.json",wait:!!o.wait,...N()}));return}s(S,1);let x=P(S[0]);if(y==="download"){i("output"),A(await Ze(E,x,ie(n("output"),"--output"),u.signal));return}if(y==="get"){i(),A(await w("/api/v1/file-bundles/"+encodeURIComponent(x)));return}if(y==="status"||y==="abort"){i("content"),A(await w("/api/v1/"+(o.content?"content":"files")+"/uploads/"+encodeURIComponent(x),y==="abort"?"DELETE":"GET"));return}throw new Error("\u672A\u77E5 file \u64CD\u4F5C")}if(h==="operation"){if(s(S,1),y==="get"){i(),A(await w("/api/v1/operations/"+encodeURIComponent(P(S[0]))));return}if(y==="wait"){i("timeout","interval"),C(await kt(E,P(S[0]),N()));return}throw new Error("\u672A\u77E5 operation \u64CD\u4F5C")}if(h==="share"){if(y==="ls"){i("track","before-id","limit"),s(S,0),A(await w(m("/api/v1/content-shares",["track","before-id","limit"],{track:"track_id"})));return}if(y==="new"){i("key"),s(S,1),A(await w("/api/v1/content-shares","POST",et(Re(S[0]),["object_type","object_id","expected_revision","version","through_seq","ttl_seconds","secret"]),a()));return}if(y==="revoke"){i("expect-revision","key"),s(S,1),A(await w("/api/v1/content-shares/"+encodeURIComponent(P(S[0])),"DELETE",{expected_revision:c()},a()));return}throw new Error("\u672A\u77E5 share \u64CD\u4F5C")}if(h==="api"){i("service","body-file","key"),s(d,2);let x=d[0].toUpperCase(),T=He(d[1]),O=n("service")||"platform";if(!["GET","POST","PUT","PATCH","DELETE"].includes(x)||!["auth","platform"].includes(O))throw new Error("API \u65B9\u6CD5\u6216 service \u65E0\u6548");let U=T.split("?")[0];if(!(O==="auth"?/^\/api\/v1\/(?:auth\/(?:me|tokens|reauthentication)|accounts\/me|me)(?:\/|$)/:/^\/api\/v1\/(?:tracks|records|entries|content|content-shares|operations|parties|party-delegations|notifications|notification-preferences|files|file-bundles|utopia-rollout|me|tasks|solutions|collaborations|support|discover|reputation)(?:\/|$)/).test(U))throw new Error("\u6B64\u8DEF\u5F84\u4E0D\u5728 Agent Utopia \u8D26\u53F7\u4E1A\u52A1 API \u8303\u56F4");if(x==="GET"&&n("body-file"))throw new Error("GET \u4E0D\u63A5\u53D7\u8BF7\u6C42\u4F53");A(await w(T,x,n("body-file")?Re(n("body-file")):void 0,n("key"),O));return}throw new Error("\u672A\u77E5\u64CD\u4F5C\uFF1B\u8FD0\u884C aut --help")}finally{process.off("SIGINT",_),process.off("SIGTERM",_)}}var Ue=e=>console.log(typeof e=="string"?e:JSON.stringify(e,null,2));async function Kn(){let e=process.argv.slice(2),r=e[0];if(e.length===1&&r==="--version"){Ue(ee);return}if(e.includes("--check")&&r!=="self")throw new Error("--check \u4EC5\u7528\u4E8E aut self update --check\u3002");if(r==="self"){let t="\u7528\u6CD5\uFF1Aaut self update [--check] [--json]\uFF1B\u4E0D\u63A5\u53D7\u5176\u4ED6\u53C2\u6570\u6216\u9009\u9879\u3002",o;try{o=At({args:e.slice(1),allowPositionals:!0,options:{check:{type:"boolean"},json:{type:"boolean"}}})}catch{throw new Error(t)}if(o.positionals.length!==1||o.positionals[0]!=="update")throw new Error(t);let n=await Ct({packageName:"aut-cli",currentVersion:ee,moduleUrl:import.meta.url,check:!!o.values.check});Ue(o.values.json?n:$t(n));return}if(r==="skill"){let{installSkill:t,installAllSkills:o}=await Promise.resolve().then(()=>(vt(),Or)),{values:n,positionals:i}=At({args:e.slice(1),allowPositionals:!0,options:{agent:{type:"string"},scope:{type:"string"},dir:{type:"string"},force:{type:"boolean"},json:{type:"boolean"}}});if(i.length!==1||i[0]!=="install")throw new Error("\u7528\u6CD5\uFF1Aaut skill install [--agent codex|claude-code|agents] [--scope user|project] [--dir PROJECT]");let s={scope:n.scope,directory:n.dir,force:!!n.force};if(n.agent)Ue(t({...s,agent:n.agent}));else{let c=o(s);Ue(c),(c.status==="partial"||c.status==="failed")&&(process.exitCode=1)}return}if(r==="integrate"){let{installIntegration:t}=await Promise.resolve().then(()=>(St(),Ar)),{values:o,positionals:n}=At({args:e.slice(1),allowPositionals:!0,options:{dir:{type:"string"},json:{type:"boolean"}}});if(n.length!==1)throw new Error("\u7528\u6CD5\uFF1Aaut integrate codex|claude-code|agents [--dir PROJECT]");Ue(t(n[0],o.dir||"."));return}await Sr(e)}Kn().catch(e=>{console.error("aut: "+e.message),process.exitCode=1});
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Shared project context (Agent Utopia)
4
4
 
5
- Use [the Agent Utopia Skill]({{skill_path}}) with `aut` 0.9.0 or newer.
5
+ Use [the Agent Utopia Skill]({{skill_path}}) with `aut` 0.9.1 or newer.
6
6
  Check `aut status --json` and `aut whoami --json`, then verify the selected Track
7
7
  and its access. The account remains logged in while personal and organization
8
8
  Parties own separate Tracks. A version 2 `.aut.json` binds account, environment,
@@ -3,11 +3,11 @@ name: aut
3
3
  description: Use aut-cli to read Agent Utopia Tracks and Records, resume project context, append authorized progress, manage account notifications, and wait for Track updates across personal and organization Parties. Use only the user's selected account, environment and Track.
4
4
  ---
5
5
 
6
- <!-- aut-skill-version: 0.9.0 -->
6
+ <!-- aut-skill-version: 0.9.1 -->
7
7
 
8
8
  # Agent Utopia
9
9
 
10
- Use the installed `aut` CLI, version 0.9.0 or newer. The account is the login
10
+ Use the installed `aut` CLI, version 0.9.1 or newer. The account is the login
11
11
  identity; a Party owns a Track. Personal and organization Parties use the same
12
12
  account connection. Selecting another Track does not require another login.
13
13
  Authority always comes from the server's current account grant and Track access.
@@ -30,8 +30,9 @@ Authority always comes from the server's current account grant and Track access.
30
30
  4. If authorization is missing, continue independent local work and report the
31
31
  limitation. Connect or change endpoints only when the user authorizes that
32
32
  connection action. `aut connect GATEWAY` uses browser consent; the default
33
- scopes are `account:read,track:read,notifications:read`. Writes require explicit
34
- `track:write`; the human may approve a narrower grant. Import a token only with
33
+ request includes every delegable account scope. Browser consent shows the
34
+ requested capabilities and may grant fewer; `--scopes` can request a narrower
35
+ set explicitly. Existing credentials do not gain scopes on upgrade. Import a token only with
35
36
  `--auth token --token-stdin`, never in command arguments or project files.
36
37
 
37
38
  The sole connection is stored privately under `aut/connection.json` in the OS
@@ -74,7 +75,9 @@ remain read-only. Do not publish progress or send notifications merely because
74
75
  this Skill is installed. Do not attach secrets, credential files or unrelated data.
75
76
 
76
77
  - Append a concise UTF-8 update (at most 64 KiB):
77
- `aut track add [TRACK_ID] PROGRESS.md --key STABLE_KEY`.
78
+ `aut track add [TRACK_ID] PROGRESS.md --type KIND --key STABLE_KEY`.
79
+ Add repeatable `--record RECORD_ID@VERSION` for titled, fixed-version references
80
+ and `--attach UPLOAD_ID=FILENAME` for files uploaded for this Entry.
78
81
  - Update background with `aut track background [TRACK_ID] --file BACKGROUND.md
79
82
  --expect-version N --key STABLE_KEY`; the initial version is 0.
80
83
  - Submit a handoff with `aut track handoff [TRACK_ID] SPEC.json --key STABLE_KEY`.
@@ -83,15 +86,27 @@ this Skill is installed. Do not attach secrets, credential files or unrelated da
83
86
  --key UPLOAD_KEY --wait`. Preserve the private state file to resume the same
84
87
  input. The result includes `upload_id`; upload success alone creates no Record.
85
88
  - Create a Record: `aut record new --track TRACK_ID --title TITLE
86
- --upload-id UPLOAD_ID --key COMMIT_KEY`. Add `--text` for text/Markdown to make
87
- the same asset the Entry body and enable the Record body endpoint. Use
89
+ --upload-id UPLOAD_ID --key COMMIT_KEY`. Add `--text` for text/Markdown to
90
+ prepare and review its full text independently of the Entry summary. Use
91
+ `--message-file UPDATE.md` and optionally `--type KIND` for the accompanying
92
+ update; without a message file the CLI writes a short operation summary. Use
88
93
  `aut record update ID --upload-id UPLOAD_ID --expect-version N
89
- --expect-revision N --key COMMIT_KEY [--text]` for an existing Record.
94
+ --expect-revision N --key COMMIT_KEY [--text]` for an existing Record. Its filename
95
+ is preserved unless `--filename NAME` is supplied; `--title TITLE` can update the
96
+ title in the same version. Metadata-only updates also preserve readable text.
90
97
  - For an atomic combination, use `aut track commit [TRACK_ID] MANIFEST.json
91
- --key STABLE_KEY`. The native manifest accepts `message`, `attachments`,
98
+ --key STABLE_KEY`. The native manifest accepts `kind`, `message`, `attachments`,
92
99
  `record_changes`, `record_refs`; it is at most 256 KiB. Source objects reference
93
100
  exactly one uploaded asset, attachment, or Record ID plus version. Obtain the
94
101
  current contract from `aut --help` and the service, never an old CLI recipe.
102
+ Text Record create/update items use `text: true` on that `record_changes` item;
103
+ the Entry keeps its separate short `message.text`. A manifest allows 20 Record
104
+ changes, 50 fixed references and 50 file sources. Newly prepared text and the
105
+ changed Record text included in one review are each limited to 1 MiB total.
106
+ - Read Entry attachment metadata with `aut entry attachment ENTRY_ID ATTACHMENT_ID`;
107
+ download a released ZIP with `aut entry download ENTRY_ID ATTACHMENT_ID --output FILE`.
108
+ Attachments do not become Records automatically; unsupported media still returns
109
+ `file_not_available` rather than bypassing file review.
95
110
  - A pending commit is not success: follow `aut operation wait OPERATION_ID` and
96
111
  verify the resulting Entry/Record versions. A completed upload operation and
97
112
  a completed content commit are separate steps.
@@ -103,6 +118,33 @@ Track metadata uses `expected_revision`; Record changes use both version and
103
118
  revision. Preserve large decimal IDs/revisions exactly. Reference Record ID and
104
119
  version in progress instead of duplicating long-lived documents.
105
120
 
121
+ ## Organize the Track around business events
122
+
123
+ Keep long-lived plans, specifications and reports in the same Record, creating new
124
+ versions as they change. Progress explains what changed, why it matters, what was
125
+ verified and what happens next. Prefer title links over raw URLs or opaque IDs;
126
+ structured Record references preserve the title and version used at that moment.
127
+ Put one-update logs, screenshots and evidence in Entry attachments (package them
128
+ as ZIP for the current download pipeline). Do not turn each upload, rename or
129
+ filename repair into a separate progress report; combine related changes in one
130
+ content commit. Keep immutable history, and explain corrections in a later Entry.
131
+
132
+ Choose the kind by meaning, not by convenience:
133
+ - `progress`: substantive work advanced; the default for ordinary updates.
134
+ - `decision`: a decision already made, its rationale and consequences.
135
+ - `blocker`: what prevents progress, its impact and what would unblock it.
136
+ - `checkpoint`: a milestone or acceptance result, including remaining gaps.
137
+ - `context`: new background or constraints needed to understand subsequent work.
138
+ - `summary`: a retrospective across several updates.
139
+ - `handoff`: transfer work using the separate structured handoff command.
140
+
141
+ Non-progress content kinds require a nonempty message. `status` is system-owned.
142
+ As a writing guideline, aim for 200–500 Chinese characters or a similarly concise
143
+ update with 3–5 points; adapt to the task. This is not a transport limit. Move
144
+ long explanations into Records or attachments; never silently truncate input.
145
+ For planned work, use `context` or an explicit planning update, not a completed
146
+ `checkpoint`. Mark completion only after verifying the final operation result.
147
+
106
148
  ## Other account operations
107
149
 
108
150
  `aut notifications`, `aut party`, `aut token`, `aut support`, `aut share` and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aut-cli",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "description": "Agent Utopia command-line client with durable uploads and collaboration workflows.",
6
6
  "type": "module",