@vibe-lark/larkpal 0.1.89 → 0.1.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs CHANGED
@@ -24,5 +24,5 @@ ${a}环境变量:${s}
24
24
  CLAUDE_MODEL Claude 模型名称(如 ark-code-latest)
25
25
 
26
26
  ${i}首次使用?运行 larkpal init${i} 开始配置。${s}
27
- `)}async function u(){let e=process.argv.slice(2),t=e[0];if(t===`--version`||t===`-v`){console.log(c());return}if(t===`--help`||t===`-h`){l();return}if(t===`init`){let{runInteractiveInit:e}=await import(`./interactive-init-CzbT0dDB.mjs`),t=await e();process.exit(t)}if(t===`meeting-live-smoke`){let{runMeetingLiveSmokeCli:t}=await import(`./live-smoke-Be7Fzqj0.mjs`).then(e=>e.t);await t(e.slice(1));return}if(t===`meeting-live-teammate`){let{runMeetingLiveTeammateCli:t}=await import(`./live-smoke-Be7Fzqj0.mjs`).then(e=>e.t);await t(e.slice(1));return}if(t===`meeting-live-check`){let{runMeetingLiveCheckCli:t}=await import(`./live-smoke-Be7Fzqj0.mjs`).then(e=>e.t),n=await t(e.slice(1));process.exit(n)}if(t&&!t.startsWith(`-`)&&(console.log(`${o}未知命令: ${t}${s}\n`),l(),process.exit(1)),!(process.env.LARKPAL_HEADLESS===`1`||process.env.LARKPAL_HEADLESS===`true`)){let{LarkCliCredentialProvider:e}=await import(`./lark-cli-provider-DrGmcwiB.mjs`).then(e=>e.n);if(!e.isConfigured()){console.log(`\n${o}⚠️ 飞书应用凭证未配置${s}\n`),console.log(` LarkPal 需要飞书应用凭证才能启动。正在进入初始化向导...
27
+ `)}async function u(){let e=process.argv.slice(2),t=e[0];if(t===`--version`||t===`-v`){console.log(c());return}if(t===`--help`||t===`-h`){l();return}if(t===`init`){let{runInteractiveInit:e}=await import(`./interactive-init-CzbT0dDB.mjs`),t=await e();process.exit(t)}if(t===`meeting-live-smoke`){let{runMeetingLiveSmokeCli:t}=await import(`./live-smoke-BY248saY.mjs`).then(e=>e.t);await t(e.slice(1));return}if(t===`meeting-live-teammate`){let{runMeetingLiveTeammateCli:t}=await import(`./live-smoke-BY248saY.mjs`).then(e=>e.t);await t(e.slice(1));return}if(t===`meeting-live-check`){let{runMeetingLiveCheckCli:t}=await import(`./live-smoke-BY248saY.mjs`).then(e=>e.t),n=await t(e.slice(1));process.exit(n)}if(t&&!t.startsWith(`-`)&&(console.log(`${o}未知命令: ${t}${s}\n`),l(),process.exit(1)),!(process.env.LARKPAL_HEADLESS===`1`||process.env.LARKPAL_HEADLESS===`true`)){let{LarkCliCredentialProvider:e}=await import(`./lark-cli-provider-DrGmcwiB.mjs`).then(e=>e.n);if(!e.isConfigured()){console.log(`\n${o}⚠️ 飞书应用凭证未配置${s}\n`),console.log(` LarkPal 需要飞书应用凭证才能启动。正在进入初始化向导...
28
28
  `);let{runInteractiveInit:e}=await import(`./interactive-init-CzbT0dDB.mjs`),t=await e();t!==0&&process.exit(t),console.log(`${i}凭证配置完成,正在启动服务...${s}\n`)}}await import(`./main.mjs`)}u().catch(e=>{console.error(`LarkPal CLI 启动失败:`,e),process.exit(1)});export{};
@@ -14,8 +14,8 @@ import{r as e}from"./chunk-DHbaKqs-.mjs";import{t}from"./lark-logger-xpMKNNtY.mj
14
14
  --- LARKPAL_AGENTS_MD ---
15
15
  `)).digest(`hex`)}function Tt(e){return e.match(/Your Feishu-facing name is 「([^」]+)」/)?.[1]?.trim()||e.match(/你的名字是「([^」]+)」/)?.[1]?.trim()||void 0}function Et(e){let t=e.split(`/`)[1]?.toLowerCase();if(!t)return`.png`;if(t===`jpeg`)return`.jpg`;let n=`.${t}`;return d(`x${n}`)?n:`.png`}function Dt(e){return JSON.stringify(e)}function Ot(e){return`[${e.map(Dt).join(`, `)}]`}function kt(e){return`{ ${Object.entries(e).map(([e,t])=>`${e} = ${Dt(t)}`).join(`, `)} }`}function At(){let e=u(m(import.meta.url)),t=p(e,`mcp-server.mjs`);if(i(t))return{command:`node`,args:[t]};let n=p(e,`..`,`dist`,`mcp-server.mjs`);if(i(n))return{command:`node`,args:[n]};let r=p(e,`..`,`mcp-server`,`index.ts`);return i(r)?{command:`npx`,args:[`tsx`,r]}:{command:`node`,args:[t]}}function jt(e){if(!e)return!1;if(Array.isArray(e))return e.some(e=>jt(e));if(typeof e!=`object`)return!1;let t=e;return t.type===`image`||t.type===`localImage`||t.type===`input_image`?!0:Object.values(t).some(e=>jt(e))}function Mt(e){let t=Pt(e)??e;return Nt(t)?_t([`当前 Codex 模型不支持图片输入。`,``,`这条消息包含图片,但当前模型返回了图片能力错误。请改用支持视觉输入的模型,或先用文字描述图片内容后再试。`].join(`
16
16
  `),t):Error(t)}function Nt(e){let t=Pt(e)??e;return/does not support image inputs|image inputs|vision model/i.test(t)}function Pt(e){let t=e.trim();if(t.startsWith(`{`))try{let e=JSON.parse(t),n=P(e,[`error`,`message`])??P(e,[`message`]);return typeof n==`string`&&n.trim()?n.trim():void 0}catch{return}}function Ft(e){let t=[P(e,[`message`]),P(e,[`error`,`message`]),P(e,[`data`,`message`]),P(e,[`error`,`data`,`message`]),P(e,[`reason`]),P(e,[`error`,`reason`])];for(let e of t)if(typeof e==`string`&&e.trim())return e.trim()}function It(e){return!e||typeof e!=`object`?!1:e.willRetry===!0}function Lt(e,t){if(It(e))return!1;let n=[t,P(e,[`error`,`additionalDetails`]),P(e,[`additionalDetails`]),P(e,[`error`,`codexErrorInfo`]),P(e,[`codexErrorInfo`])].map(e=>typeof e==`string`?e:JSON.stringify(e??``)).join(`
17
- `);return/responseStreamDisconnected|stream disconnected before completion|stream closed before response\.completed|max_output_tokens/i.test(n)}function Rt(e){if(!e)return;let t=Number.parseInt(e,10);return Number.isFinite(t)&&t>0?t:void 0}function zt(e){if(!e)return;let t=Number.parseFloat(e);return Number.isFinite(t)&&t>0?t:void 0}function Bt(){return Rt(process.env.LARKPAL_CODEX_COMPACT_TIMEOUT_MS)??bt}function Vt(e){let t=P(e,[`turn`,`id`]);return typeof t==`string`?t:void 0}function Ht(e){let t=P(e,[`turn`,`status`]);return typeof t==`string`&&[`completed`,`failed`,`interrupted`].includes(t)}function Ut(e,t,n){let r,i=new Promise((e,i)=>{r=setTimeout(()=>i(Error(n)),t)});return Promise.race([e,i]).finally(()=>{r&&clearTimeout(r)})}function Wt(e){return Gt(e,0)}function P(e,t){let n=e;for(let e of t){if(!n||typeof n!=`object`||!(e in n))return;n=n[e]}return n}function Gt(e,t){if(typeof e==`string`)return e.length>2e3?`${e.slice(0,2e3)}...[truncated ${e.length-2e3} chars]`:e;if(typeof e!=`object`||!e)return e;if(t>=6)return`[truncated: max depth]`;if(Array.isArray(e)){let n=e.slice(0,20).map(e=>Gt(e,t+1));return e.length>20&&n.push(`[truncated ${e.length-20} items]`),n}let n=Object.entries(e),r={};for(let[e,i]of n.slice(0,50))r[e]=Gt(i,t+1);return n.length>50&&(r.__truncatedKeys=n.length-50),r}function Kt(e){let t=new Set,n=0,r=0;for(let i of e.split(/\r?\n/)){let e=/^diff --git a\/(.+?) b\/(.+)$/.exec(i);if(e){t.add(e[2]);continue}let a=/^\+\+\+ b\/(.+)$/.exec(i);if(a&&a[1]!==`/dev/null`){t.add(a[1]);continue}let o=/^--- a\/(.+)$/.exec(i);if(o&&o[1]!==`/dev/null`){t.add(o[1]);continue}i.startsWith(`+`)&&!i.startsWith(`+++`)&&(n+=1),i.startsWith(`-`)&&!i.startsWith(`---`)&&(r+=1)}return{filesChanged:Array.from(t),insertions:n,deletions:r}}function F(e,t,n){return{ok:!1,sessionId:e,messageId:t,filesChanged:[],insertions:0,deletions:0,error:n}}function qt(e,t,n){return new Promise((r,i)=>{let a=[`apply`,`-R`];n&&a.push(`--check`);let o=ie(`git`,a,{cwd:e,stdio:[`pipe`,`pipe`,`pipe`]}),s=``;o.stderr?.on(`data`,e=>{s+=String(e)}),o.on(`error`,i),o.on(`close`,e=>{e===0?r():i(Error(s.trim()||`git ${a.join(` `)} failed with exit code ${e}`))}),o.stdin.end(t)})}let Jt=null;function Yt(e){Jt=e}function Xt(){return Jt}var Zt=class extends Error{constructor(e,t=400){super(e),this.statusCode=t,this.name=`ArtifactUploadError`}},Qt=class{rootDir;maxUploadBytes;ttlMs;constructor(e){let t=e?.workspaceRoot||E();this.rootDir=f(t,`.artifacts`),this.maxUploadBytes=e?.maxUploadBytes??$t(`LARKPAL_ARTIFACT_MAX_UPLOAD_BYTES`,52428800),this.ttlMs=e?.ttlMs??$t(`LARKPAL_ARTIFACT_TTL_MS`,2592e5)}async create(e){I(e.sessionId,`sessionId`),I(e.owner.tenantKey,`tenantKey`);let t=`art_${T().replace(/-/g,``)}`,n=Date.now(),i=new Date(n).toISOString(),a=new Date(n+this.ttlMs).toISOString(),o=this.getArtifactDir(e.owner.tenantKey,e.sessionId,t),s=f(o,`blob`),c=f(o,`.blob.${process.pid}.${Date.now()}.tmp`);await g(o,{recursive:!0});let l=ae(`sha256`),u=0,d=new ge({transform:(e,t,n)=>{if(u+=e.length,u>this.maxUploadBytes){n(new Zt(`Artifact exceeds max upload size ${this.maxUploadBytes} bytes`,413));return}l.update(e),n(null,e)}});try{await he(e.stream,d,r(c)),await y(c,s)}catch(e){throw await b(o,{recursive:!0,force:!0}).catch(()=>void 0),e}let p={artifactId:t,sessionId:e.sessionId,tenantKey:e.owner.tenantKey,userId:e.owner.userId,openId:e.owner.openId,kind:`workspace-file`,uri:`artifact://${t}`,fileName:en(e.fileName),mimeType:tn(e.mimeType),size:u,contentHash:`sha256:${l.digest(`hex`)}`,createdAt:i,expiresAt:a,metadata:e.metadata,blobPath:s};return await on(f(o,`meta.json`),p),nn(p)}async list(e){I(e.sessionId,`sessionId`),I(e.owner.tenantKey,`tenantKey`);let t=this.getSessionDir(e.owner.tenantKey,e.sessionId),n;try{n=await v(t)}catch{return[]}let r=[];for(let i of n){if(!i.startsWith(`art_`))continue;let n=await an(f(t,i,`meta.json`));n&&rn(n,e.owner,e.sessionId)&&(Date.parse(n.expiresAt)<=Date.now()||r.push(nn(n)))}return r.sort((e,t)=>e.createdAt.localeCompare(t.createdAt))}async statBlob(e,t){let n=await an(this.getMetadataPath(t.tenantKey,e.sessionId,e.artifactId));if(!n||!rn(n,t,e.sessionId))return null;let r=await ee(n.blobPath).catch(()=>null);return r?{path:n.blobPath,size:r.size}:null}async resolveBlob(e){I(e.sessionId,`sessionId`),I(e.owner.tenantKey,`tenantKey`),I(e.artifactId,`artifactId`);let t=await an(this.getMetadataPath(e.owner.tenantKey,e.sessionId,e.artifactId));return!t||!rn(t,e.owner,e.sessionId)||Date.parse(t.expiresAt)<=Date.now()||!await ee(t.blobPath).catch(()=>null)?null:{ref:nn(t),blobPath:t.blobPath}}getSessionDir(e,t){return f(this.rootDir,e,t)}getArtifactDir(e,t,n){return f(this.getSessionDir(e,t),n)}getMetadataPath(e,t,n){return f(this.getArtifactDir(e,t,n),`meta.json`)}};function $t(e,t){let n=process.env[e];if(!n)return t;let r=Number.parseInt(n,10);return Number.isFinite(r)&&r>0?r:t}function I(e,t){if(!/^[A-Za-z0-9_.:-]{1,200}$/.test(e))throw new Zt(`Invalid ${t}`,400)}function en(e){return e.replace(/[\\/\0\r\n]/g,`_`).trim()||`upload.bin`}function tn(e){return e?.trim()||`application/octet-stream`}function nn(e){let{tenantKey:t,userId:n,openId:r,blobPath:i,...a}=e;return a}function rn(e,t,n){return e.tenantKey===t.tenantKey&&e.userId===t.userId&&e.openId===t.openId&&e.sessionId===n}async function an(e){try{return JSON.parse(await _(e,`utf-8`))}catch{return null}}async function on(e,t){await g(u(e),{recursive:!0}),await S(e,JSON.stringify(t,null,2),`utf-8`)}const L=t(`runtime/larkpal-agent-factory`),sn=f(C(),`.claude`,`CLAUDE.md`);async function cn(){try{let e=await _(sn,`utf-8`);return L.info(`systemPrompt 加载成功`,{path:sn,length:e.length}),e}catch{return L.warn(`systemPrompt 文件不存在,使用默认`,{path:sn}),`你是一个 AI 助手,帮助用户完成飞书知识管理任务。`}}function ln(){let e=process.env.LARKPAL_AGENT_LLM_BASE_URL,t=process.env.LARKPAL_AGENT_LLM_API_KEY,n=process.env.LARKPAL_AGENT_LLM_MODEL;if(!e||!t||!n)throw Error(`larkpal-agent 需要配置 LLM 环境变量: LARKPAL_AGENT_LLM_BASE_URL, LARKPAL_AGENT_LLM_API_KEY, LARKPAL_AGENT_LLM_MODEL`);return{baseURL:e,apiKey:t,defaultModel:n}}function un(){return(process.env.LARKPAL_AGENT_SCENARIO_DIRS||``).split(`:`).map(e=>e.trim()).filter(Boolean)}function dn(e=process.env){let t=e.LARKPAL_AGENT_MCP_TIMEOUT_MS;if(t==null||t.trim()===``)return 1e4;let n=Number.parseInt(t,10);if(!Number.isFinite(n)||!/^\d+$/.test(t.trim())||n<=0)throw Error(`LARKPAL_AGENT_MCP_TIMEOUT_MS 必须是正整数毫秒值`);return n}function fn(e){let t=process.env.LARKPAL_AGENT_SCENARIO_PROVIDER_CONFIG;if(t){let e=hn(t);if(!e.type)throw Error(`LARKPAL_AGENT_SCENARIO_PROVIDER_CONFIG 缺少必填字段 type`);return pn(e)}let n=process.env.LARKPAL_AGENT_SCENARIO_PROVIDER_TYPE;if(!(!n&&e.length===0)){if(!n||n===`local`)return{type:`local`,manifestDirs:e,dirs:e};if(n===`http`){let e=process.env.LARKPAL_AGENT_SCENARIO_PROVIDER_BASE_URL||process.env.LARKPAL_AGENT_SCENARIO_PROVIDER_URL||process.env.AI_KNOWLEDGE_SCENARIO_PROVIDER_BASE_URL;if(!e)throw Error(`LARKPAL_AGENT_SCENARIO_PROVIDER_TYPE=http 时必须配置 LARKPAL_AGENT_SCENARIO_PROVIDER_BASE_URL`);let t=mn(e);return{type:n,baseURL:t,baseUrl:t,headers:gn(`LARKPAL_AGENT_SCENARIO_PROVIDER_HEADERS`)}}return n===`mcp`?{type:n,toolPrefix:process.env.LARKPAL_AGENT_SCENARIO_PROVIDER_MCP_TOOL_PREFIX}:{type:n}}}function pn(e){if(e.type!==`http`)return e;let t=typeof e.baseURL==`string`?e.baseURL:typeof e.baseUrl==`string`?e.baseUrl:void 0;if(!t)return e;let n=mn(t);return{...e,baseURL:n,baseUrl:n}}function mn(e){let t=e.trim().replace(/\/+$/,``);return t.toLowerCase().endsWith(`/api/scenario-manifests`)&&t.slice(0,-23)||t}function hn(e){try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`config must be a JSON object`);return t}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`LARKPAL_AGENT_SCENARIO_PROVIDER_CONFIG 不是合法 JSON 对象: ${t}`,{cause:e})}}function gn(e){let t=process.env[e];if(!t)return;let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`${e} 必须是 JSON object`);let r={};for(let[e,t]of Object.entries(n))typeof t==`string`&&(r[e]=t);return r}function _n(e){if(e)return{type:e.type,baseURL:e.baseURL||e.baseUrl,manifestDirCount:Array.isArray(e.manifestDirs)?e.manifestDirs.length:void 0,hasHeaders:!!e.headers,toolPrefix:e.toolPrefix}}async function vn(){let e=ln(),t=await cn(),n=parseInt(process.env.LARKPAL_AGENT_MAX_TURNS||`25`,10),r=un(),i=fn(r),a=dn();L.info(`创建 LarkpalAgentAdapter`,{baseURL:e.baseURL,model:e.defaultModel,maxTurns:n,mcpTimeoutMs:a,scenarioProvider:_n(i)});let{LarkpalAgentAdapter:o,ToolRegistry:s}=await import(`@vibe-lark/larkpal-agent`),c=new s,l=parseInt(process.env.LARKPAL_AGENT_VISUAL_MAX_BATCH_SIZE||`3`,10),u=new o({llm:e,systemPrompt:t,tools:[],defaultMaxTurns:n,registry:c,scenarioManifestDirs:r,scenarioProviderConfig:i,artifactResolvers:[yn()],visualRuntime:{maxBatchSize:l,allowedDirs:[process.env.LARK_CLI_WORKDIR||`/tmp/ai-knowledge-lark-cli`,`/tmp`].filter(Boolean)}}),d=process.env.LARKPAL_AGENT_MCP_SERVER_URL;if(d)try{let e=await c.connectMcpServer(d,{timeoutMs:a}),t=c.getAll();u.registerTools(t),L.info(`MCP 工具注册完成`,{serverUrl:d,timeoutMs:a,toolCount:e,toolNames:t.map(e=>e.name)})}catch(e){L.error(`MCP Server 连接失败,Agent 将无法使用远程工具`,{serverUrl:d,error:e?.message})}else L.warn(`未配置 LARKPAL_AGENT_MCP_SERVER_URL,Agent 无远程工具可用`);return bn(u)}function yn(e){let t=e?.store||new Qt;return{name:`larkpal-gateway-artifact-store`,canResolve(e){return xn(e)!==void 0},async resolve(e,n){let r=xn(e),i=n.tenantKey||n.authHeaders?.[`x-tenant-key`],a=n.userId||n.authHeaders?.[`x-user-id`],o=n.authHeaders?.[`x-open-id`]||a;if(!r||!i||!a||!o)return;let s=await t.resolveBlob({sessionId:n.sessionId,artifactId:r,owner:{tenantKey:i,userId:a,openId:o}});if(!s)return;let c=f(n.cwd,`source-artifacts`,r),l=Sn(s.ref.fileName||e.fileName||r),u=f(c,l);return await g(c,{recursive:!0}),await h(s.blobPath,u),{artifactId:r,kind:`workspace-file`,path:u,fileName:l,mimeType:s.ref.mimeType??e.mimeType,size:s.ref.size??e.size,contentHash:s.ref.contentHash??e.contentHash,source:e,refs:{uri:s.ref.uri,gatewayArtifactId:s.ref.artifactId}}}}}function bn(e){return{get name(){return e.name},executePrompt(t,n){return e.executePrompt(t,n)},stopProcess(t){return e.stopProcess(t)},stopAll(){return e.stopAll()},getProcessInfo(t){return e.getProcessInfo(t)},getAllProcessInfo(){return e.getAllProcessInfo()},isSessionBusy(t){return e.isSessionBusy?.(t)??!1}}}function xn(e){let t=typeof e.artifactId==`string`?e.artifactId.trim():``;if(t.startsWith(`art_`))return t;let n=typeof e.uri==`string`?e.uri.trim():``;if(!n.startsWith(`artifact://`))return;let r=n.slice(11).split(/[/?#]/,1)[0]?.trim();return r?.startsWith(`art_`)?r:void 0}function Sn(e){return l(e).replace(/[\\/\0\r\n]/g,`_`).trim()||`artifact.bin`}const Cn=t(`runtime/factory`);async function wn(e){let t=n({defaultRuntime:e===`codex-app-server`||e===`larkpal-agent`||e===`claude-code`?e:`claude-code`}),r;r=t===`larkpal-agent`?await vn():t===`codex-app-server`?new St:new ut;let i=r.name===`codex-app-server`?process.env.LARKPAL_CODEX_MODEL||process.env.CODEX_MODEL||void 0:process.env.CLAUDE_MODEL||void 0;return Cn.info(`Runtime adapter created`,{requestedRuntime:t,adapter:r.name,model:i??`(default)`}),{adapter:r,runtimeName:t,model:i}}const Tn=`<!-- LARKPAL_RUNTIME_INSTRUCTIONS_START -->`,En=`<!-- LARKPAL_RUNTIME_INSTRUCTIONS_END -->`;function Dn(e){let t=On(e.instructions),n=kn(e.skills);if(!(t.length===0&&n.length===0))return{instructions:t.length>0?An(e.cwd,t):[],skills:n.map(t=>Mn(e.cwd,t))}}function On(e){return Array.isArray(e)?e.map(e=>{if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e,n=R(t.id),r=R(t.content);return!n||!r?null:{id:n,content:r,scope:Ln(t.scope),version:R(t.version)}}).filter(e=>e!=null):[]}function kn(e){return Array.isArray(e)?e.map(e=>{if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e,n=R(t.id),r=R(t.content)||R(t.skillMarkdown);return!n||!r?null:{id:n,content:r,scope:Ln(t.scope),version:R(t.version),name:R(t.name),description:R(t.description)}}).filter(e=>e!=null):[]}function An(e,t){let n=[Tn,`# LarkPal Runtime Instructions`,``,`The following instructions were injected by LarkPal for this agent session. Treat them as runtime context, not as user message content.`,``,...t.flatMap(e=>[`## ${e.id}`,``,e.content.trim(),``]),En,``].join(`
18
- `);return jn(f(e,`CLAUDE.md`),n),jn(f(e,`AGENTS.md`),n.replace(Tn,`<!-- LARKPAL_RUNTIME_INSTRUCTIONS_START -->`).replace(En,`<!-- LARKPAL_RUNTIME_INSTRUCTIONS_END -->`)),t.map(e=>({id:e.id,scope:e.scope??`request`,hash:Fn(e.content),version:e.version,path:`CLAUDE.md,AGENTS.md`}))}function jn(e,t){let n=Pn(i(e)?o(e,`utf-8`):``,t);a(u(e),{recursive:!0}),s(e,n,`utf-8`)}function Mn(e,t){let n=`.claude/skills/${In(t.id)}/SKILL.md`,r=f(e,n),i=Nn(t);return a(u(r),{recursive:!0}),s(r,i,`utf-8`),{id:t.id,scope:t.scope??`request`,hash:Fn(i),version:t.version,path:n}}function Nn(e){let t=e.content.trim();if(t.startsWith(`---`))return`${t}\n`;let n=e.name||e.id,r=e.description||`Runtime skill injected by LarkPal: ${e.id}`;return[`---`,`name: ${Rn(n)}`,`description: ${Rn(r)}`,`---`,``,t,``].join(`
17
+ `);return/responseStreamDisconnected|stream disconnected before completion|stream closed before response\.completed|max_output_tokens/i.test(n)}function Rt(e){if(!e)return;let t=Number.parseInt(e,10);return Number.isFinite(t)&&t>0?t:void 0}function zt(e){if(!e)return;let t=Number.parseFloat(e);return Number.isFinite(t)&&t>0?t:void 0}function Bt(){return Rt(process.env.LARKPAL_CODEX_COMPACT_TIMEOUT_MS)??bt}function Vt(e){let t=P(e,[`turn`,`id`]);return typeof t==`string`?t:void 0}function Ht(e){let t=P(e,[`turn`,`status`]);return typeof t==`string`&&[`completed`,`failed`,`interrupted`].includes(t)}function Ut(e,t,n){let r,i=new Promise((e,i)=>{r=setTimeout(()=>i(Error(n)),t)});return Promise.race([e,i]).finally(()=>{r&&clearTimeout(r)})}function Wt(e){return Gt(e,0)}function P(e,t){let n=e;for(let e of t){if(!n||typeof n!=`object`||!(e in n))return;n=n[e]}return n}function Gt(e,t){if(typeof e==`string`)return e.length>2e3?`${e.slice(0,2e3)}...[truncated ${e.length-2e3} chars]`:e;if(typeof e!=`object`||!e)return e;if(t>=6)return`[truncated: max depth]`;if(Array.isArray(e)){let n=e.slice(0,20).map(e=>Gt(e,t+1));return e.length>20&&n.push(`[truncated ${e.length-20} items]`),n}let n=Object.entries(e),r={};for(let[e,i]of n.slice(0,50))r[e]=Gt(i,t+1);return n.length>50&&(r.__truncatedKeys=n.length-50),r}function Kt(e){let t=new Set,n=0,r=0;for(let i of e.split(/\r?\n/)){let e=/^diff --git a\/(.+?) b\/(.+)$/.exec(i);if(e){t.add(e[2]);continue}let a=/^\+\+\+ b\/(.+)$/.exec(i);if(a&&a[1]!==`/dev/null`){t.add(a[1]);continue}let o=/^--- a\/(.+)$/.exec(i);if(o&&o[1]!==`/dev/null`){t.add(o[1]);continue}i.startsWith(`+`)&&!i.startsWith(`+++`)&&(n+=1),i.startsWith(`-`)&&!i.startsWith(`---`)&&(r+=1)}return{filesChanged:Array.from(t),insertions:n,deletions:r}}function F(e,t,n){return{ok:!1,sessionId:e,messageId:t,filesChanged:[],insertions:0,deletions:0,error:n}}function qt(e,t,n){return new Promise((r,i)=>{let a=[`apply`,`-R`];n&&a.push(`--check`);let o=ie(`git`,a,{cwd:e,stdio:[`pipe`,`pipe`,`pipe`]}),s=``;o.stderr?.on(`data`,e=>{s+=String(e)}),o.on(`error`,i),o.on(`close`,e=>{e===0?r():i(Error(s.trim()||`git ${a.join(` `)} failed with exit code ${e}`))}),o.stdin.end(t)})}let Jt=null;function Yt(e){Jt=e}function Xt(){return Jt}var Zt=class extends Error{constructor(e,t=400){super(e),this.statusCode=t,this.name=`ArtifactUploadError`}},Qt=class{rootDir;maxUploadBytes;ttlMs;constructor(e){let t=e?.workspaceRoot||E();this.rootDir=f(t,`.artifacts`),this.maxUploadBytes=e?.maxUploadBytes??$t(`LARKPAL_ARTIFACT_MAX_UPLOAD_BYTES`,52428800),this.ttlMs=e?.ttlMs??$t(`LARKPAL_ARTIFACT_TTL_MS`,2592e5)}async create(e){I(e.sessionId,`sessionId`),I(e.owner.tenantKey,`tenantKey`);let t=`art_${T().replace(/-/g,``)}`,n=Date.now(),i=new Date(n).toISOString(),a=new Date(n+this.ttlMs).toISOString(),o=this.getArtifactDir(e.owner.tenantKey,e.sessionId,t),s=f(o,`blob`),c=f(o,`.blob.${process.pid}.${Date.now()}.tmp`);await g(o,{recursive:!0});let l=ae(`sha256`),u=0,d=new ge({transform:(e,t,n)=>{if(u+=e.length,u>this.maxUploadBytes){n(new Zt(`Artifact exceeds max upload size ${this.maxUploadBytes} bytes`,413));return}l.update(e),n(null,e)}});try{await he(e.stream,d,r(c)),await y(c,s)}catch(e){throw await b(o,{recursive:!0,force:!0}).catch(()=>void 0),e}let p={artifactId:t,sessionId:e.sessionId,tenantKey:e.owner.tenantKey,userId:e.owner.userId,openId:e.owner.openId,kind:`workspace-file`,uri:`artifact://${t}`,fileName:en(e.fileName),mimeType:tn(e.mimeType),size:u,contentHash:`sha256:${l.digest(`hex`)}`,createdAt:i,expiresAt:a,metadata:e.metadata,blobPath:s};return await on(f(o,`meta.json`),p),nn(p)}async list(e){I(e.sessionId,`sessionId`),I(e.owner.tenantKey,`tenantKey`);let t=this.getSessionDir(e.owner.tenantKey,e.sessionId),n;try{n=await v(t)}catch{return[]}let r=[];for(let i of n){if(!i.startsWith(`art_`))continue;let n=await an(f(t,i,`meta.json`));n&&rn(n,e.owner,e.sessionId)&&(Date.parse(n.expiresAt)<=Date.now()||r.push(nn(n)))}return r.sort((e,t)=>e.createdAt.localeCompare(t.createdAt))}async statBlob(e,t){let n=await an(this.getMetadataPath(t.tenantKey,e.sessionId,e.artifactId));if(!n||!rn(n,t,e.sessionId))return null;let r=await ee(n.blobPath).catch(()=>null);return r?{path:n.blobPath,size:r.size}:null}async resolveBlob(e){I(e.sessionId,`sessionId`),I(e.owner.tenantKey,`tenantKey`),I(e.artifactId,`artifactId`);let t=await an(this.getMetadataPath(e.owner.tenantKey,e.sessionId,e.artifactId));return!t||!rn(t,e.owner,e.sessionId)||Date.parse(t.expiresAt)<=Date.now()||!await ee(t.blobPath).catch(()=>null)?null:{ref:nn(t),blobPath:t.blobPath}}getSessionDir(e,t){return f(this.rootDir,e,t)}getArtifactDir(e,t,n){return f(this.getSessionDir(e,t),n)}getMetadataPath(e,t,n){return f(this.getArtifactDir(e,t,n),`meta.json`)}};function $t(e,t){let n=process.env[e];if(!n)return t;let r=Number.parseInt(n,10);return Number.isFinite(r)&&r>0?r:t}function I(e,t){if(!/^[A-Za-z0-9_.:-]{1,200}$/.test(e))throw new Zt(`Invalid ${t}`,400)}function en(e){return e.replace(/[\\/\0\r\n]/g,`_`).trim()||`upload.bin`}function tn(e){return e?.trim()||`application/octet-stream`}function nn(e){let{tenantKey:t,userId:n,openId:r,blobPath:i,...a}=e;return a}function rn(e,t,n){return e.tenantKey===t.tenantKey&&e.userId===t.userId&&e.openId===t.openId&&e.sessionId===n}async function an(e){try{return JSON.parse(await _(e,`utf-8`))}catch{return null}}async function on(e,t){await g(u(e),{recursive:!0}),await S(e,JSON.stringify(t,null,2),`utf-8`)}const L=t(`runtime/larkpal-agent-factory`),sn=f(C(),`.claude`,`CLAUDE.md`);async function cn(){try{let e=await _(sn,`utf-8`);return L.info(`systemPrompt 加载成功`,{path:sn,length:e.length}),e}catch{return L.warn(`systemPrompt 文件不存在,使用默认`,{path:sn}),`你是一个 AI 助手,帮助用户完成飞书知识管理任务。`}}function ln(){let e=process.env.LARKPAL_AGENT_LLM_BASE_URL,t=process.env.LARKPAL_AGENT_LLM_API_KEY,n=process.env.LARKPAL_AGENT_LLM_MODEL;if(!e||!t||!n)throw Error(`larkpal-agent 需要配置 LLM 环境变量: LARKPAL_AGENT_LLM_BASE_URL, LARKPAL_AGENT_LLM_API_KEY, LARKPAL_AGENT_LLM_MODEL`);return{baseURL:e,apiKey:t,defaultModel:n}}function un(){return(process.env.LARKPAL_AGENT_SCENARIO_DIRS||``).split(`:`).map(e=>e.trim()).filter(Boolean)}function dn(e=process.env){let t=e.LARKPAL_AGENT_MCP_TIMEOUT_MS;if(t==null||t.trim()===``)return 1e4;let n=Number.parseInt(t,10);if(!Number.isFinite(n)||!/^\d+$/.test(t.trim())||n<=0)throw Error(`LARKPAL_AGENT_MCP_TIMEOUT_MS 必须是正整数毫秒值`);return n}function fn(e){let t=process.env.LARKPAL_AGENT_SCENARIO_PROVIDER_CONFIG;if(t){let e=hn(t);if(!e.type)throw Error(`LARKPAL_AGENT_SCENARIO_PROVIDER_CONFIG 缺少必填字段 type`);return pn(e)}let n=process.env.LARKPAL_AGENT_SCENARIO_PROVIDER_TYPE;if(!(!n&&e.length===0)){if(!n||n===`local`)return{type:`local`,manifestDirs:e,dirs:e};if(n===`http`){let e=process.env.LARKPAL_AGENT_SCENARIO_PROVIDER_BASE_URL||process.env.LARKPAL_AGENT_SCENARIO_PROVIDER_URL||process.env.AI_KNOWLEDGE_SCENARIO_PROVIDER_BASE_URL;if(!e)throw Error(`LARKPAL_AGENT_SCENARIO_PROVIDER_TYPE=http 时必须配置 LARKPAL_AGENT_SCENARIO_PROVIDER_BASE_URL`);let t=mn(e);return{type:n,baseURL:t,baseUrl:t,headers:gn(`LARKPAL_AGENT_SCENARIO_PROVIDER_HEADERS`)}}return n===`mcp`?{type:n,toolPrefix:process.env.LARKPAL_AGENT_SCENARIO_PROVIDER_MCP_TOOL_PREFIX}:{type:n}}}function pn(e){if(e.type!==`http`)return e;let t=typeof e.baseURL==`string`?e.baseURL:typeof e.baseUrl==`string`?e.baseUrl:void 0;if(!t)return e;let n=mn(t);return{...e,baseURL:n,baseUrl:n}}function mn(e){let t=e.trim().replace(/\/+$/,``);return t.toLowerCase().endsWith(`/api/scenario-manifests`)&&t.slice(0,-23)||t}function hn(e){try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`config must be a JSON object`);return t}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`LARKPAL_AGENT_SCENARIO_PROVIDER_CONFIG 不是合法 JSON 对象: ${t}`,{cause:e})}}function gn(e){let t=process.env[e];if(!t)return;let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`${e} 必须是 JSON object`);let r={};for(let[e,t]of Object.entries(n))typeof t==`string`&&(r[e]=t);return r}function _n(e){if(e)return{type:e.type,baseURL:e.baseURL||e.baseUrl,manifestDirCount:Array.isArray(e.manifestDirs)?e.manifestDirs.length:void 0,hasHeaders:!!e.headers,toolPrefix:e.toolPrefix}}async function vn(){let e=ln(),t=await cn(),n=parseInt(process.env.LARKPAL_AGENT_MAX_TURNS||`25`,10),r=un(),i=fn(r),a=dn();L.info(`创建 LarkpalAgentAdapter`,{baseURL:e.baseURL,model:e.defaultModel,maxTurns:n,mcpTimeoutMs:a,scenarioProvider:_n(i)});let{LarkpalAgentAdapter:o,ToolRegistry:s}=await import(`@vibe-lark/larkpal-agent`),c=new s,l=parseInt(process.env.LARKPAL_AGENT_VISUAL_MAX_BATCH_SIZE||`3`,10),u=new o({llm:e,systemPrompt:t,tools:[],defaultMaxTurns:n,registry:c,scenarioManifestDirs:r,scenarioProviderConfig:i,artifactResolvers:[yn()],visualRuntime:{maxBatchSize:l,allowedDirs:[process.env.LARK_CLI_WORKDIR||`/tmp/ai-knowledge-lark-cli`,`/tmp`].filter(Boolean)}}),d=process.env.LARKPAL_AGENT_MCP_SERVER_URL;if(d)try{let e=await c.connectMcpServer(d,{timeoutMs:a}),t=c.getAll();u.registerTools(t),L.info(`MCP 工具注册完成`,{serverUrl:d,timeoutMs:a,toolCount:e,toolNames:t.map(e=>e.name)})}catch(e){L.error(`MCP Server 连接失败,Agent 将无法使用远程工具`,{serverUrl:d,error:e?.message})}else L.warn(`未配置 LARKPAL_AGENT_MCP_SERVER_URL,Agent 无远程工具可用`);return bn(u)}function yn(e){let t=e?.store||new Qt;return{name:`larkpal-gateway-artifact-store`,canResolve(e){return xn(e)!==void 0},async resolve(e,n){let r=xn(e),i=n.tenantKey||n.authHeaders?.[`x-tenant-key`],a=n.userId||n.authHeaders?.[`x-user-id`],o=n.authHeaders?.[`x-open-id`]||a;if(!r||!i||!a||!o)return;let s=await t.resolveBlob({sessionId:n.sessionId,artifactId:r,owner:{tenantKey:i,userId:a,openId:o}});if(!s)return;let c=f(n.cwd,`source-artifacts`,r),l=Sn(s.ref.fileName||e.fileName||r),u=f(c,l);return await g(c,{recursive:!0}),await h(s.blobPath,u),{artifactId:r,kind:`workspace-file`,path:u,fileName:l,mimeType:s.ref.mimeType??e.mimeType,size:s.ref.size??e.size,contentHash:s.ref.contentHash??e.contentHash,source:e,refs:{uri:s.ref.uri,gatewayArtifactId:s.ref.artifactId}}}}}function bn(e){return{get name(){return e.name},executePrompt(t,n){return e.executePrompt(t,n)},stopProcess(t){return e.stopProcess(t)},stopAll(){return e.stopAll()},getProcessInfo(t){return e.getProcessInfo(t)},getAllProcessInfo(){return e.getAllProcessInfo()},isSessionBusy(t){return e.isSessionBusy?.(t)??!1}}}function xn(e){let t=typeof e.artifactId==`string`?e.artifactId.trim():``;if(t.startsWith(`art_`))return t;let n=typeof e.uri==`string`?e.uri.trim():``;if(!n.startsWith(`artifact://`))return;let r=n.slice(11).split(/[/?#]/,1)[0]?.trim();return r?.startsWith(`art_`)?r:void 0}function Sn(e){return l(e).replace(/[\\/\0\r\n]/g,`_`).trim()||`artifact.bin`}const Cn=t(`runtime/factory`);async function wn(e){let t=n({defaultRuntime:e===`codex-app-server`||e===`larkpal-agent`||e===`claude-code`?e:`claude-code`}),r;r=t===`larkpal-agent`?await vn():t===`codex-app-server`?new St:new ut;let i=r.name===`codex-app-server`?process.env.LARKPAL_CODEX_MODEL||process.env.CODEX_MODEL||void 0:process.env.CLAUDE_MODEL||void 0;return Cn.info(`Runtime adapter created`,{requestedRuntime:t,adapter:r.name,model:i??`(default)`}),{adapter:r,runtimeName:t,model:i}}const Tn=`<!-- LARKPAL_RUNTIME_INSTRUCTIONS_START -->`,En=`<!-- LARKPAL_RUNTIME_INSTRUCTIONS_END -->`;function Dn(e){let t=On(e.instructions),n=kn(e.skills);if(!(t.length===0&&n.length===0))return{instructions:t.length>0?An(e.cwd,t):[],skills:n.map(t=>Mn(e.cwd,t))}}function On(e){return Array.isArray(e)?e.map(e=>{if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e,n=R(t.id),r=R(t.content);return!n||!r?null:{id:n,content:r,scope:Ln(t.scope),version:R(t.version)}}).filter(e=>e!=null):[]}function kn(e){return Array.isArray(e)?e.map(e=>{if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e,n=R(t.id),r=R(t.content)||R(t.skillMarkdown);return!n||!r?null:{id:n,content:r,scope:Ln(t.scope),version:R(t.version),name:R(t.name),description:R(t.description)}}).filter(e=>e!=null):[]}function An(e,t){let r=n(),i=[Tn,`# LarkPal Runtime Instructions`,``,`The following instructions were injected by LarkPal for this agent session. Treat them as runtime context, not as user message content.`,``,...t.flatMap(e=>[`## ${e.id}`,``,e.content.trim(),``]),En,``].join(`
18
+ `),a=r===`codex-app-server`?jn(f(e,`AGENTS.md`),i.replace(Tn,`<!-- LARKPAL_RUNTIME_INSTRUCTIONS_START -->`).replace(En,`<!-- LARKPAL_RUNTIME_INSTRUCTIONS_END -->`)):jn(f(e,`CLAUDE.md`),i);return t.map(e=>({id:e.id,scope:e.scope??`request`,hash:Fn(e.content),version:e.version,path:a}))}function jn(e,t){let n=Pn(i(e)?o(e,`utf-8`):``,t);return a(u(e),{recursive:!0}),s(e,n,`utf-8`),e.endsWith(`AGENTS.md`)?`AGENTS.md`:`CLAUDE.md`}function Mn(e,t){let n=`.claude/skills/${In(t.id)}/SKILL.md`,r=f(e,n),i=Nn(t);return a(u(r),{recursive:!0}),s(r,i,`utf-8`),{id:t.id,scope:t.scope??`request`,hash:Fn(i),version:t.version,path:n}}function Nn(e){let t=e.content.trim();if(t.startsWith(`---`))return`${t}\n`;let n=e.name||e.id,r=e.description||`Runtime skill injected by LarkPal: ${e.id}`;return[`---`,`name: ${Rn(n)}`,`description: ${Rn(r)}`,`---`,``,t,``].join(`
19
19
  `)}function Pn(e,t){let n=e.indexOf(Tn),r=e.indexOf(En);if(n!==-1&&r!==-1&&r>n){let i=e.slice(0,n).trimEnd(),a=e.slice(r+41).trimStart();return[i,t.trimEnd(),a].filter(Boolean).join(`
20
20
 
21
21
  `)+`