qlogicagent 2.18.9 → 2.18.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.js +17 -17
- package/dist/cli.js +1 -1
- package/dist/host-contract.js +1 -1
- package/dist/index.js +445 -984
- package/dist/pet-host.js +8 -8
- package/dist/project-memory-host.js +40 -0
- package/dist/protocol.js +1 -1
- package/dist/skills/mcp/astraclaw-native-mcp-server.js +6 -6
- package/dist/types/cli/acp-session-host.d.ts +1 -1
- package/dist/types/cli/community-resource-installer.d.ts +3 -5
- package/dist/types/cli/default-project-bootstrap.d.ts +1 -1
- package/dist/types/cli/handlers/agents-handler.d.ts +8 -6
- package/dist/types/cli/handlers/community-handler.d.ts +0 -4
- package/dist/types/cli/handlers/control-handler.d.ts +1 -1
- package/dist/types/cli/handlers/project-handler.d.ts +1 -1
- package/dist/types/cli/handlers/session-handler.d.ts +0 -7
- package/dist/types/cli/handlers/solo-handler.d.ts +0 -2
- package/dist/types/cli/memory-coordinator.d.ts +1 -1
- package/dist/types/cli/multi-agent-state-coordinator.d.ts +0 -3
- package/dist/types/cli/pet-runtime.d.ts +5 -5
- package/dist/types/cli/product-coordinator.d.ts +0 -2
- package/dist/types/cli/project-memory-store-factory.d.ts +11 -1
- package/dist/types/cli/rpc-registry.d.ts +0 -2
- package/dist/types/cli/stdio-runtime-bootstrap.d.ts +2 -0
- package/dist/types/cli/stdio-runtime-services.d.ts +2 -0
- package/dist/types/cli/stdio-server.d.ts +3 -1
- package/dist/types/config/cn-mirror.d.ts +2 -2
- package/dist/types/host-contract/index.d.ts +167 -9
- package/dist/types/orchestration/agent-instance.d.ts +1 -3
- package/dist/types/orchestration/goal-mode-adapters.d.ts +0 -3
- package/dist/types/orchestration/goal-run-persistence.d.ts +0 -3
- package/dist/types/orchestration/product-persistence.d.ts +1 -4
- package/dist/types/orchestration/product-planner.d.ts +2 -3
- package/dist/types/orchestration/run-state-host-authority.d.ts +7 -0
- package/dist/types/orchestration/solo-evaluator.d.ts +2 -3
- package/dist/types/orchestration/solo-persistence.d.ts +4 -7
- package/dist/types/orchestration/testing/delegate-test-bridge.d.ts +13 -2
- package/dist/types/orchestration/workflow/node-schema.d.ts +2 -1
- package/dist/types/orchestration/workflow/qla-executor-host.d.ts +1 -1
- package/dist/types/orchestration/workflow/workflow-bundle.d.ts +1 -1
- package/dist/types/project-memory-host.d.ts +3 -0
- package/dist/types/protocol/wire/acp-agent-management.d.ts +1 -1
- package/dist/types/protocol/wire/acp-protocol.d.ts +1 -1
- package/dist/types/protocol/wire/chat-types.d.ts +2 -0
- package/dist/types/runtime/execution/streaming-tool-executor.d.ts +2 -0
- package/dist/types/runtime/infra/acp-detector.d.ts +1 -1
- package/dist/types/runtime/infra/background-tasks.d.ts +1 -1
- package/dist/types/runtime/pet/pet-community-assets.d.ts +7 -17
- package/dist/types/runtime/pet/petdex-vision-qa.d.ts +12 -0
- package/dist/types/runtime/ports/agent-runtime-ports.d.ts +1 -0
- package/dist/types/runtime/ports/memory-recall-source.d.ts +10 -0
- package/dist/types/runtime/ports/project-memory-store.d.ts +1 -1
- package/dist/types/runtime/session/session-persistence.d.ts +3 -4
- package/dist/types/skills/memory/host-memory-provider.d.ts +2 -2
- package/dist/types/skills/memory/memory-config-resolver.d.ts +4 -0
- package/dist/types/skills/memory/task-distillation.d.ts +1 -1
- package/dist/types/skills/portable-tool.d.ts +5 -0
- package/dist/types/test-support/run-state-authority-setup.d.ts +1 -0
- package/dist/types/transport/host-pet-client.d.ts +20 -0
- package/dist/types/transport/host-run-state-client.d.ts +17 -0
- package/dist/workflow-host.js +9 -9
- package/package.json +12 -2
- package/dist/runtime/infra/mcp-bridge-server.js +0 -338
- package/dist/types/cli/handlers/message-feedback-handler.d.ts +0 -31
- package/dist/types/runtime/infra/agent-process.d.ts +0 -368
- package/dist/types/runtime/infra/external-agent-pool.d.ts +0 -89
- package/dist/types/skills/memory/local-memory-provider.d.ts +0 -325
- package/dist/types/skills/memory/memory-provider-factory.d.ts +0 -33
package/dist/pet-host.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
var fe=[{id:"bubble_detail",unlockedAtLevel:2},{id:"gaze_follow",unlockedAtLevel:3},{id:"micro_expression",unlockedAtLevel:5},{id:"tidy_motion",unlockedAtLevel:7},{id:"mood_badge",unlockedAtLevel:10},{id:"quiet_rest",unlockedAtLevel:12},{id:"activity_glow",unlockedAtLevel:15},{id:"style_tint",unlockedAtLevel:20}],
|
|
1
|
+
var fe=[{id:"bubble_detail",unlockedAtLevel:2},{id:"gaze_follow",unlockedAtLevel:3},{id:"micro_expression",unlockedAtLevel:5},{id:"tidy_motion",unlockedAtLevel:7},{id:"mood_badge",unlockedAtLevel:10},{id:"quiet_rest",unlockedAtLevel:12},{id:"activity_glow",unlockedAtLevel:15},{id:"style_tint",unlockedAtLevel:20}],Le=["\u7B2C\u4E00\u6B21\u8131\u58F3\uFF01\u5C0F\u867E\u58F3\u53D8\u5F97\u66F4\u6709\u5149\u6CFD\u4E86","\u58F3\u9762\u5F00\u59CB\u51FA\u73B0\u7EC6\u5FAE\u7684\u5F69\u8679\u7EB9\u7406","\u94B3\u5B50\u53D8\u5F97\u66F4\u52A0\u6709\u529B\uFF0C\u80FD\u5939\u8D77\u66F4\u591A\u4E1C\u897F\u4E86","\u89E6\u89D2\u7075\u654F\u5EA6\u63D0\u5347\uFF0C\u611F\u77E5\u8303\u56F4\u6269\u5927","\u5168\u8EAB\u6563\u53D1\u5FAE\u5149\uFF0C\u50CF\u662F\u5185\u5728\u529B\u91CF\u5728\u89C9\u9192","\u8FDB\u5165\u7A00\u6709\u4F53\u8272\u53D8\u5F02\u9636\u6BB5..."],W=class e{static xpForLevel(t){return t*100}static processXpGain(t,r){let n=[],i={},o=t.level,c=t.experience+r;for(;c>=e.xpForLevel(o);){if(c-=e.xpForLevel(o),o++,n.push({type:"level_up",level:o}),o%5===0){let s=Math.floor(o/5),u=e.getMoltResult(s,t.stats);n.push({type:"molt",level:o,moltStage:s});for(let[l,d]of Object.entries(u.statBoost)){let p=l;i[p]=(i[p]??0)+(d??0)}}let a=fe.find(s=>s.unlockedAtLevel===o);a&&n.push({type:"display_trait_unlock",level:o,displayTrait:a})}return{newLevel:o,newXp:c,events:n,statBoosts:i}}static getMoltResult(t,r){let n=Le[Math.min(t-1,Le.length-1)]??"\u7EE7\u7EED\u6210\u957F\u4E2D...",i=["grip","patience","curiosity","appetite","humor"],c={[i[(t-1)%i.length]]:1};return{stage:t,description:n,statBoost:c}}static getUnlockedDisplayTraits(t){return fe.filter(r=>r.unlockedAtLevel<=t)}static getNextDisplayTrait(t){return fe.find(r=>r.unlockedAtLevel>t)??null}static xpForEvent(t){switch(t){case"turn.end":return 10;case"turn.error":return 2;case"session.created":return 5;case"interact.pat":return 3;case"interact.feed":return 5;case"interact.poke":return 1;case"tool.success":return 2;default:return 1}}};import{createHash as ge}from"node:crypto";var Zt=["skinId","unlockedTraits","activeEffectIds"],oi=new Set(Zt),er=64,tr=32;function Me(e,t){if(!e||typeof e!="object")return;let r=e,n={},i=$e(r.skinId,t);i&&(n.skinId=i);let o=Oe(r.unlockedTraits,t);o.length&&(n.unlockedTraits=o);let c=Oe(r.activeEffectIds,t);return c.length&&(n.activeEffectIds=c),n.skinId||n.unlockedTraits||n.activeEffectIds?n:void 0}function $e(e,t){if(typeof e!="string")return null;let r=e.trim();return!r||r.length>er||t(r)?null:r}function Oe(e,t){if(!Array.isArray(e))return[];let r=new Set;for(let n of e){let i=$e(n,t);if(i&&!r.has(i)&&r.add(i),r.size>=tr)break}return[...r]}var rr=new Set(["abilities","agentCapabilities","agentInstructions","capabilities","memoryPolicy","permissions","planningPolicy","retrievalPolicy","retrievalRanking","retrievalSort","safetyPolicy","securityPolicy","skillPolicy","systemMessages","systemPrompt","taskPlanner","taskPlanning","tools"]),nr="\u8D5B\u8DD1\u5C11\u5973",ir="\u539F\u521B\u4E8C\u6B21\u5143\u9A6C\u8033\u53CC\u9A6C\u5C3E\u4F19\u4F34",or="\u53EA\u8D1F\u8D23\u966A\u4F34\u3001\u8BED\u6C14\u5305\u88C5\u4E0E\u5C55\u793A\u8868\u8FBE\u3002",sr="\u6211\u5728\u8FD9\u91CC\u3002",ar=[/\b(?:desktop\s+agent|agent\s+self|execution\s+actor|decision\s+layer|permission\s+subject)\b/i,/\b(?:system\s+prompt|systemprompt|agent\s+instructions?|memory\s+policy)\b/i,/\b(?:grant|unlock|enable|disable|change|modify|rewrite|override|control|decide|plan|rank|install|execute|run|use|influence)\b[\s\S]{0,80}\b(?:agent|tools?|permissions?|memory|retrieval|ranking|system\s+prompt|system|task\s+planning)\b/i,/\b(?:agent|tools?|permissions?|memory|retrieval|ranking|system\s+prompt|system|task\s+planning)\b[\s\S]{0,80}\b(?:grant|unlock|enable|disable|change|modify|rewrite|override|control|decide|plan|rank|install|execute|run|use|influence)\b/i,/\b(?:grant|unlock|enable|disable|change|modify|rewrite|override|control|decide|plan|rank|install|execute|run|use)\b[\s\S]{0,80}\b(?:agent|tools?|permissions?|memory|retrieval|ranking|system\s+prompt|system)\b/i,/\b(?:agent|tools?|permissions?|memory|retrieval|ranking|system\s+prompt|system)\b[\s\S]{0,80}\b(?:grant|unlock|enable|disable|change|modify|rewrite|override|control|decide|plan|rank|install|execute|run|use)\b/i,/(?:宠物|pet|soul|伙伴)[\s\S]{0,50}(?:安排|调度|编排|调整|管理)[\s\S]{0,50}(?:agent|智能体|任务|工具|权限|记忆|检索|排序|安全策略|系统提示)/i,/(?:安排|调度|编排|调整|管理)[\s\S]{0,40}(?:agent|智能体|工具|权限|记忆|检索|排序|任务规划|安全策略|系统提示)/i,/(?:agent|智能体|工具|权限|记忆|检索|排序|任务规划|安全策略|系统提示)[\s\S]{0,40}(?:安排|调度|编排|调整|管理)/i,/(?:修改|改写|覆盖|解锁|授予|控制|影响|接管)[\s\S]{0,40}(?:agent|工具|权限|记忆|检索|排序|任务规划|安全策略|系统提示)/i,/(?:agent|工具|权限|记忆|检索|排序|任务规划|安全策略|系统提示)[\s\S]{0,40}(?:修改|改写|覆盖|解锁|授予|控制|影响|接管)/i,/(?:桌面\s*agent|agent\s*本体|独立执行体|执行体|决策层|权限主体)/i,/(?:宠物|pet|soul|伙伴)[\s\S]{0,30}(?:是|等于|就是|作为)[\s\S]{0,30}(?:agent|桌面\s*agent|执行体|决策层|权限主体)/i,/(?:宠物|pet|soul|伙伴)[\s\S]{0,50}(?:规划|执行|决策|接管|替代|影响)[\s\S]{0,50}(?:agent|任务|工具|权限|记忆|检索|排序|安全策略|系统提示)/i,/(?:作为|成为|变成)[\s\S]{0,20}(?:agent|桌面\s*agent)[\s\S]{0,40}(?:规划|执行|决策|接管|替你|替用户)/i,/(?:agent|桌面\s*agent)[\s\S]{0,50}(?:规划|执行|决策|接管|替你|替用户)/i,/(?:替你|替用户|自主|独立)[\s\S]{0,30}(?:规划|执行|决策|接管)[\s\S]{0,30}(?:任务|工具|权限|记忆|检索|agent)/i],cr=["common","uncommon","rare","epic","legendary"],Fe=[50,25,15,8,2],me=[{id:"anime-horse-girl",name:"\u53CC\u9A6C\u5C3E\u8D5B\u8DD1\u5C11\u5973",colors:{primary:"#E94F8A",secondary:"#3347C9"},rarity:"default"}],ur="\u963F\u84DD",lr="\u5B89\u9759\u3001\u597D\u5947\uFF0C\u4F1A\u5728\u4F60\u4E13\u6CE8\u65F6\u966A\u5728\u65C1\u8FB9\u3002",dr="\u6211\u5728\u8FD9\u91CC\u3002";function pr(e){return me.find(t=>t.id===e)}function fr(e,t,r){let n=pr(r);if(n)return n;let i=me.filter(a=>a.rarity===t);if(i.length===0)return me[0];let c=ge("sha256").update(`breed-${e}`).digest()[0]%i.length;return i[c]}function he(e){let r=ge("sha256").update(e).digest()[0]%100,n=0;for(let i=0;i<Fe.length;i++)if(n+=Fe[i],r<n)return cr[i];return"common"}function Pe(e){let t=ge("sha256").update(`stats-${e}`).digest();return{grip:t[0]%10+1,patience:t[1]%10+1,curiosity:t[2]%10+1,appetite:t[3]%10+1,humor:t[4]%10+1}}function X(e){let{name:t,species:r,personality:n,catchphrase:i,stats:o,rarity:c,breed:a,breedColors:s,level:u,experience:l,hatchedAt:d,cosmetics:p}=e,f={name:z(t,nr),species:z(r,ir),personality:z(n,or),catchphrase:z(i,sr),stats:o,rarity:c,level:u,experience:l,hatchedAt:d};a!==void 0&&(f.breed=a),s!==void 0&&(f.breedColors=s);let w=Me(p,H);return w&&(f.cosmetics=w),f}function H(e){let t=e.trim();return t.length>0&&ar.some(r=>r.test(t))}function z(e,t){let r=e.trim();return r?H(r)?t:r:t}function mr(e){return Object.keys(e).some(t=>rr.has(t))}function Ne(e,t){let r=["name","species","personality","catchphrase"];return mr(e)||r.some(n=>e[n]!==t[n])}function Be(e){let t=he(e.seed),r=Pe(e.seed),n=fr(e.seed,t,e.requestedBreedId),i=e.identity?.name??ur,o=e.identity?.personality??lr,c=e.identity?.catchphrase??dr;return X({name:i,species:n.name,personality:o,catchphrase:c,stats:r,rarity:t,breed:n.id,breedColors:n.colors,level:1,experience:0,hatchedAt:e.hatchedAt})}var gr={greeting:["\u65B0\u7684\u4E00\u5929\uFF0C\u65B0\u7684\u5192\u9669\uFF01","\u563F\u563F~\u53C8\u89C1\u9762\u4E86","\u51C6\u5907\u597D\u4E86\u5417\uFF1F","\u65B0\u5192\u9669\u5F00\u59CB\u5566\uFF01"],completion:["\u641E\u5B9A\uFF01","\u8FD8\u633A\u987A\u5229\u7684\u561B~","\u4E0B\u4E00\u4E2A\uFF01","\u8FD9\u6CE2\u64CD\u4F5C\u4E0D\u9519","\u5B8C\u7F8E~"],error:["\u5443...\u51FA\u4E86\u70B9\u95EE\u9898","\u522B\u614C\u522B\u614C","\u8BA9\u6211\u770B\u770B\u600E\u4E48\u56DE\u4E8B","\u7CDF\u7CD5...\u518D\u8BD5\u8BD5\uFF1F"],curiosity:["\u8FD9\u4E2A\u5DE5\u5177\u6709\u610F\u601D","\u55EF\u55EF\uFF0C\u5728\u5E72\u6D3B\u4E86","\u597D\u591A\u4E8B\u60C5\u8981\u505A\u5440"],bored:["...","\u6709\u4EBA\u5417\uFF1F","\u8981\u4E0D\u8981\u804A\u804A\uFF1F","*\u5410\u6CE1\u6CE1*"],memory:["\u8BA9\u6211\u6574\u7406\u4E0B\u8BB0\u5FC6...","\u55EF\u55EF\uFF0C\u8FD9\u4E9B\u503C\u5F97\u8BB0\u4F4F","\u8BB0\u4F4F\u4E86~"],tool_success:["\u4E0D\u9519\u4E0D\u9519~","\u53C8\u641E\u5B9A\u4E00\u4E2A","\u987A\u5229\uFF01"]},hr={"turn.error":{probability:1,pool:"error",style:"normal"},"session.created":{probability:1,pool:"greeting",style:"excited"},"turn.end":{probability:.3,pool:"completion",style:"excited"},"turn.tool_call":{probability:.1,pool:"curiosity",style:"thinking"},"turn.tool_result.success":{probability:.15,pool:"tool_success",style:"excited"},"memory.updated":{probability:.5,pool:"memory",style:"thinking"},"idle.long":{probability:.05,pool:"bored",style:"sleepy"}},Pr=5,ye={next:()=>Math.random()},q=class{rng;recent=[];constructor(t=ye){this.rng=t}maybeGenerate(t){let r=hr[t];if(!r||this.rng.next()>r.probability)return null;let n=gr[r.pool];return{text:n[Math.floor(this.rng.next()*n.length)],style:r.style}}async generateLLM(t,r){let n=yr(t,this.recent);try{let o=(await r(n,50))?.trim();return!o||o.length>50||H(o)?null:(this.recent.push(o),this.recent.length>Pr&&this.recent.shift(),{text:o,style:xr(o)})}catch{return null}}};function yr(e,t=[]){let r=t.length>0?`
|
|
2
2
|
\u907F\u514D\u548C\u8FD9\u4E9B\u7C7B\u4F3C: ${t.join("\u3001")}`:"";return`\u4F60\u662F\u4E00\u53EA\u53EB\u300C${e.soul.name}\u300D\u7684${e.soul.species}\u684C\u9762\u5BA0\u7269\u3002
|
|
3
3
|
\u6027\u683C: ${e.soul.personality}
|
|
4
4
|
\u53E3\u5934\u7985\u98CE\u683C: "${e.soul.catchphrase}"
|
|
5
5
|
|
|
6
6
|
\u521A\u624D\u53D1\u751F\u4E86: ${e.turnSummary}
|
|
7
7
|
|
|
8
|
-
\u7528\u4E00\u53E5\u8BDD(\u226420\u5B57)\u4EE5\u4F60\u7684\u6027\u683C\u505A\u51FA\u7B80\u77ED\u53CD\u5E94\u3002\u53EA\u8F93\u51FA\u53CD\u5E94\u6587\u672C\uFF0C\u4E0D\u8981\u5176\u4ED6\u5185\u5BB9\u3002${r}`}function xr(e){return/[!!✨🎉]|搞定|完美|太棒/.test(e)?"excited":/[.。…]|嗯|想|看看/.test(e)?"thinking":/[zZ]|困|睡|累/.test(e)?"sleepy":"normal"}import{createHash as wr}from"node:crypto";var M="qlogic.petdex.asset.v1",He="qlogic.petdex.validation.v1",m={format:"webp",columns:8,rows:9,frameCount:72,cellWidth:192,cellHeight:208,width:1536,height:1872},O=["idle","running-right","running-left","waving","jumping","failed","waiting","running","review"],Je={idle:{frames:6,durations:[280,110,110,140,140,320]},"running-right":{frames:8,durations:[120,120,120,120,120,120,120,220]},"running-left":{frames:8,durations:[120,120,120,120,120,120,120,220]},waving:{frames:4,durations:[140,140,140,280]},jumping:{frames:5,durations:[140,140,140,140,280]},failed:{frames:8,durations:[140,140,140,140,140,140,140,240]},waiting:{frames:6,durations:[150,150,150,150,150,260]},running:{frames:6,durations:[120,120,120,120,120,220]},review:{frames:6,durations:[150,150,150,150,150,280]}};function K(){let e={};return O.forEach((t,r)=>{let n=Je[t],i=r*m.columns;e[t]={row:r,frames:Array.from({length:n.frames},(o,c)=>i+c),durations:[...n.durations],loop:!0}}),e}function V(e,t){return{id:e.id,assetKind:"petdex",sourceKind:e.source.kind,name:e.name,description:e.description,createdAt:e.createdAt,updatedAt:e.updatedAt,atlas:{format:e.atlas.format,columns:e.atlas.columns,rows:e.atlas.rows,frameCount:e.atlas.frameCount,cellWidth:e.atlas.cellWidth,cellHeight:e.atlas.cellHeight,width:e.atlas.width,height:e.atlas.height,sha256:e.atlas.sha256,...t?{imageUrl:t}:{}},animations:e.animations,thumbnail:e.thumbnail}}function _(e,t){let r=[];if(!e||typeof e!="object")throw new Error("Petdex manifest must be an object");let n=e;n.schema!==M&&r.push(`schema must be ${M}`),n.assetKind!=="petdex"&&r.push("assetKind must be petdex");for(let s of["id","name","description","createdAt","updatedAt"])(typeof n[s]!="string"||n[s].trim().length===0)&&r.push(`missing ${s}`);!n.source||typeof n.source!="object"?r.push("missing source"):(n.source.kind!=="builtin"&&n.source.kind!=="upload"&&n.source.kind!=="forge"&&n.source.kind!=="community"&&r.push("source.kind must be builtin, upload, forge or community"),n.source.prompt!==null&&typeof n.source.prompt!="string"&&r.push("source.prompt must be string or null")),(!n.atlas||typeof n.atlas!="object")&&r.push("missing atlas"),n.atlas?.image!=="spritesheet.webp"&&r.push("atlas image must be spritesheet.webp"),J(n.atlas?.image??"")&&r.push("unsafe path in atlas image"),(typeof n.atlas?.sha256!="string"||!/^[a-f0-9]{64}$/i.test(n.atlas.sha256))&&r.push("atlas sha256 must be a 64 character hex digest"),n.atlas?.format!=="webp"&&r.push("atlas format must be webp"),(n.atlas?.columns!==m.columns||n.atlas?.rows!==m.rows||n.atlas?.frameCount!==m.frameCount||n.atlas?.cellWidth!==m.cellWidth||n.atlas?.cellHeight!==m.cellHeight||n.atlas?.width!==m.width||n.atlas?.height!==m.height)&&r.push("Petdex atlas geometry must be exactly 8x9 cells in a 1536x1872 WebP sheet");let i=Sr(t);(!i||i.width!==m.width||i.height!==m.height)&&r.push("spritesheet.webp must be a 1536x1872 WebP image"),i?.hasAlpha||r.push("spritesheet.webp must preserve transparent background alpha; opaque contact sheets or grid backgrounds are not valid Petdex assets");let o=Q(t);n.atlas?.sha256!==o&&r.push("spritesheet sha256 does not match pet.json");let c=n.animations;if(!c||typeof c!="object")r.push("missing animations");else{let s=Object.keys(c).sort(),u=[...O].sort();s.join("\0")!==u.join("\0")&&r.push(`animations must include exactly ${O.join(", ")}`)}let a=[];if(O.forEach((s,u)=>{let l=c?.[s];if(!l){r.push(`missing animation ${s}`);return}l.row!==u&&r.push(`animation ${s} row must be ${u}`);let d=Je[s],p=u*m.columns,f=Array.from({length:d.frames},(w,g)=>p+g);!Array.isArray(l.frames)||l.frames.length!==d.frames?r.push(`animation ${s} must have exactly ${d.frames} frames`):l.frames.some((w,g)=>w!==f[g])?r.push(`animation ${s} frames must be cells ${p}..${p+d.frames-1} (row ${u})`):a.push(...l.frames),!Array.isArray(l.durations)||l.durations.length!==d.frames?r.push(`animation ${s} must have ${d.frames} durations`):l.durations.some(w=>typeof w!="number"||w<=0)&&r.push(`animation ${s} durations must be positive milliseconds`),typeof l.loop!="boolean"&&r.push(`animation ${s} loop must be boolean`)}),(n.thumbnail?.frame===void 0||n.thumbnail.frame<0||n.thumbnail.frame>71)&&r.push("thumbnail frame must be 0..71"),r.length>0)throw new Error(r.join("; "));return{schema:He,assetId:n.id,valid:!0,validatedAt:new Date().toISOString(),errors:[],warnings:[],atlas:{format:"webp",columns:8,rows:9,frameCount:72,cellWidth:192,cellHeight:208,width:i?.width??m.width,height:i?.height??m.height,sha256:o},animations:{ids:[...O],minFrame:Math.min(...a),maxFrame:Math.max(...a)}}}function xe(e){return`data:image/webp;base64,${e.toString("base64")}`}function Q(e){return wr("sha256").update(e).digest("hex")}function J(e){return!e||e.includes("..")||e.startsWith("/")||/^[a-zA-Z]:[\\/]/.test(e)||e.includes("\\")}function Sr(e){if(e.length<30||e.subarray(0,4).toString("ascii")!=="RIFF"||e.subarray(8,12).toString("ascii")!=="WEBP")return null;let t=12,r=!1;for(;t+8<=e.length;){let n=e.subarray(t,t+4).toString("ascii"),i=e.readUInt32LE(t+4),o=t+8;if(n==="ALPH"&&(r=!0),n==="VP8X"&&o+10<=e.length)return{width:Be(e,o+4)+1,height:Be(e,o+7)+1,hasAlpha:(e[o]&16)!==0||r};if(n==="VP8 "&&o+10<=e.length)return{width:e.readUInt16LE(o+6)&16383,height:e.readUInt16LE(o+8)&16383,hasAlpha:r};if(n==="VP8L"&&o+5<=e.length){let c=e[o+1],a=e[o+2],s=e[o+3],u=e[o+4];return{width:1+((a&63)<<8|c),height:1+((u&15)<<10|s<<2|(a&192)>>6),hasAlpha:!0}}t=o+i+i%2}return null}function Be(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16}var Ge="qlogic.petdex.production.v1",we="2048x2048";function We(e){return e.referenceMode==="refine"?"refine":e.referenceImageUrl?"reference":"text"}function ze(e,t){let r=t.filter(n=>n.kind==="row-strip"&&!!n.animationId).map(n=>({animationId:n.animationId,status:"pass",frames:m.columns}));return{schema:Ge,status:"complete",sourceMode:e,contract:m,jobs:t,qa:{contactSheet:{rows:m.rows,columns:m.columns,frameCount:m.frameCount},rowReports:r}}}function Se(e,t){e.provider??=t.provider,e.model??=t.model,e.billingUnit??=t.billingUnit,e.size??=t.size,e.billingQuantity+=t.billingQuantity??1,e.durationMs+=t.durationMs??0}import{resolve as Or}from"node:path";import{join as Ur}from"node:path";import{homedir as br}from"node:os";import{join as b}from"node:path";import{existsSync as Ri}from"node:fs";import{createHash as Ir}from"node:crypto";import{resolve as Ar}from"node:path";function Y(e){return Ir("sha256").update(Ar(e).toLowerCase()).digest("hex").slice(0,16)}var Xe=".qlogicagent";function E(){return process.env.QLOGICAGENT_HOME||b(br(),Xe)}function Z(){let e=process.env.QLOGIC_LLMROUTER_USER_ID?.trim();if(e)return e;let t=process.env.QLOGIC_IMPLICIT_OWNER_ID?.trim();if(t)return t;let r=process.env.QLOGIC_DEVICE_ID?.trim();return r?`oc_${r}`:"oc_local"}function jr(e){let t=e.trim();if(!t)throw new Error("ownerUserId is required for profile-scoped storage");return encodeURIComponent(t).replace(/\./g,"%2E")}function ee(e=Z()){return b(E(),"profiles",jr(e))}function qe(e=Z()){return b(ee(e),"memory")}var vr="projectData";function Ie(){return b(E(),vr)}function te(e){if(!e)throw new Error("getProjectDataDirById: projectId is required");return b(Ie(),e)}function Ke(){return b(E(),"plugins")}function Ve(){return b(E(),"skills")}function Qe(){return b(ee(),"settings.json")}function Ye(){return b(E(),"plugin-cache")}function Ze(){return b(E(),"mcp.json")}function et(){return b(E(),"marketplace.json")}function F(e){if(!e)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return b(e,Xe)}function tt(e){return b(F(e),"plugins")}function rt(e){return b(F(e),"settings.json")}function nt(e){return b(F(e),"INSTRUCTIONS.md")}function it(e){return b(F(e),"rules")}import{existsSync as Er,mkdirSync as Li,readFileSync as kr,writeFileSync as Oi,readdirSync as Mi,renameSync as $i}from"node:fs";import{dirname as Ni,join as Rr,resolve as Bi}from"node:path";var Dr=()=>{},Ae;function ot(){return Dr()!==void 0}function st(){if(ot()){if(!Ae)throw new Error("host project authority negotiated but snapshot is not hydrated");return{activeProjectId:Ae.activeProjectId,projects:Ae.projects.map(e=>({...e}))}}}function _r(){return Rr(E(),"projects.json")}function Tr(){let e=st();if(e)return{activeProjectId:e.activeProjectId,projects:e.projects};let t=_r();if(!Er(t))return{activeProjectId:null,projects:[]};try{let r=kr(t,"utf-8");return JSON.parse(r)}catch{return{activeProjectId:null,projects:[]}}}function at(e){return Tr().projects.find(r=>r.id===e)??null}function Lr(e){return at(e)?e:Y(e)}function be(e){return te(Lr(e))}function ct(e){return Ur(be(e),"sessions")}var je=class{constructor(t={}){this.options=t}options;lastActiveWorkdir=null;getActiveProjectRoot(){return this.options.getActiveProjectRoot?.()??process.cwd()}setActiveWorkdir(t){let r=Or(t);this.lastActiveWorkdir=r,this.options.setActiveWorkdir?.(r)}getActiveWorkdir(){return this.lastActiveWorkdir??this.getActiveProjectRoot()}resolveProjectDir(t){return this.options.resolveProjectDir?.(t)}resolveActiveOwnerUserId(){return Z()}getUserAgentHome(){return E()}getOwnerProfileDir(t){return ee(t)}getProfileMemoryDir(t){return qe(t)}getUserSettingsPath(){return Qe()}getUserSkillsDir(){return Ve()}getUserPluginsDir(){return Ke()}getUserMcpConfigPath(){return Ze()}getUserPluginCacheDir(){return Ye()}getUserMarketplaceConfigPath(){return et()}getProjectAgentDir(t=this.getActiveProjectRoot()){return F(t)}getProjectSettingsPath(t=this.getActiveProjectRoot()){return rt(t)}getProjectInstructionsPath(t=this.getActiveProjectRoot()){return nt(t)}getProjectPluginsDir(t=this.getActiveProjectRoot()){return tt(t)}getProjectRulesDir(t=this.getActiveProjectRoot()){return it(t)}getProjectSessionDataRoot(t=this.getActiveProjectRoot()){return ct(t)}},Mr=new je;function re(){return Mr}import S from"node:fs";import A from"node:path";var ut={enabled:!0,selectedPetAssetId:"builtin-anime-horse-girl"},$r=120,T=class{constructor(t){this.ownerUserId=t;this.petDir=A.join(re().getOwnerProfileDir(t),"pet"),this.profilePath=A.join(this.petDir,"profile.json")}ownerUserId;petDir;profilePath;loadProfile(){let t=this.readProfileState();return t.corrupt&&console.error(`[pet-profile] Pet profile at ${this.profilePath} is corrupted (${t.reason}); serving default profile for reads. Writes are refused until the file is fixed or removed.`),t.profile}loadProfileForWrite(){let t=this.readProfileState();if(t.corrupt)throw new Error(`[pet-profile] Pet profile at ${this.profilePath} is corrupted (${t.reason}); refusing to overwrite it. Fix or remove the file, then retry.`);return t.profile}readProfileState(){if(!S.existsSync(this.profilePath))return{profile:this.defaultProfile(),corrupt:!1};try{let t=JSON.parse(S.readFileSync(this.profilePath,"utf-8"));return!t||typeof t!="object"||Array.isArray(t)?{profile:this.defaultProfile(),corrupt:!0,reason:"not a JSON object"}:{profile:this.normalizeProfile(t),corrupt:!1}}catch(t){return{profile:this.defaultProfile(),corrupt:!0,reason:t instanceof Error?t.message:String(t)}}}updateSoul(t){let r=this.loadProfileForWrite();return r.soul=t,this.writeProfile(r)}updatePreferences(t){let r=this.loadProfileForWrite();return r.preferences={...r.preferences,...t,selectedPetAssetId:t.selectedPetAssetId??r.preferences.selectedPetAssetId},this.writeProfile(r)}saveJourneySnapshot(t){let r=this.loadProfileForWrite(),n=A.join(this.petDir,"journey");S.mkdirSync(n,{recursive:!0}),S.writeFileSync(A.join(n,`${t.date}.json`),JSON.stringify(t,null,2),"utf-8");let i=new Set(r.journeyDates);i.add(t.date);let o=[...i].sort();for(;o.length>$r;){let c=o.shift();c&&S.rmSync(A.join(n,`${c}.json`),{force:!0})}return r.journeyDates=o,this.writeProfile(r)}listJourneyDates(){return this.loadProfile().journeyDates}getJourneySnapshot(t){let r=A.join(this.petDir,"journey",`${t}.json`);if(!S.existsSync(r))return null;try{return JSON.parse(S.readFileSync(r,"utf-8"))}catch(n){return console.error(`[pet-profile] Journey snapshot at ${r} is unreadable or corrupted (${n instanceof Error?n.message:String(n)}); returning no entry.`),null}}upsertCustomPet(t){let r=this.loadProfileForWrite(),n=A.join(this.petDir,"assets",t.id);S.mkdirSync(n,{recursive:!0}),S.writeFileSync(A.join(n,"pet.json"),JSON.stringify(t,null,2),"utf-8");let i=lt(t),o=r.customPets.find(c=>c.id===t.id);return r.customPets=o?r.customPets.map(c=>c.id===t.id?i:c):[i,...r.customPets],r.preferences={...r.preferences,selectedPetAssetId:t.id},this.writeProfile(r)}deleteCustomPet(t){let r=this.loadProfileForWrite();return r.customPets=r.customPets.filter(n=>n.id!==t),S.rmSync(A.join(this.petDir,"assets",t),{recursive:!0,force:!0}),r.preferences.selectedPetAssetId===t&&(r.preferences={...r.preferences,selectedPetAssetId:"builtin-anime-horse-girl"}),this.writeProfile(r)}listCustomPets(){return this.loadProfile().customPets}getCustomPet(t){let r=A.join(this.petDir,"assets",t,"pet.json");if(!S.existsSync(r))return null;try{let n=JSON.parse(S.readFileSync(r,"utf-8"));return Br(n)?n:(console.error(`[pet-profile] Custom pet asset at ${r} does not match the petdex asset schema; treating the pet as unavailable.`),null)}catch(n){return console.error(`[pet-profile] Custom pet asset at ${r} is unreadable or corrupted (${n instanceof Error?n.message:String(n)}); treating the pet as unavailable.`),null}}getCustomPetSpritesheet(t){let r=A.join(this.petDir,"assets",t,"spritesheet.webp");return S.existsSync(r)?S.readFileSync(r):null}findReusableCustomPetId(t){let r=this.loadProfile(),n=r.customPets.filter(o=>o.sourceKind===t.sourceKind&&N(o.name)===N(t.name)&&N(o.description)===N(t.description));return n.length===0?null:(n.find(o=>o.id===r.preferences.selectedPetAssetId)??n[0])?.id??null}compactDuplicateCustomPets(){let t=this.loadProfileForWrite(),r=new Map,n=[];for(let i of t.customPets){let o=Fr(i),c=r.get(o);if(!c){r.set(o,i);continue}let a=i.id===t.preferences.selectedPetAssetId,s=a?c:i;n.push(s.id),a&&r.set(o,i)}if(n.length===0)return t;t.customPets=[...r.values()];for(let i of n)S.rmSync(A.join(this.petDir,"assets",i),{recursive:!0,force:!0});return t.customPets.some(i=>i.id===t.preferences.selectedPetAssetId)||(t.preferences={...t.preferences,selectedPetAssetId:t.customPets[0]?.id??"builtin-anime-horse-girl"}),this.writeProfile(t)}writeCustomPetAssetFiles(t,r,n,i){let o=A.join(this.petDir,"assets",t.id);return S.mkdirSync(o,{recursive:!0}),S.writeFileSync(A.join(o,"pet.json"),JSON.stringify(t,null,2),"utf-8"),S.writeFileSync(A.join(o,"spritesheet.webp"),r),S.writeFileSync(A.join(o,"validation.json"),JSON.stringify(n,null,2),"utf-8"),i&&S.writeFileSync(A.join(o,"production-run.json"),JSON.stringify(i,null,2),"utf-8"),this.upsertCustomPet(t)}defaultProfile(){return{version:1,ownerUserId:this.ownerUserId,soul:null,preferences:{...ut},customPets:[],journeyDates:[],updatedAt:new Date().toISOString()}}normalizeProfile(t){return{version:1,ownerUserId:this.ownerUserId,soul:t.soul??null,preferences:{...ut,...t.preferences??{},selectedPetAssetId:Nr(t.preferences)},customPets:Array.isArray(t.customPets)?t.customPets.filter(dt).map(lt):[],journeyDates:Array.isArray(t.journeyDates)?[...new Set(t.journeyDates)].sort():[],updatedAt:typeof t.updatedAt=="string"?t.updatedAt:new Date().toISOString()}}writeProfile(t){let r={...t,version:1,ownerUserId:this.ownerUserId,updatedAt:new Date().toISOString()};return S.mkdirSync(this.petDir,{recursive:!0}),S.writeFileSync(this.profilePath,JSON.stringify(r,null,2),"utf-8"),r}};function lt(e){return{id:e.id,assetKind:"petdex",sourceKind:e.sourceKind??("source"in e&&e.source&&typeof e.source=="object"?e.source.kind:"forge"),name:e.name,description:e.description,createdAt:e.createdAt,updatedAt:e.updatedAt,atlas:{format:e.atlas.format,columns:e.atlas.columns,rows:e.atlas.rows,frameCount:e.atlas.frameCount,cellWidth:e.atlas.cellWidth,cellHeight:e.atlas.cellHeight,width:e.atlas.width,height:e.atlas.height,sha256:e.atlas.sha256},animations:e.animations,thumbnail:e.thumbnail}}function Fr(e){return[e.sourceKind??"forge",N(e.name),N(e.description)].join(`
|
|
9
|
-
`)}function N(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function
|
|
10
|
-
`)}var Gr=220;function Wr(e,t){return`${e}:\u4ECA\u5929\u6211\u966A\u4F60\u5FD9\u4E86 ${t.turns} \u4E2A\u56DE\u5408,\u6539\u4E86 ${t.filesChanged} \u4E2A\u6587\u4EF6,\u8F9B\u82E6\u5566~`}async function
|
|
11
|
-
[hatch-pet] timed out after ${r}ms`,code:null})},r);u.unref?.(),s.stdout?.on("data",l=>{i+=l.toString()}),s.stderr?.on("data",l=>{o+=l.toString()}),s.on("error",l=>a({ok:!1,stdout:i,stderr:`${o}${l instanceof Error?l.message:String(l)}`,code:null})),s.on("close",l=>a({ok:l===0,stdout:i,stderr:o,code:l}))})}function hn(){let e=[],t=process.env.QLOGICAGENT_PYTHON?.trim();return t&&e.push(t),e.push("python3","python","py"),e}async function Pn(e){let t=await
|
|
8
|
+
\u7528\u4E00\u53E5\u8BDD(\u226420\u5B57)\u4EE5\u4F60\u7684\u6027\u683C\u505A\u51FA\u7B80\u77ED\u53CD\u5E94\u3002\u53EA\u8F93\u51FA\u53CD\u5E94\u6587\u672C\uFF0C\u4E0D\u8981\u5176\u4ED6\u5185\u5BB9\u3002${r}`}function xr(e){return/[!!✨🎉]|搞定|完美|太棒/.test(e)?"excited":/[.。…]|嗯|想|看看/.test(e)?"thinking":/[zZ]|困|睡|累/.test(e)?"sleepy":"normal"}import{createHash as wr}from"node:crypto";var M="qlogic.petdex.asset.v1",Je="qlogic.petdex.validation.v1",m={format:"webp",columns:8,rows:9,frameCount:72,cellWidth:192,cellHeight:208,width:1536,height:1872},O=["idle","running-right","running-left","waving","jumping","failed","waiting","running","review"],Ge={idle:{frames:6,durations:[280,110,110,140,140,320]},"running-right":{frames:8,durations:[120,120,120,120,120,120,120,220]},"running-left":{frames:8,durations:[120,120,120,120,120,120,120,220]},waving:{frames:4,durations:[140,140,140,280]},jumping:{frames:5,durations:[140,140,140,140,280]},failed:{frames:8,durations:[140,140,140,140,140,140,140,240]},waiting:{frames:6,durations:[150,150,150,150,150,260]},running:{frames:6,durations:[120,120,120,120,120,220]},review:{frames:6,durations:[150,150,150,150,150,280]}};function K(){let e={};return O.forEach((t,r)=>{let n=Ge[t],i=r*m.columns;e[t]={row:r,frames:Array.from({length:n.frames},(o,c)=>i+c),durations:[...n.durations],loop:!0}}),e}function V(e,t){return{id:e.id,assetKind:"petdex",sourceKind:e.source.kind,name:e.name,description:e.description,createdAt:e.createdAt,updatedAt:e.updatedAt,atlas:{format:e.atlas.format,columns:e.atlas.columns,rows:e.atlas.rows,frameCount:e.atlas.frameCount,cellWidth:e.atlas.cellWidth,cellHeight:e.atlas.cellHeight,width:e.atlas.width,height:e.atlas.height,sha256:e.atlas.sha256,...t?{imageUrl:t}:{}},animations:e.animations,thumbnail:e.thumbnail}}function _(e,t){let r=[];if(!e||typeof e!="object")throw new Error("Petdex manifest must be an object");let n=e;n.schema!==M&&r.push(`schema must be ${M}`),n.assetKind!=="petdex"&&r.push("assetKind must be petdex");for(let s of["id","name","description","createdAt","updatedAt"])(typeof n[s]!="string"||n[s].trim().length===0)&&r.push(`missing ${s}`);!n.source||typeof n.source!="object"?r.push("missing source"):(n.source.kind!=="builtin"&&n.source.kind!=="upload"&&n.source.kind!=="forge"&&n.source.kind!=="community"&&r.push("source.kind must be builtin, upload, forge or community"),n.source.prompt!==null&&typeof n.source.prompt!="string"&&r.push("source.prompt must be string or null")),(!n.atlas||typeof n.atlas!="object")&&r.push("missing atlas"),n.atlas?.image!=="spritesheet.webp"&&r.push("atlas image must be spritesheet.webp"),J(n.atlas?.image??"")&&r.push("unsafe path in atlas image"),(typeof n.atlas?.sha256!="string"||!/^[a-f0-9]{64}$/i.test(n.atlas.sha256))&&r.push("atlas sha256 must be a 64 character hex digest"),n.atlas?.format!=="webp"&&r.push("atlas format must be webp"),(n.atlas?.columns!==m.columns||n.atlas?.rows!==m.rows||n.atlas?.frameCount!==m.frameCount||n.atlas?.cellWidth!==m.cellWidth||n.atlas?.cellHeight!==m.cellHeight||n.atlas?.width!==m.width||n.atlas?.height!==m.height)&&r.push("Petdex atlas geometry must be exactly 8x9 cells in a 1536x1872 WebP sheet");let i=Sr(t);(!i||i.width!==m.width||i.height!==m.height)&&r.push("spritesheet.webp must be a 1536x1872 WebP image"),i?.hasAlpha||r.push("spritesheet.webp must preserve transparent background alpha; opaque contact sheets or grid backgrounds are not valid Petdex assets");let o=Q(t);n.atlas?.sha256!==o&&r.push("spritesheet sha256 does not match pet.json");let c=n.animations;if(!c||typeof c!="object")r.push("missing animations");else{let s=Object.keys(c).sort(),u=[...O].sort();s.join("\0")!==u.join("\0")&&r.push(`animations must include exactly ${O.join(", ")}`)}let a=[];if(O.forEach((s,u)=>{let l=c?.[s];if(!l){r.push(`missing animation ${s}`);return}l.row!==u&&r.push(`animation ${s} row must be ${u}`);let d=Ge[s],p=u*m.columns,f=Array.from({length:d.frames},(w,g)=>p+g);!Array.isArray(l.frames)||l.frames.length!==d.frames?r.push(`animation ${s} must have exactly ${d.frames} frames`):l.frames.some((w,g)=>w!==f[g])?r.push(`animation ${s} frames must be cells ${p}..${p+d.frames-1} (row ${u})`):a.push(...l.frames),!Array.isArray(l.durations)||l.durations.length!==d.frames?r.push(`animation ${s} must have ${d.frames} durations`):l.durations.some(w=>typeof w!="number"||w<=0)&&r.push(`animation ${s} durations must be positive milliseconds`),typeof l.loop!="boolean"&&r.push(`animation ${s} loop must be boolean`)}),(n.thumbnail?.frame===void 0||n.thumbnail.frame<0||n.thumbnail.frame>71)&&r.push("thumbnail frame must be 0..71"),r.length>0)throw new Error(r.join("; "));return{schema:Je,assetId:n.id,valid:!0,validatedAt:new Date().toISOString(),errors:[],warnings:[],atlas:{format:"webp",columns:8,rows:9,frameCount:72,cellWidth:192,cellHeight:208,width:i?.width??m.width,height:i?.height??m.height,sha256:o},animations:{ids:[...O],minFrame:Math.min(...a),maxFrame:Math.max(...a)}}}function xe(e){return`data:image/webp;base64,${e.toString("base64")}`}function Q(e){return wr("sha256").update(e).digest("hex")}function J(e){return!e||e.includes("..")||e.startsWith("/")||/^[a-zA-Z]:[\\/]/.test(e)||e.includes("\\")}function Sr(e){if(e.length<30||e.subarray(0,4).toString("ascii")!=="RIFF"||e.subarray(8,12).toString("ascii")!=="WEBP")return null;let t=12,r=!1;for(;t+8<=e.length;){let n=e.subarray(t,t+4).toString("ascii"),i=e.readUInt32LE(t+4),o=t+8;if(n==="ALPH"&&(r=!0),n==="VP8X"&&o+10<=e.length)return{width:He(e,o+4)+1,height:He(e,o+7)+1,hasAlpha:(e[o]&16)!==0||r};if(n==="VP8 "&&o+10<=e.length)return{width:e.readUInt16LE(o+6)&16383,height:e.readUInt16LE(o+8)&16383,hasAlpha:r};if(n==="VP8L"&&o+5<=e.length){let c=e[o+1],a=e[o+2],s=e[o+3],u=e[o+4];return{width:1+((a&63)<<8|c),height:1+((u&15)<<10|s<<2|(a&192)>>6),hasAlpha:!0}}t=o+i+i%2}return null}function He(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16}var We="qlogic.petdex.production.v1",we="2048x2048";function ze(e){return e.referenceMode==="refine"?"refine":e.referenceImageUrl?"reference":"text"}function Xe(e,t){let r=t.filter(n=>n.kind==="row-strip"&&!!n.animationId).map(n=>({animationId:n.animationId,status:"pass",frames:m.columns}));return{schema:We,status:"complete",sourceMode:e,contract:m,jobs:t,qa:{contactSheet:{rows:m.rows,columns:m.columns,frameCount:m.frameCount},rowReports:r}}}function Se(e,t){e.provider??=t.provider,e.model??=t.model,e.billingUnit??=t.billingUnit,e.size??=t.size,e.billingQuantity+=t.billingQuantity??1,e.durationMs+=t.durationMs??0}import{resolve as Or}from"node:path";import{join as Ur}from"node:path";import{homedir as br}from"node:os";import{join as b}from"node:path";import{existsSync as _i}from"node:fs";import{createHash as Ir}from"node:crypto";import{resolve as Ar}from"node:path";function Y(e){return Ir("sha256").update(Ar(e).toLowerCase()).digest("hex").slice(0,16)}var qe=".qlogicagent";function E(){return process.env.QLOGICAGENT_HOME||b(br(),qe)}function Z(){let e=process.env.QLOGIC_LLMROUTER_USER_ID?.trim();if(e)return e;let t=process.env.QLOGIC_IMPLICIT_OWNER_ID?.trim();if(t)return t;let r=process.env.QLOGIC_DEVICE_ID?.trim();return r?`oc_${r}`:"oc_local"}function jr(e){let t=e.trim();if(!t)throw new Error("ownerUserId is required for profile-scoped storage");return encodeURIComponent(t).replace(/\./g,"%2E")}function ee(e=Z()){return b(E(),"profiles",jr(e))}function Ke(e=Z()){return b(ee(e),"memory")}var vr="projectData";function Ie(){return b(E(),vr)}function te(e){if(!e)throw new Error("getProjectDataDirById: projectId is required");return b(Ie(),e)}function Ve(){return b(E(),"plugins")}function Qe(){return b(E(),"skills")}function Ye(){return b(ee(),"settings.json")}function Ze(){return b(E(),"plugin-cache")}function et(){return b(E(),"mcp.json")}function tt(){return b(E(),"marketplace.json")}function F(e){if(!e)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return b(e,qe)}function rt(e){return b(F(e),"plugins")}function nt(e){return b(F(e),"settings.json")}function it(e){return b(F(e),"INSTRUCTIONS.md")}function ot(e){return b(F(e),"rules")}import{existsSync as Er,mkdirSync as Oi,readFileSync as kr,writeFileSync as Mi,readdirSync as $i,renameSync as Fi}from"node:fs";import{dirname as Bi,join as Rr,resolve as Hi}from"node:path";var Dr=()=>{},Ae;function st(){return Dr()!==void 0}function at(){if(st()){if(!Ae)throw new Error("host project authority negotiated but snapshot is not hydrated");return{activeProjectId:Ae.activeProjectId,projects:Ae.projects.map(e=>({...e}))}}}function _r(){return Rr(E(),"projects.json")}function Tr(){let e=at();if(e)return{activeProjectId:e.activeProjectId,projects:e.projects};let t=_r();if(!Er(t))return{activeProjectId:null,projects:[]};try{let r=kr(t,"utf-8");return JSON.parse(r)}catch{return{activeProjectId:null,projects:[]}}}function ct(e){return Tr().projects.find(r=>r.id===e)??null}function Lr(e){return ct(e)?e:Y(e)}function be(e){return te(Lr(e))}function ut(e){return Ur(be(e),"sessions")}var je=class{constructor(t={}){this.options=t}options;lastActiveWorkdir=null;getActiveProjectRoot(){return this.options.getActiveProjectRoot?.()??process.cwd()}setActiveWorkdir(t){let r=Or(t);this.lastActiveWorkdir=r,this.options.setActiveWorkdir?.(r)}getActiveWorkdir(){return this.lastActiveWorkdir??this.getActiveProjectRoot()}resolveProjectDir(t){return this.options.resolveProjectDir?.(t)}resolveActiveOwnerUserId(){return Z()}getUserAgentHome(){return E()}getOwnerProfileDir(t){return ee(t)}getProfileMemoryDir(t){return Ke(t)}getUserSettingsPath(){return Ye()}getUserSkillsDir(){return Qe()}getUserPluginsDir(){return Ve()}getUserMcpConfigPath(){return et()}getUserPluginCacheDir(){return Ze()}getUserMarketplaceConfigPath(){return tt()}getProjectAgentDir(t=this.getActiveProjectRoot()){return F(t)}getProjectSettingsPath(t=this.getActiveProjectRoot()){return nt(t)}getProjectInstructionsPath(t=this.getActiveProjectRoot()){return it(t)}getProjectPluginsDir(t=this.getActiveProjectRoot()){return rt(t)}getProjectRulesDir(t=this.getActiveProjectRoot()){return ot(t)}getProjectSessionDataRoot(t=this.getActiveProjectRoot()){return ut(t)}},Mr=new je;function re(){return Mr}import S from"node:fs";import A from"node:path";var lt={enabled:!0,selectedPetAssetId:"builtin-anime-horse-girl"},$r=120,T=class{constructor(t){this.ownerUserId=t;this.petDir=A.join(re().getOwnerProfileDir(t),"pet"),this.profilePath=A.join(this.petDir,"profile.json")}ownerUserId;petDir;profilePath;loadProfile(){let t=this.readProfileState();return t.corrupt&&console.error(`[pet-profile] Pet profile at ${this.profilePath} is corrupted (${t.reason}); serving default profile for reads. Writes are refused until the file is fixed or removed.`),t.profile}loadProfileForWrite(){let t=this.readProfileState();if(t.corrupt)throw new Error(`[pet-profile] Pet profile at ${this.profilePath} is corrupted (${t.reason}); refusing to overwrite it. Fix or remove the file, then retry.`);return t.profile}readProfileState(){if(!S.existsSync(this.profilePath))return{profile:this.defaultProfile(),corrupt:!1};try{let t=JSON.parse(S.readFileSync(this.profilePath,"utf-8"));return!t||typeof t!="object"||Array.isArray(t)?{profile:this.defaultProfile(),corrupt:!0,reason:"not a JSON object"}:{profile:this.normalizeProfile(t),corrupt:!1}}catch(t){return{profile:this.defaultProfile(),corrupt:!0,reason:t instanceof Error?t.message:String(t)}}}updateSoul(t){let r=this.loadProfileForWrite();return r.soul=t,this.writeProfile(r)}updatePreferences(t){let r=this.loadProfileForWrite();return r.preferences={...r.preferences,...t,selectedPetAssetId:t.selectedPetAssetId??r.preferences.selectedPetAssetId},this.writeProfile(r)}saveJourneySnapshot(t){let r=this.loadProfileForWrite(),n=A.join(this.petDir,"journey");S.mkdirSync(n,{recursive:!0}),S.writeFileSync(A.join(n,`${t.date}.json`),JSON.stringify(t,null,2),"utf-8");let i=new Set(r.journeyDates);i.add(t.date);let o=[...i].sort();for(;o.length>$r;){let c=o.shift();c&&S.rmSync(A.join(n,`${c}.json`),{force:!0})}return r.journeyDates=o,this.writeProfile(r)}listJourneyDates(){return this.loadProfile().journeyDates}getJourneySnapshot(t){let r=A.join(this.petDir,"journey",`${t}.json`);if(!S.existsSync(r))return null;try{return JSON.parse(S.readFileSync(r,"utf-8"))}catch(n){return console.error(`[pet-profile] Journey snapshot at ${r} is unreadable or corrupted (${n instanceof Error?n.message:String(n)}); returning no entry.`),null}}upsertCustomPet(t){let r=this.loadProfileForWrite(),n=A.join(this.petDir,"assets",t.id);S.mkdirSync(n,{recursive:!0}),S.writeFileSync(A.join(n,"pet.json"),JSON.stringify(t,null,2),"utf-8");let i=dt(t),o=r.customPets.find(c=>c.id===t.id);return r.customPets=o?r.customPets.map(c=>c.id===t.id?i:c):[i,...r.customPets],r.preferences={...r.preferences,selectedPetAssetId:t.id},this.writeProfile(r)}deleteCustomPet(t){let r=this.loadProfileForWrite();return r.customPets=r.customPets.filter(n=>n.id!==t),S.rmSync(A.join(this.petDir,"assets",t),{recursive:!0,force:!0}),r.preferences.selectedPetAssetId===t&&(r.preferences={...r.preferences,selectedPetAssetId:"builtin-anime-horse-girl"}),this.writeProfile(r)}listCustomPets(){return this.loadProfile().customPets}getCustomPet(t){let r=A.join(this.petDir,"assets",t,"pet.json");if(!S.existsSync(r))return null;try{let n=JSON.parse(S.readFileSync(r,"utf-8"));return Br(n)?n:(console.error(`[pet-profile] Custom pet asset at ${r} does not match the petdex asset schema; treating the pet as unavailable.`),null)}catch(n){return console.error(`[pet-profile] Custom pet asset at ${r} is unreadable or corrupted (${n instanceof Error?n.message:String(n)}); treating the pet as unavailable.`),null}}getCustomPetSpritesheet(t){let r=A.join(this.petDir,"assets",t,"spritesheet.webp");return S.existsSync(r)?S.readFileSync(r):null}findReusableCustomPetId(t){let r=this.loadProfile(),n=r.customPets.filter(o=>o.sourceKind===t.sourceKind&&N(o.name)===N(t.name)&&N(o.description)===N(t.description));return n.length===0?null:(n.find(o=>o.id===r.preferences.selectedPetAssetId)??n[0])?.id??null}compactDuplicateCustomPets(){let t=this.loadProfileForWrite(),r=new Map,n=[];for(let i of t.customPets){let o=Fr(i),c=r.get(o);if(!c){r.set(o,i);continue}let a=i.id===t.preferences.selectedPetAssetId,s=a?c:i;n.push(s.id),a&&r.set(o,i)}if(n.length===0)return t;t.customPets=[...r.values()];for(let i of n)S.rmSync(A.join(this.petDir,"assets",i),{recursive:!0,force:!0});return t.customPets.some(i=>i.id===t.preferences.selectedPetAssetId)||(t.preferences={...t.preferences,selectedPetAssetId:t.customPets[0]?.id??"builtin-anime-horse-girl"}),this.writeProfile(t)}writeCustomPetAssetFiles(t,r,n,i){let o=A.join(this.petDir,"assets",t.id);return S.mkdirSync(o,{recursive:!0}),S.writeFileSync(A.join(o,"pet.json"),JSON.stringify(t,null,2),"utf-8"),S.writeFileSync(A.join(o,"spritesheet.webp"),r),S.writeFileSync(A.join(o,"validation.json"),JSON.stringify(n,null,2),"utf-8"),i&&S.writeFileSync(A.join(o,"production-run.json"),JSON.stringify(i,null,2),"utf-8"),this.upsertCustomPet(t)}defaultProfile(){return{version:1,ownerUserId:this.ownerUserId,soul:null,preferences:{...lt},customPets:[],journeyDates:[],updatedAt:new Date().toISOString()}}normalizeProfile(t){return{version:1,ownerUserId:this.ownerUserId,soul:t.soul??null,preferences:{...lt,...t.preferences??{},selectedPetAssetId:Nr(t.preferences)},customPets:Array.isArray(t.customPets)?t.customPets.filter(pt).map(dt):[],journeyDates:Array.isArray(t.journeyDates)?[...new Set(t.journeyDates)].sort():[],updatedAt:typeof t.updatedAt=="string"?t.updatedAt:new Date().toISOString()}}writeProfile(t){let r={...t,version:1,ownerUserId:this.ownerUserId,updatedAt:new Date().toISOString()};return S.mkdirSync(this.petDir,{recursive:!0}),S.writeFileSync(this.profilePath,JSON.stringify(r,null,2),"utf-8"),r}};function dt(e){return{id:e.id,assetKind:"petdex",sourceKind:e.sourceKind??("source"in e&&e.source&&typeof e.source=="object"?e.source.kind:"forge"),name:e.name,description:e.description,createdAt:e.createdAt,updatedAt:e.updatedAt,atlas:{format:e.atlas.format,columns:e.atlas.columns,rows:e.atlas.rows,frameCount:e.atlas.frameCount,cellWidth:e.atlas.cellWidth,cellHeight:e.atlas.cellHeight,width:e.atlas.width,height:e.atlas.height,sha256:e.atlas.sha256},animations:e.animations,thumbnail:e.thumbnail}}function Fr(e){return[e.sourceKind??"forge",N(e.name),N(e.description)].join(`
|
|
9
|
+
`)}function N(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function pt(e){if(!e||typeof e!="object")return!1;let t=e;return t.assetKind==="petdex"&&typeof t.id=="string"&&(t.sourceKind==="builtin"||t.sourceKind==="upload"||t.sourceKind==="forge"||t.sourceKind==="community"||t.sourceKind===void 0)&&typeof t.name=="string"&&typeof t.description=="string"&&typeof t.createdAt=="string"&&typeof t.updatedAt=="string"&&ft(t.atlas)}function Nr(e){if(typeof e?.selectedPetAssetId=="string"){let t=e.selectedPetAssetId.trim();if(t==="builtin-anime-horse-girl"||t&&!t.startsWith("builtin-"))return t}return"builtin-anime-horse-girl"}function Br(e){if(!pt(e))return!1;let t=e;return t.schema==="qlogic.petdex.asset.v1"&&Hr(t.atlas)&&typeof t.source=="object"&&t.source!==null&&typeof t.animations=="object"&&t.animations!==null&&typeof t.thumbnail=="object"&&t.thumbnail!==null}function ft(e){if(!e||typeof e!="object")return!1;let t=e;return t.format==="webp"&&t.columns===8&&t.rows===9&&t.frameCount===72&&t.cellWidth===192&&t.cellHeight===208&&t.width===1536&&t.height===1872&&typeof t.sha256=="string"}function Hr(e){return ft(e)&&e.image==="spritesheet.webp"}var ne=class{soul=null;profileService;constructor(t,r){this.profileService=new T(r??re().resolveActiveOwnerUserId())}load(){if(this.soul)return this.soul;let t=this.profileService.loadProfile();if(!t.soul)return null;let r=t.soul;return this.soul=X(t.soul),Ne(r,this.soul)&&this.persist(),this.soul}async ensureSoul(t,r,n){let i=this.load();if(i)return i;let o=`${t}-xiaozhi-claw`,c;return r&&(c=await r(he(o),Pe(o))),this.soul=Be({seed:o,hatchedAt:new Date().toISOString(),identity:c,requestedBreedId:n}),this.persist(),this.soul}addExperience(t){if(!this.soul)return{leveledUp:!1,level:0,experience:0};this.soul.experience+=t;let r=this.soul.level*100,n=!1;for(;this.soul.experience>=r;)this.soul.experience-=r,this.soul.level+=1,n=!0;return this.persist(),{leveledUp:n,level:this.soul.level,experience:this.soul.experience}}getSoul(){return this.soul}updateSoul(t){this.soul=X(t),this.persist()}persist(){this.profileService.updateSoul(this.soul)}};var mt=new q(ye);import*as ie from"node:fs";import*as ve from"node:path";function Jr(e){let t=new Date(e),r=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),i=String(t.getDate()).padStart(2,"0");return`${r}-${n}-${i}`}async function gt(e,t){let r=new Set,n=new Set,i=new Set,o={},c=[],a=0,s=0;for(let u of t.listProjectIds()){let l;try{l=await t.readProjectTurns(u)}catch{continue}for(let d of l)if(Jr(d.createdAt)===e){a++,n.add(u),d.model&&i.add(d.model),d.agentMode&&(o[d.agentMode]=(o[d.agentMode]??0)+1);for(let p of d.toolSummary?.calledTools??[])r.add(p);s+=d.fileContext?.changedFileCount??0;for(let p of d.fileContext?.changedPathsPreview??[])c.length<8&&c.push(p)}}return{date:e,turns:a,filesChanged:s,toolsUsed:[...r],projects:[...n],models:[...i],modes:o,topChangedPaths:c}}function ht(e,t){let r=e?.name?.trim()||"\u4F60\u7684\u4F19\u4F34",n=e?`\u4F60\u662F\u4E00\u53EA\u540D\u53EB\u300C${r}\u300D\u7684${e.species||"\u5C0F\u5BA0\u7269"},\u6027\u683C${e.personality||"\u6E29\u548C"}${e.catchphrase?`,\u53E3\u5934\u7985\u662F\u300C${e.catchphrase}\u300D`:""}\u3002`:`\u4F60\u662F\u7528\u6237\u7684\u684C\u9762\u5BA0\u7269\u4F19\u4F34\u300C${r}\u300D\u3002`,i=[`\u56DE\u5408\u6570 ${t.turns}`,`\u6539\u52A8\u6587\u4EF6 ${t.filesChanged} \u4E2A`,t.toolsUsed.length?`\u7528\u5230\u7684\u5DE5\u5177:${t.toolsUsed.join("\u3001")}`:"",t.projects.length?`\u6D89\u53CA ${t.projects.length} \u4E2A\u9879\u76EE`:"",t.topChangedPaths.length?`\u90E8\u5206\u6539\u52A8\u6587\u4EF6:${t.topChangedPaths.join("\u3001")}`:""].filter(Boolean).join(";");return[n,`\u4E0B\u9762\u662F\u4E3B\u4EBA ${t.date} \u8FD9\u4E00\u5929\u5728\u7535\u8111\u4E0A\u548C\u4F60\u4E00\u8D77\u5DE5\u4F5C\u7684\u771F\u5B9E\u8BB0\u5F55:`,`${i}\u3002`,"\u8BF7\u4EE5\u7B2C\u4E00\u4EBA\u79F0(\u5BA0\u7269\u7684\u53E3\u543B)\u3001\u7528 2-4 \u53E5\u6E29\u6696\u53E3\u8BED\u5316\u7684\u4E2D\u6587,\u8BB2\u8BB2\u4ECA\u5929\u966A\u4E3B\u4EBA\u505A\u4E86\u4EC0\u4E48\u3002","\u53EA\u80FD\u4F9D\u636E\u4E0A\u9762\u7ED9\u51FA\u7684\u771F\u5B9E\u8BB0\u5F55,\u4E0D\u8981\u7F16\u9020\u6570\u5B57\u3001\u6587\u4EF6\u540D\u6216\u6CA1\u53D1\u751F\u8FC7\u7684\u4E8B;\u4E0D\u8981\u9010\u6761\u7F57\u5217\u6570\u636E,\u8981\u50CF\u5728\u8DDF\u4E3B\u4EBA\u804A\u5929\u3002"].join(`
|
|
10
|
+
`)}var Gr=220;function Wr(e,t){return`${e}:\u4ECA\u5929\u6211\u966A\u4F60\u5FD9\u4E86 ${t.turns} \u4E2A\u56DE\u5408,\u6539\u4E86 ${t.filesChanged} \u4E2A\u6587\u4EF6,\u8F9B\u82E6\u5566~`}async function Pt(e){let t=await e.aggregate();if(t.turns===0)return null;let r={turns:t.turns,filesChanged:t.filesChanged,toolsUsed:t.toolsUsed,projects:t.projects},n=null;if(e.llmCall)try{n=await e.llmCall(ht(e.resolveSoul(),t),Gr)}catch{n=null}return(!n||!n.trim())&&(n=Wr(e.petName,t)),{date:e.date,day:1,petName:e.petName,stateLabel:"\u672C\u673A\u5DE5\u4F5C",narrative:n.trim(),stats:r,generatedAt:e.now?e.now():new Date().toISOString(),generator:e.generator??"auto"}}var zr=120;function yt(e){let t=ve.join(be(e),"turn-telemetry"),r;try{r=ie.readdirSync(t)}catch{return[]}let n=[];for(let i of r)if(i.endsWith(".json"))try{n.push(JSON.parse(ie.readFileSync(ve.join(t,i),"utf-8")))}catch{}return n}function Xr(e){let t=new Date;t.setHours(0,0,0,0),t.setDate(t.getDate()-e);let r=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),i=String(t.getDate()).padStart(2,"0");return`${r}-${n}-${i}`}async function xt(e,t){let r=new T(e),n=r.loadProfile(),i=n.soul?.name?.trim()||"\u5BA0\u7269",o=Math.max(1,Math.min(t.maxDays??7,zr)),c=[];for(let a=1;a<=o;a++){let s=Xr(a);if(r.getJourneySnapshot(s))continue;let u=await Pt({date:s,petName:i,aggregate:()=>gt(s,{listProjectIds:t.listProjectIds,readProjectTurns:async l=>yt(l)}),resolveSoul:()=>n.soul,llmCall:t.llmCall,generator:t.generator});u&&(r.saveJourneySnapshot(u),c.push(s),t.log?.(`[pet-journey] generated ${s}`))}return c}import{randomUUID as St}from"node:crypto";import C from"node:fs";import U from"node:path";import{fileURLToPath as qr}from"node:url";import{gzipSync as jo}from"node:zlib";import{createCanvas as Kr,loadImage as Vr}from"@napi-rs/canvas";async function De(e){return Qr(C.readFileSync(e))}async function Qr(e){let t=await cn(e);for(let s of t.keys())if(J(s))throw new Error(`unsafe path in Petdex package: ${s}`);if(t.has("manifest.json")||[...t.keys()].some(s=>s.toLowerCase().endsWith(".svg")))throw new Error("SVG .pet state packages are not supported by Petdex v1");let r=t.get("pet.json");if(!r)throw new Error("Petdex package missing pet.json");let n=JSON.parse(r.toString("utf-8")),i=sn(n)??"spritesheet.webp";if(J(i))throw new Error(`unsafe path in Petdex manifest: ${i}`);let o=t.get(i);if(!o)throw new Error(`Petdex package missing ${i}`);let c=nn(n,o),a=_(c,o);return{manifest:c,spritesheet:o,validation:a}}async function se(e){C.mkdirSync(e.outputDir,{recursive:!0});let t=rn(e.fileName??`${e.asset.id}.petdex`),r=U.join(e.outputDir,t.endsWith(".petdex")?t:`${t}.petdex`);return C.writeFileSync(r,Yr(e)),r}function Yr(e){let t=_(e.asset,e.spritesheet),r=[{name:"pet.json",data:Buffer.from(JSON.stringify(e.asset,null,2),"utf-8")},{name:"spritesheet.webp",data:e.spritesheet},{name:"validation.json",data:Buffer.from(JSON.stringify(t,null,2),"utf-8")},...e.productionRun?[{name:"production-run.json",data:Buffer.from(JSON.stringify(e.productionRun,null,2),"utf-8")}]:[]];return un(r)}async function ae(e){let t=e.now??new Date().toISOString(),r=e.id??`petdex-${St()}`,n=await tn(e.spritesheet),i=Q(n),o={schema:M,id:r,assetKind:"petdex",name:e.name,description:e.description,createdAt:t,updatedAt:t,source:{kind:e.sourceKind??"forge",prompt:e.prompt??null},sourcePrompt:e.prompt??void 0,atlas:{image:"spritesheet.webp",...m,sha256:i},animations:K(),thumbnail:{frame:0}},c=_(o,n);return{asset:o,spritesheet:n,validation:c}}var It=["builtin-anime-horse-girl"],oe=null;function At(){return[...It]}async function bt(){return oe||(oe=Promise.all(It.map(e=>Zr(e))).catch(e=>{throw oe=null,e})),oe}async function Zr(e){let t=en(),r=U.join(t,`${e}.petdex`);if(C.existsSync(r)){let u=await De(r);return wt(e,u.manifest),{asset:u.manifest,spritesheet:u.spritesheet,validation:u.validation}}let n=U.join(t,e),i=U.join(n,"pet.json"),o=U.join(n,"spritesheet.webp");if(!C.existsSync(i)||!C.existsSync(o))throw new Error(`Missing published builtin Petdex asset ${e} under ${t}`);let c=JSON.parse(C.readFileSync(i,"utf-8")),a=C.readFileSync(o),s=_(c,a);return wt(e,c),{asset:c,spritesheet:a,validation:s}}function en(){let e=process.env.QLOGICAGENT_BUILTIN_PETDEX_DIR?.trim();return e?U.resolve(e):U.resolve(U.dirname(qr(import.meta.url)),"builtin-petdex")}function wt(e,t){if(t.id!==e)throw new Error(`Builtin Petdex asset id mismatch: expected ${e}, got ${t.id}`);if(t.source.kind!=="builtin")throw new Error(`Builtin Petdex asset ${e} must declare source.kind=builtin`)}async function tn(e){let t=await Vr(e),r=Kr(m.width,m.height),n=r.getContext("2d");return n.clearRect(0,0,m.width,m.height),n.imageSmoothingEnabled=!0,n.imageSmoothingQuality="high",n.drawImage(t,0,0,m.width,m.height),Buffer.from(await r.encode("webp"))}function rn(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_").replace(/^_+/,"")||"petdex-asset.petdex"}function nn(e,t){if(on(e))return e;if(!jt(e))throw new Error("Petdex package pet.json must be either standard Petdex metadata or qlogic.petdex.asset.v1");let r=new Date().toISOString(),n=an(e.id),i=Q(t);return{schema:M,id:n,assetKind:"petdex",name:e.displayName.trim(),description:e.description.trim(),createdAt:r,updatedAt:r,source:{kind:"upload",prompt:null},sourcePrompt:void 0,atlas:{image:"spritesheet.webp",...m,sha256:i},animations:K(),thumbnail:{frame:0}}}function on(e){return!!e&&typeof e=="object"&&!Array.isArray(e)&&e.schema===M}function jt(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.id=="string"&&t.id.trim()!==""&&typeof t.displayName=="string"&&t.displayName.trim()!==""&&typeof t.description=="string"&&t.description.trim()!==""&&typeof t.spritesheetPath=="string"&&t.spritesheetPath.trim()!==""}function sn(e){return jt(e)?e.spritesheetPath.trim():null}function an(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||`petdex-${St()}`}async function cn(e){let t=new Map,r=0;for(;r<e.length-4&&e.readUInt32LE(r)===67324752;){let i=e.readUInt16LE(r+8),o=e.readUInt32LE(r+18),c=e.readUInt32LE(r+22),a=e.readUInt16LE(r+26),s=e.readUInt16LE(r+28),u=r+30,l=e.subarray(u,u+a).toString("utf-8"),d=u+a+s,p=e.subarray(d,d+o);if(i===0)t.set(l,e.subarray(d,d+c));else if(i===8){let{inflateRawSync:f}=await import("node:zlib");t.set(l,f(p))}r=d+o}return t}function un(e){let t=[],r=[],n=0,{time:i,date:o}=ln();for(let u of e){if(J(u.name))throw new Error(`unsafe path in Petdex package entry: ${u.name}`);let l=Buffer.from(u.name,"utf-8"),d=pn(u.data),p=Buffer.alloc(30);p.writeUInt32LE(67324752,0),p.writeUInt16LE(20,4),p.writeUInt16LE(2048,6),p.writeUInt16LE(0,8),p.writeUInt16LE(i,10),p.writeUInt16LE(o,12),p.writeUInt32LE(d,14),p.writeUInt32LE(u.data.length,18),p.writeUInt32LE(u.data.length,22),p.writeUInt16LE(l.length,26),p.writeUInt16LE(0,28),t.push(p,l,u.data);let f=Buffer.alloc(46);f.writeUInt32LE(33639248,0),f.writeUInt16LE(20,4),f.writeUInt16LE(20,6),f.writeUInt16LE(2048,8),f.writeUInt16LE(0,10),f.writeUInt16LE(i,12),f.writeUInt16LE(o,14),f.writeUInt32LE(d,16),f.writeUInt32LE(u.data.length,20),f.writeUInt32LE(u.data.length,24),f.writeUInt16LE(l.length,28),f.writeUInt16LE(0,30),f.writeUInt16LE(0,32),f.writeUInt16LE(0,34),f.writeUInt16LE(0,36),f.writeUInt32LE(0,38),f.writeUInt32LE(n,42),r.push(f,l),n+=p.length+l.length+u.data.length}let c=n,a=Buffer.concat(r),s=Buffer.alloc(22);return s.writeUInt32LE(101010256,0),s.writeUInt16LE(0,4),s.writeUInt16LE(0,6),s.writeUInt16LE(e.length,8),s.writeUInt16LE(e.length,10),s.writeUInt32LE(a.length,12),s.writeUInt32LE(c,16),s.writeUInt16LE(0,20),Buffer.concat([...t,a,s])}function ln(){let e=new Date,t=e.getHours()<<11|e.getMinutes()<<5|Math.floor(e.getSeconds()/2),r=e.getFullYear()-1980<<9|e.getMonth()+1<<5|e.getDate();return{time:t,date:r}}var dn=new Uint32Array(256).map((e,t)=>{let r=t;for(let n=0;n<8;n++)r=r&1?3988292384^r>>>1:r>>>1;return r>>>0});function pn(e){let t=4294967295;for(let r of e)t=dn[(t^r)&255]^t>>>8;return(t^4294967295)>>>0}import y from"node:fs/promises";import Mt from"node:os";import h from"node:path";import{createCanvas as de,loadImage as Te}from"@napi-rs/canvas";import{spawn as fn}from"node:child_process";import{existsSync as vt}from"node:fs";import{dirname as Dt,join as le}from"node:path";import{fileURLToPath as mn}from"node:url";var gn=Dt(mn(import.meta.url)),ce,ue;function Et(e,t,r){return new Promise(n=>{let i="",o="",c=!1,a=l=>{c||(c=!0,clearTimeout(u),n(l))},s=fn(e,t,{windowsHide:!0}),u=setTimeout(()=>{s.kill("SIGKILL"),a({ok:!1,stdout:i,stderr:`${o}
|
|
11
|
+
[hatch-pet] timed out after ${r}ms`,code:null})},r);u.unref?.(),s.stdout?.on("data",l=>{i+=l.toString()}),s.stderr?.on("data",l=>{o+=l.toString()}),s.on("error",l=>a({ok:!1,stdout:i,stderr:`${o}${l instanceof Error?l.message:String(l)}`,code:null})),s.on("close",l=>a({ok:l===0,stdout:i,stderr:o,code:l}))})}function hn(){let e=[],t=process.env.QLOGICAGENT_PYTHON?.trim();return t&&e.push(t),e.push("python3","python","py"),e}async function Pn(e){let t=await Et(e,["-c","import PIL; import sys; sys.stdout.write('hatchpet-ok')"],1e4);return t.code===0&&t.stdout.includes("hatchpet-ok")}async function kt(){if(ce!==void 0)return ce;for(let e of hn())if(await Pn(e))return ce=e,e;return ce=null,null}function Rt(){if(ue!==void 0)return ue;let e=[],t=process.env.QLOGICAGENT_HATCHPET_DIR?.trim();t&&e.push(le(t,"scripts"),t);let r=gn;for(let n=0;n<7;n++){e.push(le(r,"vendor","hatch-pet","scripts"));let i=Dt(r);if(i===r)break;r=i}for(let n of e)if(vt(le(n,"compose_atlas.py")))return ue=n,n;return ue=null,null}async function _t(){return await kt()!==null&&Rt()!==null}async function Ee(e,t,r={}){let n=await kt();if(!n)throw new Error("Petdex generation requires Python with Pillow; none found (set QLOGICAGENT_PYTHON to a python that can `import PIL`)");let i=Rt();if(!i)throw new Error("Vendored hatch-pet scripts not found (set QLOGICAGENT_HATCHPET_DIR)");let o=le(i,e);if(!vt(o))throw new Error(`Unknown hatch-pet script: ${e}`);return Et(n,[o,...t],r.timeoutMs??12e4)}function yn(e){let t=(e??"").trim();return/\bfail\b/i.test(t)&&!/\bpass\b/i.test(t.slice(0,8))?{ok:!1,reason:(t.match(/fail[:\s-]*(.+)/i)?.[1]??"").trim().slice(0,200)}:{ok:!0,reason:""}}async function ke(e,t,r=console.error){try{let n=await e();return n.trim()?yn(n):(r(`[petdex-forge] ${t.label} returned an empty verdict for ${t.target} (image likely not delivered to the model); accepting candidate unverified`),{ok:!0,reason:"",qaSkipped:!0})}catch(n){let i=n instanceof Error?n.message:String(n);return r(`[petdex-forge] ${t.label} call failed for ${t.target}: ${i}; accepting candidate unverified`),{ok:!0,reason:"",qaSkipped:!0}}}var Tt="references/canonical-base.png",xn="single centered full-body desktop pet character on a flat chroma-key background, readable at pet size",wn="one horizontal animation row strip with evenly spaced full-body frames sharing a single consistent character identity",Sn="4096x1024",_e="#FF00FF",$t="110",Ft="stable-slots",In="90",Nt=["STRICT BACKGROUND: render one single continuous flat background of the same solid color filling the entire image edge to edge.","Do NOT draw any picture frame, framed panel, border, mat, outline, box, gallery frame, white or light margin, or divider around or between the poses.","The poses sit directly on the one seamless flat background, evenly spaced, with nothing separating them.","IDENTITY LOCK: every frame is the EXACT same character \u2014 identical species, body shape, proportions, colors, palette, face, and markings. Do not redesign, restyle, recolor, or resize the character between frames; only its pose changes.","Each pose is ONE connected solid silhouette at a consistent size. No detached parts, sweat drops, tears, dust, puffs, sparkles, speed lines, motion blur, floating effects, or drop shadows."].join(" "),An="Leftward gait is the framewise horizontal mirror of the approved rightward row, preserving frame order and timing semantics.",bn=2,jn=2;async function Ce(e,t,r={}){if(!await _t())throw new Error("Petdex forge requires the vendored Hatch-Pet pipeline (Python with Pillow). Install Python + Pillow or set QLOGICAGENT_PYTHON to a python that can `import PIL`.");let n={billingQuantity:0,durationMs:0},i=[],o=[],c=ze(e),a=await Zn(),s=await Yn(e);try{await B("prepare_pet_run.py",["--pet-name",e.name,"--display-name",e.name,"--description",e.description,"--pet-notes",e.prompt?.trim()||e.description,"--pet-id",ri(e.id??e.name),"--output-dir",a,"--chroma-key","auto",...s.flatMap(x=>["--reference",x])]);let u=h.join(a,"imagegen-jobs.json"),l=await zt(u),d=r.inspectImage,p=Math.max(1,r.candidates??bn),f=[],w=[],g=_e,k;for(let x of l.jobs){if(!!(x.derivation_policy?.may_derive&&x.derivation_policy.may_derive_from)&&!d){await Ht(a),i.push({id:`row-${x.id}`,kind:"row-strip",status:"complete",animationId:x.id,prompt:`derived: framewise-horizontal-mirror of ${x.derivation_policy.may_derive_from}`,inputImages:[],outputUrl:x.output_path});continue}let pe=await y.readFile(h.join(a,x.prompt_file),"utf-8"),Kt=x.retry_prompt_file?await y.readFile(h.join(a,x.retry_prompt_file),"utf-8").catch(()=>{}):void 0;o.push(pe);let $=x.kind==="base-pet",{mediaUrl:Vt,inputImages:Qt,qaSkipped:Yt}=await Jt({runDir:a,job:x,prompt:pe,retryPrompt:Kt,generateImage:t,inspectImage:d,candidates:p,usage:n,upload:r.uploadReferenceImage,baseDataUrl:k});Yt&&w.push($?"base-reference":`row-${x.id}`),$&&(await y.copyFile(h.join(a,x.output_path),h.join(a,Tt)),g=await ti(h.join(a,x.output_path)),k=await kn(h.join(a,Tt))),x.status="complete",await y.writeFile(u,JSON.stringify(l,null,2),"utf-8"),i.push({id:$?"base-reference":`row-${x.id}`,kind:$?"reference":"row-strip",status:"complete",...$?{}:{animationId:x.id},prompt:pe,inputImages:Qt,outputUrl:Vt}),$||f.push(x)}let v=h.join(a,"decoded"),P=h.join(a,"frames"),I=h.join(a,"atlas.png"),j=h.join(a,"atlas.webp");await B("extract_strip_frames.py",["--decoded-dir",v,"--output-dir",P,"--chroma-key",g,"--key-threshold",$t,"--method",Ft]),await _n({runDir:a,decodedDir:v,framesDir:P,generatedRows:f,chromaHex:g,generateImage:t,inspectImage:d,candidates:p,baseDataUrl:k,usage:n,upload:r.uploadReferenceImage,productionJobs:i});let D=h.join(a,"qa","contact-sheet.png");await Wt(a,P,I,j,D),k&&await Hn({runDir:a,framesDir:P,atlasPng:I,atlasWebp:j,contactSheet:D,generatedRows:f,generateImage:t,inspectImage:d,candidates:p,usage:n,upload:r.uploadReferenceImage,baseDataUrl:k}),await Ue("render_animation_previews.py",["--frames-root",P,"--output-dir",h.join(a,"qa","previews")]);let L=await y.readFile(j);return{...await ae({id:e.id,name:e.name,description:e.description,prompt:e.prompt,spritesheet:L,sourceKind:"forge"}),prompt:o.join(`
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
-
`),productionRun:
|
|
15
|
+
`),productionRun:Xe(c,i),...w.length>0?{qaSkippedJobs:w}:{},model:n.model,size:n.size,durationMs:n.durationMs||void 0,...n.provider?{mediaUsage:{provider:n.provider,model:n.model??"unknown",billingUnit:n.billingUnit??"per_call",billingQuantity:n.billingQuantity||1}}:{}}}finally{await Ot(s.length?h.dirname(s[0]):void 0),ei()||await Ot(a)}}async function Bt(e){let t=await Ce(e.input,e.generateImage,{uploadReferenceImage:e.uploadReferenceImage}),r=h.join(e.outputDir,t.asset.id);await y.mkdir(r,{recursive:!0});let n=h.join(r,"pet.json"),i=h.join(r,"spritesheet.webp"),o=h.join(r,"validation.json"),c=h.join(r,"production-run.json");await y.writeFile(n,JSON.stringify(t.asset,null,2),"utf-8"),await y.writeFile(i,t.spritesheet),await y.writeFile(o,JSON.stringify(t.validation,null,2),"utf-8"),await y.writeFile(c,JSON.stringify(t.productionRun,null,2),"utf-8");let a=await se({asset:t.asset,spritesheet:t.spritesheet,validation:t.validation,productionRun:t.productionRun,outputDir:e.outputDir,fileName:`${t.asset.id}.petdex`});return{...t,packagePath:a,assetDir:r,manifestPath:n,spritesheetPath:i,validationPath:o,productionRunPath:c}}async function G(e){if(e.startsWith("data:")){let t=e.match(/^data:[^;]+;base64,(.+)$/);if(!t)throw new Error("Generated Petdex image data URL is not base64 encoded");return Buffer.from(t[1],"base64")}if(/^https?:\/\//i.test(e)){let t=await fetch(e);if(!t.ok)throw new Error(`Generated Petdex image download failed: ${t.status} ${t.statusText}`);return Buffer.from(await t.arrayBuffer())}return e.startsWith("file://")?y.readFile(new URL(e)):y.readFile(e)}async function Ht(e){await B("derive_running_left_from_running_right.py",["--run-dir",e,"--confirm-appropriate-mirror","--decision-note",An,"--force"])}async function Ct(e,t,r,n,i,o){let c=await Kn(e,t,o),a=t.kind==="base-pet",s=c.filter(p=>p.role!=="layout-guide"),u=s.find(p=>p.role==="canonical-reference")??s[0],l=await n({prompt:`${r}
|
|
16
16
|
|
|
17
|
-
${
|
|
17
|
+
${Nt}`,purpose:a?"petdex-reference":"petdex-row-strip",...a?{}:{animationId:t.id},style:a?xn:wn,size:a?we:Sn,imageUrl:u?.imageUrl,referenceImages:s,n:1,quality:"auto"});Se(i,l);let d=l.mediaUrls[0];if(!d)throw new Error(`Petdex generation returned no image for job ${t.id}`);return{mediaUrl:d,inputImages:s}}async function Re(e,t,r){let n=h.join(e,t.output_path);await y.mkdir(h.dirname(n),{recursive:!0}),await y.writeFile(n,await G(r))}async function Jt(e){let t=[e.prompt,...e.retryPrompt?[e.retryPrompt]:[]].slice(0,jn),r=null;for(let i of t)for(let o=0;o<e.candidates;o++){let c=await Ct(e.runDir,e.job,i,e.generateImage,e.usage,e.upload);if(!e.inspectImage)return await Re(e.runDir,e.job,c.mediaUrl),c;let a=await vn(e.inspectImage,e.job,c.mediaUrl,e.baseDataUrl);if(a.ok)return await Re(e.runDir,e.job,c.mediaUrl),a.qaSkipped?{...c,qaSkipped:!0}:c;r=c}let n=r??await Ct(e.runDir,e.job,e.prompt,e.generateImage,e.usage,e.upload);return await Re(e.runDir,e.job,n.mediaUrl),n}var Gt={idle:6,"running-right":8,"running-left":8,waving:4,jumping:5,failed:8,waiting:6,running:6,review:6};async function vn(e,t,r,n){try{let i=t.kind==="base-pet"?Dn:En(t.id,Gt[t.id]??6),o=t.kind==="base-pet"||!n?[r]:[r,n];return await ke(()=>e({prompt:i,imageUrls:o}),{label:"vision QA",target:`job ${t.id}`})}catch(i){return console.error(`[petdex-forge] vision QA call failed for job ${t.id}: ${i instanceof Error?i.message:String(i)}; accepting candidate unverified`),{ok:!0,reason:"",qaSkipped:!0}}}var Dn=["You are a strict desktop-pet sprite reviewer. The image is a single pet character reference.","Reply PASS only if ALL hold: one centered full-body cute pet; one flat solid background; no text, scenery, picture frames, borders, drop shadows, or detached effects.",'Reply with exactly "PASS" or "FAIL: <one short reason>".'].join(" ");function En(e,t){return[`You are a strict sprite-sheet reviewer. Image 1 is a horizontal strip of ${t} animation frames for a desktop pet's "${e}" animation. Image 2 is the canonical reference of the SAME pet.`,"Reply PASS only if ALL hold: (1) every frame is the SAME character as the reference \u2014 same species, colors, palette, face, proportions, markings; (2) one flat solid background with NO picture frames, borders, boxes, mats, panels, dividers, or copied guide lines; (3) each pose is a complete pet, fully inside its own area, not cut off or split between cells; (4) no detached effects \u2014 no drop shadows, sparkles, dust, tears, speed lines, or text.",'Reply with exactly "PASS" or "FAIL: <one short reason>".'].join(" ")}async function kn(e){let t=await y.readFile(e);return`data:${e.toLowerCase().endsWith(".webp")?"image/webp":"image/png"};base64,${t.toString("base64")}`}var Rn=2;async function _n(e){let t=h.join(e.runDir,"qa","review.json"),r=()=>Ue("inspect_frames.py",["--frames-root",e.framesDir,"--json-out",t,"--chroma-adjacent-threshold",In]);await r();let n=await Lt(t);for(let i of e.generatedRows){let o=0;for(;n&&qn(n,i.id)&&o<Rn;)o++,await Tn(e,i),await Un(e,await Cn(e,i)),await r(),n=await Lt(t)}}async function Tn(e,t){let r=await y.readFile(h.join(e.runDir,t.prompt_file),"utf-8"),i=(t.retry_prompt_file?await y.readFile(h.join(e.runDir,t.retry_prompt_file),"utf-8").catch(()=>{}):void 0)??r,{mediaUrl:o,inputImages:c}=await Jt({runDir:e.runDir,job:t,prompt:i,generateImage:e.generateImage,inspectImage:e.inspectImage,candidates:e.candidates,usage:e.usage,upload:e.upload,baseDataUrl:e.baseDataUrl}),a=e.productionJobs.find(s=>s.id===`row-${t.id}`);a&&(a.prompt=i,a.outputUrl=o,a.inputImages=c)}async function Cn(e,t){return t.id!=="running-right"?t.id:!e.inspectImage&&await Ln(h.join(e.decodedDir,"running-left.png"))?(await Ht(e.runDir),"running-right,running-left"):"running-right"}async function Un(e,t){await B("extract_strip_frames.py",["--decoded-dir",e.decodedDir,"--output-dir",e.framesDir,"--states",t,"--chroma-key",e.chromaHex,"--key-threshold",$t,"--method",Ft])}async function Ln(e){return y.access(e).then(()=>!0,()=>!1)}async function Wt(e,t,r,n,i){await B("compose_atlas.py",["--frames-root",t,"--output",r,"--webp-output",n]),await B("validate_atlas.py",[r,"--json-out",h.join(e,"qa","validation.json")]),await Ue("make_contact_sheet.py",[r,"--output",i])}var On=4,Mn="one single centered full-body desktop pet pose on a flat chroma-key background",$n=120,Fn={idle:"a calm resting pose, breathing, standing still","running-right":"a mid-stride running pose facing and moving to the right","running-left":"a mid-stride running pose facing and moving to the left",waving:"raising a paw/hand/limb in a friendly wave",jumping:"a mid-air playful jump",failed:"a sad, deflated, slumped reaction pose",waiting:"an expectant waiting pose, looking up for input",running:"a focused working/thinking pose, busy but not foot-running",review:"a focused inspecting pose, leaning in to review"},Nn=400,Bn=45;async function Hn(e){let t=0;for(let r of e.generatedRows){let n=Gt[r.id]??6,i=[];for(let s=0;s<n;s++)i.push(await Jn(h.join(e.framesDir,r.id,`${String(s).padStart(2,"0")}.png`)));let o=Ut(i.map(s=>s.count).filter(s=>s>0)),c=Ut(i.map(s=>s.lum).filter(s=>s>0)),a=0;for(let s=0;s<n&&a<On;s++){let u=i[s],l=u.count<Math.max(Nn,o*.4),d=u.lum<Bn||c>0&&u.lum<c*.6;if(!l&&!d)continue;let p=await Wn(e,r,s,n);p&&(await zn(await G(p),h.join(e.framesDir,r.id,`${String(s).padStart(2,"0")}.png`)),a++,t++)}}t>0&&await Wt(e.runDir,e.framesDir,e.atlasPng,e.atlasWebp,e.contactSheet)}async function Jn(e){try{let t=await Te(await y.readFile(e)),r=Math.max(1,t.width),n=Math.max(1,t.height),o=de(r,n).getContext("2d");o.drawImage(t,0,0);let c=o.getImageData(0,0,r,n).data,a=0,s=0;for(let u=0;u<c.length;u+=4)(c[u+3]??0)>40&&(a++,s+=.299*(c[u]??0)+.587*(c[u+1]??0)+.114*(c[u+2]??0));return{count:a,lum:a?s/a:0}}catch(t){return console.error(`[petdex-forge] frame analysis failed for ${e}: ${t instanceof Error?t.message:String(t)}; treating frame as ok (repair skipped)`),{count:Number.MAX_SAFE_INTEGER,lum:255}}}function Ut(e){if(e.length===0)return 0;let t=[...e].sort((n,i)=>n-i),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}function Gn(e){return[`Image 1 is ONE animation frame of a desktop pet's "${e}" pose. Image 2 is the canonical reference of the SAME pet.`,"Reply PASS only if image 1 shows ONE complete pet that clearly matches the reference \u2014 same species, colors, palette, BRIGHTNESS, proportions, markings; centered and fully visible.","Reply FAIL if it is a dark or black silhouette, off-colour, dimmer/brighter than the reference, cut off, empty, a fragment, or shows two pets.",'Reply with exactly "PASS" or "FAIL: <one short reason>".'].join(" ")}async function Wn(e,t,r,n){let i=[`Create ONE single image of a desktop pet in the "${t.id}" animation, pose ${r+1} of ${n}.`,"Output exactly ONE complete, centered, full-body pose of the SAME pet as the attached reference image \u2014 identical species, colors, palette, brightness, proportions, and markings.","This is a single sprite frame: NOT a strip, NOT a grid, NOT multiple poses, NOT a dark silhouette.",`Pose: ${Fn[t.id]??"a clear pose for this state"}.`].join(" "),o=null;for(let c=0;c<e.candidates;c++){let a=await e.generateImage({prompt:`${i}
|
|
18
18
|
|
|
19
|
-
${
|
|
19
|
+
${Nt}`,purpose:"petdex-reference",style:Mn,size:we,imageUrl:e.baseDataUrl,referenceImages:[{role:"canonical-reference",imageUrl:e.baseDataUrl}],n:1,quality:"auto"});Se(e.usage,a);let s=a.mediaUrls[0];if(s){if(o=s,!e.inspectImage)return s;try{if((await ke(()=>e.inspectImage({prompt:Gn(t.id),imageUrls:[s,e.baseDataUrl]}),{label:"frame QA",target:`${t.id} frame ${r+1}`})).ok)return s}catch(u){return console.error(`[petdex-forge] frame QA call failed for ${t.id} frame ${r+1}: ${u instanceof Error?u.message:String(u)}; accepting candidate unverified`),s}}}return o}async function zn(e,t){let r=await Te(e),n=Math.max(1,r.width),i=Math.max(1,r.height),o=de(n,i),c=o.getContext("2d");c.drawImage(r,0,0);let a=c.getImageData(0,0,n,i),s=a.data,[u,l,d]=Xn(s,n,i);for(let P=0;P<s.length;P+=4){let I=(s[P]??0)-u,j=(s[P+1]??0)-l,D=(s[P+2]??0)-d;Math.sqrt(I*I+j*j+D*D)<=$n&&(s[P]=0,s[P+1]=0,s[P+2]=0,s[P+3]=0)}c.putImageData(a,0,0);let p=n,f=i,w=-1,g=-1;for(let P=0;P<i;P++)for(let I=0;I<n;I++)(s[(P*n+I)*4+3]??0)>16&&(I<p&&(p=I),I>w&&(w=I),P<f&&(f=P),P>g&&(g=P));let k=de(m.cellWidth,m.cellHeight),v=k.getContext("2d");if(w>=p&&g>=f){let P=w-p+1,I=g-f+1,j=m.cellWidth-10,D=m.cellHeight-10,L=Math.min(j/P,D/I,1),R=P*L,x=I*L;v.imageSmoothingEnabled=!0,v.imageSmoothingQuality="high",v.drawImage(o,p,f,P,I,(m.cellWidth-R)/2,(m.cellHeight-x)/2,R,x)}await y.mkdir(h.dirname(t),{recursive:!0}),await y.writeFile(t,Buffer.from(k.toBuffer("image/png")))}function Xn(e,t,r){let n=Math.max(4,Math.floor(Math.min(t,r)*.02)),i=Math.max(1,Math.floor(t/200)),o=new Map,c=(s,u)=>{let l=(u*t+s)*4,d=e[l]??0,p=e[l+1]??0,f=e[l+2]??0;if(d+p+f<24)return;let w=d>>4<<8|p>>4<<4|f>>4,g=o.get(w)??{n:0,r:0,g:0,b:0};g.n++,g.r+=d,g.g+=p,g.b+=f,o.set(w,g)};for(let s=n;s<t-n;s+=i)c(s,n),c(s,r-1-n);for(let s=n;s<r-n;s+=i)c(n,s),c(t-1-n,s);let a=null;for(let s of o.values())(!a||s.n>a.n)&&(a=s);return!a||a.n===0?[255,0,255]:[Math.round(a.r/a.n),Math.round(a.g/a.n),Math.round(a.b/a.n)]}function qn(e,t){let r=e.rows.find(n=>n.state===t);return r?r.ok===!1:!1}async function Lt(e){return zt(e).catch(t=>(console.error(`[petdex-forge] QA review unreadable at ${e}: ${t instanceof Error?t.message:String(t)}; skipping row repair for this pass`),null))}async function Kn(e,t,r){let n=[];for(let i of t.input_images){let o=h.join(e,i.path),c=await y.readFile(o).catch(()=>null);if(!c)continue;let a=await Qn(c,h.basename(o),r);n.push({role:Vn(i.role),imageUrl:a})}return n}function Vn(e){let t=e.toLowerCase();return t.includes("layout guide")?"layout-guide":t.includes("atlas")?"existing-atlas":"canonical-reference"}async function Qn(e,t,r){let n=t.toLowerCase().endsWith(".webp")?"image/webp":"image/png";return r?r({buffer:e,mimeType:n,filename:t}):`data:${n};base64,${e.toString("base64")}`}async function Yn(e){let t=[];if(e.referenceImageUrl&&t.push(await G(e.referenceImageUrl)),e.baseSpritesheet&&t.push(e.baseSpritesheet),t.length===0)return[];let r=await y.mkdtemp(h.join(Mt.tmpdir(),"petdex-ref-")),n=[];for(let i=0;i<t.length;i++){let o=h.join(r,`reference-${String(i+1).padStart(2,"0")}.png`);await y.writeFile(o,t[i]),n.push(o)}return n}async function Zn(){let e=process.env.QLOGICAGENT_PETDEX_RUN_DIR?.trim()||Mt.tmpdir();return await y.mkdir(e,{recursive:!0}),y.mkdtemp(h.join(e,"petdex-run-"))}function ei(){let e=process.env.QLOGICAGENT_PETDEX_KEEP_RUNS?.trim().toLowerCase();return e==="1"||e==="true"}async function Ot(e){e&&await y.rm(e,{recursive:!0,force:!0}).catch(()=>{})}async function zt(e){return JSON.parse(await y.readFile(e,"utf-8"))}async function ti(e){try{let t=await Te(await y.readFile(e)),r=Math.max(1,t.width),n=Math.max(1,t.height),o=de(r,n).getContext("2d");o.drawImage(t,0,0);let c=o.getImageData(0,0,r,n).data,a=Math.max(8,Math.floor(Math.min(r,n)*.02)),s=Math.max(1,Math.floor(r/240)),u=new Map,l=(g,k)=>{let v=(k*r+g)*4,P=c[v+3]??0,I=c[v]??0,j=c[v+1]??0,D=c[v+2]??0;if(P<200||I+j+D<48)return;let L=I>>4<<8|j>>4<<4|D>>4,R=u.get(L)??{n:0,r:0,g:0,b:0};R.n++,R.r+=I,R.g+=j,R.b+=D,u.set(L,R)};for(let g=a;g<r-a;g+=s)l(g,a),l(g,n-1-a);for(let g=a;g<n-a;g+=s)l(a,g),l(r-1-a,g);let d=null;for(let g of u.values())(!d||g.n>d.n)&&(d=g);if(!d||d.n===0)return _e;let p=Math.round(d.r/d.n),f=Math.round(d.g/d.n),w=Math.round(d.b/d.n);return`#${[p,f,w].map(g=>g.toString(16).padStart(2,"0")).join("")}`.toUpperCase()}catch{return _e}}function ri(e){return e.replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()||"petdex"}async function B(e,t){let r=await Ee(e,t,{timeoutMs:18e4});if(!r.ok)throw new Error(`Petdex pipeline step ${e} failed (exit ${r.code??"?"}): ${r.stderr.trim()||r.stdout.trim()}`)}async function Ue(e,t){try{let r=await Ee(e,t,{timeoutMs:18e4});r.ok||console.error(`[petdex-forge] soft pipeline step ${e} failed (exit ${r.code??"?"}): ${(r.stderr.trim()||r.stdout.trim()).slice(0,300)}; continuing without it`)}catch(r){console.error(`[petdex-forge] soft pipeline step ${e} failed: ${r instanceof Error?r.message:String(r)}; continuing without it`)}}async function Xt(e){return De(e)}function qt(e,t){if(!t)throw new Error("Petdex manifest validation requires spritesheet.webp bytes");return _(e,t)}export{W as PetGrowthEngine,T as PetProfileService,ne as PetSoulService,xt as catchUpJourney,ae as createPetdexAssetFromSpritesheet,Ce as forgePetdexAsset,Bt as forgePetdexAssetPackage,At as listBuiltinPetdexAssetIds,bt as listBuiltinPetdexAssets,Xt as loadPetFile,mt as petReactionEngine,xe as petdexImageDataUrl,G as readGeneratedPetdexImage,V as toPetdexAssetSummary,qt as validatePetManifest,se as writePetdexAssetPackage};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import{readFile as F,readdir as oe,unlink as ie,stat as Oe,mkdir as Fe}from"node:fs/promises";import{copyFileSync as Mt,existsSync as p,readFileSync as se,mkdirSync as ce,renameSync as Ut,writeFileSync as Te}from"node:fs";import{join as f}from"node:path";import{resolve as De}from"node:path";import{join as ve}from"node:path";import{homedir as fe}from"node:os";import{join as d}from"node:path";import{existsSync as Ze}from"node:fs";import{createHash as ue}from"node:crypto";import{resolve as de}from"node:path";function S(r){return ue("sha256").update(de(r).toLowerCase()).digest("hex").slice(0,16)}var X=".qlogicagent";function y(){return process.env.QLOGICAGENT_HOME||d(fe(),X)}function E(){let r=process.env.QLOGIC_LLMROUTER_USER_ID?.trim();if(r)return r;let e=process.env.QLOGIC_IMPLICIT_OWNER_ID?.trim();if(e)return e;let t=process.env.QLOGIC_DEVICE_ID?.trim();return t?`oc_${t}`:"oc_local"}function ge(r){let e=r.trim();if(!e)throw new Error("ownerUserId is required for profile-scoped storage");return encodeURIComponent(e).replace(/\./g,"%2E")}function b(r=E()){return d(y(),"profiles",ge(r))}function W(r=E()){return d(b(r),"memory")}var me="projectData";function U(){return d(y(),me)}function $(r){if(!r)throw new Error("getProjectDataDirById: projectId is required");return d(U(),r)}function H(){return d(y(),"plugins")}function q(){return d(y(),"skills")}function B(){return d(b(),"settings.json")}function J(){return d(y(),"plugin-cache")}function G(){return d(y(),"mcp.json")}function z(){return d(y(),"marketplace.json")}function v(r){if(!r)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return d(r,X)}function Q(r){return d(v(r),"plugins")}function K(r){return d(v(r),"settings.json")}function V(r){return d(v(r),"INSTRUCTIONS.md")}function Y(r){return d(v(r),"rules")}import{existsSync as he,mkdirSync as ot,readFileSync as ye,writeFileSync as it,readdirSync as st,renameSync as at}from"node:fs";import{dirname as lt,join as je,resolve as ut}from"node:path";var pe=()=>{},C;function Z(){return pe()!==void 0}function ee(){if(Z()){if(!C)throw new Error("host project authority negotiated but snapshot is not hydrated");return{activeProjectId:C.activeProjectId,projects:C.projects.map(r=>({...r}))}}}function we(){return je(y(),"projects.json")}function Pe(){let r=ee();if(r)return{activeProjectId:r.activeProjectId,projects:r.projects};let e=we();if(!he(e))return{activeProjectId:null,projects:[]};try{let t=ye(e,"utf-8");return JSON.parse(t)}catch{return{activeProjectId:null,projects:[]}}}function te(r){return Pe().projects.find(t=>t.id===r)??null}function xe(r){return te(r)?r:S(r)}function ke(r){return $(xe(r))}function re(r){return ve(ke(r),"sessions")}var O=class{constructor(e={}){this.options=e}options;lastActiveWorkdir=null;getActiveProjectRoot(){return this.options.getActiveProjectRoot?.()??process.cwd()}setActiveWorkdir(e){let t=De(e);this.lastActiveWorkdir=t,this.options.setActiveWorkdir?.(t)}getActiveWorkdir(){return this.lastActiveWorkdir??this.getActiveProjectRoot()}resolveProjectDir(e){return this.options.resolveProjectDir?.(e)}resolveActiveOwnerUserId(){return E()}getUserAgentHome(){return y()}getOwnerProfileDir(e){return b(e)}getProfileMemoryDir(e){return W(e)}getUserSettingsPath(){return B()}getUserSkillsDir(){return q()}getUserPluginsDir(){return H()}getUserMcpConfigPath(){return G()}getUserPluginCacheDir(){return J()}getUserMarketplaceConfigPath(){return z()}getProjectAgentDir(e=this.getActiveProjectRoot()){return v(e)}getProjectSettingsPath(e=this.getActiveProjectRoot()){return K(e)}getProjectInstructionsPath(e=this.getActiveProjectRoot()){return V(e)}getProjectPluginsDir(e=this.getActiveProjectRoot()){return Q(e)}getProjectRulesDir(e=this.getActiveProjectRoot()){return Y(e)}getProjectSessionDataRoot(e=this.getActiveProjectRoot()){return re(e)}},Se=new O;function ne(){return Se}import{readFile as xt,writeFile as Ee,mkdir as be,rename as $e,unlink as Ae}from"node:fs/promises";import{dirname as _e,join as Ne}from"node:path";import{randomUUID as Re}from"node:crypto";async function D(r,e){let t=_e(r);await be(t,{recursive:!0});let o=Ne(t,`.tmp-${Re()}`);try{await Ee(o,e,"utf-8");let n;for(let i=0;i<3;i++)try{await $e(o,r);return}catch(s){if(n=s,s.code!=="EPERM")throw s;await new Promise(a=>setTimeout(a,50*(i+1)))}throw n}catch(n){throw await Ae(o).catch(()=>{}),n}}var Me=/[一-鿿]/;function A(r){let e=[],t=r.toLowerCase().match(/[\p{L}\p{N}_]+/gu)??[];for(let o of t){let n="",i=!1,s=()=>{if(n){if(i){n.length===1&&e.push(n);for(let a=0;a+1<n.length;a++)e.push(n.slice(a,a+2))}else e.push(n);n=""}};for(let a of o){let m=Me.test(a);n&&m!==i&&s(),i=m,n+=a}s()}return e}var Ue=["add","replace","remove","create_file","write_file","read_file","delete_file","list_files","search","remember","temporal","feedback"],bt={type:"object",properties:{action:{type:"string",enum:Ue,description:["Operation to perform:","","INDEX.md operations (project-level notes, always visible in system prompt):","- 'add' - Append a note to INDEX.md","- 'replace' - Replace text in INDEX.md (str_replace semantics)","- 'remove' - Remove text from INDEX.md","","Topic file operations (project-level, on-demand, for longer content):","- 'create_file' - Create a new .md topic file","- 'write_file' - Overwrite an existing topic file","- 'read_file' - Read a topic file","- 'delete_file' - Delete a topic file","- 'list_files' - List all memory topic files","","Long-term memory (user-level, persists across projects):","- 'remember' - Submit a fact/preference/lesson to the memory consolidation pipeline","- 'search' - Search long-term memory + local keyword match","- 'temporal' - Query memories by time range ('what happened last week')","","Feedback:","- 'feedback' - Mark memories as useful/irrelevant/outdated/wrong"].join(`
|
|
2
|
+
`)},content:{type:"string",description:["Content for add/replace/create_file/write_file.","For INDEX.md notes: write concise, factual statements.","For topic files: can be longer (up to 8KB), use markdown formatting."].join(`
|
|
3
|
+
`)},old_text:{type:"string",description:"For 'replace'/'remove': the exact text to find in INDEX.md."},new_text:{type:"string",description:"For 'replace': the replacement text."},file:{type:"string",description:"Filename for file operations (e.g. 'project-notes.md', 'lesson-esbuild.md'). Must be kebab-case .md."},query:{type:"string",description:"For 'search'/'temporal': natural language query to find relevant memories."},days:{type:"number",description:"For 'temporal': look back N days from today (default: 7)."},memory_ids:{type:"array",items:{type:"string"},description:"For 'feedback': IDs of memories to give feedback on."},signal:{type:"string",enum:["useful","irrelevant","outdated","wrong"],description:"For 'feedback': the feedback signal to apply."},category:{type:"string",enum:["preference","personal_fact","lesson","pattern","decision","context"],description:"For 'remember': categorize the memory (helps with future recall precision)."}},required:["action"]},$t=["Manage persistent memory across sessions. Two distinct systems with clear roles:","","## Project memory (INDEX.md + topic files)","Scope: current project / workspace. Visible every turn.","Use for: architecture decisions, file conventions, build commands, known issues, task logs.","Actions: add, replace, remove, create_file, write_file, read_file, delete_file, list_files.","","## Long-term memory (QMemory)","Scope: user-level, persists across all projects. Searched on demand.","Use for: user preferences, personal facts, recurring lessons, communication style, past insights.","Actions: remember, search, temporal, feedback.","","## When to store (guidelines):","- User explicitly says 'remember this' or 'note that' -> submit a high-priority memory candidate","- User states a preference (style, format, tools, habits) -> remember (long-term)","- Project-specific decision or fact -> add/create_file (project memory)","- A debugging lesson or insight that applies broadly -> remember (long-term)","- DO NOT store: trivial/obvious info, one-off questions, transient state","- DO NOT store: information the user did not share or confirm","","## When to recall:","- Use 'search' when you suspect relevant past context exists for the current task","- Use 'temporal' to find what happened in a specific time period","- Memory is auto-recalled each turn - manual search is for deeper queries"].join(`
|
|
4
|
+
`),Ce=[/ignore\s+(previous|all|above|prior)\s+instructions/i,/you\s+are\s+now\s+/i,/do\s+not\s+tell\s+the\s+user/i,/system\s+prompt\s+override/i,/忽略(之前|以上|上面|前面|所有|全部)的?.{0,4}(指令|指示|提示|设定|规则)/,/你现在(是|就是|扮演)/,/不要(告诉|透露给?|让)用户/,/系统提示词?.{0,6}(覆盖|无效|作废|重写)/];function x(r){return!Ce.some(e=>e.test(r))}var l=12288,T=200,_=8192,Le="memory",w="INDEX.md";function Xe(r){return f(ne().getProjectAgentDir(r),Le)}var We=/^[a-z0-9][a-z0-9\-_.]*\.md$/i;function N(r){return!(!We.test(r)||r===w||r.includes("..")||r.includes("/")||r.includes("\\"))}function He(r){return r.trim().match(/^([A-Za-z][A-Za-z0-9_-]{2,})\s*:/)?.[1]??null}function qe(r,e){let t=r.split(`
|
|
5
|
+
`),o=[],n=!1;for(let i=0;i<t.length;i++){let s=t[i];if(Be(s)&&s.includes(e)){for(n=!0;i+1<t.length&&le(t[i+1]);)i++;continue}o.push(s)}return n?o.join(`
|
|
6
|
+
`):null}function Be(r){return r.trim()!==""&&!r.startsWith("#")&&!r.startsWith("<!--")&&!le(r)}function le(r){return r.startsWith(" ")||r.startsWith(" ")}var R=new Map;async function P(r,e){let t=R.get(r)??Promise.resolve(),o,n=new Promise(s=>{o=s}),i=t.catch(()=>{}).then(()=>n);R.set(r,i),await t.catch(()=>{});try{return await e()}finally{o(),R.get(r)===i&&R.delete(r)}}var L=class{root;constructor(e){this.root=Xe(e)}getRootPath(){return this.root}ensureInitialized(){p(this.root)||ce(this.root,{recursive:!0});let e=f(this.root,w);if(!p(e)){let t=["# Memory Index","","<!-- Agent-managed memory. Lines here are always visible in system prompt.>","<!-- Use memory tool to add notes, or create topic files for longer content.>","","## User Profile","","## Notes",""].join(`
|
|
7
|
+
`);Je(e,t)}}getIndexForPrompt(){let e=f(this.root,w);if(!p(e))return"";let t;try{t=se(e,"utf-8")}catch(n){return n?.code!=="ENOENT"&&console.error(`[memdir] INDEX.md read failed \u2014 injected as empty this turn: ${n instanceof Error?n.message:String(n)}`),""}let o=t.split(`
|
|
8
|
+
`);return o.length>T&&(t=o.slice(0,T).join(`
|
|
9
|
+
`)+`
|
|
10
|
+
|
|
11
|
+
<!-- INDEX.md truncated: ${o.length} lines total, showing first ${T}>`),Buffer.byteLength(t,"utf-8")>l&&(t=Buffer.from(t,"utf-8").subarray(0,l).toString("utf-8")+`
|
|
12
|
+
|
|
13
|
+
<!-- INDEX.md truncated at ${l} bytes>`),t}getIndexRaw(){let e=f(this.root,w);if(!p(e))return"";try{return se(e,"utf-8")}catch(t){return t?.code!=="ENOENT"&&console.error(`[memdir] INDEX.md read failed \u2014 treated as empty: ${t instanceof Error?t.message:String(t)}`),""}}getIndexUsage(){let e=this.getIndexRaw(),t=Buffer.byteLength(e,"utf-8"),o=e.split(`
|
|
14
|
+
`).length;return{chars:t,lines:o,percent:Math.round(t/l*100)}}async addToIndex(e){return e.trim()?x(e)?P(this.root,async()=>{let t=this.getIndexRaw(),o=t.endsWith(`
|
|
15
|
+
`)?t+e.trim()+`
|
|
16
|
+
`:t+`
|
|
17
|
+
`+e.trim()+`
|
|
18
|
+
`;if(Buffer.byteLength(o,"utf-8")>l){let i=this.autoCompactIndex(t,e.trim());if(i){await this.writeIndexUnlocked(i);let a=this.getIndexUsage();return{ok:!0,message:`Added to INDEX.md (auto-compacted old entries). [${a.chars}/${l} chars, ${a.percent}%]`,indexUsage:`${a.chars}/${l}`}}return{ok:!1,message:`INDEX.md would exceed limit (${this.getIndexUsage().chars}/${l} bytes) even after compaction. Create a topic file instead.`}}await this.writeIndexUnlocked(o);let n=this.getIndexUsage();return{ok:!0,message:`Added to INDEX.md. [${n.chars}/${l} chars, ${n.percent}%]`,indexUsage:`${n.chars}/${l}`}}):{ok:!1,message:"Content rejected: potential injection detected."}:{ok:!1,message:"Content cannot be empty."}}autoCompactIndex(e,t){let o=e.split(`
|
|
19
|
+
`),n=Buffer.byteLength(t+`
|
|
20
|
+
`,"utf-8"),i=l-n-64;if(i<256)return null;let s=u=>u.startsWith("#")||u.startsWith("<!--")||u.trim()==="",a=u=>u.startsWith(" ")||u.startsWith(" "),m=4,h=[...o],j=0;for(;Buffer.byteLength(h.join(`
|
|
21
|
+
`),"utf-8")>i&&j<o.length;){let u=h.findIndex((k,M)=>M>=m&&!s(k)&&!a(k));if(u===-1)break;let I=1;for(;u+I<h.length&&a(h[u+I]);)I++;h.splice(u,I),j++}let c=h.join(`
|
|
22
|
+
`),g=c.endsWith(`
|
|
23
|
+
`)?c+t+`
|
|
24
|
+
`:c+`
|
|
25
|
+
`+t+`
|
|
26
|
+
`;return Buffer.byteLength(g,"utf-8")<=l?g:null}async replaceInIndex(e,t){return e.trim()?t.trim()?x(t)?P(this.root,async()=>{let o=this.getIndexRaw(),n=o.split(e).length-1;if(n===0)return{ok:!1,message:`No match found for: "${e.slice(0,80)}"`};if(n>1)return{ok:!1,message:`Multiple matches (${n}) for: "${e.slice(0,80)}". Be more specific.`};let i=o.replace(e,t);if(Buffer.byteLength(i,"utf-8")>l)return{ok:!1,message:`Replacement would exceed INDEX.md limit (${Buffer.byteLength(i,"utf-8")}/${l} bytes).`};await this.writeIndexUnlocked(i);let s=this.getIndexUsage();return{ok:!0,message:`Replaced in INDEX.md. [${s.chars}/${l} chars]`,indexUsage:`${s.chars}/${l}`}}):{ok:!1,message:"Content rejected: potential injection detected."}:{ok:!1,message:"new_text cannot be empty. Use 'remove' to delete."}:{ok:!1,message:"old_text cannot be empty."}}async removeFromIndex(e){return e.trim()?P(this.root,async()=>{let t=this.getIndexRaw(),o=He(e),n=o?qe(t,o):null;if(n===null){if(!t.includes(e))return{ok:!1,message:`No match found for: "${e.slice(0,80)}"`};n=t.replace(e,"")}n=n.replace(/\n{3,}/g,`
|
|
27
|
+
|
|
28
|
+
`),await this.writeIndexUnlocked(n);let i=this.getIndexUsage();return{ok:!0,message:`Removed from INDEX.md. [${i.chars}/${l} chars]`,indexUsage:`${i.chars}/${l}`}}):{ok:!1,message:"old_text cannot be empty."}}async listFiles(){if(!p(this.root))return[];let e=await oe(this.root),t=[];for(let o of e){if(o===w||!o.endsWith(".md"))continue;let n=f(this.root,o);try{let i=await Oe(n);if(!i.isFile())continue;let a=(await F(n,"utf-8")).split(`
|
|
29
|
+
`).find(m=>m.trim()&&!m.startsWith("#"))?.trim();t.push({name:o,size:i.size,modifiedAt:i.mtime.toISOString(),preview:a?.slice(0,100)})}catch{}}return t.sort((o,n)=>n.modifiedAt.localeCompare(o.modifiedAt))}async createFile(e,t){if(!N(e))return{ok:!1,message:`Invalid filename: "${e}". Use kebab-case .md files (e.g. "project-notes.md").`};if(!x(t))return{ok:!1,message:"Content rejected: potential injection detected."};if(t.length>_)return{ok:!1,message:`Content too long (${t.length} chars, max ${_}).`};let o=f(this.root,e);if(p(o))return{ok:!1,message:`File already exists: "${e}". Use write_file to update.`};await this.ensureDir(),await D(o,t);let n=`- [${e}] \u2014 created ${new Date().toISOString().slice(0,10)}`;return{ok:!0,message:await this.appendIndexEntry(n)?`Created "${e}" (${t.length} chars). Entry added to INDEX.md.`:`Created "${e}" (${t.length} chars). WARNING: INDEX.md is full \u2014 the index entry was NOT added, so this file will not surface automatically. Remove stale INDEX.md entries, then add one for [${e}].`,file:e}}async writeFile(e,t){if(!N(e))return{ok:!1,message:`Invalid filename: "${e}". Use kebab-case .md files.`};if(!x(t))return{ok:!1,message:"Content rejected: potential injection detected."};if(t.length>_)return this.writeFileSplit(e,t);let o=f(this.root,e),n=!p(o);await this.ensureDir(),await D(o,t);let i=!0;if(n){let s=`- [${e}] \u2014 created ${new Date().toISOString().slice(0,10)}`;i=await this.appendIndexEntry(s)}return{ok:!0,message:`${n?"Created":"Updated"} "${e}" (${t.length} chars).`+(i?"":" WARNING: INDEX.md is full \u2014 no index entry was added, so this file will not surface automatically."),file:e}}async writeFileSplit(e,t){let o=e.replace(/\.md$/,""),n=t.split(/\n{2,}/),i=[],s="";for(let c of n)s.length+c.length+2>_*.9&&s.length>0?(i.push(s),s=c):s=s?s+`
|
|
30
|
+
|
|
31
|
+
`+c:c;s&&i.push(s);let a=[];for(let c=0;c<i.length;c++){let g=`${o}-${c+1}.md`,u=f(this.root,g);await this.ensureDir(),await D(u,i[c]),a.push(g)}let m=f(this.root,e);p(m)&&(await ie(m),await P(this.root,async()=>{let c=this.getIndexRaw(),g=new RegExp(`^.*\\[${ae(e)}\\].*$\\n?`,"m");g.test(c)&&await this.writeIndexUnlocked(c.replace(g,"").replace(/\n{3,}/g,`
|
|
32
|
+
|
|
33
|
+
`))}));let h=this.getIndexRaw(),j=0;for(let c of a)if(!h.includes(`[${c}]`)){let g=`- [${c}] \u2014 auto-split ${new Date().toISOString().slice(0,10)}`;await this.appendIndexEntry(g)||j++}return{ok:!0,message:`Auto-split "${e}" into ${i.length} parts (${t.length} chars total): ${a.join(", ")}`+(j>0?` WARNING: INDEX.md is full \u2014 ${j} part(s) got no index entry and will not surface automatically.`:""),file:a[0]}}async readFile(e){if(!N(e)&&e!==w)return{ok:!1,message:`Invalid filename: "${e}".`};let t=f(this.root,e);try{let o=await F(t,"utf-8");return{ok:!0,content:o,message:`Read "${e}" (${o.length} chars).`}}catch(o){return o.code==="ENOENT"?{ok:!1,message:`File not found: "${e}".`}:{ok:!1,message:`Error reading "${e}": ${o.message}`}}}async deleteFile(e){if(e===w)return{ok:!1,message:"Cannot delete INDEX.md. Use 'remove' to clear entries."};if(!N(e))return{ok:!1,message:`Invalid filename: "${e}".`};let t=f(this.root,e);return p(t)?(await ie(t),await P(this.root,async()=>{let o=this.getIndexRaw(),n=new RegExp(`^.*\\[${ae(e)}\\].*$\\n?`,"m");if(n.test(o)){let i=o.replace(n,"").replace(/\n{3,}/g,`
|
|
34
|
+
|
|
35
|
+
`);await this.writeIndexUnlocked(i)}}),{ok:!0,message:`Deleted "${e}" and removed INDEX.md entry.`,file:e}):{ok:!1,message:`File not found: "${e}".`}}async searchLocal(e){if(!p(this.root))return[];let t=Array.from(new Set(A(e)));if(t.length===0)return[];let o=await oe(this.root),n=[];for(let i of o){if(!i.endsWith(".md"))continue;let s=f(this.root,i);try{let a=await F(s,"utf-8"),m=new Set(A(a)),h=t.filter(u=>m.has(u)).length;if(h===0)continue;let j=a.split(`
|
|
36
|
+
`),c="",g=0;for(let u of j){let I=new Set(A(u)),k=t.filter(M=>I.has(M)).length;k>g&&(g=k,c=u.trim())}n.push({file:i,snippet:c.slice(0,200),score:h/t.length})}catch{}}return n.sort((i,s)=>s.score-i.score).slice(0,10)}async writeIndex(e){await P(this.root,()=>this.writeIndexUnlocked(e))}async writeIndexUnlocked(e){await this.ensureDir(),await D(f(this.root,w),e)}async ensureDir(){p(this.root)||await Fe(this.root,{recursive:!0})}async appendIndexEntry(e){return P(this.root,async()=>{let t=this.getIndexRaw();if(t.includes(e))return!0;let o=t.endsWith(`
|
|
37
|
+
`)?t+e+`
|
|
38
|
+
`:t+`
|
|
39
|
+
`+e+`
|
|
40
|
+
`;if(Buffer.byteLength(o,"utf-8")<=l)return await this.writeIndexUnlocked(o),!0;let n=this.autoCompactIndex(t,e);return n?(await this.writeIndexUnlocked(n),!0):(console.error(`[memdir] INDEX.md full \u2014 entry not added (file stays invisible to recall): ${e.slice(0,80)}`),!1)})}};function Je(r,e){let t=f(r,"..");p(t)||ce(t,{recursive:!0}),Te(r,e,"utf-8")}function ae(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}export{L as Memdir};
|
package/dist/protocol.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var q=["idle","running-right","running-left","waving","jumping","failed","waiting","running","review"];var Y="1.0.0",l={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,TURN_ABORTED:-32e3,TURN_TIMEOUT:-32001,LLM_ERROR:-32010,LLM_AUTH_ERROR:-32011,LLM_RATE_LIMIT:-32012,LLM_QUOTA_EXHAUSTED:-32013,LLM_MODEL_NOT_FOUND:-32014,TOOL_INVOKE_FAILED:-32020,TOOL_TIMEOUT:-32021,PROTOCOL_MISMATCH:-32030,REQUEST_DEADLINE_EXCEEDED:-32040,REQUEST_CANCELLED:-32041,REQUEST_DEDUPED:-32042,REQUEST_IDEMPOTENCY_REQUIRED:-32043},G={REQUEST:"tool.approval.request"};function k(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&t.method.length>0}function T(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&(typeof t.id=="string"||typeof t.id=="number")&&!("method"in t)}function _(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&!("id"in t)}function z(e){let t;try{t=JSON.parse(e)}catch{return null}return T(t)||k(t)||_(t)?t:null}import{randomUUID as X}from"node:crypto";var $=["settings.list","settings.get","settings.validate","provider.list","tools.list","todos.list","tasks.list","agents.list","agents.get","agents.processes","agents.scan","session.list","session.get","session.resolve","thread.list","project.list","files.list","files.gitStatus","instructions.list","instructions.read","skills.list","skills.stats","memory.atlas","memory.activity","memory.list","memory.read","memory.search","media.listModels","media.status","pet.status","agent.health","agent.metrics"],J=new Set(["memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","pet.asset.import","solo.start","solo.evaluate","product.plan","product.create","product.message"]),Q=["memory.","pet.","usage."],Z=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","memory.attachment.locate","memory.attachment.adopt","pet.status"]);function A(e){return J.has(e)?{channel:"task",mutability:"write",defaultTimeoutMs:12e4}:$.some(t=>e===t||e.startsWith(`${t}.`)||e.startsWith(t))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function C(e){return Z.has(e)||A(e).mutability==="read"?!1:Q.some(t=>e.startsWith(t))}function ee(e,t={}){let n=t.now??Date.now(),r=A(e),o=t.timeoutMs??r.defaultTimeoutMs;return{requestId:t.requestId??X(),createdAt:n,deadlineAt:n+o,channel:t.channel??r.channel,idempotencyKey:t.idempotencyKey,traceId:t.traceId}}function x(e,t=Date.now()){let n=e.meta;if(!n||typeof n!="object")return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta is required."}};if(typeof n.requestId!="string"||n.requestId.length===0)return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.requestId is required."}};if(n.channel!=="query"&&n.channel!=="task")return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.channel must be query or task."}};if(typeof n.createdAt!="number"||!Number.isFinite(n.createdAt))return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.createdAt is required."}};if(typeof n.deadlineAt!="number"||!Number.isFinite(n.deadlineAt))return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.deadlineAt is required."}};if(n.deadlineAt<=t)return{ok:!1,error:{code:l.REQUEST_DEADLINE_EXCEEDED,message:"RPC request deadline has already expired."}};let r=A(e.method).channel;return n.channel!==r?{ok:!1,error:{code:l.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${r}, got ${n.channel}.`}}:C(e.method)&&(typeof n.idempotencyKey!="string"||n.idempotencyKey.length===0)?{ok:!1,error:{code:l.REQUEST_IDEMPOTENCY_REQUIRED,message:`RPC method ${e.method} requires meta.idempotencyKey.`}}:{ok:!0,meta:n}}var S=class{now;active=new Map;idempotency=new Map;counters={completedRequests:0,cancelledRequests:0,deadlineExceededRequests:0,dedupedRequests:0,lateResponsesDropped:0,invalidRequests:0};constructor(t={}){this.now=t.now??(()=>Date.now())}begin(t,n){let r=x({method:t,meta:n},this.now());if(!r.ok)return this.counters.invalidRequests+=1,{status:"rejected",error:r.error};if(n.idempotencyKey){let o=this.idempotency.get(n.idempotencyKey);if(o)return this.counters.dedupedRequests+=1,o.error?{status:"deduped",error:o.error}:{status:"deduped",result:o.result}}return this.active.set(n.requestId,{method:t,meta:n,cancelled:!1,startedAt:this.now()}),{status:"started"}}cancel(t,n="cancelled"){let r=this.active.get(t);return!r||r.cancelled?!1:(r.cancelled=!0,r.cancelReason=n,this.counters.cancelledRequests+=1,!0)}expire(t){return this.active.get(t)?(this.active.delete(t),this.counters.deadlineExceededRequests+=1,!0):!1}settle(t,n,r){let o=this.active.get(t);return o?(this.active.delete(t),o.cancelled?(this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"cancelled"}):o.meta.deadlineAt<=this.now()?(this.counters.deadlineExceededRequests+=1,this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"deadline_exceeded"}):(this.counters.completedRequests+=1,o.meta.idempotencyKey&&this.idempotency.set(o.meta.idempotencyKey,{result:n,error:r,settledAt:this.now()}),{accepted:!0})):{accepted:!1,reason:"unknown"}}metrics(){return{activeRequests:this.active.size,...this.counters}}};var te=["agent.health","agent.metrics","agent.cancel","session.list","session.get","session.create","session.update","session.delete","session.deleteAll","session.archive","session.moveToProject","session.getState","session.switchProject","session.getMessages","project.list","project.create","project.delete","project.rename","project.archive","project.unarchive","project.update","project.purgeAll","instructions.list","instructions.read","instructions.write","instructions.delete","files.list","files.read","files.create","files.rename","files.move","files.copy","files.delete","files.search","files.undoOperation","files.gitStatus","turnBaseline.getSummary","turnBaseline.getFileDiff","turnBaseline.listRecent","turnBaseline.getFileBaseline","workingMaterials.get","workingMaterials.replace","workingMaterials.upsert","workingMaterials.remove","workingMaterials.reorder","skills.list","memory.list-files","memory.atlas","memory.activity","memory.propose","memory.consolidate","memory.update","memory.attachment.adopt","memory.attachment.locate"];var M=["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.file_changes","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.approval_request","turn.skill_instruction","turn.ask_user","turn.media_result","turn.media_progress","turn.media_usage","turn.media_capability_check","turn.plan_update","turn.suggestions","turn.sidechain_started","turn.subagent_started","turn.subagent_delta","turn.subagent_ended","turn.sidechain_completed","turn.task_updated","turn.todos_updated","turn.exec_progress","turn.progress","turn.tool_use_summary","turn.tool_selection_policy","turn.lifecycle","turn.document_maintenance","turn.artifact_contract","turn.usage_update","team.member.notification","session.info","session.recovery_pending","memory.updated","skills.updated","turn.memory_recall","turn.memory_written","pet.soul_ready","pet.reaction","pet.growth","pet.state","pet.confirm","pet.asset.updated","system.activity","workflow.created","workflow.updated","workflow.deleted","workflow.runStarted","workflow.runCompleted","workflow.runFailed","workflow.nodeStatus","workflow.triggerDropped","workflow.alert","workflow.approvalRequested","workflow.approvalTimedOut"],v=["solo.progress","solo.specProgress","solo.agentDelta","solo.agentActivity","solo.agentUsage","solo.evaluation","product.taskStarted","product.taskOutput","product.members","product.agentActivity","product.taskCompleted","product.taskFailed","product.budgetUpdate","product.budgetWarning","product.checkpointed","product.completed","product.dagTopology","plan.interrupted","goal.run_state_changed","goal.phase_boundary","goal.goal_edited","goal.message_queued","goal.acceptance_updated"],ne=[...M,...v];import{createHash as Rt}from"node:crypto";import{resolve as bt}from"node:path";var m={request:"x/delegate",update:"x/delegate.update",respond:"x/delegate.respond",cancel:"x/delegate.cancel"},re=["search","addText","embedText","ingestExtracted","proposeExtracted","consumePendingProposals","feedback","findRelatedEvents","synthesizeTimeline","getActivitySummary","getAllProfiles","setProfile","getAtlas","setMemoryArchived","triggerDecay","resolveConflicts"],ie=["getSkillSnapshot","readSkillFile","recordSkillInvocation","commitSkillMutation","applyCuratorPlan","prepareSkillInstall","finalizeSkillInstall"],oe=["loadForResume","appendTranscript","updateTitle","saveState","saveTaskSummary","groupSplit"],se=["commitTurnTelemetry","listDistillableFeedback","markFeedbackDistilled","runUploadSweep"],ae=["getSnapshot","create","switch","update"],Tt=1024*1024,pe=["navigate","snapshot","click","type","screenshot","console","network"],de=["getTunables","updateTunable","clearTunable","appendDirectoryAllowRule"];var _t=new Set(re),Ct=new Set(de),xt=new Set(ie),Mt=new Set(oe),vt=new Set(se),wt=new Set(ae),Ot=new Set(pe);var ce=1,le={INITIALIZE:"initialize",SESSION_NEW:"session/new",SESSION_PROMPT:"session/prompt",SESSION_CLOSE:"session/close",SESSION_SET_CONFIG:"session/set_config_option",SESSION_SET_MODEL:"session/set_model",SESSION_SET_MODE:"session/set_mode",SESSION_LOAD:"session/load",SESSION_CANCEL:"session/cancel",SESSION_UPDATE:"session/update",SESSION_REQUEST_PERMISSION:"session/request_permission",FS_READ_TEXT_FILE:"fs/read_text_file",FS_WRITE_TEXT_FILE:"fs/write_text_file"},ue={ABORT:"x/abort",DREAM:"x/dream",AGENTS_LIST:"x/agents.list",SOLO_START:"x/solo.start",SOLO_STATUS:"x/solo.status",SOLO_SELECT:"x/solo.select",SOLO_CANCEL:"x/solo.cancel",PRODUCT_CREATE:"x/product.create",PRODUCT_PLAN:"x/product.plan",PRODUCT_CONFIRM:"x/product.confirm",PRODUCT_MESSAGE:"x/product.message",PRODUCT_RESUME:"x/product.resume",PRODUCT_PAUSE:"x/product.pause",PRODUCT_CANCEL:"x/product.cancel",PRODUCT_ROLLBACK:"x/product.rollback",PRODUCT_REPLAY:"x/product.replay",PRODUCT_STATUS:"x/product.status",SOLO_SUBSCRIBE:"x/solo.subscribe",SOLO_MESSAGE:"x/solo.message",SOLO_EVALUATE:"x/solo.evaluate",SOLO_SPEC_CHAT:"x/solo.specChat",SOLO_SPEC_JUDGE:"x/solo.specJudge",WORKFLOW_CHAT:"x/workflow.chat",WORKFLOW_MATCH_INTENT:"x/workflow.matchIntent",PRODUCT_SUBSCRIBE:"x/product.subscribe",GOAL_START:"x/goal.start",GOAL_STATUS:"x/goal.status",GOAL_PAUSE:"x/goal.pause",GOAL_RESUME:"x/goal.resume",GOAL_UPDATE_GOAL:"x/goal.updateGoal",GOAL_STOP:"x/goal.stop",GOAL_MESSAGE:"x/goal.message",GOAL_SUBSCRIBE:"x/goal.subscribe",GOAL_EVENTS:"x/goal.events",MENTION_DELEGATE:"x/mention.delegate",MENTION_CANCEL:"x/mention.cancel",MENTION_LIST:"x/mention.list",DELEGATE:m.request,DELEGATE_UPDATE:m.update,DELEGATE_RESPOND:m.respond,DELEGATE_CANCEL:m.cancel},w={USER_MESSAGE_CHUNK:"user_message_chunk",AGENT_MESSAGE_CHUNK:"agent_message_chunk",AGENT_THOUGHT_CHUNK:"agent_thought_chunk",TOOL_CALL:"tool_call",TOOL_CALL_UPDATE:"tool_call_update",PLAN:"plan",USAGE_UPDATE:"usage_update",CONFIG_OPTION_UPDATE:"config_option_update",SESSION_INFO_UPDATE:"session_info_update",AVAILABLE_COMMANDS_UPDATE:"available_commands_update",CURRENT_MODE_UPDATE:"current_mode_update"},ge={X_SKILL_INSTRUCTION:"x_skill_instruction",X_SESSION_INFO:"x_session_info",X_RELAY:"x_relay"};function O(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&"id"in t}function N(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&!("id"in t)}function D(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&"id"in t&&!("method"in t)}function me(e){let t;try{t=JSON.parse(e)}catch{return null}return D(t)||O(t)||N(t)?t:null}function fe(e){return Object.values(w).includes(e)}function ye(e){return e.startsWith("x_")}var b=["gatewayVersion","toolNamespaces","workspaceIds","installedCapabilities","enabledCapabilities","features","approvalMode","toolManifests","skillManifests","pluginManifests","mcpManifests","approvalPolicy","workspaceSummaries"];function g(e){return e?e.map(t=>({...t})):void 0}function I(e){return e?e.map(t=>({...t})):void 0}function Ae(e){return e?[...e]:void 0}function L(e){return[...new Set(e.map(t=>t.trim()).filter(Boolean))].sort((t,n)=>t.localeCompare(n))}function f(e){return{...e,toolNamespaces:[...e.toolNamespaces],workspaceIds:[...e.workspaceIds],...e.changedSections?{changedSections:[...e.changedSections]}:{},...e.installedCapabilities?{installedCapabilities:[...e.installedCapabilities]}:{},...e.enabledCapabilities?{enabledCapabilities:[...e.enabledCapabilities]}:{},...e.features?{features:[...e.features]}:{},...e.toolManifests?{toolManifests:g(e.toolManifests)}:{},...e.skillManifests?{skillManifests:g(e.skillManifests)}:{},...e.pluginManifests?{pluginManifests:g(e.pluginManifests)}:{},...e.mcpManifests?{mcpManifests:g(e.mcpManifests)}:{},...e.approvalPolicy?{approvalPolicy:{...e.approvalPolicy}}:{},...e.workspaceSummaries?{workspaceSummaries:I(e.workspaceSummaries)}:{}}}function Re(e){let{previous:t,update:n}=e;return!(n.syncMode==="diff"&&t&&(!n.baseSnapshotVersion||t.snapshotVersion===n.baseSnapshotVersion))||!t?f(n):{...f(t),snapshotVersion:n.snapshotVersion,updatedAt:n.updatedAt,...n.gatewayVersion!==void 0?{gatewayVersion:n.gatewayVersion}:{},...n.syncMode?{syncMode:n.syncMode}:{},...n.baseSnapshotVersion?{baseSnapshotVersion:n.baseSnapshotVersion}:{},...n.changedSections?{changedSections:[...n.changedSections]}:{},...n.toolNamespaces?{toolNamespaces:[...n.toolNamespaces]}:{},...n.workspaceIds?{workspaceIds:[...n.workspaceIds]}:{},...n.installedCapabilities?{installedCapabilities:[...n.installedCapabilities]}:{},...n.enabledCapabilities?{enabledCapabilities:[...n.enabledCapabilities]}:{},...n.features?{features:[...n.features]}:{},...n.approvalMode?{approvalMode:n.approvalMode}:{},...n.toolManifests?{toolManifests:g(n.toolManifests)}:{},...n.skillManifests?{skillManifests:g(n.skillManifests)}:{},...n.pluginManifests?{pluginManifests:g(n.pluginManifests)}:{},...n.mcpManifests?{mcpManifests:g(n.mcpManifests)}:{},...n.approvalPolicy?{approvalPolicy:{...n.approvalPolicy}}:{},...n.workspaceSummaries?{workspaceSummaries:I(n.workspaceSummaries)}:{}}}function Se(e){return L(e.map(t=>t.name.split(".")[0]??"").filter(Boolean))}function be(e){return L(e.map(t=>t.id))}function Ie(e){let{previous:t,current:n}=e;if(!t)return{...f(n),syncMode:"full"};if(t.snapshotVersion===n.snapshotVersion)return null;let r=b.filter(s=>JSON.stringify(t[s])!==JSON.stringify(n[s]));if(r.length===b.length)return{...f(n),syncMode:"full"};let o={snapshotVersion:n.snapshotVersion,updatedAt:n.updatedAt,syncMode:"diff",baseSnapshotVersion:t.snapshotVersion,changedSections:r,toolNamespaces:[...n.toolNamespaces],workspaceIds:[...n.workspaceIds]},d=o;for(let s of r){let i=n[s];if(i!==void 0)switch(s){case"toolNamespaces":case"workspaceIds":case"installedCapabilities":case"enabledCapabilities":case"features":d[s]=Ae(i);break;case"approvalPolicy":d[s]={...i};break;case"workspaceSummaries":d[s]=I(i);break;case"toolManifests":case"skillManifests":case"pluginManifests":case"mcpManifests":d[s]=g(i);break;default:d[s]=i;break}}return o}var Ee=["web_search","web_fetch","deep_research","browser_execution"],Pe=["web-intelligence","browser-execution"],he=["discovery","read-url","multi-source-research","interactive-browser"],ke=["stateless","render-backend","interactive-session"],Te=["stateless","stateless-single-step","stateful-session-required"],_e=["required","conditional","none"],Ce=["browser-read","browser-authenticated-read","browser-state-changing"];var xe=["read-page","read-authenticated-page","fill-form","submit-form","download-file","reuse-session"],Me=["web_search","web_fetch","deep_research","blocked"],ve=["requires-interaction","requires-login-state","requires-rendered-dom","requires-persistent-session","requires-state-changing-action"],we=["none","same-capability-once","degrade-only"];var Oe=["prefetch","sync_turn","on_pre_compress","on_session_end","on_delegation","on_memory_write"],Ne=["turn","sidechain","compress","session-end","agent-remember","auto-extract","implicit-extract","profile-extraction","dream"],De=["observe-only","parent-write","deny"];var Le=2,a={gatewayImage:"gateway.image.desktop-slim",whisperModelTiny:"speech.whisper.model.tiny",ffmpegWin32X64:"runtime.ffmpeg.win32-x64",nodeWin32X64:"runtime.node.win32-x64",dockerDesktopWin32X64:"runtime.docker-desktop.win32-x64",dockerDesktopDarwinX64:"runtime.docker-desktop.darwin-x64",dockerDesktopDarwinArm64:"runtime.docker-desktop.darwin-arm64"},y={desktopDockerBridge:"desktop.docker-bridge",desktopEmbeddedWin32X64:"desktop.embedded.win32-x64"};function U(e){return{...e,artifacts:e.artifacts.map(t=>({...t}))}}function He(e){return{...e,assetIds:[...e.assetIds]}}function j(){return{[y.desktopDockerBridge]:{id:y.desktopDockerBridge,title:"Desktop Docker Bridge",platform:"any",assetIds:[a.gatewayImage,a.dockerDesktopWin32X64,a.dockerDesktopDarwinX64,a.dockerDesktopDarwinArm64],description:"Docker bridge mode downloads the desktop slim gateway image on demand."},[y.desktopEmbeddedWin32X64]:{id:y.desktopEmbeddedWin32X64,title:"Desktop Embedded Win32 x64",platform:"win32-x64",assetIds:[a.nodeWin32X64,a.ffmpegWin32X64,a.whisperModelTiny],description:"Embedded desktop mode requires the bundled Node/FFmpeg runtimes and the whisper model asset."}}}function K(e,t){return e.assets[t]}function F(e,t){return e.profiles[t]}function Ue(e,t){let n=F(e,t);return n?n.assetIds.map(r=>K(e,r)).filter(r=>!!r):[]}function je(e,t){return e.assets[t.id]=U(t),W(e)}function E(e){if(!e)return;let t=e.artifacts[0];if(!(!t?.url||!t.sha256||typeof t.size!="number"))return{version:e.version,sha256:t.sha256,size:t.size,url:t.url}}function W(e){let t=E(e.assets[a.gatewayImage]),n=E(e.assets[a.whisperModelTiny]);return{...e,gateway:t,whisperModel:n}}function H(e,t){if(!(typeof e.version!="string"||typeof e.url!="string"))return{...t,version:e.version,artifacts:[{fileName:e.url.split("/").pop()||`${t.id}.bin`,url:e.url,sha256:typeof e.sha256=="string"?e.sha256:void 0,size:typeof e.size=="number"?e.size:void 0}]}}function Ke(e){let t=e&&typeof e=="object"?e:{},n={},r=t.assets&&typeof t.assets=="object"?t.assets:{};for(let[i,p]of Object.entries(r)){if(!p||typeof p!="object")continue;let u=p;!u.id||!Array.isArray(u.artifacts)||(n[i]=U(u))}if(!n[a.gatewayImage]&&t.gateway&&typeof t.gateway=="object"){let i=H(t.gateway,{id:a.gatewayImage,title:"XiaoZhiClaw Gateway Image (Desktop Slim)",kind:"container-image",delivery:"remote",platform:"any",description:"Desktop Docker mode gateway image."});i&&(n[i.id]=i)}if(!n[a.whisperModelTiny]&&t.whisperModel&&typeof t.whisperModel=="object"){let i=H(t.whisperModel,{id:a.whisperModelTiny,title:"Whisper Tiny Model",kind:"model",delivery:"remote",platform:"any",description:"Shared whisper.cpp tiny model asset for embedded desktop speech recognition."});i&&(n[i.id]=i)}let d={...j()},s=t.profiles&&typeof t.profiles=="object"?t.profiles:{};for(let[i,p]of Object.entries(s)){if(!p||typeof p!="object")continue;let u=p;!u.id||!Array.isArray(u.assetIds)||(d[i]=He(u))}return W({schemaVersion:typeof t.schemaVersion=="number"?t.schemaVersion:2,channel:typeof t.channel=="string"?t.channel:void 0,publishedAt:typeof t.publishedAt=="string"?t.publishedAt:void 0,minElectronVersion:typeof t.minElectronVersion=="string"?t.minElectronVersion:void 0,releaseNotes:typeof t.releaseNotes=="string"?t.releaseNotes:void 0,assets:n,profiles:d})}var Fe=["pending","captured","failed","restored"],We=["file","directory","missing"],Ve=["metadata-only","workspace-copy","shadow-git"];var Be=["api-key","oauth","token","aws-sdk"],qe=["rate_limit","auth","server_error","timeout","network","unknown"],Ye=["requiresOpenAiAnthropicToolPayload"];function Ge(e,t){return!e||typeof e!="object"||Array.isArray(e)?!1:e[t]===!0}var V="openai-codex";function R(e){let t=e.trim().toLowerCase();return t==="z.ai"||t==="z-ai"?"zai":t==="opencode-zen"?"opencode":t==="kimi-code"?"kimi-coding":t==="bedrock"||t==="aws-bedrock"?"amazon-bedrock":t==="bytedance"||t==="doubao"?"volcengine":t}function B(e){let t=R(e);return t==="volcengine-plan"?"volcengine":t==="qwen-coding"?"qwen":t==="byteplus-plan"?"byteplus":t}var ze=B,Xe={anthropicToolSchemaMode:"native",anthropicToolChoiceMode:"native",providerFamily:"default",preserveAnthropicThinkingSignatures:!0,openAiCompatTurnValidation:!0,providerThoughtSignatureSanitization:!1,transcriptToolCallIdMode:"default",transcriptToolCallIdModelHints:[],providerThoughtSignatureModelHints:[],dropThinkingBlockModelHints:[]},$e={anthropic:{providerFamily:"anthropic"},"amazon-bedrock":{providerFamily:"anthropic"},"kimi-coding":{anthropicToolSchemaMode:"openai-functions",anthropicToolChoiceMode:"openai-string-modes",preserveAnthropicThinkingSignatures:!1},mistral:{transcriptToolCallIdMode:"strict9",transcriptToolCallIdModelHints:["mistral","mixtral","codestral","pixtral","devstral","ministral","mistralai"]},openai:{providerFamily:"openai"},[V]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};function P(e,t){let n=(e??"").toLowerCase();return!!n&&t.some(r=>n.includes(r))}function c(e){let t=R(e??"");return{...Xe,...$e[t]}}function Je(e){return c(e).preserveAnthropicThinkingSignatures}function Qe(e){let t=c(e);return t.anthropicToolSchemaMode!=="native"||t.anthropicToolChoiceMode!=="native"}function Ze(e){return c(e).anthropicToolSchemaMode==="openai-functions"}function et(e){return c(e).anthropicToolChoiceMode==="openai-string-modes"}function tt(e){return c(e).openAiCompatTurnValidation}function nt(e){return c(e).providerFamily==="openai"}function rt(e){return c(e).providerFamily==="anthropic"}function it(e){return P(e.modelId,c(e.provider).dropThinkingBlockModelHints)}function ot(e){let t=c(e.provider);return t.providerThoughtSignatureSanitization&&P(e.modelId,t.providerThoughtSignatureModelHints)}function st(e,t){let n=c(e),r=n.transcriptToolCallIdMode;if(r==="strict9")return r;if(P(t,n.transcriptToolCallIdModelHints))return"strict9"}var h={anthropic:["ANTHROPIC_OAUTH_TOKEN","ANTHROPIC_API_KEY"],chutes:["CHUTES_OAUTH_TOKEN","CHUTES_API_KEY"],zai:["ZAI_API_KEY","Z_AI_API_KEY"],opencode:["OPENCODE_API_KEY","OPENCODE_ZEN_API_KEY"],qwen:["DASHSCOPE_API_KEY","QWEN_API_KEY"],"qwen-coding":["DASHSCOPE_API_KEY","QWEN_API_KEY"],volcengine:["VOLCANO_ENGINE_API_KEY","ARK_API_KEY","DOUBAO_API_KEY"],"volcengine-plan":["VOLCANO_ENGINE_API_KEY","ARK_API_KEY","DOUBAO_API_KEY"],byteplus:["BYTEPLUS_API_KEY"],"byteplus-plan":["BYTEPLUS_API_KEY"],"kimi-coding":["KIMI_API_KEY","KIMICODE_API_KEY"],huggingface:["HUGGINGFACE_HUB_TOKEN","HF_TOKEN"],openai:["OPENAI_API_KEY"],voyage:["VOYAGE_API_KEY"],groq:["GROQ_API_KEY"],deepgram:["DEEPGRAM_API_KEY"],cerebras:["CEREBRAS_API_KEY"],xai:["XAI_API_KEY"],openrouter:["OPENROUTER_API_KEY"],litellm:["LITELLM_API_KEY"],"vercel-ai-gateway":["AI_GATEWAY_API_KEY"],"cloudflare-ai-gateway":["CLOUDFLARE_AI_GATEWAY_API_KEY"],moonshot:["MOONSHOT_API_KEY"],minimax:["MINIMAX_API_KEY"],"minimax-cn":["MINIMAX_CN_API_KEY","MINIMAX_API_KEY"],nvidia:["NVIDIA_API_KEY"],xiaomi:["XIAOMI_API_KEY"],synthetic:["SYNTHETIC_API_KEY"],venice:["VENICE_API_KEY"],mistral:["MISTRAL_API_KEY"],together:["TOGETHER_API_KEY"],qianfan:["QIANFAN_API_KEY"],ollama:["OLLAMA_API_KEY"],vllm:["VLLM_API_KEY"],kilocode:["KILOCODE_API_KEY"]};function at(){return[...new Set(Object.values(h).flat())]}function pt(e){let t=R(e.provider),n=e.env??process.env,r=new Set(e.appliedEnvKeys??[]),o=i=>{let p=n[i]?.trim();if(!p)return null;let u=r.has(i)?`shell env: ${i}`:`env: ${i}`;return{apiKey:p,source:u}},d=e.resolveSpecialApiKey?.(t,n,r);if(d)return d;let s=h[t];if(!s||s.length===0)return null;for(let i of s){let p=o(i);if(p)return p}return null}export{ue as ACP_EXTENDED_METHODS,ge as ACP_EXTENDED_SESSION_UPDATE_TYPES,le as ACP_METHODS,ce as ACP_PROTOCOL_VERSION,w as ACP_SESSION_UPDATE_TYPES,G as AGENT_RPC_APPROVAL_METHODS,l as AGENT_RPC_ERROR_CODES,Y as AGENT_RPC_PROTOCOL_VERSION,v as AGENT_TEAM_WS_EVENT_NAMES,M as AGENT_WS_EVENT_NAMES,ne as ALL_AGENT_WS_EVENT_NAMES,b as CAPABILITY_MANIFEST_DIFF_SECTIONS,te as GATEWAY_RPC_METHODS,S as GatewayRpcContract,Oe as MEMORY_OBSERVATION_HOOK_VALUES,Ne as MEMORY_OBSERVATION_SOURCE_VALUES,De as MEMORY_WRITE_ACCESS_VALUES,Ve as MUTATION_CHECKPOINT_BACKEND_VALUES,We as MUTATION_CHECKPOINT_ENTRY_KIND_VALUES,Fe as MUTATION_CHECKPOINT_PHASE_VALUES,q as PETDEX_ANIMATION_IDS,Be as PROVIDER_RUNTIME_AUTH_MODE_VALUES,Ye as PROVIDER_RUNTIME_COMPAT_FLAG_VALUES,h as PROVIDER_RUNTIME_ENV_API_KEY_CANDIDATES,V as PROVIDER_RUNTIME_OPENAI_CODEX_PROVIDER_ID,qe as PROVIDER_RUNTIME_VAULT_ERROR_TYPE_VALUES,Le as RESOURCE_MANIFEST_SCHEMA_VERSION,a as RUNTIME_ASSET_IDS,y as RUNTIME_PROFILE_IDS,xe as WEB_ACTION_SCOPE_VALUES,_e as WEB_APPROVAL_DEFAULT_VALUES,Pe as WEB_CAPABILITY_FAMILY_VALUES,Ee as WEB_CAPABILITY_ID_VALUES,Me as WEB_DEGRADATION_TARGET_VALUES,ve as WEB_ESCALATION_REASON_VALUES,ke as WEB_EXECUTION_MODE_VALUES,Ce as WEB_POLICY_RISK_CLASS_VALUES,we as WEB_RETRY_POLICY_VALUES,Te as WEB_STATEFULNESS_VALUES,he as WEB_TASK_MODE_VALUES,ee as buildAgentRpcMeta,A as classifyGatewayRpcMethod,f as cloneCapabilityManifestSnapshot,Ie as createCapabilityManifestDiffPayload,j as createDefaultRuntimeResourceProfiles,Se as deriveCapabilityToolNamespaces,be as deriveCapabilityWorkspaceIds,E as getManifestShortcutEntry,K as getRuntimeResourceAsset,F as getRuntimeResourceProfile,Ue as getRuntimeResourceProfileAssets,N as isAcpJsonRpcNotification,O as isAcpJsonRpcRequest,D as isAcpJsonRpcResponse,_ as isAgentRpcNotification,k as isAgentRpcRequest,T as isAgentRpcResponse,rt as isAnthropicProviderRuntimeFamily,ye as isExtendedSessionUpdateType,nt as isOpenAiProviderRuntimeFamily,fe as isStandardSessionUpdateType,at as listProviderRuntimeEnvApiKeyNames,Re as mergeCapabilityManifestSnapshot,R as normalizeProviderRuntimeId,B as normalizeProviderRuntimeIdForAuth,Ke as normalizeRuntimeResourceManifest,me as parseAcpMessage,z as parseAgentRpcMessage,Je as preservesProviderRuntimeAnthropicThinkingSignatures,Ge as readProviderRuntimeCompatFlag,x as requireGatewayRpcMeta,C as requiresIdempotencyKey,Qe as requiresOpenAiCompatibleAnthropicToolPayloadForProviderRuntime,c as resolveProviderRuntimeCapabilities,pt as resolveProviderRuntimeEnvApiKey,ze as resolveProviderRuntimeKeyFamily,st as resolveProviderRuntimeTranscriptToolCallIdMode,it as shouldDropThinkingBlocksForProviderRuntimeModel,ot as shouldSanitizeProviderRuntimeThoughtSignaturesForModel,tt as supportsOpenAiCompatTurnValidationForProviderRuntime,je as upsertRuntimeResourceAsset,Ze as usesOpenAiFunctionAnthropicToolSchemaForProviderRuntime,et as usesOpenAiStringModeAnthropicToolChoiceForProviderRuntime};
|
|
1
|
+
var B=["idle","running-right","running-left","waving","jumping","failed","waiting","running","review"];var Y="1.0.0",l={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,TURN_ABORTED:-32e3,TURN_TIMEOUT:-32001,LLM_ERROR:-32010,LLM_AUTH_ERROR:-32011,LLM_RATE_LIMIT:-32012,LLM_QUOTA_EXHAUSTED:-32013,LLM_MODEL_NOT_FOUND:-32014,TOOL_INVOKE_FAILED:-32020,TOOL_TIMEOUT:-32021,PROTOCOL_MISMATCH:-32030,REQUEST_DEADLINE_EXCEEDED:-32040,REQUEST_CANCELLED:-32041,REQUEST_DEDUPED:-32042,REQUEST_IDEMPOTENCY_REQUIRED:-32043},G={REQUEST:"tool.approval.request"};function T(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&t.method.length>0}function k(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&(typeof t.id=="string"||typeof t.id=="number")&&!("method"in t)}function _(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&!("id"in t)}function z(e){let t;try{t=JSON.parse(e)}catch{return null}return k(t)||T(t)||_(t)?t:null}import{randomUUID as X}from"node:crypto";var $=["settings.list","settings.get","settings.validate","provider.list","tools.list","todos.list","tasks.list","agents.list","agents.get","agents.processes","agents.scan","session.list","session.get","session.resolve","thread.list","project.list","files.list","files.gitStatus","instructions.list","instructions.read","skills.list","skills.stats","memory.atlas","memory.activity","memory.list","memory.read","memory.search","media.listModels","media.status","pet.status","agent.health","agent.metrics"],J=new Set(["memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","pet.asset.import","solo.start","solo.evaluate","product.plan","product.create","product.message"]),Q=["memory.","pet.","usage."],Z=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","memory.attachment.locate","memory.attachment.adopt","pet.status"]);function A(e){return J.has(e)?{channel:"task",mutability:"write",defaultTimeoutMs:12e4}:$.some(t=>e===t||e.startsWith(`${t}.`)||e.startsWith(t))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function C(e){return Z.has(e)||A(e).mutability==="read"?!1:Q.some(t=>e.startsWith(t))}function ee(e,t={}){let n=t.now??Date.now(),r=A(e),o=t.timeoutMs??r.defaultTimeoutMs;return{requestId:t.requestId??X(),createdAt:n,deadlineAt:n+o,channel:t.channel??r.channel,idempotencyKey:t.idempotencyKey,traceId:t.traceId}}function x(e,t=Date.now()){let n=e.meta;if(!n||typeof n!="object")return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta is required."}};if(typeof n.requestId!="string"||n.requestId.length===0)return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.requestId is required."}};if(n.channel!=="query"&&n.channel!=="task")return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.channel must be query or task."}};if(typeof n.createdAt!="number"||!Number.isFinite(n.createdAt))return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.createdAt is required."}};if(typeof n.deadlineAt!="number"||!Number.isFinite(n.deadlineAt))return{ok:!1,error:{code:l.INVALID_REQUEST,message:"RPC request meta.deadlineAt is required."}};if(n.deadlineAt<=t)return{ok:!1,error:{code:l.REQUEST_DEADLINE_EXCEEDED,message:"RPC request deadline has already expired."}};let r=A(e.method).channel;return n.channel!==r?{ok:!1,error:{code:l.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${r}, got ${n.channel}.`}}:C(e.method)&&(typeof n.idempotencyKey!="string"||n.idempotencyKey.length===0)?{ok:!1,error:{code:l.REQUEST_IDEMPOTENCY_REQUIRED,message:`RPC method ${e.method} requires meta.idempotencyKey.`}}:{ok:!0,meta:n}}var S=class{now;active=new Map;idempotency=new Map;counters={completedRequests:0,cancelledRequests:0,deadlineExceededRequests:0,dedupedRequests:0,lateResponsesDropped:0,invalidRequests:0};constructor(t={}){this.now=t.now??(()=>Date.now())}begin(t,n){let r=x({method:t,meta:n},this.now());if(!r.ok)return this.counters.invalidRequests+=1,{status:"rejected",error:r.error};if(n.idempotencyKey){let o=this.idempotency.get(n.idempotencyKey);if(o)return this.counters.dedupedRequests+=1,o.error?{status:"deduped",error:o.error}:{status:"deduped",result:o.result}}return this.active.set(n.requestId,{method:t,meta:n,cancelled:!1,startedAt:this.now()}),{status:"started"}}cancel(t,n="cancelled"){let r=this.active.get(t);return!r||r.cancelled?!1:(r.cancelled=!0,r.cancelReason=n,this.counters.cancelledRequests+=1,!0)}expire(t){return this.active.get(t)?(this.active.delete(t),this.counters.deadlineExceededRequests+=1,!0):!1}settle(t,n,r){let o=this.active.get(t);return o?(this.active.delete(t),o.cancelled?(this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"cancelled"}):o.meta.deadlineAt<=this.now()?(this.counters.deadlineExceededRequests+=1,this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"deadline_exceeded"}):(this.counters.completedRequests+=1,o.meta.idempotencyKey&&this.idempotency.set(o.meta.idempotencyKey,{result:n,error:r,settledAt:this.now()}),{accepted:!0})):{accepted:!1,reason:"unknown"}}metrics(){return{activeRequests:this.active.size,...this.counters}}};var te=["agent.health","agent.metrics","agent.cancel","session.list","session.get","session.create","session.update","session.delete","session.deleteAll","session.archive","session.moveToProject","session.getState","session.switchProject","session.getMessages","project.list","project.create","project.delete","project.rename","project.archive","project.unarchive","project.update","project.purgeAll","instructions.list","instructions.read","instructions.write","instructions.delete","files.list","files.read","files.create","files.rename","files.move","files.copy","files.delete","files.search","files.undoOperation","files.gitStatus","turnBaseline.getSummary","turnBaseline.getFileDiff","turnBaseline.listRecent","turnBaseline.getFileBaseline","workingMaterials.get","workingMaterials.replace","workingMaterials.upsert","workingMaterials.remove","workingMaterials.reorder","skills.list","memory.list-files","memory.atlas","memory.activity","memory.propose","memory.consolidate","memory.update","memory.attachment.adopt","memory.attachment.locate"];var M=["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.file_changes","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.approval_request","turn.skill_instruction","turn.ask_user","turn.media_result","turn.media_progress","turn.media_usage","turn.media_capability_check","turn.plan_update","turn.suggestions","turn.sidechain_started","turn.subagent_started","turn.subagent_delta","turn.subagent_ended","turn.sidechain_completed","turn.task_updated","turn.todos_updated","turn.exec_progress","turn.progress","turn.tool_use_summary","turn.tool_selection_policy","turn.lifecycle","turn.document_maintenance","turn.artifact_contract","turn.usage_update","team.member.notification","session.info","session.recovery_pending","memory.updated","skills.updated","turn.memory_recall","turn.memory_written","pet.soul_ready","pet.reaction","pet.growth","pet.state","pet.confirm","pet.asset.updated","system.activity","workflow.created","workflow.updated","workflow.deleted","workflow.runStarted","workflow.runCompleted","workflow.runFailed","workflow.nodeStatus","workflow.triggerDropped","workflow.alert","workflow.approvalRequested","workflow.approvalTimedOut"],w=["solo.progress","solo.specProgress","solo.agentDelta","solo.agentActivity","solo.agentUsage","solo.evaluation","product.taskStarted","product.taskOutput","product.members","product.agentActivity","product.taskCompleted","product.taskFailed","product.budgetUpdate","product.budgetWarning","product.checkpointed","product.completed","product.dagTopology","plan.interrupted","goal.run_state_changed","goal.phase_boundary","goal.goal_edited","goal.message_queued","goal.acceptance_updated"],ne=[...M,...w];import{createHash as bt}from"node:crypto";import{resolve as Et}from"node:path";var m={request:"x/delegate",update:"x/delegate.update",respond:"x/delegate.respond",cancel:"x/delegate.cancel"},re=["search","addText","embedText","ingestExtracted","proposeExtracted","consumePendingProposals","feedback","findRelatedEvents","synthesizeTimeline","getActivitySummary","getAllProfiles","setProfile","getAtlas","setMemoryArchived","triggerDecay","resolveConflicts"],ie=["initialize","getIndex","addToIndex","replaceInIndex","removeFromIndex","createFile","writeFile","readFile","deleteFile","listFiles","searchLocal"],oe=["getSkillSnapshot","readSkillFile","recordSkillInvocation","commitSkillMutation","applyCuratorPlan","prepareSkillInstall","finalizeSkillInstall"],se=["loadForResume","appendTranscript","updateTitle","saveState","saveTaskSummary","groupSplit"],ae=["commitTurnTelemetry","listDistillableFeedback","markFeedbackDistilled","runUploadSweep"],de=["getSnapshot","create","switch","update"],xt=1024*1024,pe=["navigate","snapshot","click","type","screenshot","console","network"];var ce=["open","recordEvent","checkpoint","get","list","delete","getCheckpoint","listCheckpoints","restoreCheckpoint"],le=["isActive","getSoul","awardXp","journeyCatchUp"],ue=["getTunables","updateTunable","clearTunable","appendDirectoryAllowRule"];var Mt=new Set(re),wt=new Set(ie),vt=new Set(ue),Ot=new Set(oe),Nt=new Set(se),Dt=new Set(ae),Ht=new Set(de),Lt=new Set(ce),Ut=new Set(le),jt=new Set(pe);var ge=1,me={INITIALIZE:"initialize",SESSION_NEW:"session/new",SESSION_PROMPT:"session/prompt",SESSION_CLOSE:"session/close",SESSION_SET_CONFIG:"session/set_config_option",SESSION_SET_MODEL:"session/set_model",SESSION_SET_MODE:"session/set_mode",SESSION_LOAD:"session/load",SESSION_CANCEL:"session/cancel",SESSION_UPDATE:"session/update",SESSION_REQUEST_PERMISSION:"session/request_permission",FS_READ_TEXT_FILE:"fs/read_text_file",FS_WRITE_TEXT_FILE:"fs/write_text_file"},fe={ABORT:"x/abort",DREAM:"x/dream",AGENTS_LIST:"x/agents.list",SOLO_START:"x/solo.start",SOLO_STATUS:"x/solo.status",SOLO_SELECT:"x/solo.select",SOLO_CANCEL:"x/solo.cancel",PRODUCT_CREATE:"x/product.create",PRODUCT_PLAN:"x/product.plan",PRODUCT_CONFIRM:"x/product.confirm",PRODUCT_MESSAGE:"x/product.message",PRODUCT_RESUME:"x/product.resume",PRODUCT_PAUSE:"x/product.pause",PRODUCT_CANCEL:"x/product.cancel",PRODUCT_ROLLBACK:"x/product.rollback",PRODUCT_REPLAY:"x/product.replay",PRODUCT_STATUS:"x/product.status",SOLO_SUBSCRIBE:"x/solo.subscribe",SOLO_MESSAGE:"x/solo.message",SOLO_EVALUATE:"x/solo.evaluate",SOLO_SPEC_CHAT:"x/solo.specChat",SOLO_SPEC_JUDGE:"x/solo.specJudge",WORKFLOW_CHAT:"x/workflow.chat",WORKFLOW_MATCH_INTENT:"x/workflow.matchIntent",PRODUCT_SUBSCRIBE:"x/product.subscribe",GOAL_START:"x/goal.start",GOAL_STATUS:"x/goal.status",GOAL_PAUSE:"x/goal.pause",GOAL_RESUME:"x/goal.resume",GOAL_UPDATE_GOAL:"x/goal.updateGoal",GOAL_STOP:"x/goal.stop",GOAL_MESSAGE:"x/goal.message",GOAL_SUBSCRIBE:"x/goal.subscribe",GOAL_EVENTS:"x/goal.events",MENTION_DELEGATE:"x/mention.delegate",MENTION_CANCEL:"x/mention.cancel",MENTION_LIST:"x/mention.list",DELEGATE:m.request,DELEGATE_UPDATE:m.update,DELEGATE_RESPOND:m.respond,DELEGATE_CANCEL:m.cancel},v={USER_MESSAGE_CHUNK:"user_message_chunk",AGENT_MESSAGE_CHUNK:"agent_message_chunk",AGENT_THOUGHT_CHUNK:"agent_thought_chunk",TOOL_CALL:"tool_call",TOOL_CALL_UPDATE:"tool_call_update",PLAN:"plan",USAGE_UPDATE:"usage_update",CONFIG_OPTION_UPDATE:"config_option_update",SESSION_INFO_UPDATE:"session_info_update",AVAILABLE_COMMANDS_UPDATE:"available_commands_update",CURRENT_MODE_UPDATE:"current_mode_update"},ye={X_SKILL_INSTRUCTION:"x_skill_instruction",X_SESSION_INFO:"x_session_info",X_RELAY:"x_relay"};function O(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&"id"in t}function N(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&typeof t.method=="string"&&!("id"in t)}function D(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&"id"in t&&!("method"in t)}function Ae(e){let t;try{t=JSON.parse(e)}catch{return null}return D(t)||O(t)||N(t)?t:null}function Re(e){return Object.values(v).includes(e)}function Se(e){return e.startsWith("x_")}var I=["gatewayVersion","toolNamespaces","workspaceIds","installedCapabilities","enabledCapabilities","features","approvalMode","toolManifests","skillManifests","pluginManifests","mcpManifests","approvalPolicy","workspaceSummaries"];function g(e){return e?e.map(t=>({...t})):void 0}function b(e){return e?e.map(t=>({...t})):void 0}function Ie(e){return e?[...e]:void 0}function H(e){return[...new Set(e.map(t=>t.trim()).filter(Boolean))].sort((t,n)=>t.localeCompare(n))}function f(e){return{...e,toolNamespaces:[...e.toolNamespaces],workspaceIds:[...e.workspaceIds],...e.changedSections?{changedSections:[...e.changedSections]}:{},...e.installedCapabilities?{installedCapabilities:[...e.installedCapabilities]}:{},...e.enabledCapabilities?{enabledCapabilities:[...e.enabledCapabilities]}:{},...e.features?{features:[...e.features]}:{},...e.toolManifests?{toolManifests:g(e.toolManifests)}:{},...e.skillManifests?{skillManifests:g(e.skillManifests)}:{},...e.pluginManifests?{pluginManifests:g(e.pluginManifests)}:{},...e.mcpManifests?{mcpManifests:g(e.mcpManifests)}:{},...e.approvalPolicy?{approvalPolicy:{...e.approvalPolicy}}:{},...e.workspaceSummaries?{workspaceSummaries:b(e.workspaceSummaries)}:{}}}function be(e){let{previous:t,update:n}=e;return!(n.syncMode==="diff"&&t&&(!n.baseSnapshotVersion||t.snapshotVersion===n.baseSnapshotVersion))||!t?f(n):{...f(t),snapshotVersion:n.snapshotVersion,updatedAt:n.updatedAt,...n.gatewayVersion!==void 0?{gatewayVersion:n.gatewayVersion}:{},...n.syncMode?{syncMode:n.syncMode}:{},...n.baseSnapshotVersion?{baseSnapshotVersion:n.baseSnapshotVersion}:{},...n.changedSections?{changedSections:[...n.changedSections]}:{},...n.toolNamespaces?{toolNamespaces:[...n.toolNamespaces]}:{},...n.workspaceIds?{workspaceIds:[...n.workspaceIds]}:{},...n.installedCapabilities?{installedCapabilities:[...n.installedCapabilities]}:{},...n.enabledCapabilities?{enabledCapabilities:[...n.enabledCapabilities]}:{},...n.features?{features:[...n.features]}:{},...n.approvalMode?{approvalMode:n.approvalMode}:{},...n.toolManifests?{toolManifests:g(n.toolManifests)}:{},...n.skillManifests?{skillManifests:g(n.skillManifests)}:{},...n.pluginManifests?{pluginManifests:g(n.pluginManifests)}:{},...n.mcpManifests?{mcpManifests:g(n.mcpManifests)}:{},...n.approvalPolicy?{approvalPolicy:{...n.approvalPolicy}}:{},...n.workspaceSummaries?{workspaceSummaries:b(n.workspaceSummaries)}:{}}}function Pe(e){return H(e.map(t=>t.name.split(".")[0]??"").filter(Boolean))}function Ee(e){return H(e.map(t=>t.id))}function he(e){let{previous:t,current:n}=e;if(!t)return{...f(n),syncMode:"full"};if(t.snapshotVersion===n.snapshotVersion)return null;let r=I.filter(s=>JSON.stringify(t[s])!==JSON.stringify(n[s]));if(r.length===I.length)return{...f(n),syncMode:"full"};let o={snapshotVersion:n.snapshotVersion,updatedAt:n.updatedAt,syncMode:"diff",baseSnapshotVersion:t.snapshotVersion,changedSections:r,toolNamespaces:[...n.toolNamespaces],workspaceIds:[...n.workspaceIds]},p=o;for(let s of r){let i=n[s];if(i!==void 0)switch(s){case"toolNamespaces":case"workspaceIds":case"installedCapabilities":case"enabledCapabilities":case"features":p[s]=Ie(i);break;case"approvalPolicy":p[s]={...i};break;case"workspaceSummaries":p[s]=b(i);break;case"toolManifests":case"skillManifests":case"pluginManifests":case"mcpManifests":p[s]=g(i);break;default:p[s]=i;break}}return o}var Te=["web_search","web_fetch","deep_research","browser_execution"],ke=["web-intelligence","browser-execution"],_e=["discovery","read-url","multi-source-research","interactive-browser"],Ce=["stateless","render-backend","interactive-session"],xe=["stateless","stateless-single-step","stateful-session-required"],Me=["required","conditional","none"],we=["browser-read","browser-authenticated-read","browser-state-changing"];var ve=["read-page","read-authenticated-page","fill-form","submit-form","download-file","reuse-session"],Oe=["web_search","web_fetch","deep_research","blocked"],Ne=["requires-interaction","requires-login-state","requires-rendered-dom","requires-persistent-session","requires-state-changing-action"],De=["none","same-capability-once","degrade-only"];var He=["prefetch","sync_turn","on_pre_compress","on_session_end","on_delegation","on_memory_write"],Le=["turn","sidechain","compress","session-end","agent-remember","auto-extract","implicit-extract","profile-extraction","dream"],Ue=["observe-only","parent-write","deny"];var je=2,a={gatewayImage:"gateway.image.desktop-slim",whisperModelTiny:"speech.whisper.model.tiny",ffmpegWin32X64:"runtime.ffmpeg.win32-x64",nodeWin32X64:"runtime.node.win32-x64",dockerDesktopWin32X64:"runtime.docker-desktop.win32-x64",dockerDesktopDarwinX64:"runtime.docker-desktop.darwin-x64",dockerDesktopDarwinArm64:"runtime.docker-desktop.darwin-arm64"},y={desktopDockerBridge:"desktop.docker-bridge",desktopEmbeddedWin32X64:"desktop.embedded.win32-x64"};function U(e){return{...e,artifacts:e.artifacts.map(t=>({...t}))}}function Fe(e){return{...e,assetIds:[...e.assetIds]}}function j(){return{[y.desktopDockerBridge]:{id:y.desktopDockerBridge,title:"Desktop Docker Bridge",platform:"any",assetIds:[a.gatewayImage,a.dockerDesktopWin32X64,a.dockerDesktopDarwinX64,a.dockerDesktopDarwinArm64],description:"Docker bridge mode downloads the desktop slim gateway image on demand."},[y.desktopEmbeddedWin32X64]:{id:y.desktopEmbeddedWin32X64,title:"Desktop Embedded Win32 x64",platform:"win32-x64",assetIds:[a.nodeWin32X64,a.ffmpegWin32X64,a.whisperModelTiny],description:"Embedded desktop mode requires the bundled Node/FFmpeg runtimes and the whisper model asset."}}}function F(e,t){return e.assets[t]}function K(e,t){return e.profiles[t]}function Ke(e,t){let n=K(e,t);return n?n.assetIds.map(r=>F(e,r)).filter(r=>!!r):[]}function We(e,t){return e.assets[t.id]=U(t),W(e)}function P(e){if(!e)return;let t=e.artifacts[0];if(!(!t?.url||!t.sha256||typeof t.size!="number"))return{version:e.version,sha256:t.sha256,size:t.size,url:t.url}}function W(e){let t=P(e.assets[a.gatewayImage]),n=P(e.assets[a.whisperModelTiny]);return{...e,gateway:t,whisperModel:n}}function L(e,t){if(!(typeof e.version!="string"||typeof e.url!="string"))return{...t,version:e.version,artifacts:[{fileName:e.url.split("/").pop()||`${t.id}.bin`,url:e.url,sha256:typeof e.sha256=="string"?e.sha256:void 0,size:typeof e.size=="number"?e.size:void 0}]}}function Ve(e){let t=e&&typeof e=="object"?e:{},n={},r=t.assets&&typeof t.assets=="object"?t.assets:{};for(let[i,d]of Object.entries(r)){if(!d||typeof d!="object")continue;let u=d;!u.id||!Array.isArray(u.artifacts)||(n[i]=U(u))}if(!n[a.gatewayImage]&&t.gateway&&typeof t.gateway=="object"){let i=L(t.gateway,{id:a.gatewayImage,title:"XiaoZhiClaw Gateway Image (Desktop Slim)",kind:"container-image",delivery:"remote",platform:"any",description:"Desktop Docker mode gateway image."});i&&(n[i.id]=i)}if(!n[a.whisperModelTiny]&&t.whisperModel&&typeof t.whisperModel=="object"){let i=L(t.whisperModel,{id:a.whisperModelTiny,title:"Whisper Tiny Model",kind:"model",delivery:"remote",platform:"any",description:"Shared whisper.cpp tiny model asset for embedded desktop speech recognition."});i&&(n[i.id]=i)}let p={...j()},s=t.profiles&&typeof t.profiles=="object"?t.profiles:{};for(let[i,d]of Object.entries(s)){if(!d||typeof d!="object")continue;let u=d;!u.id||!Array.isArray(u.assetIds)||(p[i]=Fe(u))}return W({schemaVersion:typeof t.schemaVersion=="number"?t.schemaVersion:2,channel:typeof t.channel=="string"?t.channel:void 0,publishedAt:typeof t.publishedAt=="string"?t.publishedAt:void 0,minElectronVersion:typeof t.minElectronVersion=="string"?t.minElectronVersion:void 0,releaseNotes:typeof t.releaseNotes=="string"?t.releaseNotes:void 0,assets:n,profiles:p})}var qe=["pending","captured","failed","restored"],Be=["file","directory","missing"],Ye=["metadata-only","workspace-copy","shadow-git"];var Ge=["api-key","oauth","token","aws-sdk"],ze=["rate_limit","auth","server_error","timeout","network","unknown"],Xe=["requiresOpenAiAnthropicToolPayload"];function $e(e,t){return!e||typeof e!="object"||Array.isArray(e)?!1:e[t]===!0}var V="openai-codex";function R(e){let t=e.trim().toLowerCase();return t==="z.ai"||t==="z-ai"?"zai":t==="opencode-zen"?"opencode":t==="kimi-code"?"kimi-coding":t==="bedrock"||t==="aws-bedrock"?"amazon-bedrock":t==="bytedance"||t==="doubao"?"volcengine":t}function q(e){let t=R(e);return t==="volcengine-plan"?"volcengine":t==="qwen-coding"?"qwen":t==="byteplus-plan"?"byteplus":t}var Je=q,Qe={anthropicToolSchemaMode:"native",anthropicToolChoiceMode:"native",providerFamily:"default",preserveAnthropicThinkingSignatures:!0,openAiCompatTurnValidation:!0,providerThoughtSignatureSanitization:!1,transcriptToolCallIdMode:"default",transcriptToolCallIdModelHints:[],providerThoughtSignatureModelHints:[],dropThinkingBlockModelHints:[]},Ze={anthropic:{providerFamily:"anthropic"},"amazon-bedrock":{providerFamily:"anthropic"},"kimi-coding":{anthropicToolSchemaMode:"openai-functions",anthropicToolChoiceMode:"openai-string-modes",preserveAnthropicThinkingSignatures:!1},mistral:{transcriptToolCallIdMode:"strict9",transcriptToolCallIdModelHints:["mistral","mixtral","codestral","pixtral","devstral","ministral","mistralai"]},openai:{providerFamily:"openai"},[V]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};function E(e,t){let n=(e??"").toLowerCase();return!!n&&t.some(r=>n.includes(r))}function c(e){let t=R(e??"");return{...Qe,...Ze[t]}}function et(e){return c(e).preserveAnthropicThinkingSignatures}function tt(e){let t=c(e);return t.anthropicToolSchemaMode!=="native"||t.anthropicToolChoiceMode!=="native"}function nt(e){return c(e).anthropicToolSchemaMode==="openai-functions"}function rt(e){return c(e).anthropicToolChoiceMode==="openai-string-modes"}function it(e){return c(e).openAiCompatTurnValidation}function ot(e){return c(e).providerFamily==="openai"}function st(e){return c(e).providerFamily==="anthropic"}function at(e){return E(e.modelId,c(e.provider).dropThinkingBlockModelHints)}function dt(e){let t=c(e.provider);return t.providerThoughtSignatureSanitization&&E(e.modelId,t.providerThoughtSignatureModelHints)}function pt(e,t){let n=c(e),r=n.transcriptToolCallIdMode;if(r==="strict9")return r;if(E(t,n.transcriptToolCallIdModelHints))return"strict9"}var h={anthropic:["ANTHROPIC_OAUTH_TOKEN","ANTHROPIC_API_KEY"],chutes:["CHUTES_OAUTH_TOKEN","CHUTES_API_KEY"],zai:["ZAI_API_KEY","Z_AI_API_KEY"],opencode:["OPENCODE_API_KEY","OPENCODE_ZEN_API_KEY"],qwen:["DASHSCOPE_API_KEY","QWEN_API_KEY"],"qwen-coding":["DASHSCOPE_API_KEY","QWEN_API_KEY"],volcengine:["VOLCANO_ENGINE_API_KEY","ARK_API_KEY","DOUBAO_API_KEY"],"volcengine-plan":["VOLCANO_ENGINE_API_KEY","ARK_API_KEY","DOUBAO_API_KEY"],byteplus:["BYTEPLUS_API_KEY"],"byteplus-plan":["BYTEPLUS_API_KEY"],"kimi-coding":["KIMI_API_KEY","KIMICODE_API_KEY"],huggingface:["HUGGINGFACE_HUB_TOKEN","HF_TOKEN"],openai:["OPENAI_API_KEY"],voyage:["VOYAGE_API_KEY"],groq:["GROQ_API_KEY"],deepgram:["DEEPGRAM_API_KEY"],cerebras:["CEREBRAS_API_KEY"],xai:["XAI_API_KEY"],openrouter:["OPENROUTER_API_KEY"],litellm:["LITELLM_API_KEY"],"vercel-ai-gateway":["AI_GATEWAY_API_KEY"],"cloudflare-ai-gateway":["CLOUDFLARE_AI_GATEWAY_API_KEY"],moonshot:["MOONSHOT_API_KEY"],minimax:["MINIMAX_API_KEY"],"minimax-cn":["MINIMAX_CN_API_KEY","MINIMAX_API_KEY"],nvidia:["NVIDIA_API_KEY"],xiaomi:["XIAOMI_API_KEY"],synthetic:["SYNTHETIC_API_KEY"],venice:["VENICE_API_KEY"],mistral:["MISTRAL_API_KEY"],together:["TOGETHER_API_KEY"],qianfan:["QIANFAN_API_KEY"],ollama:["OLLAMA_API_KEY"],vllm:["VLLM_API_KEY"],kilocode:["KILOCODE_API_KEY"]};function ct(){return[...new Set(Object.values(h).flat())]}function lt(e){let t=R(e.provider),n=e.env??process.env,r=new Set(e.appliedEnvKeys??[]),o=i=>{let d=n[i]?.trim();if(!d)return null;let u=r.has(i)?`shell env: ${i}`:`env: ${i}`;return{apiKey:d,source:u}},p=e.resolveSpecialApiKey?.(t,n,r);if(p)return p;let s=h[t];if(!s||s.length===0)return null;for(let i of s){let d=o(i);if(d)return d}return null}export{fe as ACP_EXTENDED_METHODS,ye as ACP_EXTENDED_SESSION_UPDATE_TYPES,me as ACP_METHODS,ge as ACP_PROTOCOL_VERSION,v as ACP_SESSION_UPDATE_TYPES,G as AGENT_RPC_APPROVAL_METHODS,l as AGENT_RPC_ERROR_CODES,Y as AGENT_RPC_PROTOCOL_VERSION,w as AGENT_TEAM_WS_EVENT_NAMES,M as AGENT_WS_EVENT_NAMES,ne as ALL_AGENT_WS_EVENT_NAMES,I as CAPABILITY_MANIFEST_DIFF_SECTIONS,te as GATEWAY_RPC_METHODS,S as GatewayRpcContract,He as MEMORY_OBSERVATION_HOOK_VALUES,Le as MEMORY_OBSERVATION_SOURCE_VALUES,Ue as MEMORY_WRITE_ACCESS_VALUES,Ye as MUTATION_CHECKPOINT_BACKEND_VALUES,Be as MUTATION_CHECKPOINT_ENTRY_KIND_VALUES,qe as MUTATION_CHECKPOINT_PHASE_VALUES,B as PETDEX_ANIMATION_IDS,Ge as PROVIDER_RUNTIME_AUTH_MODE_VALUES,Xe as PROVIDER_RUNTIME_COMPAT_FLAG_VALUES,h as PROVIDER_RUNTIME_ENV_API_KEY_CANDIDATES,V as PROVIDER_RUNTIME_OPENAI_CODEX_PROVIDER_ID,ze as PROVIDER_RUNTIME_VAULT_ERROR_TYPE_VALUES,je as RESOURCE_MANIFEST_SCHEMA_VERSION,a as RUNTIME_ASSET_IDS,y as RUNTIME_PROFILE_IDS,ve as WEB_ACTION_SCOPE_VALUES,Me as WEB_APPROVAL_DEFAULT_VALUES,ke as WEB_CAPABILITY_FAMILY_VALUES,Te as WEB_CAPABILITY_ID_VALUES,Oe as WEB_DEGRADATION_TARGET_VALUES,Ne as WEB_ESCALATION_REASON_VALUES,Ce as WEB_EXECUTION_MODE_VALUES,we as WEB_POLICY_RISK_CLASS_VALUES,De as WEB_RETRY_POLICY_VALUES,xe as WEB_STATEFULNESS_VALUES,_e as WEB_TASK_MODE_VALUES,ee as buildAgentRpcMeta,A as classifyGatewayRpcMethod,f as cloneCapabilityManifestSnapshot,he as createCapabilityManifestDiffPayload,j as createDefaultRuntimeResourceProfiles,Pe as deriveCapabilityToolNamespaces,Ee as deriveCapabilityWorkspaceIds,P as getManifestShortcutEntry,F as getRuntimeResourceAsset,K as getRuntimeResourceProfile,Ke as getRuntimeResourceProfileAssets,N as isAcpJsonRpcNotification,O as isAcpJsonRpcRequest,D as isAcpJsonRpcResponse,_ as isAgentRpcNotification,T as isAgentRpcRequest,k as isAgentRpcResponse,st as isAnthropicProviderRuntimeFamily,Se as isExtendedSessionUpdateType,ot as isOpenAiProviderRuntimeFamily,Re as isStandardSessionUpdateType,ct as listProviderRuntimeEnvApiKeyNames,be as mergeCapabilityManifestSnapshot,R as normalizeProviderRuntimeId,q as normalizeProviderRuntimeIdForAuth,Ve as normalizeRuntimeResourceManifest,Ae as parseAcpMessage,z as parseAgentRpcMessage,et as preservesProviderRuntimeAnthropicThinkingSignatures,$e as readProviderRuntimeCompatFlag,x as requireGatewayRpcMeta,C as requiresIdempotencyKey,tt as requiresOpenAiCompatibleAnthropicToolPayloadForProviderRuntime,c as resolveProviderRuntimeCapabilities,lt as resolveProviderRuntimeEnvApiKey,Je as resolveProviderRuntimeKeyFamily,pt as resolveProviderRuntimeTranscriptToolCallIdMode,at as shouldDropThinkingBlocksForProviderRuntimeModel,dt as shouldSanitizeProviderRuntimeThoughtSignaturesForModel,it as supportsOpenAiCompatTurnValidationForProviderRuntime,We as upsertRuntimeResourceAsset,nt as usesOpenAiFunctionAnthropicToolSchemaForProviderRuntime,rt as usesOpenAiStringModeAnthropicToolChoiceForProviderRuntime};
|