shennian 0.2.109 → 0.2.111

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.
Files changed (33) hide show
  1. package/dist/publish-build-manifest.json +35 -40
  2. package/dist/src/channels/runtime.d.ts +1 -0
  3. package/dist/src/channels/runtime.js +2 -2
  4. package/dist/src/channels/wechat-channel/automation-lane.d.ts +12 -0
  5. package/dist/src/channels/wechat-channel/automation-lane.js +2 -1
  6. package/dist/src/channels/wechat-channel/client.d.ts +16 -0
  7. package/dist/src/channels/wechat-channel/helper-client.js +3 -3
  8. package/dist/src/channels/wechat-channel/helper-protocol.d.ts +1 -1
  9. package/dist/src/channels/wechat-channel/observer.d.ts +9 -1
  10. package/dist/src/channels/wechat-channel/observer.js +7 -6
  11. package/dist/src/channels/wechat-channel/outbound-ledger.js +2 -2
  12. package/dist/src/channels/wechat-channel/outbound-sender.d.ts +8 -0
  13. package/dist/src/channels/wechat-channel/outbound-sender.js +1 -1
  14. package/dist/src/channels/wechat-channel/runner.js +1 -1
  15. package/dist/src/channels/wechat-rpa.js +1 -1
  16. package/dist/src/commands/runtime.d.ts +1 -0
  17. package/dist/src/commands/runtime.js +1 -1
  18. package/dist/src/commands/wechat/command.d.ts +1 -0
  19. package/dist/src/commands/wechat/command.js +1 -1
  20. package/dist/src/commands/wechat.d.ts +1 -1
  21. package/dist/src/commands/wechat.js +1 -1
  22. package/dist/src/devtools/wechat-channel-action-smoke.d.ts +3 -1
  23. package/dist/src/devtools/wechat-channel-action-smoke.js +9 -9
  24. package/dist/src/index.js +2 -2
  25. package/dist/src/native-fusion/service.d.ts +0 -10
  26. package/dist/src/native-fusion/service.js +2 -2
  27. package/dist/src/session/handlers/chat.js +2 -2
  28. package/dist/src/session/handlers/session-refresh.js +1 -1
  29. package/dist/src/session/manager.d.ts +1 -1
  30. package/dist/src/session/manager.js +1 -1
  31. package/package.json +1 -1
  32. package/dist/src/agents/codex-control.d.ts +0 -35
  33. package/dist/src/agents/codex-control.js +0 -2
@@ -1 +1 @@
1
- import{getRegisteredAgents as r,unregisterAgent as o}from"../agents/adapter.js";import{loadConfig as h}from"../config/index.js";import{handleUpgradeStart as c,handleUpgradeStatus as l}from"../commands/upgrade.js";import{handleAgentsRefresh as u,handleModelsRefresh as d}from"./handlers/agents.js";import{handleAgentConfigClear as m,handleAgentConfigGet as p,handleAgentConfigTest as f,handleAgentConfigUpsert as g}from"./handlers/agent-config.js";import{handleChatAbort as w,handleChatSend as b}from"./handlers/chat.js";import{handleSessionRefresh as k}from"./handlers/session-refresh.js";import{handleSessionToolDetail as S}from"./handlers/tool-detail.js";import{handleSessionTitleSet as v}from"./handlers/title.js";import{cleanupPendingTransfers as R,handleFsLs as A,handleFsRead as T,handleFsRename as y,handleFsWrite as I,handleFsTransfer as P,handleFsTransferAbort as F,handleFsTransferChunk as C,handleFsTransferFinish as M,handleFsTransferStart as Q,handleFsExportMarkdownPdf as x,handleFsArchiveZip as D}from"./handlers/fs.js";import{handleSkillDoctor as W,handleSkillInstall as z,handleSkillList as E,handleSkillSetup as U,handleSkillUse as V}from"./handlers/skills.js";import{handleRegionProbe as O,handleRegionSwitch as L,handleUpgradeSetPolicy as _}from"./handlers/control.js";import{handleWeChatHelperRuntime as $,runHelperRuntimeAction as j}from"./handlers/wechat-helper-runtime.js";import{ManagerRuntimeService as G,setManagerRuntimeService as n}from"../manager/runtime.js";import{ChatQueueManager as H}from"./queue.js";import{createAuthorizedFsRoot as N,resolveAuthorizedPath as X,resolveSessionWorkDir as Z}from"../fs/boundary.js";import"../agents/claude.js";import"../agents/codex.js";import"../agents/gemini.js";import"../agents/cursor.js";import"../agents/opencode.js";import"../agents/pi.js";import"../agents/manager.js";import{registerCustomAgent as B}from"../agents/custom.js";const J=50;import{resolveSessionWorkDir as ye}from"../fs/boundary.js";class Re{client;nativeFusion;cliVersion;sessions=new Map;processedReqIds=new Set;runTextAcc=new Map;pendingTransfers=new Map;managerRuntime;chatQueue;activityProbeTimer=null;wechatRuntimeStatusTimer=null;wechatRuntimeStatusInFlight=!1;constructor(e,t=null,a){this.client=e,this.nativeFusion=t,this.cliVersion=a,this.managerRuntime=new G({getRuntime:()=>this.getRuntime(),dispatchReq:s=>this.handleReq(s)}),this.chatQueue=new H({getRuntime:()=>this.getRuntime(),dispatchReq:s=>this.handleReq(s)}),n(this.managerRuntime),this.managerRuntime.start(),this.reloadCustomAgents(),this.activityProbeTimer=setInterval(()=>{this.publishManagedActivitySnapshots().catch(s=>{console.error("[session.activity] managed probe failed",s)})},15e3),this.activityProbeTimer.unref?.(),this.publishWeChatRuntimeStatus(),this.wechatRuntimeStatusTimer=setInterval(()=>{this.publishWeChatRuntimeStatus()},3e4),this.wechatRuntimeStatusTimer.unref?.()}getRuntime(){return{client:this.client,pendingTransfers:this.pendingTransfers,processedReqIds:this.processedReqIds,reloadCustomAgents:()=>this.reloadCustomAgents(),resolvePath:e=>this.resolvePath(e),resolveAuthorizedPath:(e,t)=>this.resolveAuthorizedPath(e,t),runTextAcc:this.runTextAcc,sessions:this.sessions,evictIdleSessions:()=>this.evictIdleSessions(),nativeFusion:this.nativeFusion,managerRuntime:this.managerRuntime,chatQueue:this.chatQueue,activityPublisher:{publish:(e,t)=>this.publishSessionActivity(e,t)}}}publishSessionActivity(e,t){this.client.sendEvent({type:"event",event:"session.activity",payload:{sessionId:e,activity:t}})}async publishManagedActivitySnapshots(){for(const[e,t]of this.sessions.entries()){if(!t.currentRunId||!t.adapter.getStatus)continue;const a=await t.adapter.getStatus().catch(()=>null);if(!a?.active||!a.runPhase)continue;const s=new Date().toISOString();this.publishSessionActivity(e,{sessionId:e,runId:a.runId||t.currentRunId,runPhase:a.runPhase,startedAt:new Date(t.lastActiveAt).toISOString(),updatedAt:s,canStop:a.canStop??!0});const i=t.heartbeatSeq++;this.client.sendAgentEvent({type:"event",event:"agent",payload:{state:"heartbeat",sessionId:e,runId:a.runId||t.currentRunId,seq:i,runPhase:a.runPhase,canStop:a.canStop??!0},seq:i,id:`agent-status-${a.runId||t.currentRunId}-${Date.now()}`})}}async publishWeChatRuntimeStatus(){if(!this.wechatRuntimeStatusInFlight){this.wechatRuntimeStatusInFlight=!0;try{await j({action:"status"})}catch(e){console.error("[wechat-runtime.status] projection failed",e)}finally{this.wechatRuntimeStatusInFlight=!1}}}reloadCustomAgents(){for(const t of r())t.startsWith("custom:")&&o(t);const e=h();for(const[t,a]of Object.entries(e.customAgents??{}))B(t,a)}async handleReq(e){const t=this.getRuntime();try{switch(e.method){case"chat.send":await b(t,e);break;case"chat.enqueue":await this.chatQueue.handleEnqueue(e);break;case"chat.queue.get":await this.chatQueue.handleGet(e);break;case"chat.queue.edit":await this.chatQueue.handleEdit(e);break;case"chat.queue.delete":await this.chatQueue.handleDelete(e);break;case"chat.abort":await w(t,e);break;case"session.refresh":await k(t,e);break;case"session.tool.detail":await S(t,e);break;case"session.title.set":await v(t,e);break;case"fs.ls":await A(t,e);break;case"fs.read":await T(t,e);break;case"fs.write":await I(t,e);break;case"fs.export.markdown-pdf":await x(t,e);break;case"fs.archive.zip":await D(t,e);break;case"fs.rename":await y(t,e);break;case"skill.list":await E(t,e);break;case"skill.install":await z(t,e);break;case"skill.doctor":await W(t,e);break;case"skill.setup":await U(t,e);break;case"skill.use":await V(t,e);break;case"fs.transfer":await P(t,e);break;case"fs.transfer.start":await Q(t,e);break;case"fs.transfer.chunk":await C(t,e);break;case"fs.transfer.finish":await M(t,e);break;case"fs.transfer.abort":await F(t,e);break;case"region.probe":await O(t,e);break;case"region.switch":await L(t,e);break;case"upgrade.start":await c(this.client,e.id,e.params.version,{currentVersion:this.cliVersion});break;case"upgrade.status":await l(this.client,e.id,{currentVersion:this.cliVersion});break;case"upgrade.set-policy":await _(t,e);break;case"agents.refresh":await u(t,e);break;case"models.refresh":await d(t,e);break;case"agent.config.get":await p(t,e);break;case"agent.config.upsert":await g(t,e);break;case"agent.config.clear":await m(t,e);break;case"agent.config.test":await f(t,e);break;case"manager.channel.get":case"manager.channel.upsert":case"session.wechat-rpa.channel.get":case"session.wechat-rpa.channel.upsert":case"session.wechat-rpa.channel.sync":case"manager.wechat-rpa.channel.get":case"manager.wechat-rpa.channel.upsert":case"manager.wechat-rpa.channel.sync":await t.managerRuntime?.handleAppReq(e);break;case"wechat-rpa.helper.runtime":await $(t,e);break;default:this.client.sendRes({type:"res",id:e.id,ok:!1,error:`Unknown method: ${e.method}`})}}catch(a){this.client.sendRes({type:"res",id:e.id,ok:!1,error:a instanceof Error?a.message:String(a)})}}evictIdleSessions(){if(this.sessions.size<J)return;let e=null;for(const[t,a]of this.sessions)(!e||a.lastActiveAt<e.session.lastActiveAt)&&(e={key:t,session:a});e&&(e.session.heartbeatTimer&&(clearInterval(e.session.heartbeatTimer),e.session.heartbeatTimer=null),e.session.adapter.removeAllListeners(),e.session.adapter.stop().catch(()=>{}),this.sessions.delete(e.key))}resolvePath(e){return Z(e)}resolveAuthorizedPath(e,t){return X(e,N(t))}cleanup(){this.activityProbeTimer&&(clearInterval(this.activityProbeTimer),this.activityProbeTimer=null),this.wechatRuntimeStatusTimer&&(clearInterval(this.wechatRuntimeStatusTimer),this.wechatRuntimeStatusTimer=null);for(const[,e]of this.sessions)e.heartbeatTimer&&(clearInterval(e.heartbeatTimer),e.heartbeatTimer=null),e.adapter.stop().catch(()=>{});this.sessions.clear(),this.runTextAcc.clear(),R(this.getRuntime()),this.managerRuntime.stop(),n(null)}}export{Re as SessionManager,ye as resolveSessionWorkDir};
1
+ import{getRegisteredAgents as r,unregisterAgent as o}from"../agents/adapter.js";import{loadConfig as h}from"../config/index.js";import{handleUpgradeStart as c,handleUpgradeStatus as l}from"../commands/upgrade.js";import{handleAgentsRefresh as u,handleModelsRefresh as d}from"./handlers/agents.js";import{handleAgentConfigClear as m,handleAgentConfigGet as p,handleAgentConfigTest as f,handleAgentConfigUpsert as g}from"./handlers/agent-config.js";import{handleChatAbort as w,handleChatSend as b}from"./handlers/chat.js";import{handleSessionRefresh as k}from"./handlers/session-refresh.js";import{handleSessionToolDetail as S}from"./handlers/tool-detail.js";import{handleSessionTitleSet as v}from"./handlers/title.js";import{cleanupPendingTransfers as R,handleFsLs as A,handleFsRead as y,handleFsRename as T,handleFsWrite as I,handleFsTransfer as P,handleFsTransferAbort as F,handleFsTransferChunk as C,handleFsTransferFinish as M,handleFsTransferStart as Q,handleFsExportMarkdownPdf as x,handleFsArchiveZip as D}from"./handlers/fs.js";import{handleSkillDoctor as W,handleSkillInstall as z,handleSkillList as E,handleSkillSetup as U,handleSkillUse as V}from"./handlers/skills.js";import{handleRegionProbe as O,handleRegionSwitch as L,handleUpgradeSetPolicy as _}from"./handlers/control.js";import{handleWeChatHelperRuntime as $,runHelperRuntimeAction as j}from"./handlers/wechat-helper-runtime.js";import{ManagerRuntimeService as G,setManagerRuntimeService as n}from"../manager/runtime.js";import{ChatQueueManager as H}from"./queue.js";import{createAuthorizedFsRoot as N,resolveAuthorizedPath as X,resolveSessionWorkDir as Z}from"../fs/boundary.js";import"../agents/claude.js";import"../agents/codex.js";import"../agents/gemini.js";import"../agents/cursor.js";import"../agents/opencode.js";import"../agents/pi.js";import"../agents/manager.js";import{registerCustomAgent as B}from"../agents/custom.js";const J=50;import{resolveSessionWorkDir as Te}from"../fs/boundary.js";class Re{client;nativeFusion;cliVersion;sessions=new Map;processedReqIds=new Set;runTextAcc=new Map;pendingTransfers=new Map;managerRuntime;chatQueue;activityProbeTimer=null;wechatRuntimeStatusTimer=null;wechatRuntimeStatusInFlight=!1;constructor(e,t=null,a){this.client=e,this.nativeFusion=t,this.cliVersion=a,this.managerRuntime=new G({getRuntime:()=>this.getRuntime(),dispatchReq:s=>this.handleReq(s)}),this.chatQueue=new H({getRuntime:()=>this.getRuntime(),dispatchReq:s=>this.handleReq(s)}),n(this.managerRuntime),this.managerRuntime.start(),this.reloadCustomAgents(),this.activityProbeTimer=setInterval(()=>{this.publishManagedActivitySnapshots().catch(s=>{console.error("[session.activity] managed probe failed",s)})},15e3),this.activityProbeTimer.unref?.(),this.publishWeChatRuntimeStatus(),this.wechatRuntimeStatusTimer=setInterval(()=>{this.publishWeChatRuntimeStatus()},3e4),this.wechatRuntimeStatusTimer.unref?.()}getRuntime(){return{client:this.client,pendingTransfers:this.pendingTransfers,processedReqIds:this.processedReqIds,reloadCustomAgents:()=>this.reloadCustomAgents(),resolvePath:e=>this.resolvePath(e),resolveAuthorizedPath:(e,t)=>this.resolveAuthorizedPath(e,t),runTextAcc:this.runTextAcc,sessions:this.sessions,evictIdleSessions:()=>this.evictIdleSessions(),nativeFusion:this.nativeFusion,managerRuntime:this.managerRuntime,chatQueue:this.chatQueue,activityPublisher:{publish:(e,t)=>this.publishSessionActivity(e,t)}}}publishSessionActivity(e,t){this.client.sendEvent({type:"event",event:"session.activity",payload:{sessionId:e,activity:t}})}async publishManagedActivitySnapshots(){for(const[e,t]of this.sessions.entries()){if(!t.currentRunId||!t.adapter.getStatus)continue;const a=await t.adapter.getStatus().catch(()=>null);if(!a?.active||!a.runPhase)continue;const s=new Date().toISOString();this.publishSessionActivity(e,{sessionId:e,runId:a.runId||t.currentRunId,runPhase:a.runPhase,startedAt:new Date(t.lastActiveAt).toISOString(),updatedAt:s,canStop:a.canStop??!0});const i=t.heartbeatSeq++;this.client.sendAgentEvent({type:"event",event:"agent",payload:{state:"heartbeat",sessionId:e,runId:a.runId||t.currentRunId,seq:i,runPhase:a.runPhase,canStop:a.canStop??!0},seq:i,id:`agent-status-${a.runId||t.currentRunId}-${Date.now()}`})}}async publishWeChatRuntimeStatus(){if(!this.wechatRuntimeStatusInFlight){this.wechatRuntimeStatusInFlight=!0;try{await j({action:"status"})}catch(e){console.error("[wechat-runtime.status] projection failed",e)}finally{this.wechatRuntimeStatusInFlight=!1}}}reloadCustomAgents(){for(const t of r())t.startsWith("custom:")&&o(t);const e=h();for(const[t,a]of Object.entries(e.customAgents??{}))B(t,a)}async handleReq(e){const t=this.getRuntime();try{switch(e.method){case"chat.send":await b(t,e);break;case"chat.enqueue":await this.chatQueue.handleEnqueue(e);break;case"chat.queue.get":await this.chatQueue.handleGet(e);break;case"chat.queue.edit":await this.chatQueue.handleEdit(e);break;case"chat.queue.delete":await this.chatQueue.handleDelete(e);break;case"chat.abort":await w(t,e);break;case"session.refresh":await k(t,e);break;case"session.tool.detail":await S(t,e);break;case"session.title.set":await v(t,e);break;case"fs.ls":await A(t,e);break;case"fs.read":await y(t,e);break;case"fs.write":await I(t,e);break;case"fs.export.markdown-pdf":await x(t,e);break;case"fs.archive.zip":await D(t,e);break;case"fs.rename":await T(t,e);break;case"skill.list":await E(t,e);break;case"skill.install":await z(t,e);break;case"skill.doctor":await W(t,e);break;case"skill.setup":await U(t,e);break;case"skill.use":await V(t,e);break;case"fs.transfer":await P(t,e);break;case"fs.transfer.start":await Q(t,e);break;case"fs.transfer.chunk":await C(t,e);break;case"fs.transfer.finish":await M(t,e);break;case"fs.transfer.abort":await F(t,e);break;case"region.probe":await O(t,e);break;case"region.switch":await L(t,e);break;case"upgrade.start":await c(this.client,e.id,e.params.version,{currentVersion:this.cliVersion});break;case"upgrade.status":await l(this.client,e.id,{currentVersion:this.cliVersion});break;case"upgrade.set-policy":await _(t,e);break;case"agents.refresh":await u(t,e);break;case"models.refresh":await d(t,e);break;case"agent.config.get":await p(t,e);break;case"agent.config.upsert":await g(t,e);break;case"agent.config.clear":await m(t,e);break;case"agent.config.test":await f(t,e);break;case"manager.channel.get":case"manager.channel.upsert":case"session.wechat-rpa.channel.get":case"session.wechat-rpa.channel.upsert":case"session.wechat-rpa.channel.sync":case"manager.wechat-rpa.channel.get":case"manager.wechat-rpa.channel.upsert":case"manager.wechat-rpa.channel.sync":await t.managerRuntime?.handleAppReq(e);break;case"wechat-rpa.helper.runtime":await $(t,e);break;default:this.client.sendRes({type:"res",id:e.id,ok:!1,error:`Unknown method: ${e.method}`})}}catch(a){this.client.sendRes({type:"res",id:e.id,ok:!1,error:a instanceof Error?a.message:String(a)})}}evictIdleSessions(){if(this.sessions.size<J)return;let e=null;for(const[t,a]of this.sessions)(!e||a.lastActiveAt<e.session.lastActiveAt)&&(e={key:t,session:a});e&&(e.session.heartbeatTimer&&(clearInterval(e.session.heartbeatTimer),e.session.heartbeatTimer=null),e.session.adapter.removeAllListeners(),e.session.adapter.stop().catch(()=>{}),this.sessions.delete(e.key))}resolvePath(e){return Z(e)}resolveAuthorizedPath(e,t){return X(e,N(t))}async cleanup(){this.activityProbeTimer&&(clearInterval(this.activityProbeTimer),this.activityProbeTimer=null),this.wechatRuntimeStatusTimer&&(clearInterval(this.wechatRuntimeStatusTimer),this.wechatRuntimeStatusTimer=null);for(const[,e]of this.sessions)e.heartbeatTimer&&(clearInterval(e.heartbeatTimer),e.heartbeatTimer=null),await e.adapter.stop().catch(()=>{});this.sessions.clear(),this.runTextAcc.clear(),R(this.getRuntime()),await this.managerRuntime.stop(),n(null)}}export{Re as SessionManager,Te as resolveSessionWorkDir};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shennian",
3
- "version": "0.2.109",
3
+ "version": "0.2.111",
4
4
  "description": "Shennian — AI Agent Control Plane CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,35 +0,0 @@
1
- import type { SessionRunPhase } from '@shennian/wire';
2
- export type CodexThreadActivity = {
3
- active: boolean;
4
- turnId: string | null;
5
- runPhase: SessionRunPhase | null;
6
- canStop: boolean;
7
- };
8
- export declare class CodexAppServerProxyClient {
9
- private readonly opts;
10
- private process;
11
- private rpcSeq;
12
- private pendingRequests;
13
- private stderr;
14
- private initialized;
15
- constructor(opts?: {
16
- workDir?: string;
17
- timeoutMs?: number;
18
- });
19
- start(): Promise<void>;
20
- initialize(): Promise<void>;
21
- readThreadActivity(threadId: string): Promise<CodexThreadActivity>;
22
- interruptThread(threadId: string): Promise<CodexThreadActivity>;
23
- close(): Promise<void>;
24
- private sendRpc;
25
- private handleMessage;
26
- private rejectAllPending;
27
- }
28
- export declare function probeCodexThreadActivity(params: {
29
- threadId: string;
30
- workDir?: string;
31
- }): Promise<CodexThreadActivity | null>;
32
- export declare function interruptCodexThread(params: {
33
- threadId: string;
34
- workDir?: string;
35
- }): Promise<CodexThreadActivity | null>;
@@ -1,2 +0,0 @@
1
- import{createInterface as l}from"node:readline";import{resolveBuiltinCommand as h,spawnAgentCommand as f}from"./command-spec.js";import{buildAgentProcessEnv as w}from"../agent-env.js";import{CODEX_APP_SERVER_CLIENT_INFO as y}from"./codex-utils.js";function g(i){const e=i?.type==="active"&&Array.isArray(i.activeFlags)?i.activeFlags:[];return e.includes("waitingOnApproval")?"waiting_approval":e.includes("waitingOnUserInput")?"waiting_user_input":"thinking"}function m(i){if(!Array.isArray(i))return null;for(let e=i.length-1;e>=0;e--){const t=i[e];if(!t||typeof t!="object")continue;const n=t;if(n.status==="inProgress")return typeof n.id=="string"?n.id:null}return null}class d{opts;process=null;rpcSeq=1;pendingRequests=new Map;stderr="";initialized=!1;constructor(e={}){this.opts=e}async start(){if(this.process)return;const e=h("codex");if(!e)throw new Error('Command "codex" not found. Is OpenAI Codex CLI installed?');const t=f(e,["app-server","proxy"],{cwd:this.opts.workDir||void 0,stdio:["pipe","pipe","pipe"],env:w({NO_COLOR:"1"})});this.process=t,this.stderr="",l({input:t.stdout}).on("line",r=>{if(!r.trim())return;let s;try{s=JSON.parse(r)}catch{return}this.handleMessage(s)}),t.stderr?.on("data",r=>{this.stderr+=r.toString()}),t.on("close",r=>{this.process===t&&(this.process=null,this.rejectAllPending(new Error(this.stderr.trim()||`codex app-server proxy exited with code ${r}`)))}),t.on("error",r=>{this.process===t&&(this.process=null,this.rejectAllPending(r))})}async initialize(){this.initialized||(await this.start(),await this.sendRpc("initialize",{clientInfo:y,capabilities:{experimentalApi:!0}}),this.initialized=!0)}async readThreadActivity(e){await this.initialize();const t=await this.sendRpc("thread/read",{threadId:e,includeTurns:!0}),n=t.thread?.status??null,r=n?.type==="active",s=m(t.thread?.turns);return{active:r,turnId:s,runPhase:r?g(n):null,canStop:!!(r&&s)}}async interruptThread(e){const t=await this.readThreadActivity(e);return t.turnId?(await this.sendRpc("turn/interrupt",{threadId:e,turnId:t.turnId},5e3),{active:!1,turnId:t.turnId,runPhase:null,canStop:!1}):t}async close(){const e=this.process;this.process=null,e&&(e.kill("SIGTERM"),await new Promise(t=>{e.on("close",t),setTimeout(()=>{e.kill("SIGKILL"),t()},1e3).unref?.()}),this.rejectAllPending(new Error("codex app-server proxy stopped")))}sendRpc(e,t,n=this.opts.timeoutMs??8e3){const r=this.process;if(!r?.stdin)return Promise.reject(new Error("codex app-server proxy is not running"));const s=this.rpcSeq++,u=JSON.stringify({id:s,method:e,params:t});return new Promise((p,o)=>{const a=setTimeout(()=>{this.pendingRequests.delete(s),o(new Error(`codex app-server proxy request timed out: ${e}`))},n);this.pendingRequests.set(s,{resolve:p,reject:o,timer:a}),r.stdin.write(`${u}
2
- `,c=>{c&&(clearTimeout(a),this.pendingRequests.delete(s),o(c))})})}handleMessage(e){if(e.id==null)return;const t=this.pendingRequests.get(e.id);t&&(clearTimeout(t.timer),this.pendingRequests.delete(e.id),e.error?t.reject(new Error(e.error.message||`codex app-server proxy error ${e.error.code??""}`.trim())):t.resolve(e.result))}rejectAllPending(e){for(const[t,n]of this.pendingRequests.entries())clearTimeout(n.timer),n.reject(e),this.pendingRequests.delete(t)}}async function T(i){const e=new d({workDir:i.workDir,timeoutMs:5e3});try{return await e.readThreadActivity(i.threadId)}catch{return null}finally{await e.close().catch(()=>{})}}async function R(i){const e=new d({workDir:i.workDir,timeoutMs:8e3});try{return await e.interruptThread(i.threadId)}finally{await e.close().catch(()=>{})}}export{d as CodexAppServerProxyClient,R as interruptCodexThread,T as probeCodexThreadActivity};