@code-yeongyu/senpi 2026.11.3-1 → 2026.11.3-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/bundle/chunks/anthropic-messages-LJAKRKMX.js +11 -0
  3. package/dist/bundle/chunks/{args-O3WS4WCO.js → args-GQTXDYS3.js} +1 -1
  4. package/dist/bundle/chunks/{azure-openai-responses-YLBBQXI7.js → azure-openai-responses-HDEKTPMZ.js} +1 -1
  5. package/dist/bundle/chunks/chatgpt-subscription.js +10 -2
  6. package/dist/bundle/chunks/{chunk-ED7VJGL4.js → chunk-2PGSRQBF.js} +1 -1
  7. package/dist/bundle/chunks/{chunk-4BF4FLT6.js → chunk-3LDASCJN.js} +1 -1
  8. package/dist/bundle/chunks/{chunk-PIAY636U.js → chunk-3QPE75AR.js} +1 -1
  9. package/dist/bundle/chunks/{chunk-FQZZGSYH.js → chunk-4ZGQUOBV.js} +1 -1
  10. package/dist/bundle/chunks/{chunk-S2M5D5GS.js → chunk-5BMIET5O.js} +2 -2
  11. package/dist/bundle/chunks/{chunk-XLLQJALL.js → chunk-67M7HKXO.js} +1 -1
  12. package/dist/bundle/chunks/chunk-6ISOXWH2.js +2 -0
  13. package/dist/bundle/chunks/{chunk-7KLEFHSU.js → chunk-6NPK2O3C.js} +2 -2
  14. package/dist/bundle/chunks/{chunk-BNIZP4OS.js → chunk-7C4W5HMU.js} +1 -1
  15. package/dist/bundle/chunks/chunk-7KIHKE2T.js +2 -0
  16. package/dist/bundle/chunks/{chunk-WCRNJYHO.js → chunk-A4KOQUHT.js} +1 -1
  17. package/dist/bundle/chunks/{chunk-TOOB6OLG.js → chunk-A5PZGQCP.js} +1 -1
  18. package/dist/bundle/chunks/{chunk-TBARMJ75.js → chunk-AVP6DDBF.js} +1 -1
  19. package/dist/bundle/chunks/{chunk-FLM6GZPT.js → chunk-B3GTID4P.js} +1 -1
  20. package/dist/bundle/chunks/{chunk-2XBKE2BZ.js → chunk-BIWFWGUA.js} +1 -1
  21. package/dist/bundle/chunks/{chunk-6LDUM5CL.js → chunk-DCI4QOUX.js} +1 -1
  22. package/dist/bundle/chunks/{chunk-2YFPDNNP.js → chunk-DNZKKG4V.js} +1 -1
  23. package/dist/bundle/chunks/{chunk-W2V7RIBF.js → chunk-E7SA75PP.js} +1 -1
  24. package/dist/bundle/chunks/{chunk-YWD54RHU.js → chunk-EBZ6IP4V.js} +1 -1
  25. package/dist/bundle/chunks/{chunk-J2OBN7TI.js → chunk-G5XUGK4B.js} +1 -1
  26. package/dist/bundle/chunks/{chunk-PX7FF5LE.js → chunk-GKP34H3C.js} +2 -2
  27. package/dist/bundle/chunks/{chunk-PP52OWBB.js → chunk-GLTOBXZY.js} +1 -1
  28. package/dist/bundle/chunks/{chunk-ZNLCKKF6.js → chunk-IJGXAACA.js} +117 -35
  29. package/dist/bundle/chunks/{chunk-LGO25HPL.js → chunk-JCTODLUP.js} +1 -1
  30. package/dist/bundle/chunks/{chunk-3ESZE3DG.js → chunk-KHBCZ6TR.js} +1 -1
  31. package/dist/bundle/chunks/chunk-KJR3XXMI.js +2 -0
  32. package/dist/bundle/chunks/{chunk-FJ2UCBOA.js → chunk-KY4V3TSO.js} +2 -2
  33. package/dist/bundle/chunks/{chunk-4SENPCEA.js → chunk-MCXOJHN2.js} +1 -1
  34. package/dist/bundle/chunks/{chunk-DPBPO5OU.js → chunk-NKI7L5UM.js} +3 -3
  35. package/dist/bundle/chunks/{chunk-CJWSQ6CK.js → chunk-OD7RT7G7.js} +1 -1
  36. package/dist/bundle/chunks/{chunk-F4OHTL2K.js → chunk-OOU3BRUY.js} +1 -1
  37. package/dist/bundle/chunks/{chunk-LPHUMR6R.js → chunk-OT6ALXSJ.js} +1 -1
  38. package/dist/bundle/chunks/{chunk-XGBRBCIQ.js → chunk-Q5CKFBQT.js} +1 -1
  39. package/dist/bundle/chunks/{chunk-F7GBSQRV.js → chunk-QPYDQ4QK.js} +1 -1
  40. package/dist/bundle/chunks/{chunk-MOOFLKLI.js → chunk-QSMT5KVJ.js} +1 -1
  41. package/dist/bundle/chunks/{chunk-SAZ6E74O.js → chunk-RUOTFZQR.js} +1 -1
  42. package/dist/bundle/chunks/{chunk-5DZD623T.js → chunk-RWF6IJQL.js} +2 -2
  43. package/dist/bundle/chunks/{chunk-HBCNDC53.js → chunk-S5Y7NEHB.js} +1 -1
  44. package/dist/bundle/chunks/{chunk-DAPBNRN5.js → chunk-SCBTASM4.js} +1 -1
  45. package/dist/bundle/chunks/chunk-SJWTZ3Z2.js +2 -0
  46. package/dist/bundle/chunks/{chunk-ISZ4EWIS.js → chunk-SODMQEHO.js} +1 -1
  47. package/dist/bundle/chunks/{chunk-WEGTCUO3.js → chunk-SQAQEITV.js} +1 -1
  48. package/dist/bundle/chunks/{chunk-UFVZTQKN.js → chunk-TQQG5L4D.js} +1 -1
  49. package/dist/bundle/chunks/{chunk-VPDQ6MOL.js → chunk-U6A4X3FV.js} +1 -1
  50. package/dist/bundle/chunks/{chunk-ACIFXWJ6.js → chunk-UHUM55TR.js} +1 -1
  51. package/dist/bundle/chunks/{chunk-L5OFGHDA.js → chunk-USKWGPA6.js} +1 -1
  52. package/dist/bundle/chunks/{chunk-7ORS33CE.js → chunk-VDDJADPV.js} +1 -1
  53. package/dist/bundle/chunks/{chunk-R65P6LAT.js → chunk-VIHXG53S.js} +1 -1
  54. package/dist/bundle/chunks/{chunk-SGS76663.js → chunk-VPVD5G32.js} +1 -1
  55. package/dist/bundle/chunks/chunk-WO6I5PRF.js +3 -0
  56. package/dist/bundle/chunks/{chunk-ETCYVVVO.js → chunk-WVEIJ437.js} +1 -1
  57. package/dist/bundle/chunks/{chunk-7565XQAU.js → chunk-XKFG4N3Z.js} +1 -1
  58. package/dist/bundle/chunks/{chunk-57MRFI6E.js → chunk-XMWPCJU6.js} +1 -1
  59. package/dist/bundle/chunks/{chunk-GDPWQJDQ.js → chunk-XPSXUKSD.js} +1 -1
  60. package/dist/bundle/chunks/{chunk-FNBEICAA.js → chunk-YI6KRJDC.js} +1 -1
  61. package/dist/bundle/chunks/{chunk-UURGXV5B.js → chunk-YP47G4YP.js} +1 -1
  62. package/dist/bundle/chunks/{chunk-6BSMXZKQ.js → chunk-YRYDCKUI.js} +1 -1
  63. package/dist/bundle/chunks/{chunk-QTQ3ES2S.js → chunk-YTKZSGMQ.js} +1 -1
  64. package/dist/bundle/chunks/{chunk-V36CXIIB.js → chunk-YXL3PNTL.js} +1 -1
  65. package/dist/bundle/chunks/chunk-Z7HTHT6K.js +2 -0
  66. package/dist/bundle/chunks/{chunk-27XEDYQA.js → chunk-ZTPG27EJ.js} +1 -1
  67. package/dist/bundle/chunks/{cli-main-XM5FWY3Z.js → cli-main-RN7YB427.js} +1 -1
  68. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-FC7QLRU2.js → cloudflare-workers-ai-system-one-N5KFNKK4.js} +1 -1
  69. package/dist/bundle/chunks/credential-accounts-BJX55MTT.js +2 -0
  70. package/dist/bundle/chunks/devin.js +10 -2
  71. package/dist/bundle/chunks/{dispatch-UY6LBJJE.js → dispatch-M7UAPGVY.js} +1 -1
  72. package/dist/bundle/chunks/{google-generative-ai-7PQ4QRHJ.js → google-generative-ai-2TZSCSIS.js} +1 -1
  73. package/dist/bundle/chunks/{google-vertex-DY7EO4EJ.js → google-vertex-7NJJOI7V.js} +1 -1
  74. package/dist/bundle/chunks/{health-write-45CX64T2.js → health-write-YUSPVH7U.js} +1 -1
  75. package/dist/bundle/chunks/{help-fast-path-3EDGRKQM.js → help-fast-path-DWCA77QP.js} +1 -1
  76. package/dist/bundle/chunks/host-command-KJXUTSQ7.js +2 -0
  77. package/dist/bundle/chunks/{host-lifecycle-TGG7KGQH.js → host-lifecycle-QHIJ4G2K.js} +1 -1
  78. package/dist/bundle/chunks/host-lifecycle.js +1 -1
  79. package/dist/bundle/chunks/{host-session-command-OJFARE5Q.js → host-session-command-IPH3WXSG.js} +1 -1
  80. package/dist/bundle/chunks/{host-socket-request-F2R5P34M.js → host-socket-request-XPXJV3CS.js} +1 -1
  81. package/dist/bundle/chunks/interactive-mode-XUXMDYLA.js +2 -0
  82. package/dist/bundle/chunks/{list-tips-3D3A6GFK.js → list-tips-XJY7EL5S.js} +1 -1
  83. package/dist/bundle/chunks/{login-health-YOPTYRTU.js → login-health-226NO44U.js} +1 -1
  84. package/dist/bundle/chunks/main-P7PKMJUG.js +2 -0
  85. package/dist/bundle/chunks/{mistral-conversations-6F2RAIB2.js → mistral-conversations-QMHMHSUF.js} +1 -1
  86. package/dist/bundle/chunks/{multi-session-host-N2RQ7JSZ.js → multi-session-host-ZQY4AN46.js} +1 -1
  87. package/dist/bundle/chunks/{native-loader-NMDTMHMA.js → native-loader-A6DNMGCK.js} +1 -1
  88. package/dist/bundle/chunks/openai-chatgpt.js +11 -3
  89. package/dist/bundle/chunks/{openai-codex-responses-YTWLG4OL.js → openai-codex-responses-GUAHKQE2.js} +1 -1
  90. package/dist/bundle/chunks/{openai-completions-TIFDYHZL.js → openai-completions-UPRTFM54.js} +1 -1
  91. package/dist/bundle/chunks/{openai-images-OAEMY4RG.js → openai-images-IKWNS6VB.js} +1 -1
  92. package/dist/bundle/chunks/{openai-responses-L35NIG5Y.js → openai-responses-AXN5NUHH.js} +1 -1
  93. package/dist/bundle/chunks/openrouter.js +10 -2
  94. package/dist/bundle/chunks/{package-manager-cli-JPNA27E5.js → package-manager-cli-PP7L2Q5M.js} +1 -1
  95. package/dist/bundle/chunks/radius.js +10 -2
  96. package/dist/bundle/chunks/{rg-engine-JDUYBM6L.js → rg-engine-VRSXT6HG.js} +1 -1
  97. package/dist/bundle/chunks/{role-45Y7PQFC.js → role-L5J7ZPCF.js} +1 -1
  98. package/dist/bundle/chunks/rotation-stream-6INZXQFC.js +2 -0
  99. package/dist/bundle/chunks/rpc-mode-W4UATRAT.js +2 -0
  100. package/dist/bundle/chunks/{rpc-monitor-source-5TUR27NY.js → rpc-monitor-source-RMMUPBMS.js} +1 -1
  101. package/dist/bundle/chunks/{run-attached-tui-TI6MELEI.js → run-attached-tui-RLXFGCEP.js} +1 -1
  102. package/dist/bundle/chunks/{schedule-command-OZ5ESMIT.js → schedule-command-ZNFEJNTT.js} +1 -1
  103. package/dist/bundle/chunks/{session-control-endpoint-5YKBYJOO.js → session-control-endpoint-TWTONJWF.js} +1 -1
  104. package/dist/bundle/chunks/{session-picker-CMRV72VA.js → session-picker-KRUVCHOV.js} +1 -1
  105. package/dist/bundle/chunks/session-slot-NJOZCOHQ.js +2 -0
  106. package/dist/bundle/chunks/session-worker.js +218 -135
  107. package/dist/bundle/chunks/{state-store-Q47AYMRI.js → state-store-ZAFZ4JOM.js} +1 -1
  108. package/dist/bundle/chunks/{typesafe-system-one-5JYDJK6S.js → typesafe-system-one-CICIRAYN.js} +1 -1
  109. package/dist/bundle/cli.js +2 -2
  110. package/dist/bundle/host-supervisor.js +1 -1
  111. package/dist/bundle/index.js +1 -1
  112. package/dist/bundle/rpc-entry.js +1 -1
  113. package/dist/bundle/runtime-manifest.json +1 -1
  114. package/dist/core/agent-session.js +5 -3
  115. package/dist/core/auth-storage.d.ts +19 -0
  116. package/dist/core/auth-storage.js +99 -24
  117. package/dist/core/auth-store-load-error.d.ts +29 -0
  118. package/dist/core/auth-store-load-error.js +74 -0
  119. package/dist/core/brand.d.ts +2 -0
  120. package/dist/core/brand.js +1 -0
  121. package/dist/core/credential-pool/failover.d.ts +8 -0
  122. package/dist/core/credential-pool/failover.js +18 -5
  123. package/dist/core/credential-pool/rotation-stream.d.ts +1 -1
  124. package/dist/core/credential-pool/rotation-stream.js +2 -7
  125. package/dist/core/credential-pool/session-slot.d.ts +20 -0
  126. package/dist/core/credential-pool/session-slot.js +26 -0
  127. package/dist/core/credential-recovery-revision.d.ts +10 -0
  128. package/dist/core/credential-recovery-revision.js +19 -0
  129. package/dist/core/execution/executor-body.d.ts +22 -0
  130. package/dist/core/execution/executor-body.js +73 -0
  131. package/dist/core/execution/executor-freeze.d.ts +17 -0
  132. package/dist/core/execution/executor-freeze.js +53 -0
  133. package/dist/core/execution/executor-pipeline.d.ts +9 -0
  134. package/dist/core/execution/executor-pipeline.js +25 -0
  135. package/dist/core/execution/executor-types.d.ts +82 -0
  136. package/dist/core/execution/executor-types.js +2 -0
  137. package/dist/core/execution/executor.d.ts +8 -0
  138. package/dist/core/execution/executor.js +216 -0
  139. package/dist/core/extensions/builtin/anthropic-subscription/account-block-log.d.ts +15 -0
  140. package/dist/core/extensions/builtin/anthropic-subscription/account-block-log.js +18 -0
  141. package/dist/core/extensions/builtin/anthropic-subscription/affinity.d.ts +9 -1
  142. package/dist/core/extensions/builtin/anthropic-subscription/affinity.js +15 -4
  143. package/dist/core/extensions/builtin/anthropic-subscription/failover.d.ts +7 -1
  144. package/dist/core/extensions/builtin/anthropic-subscription/failover.js +19 -2
  145. package/dist/core/extensions/builtin/anthropic-subscription/guidance.d.ts +8 -2
  146. package/dist/core/extensions/builtin/anthropic-subscription/guidance.js +25 -1
  147. package/dist/core/extensions/builtin/anthropic-subscription/provider-diagnostic.d.ts +9 -0
  148. package/dist/core/extensions/builtin/anthropic-subscription/provider-diagnostic.js +59 -0
  149. package/dist/core/extensions/builtin/anthropic-subscription/session-registry-wiring.js +7 -0
  150. package/dist/core/extensions/builtin/anthropic-subscription/stream-guidance.js +5 -3
  151. package/dist/core/extensions/builtin/anthropic-subscription/stream.js +4 -0
  152. package/dist/core/extensions/builtin/btw/index.js +3 -1
  153. package/dist/core/extensions/builtin/cache-keepalive/index.js +3 -1
  154. package/dist/core/extensions/builtin/compaction/index.js +1 -1
  155. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +3 -1
  156. package/dist/core/extensions/builtin/compaction/openai-remote.js +1 -1
  157. package/dist/core/extensions/builtin/compaction/speculative.js +3 -2
  158. package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js +3 -1
  159. package/dist/core/extensions/builtin/cursor-cli-oauth/native-bootstrap.js +3 -1
  160. package/dist/core/extensions/builtin/look-at/runner.js +3 -1
  161. package/dist/core/extensions/builtin/mcp/auth/callback.js +3 -4
  162. package/dist/core/extensions/builtin/mcp/auth/oauth-provider.js +2 -1
  163. package/dist/core/model-registry.d.ts +10 -2
  164. package/dist/core/model-registry.js +12 -4
  165. package/dist/core/model-runtime.d.ts +8 -0
  166. package/dist/core/model-runtime.js +38 -0
  167. package/dist/core/retry-fallback/controller-types.d.ts +7 -0
  168. package/dist/core/retry-fallback/controller.d.ts +2 -0
  169. package/dist/core/retry-fallback/controller.js +13 -4
  170. package/dist/core/retry-fallback/credential-recovery.d.ts +18 -0
  171. package/dist/core/retry-fallback/credential-recovery.js +32 -0
  172. package/dist/core/retry-fallback/settings.d.ts +8 -1
  173. package/dist/core/retry-fallback/settings.js +12 -6
  174. package/dist/core/session-log.js +1 -1
  175. package/dist/core/settings-manager.js +4 -1
  176. package/dist/modes/rpc/connection-handler.js +3 -1
  177. package/dist/modes/rpc/effect-commands.d.ts +1 -0
  178. package/dist/modes/rpc/loopless-execute-grant.d.ts +20 -0
  179. package/dist/modes/rpc/loopless-execute-grant.js +26 -0
  180. package/dist/modes/rpc/loopless-runtime-settings.d.ts +30 -0
  181. package/dist/modes/rpc/loopless-runtime-settings.js +69 -0
  182. package/dist/modes/rpc/loopless-tool-call.d.ts +12 -0
  183. package/dist/modes/rpc/loopless-tool-call.js +22 -0
  184. package/dist/modes/rpc/rpc-read-response-types.d.ts +2 -1
  185. package/dist/modes/rpc/rpc-session-state-types.d.ts +10 -0
  186. package/dist/modes/rpc/rpc-types.d.ts +1 -1
  187. package/dist/modes/rpc/runtime-factory-loopless.d.ts +57 -0
  188. package/dist/modes/rpc/runtime-factory-loopless.js +131 -0
  189. package/docs/development.md +1 -1
  190. package/docs/rpc.md +2 -0
  191. package/package.json +6 -6
  192. package/dist/bundle/chunks/anthropic-messages-AFWQB3KN.js +0 -10
  193. package/dist/bundle/chunks/chunk-3WJ2DE2G.js +0 -3
  194. package/dist/bundle/chunks/chunk-ESQBKTNG.js +0 -2
  195. package/dist/bundle/chunks/chunk-MOH5HOHX.js +0 -2
  196. package/dist/bundle/chunks/credential-accounts-YZYSKA7X.js +0 -2
  197. package/dist/bundle/chunks/host-command-PZ4VYQIW.js +0 -2
  198. package/dist/bundle/chunks/interactive-mode-7JSJVVIS.js +0 -2
  199. package/dist/bundle/chunks/main-3YGJ2O4I.js +0 -2
  200. package/dist/bundle/chunks/rotation-stream-WXWJKJZN.js +0 -2
  201. package/dist/bundle/chunks/rpc-mode-Z7MN2ZWA.js +0 -2
@@ -1,2 +1,2 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{resolveOpenAIClientAuth}from"./chunk-GFCKDAH5.js";import{OpenAI,toFile}from"./chunk-CD2HJK4C.js";import{awaitProviderTransport,openAICompatibleProviderDiagnosticFromError}from"./chunk-7565XQAU.js";import{retryProviderRequest}from"./chunk-GIT63LXN.js";import{buildParams,isImageParams,parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{formatProviderError,normalizeProviderError}from"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-RFB5CBW7.js";import{readProviderDiagnostic}from"./chunk-MOH5HOHX.js";import"./chunk-WDTJ6JKE.js";import"./chunk-3SASTB6Y.js";import{headersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";function upload(image,name){return toFile(Buffer.from(image.data,"base64"),`${name}.${image.mimeType.split("/")[1]}`,{type:image.mimeType})}async function buildEditParams(params,images,mask){if(images.length>16)throw new Error("OpenAI image edits accept at most 16 reference images");let image=await Promise.all(images.map((reference,i)=>upload(reference,`reference-${i}`)));return mask===void 0?{...params,image}:{...params,image,mask:await upload(mask,"mask")}}var PNG_MAGIC=[137,80,78,71],JPEG_MAGIC=[255,216,255],WEBP_MAGIC=[82,73,70,70,87,69,66,80];function requestedOutputFormat(value){return value==="jpeg"||value==="webp"?value:"png"}async function resolveImage(datum,outputFormat,options){let b64=datum.b64_json?.trim();if(b64)return{type:"image",mimeType:detectMime(Buffer.from(b64.slice(0,24),"base64"))??`image/${outputFormat}`,data:b64};let url=datum.url?.trim();if(!url)throw new Error("OpenAI images response datum contained no image data");return url.startsWith("data:")?parseDataUrl(url):hydrateImageUrl(url,options)}function parseDataUrl(url){let match=/^data:([^;,]+);base64,(.+)$/i.exec(url);if(!match?.[1]||!match[2])throw new Error("OpenAI images response contained an invalid data URL");let mimeType=supportedMime(match[1]);if(!mimeType)throw new Error(`OpenAI images response used unsupported MIME type: ${match[1]}`);return{type:"image",mimeType,data:match[2]}}async function hydrateImageUrl(url,options){let parsed;try{parsed=new URL(url)}catch{throw new Error("OpenAI images response URL must be absolute")}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:")throw new Error("OpenAI images response URL must use HTTP or HTTPS");let response=await(options?.fetch??globalThis.fetch)(url,options?.signal?{signal:options.signal}:{});if(!response.ok)throw new Error(`OpenAI image hydration failed with HTTP ${response.status}`);let declaredLength=response.headers.get("content-length");if(declaredLength&&Number(declaredLength)>25165824)throw oversizedImageError();let bytes=new Uint8Array(await response.arrayBuffer());if(bytes.byteLength===0)throw new Error("OpenAI image hydration returned an empty body");if(bytes.byteLength>25165824)throw oversizedImageError();let declaredMime=supportedMime(response.headers.get("content-type")?.split(";",1)[0]),detectedMime=detectMime(bytes);if(declaredMime&&detectedMime&&declaredMime!==detectedMime)throw new Error(`OpenAI image MIME mismatch: declared ${declaredMime}, detected ${detectedMime}`);let mimeType=detectedMime??declaredMime;if(!mimeType)throw new Error("OpenAI image hydration returned unsupported image content");return{type:"image",mimeType,data:bytesToBase64(bytes)}}function supportedMime(value){let normalized=value?.trim().toLowerCase();if(normalized==="image/png"||normalized==="image/jpeg"||normalized==="image/webp")return normalized}function detectMime(bytes){if(hasMagic(bytes,PNG_MAGIC))return"image/png";if(hasMagic(bytes,JPEG_MAGIC))return"image/jpeg";if(hasMagic(bytes,WEBP_MAGIC.slice(0,4))&&hasMagic(bytes,WEBP_MAGIC.slice(4),8))return"image/webp"}function hasMagic(bytes,magic,offset=0){return magic.every((value,index)=>bytes[offset+index]===value)}function bytesToBase64(bytes){let binary="";for(let offset=0;offset<bytes.length;offset+=32768)binary+=String.fromCharCode(...bytes.subarray(offset,offset+32768));return btoa(binary)}function oversizedImageError(){return new Error("OpenAI image hydration exceeded the 24 MiB limit")}var ENDPOINT_SUFFIXES=["/chat/completions","/responses","/models"],generateImages=async(model,context,options)=>{let output={api:model.api,provider:model.provider,model:model.id,output:[],stopReason:"stop",timestamp:Date.now()};try{let params=buildParams(model,context,options),images=context.input.filter(item=>item.type==="image"),method=images.length>0?"edit":"generate";method==="edit"&&(params=await buildEditParams(params,images,options?.mask));let nextParams=await options?.onPayload?.(params,model);if(nextParams!==void 0){if(!isImageParams(nextParams))throw new Error("onPayload returned an invalid image generation payload");params=nextParams}let headers={...model.headers,...options?.headers},auth=resolveOpenAIClientAuth(model.provider,options?.apiKey,headers),client=new OpenAI({apiKey:auth.apiKey,baseURL:normalizeBaseUrl(model.baseUrl),dangerouslyAllowBrowser:!0,fetch:options?.fetch,defaultHeaders:auth.headers}),requestOptions={...options?.signal?{signal:options.signal}:{},...options?.timeoutMs!==void 0?{timeout:options.timeoutMs}:{},maxRetries:0},{data:response,response:rawResponse}=await retryProviderRequest(()=>{let sdkParams=params;return awaitProviderTransport(()=>(method==="edit"?client.images.edit(sdkParams,requestOptions):client.images.generate(sdkParams,requestOptions)).withResponse(),openAICompatibleProviderDiagnosticFromError)},{maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,signal:options?.signal});if(await options?.onResponse?.({status:rawResponse.status,headers:headersToRecord(rawResponse.headers)},model),response.usage&&(output.usage=parseUsage(response.usage,model)),(response.background==="transparent"||response.background==="opaque")&&(output.background=response.background),!response.data||response.data.length===0)throw new Error("OpenAI images response contained no image data");let outputFormat=requestedOutputFormat(params.output_format);for(let datum of response.data){let image=await resolveImage(datum,outputFormat,options);datum.revised_prompt?.trim()&&output.output.push({type:"text",text:datum.revised_prompt}),output.output.push(image)}return output}catch(error){output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error));let providerDiagnostic=output.stopReason==="error"?readProviderDiagnostic(error):void 0;return providerDiagnostic!==void 0&&(output.providerDiagnostic=providerDiagnostic),output}};function normalizeBaseUrl(baseUrl){let url;try{url=new URL(baseUrl)}catch{throw new Error(`Invalid OpenAI images base URL: ${baseUrl}`)}if(url.protocol!=="http:"&&url.protocol!=="https:")throw new Error("OpenAI images base URL must use HTTP or HTTPS");if(url.search||url.hash)throw new Error("OpenAI images base URL must not include a query or fragment");let pathname=url.pathname.replace(/\/+$/,""),normalizedPathname=pathname.toLowerCase();if(normalizedPathname.includes("/images"))throw new Error("OpenAI images base URL must not include an images endpoint");if(ENDPOINT_SUFFIXES.some(suffix=>normalizedPathname.endsWith(suffix)))throw new Error("OpenAI images base URL must not include a known API endpoint");return url.pathname=pathname.endsWith("/v1")?pathname:`${pathname}/v1`,url.toString()}function parseUsage(rawUsage,model){let input=rawUsage.input_tokens??0,output=rawUsage.output_tokens??0,imageTokens=rawUsage.input_tokens_details?.image_tokens??0,textTokens=rawUsage.input_tokens_details?.text_tokens??Math.max(0,input-imageTokens),imageRate=model.cost.imageInput??model.cost.input,usage={input,output,cacheRead:0,cacheWrite:0,totalTokens:rawUsage.total_tokens??input+output,cost:{input:(model.cost.input*textTokens+imageRate*imageTokens)/1e6,output:model.cost.output/1e6*output,cacheRead:0,cacheWrite:0,total:0}};return usage.cost.total=usage.cost.input+usage.cost.output,usage}export{generateImages,parseOpenAIImageOutputOptions,parseOpenAIImageSize};
2
+ import{resolveOpenAIClientAuth}from"./chunk-GFCKDAH5.js";import{OpenAI,toFile}from"./chunk-CD2HJK4C.js";import{awaitProviderTransport,openAICompatibleProviderDiagnosticFromError}from"./chunk-XKFG4N3Z.js";import{retryProviderRequest}from"./chunk-GIT63LXN.js";import{buildParams,isImageParams,parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{formatProviderError,normalizeProviderError}from"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-RFB5CBW7.js";import{readProviderDiagnostic}from"./chunk-Z7HTHT6K.js";import"./chunk-WDTJ6JKE.js";import"./chunk-3SASTB6Y.js";import{headersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";function upload(image,name){return toFile(Buffer.from(image.data,"base64"),`${name}.${image.mimeType.split("/")[1]}`,{type:image.mimeType})}async function buildEditParams(params,images,mask){if(images.length>16)throw new Error("OpenAI image edits accept at most 16 reference images");let image=await Promise.all(images.map((reference,i)=>upload(reference,`reference-${i}`)));return mask===void 0?{...params,image}:{...params,image,mask:await upload(mask,"mask")}}var PNG_MAGIC=[137,80,78,71],JPEG_MAGIC=[255,216,255],WEBP_MAGIC=[82,73,70,70,87,69,66,80];function requestedOutputFormat(value){return value==="jpeg"||value==="webp"?value:"png"}async function resolveImage(datum,outputFormat,options){let b64=datum.b64_json?.trim();if(b64)return{type:"image",mimeType:detectMime(Buffer.from(b64.slice(0,24),"base64"))??`image/${outputFormat}`,data:b64};let url=datum.url?.trim();if(!url)throw new Error("OpenAI images response datum contained no image data");return url.startsWith("data:")?parseDataUrl(url):hydrateImageUrl(url,options)}function parseDataUrl(url){let match=/^data:([^;,]+);base64,(.+)$/i.exec(url);if(!match?.[1]||!match[2])throw new Error("OpenAI images response contained an invalid data URL");let mimeType=supportedMime(match[1]);if(!mimeType)throw new Error(`OpenAI images response used unsupported MIME type: ${match[1]}`);return{type:"image",mimeType,data:match[2]}}async function hydrateImageUrl(url,options){let parsed;try{parsed=new URL(url)}catch{throw new Error("OpenAI images response URL must be absolute")}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:")throw new Error("OpenAI images response URL must use HTTP or HTTPS");let response=await(options?.fetch??globalThis.fetch)(url,options?.signal?{signal:options.signal}:{});if(!response.ok)throw new Error(`OpenAI image hydration failed with HTTP ${response.status}`);let declaredLength=response.headers.get("content-length");if(declaredLength&&Number(declaredLength)>25165824)throw oversizedImageError();let bytes=new Uint8Array(await response.arrayBuffer());if(bytes.byteLength===0)throw new Error("OpenAI image hydration returned an empty body");if(bytes.byteLength>25165824)throw oversizedImageError();let declaredMime=supportedMime(response.headers.get("content-type")?.split(";",1)[0]),detectedMime=detectMime(bytes);if(declaredMime&&detectedMime&&declaredMime!==detectedMime)throw new Error(`OpenAI image MIME mismatch: declared ${declaredMime}, detected ${detectedMime}`);let mimeType=detectedMime??declaredMime;if(!mimeType)throw new Error("OpenAI image hydration returned unsupported image content");return{type:"image",mimeType,data:bytesToBase64(bytes)}}function supportedMime(value){let normalized=value?.trim().toLowerCase();if(normalized==="image/png"||normalized==="image/jpeg"||normalized==="image/webp")return normalized}function detectMime(bytes){if(hasMagic(bytes,PNG_MAGIC))return"image/png";if(hasMagic(bytes,JPEG_MAGIC))return"image/jpeg";if(hasMagic(bytes,WEBP_MAGIC.slice(0,4))&&hasMagic(bytes,WEBP_MAGIC.slice(4),8))return"image/webp"}function hasMagic(bytes,magic,offset=0){return magic.every((value,index)=>bytes[offset+index]===value)}function bytesToBase64(bytes){let binary="";for(let offset=0;offset<bytes.length;offset+=32768)binary+=String.fromCharCode(...bytes.subarray(offset,offset+32768));return btoa(binary)}function oversizedImageError(){return new Error("OpenAI image hydration exceeded the 24 MiB limit")}var ENDPOINT_SUFFIXES=["/chat/completions","/responses","/models"],generateImages=async(model,context,options)=>{let output={api:model.api,provider:model.provider,model:model.id,output:[],stopReason:"stop",timestamp:Date.now()};try{let params=buildParams(model,context,options),images=context.input.filter(item=>item.type==="image"),method=images.length>0?"edit":"generate";method==="edit"&&(params=await buildEditParams(params,images,options?.mask));let nextParams=await options?.onPayload?.(params,model);if(nextParams!==void 0){if(!isImageParams(nextParams))throw new Error("onPayload returned an invalid image generation payload");params=nextParams}let headers={...model.headers,...options?.headers},auth=resolveOpenAIClientAuth(model.provider,options?.apiKey,headers),client=new OpenAI({apiKey:auth.apiKey,baseURL:normalizeBaseUrl(model.baseUrl),dangerouslyAllowBrowser:!0,fetch:options?.fetch,defaultHeaders:auth.headers}),requestOptions={...options?.signal?{signal:options.signal}:{},...options?.timeoutMs!==void 0?{timeout:options.timeoutMs}:{},maxRetries:0},{data:response,response:rawResponse}=await retryProviderRequest(()=>{let sdkParams=params;return awaitProviderTransport(()=>(method==="edit"?client.images.edit(sdkParams,requestOptions):client.images.generate(sdkParams,requestOptions)).withResponse(),openAICompatibleProviderDiagnosticFromError)},{maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,signal:options?.signal});if(await options?.onResponse?.({status:rawResponse.status,headers:headersToRecord(rawResponse.headers)},model),response.usage&&(output.usage=parseUsage(response.usage,model)),(response.background==="transparent"||response.background==="opaque")&&(output.background=response.background),!response.data||response.data.length===0)throw new Error("OpenAI images response contained no image data");let outputFormat=requestedOutputFormat(params.output_format);for(let datum of response.data){let image=await resolveImage(datum,outputFormat,options);datum.revised_prompt?.trim()&&output.output.push({type:"text",text:datum.revised_prompt}),output.output.push(image)}return output}catch(error){output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error));let providerDiagnostic=output.stopReason==="error"?readProviderDiagnostic(error):void 0;return providerDiagnostic!==void 0&&(output.providerDiagnostic=providerDiagnostic),output}};function normalizeBaseUrl(baseUrl){let url;try{url=new URL(baseUrl)}catch{throw new Error(`Invalid OpenAI images base URL: ${baseUrl}`)}if(url.protocol!=="http:"&&url.protocol!=="https:")throw new Error("OpenAI images base URL must use HTTP or HTTPS");if(url.search||url.hash)throw new Error("OpenAI images base URL must not include a query or fragment");let pathname=url.pathname.replace(/\/+$/,""),normalizedPathname=pathname.toLowerCase();if(normalizedPathname.includes("/images"))throw new Error("OpenAI images base URL must not include an images endpoint");if(ENDPOINT_SUFFIXES.some(suffix=>normalizedPathname.endsWith(suffix)))throw new Error("OpenAI images base URL must not include a known API endpoint");return url.pathname=pathname.endsWith("/v1")?pathname:`${pathname}/v1`,url.toString()}function parseUsage(rawUsage,model){let input=rawUsage.input_tokens??0,output=rawUsage.output_tokens??0,imageTokens=rawUsage.input_tokens_details?.image_tokens??0,textTokens=rawUsage.input_tokens_details?.text_tokens??Math.max(0,input-imageTokens),imageRate=model.cost.imageInput??model.cost.input,usage={input,output,cacheRead:0,cacheWrite:0,totalTokens:rawUsage.total_tokens??input+output,cost:{input:(model.cost.input*textTokens+imageRate*imageTokens)/1e6,output:model.cost.output/1e6*output,cacheRead:0,cacheWrite:0,total:0}};return usage.cost.total=usage.cost.input+usage.cost.output,usage}export{generateImages,parseOpenAIImageOutputOptions,parseOpenAIImageSize};
@@ -1,4 +1,4 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{resolveOpenAIClientAuth}from"./chunk-GFCKDAH5.js";import{OpenAI}from"./chunk-CD2HJK4C.js";import{createWebSocketTransportFailure,startWebSocketLiveness}from"./chunk-YT2ZSZOY.js";import{isCloudflareProvider,resolveCloudflareBaseUrl}from"./chunk-OZNCR6E6.js";import{formatGitHubCopilotToolLimitError,limitGitHubCopilotTools,recordGitHubCopilotToolLimit,withGitHubCopilotFailureNote}from"./chunk-FQZZGSYH.js";import{getPiUserAgent}from"./chunk-QTG7MY2X.js";import{awaitProviderTransport,openAICompatibleProviderDiagnosticFromError,siwcProviderDiagnosticFromError}from"./chunk-7565XQAU.js";import{OPENAI_RESPONSES_RESERVED_BODY_KEYS,buildBaseOptions,clampMaxForOpenAI}from"./chunk-2XBKE2BZ.js";import{retryProviderRequest}from"./chunk-GIT63LXN.js";import{deriveOpenAIPromptCacheKey}from"./chunk-LPHUMR6R.js";import{isRequestRefusal,sendWithForcedToolChoiceFallback}from"./chunk-OEFCY46F.js";import{buildCopilotDynamicHeaders,hasCopilotVisionInput}from"./chunk-KRNXUTZJ.js";import{formatProviderError,normalizeProviderError}from"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import{supportsAllowedToolChoice}from"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import{convertResponsesMessages,convertResponsesTools,findPromptCacheComparisonResponseId,processResponsesStream,resolveResponsesDeferredToolsMode,resolveResponsesToolPlacement,withPromptCacheComparison}from"./chunk-V36CXIIB.js";import"./chunk-GVSBCJFI.js";import{readProviderDiagnostic}from"./chunk-MOH5HOHX.js";import"./chunk-HK46JMSC.js";import{createGrammarToolInputProperties}from"./chunk-ED7VJGL4.js";import"./chunk-WDTJ6JKE.js";import{getProviderEnvValue}from"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import{calculateCost,clampThinkingLevel,getCurrentTools,getDeclaredTools,inferOpenAIThinkingLevelMap,normalizeContext,resolveTranscript,supportsMax,supportsXhigh}from"./chunk-TBARMJ75.js";import"./chunk-3SASTB6Y.js";import{AssistantMessageEventStream}from"./chunk-5CSZPC55.js";import{headersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";var allowedToolsRefusals=new Set;function refusalKey(target){return JSON.stringify([target.api,target.provider,target.baseUrl,target.id])}function hasRefusedAllowedToolsChoice(target){return allowedToolsRefusals.has(refusalKey(target))}function rememberAllowedToolsChoiceRefusal(target){allowedToolsRefusals.add(refusalKey(target))}function allowedReference(tool){return tool.type==="function"||tool.type==="custom"?{type:tool.type,name:tool.name}:tool.type==="mcp"?{type:"mcp",server_label:tool.server_label}:{type:tool.type}}function allowedToolsChoice(params){let choice=params.tool_choice;if(typeof choice!="object"||choice===null)return;let{type,tools}=choice;return type==="allowed_tools"&&Array.isArray(tools)?tools:void 0}function errorMessage(error){return error instanceof Error?error.message:String(error)}function isAllowedToolsChoiceRefusal(error,params,options={}){if(allowedToolsChoice(params)===void 0||!options.beforeContent&&!isRequestRefusal(error))return!1;let message=errorMessage(error);return/\ballowed_tools\b/.test(message)&&/invalid|unsupported|not\s+supported/i.test(message)}function restrictToAllowedTools(params){let allowed=allowedToolsChoice(params);if(allowed===void 0)return params;let allowedNames=new Set(allowed.map(tool=>tool.name).filter(name=>typeof name=="string")),tools=(params.tools??[]).filter(tool=>tool.type!=="function"&&tool.type!=="custom"||allowedNames.has(tool.name)),restricted={...params,tools};return delete restricted.tool_choice,restricted}function applyAllowedToolsChoice(params,context,activeToolNames,compat){if(!compat.supportsAllowedTools||activeToolNames===void 0||params.tool_choice!==void 0)return params;let active=new Set(activeToolNames),declaredTools=getCurrentTools(context.messages);if(declaredTools.every(tool=>active.has(tool.name)))return params;let allowed=[],namedInTools=new Set;for(let tool of params.tools??[])(tool.type==="function"||tool.type==="custom")&&(namedInTools.add(tool.name),!active.has(tool.name))||allowed.push(allowedReference(tool));let requestToolNames=new Set(resolveResponsesToolPlacement(context.messages,resolveResponsesDeferredToolsMode(compat)!==void 0).requestTools.map(tool=>tool.name));for(let tool of declaredTools){if(namedInTools.has(tool.name)||!active.has(tool.name)||requestToolNames.has(tool.name))continue;let[converted]=convertResponsesTools([tool],{supportsStrictMode:compat.supportsStrictMode,supportsOpenAIGrammarTools:compat.supportsOpenAIGrammarTools});converted&&allowed.push(allowedReference(converted))}let toolChoice=allowed.length>0?{type:"allowed_tools",mode:"auto",tools:allowed}:"none";return{...params,tool_choice:toolChoice}}var OPENAI_TOOL_CALL_PROVIDERS=new Set(["openai","chatgpt-subscription","opencode"]),OPENAI_BETA_RESPONSES_WEBSOCKETS="responses_websockets=2026-02-06",OPENAI_WEB_SEARCH_SOURCES_INCLUDE="web_search_call.action.sources",SESSION_WEBSOCKET_CACHE_TTL_MS=300*1e3,OPENAI_RESPONSES_MIN_OUTPUT_TOKENS=16,PROMPT_CACHE_PREWARM_TIMEOUT_MS=3e4,CHATGPT_USAGE_URL="https://chatgpt.com/settings/usage",websocketSessionCache=new Map;function isForcedOpenAIResponsesToolChoice(toolChoice){return toolChoice!==void 0&&toolChoice!=="auto"&&toolChoice!=="none"}function detectSessionAffinityFormat(model){return model.provider==="openrouter"||model.baseUrl.includes("openrouter.ai")?"openrouter":"openai"}function resolveCacheRetention(cacheRetention,env){return cacheRetention||(getProviderEnvValue("PI_CACHE_RETENTION",env)==="long"?"long":"short")}function getCompat(model,env){let isNativeEndpoint=isOpenAIResponsesNativeEndpoint(model,env);return{siwc:model.compat?.siwc??!1,supportsDeveloperRole:model.compat?.supportsDeveloperRole??!0,supportsMidConvoSystemMessages:model.compat?.supportsMidConvoSystemMessages??!1,sessionAffinityFormat:model.compat?.sessionAffinityFormat??detectSessionAffinityFormat(model),supportsLongCacheRetention:model.compat?.supportsLongCacheRetention??!0,supportsWebSocket:model.compat?.supportsWebSocket??isNativeEndpoint,supportsRemoteCompactionV2:model.compat?.supportsRemoteCompactionV2??isNativeEndpoint,supportsWebSearchPreview:model.compat?.supportsWebSearchPreview??isNativeEndpoint,webSearchToolType:model.compat?.webSearchToolType??"web_search_preview",supportsImageGeneration:model.compat?.supportsImageGeneration??isNativeEndpoint,supportsStrictMode:model.compat?.supportsStrictMode??!1,supportsOpenAIGrammarTools:model.compat?.supportsOpenAIGrammarTools??!1,supportsAdditionalTools:model.compat?.supportsAdditionalTools??!1,supportsToolSearch:model.compat?.supportsToolSearch??!1,supportsExplicitPromptCacheMode:model.compat?.supportsExplicitPromptCacheMode??!1,supportsConfigurationUpdate:model.compat?.supportsConfigurationUpdate??!1,supportsMaxOutputTokens:model.compat?.supportsMaxOutputTokens??!0,supportsForcedToolChoice:model.compat?.supportsForcedToolChoice??!0,supportsAllowedTools:supportsAllowedToolChoice(model)}}function isOpenAIResponsesNativeEndpoint(model,env){let baseUrl=isCloudflareProvider(model.provider)?resolveCloudflareBaseUrl(model,env):model.baseUrl;try{return new URL(baseUrl||"https://api.openai.com/v1").hostname==="api.openai.com"}catch{return!1}}function getPromptCacheRetention(compat,cacheRetention){return cacheRetention==="long"&&compat.supportsLongCacheRetention&&!compat.supportsExplicitPromptCacheMode?"24h":void 0}function getPromptCacheOptions(compat,cacheRetention){if(compat.supportsExplicitPromptCacheMode){if(cacheRetention==="none")return{mode:"explicit"};if(cacheRetention==="long"&&compat.supportsLongCacheRetention)return{ttl:"30m"}}}function isRecord(value){return typeof value=="object"&&value!==null}function isOpenAiWebSearchPreviewTool(value){return isRecord(value)&&(value.type==="web_search"||value.type==="web_search_preview"||value.type==="web_search_preview_2025_03_11")}function sanitizeUnsupportedNativeTools(params,compat){if(compat.supportsWebSearchPreview)return params;let payload=params,sanitized,nextPayload=()=>(sanitized??={...payload},sanitized);if(Array.isArray(payload.tools)){let tools=payload.tools.filter(tool=>!isOpenAiWebSearchPreviewTool(tool));if(tools.length!==payload.tools.length){let next=nextPayload();tools.length>0?next.tools=tools:delete next.tools}}if(Array.isArray(payload.include)){let include=payload.include.filter(value=>value!==OPENAI_WEB_SEARCH_SOURCES_INCLUDE);if(include.length!==payload.include.length){let next=nextPayload();include.length>0?next.include=include:delete next.include}}return isOpenAiWebSearchPreviewTool(payload.tool_choice)&&delete nextPayload().tool_choice,sanitized||params}function formatOpenAIResponsesError(error,provider,siwc=!1){let errorMessage2=formatProviderError(normalizeProviderError(error),`${provider==="openai"?"OpenAI":provider} API error`);if(siwc&&error instanceof Error&&Reflect.get(error,"code")==="subscription_sharing_unsupported_capability"){let param=Reflect.get(error,"param");typeof param=="string"&&(errorMessage2+=`
2
+ import{resolveOpenAIClientAuth}from"./chunk-GFCKDAH5.js";import{OpenAI}from"./chunk-CD2HJK4C.js";import{createWebSocketTransportFailure,startWebSocketLiveness}from"./chunk-YT2ZSZOY.js";import{isCloudflareProvider,resolveCloudflareBaseUrl}from"./chunk-OZNCR6E6.js";import{formatGitHubCopilotToolLimitError,limitGitHubCopilotTools,recordGitHubCopilotToolLimit,withGitHubCopilotFailureNote}from"./chunk-4ZGQUOBV.js";import{getPiUserAgent}from"./chunk-QTG7MY2X.js";import{awaitProviderTransport,openAICompatibleProviderDiagnosticFromError,siwcProviderDiagnosticFromError}from"./chunk-XKFG4N3Z.js";import{OPENAI_RESPONSES_RESERVED_BODY_KEYS,buildBaseOptions,clampMaxForOpenAI}from"./chunk-BIWFWGUA.js";import{retryProviderRequest}from"./chunk-GIT63LXN.js";import{deriveOpenAIPromptCacheKey}from"./chunk-OT6ALXSJ.js";import{isRequestRefusal,sendWithForcedToolChoiceFallback}from"./chunk-OEFCY46F.js";import{buildCopilotDynamicHeaders,hasCopilotVisionInput}from"./chunk-KRNXUTZJ.js";import{formatProviderError,normalizeProviderError}from"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import{supportsAllowedToolChoice}from"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import{convertResponsesMessages,convertResponsesTools,findPromptCacheComparisonResponseId,processResponsesStream,resolveResponsesDeferredToolsMode,resolveResponsesToolPlacement,withPromptCacheComparison}from"./chunk-YXL3PNTL.js";import"./chunk-GVSBCJFI.js";import{readProviderDiagnostic}from"./chunk-Z7HTHT6K.js";import"./chunk-HK46JMSC.js";import{createGrammarToolInputProperties}from"./chunk-2PGSRQBF.js";import"./chunk-WDTJ6JKE.js";import{getProviderEnvValue}from"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import{calculateCost,clampThinkingLevel,getCurrentTools,getDeclaredTools,inferOpenAIThinkingLevelMap,normalizeContext,resolveTranscript,supportsMax,supportsXhigh}from"./chunk-AVP6DDBF.js";import"./chunk-3SASTB6Y.js";import{AssistantMessageEventStream}from"./chunk-5CSZPC55.js";import{headersToRecord}from"./chunk-PJ34QVL5.js";import"./chunk-IKOFCODM.js";var allowedToolsRefusals=new Set;function refusalKey(target){return JSON.stringify([target.api,target.provider,target.baseUrl,target.id])}function hasRefusedAllowedToolsChoice(target){return allowedToolsRefusals.has(refusalKey(target))}function rememberAllowedToolsChoiceRefusal(target){allowedToolsRefusals.add(refusalKey(target))}function allowedReference(tool){return tool.type==="function"||tool.type==="custom"?{type:tool.type,name:tool.name}:tool.type==="mcp"?{type:"mcp",server_label:tool.server_label}:{type:tool.type}}function allowedToolsChoice(params){let choice=params.tool_choice;if(typeof choice!="object"||choice===null)return;let{type,tools}=choice;return type==="allowed_tools"&&Array.isArray(tools)?tools:void 0}function errorMessage(error){return error instanceof Error?error.message:String(error)}function isAllowedToolsChoiceRefusal(error,params,options={}){if(allowedToolsChoice(params)===void 0||!options.beforeContent&&!isRequestRefusal(error))return!1;let message=errorMessage(error);return/\ballowed_tools\b/.test(message)&&/invalid|unsupported|not\s+supported/i.test(message)}function restrictToAllowedTools(params){let allowed=allowedToolsChoice(params);if(allowed===void 0)return params;let allowedNames=new Set(allowed.map(tool=>tool.name).filter(name=>typeof name=="string")),tools=(params.tools??[]).filter(tool=>tool.type!=="function"&&tool.type!=="custom"||allowedNames.has(tool.name)),restricted={...params,tools};return delete restricted.tool_choice,restricted}function applyAllowedToolsChoice(params,context,activeToolNames,compat){if(!compat.supportsAllowedTools||activeToolNames===void 0||params.tool_choice!==void 0)return params;let active=new Set(activeToolNames),declaredTools=getCurrentTools(context.messages);if(declaredTools.every(tool=>active.has(tool.name)))return params;let allowed=[],namedInTools=new Set;for(let tool of params.tools??[])(tool.type==="function"||tool.type==="custom")&&(namedInTools.add(tool.name),!active.has(tool.name))||allowed.push(allowedReference(tool));let requestToolNames=new Set(resolveResponsesToolPlacement(context.messages,resolveResponsesDeferredToolsMode(compat)!==void 0).requestTools.map(tool=>tool.name));for(let tool of declaredTools){if(namedInTools.has(tool.name)||!active.has(tool.name)||requestToolNames.has(tool.name))continue;let[converted]=convertResponsesTools([tool],{supportsStrictMode:compat.supportsStrictMode,supportsOpenAIGrammarTools:compat.supportsOpenAIGrammarTools});converted&&allowed.push(allowedReference(converted))}let toolChoice=allowed.length>0?{type:"allowed_tools",mode:"auto",tools:allowed}:"none";return{...params,tool_choice:toolChoice}}var OPENAI_TOOL_CALL_PROVIDERS=new Set(["openai","chatgpt-subscription","opencode"]),OPENAI_BETA_RESPONSES_WEBSOCKETS="responses_websockets=2026-02-06",OPENAI_WEB_SEARCH_SOURCES_INCLUDE="web_search_call.action.sources",SESSION_WEBSOCKET_CACHE_TTL_MS=300*1e3,OPENAI_RESPONSES_MIN_OUTPUT_TOKENS=16,PROMPT_CACHE_PREWARM_TIMEOUT_MS=3e4,CHATGPT_USAGE_URL="https://chatgpt.com/settings/usage",websocketSessionCache=new Map;function isForcedOpenAIResponsesToolChoice(toolChoice){return toolChoice!==void 0&&toolChoice!=="auto"&&toolChoice!=="none"}function detectSessionAffinityFormat(model){return model.provider==="openrouter"||model.baseUrl.includes("openrouter.ai")?"openrouter":"openai"}function resolveCacheRetention(cacheRetention,env){return cacheRetention||(getProviderEnvValue("PI_CACHE_RETENTION",env)==="long"?"long":"short")}function getCompat(model,env){let isNativeEndpoint=isOpenAIResponsesNativeEndpoint(model,env);return{siwc:model.compat?.siwc??!1,supportsDeveloperRole:model.compat?.supportsDeveloperRole??!0,supportsMidConvoSystemMessages:model.compat?.supportsMidConvoSystemMessages??!1,sessionAffinityFormat:model.compat?.sessionAffinityFormat??detectSessionAffinityFormat(model),supportsLongCacheRetention:model.compat?.supportsLongCacheRetention??!0,supportsWebSocket:model.compat?.supportsWebSocket??isNativeEndpoint,supportsRemoteCompactionV2:model.compat?.supportsRemoteCompactionV2??isNativeEndpoint,supportsWebSearchPreview:model.compat?.supportsWebSearchPreview??isNativeEndpoint,webSearchToolType:model.compat?.webSearchToolType??"web_search_preview",supportsImageGeneration:model.compat?.supportsImageGeneration??isNativeEndpoint,supportsStrictMode:model.compat?.supportsStrictMode??!1,supportsOpenAIGrammarTools:model.compat?.supportsOpenAIGrammarTools??!1,supportsAdditionalTools:model.compat?.supportsAdditionalTools??!1,supportsToolSearch:model.compat?.supportsToolSearch??!1,supportsExplicitPromptCacheMode:model.compat?.supportsExplicitPromptCacheMode??!1,supportsConfigurationUpdate:model.compat?.supportsConfigurationUpdate??!1,supportsMaxOutputTokens:model.compat?.supportsMaxOutputTokens??!0,supportsForcedToolChoice:model.compat?.supportsForcedToolChoice??!0,supportsAllowedTools:supportsAllowedToolChoice(model)}}function isOpenAIResponsesNativeEndpoint(model,env){let baseUrl=isCloudflareProvider(model.provider)?resolveCloudflareBaseUrl(model,env):model.baseUrl;try{return new URL(baseUrl||"https://api.openai.com/v1").hostname==="api.openai.com"}catch{return!1}}function getPromptCacheRetention(compat,cacheRetention){return cacheRetention==="long"&&compat.supportsLongCacheRetention&&!compat.supportsExplicitPromptCacheMode?"24h":void 0}function getPromptCacheOptions(compat,cacheRetention){if(compat.supportsExplicitPromptCacheMode){if(cacheRetention==="none")return{mode:"explicit"};if(cacheRetention==="long"&&compat.supportsLongCacheRetention)return{ttl:"30m"}}}function isRecord(value){return typeof value=="object"&&value!==null}function isOpenAiWebSearchPreviewTool(value){return isRecord(value)&&(value.type==="web_search"||value.type==="web_search_preview"||value.type==="web_search_preview_2025_03_11")}function sanitizeUnsupportedNativeTools(params,compat){if(compat.supportsWebSearchPreview)return params;let payload=params,sanitized,nextPayload=()=>(sanitized??={...payload},sanitized);if(Array.isArray(payload.tools)){let tools=payload.tools.filter(tool=>!isOpenAiWebSearchPreviewTool(tool));if(tools.length!==payload.tools.length){let next=nextPayload();tools.length>0?next.tools=tools:delete next.tools}}if(Array.isArray(payload.include)){let include=payload.include.filter(value=>value!==OPENAI_WEB_SEARCH_SOURCES_INCLUDE);if(include.length!==payload.include.length){let next=nextPayload();include.length>0?next.include=include:delete next.include}}return isOpenAiWebSearchPreviewTool(payload.tool_choice)&&delete nextPayload().tool_choice,sanitized||params}function formatOpenAIResponsesError(error,provider,siwc=!1){let errorMessage2=formatProviderError(normalizeProviderError(error),`${provider==="openai"?"OpenAI":provider} API error`);if(siwc&&error instanceof Error&&Reflect.get(error,"code")==="subscription_sharing_unsupported_capability"){let param=Reflect.get(error,"param");typeof param=="string"&&(errorMessage2+=`
3
3
  Unsupported parameter: ${param}`)}return errorMessage2.includes("subscription_sharing_usage_limit_exceeded")?`${errorMessage2}
4
4
  Check your ChatGPT usage: ${CHATGPT_USAGE_URL}`:errorMessage2}var stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream({captureBlocks:!0}),normalizedContext=resolveTranscript(context,getCompat(model).supportsMidConvoSystemMessages);return(async()=>{let output={role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()};try{let clientAuth=resolveOpenAIClientAuth(model.provider,options?.apiKey,options?.headers),cacheSessionId=resolveCacheRetention(options?.cacheRetention,options?.env)==="none"?void 0:options?.sessionId,compat=getCompat(model,options?.env),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages),compat.supportsOpenAIGrammarTools),client=createClient(model,normalizedContext,clientAuth.apiKey,clientAuth.headers,options?.fetch,cacheSessionId,options?.env),params=buildParams(model,normalizedContext,options,compat,grammarToolInputProperties),nextParams=await options?.onPayload?.(params,model);nextParams!==void 0&&(params=nextParams),params=sanitizeUnsupportedNativeTools(params,compat),params=applyAllowedToolsChoice(params,normalizedContext,context.activeToolNames,compat),hasRefusedAllowedToolsChoice(model)&&(params=restrictToAllowedTools(params));let limitedTools=limitGitHubCopilotTools(model.provider,params.tools,params.tool_choice,getDeclaredTools(normalizedContext.messages).map(tool=>tool.name));limitedTools.omittedCount>0&&(params={...params,tools:limitedTools.tools},recordGitHubCopilotToolLimit(output,limitedTools.omittedCount));let transport=options?.transport??"sse",refusedAllowedToolsOverWebSocket=!1;if(transport!=="sse"&&compat.supportsWebSocket){let websocketStarted=!1;try{if(await processWebSocketStream(resolveOpenAIResponsesWebSocketUrl(model,options?.env),params,buildWebSocketHeaders(model,normalizedContext,clientAuth.apiKey,clientAuth.headers,cacheSessionId,options?.env),output,stream2,model,()=>{websocketStarted=!0},cacheSessionId,grammarToolInputProperties,options),options?.signal?.aborted)throw new Error("Request was aborted");stream2.push({type:"done",reason:getDoneReason(output.stopReason),message:output}),stream2.end();return}catch(error){let refusedAllowedTools=output.content.length===0&&isAllowedToolsChoiceRefusal(error,params,{beforeContent:!0});if(!refusedAllowedTools&&(transport==="websocket"||websocketStarted))throw error;refusedAllowedTools&&(params=restrictToAllowedTools(params),refusedAllowedToolsOverWebSocket=!0,output.stopReason="pending",delete output.errorMessage)}}let requestOptions={...options?.signal?{signal:options.signal}:{},...options?.timeoutMs!==void 0?{timeout:options.timeoutMs}:{},maxRetries:0},sendOnce=async body=>{let sent=await sendWithForcedToolChoiceFallback({target:model,params:body,acceptsForcedToolChoice:compat.supportsForcedToolChoice,isForced:isForcedOpenAIResponsesToolChoice,send:request=>model.provider==="github-copilot"||compat.siwc?awaitProviderTransport(()=>client.responses.create(request,requestOptions).withResponse(),compat.siwc?siwcProviderDiagnosticFromError:openAICompatibleProviderDiagnosticFromError):client.responses.create(request,requestOptions).withResponse()});return params=sent.params,sent.result},createRequest=async()=>{try{let result=await sendOnce(params);return refusedAllowedToolsOverWebSocket&&rememberAllowedToolsChoiceRefusal(model),result}catch(error){if(!isAllowedToolsChoiceRefusal(error,params))throw error;params=restrictToAllowedTools(params);let result=await sendOnce(params);return rememberAllowedToolsChoiceRefusal(model),result}},{data:openaiStream,response}=await retryProviderRequest(()=>createRequest(),{maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,signal:options?.signal});if(await options?.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model),refusedAllowedToolsOverWebSocket||stream2.push({type:"start",partial:output}),await processResponsesStream(openaiStream,output,stream2,model,{siwc:compat.siwc,onProviderStreamEvent:options?.onProviderStreamEvent,serviceTier:options?.serviceTier,grammarToolInputProperties,applyServiceTierPricing:(usage,serviceTier)=>applyServiceTierPricing(usage,serviceTier,model)}),options?.signal?.aborted)throw new Error("Request was aborted");if(output.stopReason==="pending")throw new Error("OpenAI Responses stream ended without a stop reason");if(output.stopReason==="aborted"||output.stopReason==="error")throw new Error(output.errorMessage||"An unknown error occurred");stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){for(let block of output.content)delete block.index,delete block.partialJson,delete block.customInput;output.stopReason=options?.signal?.aborted?"aborted":"error";let providerDiagnostic=(model.provider==="github-copilot"||model.compat?.siwc)&&output.stopReason==="error"?readProviderDiagnostic(error)??(model.compat?.siwc?siwcProviderDiagnosticFromError(error):openAICompatibleProviderDiagnosticFromError(error)):void 0;providerDiagnostic!==void 0&&(output.providerDiagnostic=providerDiagnostic),output.errorMessage=withGitHubCopilotFailureNote(formatGitHubCopilotToolLimitError(output,formatOpenAIResponsesError(error,model.provider,model.compat?.siwc)),model.provider,error),stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end()}})(),stream2},streamSimple=(model,context,options)=>(resolveOpenAIClientAuth(model.provider,options?.apiKey,options?.headers),stream(model,context,resolveSimpleOptions(model,context,options)));function resolveSimpleOptions(model,context,options){let base={...buildBaseOptions(model,context,options,options?.apiKey),toolChoice:options?.toolChoice,serviceTier:options?.serviceTier},clampedReasoning=options?.reasoning?clampThinkingLevel(model,options.reasoning):void 0,reasoningEffort=clampedReasoning==="off"?void 0:clampedReasoning==="max"&&supportsMax(model)?"max":clampMaxForOpenAI(clampedReasoning,supportsXhigh(model));return{...base,reasoningEffort}}async function warmOpenAIResponsesPromptCache(model,context,options){let prefix=normalizeContext({...context,messages:[]}),resolved=resolveSimpleOptions(model,prefix,options),clientAuth=resolveOpenAIClientAuth(model.provider,resolved.apiKey,resolved.headers),cacheRetention=resolveCacheRetention(resolved.cacheRetention,resolved.env),compat=getCompat(model,resolved.env),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(prefix.messages),compat.supportsOpenAIGrammarTools),client=createClient(model,prefix,clientAuth.apiKey,clientAuth.headers,resolved.fetch,cacheRetention==="none"?void 0:resolved.sessionId,resolved.env),params=buildParams(model,prefix,resolved,compat,grammarToolInputProperties),nextParams=await resolved.onPayload?.(params,model);nextParams!==void 0&&(params=nextParams),params=sanitizeUnsupportedNativeTools(params,compat);let limitedTools=limitGitHubCopilotTools(model.provider,params.tools,params.tool_choice,getDeclaredTools(prefix.messages).map(tool=>tool.name));limitedTools.omittedCount>0&&(params={...params,tools:limitedTools.tools});let body={...params,stream:!1,prompt_cache_options:{...params.prompt_cache_options,prewarm:!0}},response=await client.responses.create(body,{maxRetries:0,timeout:resolved.timeoutMs??PROMPT_CACHE_PREWARM_TIMEOUT_MS,...resolved.signal?{signal:resolved.signal}:{}}),usageRaw=response.usage,inputDetails=usageRaw?.input_tokens_details,cacheRead=inputDetails?.cached_tokens||0,cacheWrite=inputDetails?.cache_write_tokens??inputDetails?.cache_creation_tokens??0,usage={input:Math.max(0,(usageRaw?.input_tokens||0)-cacheRead-cacheWrite),output:usageRaw?.output_tokens||0,cacheRead,cacheWrite,totalTokens:usageRaw?.total_tokens||0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return calculateCost(model,usage),applyServiceTierPricing(usage,response.service_tier??resolved.serviceTier,model),{usage,usageRaw}}var SiwcOpenAI=class extends OpenAI{makeStatusError(status,body,message,headers){return isRecord(body)&&Object.hasOwn(body,"detail")&&!Object.hasOwn(body,"error")?new OpenAI.APIError(status,body,message,headers):super.makeStatusError(status,body,message,headers)}};function createClient(model,context,apiKey,optionsHeaders,fetch,sessionId,env){let compat=getCompat(model,env),headers={"User-Agent":getPiUserAgent(),...model.headers};if(model.provider==="github-copilot"){let hasImages=hasCopilotVisionInput(context.messages),copilotHeaders=buildCopilotDynamicHeaders({messages:context.messages,hasImages});Object.assign(headers,copilotHeaders)}sessionId&&(compat.sessionAffinityFormat==="openrouter"?headers["x-session-id"]=sessionId:(compat.sessionAffinityFormat==="openai"&&(headers.session_id=sessionId),headers["x-client-request-id"]=sessionId)),optionsHeaders&&Object.assign(headers,optionsHeaders);let Client=compat.siwc?SiwcOpenAI:OpenAI;return new Client({apiKey,baseURL:isCloudflareProvider(model.provider)?resolveCloudflareBaseUrl(model,env):model.baseUrl,dangerouslyAllowBrowser:!0,fetch,defaultHeaders:headers})}function buildParams(model,context,options,compat=getCompat(model,options?.env),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(context.messages),compat.supportsOpenAIGrammarTools)){let toolPlacement=resolveResponsesToolPlacement(context.messages,resolveResponsesDeferredToolsMode(compat)!==void 0),requestedReasoningEffort=options?.reasoningEffort??(options?.reasoningSummary?"medium":void 0),thinkingLevelMap=inferOpenAIThinkingLevelMap(model),mappedReasoningEffort=requestedReasoningEffort===void 0?void 0:thinkingLevelMap?.[requestedReasoningEffort],reasoningEffort=mappedReasoningEffort===void 0?requestedReasoningEffort:mappedReasoningEffort,reasoningRequested=reasoningEffort!=null,reasoningUnavailable=reasoningEffort===null,cacheRetention=resolveCacheRetention(options?.cacheRetention??model.cacheRetention,options?.env),messages=convertResponsesMessages(model,context,OPENAI_TOOL_CALL_PROVIDERS,{preserveThinking:reasoningRequested,systemPromptCacheBreakpoint:compat.supportsExplicitPromptCacheMode&&cacheRetention!=="none",grammarToolInputProperties,supportsMidConvoSystemMessages:compat.supportsMidConvoSystemMessages,supportsAdditionalTools:compat.supportsAdditionalTools,supportsToolSearch:compat.supportsToolSearch,toolOptions:{supportsStrictMode:compat.supportsStrictMode,supportsOpenAIGrammarTools:compat.supportsOpenAIGrammarTools}}),isNativeEndpoint=isOpenAIResponsesNativeEndpoint(model,options?.env),comparisonResponseId=cacheRetention!=="none"&&compat.supportsExplicitPromptCacheMode&&isNativeEndpoint?findPromptCacheComparisonResponseId(model,context.messages):void 0,params={model:model.id,input:messages,stream:!0,prompt_cache_key:cacheRetention==="none"?void 0:deriveOpenAIPromptCacheKey(model.id,context),prompt_cache_retention:getPromptCacheRetention(compat,cacheRetention),prompt_cache_options:withPromptCacheComparison(getPromptCacheOptions(compat,cacheRetention),comparisonResponseId),store:!1};return options?.maxTokens&&compat.supportsMaxOutputTokens&&(params.max_output_tokens=Math.max(options.maxTokens,OPENAI_RESPONSES_MIN_OUTPUT_TOKENS)),options?.temperature!==void 0&&(params.temperature=options?.temperature),options?.serviceTier!==void 0&&(params.service_tier=options.serviceTier),toolPlacement.requestTools.length>0&&(params.tools=convertResponsesTools(toolPlacement.requestTools,{supportsStrictMode:compat.supportsStrictMode,supportsOpenAIGrammarTools:compat.supportsOpenAIGrammarTools})),options?.toolChoice!==void 0&&(params.tool_choice=options.toolChoice),model.reasoning&&(reasoningRequested?(params.reasoning={effort:reasoningEffort,...options?.reasoningSummary===null?{}:{summary:options?.reasoningSummary||"auto"}},params.include=["reasoning.encrypted_content"]):!reasoningUnavailable&&model.provider!=="github-copilot"&&thinkingLevelMap?.off!==null&&(params.reasoning={effort:thinkingLevelMap?.off??"none"}),model.provider==="xai"&&(params.include=["reasoning.encrypted_content"])),applyExtraBodyToResponsesParams(params,options?.extraBody),Object.assign(params,model.samplingParams,options?.samplingParams),params}function applyExtraBodyToResponsesParams(params,extraBody){if(extraBody)for(let[key,value]of Object.entries(extraBody))OPENAI_RESPONSES_RESERVED_BODY_KEYS.has(key)||Object.defineProperty(params,key,{value,writable:!0,enumerable:!0,configurable:!0})}function getDoneReason(stopReason){return stopReason==="length"||stopReason==="toolUse"?stopReason:"stop"}function getWebSocketConstructor(){let wsConstructor=globalThis.WebSocket;return typeof wsConstructor=="function"?wsConstructor:null}function getWebSocketReadyState(socket){let readyState=socket.readyState;return typeof readyState=="number"?readyState:void 0}function isWebSocketReusable(socket){let readyState=getWebSocketReadyState(socket);return readyState===void 0||readyState===1}function closeWebSocketSilently(socket,code=1e3,reason="done"){try{socket.close(code,reason)}catch{}}function scheduleSessionWebSocketExpiry(sessionId,entry){entry.idleTimer&&clearTimeout(entry.idleTimer),entry.idleTimer=setTimeout(()=>{if(entry.busy){if(!isWebSocketReusable(entry.socket)){closeWebSocketSilently(entry.socket,1e3,"idle_timeout_dead"),websocketSessionCache.delete(sessionId);return}scheduleSessionWebSocketExpiry(sessionId,entry);return}closeWebSocketSilently(entry.socket,1e3,"idle_timeout"),websocketSessionCache.delete(sessionId)},SESSION_WEBSOCKET_CACHE_TTL_MS);let unref=entry.idleTimer.unref;unref&&unref.call(entry.idleTimer)}function getOpenAIResponsesWebSocketCacheSize(){return websocketSessionCache.size}async function connectWebSocket(url,headers,signal){let WebSocketConstructorValue=getWebSocketConstructor();if(!WebSocketConstructorValue)throw new Error("WebSocket transport is not available in this runtime");let websocketHeaders=headersToRecord(headers);return new Promise((resolve,reject)=>{let settled=!1,socket,cleanup=()=>{transportFailure.dispose(),socket.removeEventListener("open",onOpen),socket.removeEventListener("error",onError),socket.removeEventListener("close",onClose),signal?.removeEventListener("abort",onAbort)},transportFailure=createWebSocketTransportFailure(error=>{settled||(settled=!0,cleanup(),reject(error))}),onOpen=()=>{settled||(settled=!0,cleanup(),resolve(socket))},onError=event=>{transportFailure.onError(event)},onClose=event=>{transportFailure.onClose(event)},onAbort=()=>{settled||(settled=!0,cleanup(),closeWebSocketSilently(socket,1e3,"aborted"),reject(new Error("Request was aborted")))};try{socket=new WebSocketConstructorValue(url,{headers:websocketHeaders})}catch(error){reject(error instanceof Error?error:new Error(String(error)));return}socket.addEventListener("open",onOpen),socket.addEventListener("error",onError),socket.addEventListener("close",onClose),signal?.addEventListener("abort",onAbort)})}async function acquireWebSocket(url,headers,sessionId,signal){if(!sessionId){let socket2=await connectWebSocket(url,headers,signal);return{socket:socket2,release:()=>closeWebSocketSilently(socket2)}}let cached=websocketSessionCache.get(sessionId);if(cached){if(cached.idleTimer&&(clearTimeout(cached.idleTimer),cached.idleTimer=void 0),!cached.busy&&isWebSocketReusable(cached.socket))return cached.busy=!0,{socket:cached.socket,release:({keep}={})=>{if(!keep||!isWebSocketReusable(cached.socket)){closeWebSocketSilently(cached.socket),websocketSessionCache.delete(sessionId);return}cached.busy=!1,scheduleSessionWebSocketExpiry(sessionId,cached)}};cached.busy||(closeWebSocketSilently(cached.socket),websocketSessionCache.delete(sessionId))}let socket=await connectWebSocket(url,headers,signal),entry={socket,busy:!0};return websocketSessionCache.set(sessionId,entry),{socket,release:({keep}={})=>{if(!keep||!isWebSocketReusable(entry.socket)){closeWebSocketSilently(entry.socket),entry.idleTimer&&clearTimeout(entry.idleTimer),websocketSessionCache.get(sessionId)===entry&&websocketSessionCache.delete(sessionId);return}entry.busy=!1,scheduleSessionWebSocketExpiry(sessionId,entry)}}}async function decodeWebSocketData(data){if(typeof data=="string")return data;if(data instanceof ArrayBuffer)return new TextDecoder().decode(new Uint8Array(data));if(ArrayBuffer.isView(data))return new TextDecoder().decode(new Uint8Array(data.buffer,data.byteOffset,data.byteLength));if(data&&typeof data=="object"&&"arrayBuffer"in data){let arrayBuffer=await data.arrayBuffer();return new TextDecoder().decode(new Uint8Array(arrayBuffer))}return null}async function*parseWebSocket(socket,signal){let queue=[],pending=null,done=!1,failed=null,sawCompletion=!1,wake=()=>{if(!pending)return;let resolve=pending;pending=null,resolve()},liveness=startWebSocketLiveness(socket,error=>{failed=error,done=!0,closeWebSocketSilently(socket,1e3,"liveness_timeout"),wake()}),onMessage=event=>{liveness.noteActivity(),(async()=>{if(!event||typeof event!="object"||!("data"in event))return;let text=await decodeWebSocketData(event.data);if(text)try{let parsed=JSON.parse(text);(parsed.type==="response.completed"||parsed.type==="response.incomplete")&&(sawCompletion=!0,done=!0),queue.push(parsed),wake()}catch{}})()},transportFailure=createWebSocketTransportFailure(error=>{failed||(failed=error),done=!0,wake()}),onError=event=>{transportFailure.onError(event)},onClose=event=>{if(sawCompletion){transportFailure.dispose(),done=!0,wake();return}transportFailure.onClose(event)},onAbort=()=>{failed=new Error("Request was aborted"),done=!0,wake()};socket.addEventListener("message",onMessage),socket.addEventListener("error",onError),socket.addEventListener("close",onClose),signal?.addEventListener("abort",onAbort);try{for(;;){if(signal?.aborted)throw new Error("Request was aborted");if(queue.length>0){let event=queue.shift();event&&(yield event);continue}if(done)break;await new Promise(resolve=>{pending=resolve})}if(failed)throw failed;if(!sawCompletion)throw new Error("WebSocket stream closed before response.completed")}finally{liveness.stop(),transportFailure.dispose(),socket.removeEventListener("message",onMessage),socket.removeEventListener("error",onError),socket.removeEventListener("close",onClose),signal?.removeEventListener("abort",onAbort)}}async function processWebSocketStream(url,params,headers,output,stream2,model,onStart,cacheSessionId,grammarToolInputProperties,options){let{socket,release}=await acquireWebSocket(url,headers,cacheSessionId,options?.signal);try{socket.send(JSON.stringify({type:"response.create",...params})),onStart(),await options?.onResponse?.({status:101,headers:{}},model),stream2.push({type:"start",partial:output}),await processResponsesStream(parseWebSocket(socket,options?.signal),output,stream2,model,{siwc:model.compat?.siwc,serviceTier:options?.serviceTier,grammarToolInputProperties,applyServiceTierPricing:(usage,serviceTier)=>applyServiceTierPricing(usage,serviceTier,model)})}finally{release({keep:!1})}}function resolveOpenAIResponsesWebSocketUrl(model,env){let baseUrl=isCloudflareProvider(model.provider)?resolveCloudflareBaseUrl(model,env):model.baseUrl||"https://api.openai.com/v1",url=new URL(baseUrl);return url.pathname.endsWith("/responses")||(url.pathname=`${url.pathname.replace(/\/$/,"")}/responses`),url.protocol==="https:"?url.protocol="wss:":url.protocol==="http:"&&(url.protocol="ws:"),url.toString()}function buildWebSocketHeaders(model,context,apiKey,optionsHeaders,sessionId,env){let headers=new Headers(model.headers),suppressDefaultAuthorization=!1;if(model.provider==="github-copilot"){let hasImages=hasCopilotVisionInput(context.messages),copilotHeaders=buildCopilotDynamicHeaders({messages:context.messages,hasImages});for(let[key,value]of Object.entries(copilotHeaders))headers.set(key,value)}for(let[key,value]of Object.entries(optionsHeaders||{}))value===null?(key.toLowerCase()==="authorization"&&(suppressDefaultAuthorization=!0),headers.delete(key)):headers.set(key,value);if(!suppressDefaultAuthorization&&!headers.has("Authorization")&&headers.set("Authorization",`Bearer ${apiKey}`),sessionId){let compat=getCompat(model,env);compat.sessionAffinityFormat==="openai"&&headers.set("session_id",sessionId),compat.sessionAffinityFormat==="openai"||compat.sessionAffinityFormat==="openai-nosession"?headers.set("x-client-request-id",sessionId):compat.sessionAffinityFormat==="openrouter"&&headers.set("x-session-id",sessionId)}return headers.delete("accept"),headers.delete("content-type"),headers.delete("OpenAI-Beta"),headers.delete("openai-beta"),headers.set("OpenAI-Beta",OPENAI_BETA_RESPONSES_WEBSOCKETS),headers}function getServiceTierCostMultiplier(model,serviceTier){switch(serviceTier){case"ultrafast":return["gpt-6-astra","gpt-6.1-sol"].includes(model.upstreamModelId??model.id)?6:1;case"flex":return .5;case"priority":case"fast":return model.id==="gpt-5.5"?2.5:2;default:return 1}}function applyServiceTierPricing(usage,serviceTier,model){let multiplier=getServiceTierCostMultiplier(model,serviceTier);multiplier!==1&&(usage.cost.input*=multiplier,usage.cost.output*=multiplier,usage.cost.cacheRead*=multiplier,usage.cost.cacheWrite*=multiplier,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite)}export{getOpenAIResponsesWebSocketCacheSize,scheduleSessionWebSocketExpiry,stream,streamSimple,warmOpenAIResponsesPromptCache};
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});function formatThrownValue(value){return value instanceof Error?value.message||value.name:typeof value=="string"?value:String(value)}var ModelsError=class extends Error{constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}var _a,OAuthTokenEndpointError=class extends Error{constructor(message,status,facts={}){super(message),this.status=status,this.oauthError=facts.oauthError,this.credentialRefused=facts.credentialRefused??!1}};var UNAVAILABLE=Symbol.for("senpi.oauthRefreshUnavailable"),OAuthRefreshUnavailableError=class extends ModelsError{static{_a=UNAVAILABLE}constructor(provider,cause){super("oauth",`OAuth refresh failed for ${provider}`,{cause}),this[_a]=!0,this.name="OAuthRefreshUnavailableError"}};var procEnvCache=null;function getBunSandboxEnvValue(name){if(!(typeof process>"u"||!process.versions?.bun||Object.keys(process.env).length>0)){if(procEnvCache===null){procEnvCache=new Map;try{let{readFileSync}=__require("node:fs"),data=readFileSync("/proc/self/environ","utf-8");for(let entry of data.split("\0")){let idx=entry.indexOf("=");idx>0&&procEnvCache.set(entry.slice(0,idx),entry.slice(idx+1))}}catch{}}return procEnvCache.get(name)}}function getProviderEnvValue(name,env){return env?.[name]||(typeof process<"u"?process.env[name]:void 0)||getBunSandboxEnvValue(name)||void 0}import{createServer}from"node:http";var LOGO_SVG='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800" aria-hidden="true"><path fill="#F09082" d="M165.29 165.29H517.36V400H400V282.65H165.29Z"/><path fill="#4D9ABF" d="M165.29 282.65H282.65V400H400V517.36H282.65V634.72H165.29Z"/><path fill="#F1BE58" d="M517.36 400H634.72V634.72H517.36Z"/></svg>';function escapeHtml(value){return value.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function renderPage(options){let title=escapeHtml(options.title),heading=escapeHtml(options.heading),message=escapeHtml(options.message),details=options.details?escapeHtml(options.details):void 0;return`<!doctype html>
2
+ var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});function formatThrownValue(value){return value instanceof Error?value.message||value.name:typeof value=="string"?value:String(value)}var ModelsError=class extends Error{constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}var _a,OAuthTokenEndpointError=class extends Error{constructor(message,status,facts={}){super(message),this.status=status,this.oauthError=facts.oauthError,this.credentialRefused=facts.credentialRefused??!1}};var UNAVAILABLE=Symbol.for("senpi.oauthRefreshUnavailable"),OAuthRefreshUnavailableError=class extends ModelsError{static{_a=UNAVAILABLE}constructor(provider,cause){super("oauth",`OAuth refresh failed for ${provider}`,{cause}),this[_a]=!0,this.name="OAuthRefreshUnavailableError"}};var procEnvCache=null;function getBunSandboxEnvValue(name){if(!(typeof process>"u"||!process.versions?.bun||Object.keys(process.env).length>0)){if(procEnvCache===null){procEnvCache=new Map;try{let{readFileSync}=__require("node:fs"),data=readFileSync("/proc/self/environ","utf-8");for(let entry of data.split("\0")){let idx=entry.indexOf("=");idx>0&&procEnvCache.set(entry.slice(0,idx),entry.slice(idx+1))}}catch{}}return procEnvCache.get(name)}}function getProviderEnvValue(name,env){return env?.[name]||(typeof process<"u"?process.env[name]:void 0)||getBunSandboxEnvValue(name)||void 0}import{createServer}from"node:http";function processSingleton(key,create){let slot=Symbol.for(key),existing=Reflect.get(globalThis,slot);if(existing!==void 0)return existing;let created=create();return Reflect.set(globalThis,slot,created),created}var brandSlot=processSingleton("@code-yeongyu/senpi-ai:oauth-page-brand",()=>({current:void 0}));function escapeHtml(value){return value.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function renderPage(options){let title=escapeHtml(options.title),heading=escapeHtml(options.heading),message=escapeHtml(options.message),details=options.details?escapeHtml(options.details):void 0,brand=brandSlot.current,logo=brand?.logo?`<img class="logo" src="${brand.logo}" alt="" />`:"",brandName=brand?`<div class="brand-name">${escapeHtml(brand.name)}</div>`:"";return`<!doctype html>
3
3
  <html lang="en">
4
4
  <head>
5
5
  <meta charset="utf-8" />
@@ -39,7 +39,14 @@ var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(
39
39
  width: 72px;
40
40
  height: 72px;
41
41
  display: block;
42
+ margin-bottom: 16px;
43
+ }
44
+ .brand-name {
42
45
  margin-bottom: 24px;
46
+ font-size: 15px;
47
+ font-weight: 600;
48
+ letter-spacing: 0.02em;
49
+ color: var(--text-dim);
43
50
  }
44
51
  h1 {
45
52
  margin: 0 0 10px;
@@ -66,7 +73,8 @@ var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(
66
73
  </head>
67
74
  <body>
68
75
  <main>
69
- <div class="logo">${LOGO_SVG}</div>
76
+ ${logo}
77
+ ${brandName}
70
78
  <h1>${heading}</h1>
71
79
  <p>${message}</p>
72
80
  ${details?`<div class="details">${details}</div>`:""}
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{DefaultResourceLoader,LEGACY_PI_CONFIG_FILES,ModelRuntime,cleanupWindowsSelfUpdateQuarantine,createProjectTrustContext,importLegacyPiConfig,isBuiltinExtension,quarantineWindowsNativeDependencies,resolveProjectTrusted}from"./chunk-ZNLCKKF6.js";import"./chunk-4BF4FLT6.js";import"./chunk-6BSMXZKQ.js";import"./chunk-BNIZP4OS.js";import"./chunk-PIAY636U.js";import"./chunk-5DZD623T.js";import"./chunk-VRKA3LIT.js";import"./chunk-ETCYVVVO.js";import"./chunk-7ICGN62G.js";import"./chunk-3ESZE3DG.js";import"./chunk-R65P6LAT.js";import{DefaultPackageManager,SettingsManager}from"./chunk-DPBPO5OU.js";import"./chunk-FEQDJBDL.js";import"./chunk-XLLQJALL.js";import"./chunk-VPDQ6MOL.js";import"./chunk-L5OFGHDA.js";import{ProjectTrustStore,hasTrustRequiringProjectResources}from"./chunk-UURGXV5B.js";import"./chunk-DAPBNRN5.js";import"./chunk-J2OBN7TI.js";import"./chunk-Y4MPEIY5.js";import{DynamicBorder,keyHint,rawKeyHint}from"./chunk-MOOFLKLI.js";import"./chunk-LGO25HPL.js";import{initTheme,stopThemeWatcher,theme}from"./chunk-WCRNJYHO.js";import"./chunk-57MRFI6E.js";import"./chunk-Y3TMJV3J.js";import"./chunk-HBCNDC53.js";import"./chunk-F4OHTL2K.js";import"./chunk-XGBRBCIQ.js";import{BUILTIN_PATH_PREFIX}from"./chunk-QMRJYMNH.js";import"./chunk-WEGTCUO3.js";import"./chunk-GDPWQJDQ.js";import"./chunk-7DWTKE4Z.js";import{runtimeExecArgv}from"./chunk-S2M5D5GS.js";import"./chunk-6LDUM5CL.js";import"./chunk-FNBEICAA.js";import"./chunk-E6UCZ7E5.js";import"./chunk-UYO5Z35O.js";import"./chunk-H52J72VA.js";import"./chunk-SGS76663.js";import"./chunk-H4QOEVS5.js";import"./chunk-3WJ2DE2G.js";import"./chunk-FLM6GZPT.js";import"./chunk-ESQBKTNG.js";import"./chunk-ZNPH5BWS.js";import"./chunk-6VWIMHMH.js";import"./chunk-7ORS33CE.js";import"./chunk-KLAX467B.js";import"./chunk-SAZ6E74O.js";import{lockWithLossHandling}from"./chunk-F7GBSQRV.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.js";import"./chunk-7X72IACK.js";import{appendHiddenTuiStdout}from"./chunk-YWD54RHU.js";import"./chunk-SOMFLLPD.js";import"./chunk-27XEDYQA.js";import{source_default}from"./chunk-26UBFF6N.js";import"./chunk-MTQQ2VQH.js";import"./chunk-HB35RBP4.js";import"./chunk-YU2P3CAR.js";import"./chunk-LPHUMR6R.js";import"./chunk-IYL5E4QQ.js";import"./chunk-OEFCY46F.js";import"./chunk-KRNXUTZJ.js";import"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-QTQ3ES2S.js";import{Container,Input,Markdown,ProcessTerminal,Spacer,TUI,getKeybindings,matchesKey,truncateToWidth,visibleWidth}from"./chunk-D2ROBVZ4.js";import{killProcessTree}from"./chunk-4SENPCEA.js";import"./chunk-YU4AYH4C.js";import"./chunk-EVTTLPIY.js";import"./chunk-LNAZ7XEU.js";import"./chunk-DLAY7CIU.js";import"./chunk-PX7FF5LE.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-V36CXIIB.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.js";import"./chunk-TG4E7Z7W.js";import"./chunk-32R442XT.js";import"./chunk-WHPDEDCC.js";import"./chunk-MOH5HOHX.js";import"./chunk-HK46JMSC.js";import"./chunk-ED7VJGL4.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-TBARMJ75.js";import"./chunk-3SASTB6Y.js";import"./chunk-5CSZPC55.js";import"./chunk-PJ34QVL5.js";import"./chunk-BMX2U22F.js";import"./chunk-6APXZK7W.js";import"./chunk-WOHQJ6JB.js";import{formatVersionCheckError,getLatestPiRelease,getPiUserAgent,isNewerPackageVersion}from"./chunk-PP52OWBB.js";import"./chunk-7KLEFHSU.js";import"./chunk-ZOFZRJSL.js";import"./chunk-ZFIC2DZV.js";import"./chunk-6WISUXVI.js";import"./chunk-XVRRNJQD.js";import"./chunk-42XRJQM6.js";import"./chunk-2SOVDETB.js";import"./chunk-UKSFF47T.js";import"./chunk-OM7LH7AP.js";import"./chunk-QEESHRTS.js";import{APP_COMMAND,APP_NAME,CONFIG_DIR_NAME,DISPLAY_VERSION,PACKAGE_NAME,VERSION,brandProfile,canonicalizePath,detectInstallMethod,getAgentDir,getCwdRelativePath,getInstallPackageDir,getSelfUpdateCommand,getSelfUpdateUnavailableInstruction,isLocalPath,resolvePath,spawnProcess,spawnProcessSync,waitForChildProcess}from"./chunk-ISZ4EWIS.js";import"./chunk-ATQFN5HI.js";import"./chunk-EYSV6A7S.js";import"./chunk-MIENF2YK.js";import"./chunk-OXNWERO4.js";import"./chunk-QN2BHP3M.js";import"./chunk-AOTHPTMU.js";import"./chunk-O5RYI3IW.js";import{__toESM}from"./chunk-IKOFCODM.js";import{existsSync as existsSync3,mkdirSync as mkdirSync3,mkdtempSync,readdirSync as readdirSync2,readFileSync as readFileSync2,renameSync as renameSync2,rmSync as rmSync2,writeFileSync as writeFileSync2}from"node:fs";import{join as join5,resolve as resolve3}from"node:path";var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{randomUUID}from"node:crypto";import{cpSync,existsSync as existsSync2,mkdirSync as mkdirSync2,readFileSync,renameSync,rmSync,writeFileSync}from"node:fs";import{homedir}from"node:os";import{dirname as dirname2,join as join3,relative as relative2,resolve as resolve2}from"node:path";import{existsSync,readdirSync}from"node:fs";import{join,relative,sep}from"node:path";var REQUIRED_BUILD_ARTIFACTS=["extensions/omo.js","runtime/lsp-daemon/dist/cli.js","runtime/lsp-daemon/dist/index.js","runtime/lsp-daemon/dist/.omo-runtime-manifest.json","scripts/install.mjs"];function walkFiles(rootDir){let files=[],pending=[rootDir];for(;pending.length>0;){let dir=pending.pop();if(dir===void 0)continue;let entries;try{entries=readdirSync(dir,{withFileTypes:!0})}catch(error){if(error instanceof Error)continue;throw error}for(let entry of entries){let full=join(dir,entry.name);entry.isDirectory()?pending.push(full):entry.isFile()&&files.push(full)}}return files}function collectArtifactInventory(pluginPath){let inventory=[],collectUnder=(relativeDir,filter)=>{for(let filePath of walkFiles(join(pluginPath,relativeDir))){let posixPath=relative(pluginPath,filePath).split(sep).join("/");(filter===void 0||filter(posixPath))&&inventory.push(posixPath)}};return collectUnder("extensions"),collectUnder(join("runtime","lsp-daemon","dist")),collectUnder("skills",posixPath=>posixPath.endsWith("/SKILL.md")),existsSync(join(pluginPath,"scripts","install.mjs"))&&inventory.push("scripts/install.mjs"),inventory.sort(),inventory}function currentRequiredBuildArtifactsExist(pluginPath){return findMissingBuildArtifacts(pluginPath).length===0}function findMissingBuildArtifacts(pluginPath){let missing=[];for(let required of REQUIRED_BUILD_ARTIFACTS)existsSync(join(pluginPath,required))||missing.push(required);let skillCount=0;try{for(let entry of readdirSync(join(pluginPath,"skills"),{withFileTypes:!0}))entry.isDirectory()&&existsSync(join(pluginPath,"skills",entry.name,"SKILL.md"))&&skillCount++}catch(error){if(!(error instanceof Error))throw error}return skillCount===0&&missing.push("skills/*/SKILL.md"),missing}import{createHash}from"node:crypto";var EXCLUDED_ROOT_PATHS=new Set([".agents",".claude",".codex",".cursor",".devcontainer",".env.example",".gitattributes",".github",".idea",".mcp.json",".omo",".opencode",".vscode","AGENTS.md","CHANGELOG.md","CLA.md","CLAUDE.md","CONTRIBUTING.md","LICENSE","LICENSE.md","ROADMAP.md","THIRD-PARTY-NOTICES.md","assets","docs"]);function isBuildInputRootPath(name){return!EXCLUDED_ROOT_PATHS.has(name)&&!name.startsWith("README")}function computeBuildInputsHashFromLsTree(lsTreeOutput){let hash=createHash("sha256");for(let entry of lsTreeOutput.split("\0")){let tabIndex=entry.indexOf(" ");if(tabIndex===-1)continue;let name=entry.slice(tabIndex+1);if(!isBuildInputRootPath(name))continue;let objectHash=entry.slice(0,tabIndex).split(" ")[2]??"";hash.update(`${objectHash} ${name}
2
+ import{DefaultResourceLoader,LEGACY_PI_CONFIG_FILES,ModelRuntime,cleanupWindowsSelfUpdateQuarantine,createProjectTrustContext,importLegacyPiConfig,isBuiltinExtension,quarantineWindowsNativeDependencies,resolveProjectTrusted}from"./chunk-IJGXAACA.js";import"./chunk-3LDASCJN.js";import"./chunk-YRYDCKUI.js";import"./chunk-7C4W5HMU.js";import"./chunk-SCBTASM4.js";import"./chunk-G5XUGK4B.js";import"./chunk-3QPE75AR.js";import"./chunk-RWF6IJQL.js";import"./chunk-VRKA3LIT.js";import"./chunk-Y4MPEIY5.js";import"./chunk-WVEIJ437.js";import"./chunk-7ICGN62G.js";import"./chunk-KHBCZ6TR.js";import"./chunk-VIHXG53S.js";import{DefaultPackageManager,SettingsManager}from"./chunk-NKI7L5UM.js";import"./chunk-FEQDJBDL.js";import{DynamicBorder,keyHint,rawKeyHint}from"./chunk-QSMT5KVJ.js";import"./chunk-JCTODLUP.js";import"./chunk-67M7HKXO.js";import"./chunk-U6A4X3FV.js";import"./chunk-USKWGPA6.js";import{initTheme,stopThemeWatcher,theme}from"./chunk-A4KOQUHT.js";import"./chunk-XMWPCJU6.js";import{ProjectTrustStore,hasTrustRequiringProjectResources}from"./chunk-YP47G4YP.js";import"./chunk-Y3TMJV3J.js";import"./chunk-MTQQ2VQH.js";import"./chunk-S5Y7NEHB.js";import"./chunk-OOU3BRUY.js";import"./chunk-Q5CKFBQT.js";import{BUILTIN_PATH_PREFIX}from"./chunk-QMRJYMNH.js";import"./chunk-SQAQEITV.js";import"./chunk-XPSXUKSD.js";import"./chunk-7DWTKE4Z.js";import{runtimeExecArgv}from"./chunk-5BMIET5O.js";import"./chunk-DCI4QOUX.js";import"./chunk-YI6KRJDC.js";import"./chunk-E6UCZ7E5.js";import"./chunk-UYO5Z35O.js";import"./chunk-H52J72VA.js";import"./chunk-VPVD5G32.js";import"./chunk-H4QOEVS5.js";import"./chunk-WO6I5PRF.js";import"./chunk-B3GTID4P.js";import"./chunk-SJWTZ3Z2.js";import"./chunk-VDDJADPV.js";import"./chunk-KLAX467B.js";import"./chunk-RUOTFZQR.js";import{lockWithLossHandling}from"./chunk-QPYDQ4QK.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.js";import"./chunk-7X72IACK.js";import{appendHiddenTuiStdout}from"./chunk-EBZ6IP4V.js";import"./chunk-6ISOXWH2.js";import"./chunk-ZNPH5BWS.js";import"./chunk-6VWIMHMH.js";import"./chunk-SOMFLLPD.js";import"./chunk-ZTPG27EJ.js";import{source_default}from"./chunk-26UBFF6N.js";import"./chunk-HB35RBP4.js";import"./chunk-YU2P3CAR.js";import"./chunk-OT6ALXSJ.js";import"./chunk-KJR3XXMI.js";import"./chunk-IYL5E4QQ.js";import"./chunk-OEFCY46F.js";import"./chunk-KRNXUTZJ.js";import"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-YTKZSGMQ.js";import{Container,Input,Markdown,ProcessTerminal,Spacer,TUI,getKeybindings,matchesKey,truncateToWidth,visibleWidth}from"./chunk-D2ROBVZ4.js";import{killProcessTree}from"./chunk-MCXOJHN2.js";import"./chunk-YU4AYH4C.js";import"./chunk-EVTTLPIY.js";import"./chunk-LNAZ7XEU.js";import"./chunk-DLAY7CIU.js";import"./chunk-GKP34H3C.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-YXL3PNTL.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.js";import"./chunk-TG4E7Z7W.js";import"./chunk-32R442XT.js";import"./chunk-WHPDEDCC.js";import"./chunk-Z7HTHT6K.js";import"./chunk-HK46JMSC.js";import"./chunk-2PGSRQBF.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-AVP6DDBF.js";import"./chunk-3SASTB6Y.js";import"./chunk-5CSZPC55.js";import"./chunk-PJ34QVL5.js";import"./chunk-BMX2U22F.js";import"./chunk-6APXZK7W.js";import"./chunk-WOHQJ6JB.js";import{formatVersionCheckError,getLatestPiRelease,getPiUserAgent,isNewerPackageVersion}from"./chunk-GLTOBXZY.js";import"./chunk-6NPK2O3C.js";import"./chunk-ZFIC2DZV.js";import"./chunk-ZOFZRJSL.js";import"./chunk-6WISUXVI.js";import"./chunk-XVRRNJQD.js";import"./chunk-42XRJQM6.js";import"./chunk-2SOVDETB.js";import"./chunk-UKSFF47T.js";import"./chunk-OM7LH7AP.js";import"./chunk-QEESHRTS.js";import{APP_COMMAND,APP_NAME,CONFIG_DIR_NAME,DISPLAY_VERSION,PACKAGE_NAME,VERSION,brandProfile,canonicalizePath,detectInstallMethod,getAgentDir,getCwdRelativePath,getInstallPackageDir,getSelfUpdateCommand,getSelfUpdateUnavailableInstruction,isLocalPath,resolvePath,spawnProcess,spawnProcessSync,waitForChildProcess}from"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-EYSV6A7S.js";import"./chunk-MIENF2YK.js";import"./chunk-OXNWERO4.js";import"./chunk-QN2BHP3M.js";import"./chunk-AOTHPTMU.js";import"./chunk-O5RYI3IW.js";import{__toESM}from"./chunk-IKOFCODM.js";import{existsSync as existsSync3,mkdirSync as mkdirSync3,mkdtempSync,readdirSync as readdirSync2,readFileSync as readFileSync2,renameSync as renameSync2,rmSync as rmSync2,writeFileSync as writeFileSync2}from"node:fs";import{join as join5,resolve as resolve3}from"node:path";var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{randomUUID}from"node:crypto";import{cpSync,existsSync as existsSync2,mkdirSync as mkdirSync2,readFileSync,renameSync,rmSync,writeFileSync}from"node:fs";import{homedir}from"node:os";import{dirname as dirname2,join as join3,relative as relative2,resolve as resolve2}from"node:path";import{existsSync,readdirSync}from"node:fs";import{join,relative,sep}from"node:path";var REQUIRED_BUILD_ARTIFACTS=["extensions/omo.js","runtime/lsp-daemon/dist/cli.js","runtime/lsp-daemon/dist/index.js","runtime/lsp-daemon/dist/.omo-runtime-manifest.json","scripts/install.mjs"];function walkFiles(rootDir){let files=[],pending=[rootDir];for(;pending.length>0;){let dir=pending.pop();if(dir===void 0)continue;let entries;try{entries=readdirSync(dir,{withFileTypes:!0})}catch(error){if(error instanceof Error)continue;throw error}for(let entry of entries){let full=join(dir,entry.name);entry.isDirectory()?pending.push(full):entry.isFile()&&files.push(full)}}return files}function collectArtifactInventory(pluginPath){let inventory=[],collectUnder=(relativeDir,filter)=>{for(let filePath of walkFiles(join(pluginPath,relativeDir))){let posixPath=relative(pluginPath,filePath).split(sep).join("/");(filter===void 0||filter(posixPath))&&inventory.push(posixPath)}};return collectUnder("extensions"),collectUnder(join("runtime","lsp-daemon","dist")),collectUnder("skills",posixPath=>posixPath.endsWith("/SKILL.md")),existsSync(join(pluginPath,"scripts","install.mjs"))&&inventory.push("scripts/install.mjs"),inventory.sort(),inventory}function currentRequiredBuildArtifactsExist(pluginPath){return findMissingBuildArtifacts(pluginPath).length===0}function findMissingBuildArtifacts(pluginPath){let missing=[];for(let required of REQUIRED_BUILD_ARTIFACTS)existsSync(join(pluginPath,required))||missing.push(required);let skillCount=0;try{for(let entry of readdirSync(join(pluginPath,"skills"),{withFileTypes:!0}))entry.isDirectory()&&existsSync(join(pluginPath,"skills",entry.name,"SKILL.md"))&&skillCount++}catch(error){if(!(error instanceof Error))throw error}return skillCount===0&&missing.push("skills/*/SKILL.md"),missing}import{createHash}from"node:crypto";var EXCLUDED_ROOT_PATHS=new Set([".agents",".claude",".codex",".cursor",".devcontainer",".env.example",".gitattributes",".github",".idea",".mcp.json",".omo",".opencode",".vscode","AGENTS.md","CHANGELOG.md","CLA.md","CLAUDE.md","CONTRIBUTING.md","LICENSE","LICENSE.md","ROADMAP.md","THIRD-PARTY-NOTICES.md","assets","docs"]);function isBuildInputRootPath(name){return!EXCLUDED_ROOT_PATHS.has(name)&&!name.startsWith("README")}function computeBuildInputsHashFromLsTree(lsTreeOutput){let hash=createHash("sha256");for(let entry of lsTreeOutput.split("\0")){let tabIndex=entry.indexOf(" ");if(tabIndex===-1)continue;let name=entry.slice(tabIndex+1);if(!isBuildInputRootPath(name))continue;let objectHash=entry.slice(0,tabIndex).split(" ")[2]??"";hash.update(`${objectHash} ${name}
3
3
  `)}return hash.digest("hex")}import{spawn}from"node:child_process";import{closeSync,mkdirSync,openSync}from"node:fs";import{dirname,join as join2,resolve}from"node:path";import{fileURLToPath}from"node:url";function omoLocalUpdateWorkerLogPath(agentDir){return join2(agentDir,"omo-local-update","worker.log")}function workerCommandArgs(force){let updateArgs=["update","--omo-local-update-worker",...force?["--force"]:[]];if(detectInstallMethod()==="bun-binary")return updateArgs;let modulePath=fileURLToPath(import.meta.url),extension=modulePath.endsWith(".ts")?".ts":".js",cliMainPath=resolve(dirname(modulePath),"..",`cli-main${extension}`);return[...runtimeExecArgv(),cliMainPath,...updateArgs]}var defaultSpawnWorker=request=>{let logPath=omoLocalUpdateWorkerLogPath(request.agentDir);try{mkdirSync(dirname(logPath),{recursive:!0});let logFd=openSync(logPath,"w");try{let child=spawn(process.execPath,workerCommandArgs(request.force),{detached:!0,env:process.env,stdio:["ignore",logFd,logFd]});return child.unref(),{ok:!0,pid:child.pid,logPath}}finally{closeSync(logFd)}}catch(error){return{ok:!1,message:error instanceof Error?error.message:String(error)}}};async function defaultRun(command,args,options){let child=spawnProcess(command,args,{cwd:options.cwd,stdio:["ignore","pipe","pipe"],env:{...process.env,...options.env},detached:process.platform!=="win32",windowsHide:!0}),stdout="",stderr="";child.stdout.on("data",chunk=>{stdout+=chunk.toString()}),child.stderr.on("data",chunk=>{stderr+=chunk.toString()});let abort=new AbortController,timedOut=!1,pid=child.pid,timer=options.timeoutMs===void 0?void 0:setTimeout(()=>{timedOut=!0,pid!==void 0&&killProcessTree(pid),abort.abort()},options.timeoutMs);try{return{code:await waitForChildProcess(child,{signal:abort.signal}),stdout,stderr,timedOut}}finally{timer!==void 0&&clearTimeout(timer)}}function isKillSwitched(env){return env.SENPI_OMO_LOCAL_UPDATE==="0"}function defaultReadJson(path){try{return JSON.parse(readFileSync(path,"utf-8"))}catch{return}}function packageNameOf(json){if(typeof json!="object"||json===null)return;let name=json.name;return typeof name=="string"?name:void 0}function homeDir(){return process.env.HOME||homedir()}async function detectOmoLocalInstall(options){let readJson=options.readJson??defaultReadJson,exists=options.exists??existsSync2;if(options.packages)for(let entry of options.packages){let source=typeof entry=="string"?entry:entry.source;if(!isLocalPath(source))continue;let pluginPath=resolvePath(source,options.agentDir,{homeDir:homeDir(),trim:!0});if(packageNameOf(readJson(join3(pluginPath,"package.json")))!=="@code-yeongyu/omo-senpi")continue;let repoRoot=resolve2(pluginPath,"..","..",".."),omoSenpiPkgPath=join3(repoRoot,"packages","omo-senpi","package.json"),senpiTaskPkgPath=join3(repoRoot,"packages","senpi-task","package.json");if(!exists(omoSenpiPkgPath)||packageNameOf(readJson(omoSenpiPkgPath))!=="@oh-my-opencode/omo-senpi"||!exists(senpiTaskPkgPath)||packageNameOf(readJson(senpiTaskPkgPath))!=="@oh-my-opencode/senpi-task")continue;let topLevel;try{let result=await options.run("git",["-C",repoRoot,"rev-parse","--show-toplevel"],{});if(result.code!==0)continue;topLevel=result.stdout.trim()}catch{continue}if(!(topLevel===""||canonicalizePath(topLevel)!==canonicalizePath(repoRoot)))return{pluginPath,repoRoot}}}function omoLocalUpdateStampPath(agentDir){return join3(agentDir,"omo-local-update-state.json")}function readStamp(agentDir){let json=defaultReadJson(omoLocalUpdateStampPath(agentDir));if(typeof json!="object"||json===null)return;let candidate=json;if(typeof candidate.repoRoot!="string"||typeof candidate.sha!="string"||typeof candidate.omoSenpiTree!="string"||typeof candidate.senpiTaskTree!="string"||typeof candidate.buildInputsHash!="string"||typeof candidate.installedAt!="string"||!Array.isArray(candidate.artifacts))return;let artifacts=[];for(let artifact of candidate.artifacts){if(typeof artifact!="string")return;artifacts.push(artifact)}return{repoRoot:candidate.repoRoot,sha:candidate.sha,omoSenpiTree:candidate.omoSenpiTree,senpiTaskTree:candidate.senpiTaskTree,buildInputsHash:candidate.buildInputsHash,installedAt:candidate.installedAt,artifacts}}function writeStamp(agentDir,stamp){mkdirSync2(agentDir,{recursive:!0}),writeFileSync(omoLocalUpdateStampPath(agentDir),`${JSON.stringify(stamp,null,2)}
4
4
  `,"utf-8")}function shouldSkipUpdate(options){if(options.force)return!1;let stamp=options.stamp;return!stamp||stamp.repoRoot!==options.repoRoot||stamp.sha!==options.remoteSha&&stamp.buildInputsHash!==options.remoteBuildInputsHash||stamp.artifacts.length===0?!1:options.stampArtifactsExist}var OmoLocalStepError=class extends Error{constructor(stage,message,output){super(message),this.name="OmoLocalStepError",this.stage=stage,this.output=output}};function firstErrorLine(result){for(let text of[result.stderr,result.stdout])for(let line of text.split(`
5
5
  `)){let trimmed=line.trim();if(trimmed!=="")return trimmed}return"unknown error"}async function computeRemoteState(options){let{repoRoot,run}=options,git=(args,timeoutMs)=>run("git",args,{cwd:repoRoot,timeoutMs}),requireOk=async(args,timeoutMs)=>{let result=await git(args,timeoutMs);if(result.timedOut)throw new OmoLocalStepError("fetch",`git ${args.join(" ")} timed out`);if(result.code!==0)throw new OmoLocalStepError("fetch",`git ${args.join(" ")}: ${firstErrorLine(result)}`,`${result.stdout}${result.stderr}`);return result.stdout.trim()};await requireOk(["fetch","origin","dev"],12e4);let sha=await requireOk(["rev-parse","origin/dev"]);if(sha==="")throw new OmoLocalStepError("fetch","git rev-parse origin/dev: empty output");let subject=await requireOk(["log","-1","--format=%s","origin/dev"]),omoSenpiTree=await requireOk(["rev-parse","origin/dev:packages/omo-senpi"]),senpiTaskTree=await requireOk(["rev-parse","origin/dev:packages/senpi-task"]),buildInputsHash=computeBuildInputsHashFromLsTree(await requireOk(["ls-tree","-z","origin/dev"]));return{sha,subject,omoSenpiTree,senpiTaskTree,buildInputsHash}}function omoLocalUpdateLockPath(agentDir){return join3(agentDir,"omo-local-update.lock")}function omoLocalUpdateBuildWorktreePath(agentDir){return join3(agentDir,"omo-local-update","build-worktree")}function readLockFile(path){try{let json=JSON.parse(readFileSync(path,"utf-8"));return typeof json.pid!="number"||typeof json.nonce!="string"?void 0:{pid:json.pid,nonce:json.nonce}}catch{return}}function pidIsAlive(pid){try{return process.kill(pid,0),!0}catch(error){return error.code==="EPERM"}}function acquireOmoLocalLock(agentDir,log){mkdirSync2(agentDir,{recursive:!0});let path=omoLocalUpdateLockPath(agentDir),lock={path,pid:process.pid,nonce:randomUUID()},payload=JSON.stringify({pid:lock.pid,nonce:lock.nonce,startedAt:new Date().toISOString()}),tryCreate=()=>{try{return writeFileSync(path,payload,{flag:"wx"}),!0}catch(error){if(error.code==="EEXIST")return!1;throw error}},reportBusy=()=>{let existing2=readLockFile(path);log(source_default.dim(`OMO local plugin update already running (pid ${existing2?.pid??"unknown"}); skipping.`))};if(tryCreate())return lock;let existing=readLockFile(path);if(existing!==void 0&&pidIsAlive(existing.pid))return reportBusy();try{rmSync(path)}catch{}return tryCreate()?lock:reportBusy()}function releaseOmoLocalLock(lock){try{let existing=readLockFile(lock.path);existing!==void 0&&existing.pid===lock.pid&&existing.nonce===lock.nonce&&rmSync(lock.path)}catch{}}var OmoLocalBunMissingError=class extends Error{constructor(){super("bun not found on PATH"),this.name="OmoLocalBunMissingError"}};async function runBunStep(stage,args,worktree,run,timeoutMs){let result;try{result=await run("bun",args,{cwd:worktree,timeoutMs})}catch(error){throw error.code==="ENOENT"?new OmoLocalBunMissingError:new OmoLocalStepError(stage,`bun ${args.join(" ")} failed to start: ${error instanceof Error?error.message:String(error)}`)}let output=`${result.stdout}${result.stderr}`;if(result.timedOut)throw new OmoLocalStepError(stage,`bun ${args.join(" ")} timed out after ${Math.round(timeoutMs/1e3)}s`,output);if(result.code!==0)throw new OmoLocalStepError(stage,`bun ${args.join(" ")} exited with code ${result.code??"unknown"}`,output)}async function ensureBuildWorktree(options){let{worktree,repoRoot,sha,run}=options;if(existsSync2(worktree)){let commonDir=await run("git",["-C",worktree,"rev-parse","--git-common-dir"],{});if(commonDir.code===0&&commonDir.stdout.trim()!==""&&canonicalizePath(resolve2(worktree,commonDir.stdout.trim()))===canonicalizePath(join3(repoRoot,".git"))){let checkout=await run("git",["-C",worktree,"checkout","--detach","--force",sha],{});if(checkout.code!==0)throw new OmoLocalStepError("worktree",`git checkout --detach --force: ${firstErrorLine(checkout)}`,`${checkout.stdout}${checkout.stderr}`);return}((await run("git",["-C",repoRoot,"worktree","remove","--force",worktree],{})).code!==0||existsSync2(worktree))&&rmSync(worktree,{recursive:!0,force:!0})}mkdirSync2(dirname2(worktree),{recursive:!0});let add=await run("git",["-C",repoRoot,"worktree","add","--detach",worktree,sha],{});if(add.code===0)return;await run("git",["-C",repoRoot,"worktree","prune"],{});let retry=await run("git",["-C",repoRoot,"worktree","add","--detach",worktree,sha],{});if(retry.code!==0)throw new OmoLocalStepError("worktree",`git worktree add: ${firstErrorLine(retry)}`,`${add.stdout}${add.stderr}${retry.stdout}${retry.stderr}`)}var defaultFsSeam={cpSync:(source,destination)=>{cpSync(source,destination,{recursive:!0})},renameSync:(oldPath,newPath)=>{renameSync(oldPath,newPath)},rmSync:path=>{rmSync(path,{recursive:!0,force:!0})}},swapCounter=0;function swapPluginDir(options){let seam=options.fs??defaultFsSeam;swapCounter+=1;let tag=`${Date.now()}-${process.pid}-${swapCounter}`,staging=`${options.pluginPath}.staging-${tag}`,prev=`${options.pluginPath}.prev-${tag}`;seam.cpSync(options.sourceDir,staging),seam.renameSync(options.pluginPath,prev);try{seam.renameSync(staging,options.pluginPath)}catch(error){throw seam.renameSync(prev,options.pluginPath),seam.rmSync(staging),error}seam.rmSync(prev)}function firstLine(text){for(let line of text.split(`
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- function normalizeRadiusGatewayUrl(value){return(/^https?:\/\//iu.test(value)?value:`https://${value}`).replace(/\/+$/u,"")}function formatThrownValue(value){return value instanceof Error?value.message||value.name:typeof value=="string"?value:String(value)}var ModelsError=class extends Error{constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}var _a,OAuthTokenEndpointError=class extends Error{constructor(message,status,facts={}){super(message),this.status=status,this.oauthError=facts.oauthError,this.credentialRefused=facts.credentialRefused??!1}};var UNAVAILABLE=Symbol.for("senpi.oauthRefreshUnavailable"),OAuthRefreshUnavailableError=class extends ModelsError{static{_a=UNAVAILABLE}constructor(provider,cause){super("oauth",`OAuth refresh failed for ${provider}`,{cause}),this[_a]=!0,this.name="OAuthRefreshUnavailableError"}};import{createServer}from"node:http";var LOGO_SVG='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800" aria-hidden="true"><path fill="#F09082" d="M165.29 165.29H517.36V400H400V282.65H165.29Z"/><path fill="#4D9ABF" d="M165.29 282.65H282.65V400H400V517.36H282.65V634.72H165.29Z"/><path fill="#F1BE58" d="M517.36 400H634.72V634.72H517.36Z"/></svg>';function escapeHtml(value){return value.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function renderPage(options){let title=escapeHtml(options.title),heading=escapeHtml(options.heading),message=escapeHtml(options.message),details=options.details?escapeHtml(options.details):void 0;return`<!doctype html>
2
+ function normalizeRadiusGatewayUrl(value){return(/^https?:\/\//iu.test(value)?value:`https://${value}`).replace(/\/+$/u,"")}function formatThrownValue(value){return value instanceof Error?value.message||value.name:typeof value=="string"?value:String(value)}var ModelsError=class extends Error{constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}var _a,OAuthTokenEndpointError=class extends Error{constructor(message,status,facts={}){super(message),this.status=status,this.oauthError=facts.oauthError,this.credentialRefused=facts.credentialRefused??!1}};var UNAVAILABLE=Symbol.for("senpi.oauthRefreshUnavailable"),OAuthRefreshUnavailableError=class extends ModelsError{static{_a=UNAVAILABLE}constructor(provider,cause){super("oauth",`OAuth refresh failed for ${provider}`,{cause}),this[_a]=!0,this.name="OAuthRefreshUnavailableError"}};import{createServer}from"node:http";function processSingleton(key,create){let slot=Symbol.for(key),existing=Reflect.get(globalThis,slot);if(existing!==void 0)return existing;let created=create();return Reflect.set(globalThis,slot,created),created}var brandSlot=processSingleton("@code-yeongyu/senpi-ai:oauth-page-brand",()=>({current:void 0}));function escapeHtml(value){return value.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function renderPage(options){let title=escapeHtml(options.title),heading=escapeHtml(options.heading),message=escapeHtml(options.message),details=options.details?escapeHtml(options.details):void 0,brand=brandSlot.current,logo=brand?.logo?`<img class="logo" src="${brand.logo}" alt="" />`:"",brandName=brand?`<div class="brand-name">${escapeHtml(brand.name)}</div>`:"";return`<!doctype html>
3
3
  <html lang="en">
4
4
  <head>
5
5
  <meta charset="utf-8" />
@@ -39,7 +39,14 @@ function normalizeRadiusGatewayUrl(value){return(/^https?:\/\//iu.test(value)?va
39
39
  width: 72px;
40
40
  height: 72px;
41
41
  display: block;
42
+ margin-bottom: 16px;
43
+ }
44
+ .brand-name {
42
45
  margin-bottom: 24px;
46
+ font-size: 15px;
47
+ font-weight: 600;
48
+ letter-spacing: 0.02em;
49
+ color: var(--text-dim);
43
50
  }
44
51
  h1 {
45
52
  margin: 0 0 10px;
@@ -66,7 +73,8 @@ function normalizeRadiusGatewayUrl(value){return(/^https?:\/\//iu.test(value)?va
66
73
  </head>
67
74
  <body>
68
75
  <main>
69
- <div class="logo">${LOGO_SVG}</div>
76
+ ${logo}
77
+ ${brandName}
70
78
  <h1>${heading}</h1>
71
79
  <p>${message}</p>
72
80
  ${details?`<div class="details">${details}</div>`:""}
@@ -1,2 +1,2 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{RgGrepEngine,createRgEngine}from"./chunk-SGS76663.js";import"./chunk-H4QOEVS5.js";import"./chunk-KLAX467B.js";import"./chunk-2SOVDETB.js";import"./chunk-ISZ4EWIS.js";import"./chunk-ATQFN5HI.js";import"./chunk-IKOFCODM.js";export{RgGrepEngine,createRgEngine};
2
+ import{RgGrepEngine,createRgEngine}from"./chunk-VPVD5G32.js";import"./chunk-H4QOEVS5.js";import"./chunk-KLAX467B.js";import"./chunk-2SOVDETB.js";import"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-IKOFCODM.js";export{RgGrepEngine,createRgEngine};
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{MODULE_JOB_KIND,NOTICE_TAIL_MAX_CHARS,TERMINAL_CHILD_JOB_KINDS,TerminalManager,ToolChildJobError,childTerminalIdScope,controlFd,createBashInputTool,createBashOutputTool,createBashResizeTool,createKillBashTool,createModuleJobHandler,createPtyBashTool,goShimScript,runToolChild,sanitizeTerminalOutput,withControlPipe}from"./chunk-QTQ3ES2S.js";import"./chunk-D2ROBVZ4.js";import{getShellConfig}from"./chunk-4SENPCEA.js";import"./chunk-YU4AYH4C.js";import"./chunk-EVTTLPIY.js";import"./chunk-LNAZ7XEU.js";import"./chunk-DLAY7CIU.js";import"./chunk-PX7FF5LE.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-V36CXIIB.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.js";import"./chunk-TG4E7Z7W.js";import"./chunk-32R442XT.js";import"./chunk-WHPDEDCC.js";import"./chunk-MOH5HOHX.js";import"./chunk-HK46JMSC.js";import"./chunk-ED7VJGL4.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-TBARMJ75.js";import"./chunk-3SASTB6Y.js";import"./chunk-5CSZPC55.js";import"./chunk-PJ34QVL5.js";import"./chunk-BMX2U22F.js";import"./chunk-WOHQJ6JB.js";import"./chunk-UKSFF47T.js";import"./chunk-OM7LH7AP.js";import"./chunk-QEESHRTS.js";import"./chunk-ISZ4EWIS.js";import"./chunk-ATQFN5HI.js";import{value_exports}from"./chunk-MIENF2YK.js";import"./chunk-OXNWERO4.js";import{SecretOutputRedactor}from"./chunk-AOTHPTMU.js";import"./chunk-O5RYI3IW.js";import"./chunk-IKOFCODM.js";var PTY_GO_SHIM='stty -echo 2>/dev/null; IFS= read -r _go || exit 127; stty echo 2>/dev/null; exec "$0" "$@"';function parseArgs(value){let field=name=>typeof value=="object"&&value!==null?Reflect.get(value,name):void 0,cwd=field("cwd"),toolCallId=field("toolCallId"),env=field("env");if(typeof cwd!="string"||typeof toolCallId!="string"||typeof env!="object"||env===null)throw new ToolChildJobError("terminal_job_bad_args","a terminal job needs cwd, toolCallId and env");let shellPath=field("shellPath"),timeoutAction=field("timeoutAction");return{params:field("params"),toolCallId,cwd,env:Object.fromEntries(Object.entries(env).filter(entry=>typeof entry[1]=="string")),...typeof shellPath=="string"?{shellPath}:{},defaultCols:Number(field("defaultCols"))||0,defaultRows:Number(field("defaultRows"))||0,redactSecretsInOutput:field("redactSecretsInOutput")===!0,...timeoutAction==="background"||timeoutAction==="kill"?{timeoutAction}:{}}}function barrierFor(job){return{wrap:(command,args)=>({command:"/bin/sh",args:["-c",PTY_GO_SHIM,command,...args]}),async release(session){if(session.pid===void 0)throw new ToolChildJobError("terminal_spawn_failed","the PTY reported no pid");let gated=job.gate.request({jobId:job.jobId,origin:"terminal",api:"pty.spawn",containment:"own-group",lifetime:"owned",pid:session.pid,pgid:session.pid});session.onExit(exitCode=>job.gate.done(gated.launchId,exitCode===null?{}:{exitCode})),job.gate.skipsAckWait||await gated.acked,job.gate.invokeNow(gated.launchId),session.write(`go
2
+ import{MODULE_JOB_KIND,NOTICE_TAIL_MAX_CHARS,TERMINAL_CHILD_JOB_KINDS,TerminalManager,ToolChildJobError,childTerminalIdScope,controlFd,createBashInputTool,createBashOutputTool,createBashResizeTool,createKillBashTool,createModuleJobHandler,createPtyBashTool,goShimScript,runToolChild,sanitizeTerminalOutput,withControlPipe}from"./chunk-YTKZSGMQ.js";import"./chunk-D2ROBVZ4.js";import{getShellConfig}from"./chunk-MCXOJHN2.js";import"./chunk-YU4AYH4C.js";import"./chunk-EVTTLPIY.js";import"./chunk-LNAZ7XEU.js";import"./chunk-DLAY7CIU.js";import"./chunk-GKP34H3C.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-YXL3PNTL.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.js";import"./chunk-TG4E7Z7W.js";import"./chunk-32R442XT.js";import"./chunk-WHPDEDCC.js";import"./chunk-Z7HTHT6K.js";import"./chunk-HK46JMSC.js";import"./chunk-2PGSRQBF.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-AVP6DDBF.js";import"./chunk-3SASTB6Y.js";import"./chunk-5CSZPC55.js";import"./chunk-PJ34QVL5.js";import"./chunk-BMX2U22F.js";import"./chunk-WOHQJ6JB.js";import"./chunk-UKSFF47T.js";import"./chunk-OM7LH7AP.js";import"./chunk-QEESHRTS.js";import"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import{value_exports}from"./chunk-MIENF2YK.js";import"./chunk-OXNWERO4.js";import{SecretOutputRedactor}from"./chunk-AOTHPTMU.js";import"./chunk-O5RYI3IW.js";import"./chunk-IKOFCODM.js";var PTY_GO_SHIM='stty -echo 2>/dev/null; IFS= read -r _go || exit 127; stty echo 2>/dev/null; exec "$0" "$@"';function parseArgs(value){let field=name=>typeof value=="object"&&value!==null?Reflect.get(value,name):void 0,cwd=field("cwd"),toolCallId=field("toolCallId"),env=field("env");if(typeof cwd!="string"||typeof toolCallId!="string"||typeof env!="object"||env===null)throw new ToolChildJobError("terminal_job_bad_args","a terminal job needs cwd, toolCallId and env");let shellPath=field("shellPath"),timeoutAction=field("timeoutAction");return{params:field("params"),toolCallId,cwd,env:Object.fromEntries(Object.entries(env).filter(entry=>typeof entry[1]=="string")),...typeof shellPath=="string"?{shellPath}:{},defaultCols:Number(field("defaultCols"))||0,defaultRows:Number(field("defaultRows"))||0,redactSecretsInOutput:field("redactSecretsInOutput")===!0,...timeoutAction==="background"||timeoutAction==="kill"?{timeoutAction}:{}}}function barrierFor(job){return{wrap:(command,args)=>({command:"/bin/sh",args:["-c",PTY_GO_SHIM,command,...args]}),async release(session){if(session.pid===void 0)throw new ToolChildJobError("terminal_spawn_failed","the PTY reported no pid");let gated=job.gate.request({jobId:job.jobId,origin:"terminal",api:"pty.spawn",containment:"own-group",lifetime:"owned",pid:session.pid,pgid:session.pid});session.onExit(exitCode=>job.gate.done(gated.launchId,exitCode===null?{}:{exitCode})),job.gate.skipsAckWait||await gated.acked,job.gate.invokeNow(gated.launchId),session.write(`go
3
3
  `)}}}function exitSummary(id,runtime){let output=sanitizeTerminalOutput(runtime.fullOutput()).trimEnd(),exit=runtime.exitResult;return{event:"background_exit",id,exit:exit===null?null:{exitCode:exit.exitCode,signal:exit.signal,cancelled:exit.cancelled,timedOut:exit.timedOut},output:output.length>NOTICE_TAIL_MAX_CHARS?output.slice(output.length-NOTICE_TAIL_MAX_CHARS-1):output}}function createTerminalJobHandlers(injected){let manager=injected,managerFor=generation=>(manager??=new TerminalManager({idScope:childTerminalIdScope(generation)}),manager),tell=(job,wake)=>{job.wake(TERMINAL_CHILD_JOB_KINDS.bash,wake).catch(error=>{process.stderr.write(`tool-child: terminal ${wake.event} for ${wake.id} not delivered: ${error instanceof Error?error.message:String(error)}
4
4
  `)})},contextFor=(args,job)=>({manager:managerFor(job.generation),...args.timeoutAction===void 0?{}:{timeoutAction:args.timeoutAction},onBackgroundStart:(id,description,startedAtMs)=>tell(job,{event:"background_start",id,description,startedAtMs}),onBackgroundExit:(id,runtime)=>tell(job,exitSummary(id,runtime)),cwd:args.cwd,...args.shellPath===void 0?{}:{shellPath:args.shellPath},defaultCols:args.defaultCols,defaultRows:args.defaultRows,redactSecretsInOutput:args.redactSecretsInOutput,getEnv:()=>({...args.env}),launchBarrier:barrierFor(job)}),run=create=>async(value,job)=>{let args=parseArgs(value),tool=create(contextFor(args,job));if(!value_exports.Check(tool.parameters,args.params))throw new ToolChildJobError("terminal_job_bad_args","the tool's parameters do not match its schema");let onUpdate=update=>{job.update(update).catch(error=>{process.stderr.write(`tool-child: ${args.toolCallId} update not sent: ${error instanceof Error?error.message:String(error)}
5
5
  `)})};return tool.execute(args.toolCallId,args.params,job.signal,onUpdate,{cwd:args.cwd})};return{[TERMINAL_CHILD_JOB_KINDS.bash]:run(createPtyBashTool),[TERMINAL_CHILD_JOB_KINDS.output]:run(createBashOutputTool),[TERMINAL_CHILD_JOB_KINDS.input]:run(createBashInputTool),[TERMINAL_CHILD_JOB_KINDS.resize]:run(createBashResizeTool),[TERMINAL_CHILD_JOB_KINDS.kill]:run(createKillBashTool)}}import{access}from"node:fs/promises";import{constants as osConstants}from"node:os";import{spawn}from"node:child_process";import{once}from"node:events";import{Socket}from"node:net";async function launchOwnGroup(launch){if(process.platform==="win32")throw new Error("launchOwnGroup is POSIX-only; Windows launches are contained by the job");let callerStdio=[...launch.options?.stdio??["ignore","pipe","pipe"]],fd=controlFd(callerStdio),shim=spawn("/bin/sh",["-c",goShimScript(fd),launch.program,...launch.args],{...launch.options,detached:!0,stdio:withControlPipe(callerStdio,fd,"ignore","pipe")}),pid=shim.pid,exited=once(shim,"exit").then(([exitCode,signal])=>({exitCode,signal}));if(pid===void 0)throw new Error(`could not start ${launch.program}`);let gated=launch.gate.request({jobId:launch.jobId,origin:launch.origin,api:launch.api,containment:"own-group",lifetime:launch.lifetime??"owned",pid,pgid:pid});if(exited.then(({exitCode,signal})=>launch.gate.done(gated.launchId,{...exitCode===null?{}:{exitCode},...signal===null?{}:{signal}})),launch.gate.skipsAckWait||await Promise.race([gated.acked,exited]),shim.exitCode===null&&shim.signalCode===null){launch.gate.invokeNow(gated.launchId);let control=shim.stdio[fd];control instanceof Socket&&(control.on("error",()=>{}),exited.then(()=>control.destroy()),control.unref(),control.write(`go
@@ -0,0 +1,2 @@
1
+ import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
+ import{STORE_BUSY,writeHealthUnlessStoreBusy}from"./chunk-E7SA75PP.js";import{pickRotationSlot}from"./chunk-7KIHKE2T.js";import{getConfigValueEnvVarNames,isCommittedRotationOutput,isRotationStreamStart,resolveConfigValue,rotationErrorFromEvent}from"./chunk-B3GTID4P.js";import{emitProviderAccountFailover,emitProviderAccountsChanged,slotsOfOwnKind}from"./chunk-SJWTZ3Z2.js";import{discoverEnvSlots}from"./chunk-VDDJADPV.js";import"./chunk-KLAX467B.js";import{acquireHalfOpenLease,applicableStoredState}from"./chunk-RUOTFZQR.js";import"./chunk-QPYDQ4QK.js";import"./chunk-GZVCRV7I.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.js";import"./chunk-7X72IACK.js";import"./chunk-EBZ6IP4V.js";import{classifyCredentialFailure,runCredentialFailover}from"./chunk-6ISOXWH2.js";import"./chunk-ZNPH5BWS.js";import{activeModelBlockUntil,modelBlockKey,pruneModelBlocks,withModelBlock}from"./chunk-6VWIMHMH.js";import"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-MCXOJHN2.js";import"./chunk-YU4AYH4C.js";import"./chunk-EVTTLPIY.js";import"./chunk-LNAZ7XEU.js";import"./chunk-DLAY7CIU.js";import"./chunk-GKP34H3C.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-YXL3PNTL.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.js";import"./chunk-TG4E7Z7W.js";import"./chunk-32R442XT.js";import"./chunk-WHPDEDCC.js";import"./chunk-Z7HTHT6K.js";import"./chunk-HK46JMSC.js";import"./chunk-2PGSRQBF.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import{ConfigReferenceError}from"./chunk-AVP6DDBF.js";import"./chunk-3SASTB6Y.js";import"./chunk-5CSZPC55.js";import"./chunk-PJ34QVL5.js";import"./chunk-BMX2U22F.js";import"./chunk-WOHQJ6JB.js";import"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-IKOFCODM.js";import{createHash,randomUUID}from"node:crypto";async function releaseProbeLease(repository,providerId,lane,slotName,leaseId){await writeHealthUnlessStoreBusy(`lease release on ${slotName}`,()=>repository.mutateSlotState(providerId,lane,slotName,current=>{if(current?.lease?.id!==leaseId)return current;let{lease:_released,...rest}=current;return rest}))}async function releaseLeaseIfModelBlocked(repository,providerId,lane,slotName,leaseId,until){until!==void 0&&await releaseProbeLease(repository,providerId,lane,slotName,leaseId)}async function probeInFlight(repository,providerId,lane,slot,isApplicable,now){let state=(await repository.listSlots(providerId,lane))[slot.name],lease=isApplicable(state)?state?.lease:void 0;if(!(lease===void 0||lease.expiresAt<=now))return{...slot,blockedUntil:lease.expiresAt,blockReason:PROBE_IN_FLIGHT}}var PROBE_IN_FLIGHT="probe_in_flight";function probeLease(repository,providerId,lane,slotName,now){return writeHealthUnlessStoreBusy(`probe lease on ${slotName}`,()=>acquireHalfOpenLease(repository,providerId,lane,slotName,{now}))}function overlayState(slot,state){return state?{...slot,...state.blockedUntil===void 0?{}:{blockedUntil:state.blockedUntil},...state.blockReason===void 0?{}:{blockReason:state.blockReason},...state.failureCount===void 0?{}:{failureCount:state.failureCount},...state.lease===void 0?{}:{lease:state.lease}}:slot}function overlayModelBlock(slot,until){return until===void 0||slot.blockedUntil!==void 0&&slot.blockedUntil>=until?slot:{...slot,blockedUntil:until,blockReason:slot.blockReason??"rate_limit"}}var warnedSlotReferences=new Set;async function listRotationSlots(sources,options={}){let acquireLeases=options.acquireLeases!==!1,modelId=options.modelId,now=sources.now??Date.now,{providerId,credential,env,repository}=sources,policySlots=[],referenceError;for(let[name,ref]of Object.entries(sources.policy?.slots??{})){let envVarName=ref.env??`models.json:${name}`,key;try{key=ref.env!==void 0?env(ref.env):ref.value!==void 0?await resolveConfigValue(ref.value,typeof ref.value=="string"?{}:Object.fromEntries(getConfigValueEnvVarNames(ref.value).flatMap(variable=>{let value=env(variable);return value===void 0?[]:[[variable,value]]}))):void 0}catch(error){if(!(error instanceof ConfigReferenceError))throw error;let notice=`${error.field}: configuration reference ${error.reason}; skipping credential slot`;warnedSlotReferences.has(notice)||(warnedSlotReferences.add(notice),console.warn(notice)),referenceError??=error;continue}key&&policySlots.push({name,envVarName,key,source:"env"})}if(credential){let state=await repository.listSlots(providerId,"stored"),slots=[];for(let slot of slotsOfOwnKind(credential)){let persisted=state[slot.name],revisions=await repository.storedSlotRevisions(providerId,slot.name,{key:slot.key,access:slot.access,refresh:slot.refresh}),storedRevision=revisions.account,materialRevision=revisions.material,applicable=applicableStoredState(persisted,revisions),modelUntil=activeModelBlockUntil(applicable?.modelBlocks,modelId,now()),lease;if(acquireLeases&&modelUntil===void 0&&applicable?.blockedUntil!==void 0&&applicable.blockedUntil<=now()&&(lease=await probeLease(repository,providerId,"stored",slot.name,now()),lease===void 0)){let inFlight=await probeInFlight(repository,providerId,"stored",{name:slot.name,lane:"stored",pinned:credential.pinned===slot.name,storedRevision},state2=>state2?.credentialRevision===storedRevision,now());inFlight!==void 0&&slots.push(inFlight);continue}if(lease!==void 0&&lease!==STORE_BUSY){let leasedState=(await repository.listSlots(providerId,"stored"))[slot.name],leasedApplicable=applicableStoredState(leasedState,revisions),leasedModelUntil=activeModelBlockUntil(leasedApplicable?.modelBlocks,modelId,now());await releaseLeaseIfModelBlocked(repository,providerId,"stored",slot.name,lease.leaseId,leasedModelUntil),slots.push(overlayModelBlock(overlayState({name:slot.name,lane:"stored",pinned:credential.pinned===slot.name,storedRevision,materialRevision,...leasedModelUntil===void 0?{heldLeaseId:lease.leaseId}:{}},leasedApplicable),leasedModelUntil));continue}slots.push(overlayModelBlock(overlayState({name:slot.name,lane:"stored",pinned:credential.pinned===slot.name,storedRevision,materialRevision},applicable),modelUntil))}if(policySlots.length===0){if(slots.length===0&&referenceError!==void 0)throw referenceError;return slots}let namedSources={...sources,credential:void 0,policy:{...sources.policy,slots:{}}},namedSlots=await listEnvRotationSlots(namedSources,policySlots,acquireLeases,modelId);return[...slots,...namedSlots]}let envSlots=[...discoverEnvSlots(providerId,env),...policySlots];if(envSlots.length===0&&referenceError!==void 0)throw referenceError;return listEnvRotationSlots(sources,envSlots,acquireLeases,modelId)}async function listEnvRotationSlots(sources,envSlots,acquireLeases,modelId){if(envSlots.length===0)return[];let{providerId,repository}=sources,now=sources.now??Date.now,state=await repository.listSlots(providerId,"env"),slots=[];for(let slot of envSlots){let persisted=state[slot.name],revision=await repository.envCredentialRevision(slot.envVarName,slot.key),applicable=persisted?.credentialRevision===revision?persisted:void 0,modelUntil=activeModelBlockUntil(applicable?.modelBlocks,modelId,now()),heldLeaseId;if(acquireLeases&&modelUntil===void 0&&applicable?.blockedUntil!==void 0&&applicable.blockedUntil<=now()){let lease=await probeLease(repository,providerId,"env",slot.name,now());if(lease===void 0){let inFlight=await probeInFlight(repository,providerId,"env",{name:slot.name,lane:"env",envKey:slot.key,envVarName:slot.envVarName},state2=>state2?.credentialRevision===revision,now());inFlight!==void 0&&slots.push(inFlight);continue}if(lease!==STORE_BUSY){let leasedState=(await repository.listSlots(providerId,"env"))[slot.name];applicable=leasedState?.credentialRevision===revision?leasedState:void 0,modelUntil=activeModelBlockUntil(applicable?.modelBlocks,modelId,now()),await releaseLeaseIfModelBlocked(repository,providerId,"env",slot.name,lease.leaseId,modelUntil),modelUntil===void 0&&(heldLeaseId=lease.leaseId)}}slots.push(overlayModelBlock(overlayState({name:slot.name,lane:"env",envKey:slot.key,envVarName:slot.envVarName,...heldLeaseId===void 0?{}:{heldLeaseId}},applicable),modelUntil))}return slots}var sha256SlotHasher=input=>createHash("sha256").update(input).digest().readBigUInt64BE(0);function modelBlockPatch(family,modelId,blockedUntil,current,now,credentialRevision){let sameMaterial=current!==void 0&&current.credentialRevision===credentialRevision,{stateVersion:_stateVersion,...kept}=sameMaterial?current:{stateVersion:0};return{...kept,lease:void 0,...credentialRevision===void 0?{}:{credentialRevision},modelBlocks:withModelBlock(sameMaterial?current.modelBlocks:void 0,modelBlockKey(family,modelId),blockedUntil,now)}}function blockPatch(block,current,now,credentialRevision,policy,modelId){if(block.reason==="rate_limit"&&block.modelFamily!==void 0&&modelId!==void 0){let blockedUntil=now+Math.min(policy?.cooldownCapMs??block.cooldownMs,block.cooldownMs);return modelBlockPatch(block.modelFamily,modelId,blockedUntil,current,now,credentialRevision)}let failureCount=(current?.failureCount??0)+1,liveModelBlocks=current?.credentialRevision===credentialRevision?pruneModelBlocks(current?.modelBlocks,now):void 0,base={failureCount,...credentialRevision===void 0?{}:{credentialRevision},...current?.lastSuccessAt===void 0?{}:{lastSuccessAt:current.lastSuccessAt},...liveModelBlocks===void 0?{}:{modelBlocks:liveModelBlocks}};return block.reason==="rate_limit"?{...base,blockedUntil:now+Math.min(policy?.cooldownCapMs??block.cooldownMs,block.cooldownMs),blockReason:"rate_limit"}:block.reason==="auth_error"?{...base,blockedUntil:now+9e5,blockReason:"auth_error"}:{...base,blockReason:block.reason}}function failoverReason(block){return block.reason==="account_disabled"?"billing":block.reason}function streamWithCredentialRotation(options){let{sources,runAttempt}=options,hasher=options.hasher??sha256SlotHasher,affinityKey=options.affinityKey??randomUUID(),useAffinity=sources.policy?.affinity!==!1,pooled=sources.credential,now=sources.now??Date.now,leaving;return runCredentialFailover({listSlots:()=>listRotationSlots(sources,options.modelId===void 0?{}:{modelId:options.modelId}),select:candidates=>{let winner=pickRotationSlot(candidates,{affinityKey,useAffinity,hasher,order:pooled?.order});if(!winner)throw new Error("credential rotation selected from an empty candidate set");return winner},runAttempt:slot=>(leaving!==void 0&&leaving.name!==slot.name&&emitProviderAccountFailover(sources.providerId,leaving.name,slot.name,failoverReason(leaving.block)),leaving=void 0,runAttempt(slot)),onRotate:({slot,block,committedOutput})=>{leaving=committedOutput?void 0:{name:slot.name,block}},isCommittedOutput:isCommittedRotationOutput,isStreamStart:isRotationStreamStart,errorFromEvent:rotationErrorFromEvent,classify:(error,context)=>classifyCredentialFailure(error,{...context,nowMs:now(),cooldownBaseMs:sources.policy?.cooldownBaseMs,cooldownCapMs:sources.policy?.cooldownCapMs}),onSuccess:async slot=>{let released=!1;await writeHealthUnlessStoreBusy(`success on ${slot.name}`,()=>sources.repository.mutateSlotState(sources.providerId,slot.lane,slot.name,current=>{if(!current)return;let modelBlocks=pruneModelBlocks(current.modelBlocks,now(),options.modelId);return released=current.blockedUntil!==void 0||current.blockReason!==void 0||Object.keys(modelBlocks??{}).length!==Object.keys(current.modelBlocks??{}).length,{...current,...slot.storedRevision===void 0?{}:{credentialRevision:slot.storedRevision},lastSuccessAt:now(),lease:void 0,blockedUntil:void 0,blockReason:void 0,failureCount:void 0,modelBlocks}}))!==STORE_BUSY&&released&&emitProviderAccountsChanged(sources.providerId)},releaseSlot:async slot=>{slot.heldLeaseId!==void 0&&await releaseProbeLease(sources.repository,sources.providerId,slot.lane,slot.name,slot.heldLeaseId)},persistBlock:async(slot,block)=>{let revision=slot.lane==="env"&&slot.envVarName!==void 0&&slot.envKey!==void 0?await sources.repository.envCredentialRevision(slot.envVarName,slot.envKey):block.reason==="auth_error"?slot.materialRevision:slot.storedRevision;await writeHealthUnlessStoreBusy(`${block.reason} block on ${slot.name}`,()=>sources.repository.mutateSlotState(sources.providerId,slot.lane,slot.name,current=>blockPatch(block,current,now(),revision,sources.policy,options.modelId)))!==STORE_BUSY&&emitProviderAccountsChanged(sources.providerId)},now})}export{listRotationSlots,sha256SlotHasher,streamWithCredentialRotation};
@@ -0,0 +1,2 @@
1
+ import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
+ import{runRpcMode}from"./chunk-IJGXAACA.js";import"./chunk-3LDASCJN.js";import"./chunk-YRYDCKUI.js";import"./chunk-7C4W5HMU.js";import"./chunk-SCBTASM4.js";import"./chunk-G5XUGK4B.js";import"./chunk-3QPE75AR.js";import"./chunk-RWF6IJQL.js";import"./chunk-VRKA3LIT.js";import"./chunk-Y4MPEIY5.js";import"./chunk-WVEIJ437.js";import"./chunk-7ICGN62G.js";import"./chunk-KHBCZ6TR.js";import"./chunk-VIHXG53S.js";import"./chunk-NKI7L5UM.js";import"./chunk-FEQDJBDL.js";import"./chunk-QSMT5KVJ.js";import"./chunk-JCTODLUP.js";import"./chunk-67M7HKXO.js";import"./chunk-U6A4X3FV.js";import"./chunk-USKWGPA6.js";import"./chunk-A4KOQUHT.js";import"./chunk-XMWPCJU6.js";import"./chunk-YP47G4YP.js";import"./chunk-Y3TMJV3J.js";import"./chunk-MTQQ2VQH.js";import"./chunk-S5Y7NEHB.js";import"./chunk-OOU3BRUY.js";import"./chunk-Q5CKFBQT.js";import"./chunk-QMRJYMNH.js";import"./chunk-SQAQEITV.js";import"./chunk-XPSXUKSD.js";import"./chunk-7DWTKE4Z.js";import"./chunk-5BMIET5O.js";import"./chunk-DCI4QOUX.js";import"./chunk-YI6KRJDC.js";import"./chunk-E6UCZ7E5.js";import"./chunk-UYO5Z35O.js";import"./chunk-H52J72VA.js";import"./chunk-VPVD5G32.js";import"./chunk-H4QOEVS5.js";import"./chunk-WO6I5PRF.js";import"./chunk-B3GTID4P.js";import"./chunk-SJWTZ3Z2.js";import"./chunk-VDDJADPV.js";import"./chunk-KLAX467B.js";import"./chunk-RUOTFZQR.js";import"./chunk-QPYDQ4QK.js";import"./chunk-GZVCRV7I.js";import"./chunk-KUPQO7MC.js";import"./chunk-U3VOXCGP.js";import"./chunk-7X72IACK.js";import"./chunk-EBZ6IP4V.js";import"./chunk-6ISOXWH2.js";import"./chunk-ZNPH5BWS.js";import"./chunk-6VWIMHMH.js";import"./chunk-SOMFLLPD.js";import"./chunk-ZTPG27EJ.js";import"./chunk-26UBFF6N.js";import"./chunk-HB35RBP4.js";import"./chunk-YU2P3CAR.js";import"./chunk-OT6ALXSJ.js";import"./chunk-KJR3XXMI.js";import"./chunk-IYL5E4QQ.js";import"./chunk-OEFCY46F.js";import"./chunk-KRNXUTZJ.js";import"./chunk-AC72EWI5.js";import"./chunk-RQFD6LG2.js";import"./chunk-YTKZSGMQ.js";import"./chunk-D2ROBVZ4.js";import"./chunk-MCXOJHN2.js";import"./chunk-YU4AYH4C.js";import"./chunk-EVTTLPIY.js";import"./chunk-LNAZ7XEU.js";import"./chunk-DLAY7CIU.js";import"./chunk-GKP34H3C.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-YXL3PNTL.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.js";import"./chunk-TG4E7Z7W.js";import"./chunk-32R442XT.js";import"./chunk-WHPDEDCC.js";import"./chunk-Z7HTHT6K.js";import"./chunk-HK46JMSC.js";import"./chunk-2PGSRQBF.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-AVP6DDBF.js";import"./chunk-3SASTB6Y.js";import"./chunk-5CSZPC55.js";import"./chunk-PJ34QVL5.js";import"./chunk-BMX2U22F.js";import"./chunk-6APXZK7W.js";import"./chunk-WOHQJ6JB.js";import"./chunk-GLTOBXZY.js";import"./chunk-6NPK2O3C.js";import"./chunk-ZFIC2DZV.js";import"./chunk-ZOFZRJSL.js";import"./chunk-6WISUXVI.js";import"./chunk-XVRRNJQD.js";import"./chunk-42XRJQM6.js";import"./chunk-2SOVDETB.js";import"./chunk-UKSFF47T.js";import"./chunk-OM7LH7AP.js";import"./chunk-QEESHRTS.js";import"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-EYSV6A7S.js";import"./chunk-MIENF2YK.js";import"./chunk-OXNWERO4.js";import"./chunk-QN2BHP3M.js";import"./chunk-AOTHPTMU.js";import"./chunk-O5RYI3IW.js";import"./chunk-IKOFCODM.js";export{runRpcMode};
@@ -1,3 +1,3 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{allocateMonitorId,endpointSockets,matchesTask,subscriptionFor,wantsRecord}from"./chunk-3ESZE3DG.js";import"./chunk-XGBRBCIQ.js";import{connectAuthenticatedRpcSocket,socketNeedsHandshake}from"./chunk-GDPWQJDQ.js";import"./chunk-FNBEICAA.js";import{OBSERVE_REQUEST_FIELD}from"./chunk-E6UCZ7E5.js";import"./chunk-UYO5Z35O.js";import{MAX_RPC_LINE_CHARACTERS,attachJsonlLineReader}from"./chunk-H52J72VA.js";import{readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,socketSecretPath}from"./chunk-QEESHRTS.js";import"./chunk-ISZ4EWIS.js";import"./chunk-ATQFN5HI.js";import"./chunk-O5RYI3IW.js";import"./chunk-IKOFCODM.js";var DELTA_KINDS=new Set(["message_update","tool_execution_update","bash_execution_update"]),SURFACE_KINDS=new Set(["loaded_surfaces_changed","commands_changed"]),LAST_TEXT_LIMIT=60,RpcMonitorCoalescer=class{#windows=new Map;#flush;constructor(flush){this.#flush=flush}accept(sessionKey2,label,record){let type=String(record.type),delta=DELTA_KINDS.has(type);if(!delta&&!SURFACE_KINDS.has(type))return!1;let key=delta?`${sessionKey2}#deltas`:`${sessionKey2}#${type}`,open=this.#windows.get(key),last=delta?lastText(record):"";if(open!==void 0)return open.count+=1,last!==""&&(open.last=last),!0;let window={count:1,last,timer:setTimeout(()=>{this.#windows.delete(key),this.#flush(delta?`rpc ${label()} streaming +${window.count} deltas${window.last===""?"":` (last: "${window.last}")`}`:`rpc ${label()} ${type} x${window.count}`)},delta?2e3:5e3)};return this.#windows.set(key,window),!0}dispose(){for(let window of this.#windows.values())clearTimeout(window.timer);this.#windows.clear()}};function lastText(record){let event=record.assistantMessageEvent,flat=(event?.type==="text_delta"&&typeof event.delta=="string"?event.delta:typeof record.output=="string"?record.output:"").replace(/\s+/g," ").trim();return flat.length>LAST_TEXT_LIMIT?flat.slice(-LAST_TEXT_LIMIT):flat}import{createConnection}from"node:net";var SUBSCRIBE_ID="monitor-subscribe";async function openRpcObserver(socketPath,subscription,handlers,options={}){let secret=socketNeedsHandshake(socketPath)?await readSocketSecret(socketSecretPath(socketPath)):void 0,authenticated=socketNeedsHandshake(socketPath)?void 0:await connectAuthenticatedRpcSocket(socketPath,void 0,options),socket=authenticated?.socket??createConnection(resolveSocketTransportAddress(socketPath,process.platform,secret)),answer=Promise.withResolvers(),ended=!1,end=reason=>{ended||(ended=!0,answer.reject(new Error(`rpc monitor: ${socketPath}: ${reason}`)),handlers.closed(reason))},subscribe=()=>{secret!==void 0&&sendSocketHandshake(socket,secret);let frame={...subscription,[OBSERVE_REQUEST_FIELD]:!0,id:SUBSCRIBE_ID,type:"subscribe_sessions"};socket.write(`${JSON.stringify(frame)}
2
+ import{allocateMonitorId,endpointSockets,matchesTask,subscriptionFor,wantsRecord}from"./chunk-KHBCZ6TR.js";import"./chunk-Q5CKFBQT.js";import{connectAuthenticatedRpcSocket,socketNeedsHandshake}from"./chunk-XPSXUKSD.js";import"./chunk-YI6KRJDC.js";import{OBSERVE_REQUEST_FIELD}from"./chunk-E6UCZ7E5.js";import"./chunk-UYO5Z35O.js";import{MAX_RPC_LINE_CHARACTERS,attachJsonlLineReader}from"./chunk-H52J72VA.js";import{readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,socketSecretPath}from"./chunk-QEESHRTS.js";import"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-O5RYI3IW.js";import"./chunk-IKOFCODM.js";var DELTA_KINDS=new Set(["message_update","tool_execution_update","bash_execution_update"]),SURFACE_KINDS=new Set(["loaded_surfaces_changed","commands_changed"]),LAST_TEXT_LIMIT=60,RpcMonitorCoalescer=class{#windows=new Map;#flush;constructor(flush){this.#flush=flush}accept(sessionKey2,label,record){let type=String(record.type),delta=DELTA_KINDS.has(type);if(!delta&&!SURFACE_KINDS.has(type))return!1;let key=delta?`${sessionKey2}#deltas`:`${sessionKey2}#${type}`,open=this.#windows.get(key),last=delta?lastText(record):"";if(open!==void 0)return open.count+=1,last!==""&&(open.last=last),!0;let window={count:1,last,timer:setTimeout(()=>{this.#windows.delete(key),this.#flush(delta?`rpc ${label()} streaming +${window.count} deltas${window.last===""?"":` (last: "${window.last}")`}`:`rpc ${label()} ${type} x${window.count}`)},delta?2e3:5e3)};return this.#windows.set(key,window),!0}dispose(){for(let window of this.#windows.values())clearTimeout(window.timer);this.#windows.clear()}};function lastText(record){let event=record.assistantMessageEvent,flat=(event?.type==="text_delta"&&typeof event.delta=="string"?event.delta:typeof record.output=="string"?record.output:"").replace(/\s+/g," ").trim();return flat.length>LAST_TEXT_LIMIT?flat.slice(-LAST_TEXT_LIMIT):flat}import{createConnection}from"node:net";var SUBSCRIBE_ID="monitor-subscribe";async function openRpcObserver(socketPath,subscription,handlers,options={}){let secret=socketNeedsHandshake(socketPath)?await readSocketSecret(socketSecretPath(socketPath)):void 0,authenticated=socketNeedsHandshake(socketPath)?void 0:await connectAuthenticatedRpcSocket(socketPath,void 0,options),socket=authenticated?.socket??createConnection(resolveSocketTransportAddress(socketPath,process.platform,secret)),answer=Promise.withResolvers(),ended=!1,end=reason=>{ended||(ended=!0,answer.reject(new Error(`rpc monitor: ${socketPath}: ${reason}`)),handlers.closed(reason))},subscribe=()=>{secret!==void 0&&sendSocketHandshake(socket,secret);let frame={...subscription,[OBSERVE_REQUEST_FIELD]:!0,id:SUBSCRIBE_ID,type:"subscribe_sessions"};socket.write(`${JSON.stringify(frame)}
3
3
  `)},detach=attachJsonlLineReader(socket,line=>{let record;try{record=JSON.parse(line)}catch{return}if(record.type==="response"&&record.id===SUBSCRIBE_ID){record.success===!0?answer.resolve(record):(answer.reject(new Error(`rpc monitor: ${socketPath} refused the subscription: ${String(record.error)}`)),socket.destroy());return}handlers.record(record)},{maxLineLength:MAX_RPC_LINE_CHARACTERS});return socket.on("error",error=>end(error.message)),socket.once("close",()=>{detach(),end("connection closed")}),authenticated?subscribe():socket.once("connect",subscribe),{subscribed:answer.promise,close:()=>socket.destroy()}}var RpcMonitorRenderer=class{#sessions=new Map;#namedThisBatch=new Set;seed(socket,snapshot){return snapshot.map(row=>{let view=this.#view(socket,row);view.status=String(row.status);let model=modelId(row.model),attachments=typeof row.attachments=="number"?row.attachments:0;return`${view.label} ${view.status} (${attachments} attached${model===void 0?"":`, model ${model}`})`})}forgetSocket(socket){let count2=0;for(let key of[...this.#sessions.keys()])key.startsWith(`${socket}#`)&&(this.#sessions.delete(key),count2++);return count2}statuses(){return new Map([...this.#sessions].map(([key,view])=>[key,view.status]))}label(socket,record){let view=this.#view(socket,record),key=sessionKey(socket,record);return this.#namedThisBatch.has(key)?view.label:(this.#namedThisBatch.size===0&&queueMicrotask(()=>this.#namedThisBatch.clear()),this.#namedThisBatch.add(key),`${view.label} (${String(record.sessionId)})`)}render(socket,record){switch(record.type){case"session_status":return this.#status(socket,record);case"effect_status":{let detail=record.disposition??reasonOf(record.outcome);return`rpc ${this.label(socket,record)} effect ${String(record.kind)} ${tail(String(record.effectId))} ${String(record.state)}${detail===void 0?"":` (${String(detail)})`}`}case"agent_end":return`rpc ${this.label(socket,record)} agent_end${record.aborted===!0?` aborted(${String(record.abortSource??"user")})`:""}`;case"model_changed":return`rpc ${this.label(socket,record)} model_changed -> ${modelId(record.model)??"?"}${record.source===void 0?"":` (${String(record.source)})`}`;case"queue_update":return`rpc ${this.label(socket,record)} queue_update steering=${count(record.steering)} followUp=${count(record.followUp)}`;case"session_replaced":return`rpc ${this.label(socket,record)} session_replaced -> ${String(record.durableSessionId??record.newSessionId??"?")}`;case"session_closed":return`rpc ${this.label(socket,record)} session_closed ${String(record.reason??"")}`.trimEnd();case"extension_event":return`rpc ${this.label(socket,record)} extension_event ${String(record.name??record.event??"")}`.trimEnd();case"entry_appended":return`rpc ${this.label(socket,record)} entry_appended ${entryType(record)}`;case"tool_execution_start":case"tool_execution_end":return`rpc ${this.label(socket,record)} tool ${String(record.toolName??"?")} ${record.type==="tool_execution_start"?"started":"ended"}`;case"turn_end":case"turn_start":case"agent_start":case"agent_idle":case"agent_settled":return`rpc ${this.label(socket,record)} ${record.type}`;default:{let{type:_type,sessionId:_sessionId,...rest}=record,json=JSON.stringify(rest),body=json.length>160?`${json.slice(0,160)}...`:json;return`rpc ${this.label(socket,record)} ${String(record.type)} ${body}`}}}#status(socket,record){let view=this.#view(socket,record),to=String(record.status),from=view.status;if(view.status=to,from===to)return;let change=record.lastChange,why=change===void 0?"":` (${String(change.cause)}, by ${String(change.by)})`;return`rpc ${this.label(socket,record)} status ${from} -> ${to}${why} seq=${String(record.seq)}`}#view(socket,record){let key=sessionKey(socket,record),view=this.#sessions.get(key);return view===void 0?(view={label:labelOf(record),status:"unknown"},this.#sessions.set(key,view)):(typeof record.name=="string"||contextTask(record)!==void 0)&&(view.label=labelOf(record)),view}};function sessionKey(socket,record){return`${socket}#${String(record.sessionId)}`}function labelOf(record){let task=contextTask(record);return task!==void 0?task:typeof record.name=="string"&&record.name!==""?record.name:(typeof record.durableSessionId=="string"?record.durableSessionId:String(record.sessionId)).slice(0,8)}function contextTask(record){let context=record.context;return typeof context?.task_id=="string"?context.task_id:void 0}function modelId(model){return typeof model=="object"&&model!==null&&"id"in model?String(model.id):void 0}function reasonOf(outcome){return typeof outcome=="object"&&outcome!==null&&"reason"in outcome?String(outcome.reason):void 0}function count(value){return Array.isArray(value)?value.length:typeof value=="number"?value:0}function tail(id){return id.length>8?id.slice(-8):id}function entryType(record){let entry=record.entry;return String(entry?.type??record.entryType??"?")}var RPC_RESCAN_MS=3e4,RpcMonitorWatch=class{#options;#observers=new Map;#hosts=new Map;#renderer=new RpcMonitorRenderer;#coalescer;#taskSessions=new Set;#rescan;#stopped=!1;constructor(options){this.#options=options,this.#coalescer=new RpcMonitorCoalescer(options.line)}async start(){let rows=await this.#join();return this.#rescan=setInterval(()=>{this.#join()},RPC_RESCAN_MS),this.#rescan.unref?.(),rows}checkpoint(){return{hosts:Object.fromEntries(this.#hosts),statuses:Object.fromEntries(this.#renderer.statuses())}}diffSince(saved){let lines=[];for(let[socket,host]of this.#hosts){let before=saved.hosts[socket];before!==void 0&&before.generation!==host.generation&&lines.push(`rpc host ${socket} restarted (generation ${before.generation} -> ${host.generation})`)}let now=this.#renderer.statuses();for(let[key,status]of Object.entries(saved.statuses)){let label=key.slice(key.lastIndexOf("#")+1).slice(0,8),current=now.get(key),socket=key.slice(0,key.lastIndexOf("#"));current===void 0?lines.push(this.#hosts.has(socket)&&this.#options.target.kind!=="children"?`rpc ${label} closed (gone while detached)`:this.#hosts.has(socket)?`rpc ${label} no longer listed (closed or no longer a child while detached)`:`rpc ${label} unreachable (its host did not answer)`):current!==status&&lines.push(`rpc ${label} status ${status} -> ${current} (changed while detached)`)}return lines}stop(){this.#stopped=!0,this.#rescan!==void 0&&clearInterval(this.#rescan),this.#coalescer.dispose();for(let observer of this.#observers.values())observer.close();this.#observers.clear()}async#join(){let fresh=(await(this.#options.endpoints??(()=>endpointSockets(this.#options.agentDir)))().catch(()=>[])).filter(socket=>!this.#observers.has(socket));return(await Promise.all(fresh.map(socket=>this.#observe(socket)))).flat()}async#observe(socket){if(this.#stopped)return[];let{target,events}=this.#options,observer;try{observer=await openRpcObserver(socket,subscriptionFor(target,events),{record:record=>{this.#stopped||this.#record(socket,record)},closed:()=>this.#lost(socket,observer)})}catch{return[]}if(this.#stopped)return observer.close(),[];this.#observers.set(socket,observer);let answer=await observer.subscribed.catch(()=>{});if(this.#stopped)return observer.close(),[];let data=answer?.data;if(data===void 0)return[];this.#hosts.set(socket,{instanceId:String(data.hostInstanceId),generation:String(data.hostGeneration)});let matched=(Array.isArray(data.snapshot)?data.snapshot:[]).filter(row=>matchesTask(target,row));for(let row of matched)this.#taskSessions.add(sessionKey(socket,row));if(target.kind!=="all"&&target.kind!=="children"&&matched.length===0)return observer.close(),this.#observers.delete(socket),[];let rows=this.#renderer.seed(socket,matched);return this.#options.checkpoint?.(this.checkpoint()),rows}#lost(socket,observer){if(this.#observers.get(socket)!==observer||(this.#observers.delete(socket),this.#stopped))return;let forgotten=this.#renderer.forgetSocket(socket);for(let key of[...this.#taskSessions])key.startsWith(`${socket}#`)&&this.#taskSessions.delete(key);(this.#hosts.delete(socket)||forgotten>0)&&(this.#options.line(`rpc host ${socket} gone (${forgotten} session${forgotten===1?"":"s"} no longer watched)`),this.#options.checkpoint?.(this.checkpoint()))}#record(socket,record){let{target,events,exclude}=this.#options,type=String(record.type);if(!wantsRecord(events,exclude,type))return;let key=sessionKey(socket,record);if(target.kind==="task"&&(matchesTask(target,record)&&this.#taskSessions.add(key),!this.#taskSessions.has(key))||this.#coalescer.accept(key,()=>this.#renderer.label(socket,record),record))return;let line=this.#renderer.render(socket,record);line!==void 0&&(this.#options.line(line),type==="session_status"&&this.#options.checkpoint?.(this.checkpoint()))}};var RPC_WATCHER_TIMED_OUT_SUMMARY="watcher timed_out",RpcMonitorSource=class{#records=new Map;#host;#nextId=1;constructor(host){this.#host=host}get(id){return this.#records.get(id)}values(){return this.#records.values()}keys(){return this.#records.keys()}async register(options){let id=`rpc_${this.#nextId++}`,monitorId=options.monitorId??allocateMonitorId(),watch=new RpcMonitorWatch({agentDir:options.agentDir,target:options.target,events:options.events,exclude:options.exclude,...options.endpoints===void 0?{}:{endpoints:options.endpoints},line:line=>this.#line(id,line),...options.onCheckpoint===void 0?{}:{checkpoint:checkpoint=>options.onCheckpoint?.(monitorId,checkpoint)}}),record={id,monitorId,description:options.description,startedAtMs:Date.now(),command:null,filter:options.filter,persistent:options.persistent,deadlineMs:options.persistent||options.timeoutMs===void 0?null:Date.now()+options.timeoutMs,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,paused:!1,settled:!1,rpcWatch:watch,targetText:options.targetText,mutedDropped:0,lastLine:void 0,deadline:options.persistent||options.timeoutMs===void 0?void 0:setTimeout(()=>this.settle(id,RPC_WATCHER_TIMED_OUT_SUMMARY),options.timeoutMs)};this.#records.set(id,record),this.#host.changed();let rows=await watch.start();if(options.restoredFrom!==void 0)for(let line of watch.diffSince(options.restoredFrom))this.#line(id,line);return{id,monitorId,rows}}settle(id,summary){let record=this.#records.get(id);return record===void 0||record.settled?!1:(record.settled=!0,record.rpcWatch.stop(),clearTimeout(record.deadline),this.#records.delete(id),this.#host.changed(),summary!=="watcher disposed"&&this.#host.emit(record,{type:"summary",id,description:record.description,summary}),this.#host.ended(record,summary===RPC_WATCHER_TIMED_OUT_SUMMARY?"timeout":summary==="watcher disposed"?"disposed":"killed",null),!0)}settleAll(summary){let ids=[...this.#records.keys()];for(let id of ids)this.settle(id,summary);return ids.length}#line(id,line){let record=this.#records.get(id);if(!(record===void 0||record.settled)&&!(record.filter instanceof RegExp&&!record.filter.test(line))&&line!==record.lastLine){if(record.lastLine=line,record.paused){record.mutedDropped+=1;return}this.#host.emit(record,{type:"line",id,description:record.description,line})}}};export{RpcMonitorSource};
@@ -1,4 +1,4 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{AskUserQuestionComponent,AssistantMessageComponent,CustomEditor,ExtensionEditorComponent,UserMessageComponent,createChatViewport,createInteractiveTui}from"./chunk-DAPBNRN5.js";import{connectRpcClientSocket,requestDeadlineMs}from"./chunk-J2OBN7TI.js";import"./chunk-Y4MPEIY5.js";import{ExtensionInputComponent,ExtensionSelectorComponent}from"./chunk-MOOFLKLI.js";import{KeybindingsManager}from"./chunk-LGO25HPL.js";import{getEditorTheme,initTheme,sharedMarkdownTheme,stopThemeWatcher,theme}from"./chunk-WCRNJYHO.js";import"./chunk-57MRFI6E.js";import"./chunk-GDPWQJDQ.js";import"./chunk-E6UCZ7E5.js";import"./chunk-UYO5Z35O.js";import{MAX_RPC_LINE_CHARACTERS,attachJsonlLineReader,serializeJsonLine}from"./chunk-H52J72VA.js";import"./chunk-6VWIMHMH.js";import"./chunk-KLAX467B.js";import"./chunk-YWD54RHU.js";import"./chunk-26UBFF6N.js";import"./chunk-YU2P3CAR.js";import{Container,Markdown,Text,TuiAltScreen,setKeybindings}from"./chunk-D2ROBVZ4.js";import"./chunk-LNAZ7XEU.js";import"./chunk-DLAY7CIU.js";import"./chunk-PX7FF5LE.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-V36CXIIB.js";import"./chunk-GVSBCJFI.js";import"./chunk-TG4E7Z7W.js";import"./chunk-32R442XT.js";import"./chunk-WHPDEDCC.js";import"./chunk-MOH5HOHX.js";import"./chunk-HK46JMSC.js";import"./chunk-ED7VJGL4.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-TBARMJ75.js";import"./chunk-3SASTB6Y.js";import"./chunk-5CSZPC55.js";import"./chunk-PJ34QVL5.js";import{markModeCrashHandler}from"./chunk-ZFIC2DZV.js";import"./chunk-QEESHRTS.js";import{getAgentDir}from"./chunk-ISZ4EWIS.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-O5RYI3IW.js";import"./chunk-IKOFCODM.js";import{randomUUID as randomUUID2}from"node:crypto";import{randomUUID}from"node:crypto";var AttachRefusedError=class extends Error{constructor(code,message){super(message),this.name="AttachRefusedError",this.code=code}},AnswerRefusedError=class extends Error{constructor(code){super(`Answer refused: ${code}`),this.name="AnswerRefusedError",this.code=code}},ANSWER_DEADLINE_MS=3e4,AttachClient=class{constructor(onRecord,onDisconnect,options={}){this.pending=new Map,this.closed=!1,this.onRecord=onRecord,this.onDisconnect=onDisconnect,this.answerDeadlineMs=options.answerDeadlineMs??ANSWER_DEADLINE_MS}async connect(path){let socket=await connectRpcClientSocket(path,{});if(this.closed)throw socket.destroy(),new Error("Disconnected");this.socket=socket,this.stopReading=attachJsonlLineReader(socket,line=>this.receive(socket,line),{maxLineLength:MAX_RPC_LINE_CHARACTERS,onOversizedLine:()=>this.fail(socket,"the endpoint sent a record over the line limit")}),socket.once("error",()=>socket.destroy()),socket.once("close",()=>{this.socket=void 0,this.rejectPending(),this.closed||this.onDisconnect(this.failure)})}request(command){let id=randomUUID();return this.track(id,requestDeadlineMs(command),`No acknowledgement for ${command.type}; its outcome is unknown`,{...command,id})}async answer(sessionId,response){await this.track(response.id,this.answerDeadlineMs,"No acknowledgement for the answer",{...response,sessionId,answerId:randomUUID()})}close(){this.closed=!0,this.stopReading?.(),this.socket?.destroy(),this.socket=void 0,this.rejectPending()}track(id,deadlineMs,unanswered,record){return new Promise((resolve,reject)=>{let timer=setTimeout(()=>{this.pending.delete(id),reject(new Error(unanswered))},deadlineMs);if(this.pending.set(id,{resolve:answer=>{clearTimeout(timer),resolve(answer)},reject:error=>{clearTimeout(timer),reject(error)}}),this.socket?.writable&&!this.socket.destroyed){this.socket.write(serializeJsonLine(record));return}clearTimeout(timer),this.pending.delete(id),reject(new Error("Disconnected"))})}receive(socket,line){let record;try{record=JSON.parse(line)}catch{this.fail(socket,"the endpoint sent an unreadable record");return}if(record.type==="response"){let pending=record.id?this.pending.get(record.id):void 0;if(!pending)return;record.id&&this.pending.delete(record.id),record.success?pending.resolve(record):record.command==="extension_ui_response"?pending.reject(new AnswerRefusedError(record.error)):pending.reject(new Error(record.error));return}try{this.onRecord(record)}catch(error){this.fail(socket,`a ${record.type} record could not be shown (${error instanceof Error?error.message:String(error)})`)}}fail(socket,reason){this.failure??=reason,socket.destroy()}rejectPending(){for(let request of this.pending.values())request.reject(new Error("Disconnected; pending command outcome is unknown"));this.pending.clear()}};function remoteOriginLabel(request){let origin="remoteOrigin"in request?request.remoteOrigin:void 0;if(typeof origin!="object"||origin===null||!("deviceId"in origin))return;let name="deviceName"in origin&&typeof origin.deviceName=="string"?clean(origin.deviceName):"",id=typeof origin.deviceId=="string"?clean(origin.deviceId):"",device=name||id;return device?`Requested from ${device}`:void 0}var clean=value=>value.replace(/[\u0000-\u001f\u007f-\u009f]/g,"").trim(),AttachDialogs=class extends Container{constructor(ui,keys,answer,report,focusEditor){super(),this.queue=[],this.seen=new Set,this.settled=new Set,this.closed=!1,this.ui=ui,this.keys=keys,this.answer=answer,this.report=report,this.focusEditor=focusEditor}get active(){return this.current!==void 0}accept(request){this.seen.has(request.id)||["select","confirm","input","editor","question"].includes(request.method)&&(this.seen.add(request.id),this.queue.push(request),this.showNext())}resolve(id){this.settled.add(id);let index=this.queue.findIndex(request=>request.id===id);index>=0&&this.queue.splice(index,1),this.current?.request.id===id&&this.dismiss()}handleInput(data){this.current?.component.handleInput?.(data)}dispose(){this.closed=!0,this.queue.length=0,this.current?.component.dispose?.(),this.current=void 0,this.clear()}dismiss(){this.current?.component.dispose?.(),this.current=void 0,this.clear(),this.focusEditor(),this.showNext(),this.ui.requestRender()}submit(request,response){this.dismiss(),this.answer(response).catch(error=>{let code=error instanceof AnswerRefusedError?error.code:void 0;if(code==="question_already_resolved"||code==="unknown_extension_ui_request"){this.report(`Not accepted: ${code} (already settled)`);return}this.closed||this.settled.has(request.id)||(this.report(request.method==="input"&&request.secret?"Secret answer was not acknowledged. The outcome is unknown; enter a new answer only after checking.":`${error instanceof Error?error.message:String(error)}. Answer again.`),!(request.method==="input"&&request.secret&&(!(error instanceof AnswerRefusedError)||Date.now()>=(request.deadlineAtMs??0)))&&(this.queue.unshift(request),this.showNext(),this.ui.requestRender()))})}showNext(){if(this.current)return;let request=this.queue.shift();if(!request)return;let finish=response=>{this.current?.request.id===request.id&&this.submit(request,request.method==="input"&&request.secret?{...response,secret:!0,uiRequestId:request.id,id:crypto.randomUUID(),answerId:crypto.randomUUID()}:response)},cancel=()=>finish({type:"extension_ui_response",id:request.id,cancelled:!0}),component;switch(request.method){case"select":component=new ExtensionSelectorComponent(request.title,request.options,value=>finish({type:"extension_ui_response",id:request.id,value}),cancel,{tui:this.ui,timeout:request.timeout});break;case"confirm":component=new ExtensionSelectorComponent(request.title,["Yes","No"],value=>finish({type:"extension_ui_response",id:request.id,confirmed:value==="Yes"}),cancel,{tui:this.ui,timeout:request.timeout,description:request.message});break;case"input":if(request.secret&&(request.deadlineAtMs===void 0||request.deadlineAtMs<=Date.now())){this.settled.add(request.id),this.showNext();return}component=new ExtensionInputComponent(request.title,request.placeholder,value=>finish({type:"extension_ui_response",id:request.id,value}),cancel,{tui:this.ui,timeout:request.timeout,secret:request.secret,deadlineAtMs:request.deadlineAtMs});break;case"editor":component=new ExtensionEditorComponent(this.ui,this.keys,request.title,request.prefill,value=>finish({type:"extension_ui_response",id:request.id,value}),cancel);break;case"question":component=new AskUserQuestionComponent({requestId:request.requestId,questions:request.questions,waitForAnswer:request.waitForAnswer,timeoutMs:request.remainingMs},response=>response.status==="answered"||response.status==="comment-submitted"?finish({type:"extension_ui_response",id:request.id,answers:response.answers,comment:response.comment}):cancel(),{tui:this.ui,getDeadlineAtMs:()=>request.deadlineAtMs});break;default:return}this.current={request,component};let origin=remoteOriginLabel(request);origin&&this.addChild(new Text(theme.fg("warning",origin),1,0)),this.addChild(component),this.ui.setFocus(component),this.ui.requestRender()}};var RecordRenderer=class extends Container{constructor(){super(...arguments),this.rows=[],this.finalized=new Set,this.historyKeys=new Map}prepend(entries){let added=[];for(let entry of entries){if(entry.type!=="message")continue;let key=entry.id;this.historyKeys.set(this.messageKey(entry.message),key),this.finalized.add(key),!this.rows.some(row=>row.key===key)&&added.push({key,message:entry.message,component:this.component(entry.message)})}this.rows=[...added,...this.rows],this.rebuild()}accept(record){switch(record.type){case"message_start":if(this.finalized.has(this.key(record.message,record.entryId)))return;this.put(record.message,record.entryId);break;case"message_update":{if(record.message){this.put(record.message,record.entryId);break}let active=this.active;if(!active)return;let event=record.assistantMessageEvent,content=active.message.content;switch(event.type){case"text_start":content[event.contentIndex]={type:"text",text:""};break;case"thinking_start":content[event.contentIndex]={type:"thinking",thinking:""};break;case"text_delta":{let part=content[event.contentIndex];part?.type==="text"?part.text+=event.delta:content[event.contentIndex]={type:"text",text:event.delta};break}case"thinking_delta":{let part=content[event.contentIndex];part?.type==="thinking"?part.thinking+=event.delta:content[event.contentIndex]={type:"thinking",thinking:event.delta};break}case"toolcall_start":content[event.contentIndex]={type:"toolCall",id:event.id,name:event.toolName,arguments:{}};break;case"toolcall_end":content[event.contentIndex]=event.toolCall;break;default:break}active.message.usage=record.usage,active.component.updateContent(active.message);break}case"message_end":this.put(record.message,record.entryId),this.finalized.add(this.key(record.message,record.entryId)),this.active=void 0;break;default:break}}messageKey(message){return message.role==="toolResult"?`tool:${message.toolCallId}`:`${message.role}:${message.timestamp}`}key(message,entryId){return entryId??this.historyKeys.get(this.messageKey(message))??this.messageKey(message)}put(message,entryId){let key=this.key(message,entryId),existing=this.rows.find(row=>row.key===key)??this.rows.find(row=>!this.finalized.has(row.key)&&this.messageKey(row.message)===this.messageKey(message));if(message.role==="assistant"){let component=existing?.component instanceof AssistantMessageComponent?existing.component:new AssistantMessageComponent,snapshot=structuredClone(message);component.updateContent(snapshot),this.active={key,message:snapshot,component},existing?(existing.key=key,existing.component=component,existing.message=snapshot):this.rows.push({key,message:snapshot,component})}else existing?(existing.key=key,existing.message=message,existing.component=this.component(message)):this.rows.push({key,message,component:this.component(message)});this.rebuild()}component(message){switch(message.role){case"assistant":return new AssistantMessageComponent(message);case"user":{let text=typeof message.content=="string"?message.content:message.content.map(part=>part.type==="text"?part.text:"[image]").join(`
2
+ import{AskUserQuestionComponent,AssistantMessageComponent,CustomEditor,ExtensionEditorComponent,UserMessageComponent,createChatViewport,createInteractiveTui}from"./chunk-SCBTASM4.js";import{connectRpcClientSocket,requestDeadlineMs}from"./chunk-G5XUGK4B.js";import"./chunk-Y4MPEIY5.js";import{ExtensionInputComponent,ExtensionSelectorComponent}from"./chunk-QSMT5KVJ.js";import{KeybindingsManager}from"./chunk-JCTODLUP.js";import{getEditorTheme,initTheme,sharedMarkdownTheme,stopThemeWatcher,theme}from"./chunk-A4KOQUHT.js";import"./chunk-XMWPCJU6.js";import"./chunk-XPSXUKSD.js";import"./chunk-E6UCZ7E5.js";import"./chunk-UYO5Z35O.js";import{MAX_RPC_LINE_CHARACTERS,attachJsonlLineReader,serializeJsonLine}from"./chunk-H52J72VA.js";import"./chunk-KLAX467B.js";import"./chunk-EBZ6IP4V.js";import"./chunk-6VWIMHMH.js";import"./chunk-26UBFF6N.js";import"./chunk-YU2P3CAR.js";import{Container,Markdown,Text,TuiAltScreen,setKeybindings}from"./chunk-D2ROBVZ4.js";import"./chunk-LNAZ7XEU.js";import"./chunk-DLAY7CIU.js";import"./chunk-GKP34H3C.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-YXL3PNTL.js";import"./chunk-GVSBCJFI.js";import"./chunk-TG4E7Z7W.js";import"./chunk-32R442XT.js";import"./chunk-WHPDEDCC.js";import"./chunk-Z7HTHT6K.js";import"./chunk-HK46JMSC.js";import"./chunk-2PGSRQBF.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-AVP6DDBF.js";import"./chunk-3SASTB6Y.js";import"./chunk-5CSZPC55.js";import"./chunk-PJ34QVL5.js";import{markModeCrashHandler}from"./chunk-ZFIC2DZV.js";import"./chunk-QEESHRTS.js";import{getAgentDir}from"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-O5RYI3IW.js";import"./chunk-IKOFCODM.js";import{randomUUID as randomUUID2}from"node:crypto";import{randomUUID}from"node:crypto";var AttachRefusedError=class extends Error{constructor(code,message){super(message),this.name="AttachRefusedError",this.code=code}},AnswerRefusedError=class extends Error{constructor(code){super(`Answer refused: ${code}`),this.name="AnswerRefusedError",this.code=code}},ANSWER_DEADLINE_MS=3e4,AttachClient=class{constructor(onRecord,onDisconnect,options={}){this.pending=new Map,this.closed=!1,this.onRecord=onRecord,this.onDisconnect=onDisconnect,this.answerDeadlineMs=options.answerDeadlineMs??ANSWER_DEADLINE_MS}async connect(path){let socket=await connectRpcClientSocket(path,{});if(this.closed)throw socket.destroy(),new Error("Disconnected");this.socket=socket,this.stopReading=attachJsonlLineReader(socket,line=>this.receive(socket,line),{maxLineLength:MAX_RPC_LINE_CHARACTERS,onOversizedLine:()=>this.fail(socket,"the endpoint sent a record over the line limit")}),socket.once("error",()=>socket.destroy()),socket.once("close",()=>{this.socket=void 0,this.rejectPending(),this.closed||this.onDisconnect(this.failure)})}request(command){let id=randomUUID();return this.track(id,requestDeadlineMs(command),`No acknowledgement for ${command.type}; its outcome is unknown`,{...command,id})}async answer(sessionId,response){await this.track(response.id,this.answerDeadlineMs,"No acknowledgement for the answer",{...response,sessionId,answerId:randomUUID()})}close(){this.closed=!0,this.stopReading?.(),this.socket?.destroy(),this.socket=void 0,this.rejectPending()}track(id,deadlineMs,unanswered,record){return new Promise((resolve,reject)=>{let timer=setTimeout(()=>{this.pending.delete(id),reject(new Error(unanswered))},deadlineMs);if(this.pending.set(id,{resolve:answer=>{clearTimeout(timer),resolve(answer)},reject:error=>{clearTimeout(timer),reject(error)}}),this.socket?.writable&&!this.socket.destroyed){this.socket.write(serializeJsonLine(record));return}clearTimeout(timer),this.pending.delete(id),reject(new Error("Disconnected"))})}receive(socket,line){let record;try{record=JSON.parse(line)}catch{this.fail(socket,"the endpoint sent an unreadable record");return}if(record.type==="response"){let pending=record.id?this.pending.get(record.id):void 0;if(!pending)return;record.id&&this.pending.delete(record.id),record.success?pending.resolve(record):record.command==="extension_ui_response"?pending.reject(new AnswerRefusedError(record.error)):pending.reject(new Error(record.error));return}try{this.onRecord(record)}catch(error){this.fail(socket,`a ${record.type} record could not be shown (${error instanceof Error?error.message:String(error)})`)}}fail(socket,reason){this.failure??=reason,socket.destroy()}rejectPending(){for(let request of this.pending.values())request.reject(new Error("Disconnected; pending command outcome is unknown"));this.pending.clear()}};function remoteOriginLabel(request){let origin="remoteOrigin"in request?request.remoteOrigin:void 0;if(typeof origin!="object"||origin===null||!("deviceId"in origin))return;let name="deviceName"in origin&&typeof origin.deviceName=="string"?clean(origin.deviceName):"",id=typeof origin.deviceId=="string"?clean(origin.deviceId):"",device=name||id;return device?`Requested from ${device}`:void 0}var clean=value=>value.replace(/[\u0000-\u001f\u007f-\u009f]/g,"").trim(),AttachDialogs=class extends Container{constructor(ui,keys,answer,report,focusEditor){super(),this.queue=[],this.seen=new Set,this.settled=new Set,this.closed=!1,this.ui=ui,this.keys=keys,this.answer=answer,this.report=report,this.focusEditor=focusEditor}get active(){return this.current!==void 0}accept(request){this.seen.has(request.id)||["select","confirm","input","editor","question"].includes(request.method)&&(this.seen.add(request.id),this.queue.push(request),this.showNext())}resolve(id){this.settled.add(id);let index=this.queue.findIndex(request=>request.id===id);index>=0&&this.queue.splice(index,1),this.current?.request.id===id&&this.dismiss()}handleInput(data){this.current?.component.handleInput?.(data)}dispose(){this.closed=!0,this.queue.length=0,this.current?.component.dispose?.(),this.current=void 0,this.clear()}dismiss(){this.current?.component.dispose?.(),this.current=void 0,this.clear(),this.focusEditor(),this.showNext(),this.ui.requestRender()}submit(request,response){this.dismiss(),this.answer(response).catch(error=>{let code=error instanceof AnswerRefusedError?error.code:void 0;if(code==="question_already_resolved"||code==="unknown_extension_ui_request"){this.report(`Not accepted: ${code} (already settled)`);return}this.closed||this.settled.has(request.id)||(this.report(request.method==="input"&&request.secret?"Secret answer was not acknowledged. The outcome is unknown; enter a new answer only after checking.":`${error instanceof Error?error.message:String(error)}. Answer again.`),!(request.method==="input"&&request.secret&&(!(error instanceof AnswerRefusedError)||Date.now()>=(request.deadlineAtMs??0)))&&(this.queue.unshift(request),this.showNext(),this.ui.requestRender()))})}showNext(){if(this.current)return;let request=this.queue.shift();if(!request)return;let finish=response=>{this.current?.request.id===request.id&&this.submit(request,request.method==="input"&&request.secret?{...response,secret:!0,uiRequestId:request.id,id:crypto.randomUUID(),answerId:crypto.randomUUID()}:response)},cancel=()=>finish({type:"extension_ui_response",id:request.id,cancelled:!0}),component;switch(request.method){case"select":component=new ExtensionSelectorComponent(request.title,request.options,value=>finish({type:"extension_ui_response",id:request.id,value}),cancel,{tui:this.ui,timeout:request.timeout});break;case"confirm":component=new ExtensionSelectorComponent(request.title,["Yes","No"],value=>finish({type:"extension_ui_response",id:request.id,confirmed:value==="Yes"}),cancel,{tui:this.ui,timeout:request.timeout,description:request.message});break;case"input":if(request.secret&&(request.deadlineAtMs===void 0||request.deadlineAtMs<=Date.now())){this.settled.add(request.id),this.showNext();return}component=new ExtensionInputComponent(request.title,request.placeholder,value=>finish({type:"extension_ui_response",id:request.id,value}),cancel,{tui:this.ui,timeout:request.timeout,secret:request.secret,deadlineAtMs:request.deadlineAtMs});break;case"editor":component=new ExtensionEditorComponent(this.ui,this.keys,request.title,request.prefill,value=>finish({type:"extension_ui_response",id:request.id,value}),cancel);break;case"question":component=new AskUserQuestionComponent({requestId:request.requestId,questions:request.questions,waitForAnswer:request.waitForAnswer,timeoutMs:request.remainingMs},response=>response.status==="answered"||response.status==="comment-submitted"?finish({type:"extension_ui_response",id:request.id,answers:response.answers,comment:response.comment}):cancel(),{tui:this.ui,getDeadlineAtMs:()=>request.deadlineAtMs});break;default:return}this.current={request,component};let origin=remoteOriginLabel(request);origin&&this.addChild(new Text(theme.fg("warning",origin),1,0)),this.addChild(component),this.ui.setFocus(component),this.ui.requestRender()}};var RecordRenderer=class extends Container{constructor(){super(...arguments),this.rows=[],this.finalized=new Set,this.historyKeys=new Map}prepend(entries){let added=[];for(let entry of entries){if(entry.type!=="message")continue;let key=entry.id;this.historyKeys.set(this.messageKey(entry.message),key),this.finalized.add(key),!this.rows.some(row=>row.key===key)&&added.push({key,message:entry.message,component:this.component(entry.message)})}this.rows=[...added,...this.rows],this.rebuild()}accept(record){switch(record.type){case"message_start":if(this.finalized.has(this.key(record.message,record.entryId)))return;this.put(record.message,record.entryId);break;case"message_update":{if(record.message){this.put(record.message,record.entryId);break}let active=this.active;if(!active)return;let event=record.assistantMessageEvent,content=active.message.content;switch(event.type){case"text_start":content[event.contentIndex]={type:"text",text:""};break;case"thinking_start":content[event.contentIndex]={type:"thinking",thinking:""};break;case"text_delta":{let part=content[event.contentIndex];part?.type==="text"?part.text+=event.delta:content[event.contentIndex]={type:"text",text:event.delta};break}case"thinking_delta":{let part=content[event.contentIndex];part?.type==="thinking"?part.thinking+=event.delta:content[event.contentIndex]={type:"thinking",thinking:event.delta};break}case"toolcall_start":content[event.contentIndex]={type:"toolCall",id:event.id,name:event.toolName,arguments:{}};break;case"toolcall_end":content[event.contentIndex]=event.toolCall;break;default:break}active.message.usage=record.usage,active.component.updateContent(active.message);break}case"message_end":this.put(record.message,record.entryId),this.finalized.add(this.key(record.message,record.entryId)),this.active=void 0;break;default:break}}messageKey(message){return message.role==="toolResult"?`tool:${message.toolCallId}`:`${message.role}:${message.timestamp}`}key(message,entryId){return entryId??this.historyKeys.get(this.messageKey(message))??this.messageKey(message)}put(message,entryId){let key=this.key(message,entryId),existing=this.rows.find(row=>row.key===key)??this.rows.find(row=>!this.finalized.has(row.key)&&this.messageKey(row.message)===this.messageKey(message));if(message.role==="assistant"){let component=existing?.component instanceof AssistantMessageComponent?existing.component:new AssistantMessageComponent,snapshot=structuredClone(message);component.updateContent(snapshot),this.active={key,message:snapshot,component},existing?(existing.key=key,existing.component=component,existing.message=snapshot):this.rows.push({key,message:snapshot,component})}else existing?(existing.key=key,existing.message=message,existing.component=this.component(message)):this.rows.push({key,message,component:this.component(message)});this.rebuild()}component(message){switch(message.role){case"assistant":return new AssistantMessageComponent(message);case"user":{let text=typeof message.content=="string"?message.content:message.content.map(part=>part.type==="text"?part.text:"[image]").join(`
3
3
  `);return new UserMessageComponent(text)}case"toolResult":{let text=message.content.map(part=>part.type==="text"?part.text:"[image]").join(`
4
4
  `),result=new Container;return result.addChild(new Text(theme.fg("muted",message.toolName),1,0)),result.addChild(new Markdown(text,1,0,sharedMarkdownTheme())),result}default:return new Text("content"in message?String(message.content):message.role,1,0)}}rebuild(){this.clear();for(let row of this.rows)this.addChild(row.component)}};var ATTACH_CLIENT_CAPABILITIES=["interactive_user","question","grant_select","secret_input_v1"],WidthReporter=class{constructor(inner,onWidth){this.inner=inner,this.onWidth=onWidth}render(width){return this.onWidth(width),this.inner.render(width)}invalidate(){this.inner.invalidate()}};function validateAttachTerminal(inputIsTTY,outputIsTTY){if(!inputIsTTY||!outputIsTTY)throw new Error("--attach requires an interactive terminal on stdin and stdout")}var AttachedTui=class extends Container{constructor(ui,finish,options={}){super(),this.transcript=new RecordRenderer,this.statusText=new Text("Connecting",1,0),this.status=new WidthReporter(this.statusText,width=>this.reportWidth(width)),this.connected=!1,this.attached=!1,this.closing=!1,this.streaming=!1,this.buffering=[],this.ui=ui;let keys=KeybindingsManager.create();setKeybindings(keys),this.editor=new CustomEditor(ui,getEditorTheme(),keys),this.dialogs=new AttachDialogs(ui,keys,response=>this.sessionId?this.client.answer(this.sessionId,response):Promise.reject(new Error("Disconnected")),message=>this.showStatus(message),()=>ui.setFocus(this)),this.client=new AttachClient(record=>{record.sessionId&&record.sessionId!==this.sessionId||(this.buffering?this.buffering.push(record):this.record(record))},reason=>{this.connected=!1,this.dialogs.dispose(),ui.setFocus(this),this.showStatus(reason?`Disconnected: ${reason}`:"Disconnected")},{answerDeadlineMs:options.answerDeadlineMs}),this.editor.onSubmit=text=>{if(text.trim()==="/quit"){finish();return}this.perform(()=>this.submit(text),()=>{this.editor.getText()===""&&this.editor.setText(text)})},this.editor.onCtrlD=finish,this.editor.onAction("app.clear",finish),this.editor.onEscape=()=>this.perform(()=>this.abort()),this.addChild(this.transcript),this.addChild(this.status),this.addChild(this.dialogs),this.addChild(this.editor);let input=new Container;input.addChild(this.dialogs),input.addChild(this.editor),this.layoutRoot=createChatViewport({document:this.transcript,pendingMessages:new Container,status:this.status,editor:input,footer:new Text("/history /steer <text> /abort /quit",1,0),scrollbarTrackStyle:text=>theme.fg("scrollbarTrack",text),scrollbarThumbStyle:text=>theme.fg("scrollbarThumb",text)}).root}get focused(){return this.editor.focused}set focused(value){this.editor.focused=value}async connect(address,ref){let path=address.startsWith("unix://")?address.slice(7):address;if(!path||path.includes("://")||/^\\\\\.\\pipe\\/i.test(path))throw new Error("--attach needs a local socket path or a named pipe's logical filesystem path");try{await this.client.connect(path),this.connected=!0,this.width=this.ui.terminal.columns,await this.client.request({type:"set_client_info",width:this.width,capabilities:[...ATTACH_CLIENT_CAPABILITIES]});let listing=await this.client.request({type:"list_sessions",observe:!0});if(listing.command!=="list_sessions")throw new Error("Expected a session listing");let exact=listing.data.sessions.filter(row2=>row2.sessionId===ref||row2.durableSessionId===ref||row2.sessionPath===ref),matches=exact.length?exact:listing.data.sessions.filter(row2=>row2.durableSessionId?.startsWith(ref)),row=matches.length===1?matches[0]:void 0;if(!row?.durableSessionId)throw new Error(matches.length>1?"Ambiguous session reference":"No live session matches the reference");if(row.retain_on_disconnect!==!0)throw new AttachRefusedError("session_not_retained",`Session ${ref} is not retained on disconnect: the endpoint ends it when its last client leaves, so leaving this view could end it. Attach to a session opened with retain_on_disconnect.`);this.sessionId=row.sessionId,await this.client.request({type:"attach_session",sessionId:row.sessionId,durableSessionId:row.durableSessionId}),this.attached=!0;let subscribed=await this.client.request({type:"subscribe_sessions",sessions:{ids:[row.sessionId]},mirror:"all"}),state=await this.client.request({type:"get_state",sessionId:row.sessionId,observe:!0});if(state.command!=="get_state")throw new Error("Expected session state");this.state=state.data,this.streaming=state.data.isStreaming,await this.loadHistory();for(let dialog of[...state.data.pendingDialogs??[],...state.data.pendingQuestions??[]])this.dialogs.accept(dialog);if(this.showStatus(this.streaming?"Running":"Attached"),subscribed.command==="subscribe_sessions")for(let status of subscribed.data.snapshot)this.record(status);let buffered=this.buffering??[];this.buffering=void 0;for(let record of buffered)this.record(record)}catch(error){try{await this.close()}catch(releaseError){throw new AggregateError([error,releaseError],error instanceof Error?error.message:String(error))}throw error}}loadHistory(){return this.loadingHistory?this.loadingHistory:(this.loadingHistory=this.readHistory().finally(()=>{this.loadingHistory=void 0}),this.loadingHistory)}async readHistory(){if(!this.sessionId||!this.connected)return;let response=await this.client.request({type:"get_entries",sessionId:this.sessionId,tail:100,before:this.before,observe:!0});if(response.command!=="get_entries")throw new Error("Expected history entries");this.before=response.data.next_before,this.transcript.prepend(response.data.entries),this.ui.requestRender()}async submit(text){if(!this.connected||!this.sessionId)throw new Error("Disconnected; attach again to send input");if(text.trim()==="/history"){this.before&&await this.loadHistory();return}if(text.trim()==="/abort"){await this.abort();return}let steer=text.startsWith("/steer ")||this.streaming,message=text.startsWith("/steer ")?text.slice(7):text;message.trim()&&await this.client.request({type:steer?"steer":"prompt",sessionId:this.sessionId,message,clientMessageId:randomUUID2()})}async abort(){!this.sessionId||!this.connected||await this.client.request({type:"abort",sessionId:this.sessionId,intent:"stop",effectId:randomUUID2()})}async close(){if(!this.closing){this.closing=!0,this.dialogs.dispose();try{this.connected&&this.attached&&this.sessionId&&await this.client.request({type:"release_attachment",sessionId:this.sessionId})}finally{this.connected=!1,this.client.close()}}}handleInput(data){this.dialogs.active?this.dialogs.handleInput(data):this.editor.handleInput(data),this.ui.requestRender()}record(record){switch(this.transcript.accept(record),record.type){case"extension_ui_request":record.method==="notify"?this.showStatus(record.message):this.dialogs.accept(record);break;case"question_resolved":case"secret_input_settled":this.dialogs.resolve(record.id);break;case"session_status":this.streaming=record.status==="running",this.showStatus(record.status);break;case"agent_start":this.streaming=!0,this.showStatus("Running");break;case"agent_end":case"agent_settled":this.streaming=!1,this.showStatus("Attached");break;default:break}this.ui.requestRender()}reportWidth(width){!this.attached||!this.connected||width===this.width||(this.width=width,this.perform(async()=>{await this.client.request({type:"set_client_info",width})}))}showStatus(value){this.statusText.setText(theme.fg("muted",`${value}${this.state?.sessionName?` - ${this.state.sessionName}`:""}`)),this.ui.requestRender()}perform(action,onError){action().catch(error=>{onError?.(),this.showStatus(error instanceof Error?error.message:String(error))})}};async function runAttachedTui(options){validateAttachTerminal(process.stdin.isTTY,process.stdout.isTTY),initTheme(options.theme);let ui=createInteractiveTui({tuiMode:options.tuiMode??"regular",showHardwareCursor:!1,logDirectory:getAgentDir()}),restored=!1,restore=()=>{if(!restored){restored=!0;try{ui.stop()}finally{stopThemeWatcher()}}},crash=error=>{try{restore()}finally{console.error(error),process.exit(1)}};markModeCrashHandler(crash),process.prependListener("uncaughtException",crash),process.prependListener("unhandledRejection",crash);let finish=()=>{},done=new Promise(resolve=>{finish=resolve}),interrupt=()=>{},interrupted=new Promise(resolve=>{interrupt=()=>resolve("interrupted")}),view=new AttachedTui(ui,finish),leaving=!1,stop=exitCode=>{leaving&&(restore(),process.exit(exitCode)),leaving=!0,finish(),interrupt()},onSigterm=()=>stop(143),onSigint=()=>stop(130);process.on("SIGTERM",onSigterm),process.on("SIGINT",onSigint),ui.addChild(view),ui instanceof TuiAltScreen&&ui.setLayoutRoot(view.layoutRoot),ui.setFocus(view),ui.start();try{await Promise.race([view.connect(options.address,options.session).then(()=>"connected"),interrupted])==="connected"&&await done}finally{leaving=!0;try{restore()}finally{try{await view.close()}finally{process.off("SIGTERM",onSigterm),process.off("SIGINT",onSigint),process.off("uncaughtException",crash),process.off("unhandledRejection",crash)}}}}export{runAttachedTui};
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{RUNNER_HEARTBEAT_INTERVAL_MS,RUNNER_HEARTBEAT_STALE_MS,cancelScheduledJob,deferWhileSessionOpen,execHookDelivery,listScheduledJobs,liveRunners,ownRunnerIdentity,removeRunnerLease,runDueJobs,scheduleDir,sessionResumeDelivery,writeRunnerLease}from"./chunk-6BSMXZKQ.js";import"./chunk-L5OFGHDA.js";import{resolveCliMainPath,runtimeExecArgv}from"./chunk-S2M5D5GS.js";import"./chunk-6LDUM5CL.js";import"./chunk-FNBEICAA.js";import"./chunk-E6UCZ7E5.js";import"./chunk-UYO5Z35O.js";import"./chunk-H52J72VA.js";import"./chunk-U3VOXCGP.js";import"./chunk-SOMFLLPD.js";import"./chunk-4SENPCEA.js";import"./chunk-YU4AYH4C.js";import"./chunk-EVTTLPIY.js";import"./chunk-PX7FF5LE.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-V36CXIIB.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.js";import"./chunk-TG4E7Z7W.js";import"./chunk-32R442XT.js";import"./chunk-WHPDEDCC.js";import"./chunk-MOH5HOHX.js";import"./chunk-HK46JMSC.js";import"./chunk-ED7VJGL4.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-TBARMJ75.js";import"./chunk-3SASTB6Y.js";import"./chunk-5CSZPC55.js";import"./chunk-PJ34QVL5.js";import"./chunk-BMX2U22F.js";import"./chunk-WOHQJ6JB.js";import"./chunk-6WISUXVI.js";import"./chunk-XVRRNJQD.js";import"./chunk-42XRJQM6.js";import"./chunk-OM7LH7AP.js";import"./chunk-QEESHRTS.js";import{APP_NAME,getAgentDir,isBunBinary}from"./chunk-ISZ4EWIS.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-QN2BHP3M.js";import"./chunk-O5RYI3IW.js";import"./chunk-IKOFCODM.js";import{mkdirSync,watch}from"node:fs";import{join}from"node:path";function writeLine(value){process.stdout.write(`${JSON.stringify(value)}
2
+ import{RUNNER_HEARTBEAT_INTERVAL_MS,RUNNER_HEARTBEAT_STALE_MS,cancelScheduledJob,deferWhileSessionOpen,execHookDelivery,listScheduledJobs,liveRunners,ownRunnerIdentity,removeRunnerLease,runDueJobs,scheduleDir,sessionResumeDelivery,writeRunnerLease}from"./chunk-YRYDCKUI.js";import"./chunk-USKWGPA6.js";import{resolveCliMainPath,runtimeExecArgv}from"./chunk-5BMIET5O.js";import"./chunk-DCI4QOUX.js";import"./chunk-YI6KRJDC.js";import"./chunk-E6UCZ7E5.js";import"./chunk-UYO5Z35O.js";import"./chunk-H52J72VA.js";import"./chunk-U3VOXCGP.js";import"./chunk-SOMFLLPD.js";import"./chunk-MCXOJHN2.js";import"./chunk-YU4AYH4C.js";import"./chunk-EVTTLPIY.js";import"./chunk-GKP34H3C.js";import"./chunk-COH5F7QV.js";import"./chunk-RFB5CBW7.js";import"./chunk-Y7QPP7BG.js";import"./chunk-YXL3PNTL.js";import"./chunk-GVSBCJFI.js";import"./chunk-QTS2XGPQ.js";import"./chunk-TG4E7Z7W.js";import"./chunk-32R442XT.js";import"./chunk-WHPDEDCC.js";import"./chunk-Z7HTHT6K.js";import"./chunk-HK46JMSC.js";import"./chunk-2PGSRQBF.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-AVP6DDBF.js";import"./chunk-3SASTB6Y.js";import"./chunk-5CSZPC55.js";import"./chunk-PJ34QVL5.js";import"./chunk-BMX2U22F.js";import"./chunk-WOHQJ6JB.js";import"./chunk-6WISUXVI.js";import"./chunk-XVRRNJQD.js";import"./chunk-42XRJQM6.js";import"./chunk-OM7LH7AP.js";import"./chunk-QEESHRTS.js";import{APP_NAME,getAgentDir,isBunBinary}from"./chunk-SODMQEHO.js";import"./chunk-ATQFN5HI.js";import"./chunk-MIENF2YK.js";import"./chunk-QN2BHP3M.js";import"./chunk-O5RYI3IW.js";import"./chunk-IKOFCODM.js";import{mkdirSync,watch}from"node:fs";import{join}from"node:path";function writeLine(value){process.stdout.write(`${JSON.stringify(value)}
3
3
  `)}function resolveDelivery(options){let timeoutMs=options.timeoutSeconds*1e3;return options.exec!==void 0?{deliver:execHookDelivery(options.exec,timeoutMs),shouldDefer:void 0}:{deliver:sessionResumeDelivery({command:process.execPath,args:isBunBinary?[]:[...runtimeExecArgv(),resolveCliMainPath()]},timeoutMs),shouldDefer:deferWhileSessionOpen}}function reporter(){let deferred=new Map,invalid=new Map;return result=>{let ok=!0,stillInvalid=new Set;for(let event of result.events){if(event.event==="deferred"){if(deferred.get(event.id)===event.reason)continue;deferred.set(event.id,event.reason)}else if(event.event==="invalid"){if(stillInvalid.add(event.file),invalid.get(event.file)===event.error)continue;invalid.set(event.file,event.error)}else event.event==="fired"?(deferred.delete(event.id),event.outcome==="failed"&&(ok=!1)):event.event==="error"&&(ok=!1);writeLine(event)}for(let file of invalid.keys())stillInvalid.has(file)||invalid.delete(file);return ok}}async function guardedPass(pass){try{return await pass()}catch(error){return{events:[{event:"error",error:error instanceof Error?error.message:String(error)}],nextDueAt:void 0}}}async function runPasses(dir,options){let plan=resolveDelivery(options),owner=ownRunnerIdentity(),startedAt=Date.now(),lease=()=>writeRunnerLease(dir,{startedAt,watch:options.watch,exec:options.exec??null},Date.now()),report=reporter(),pass=()=>runDueJobs({dir,now:Date.now,deliver:plan.deliver,owner,concurrency:options.concurrency,deliveryTimeoutMs:options.timeoutSeconds*1e3,shouldDefer:plan.shouldDefer});await lease();let leaseFailing=!1,heartbeat=setInterval(()=>{lease().then(()=>{leaseFailing=!1},error=>{leaseFailing||writeLine({event:"lease_error",error:error instanceof Error?error.message:String(error)}),leaseFailing=!0})},RUNNER_HEARTBEAT_INTERVAL_MS),watcher,stopping=!1,wake,stop=()=>{stopping=!0,wake?.()};try{if(!options.watch)return report(await guardedPass(pass))?0:1;process.on("SIGTERM",stop),process.on("SIGINT",stop);let pendingDir=join(dir,"pending");for(mkdirSync(pendingDir,{recursive:!0,mode:448}),watcher=watch(pendingDir,()=>wake?.()),writeLine({event:"watching",pid:process.pid,dir,pollSeconds:options.pollSeconds});!stopping;){let rescan=!1,woken=new Promise(resolve=>{wake=()=>{rescan=!0,resolve()}}),result=await guardedPass(pass);if(report(result),stopping)break;if(rescan)continue;let untilDue=result.nextDueAt===void 0?Number.POSITIVE_INFINITY:result.nextDueAt-Date.now(),waitMs=Math.max(0,Math.min(options.pollSeconds*1e3,untilDue)),timer;await Promise.race([woken,new Promise(resolve=>timer=setTimeout(resolve,waitMs))]),clearTimeout(timer)}return writeLine({event:"stopped",pid:process.pid}),0}finally{clearInterval(heartbeat),watcher?.close(),process.off("SIGTERM",stop),process.off("SIGINT",stop),await removeRunnerLease(dir)}}var EXIT_OK=0,EXIT_FAILED=1,EXIT_USAGE=2,DEFAULT_POLL_SECONDS=60,DEFAULT_TIMEOUT_SECONDS=900,DEFAULT_CONCURRENCY=4,USAGE=`usage: ${APP_NAME} schedule <list|cancel|run> [options]
4
4
 
5
5
  list [--json] every scheduled prompt, all sessions