@code-yeongyu/senpi 2026.9.18 → 2026.9.19

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 (195) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/dist/bundle/chunks/{anthropic-messages-ZEJ3DPCP.js → anthropic-messages-WZCFP6BT.js} +1 -1
  3. package/dist/bundle/chunks/{app-server-command-ELSORC4D.js → app-server-command-QK7Q6XK5.js} +1 -1
  4. package/dist/bundle/chunks/bun-extension-importer-JQZRPNJH.js +10 -0
  5. package/dist/bundle/chunks/{chunk-Y6HDGVS5.js → chunk-34GCWLNV.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-XJUVWITG.js → chunk-3FRTRCR6.js} +1 -1
  7. package/dist/bundle/chunks/{chunk-VRAYXSST.js → chunk-FDLVINNY.js} +2 -2
  8. package/dist/bundle/chunks/{chunk-QNZ24YOQ.js → chunk-HGAX6JZ7.js} +3 -1
  9. package/dist/bundle/chunks/{chunk-QGBRSL64.js → chunk-HSH674C6.js} +1 -1
  10. package/dist/bundle/chunks/chunk-IUZUN32Z.js +13 -0
  11. package/dist/bundle/chunks/chunk-IXAUDPOK.js +2 -0
  12. package/dist/bundle/chunks/{chunk-AH72FRZ2.js → chunk-KKDSBABY.js} +11 -11
  13. package/dist/bundle/chunks/{chunk-NLOZDJQX.js → chunk-LF3XTYYF.js} +3 -3
  14. package/dist/bundle/chunks/{chunk-ANTGWIGI.js → chunk-MUC3MZTV.js} +1 -1
  15. package/dist/bundle/chunks/chunk-NARL7XFO.js +8 -0
  16. package/dist/bundle/chunks/chunk-NQAVM5XL.js +2 -0
  17. package/dist/bundle/chunks/chunk-P7PWCGLJ.js +5 -0
  18. package/dist/bundle/chunks/{chunk-4C7LNOHI.js → chunk-PLZK7ABD.js} +1 -1
  19. package/dist/bundle/chunks/{chunk-CKNRCW35.js → chunk-RLRLQRI2.js} +1 -1
  20. package/dist/bundle/chunks/{chunk-7FXIHFZU.js → chunk-UAYBYTFN.js} +1 -1
  21. package/dist/bundle/chunks/{chunk-7A47FVQC.js → chunk-W4SRGDQ4.js} +3 -6
  22. package/dist/bundle/chunks/{chunk-QROWINIH.js → chunk-XK24AFYU.js} +1 -1
  23. package/dist/bundle/chunks/cli-main-7SG3K4K3.js +3 -0
  24. package/dist/bundle/chunks/cursor-agent.js +38 -0
  25. package/dist/bundle/chunks/cursor.js +2 -0
  26. package/dist/bundle/chunks/devin-agent.js +5 -0
  27. package/dist/bundle/chunks/devin.js +75 -0
  28. package/dist/bundle/chunks/{help-fast-path-WQCATMI4.js → help-fast-path-RQDCLDQT.js} +1 -1
  29. package/dist/bundle/chunks/host-command-3LS772D5.js +2 -0
  30. package/dist/bundle/chunks/{host-lifecycle-EAXSS3F2.js → host-lifecycle-TA5XGUW5.js} +1 -1
  31. package/dist/bundle/chunks/host-lifecycle.js +20 -0
  32. package/dist/bundle/chunks/interactive-host-runtime-AITXUDCT.js +4 -0
  33. package/dist/bundle/chunks/interactive-mode-7MN6GGCG.js +2 -0
  34. package/dist/bundle/chunks/{multi-session-host-OK6WMHB4.js → multi-session-host-WKX34SOP.js} +1 -1
  35. package/dist/bundle/chunks/{openai-completions-2RS3VSPV.js → openai-completions-TOWYKX2U.js} +1 -1
  36. package/dist/bundle/chunks/{package-manager-cli-C2K4YRGI.js → package-manager-cli-CB2X57TD.js} +1 -1
  37. package/dist/bundle/chunks/{rotation-stream-536AQTIS.js → rotation-stream-KDLA7K6X.js} +1 -1
  38. package/dist/bundle/chunks/rpc-mode-CI6V2SBW.js +2 -0
  39. package/dist/bundle/chunks/{session-picker-BUHK3FCS.js → session-picker-DXCITGLS.js} +1 -1
  40. package/dist/bundle/chunks/session-worker.js +359 -346
  41. package/dist/bundle/chunks/{state-store-OYDXEIXU.js → state-store-HBBOD7I5.js} +1 -1
  42. package/dist/bundle/cli.js +1 -1
  43. package/dist/bundle/index.js +1 -1
  44. package/dist/bundle/rpc-entry.js +1 -1
  45. package/dist/cli/args.d.ts.map +1 -1
  46. package/dist/cli/args.js +2 -0
  47. package/dist/cli/args.js.map +1 -1
  48. package/dist/cli/deferred-commands.d.ts +7 -0
  49. package/dist/cli/deferred-commands.d.ts.map +1 -1
  50. package/dist/cli/deferred-commands.js +12 -0
  51. package/dist/cli/deferred-commands.js.map +1 -1
  52. package/dist/cli/host-command.d.ts +21 -0
  53. package/dist/cli/host-command.d.ts.map +1 -0
  54. package/dist/cli/host-command.js +148 -0
  55. package/dist/cli/host-command.js.map +1 -0
  56. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.d.ts +1 -1
  57. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.js +2 -17
  59. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.js.map +1 -1
  60. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-8.d.ts +3 -0
  61. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-8.d.ts.map +1 -0
  62. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-8.js +5 -0
  63. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-8.js.map +1 -0
  64. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-code.d.ts +3 -0
  65. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-code.d.ts.map +1 -0
  66. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-code.js +28 -0
  67. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-code.js.map +1 -0
  68. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/prompt-preset/presets.js +21 -1
  70. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  71. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  72. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  73. package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
  74. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  75. package/dist/core/extensions/bun-extension-importer.d.ts.map +1 -1
  76. package/dist/core/extensions/bun-extension-importer.js +31 -5
  77. package/dist/core/extensions/bun-extension-importer.js.map +1 -1
  78. package/dist/core/extensions/bun-extension-registry.d.ts +9 -0
  79. package/dist/core/extensions/bun-extension-registry.d.ts.map +1 -1
  80. package/dist/core/extensions/bun-extension-registry.js +72 -16
  81. package/dist/core/extensions/bun-extension-registry.js.map +1 -1
  82. package/dist/core/extensions/extension-runtime-module.d.ts +5 -0
  83. package/dist/core/extensions/extension-runtime-module.d.ts.map +1 -0
  84. package/dist/core/extensions/extension-runtime-module.js +6 -0
  85. package/dist/core/extensions/extension-runtime-module.js.map +1 -0
  86. package/dist/core/model-resolver.d.ts.map +1 -1
  87. package/dist/core/model-resolver.js +1 -0
  88. package/dist/core/model-resolver.js.map +1 -1
  89. package/dist/index.d.ts +2 -1
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +3 -1
  92. package/dist/index.js.map +1 -1
  93. package/dist/main.d.ts.map +1 -1
  94. package/dist/main.js +7 -1
  95. package/dist/main.js.map +1 -1
  96. package/dist/modes/index.d.ts +3 -0
  97. package/dist/modes/index.d.ts.map +1 -1
  98. package/dist/modes/index.js +5 -0
  99. package/dist/modes/index.js.map +1 -1
  100. package/dist/modes/rpc/host-daemon-env.d.ts +18 -0
  101. package/dist/modes/rpc/host-daemon-env.d.ts.map +1 -0
  102. package/dist/modes/rpc/host-daemon-env.js +95 -0
  103. package/dist/modes/rpc/host-daemon-env.js.map +1 -0
  104. package/dist/modes/rpc/host-decision.d.ts +1 -1
  105. package/dist/modes/rpc/host-decision.d.ts.map +1 -1
  106. package/dist/modes/rpc/host-decision.js +2 -0
  107. package/dist/modes/rpc/host-decision.js.map +1 -1
  108. package/dist/modes/rpc/host-ensure.js +8 -1
  109. package/dist/modes/rpc/host-ensure.js.map +1 -1
  110. package/dist/modes/rpc/host-launch-spec.d.ts +43 -0
  111. package/dist/modes/rpc/host-launch-spec.d.ts.map +1 -0
  112. package/dist/modes/rpc/host-launch-spec.js +183 -0
  113. package/dist/modes/rpc/host-launch-spec.js.map +1 -0
  114. package/dist/modes/rpc/host-launch.d.ts +3 -1
  115. package/dist/modes/rpc/host-launch.d.ts.map +1 -1
  116. package/dist/modes/rpc/host-launch.js +24 -5
  117. package/dist/modes/rpc/host-launch.js.map +1 -1
  118. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  119. package/dist/modes/rpc/host-lifecycle.js +36 -2
  120. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  121. package/dist/modes/rpc/host-probe.d.ts +7 -0
  122. package/dist/modes/rpc/host-probe.d.ts.map +1 -1
  123. package/dist/modes/rpc/host-probe.js +15 -4
  124. package/dist/modes/rpc/host-probe.js.map +1 -1
  125. package/dist/modes/rpc/host-process-metrics.d.ts +10 -0
  126. package/dist/modes/rpc/host-process-metrics.d.ts.map +1 -0
  127. package/dist/modes/rpc/host-process-metrics.js +83 -0
  128. package/dist/modes/rpc/host-process-metrics.js.map +1 -0
  129. package/dist/modes/rpc/host-runner.d.ts +38 -0
  130. package/dist/modes/rpc/host-runner.d.ts.map +1 -0
  131. package/dist/modes/rpc/host-runner.js +195 -0
  132. package/dist/modes/rpc/host-runner.js.map +1 -0
  133. package/dist/modes/rpc/host-status.d.ts +58 -0
  134. package/dist/modes/rpc/host-status.d.ts.map +1 -0
  135. package/dist/modes/rpc/host-status.js +117 -0
  136. package/dist/modes/rpc/host-status.js.map +1 -0
  137. package/docs/extensions.md +35 -0
  138. package/docs/providers.md +30 -0
  139. package/docs/rpc.md +177 -15
  140. package/docs/settings.md +1 -1
  141. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +72 -0
  142. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  143. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  144. package/node_modules/@earendil-works/pi-ai/README.md +9 -0
  145. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  146. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -0
  147. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  148. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +2 -2
  149. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  150. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +2 -2
  151. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  152. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts +150 -7
  153. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  154. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +17 -3
  155. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  156. package/node_modules/@earendil-works/pi-ai/dist/providers/bai-stream.d.ts +13 -0
  157. package/node_modules/@earendil-works/pi-ai/dist/providers/bai-stream.d.ts.map +1 -0
  158. package/node_modules/@earendil-works/pi-ai/dist/providers/bai-stream.js +55 -0
  159. package/node_modules/@earendil-works/pi-ai/dist/providers/bai-stream.js.map +1 -0
  160. package/node_modules/@earendil-works/pi-ai/dist/providers/bai.d.ts +11 -0
  161. package/node_modules/@earendil-works/pi-ai/dist/providers/bai.d.ts.map +1 -0
  162. package/node_modules/@earendil-works/pi-ai/dist/providers/bai.js +94 -0
  163. package/node_modules/@earendil-works/pi-ai/dist/providers/bai.js.map +1 -0
  164. package/node_modules/@earendil-works/pi-ai/dist/providers/bai.models.d.ts +4 -0
  165. package/node_modules/@earendil-works/pi-ai/dist/providers/bai.models.d.ts.map +1 -0
  166. package/node_modules/@earendil-works/pi-ai/dist/providers/bai.models.js +6 -0
  167. package/node_modules/@earendil-works/pi-ai/dist/providers/bai.models.js.map +1 -0
  168. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  169. package/node_modules/@earendil-works/pi-ai/dist/providers/data/bai.json +1 -0
  170. package/node_modules/@earendil-works/pi-ai/dist/providers/data/mistral.json +1 -1
  171. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  172. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
  173. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  174. package/node_modules/@earendil-works/pi-ai/dist/providers/data/venice.json +1 -1
  175. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  176. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +142 -1
  177. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
  178. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js +156 -3
  179. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
  180. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +1 -1
  181. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  182. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  183. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  184. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  185. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  186. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  187. package/package.json +7 -7
  188. package/dist/bundle/chunks/bun-extension-importer-SW7XGNSG.js +0 -10
  189. package/dist/bundle/chunks/chunk-AGXZF7RF.js +0 -2
  190. package/dist/bundle/chunks/chunk-F5JZNLDE.js +0 -8
  191. package/dist/bundle/chunks/cli-main-4TWJXJKM.js +0 -3
  192. package/dist/bundle/chunks/interactive-host-runtime-EDXG6A5L.js +0 -4
  193. package/dist/bundle/chunks/interactive-mode-PD7S7KFZ.js +0 -2
  194. package/dist/bundle/chunks/rpc-mode-TIJFUWXS.js +0 -2
  195. package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +0 -1
package/CHANGELOG.md CHANGED
@@ -10,6 +10,100 @@
10
10
 
11
11
  ### Fixed
12
12
 
13
+ ### Removed
14
+
15
+ ## [2026.9.19] - 2026-09-19
16
+
17
+ ### Breaking Changes
18
+
19
+ ### Added
20
+
21
+ ### Changed
22
+
23
+ ### Fixed
24
+
25
+ - Extensions load again when their dependency graph contains CommonJS modules that reassign `exports` (`module.exports = exports = { ... }`, the shape jsdom and whatwg-url ship), call `require.resolve`, or require each other in a cycle. The loader wrapped such a module in a prologue that declared `exports` as a constant, so Bun rejected it at parse time with `This assignment will throw because "exports" is a constant` and the entire extension graph failed to load; the per-file `require` had no `resolve`, and a module inside a require cycle received `undefined` instead of the partially built exports. CommonJS now evaluates inside Node's module function wrapper with a live module registry and a `require.resolve` that returns the file's absolute path, so an extension such as pi-webfetch (jsdom) loads.
26
+
27
+ ### Removed
28
+
29
+ ## [2026.9.18-6] - 2026-09-18
30
+
31
+ - RPC host: a bundled build can start its host again. On a published install `host ensure` could not start a daemon at all: the bundler emitted no `host-lifecycle` entry, and once it did, the launcher spawned that emitted chunk instead of a program that listens, so the child exited 0 without answering `get_protocol_info`. Bundled builds now re-enter the CLI through its internal supervisor route, and the CLI entry is taken from the package's declared `bin` rather than from `..` arithmetic that lands on the package root when bundled.
32
+
33
+ ### Breaking Changes
34
+
35
+ ### Added
36
+
37
+ ### Changed
38
+
39
+ ### Fixed
40
+
41
+ ### Removed
42
+
43
+ ## [2026.9.18-5] - 2026-09-18
44
+
45
+ ### Breaking Changes
46
+
47
+ ### Added
48
+
49
+ ### Changed
50
+
51
+ ### Fixed
52
+
53
+ ### Removed
54
+
55
+ ## [2026.9.18-4] - 2026-09-18
56
+
57
+ - Model catalog: a provider the fork ships by hand (`kimi-coding`, like `devin`) now survives a catalog regeneration that upstream no longer describes, instead of silently leaving the built-in catalog.
58
+ - RPC host: an ensure no longer ends a daemon whose socket still accepts connections. A host under load that misses the protocol probe budget is refused as `host_busy` rather than replaced, so its live sessions survive.
59
+
60
+ ### Breaking Changes
61
+
62
+ ### Added
63
+
64
+ - Kimi K2.8 Preview now runs on the Kimi prompt preset instead of the untuned fallback. Moonshot upgraded Kimi Code's `kimi-for-coding` model id to K2.8 in place on 2026-09-11, so the new `kimi-k2-8` preset resolves that rolling id together with the version-tagged shapes (`kimi-k2.8`, `kimi-k2p8`, `moonshotai/kimi-k2.8:thinking`, `@cf/...`, and the `Kimi K2.8 Preview` display name). It renders the Kimi K2.7 prompt verbatim - same coding family, same posture - and only the announced model name differs. `kimi-for-coding-highspeed` is still K2.7 Code HighSpeed and now resolves to `kimi-k2-7` for the same reason. `"kimi-k2-8"` joins the `promptPreset` setting ([#1826](https://github.com/code-yeongyu/senpi/issues/1826)).
65
+
66
+ ### Changed
67
+
68
+ ### Fixed
69
+
70
+ ### Removed
71
+
72
+ ## [2026.9.18-3] - 2026-09-18
73
+
74
+ ### Breaking Changes
75
+
76
+ ### Added
77
+
78
+ - B.AI provider support: set `BAI_API_KEY` or run `/login bai`, then `senpi update --models` to pull the
79
+ models your key is entitled to. `bai` defaults to `gpt-5.6-sol`.
80
+
81
+ ### Changed
82
+
83
+ ### Fixed
84
+
85
+ - **Agent-dir extensions load reliably when many test workers run at once.** The runtime shim every extension imports was served as a Bun plugin virtual module, and on a loaded Windows machine that registration intermittently stopped answering while the plugin's own hooks kept running, so a worker could load 40 extensions and then fail the 41st with `Cannot find package 'runtime'`. It resolves to a real file now, which has no registration window to lose; compiled binaries, where the shim has no path on disk, keep the virtual module they never had trouble with. ([omo#8427](https://github.com/code-yeongyu/oh-my-openagent/issues/8427))
86
+
87
+ ### Removed
88
+
89
+ ## [2026.9.18-2] - 2026-09-18
90
+
91
+ ### Breaking Changes
92
+
93
+ ### Added
94
+
95
+ - One command now gets you the shared RPC daemon: `senpi host ensure|status|stop|handoff`. Every invocation prints EXACTLY ONE JSON line on stdout and says what happened in its exit code, so a terminal, a desktop and a task runner all get a daemon the same way instead of each re-implementing the decision: `0` it happened, `1` it failed, `2` the command line or the launch spec is unusable, `3` refused (`{ action: "refuse", reason, host }` — including a socket nobody serves), `4` fallback (`--policy fallback` decided no host is better than the one running). `ensure` reports `{ action, socket, pid, instanceId, generation, engineVersion, engineOrdinal, capabilities, launchProfileId, reused, upgradeable }`, where `action` is `handoff` exactly when the socket was already served and the process behind it changed; `status --json [--include-workers]` reports the running host's identity, its `sessions` counts, `zombies`/`rss_mb`/`open_fds` for the daemon's whole process tree, the environment NAMES it was granted (`env_keys`, never a value) and every generation in its daemon directory; `stop` refuses with exit 3 and PRINTS the counts it refused on while another client is attached or retaining a session (`--force` overrides after printing the same counts, `--drain` is always permitted because it ends no work); `handoff` forces a generation handoff from this binary and answers exit 3 `upgrade_unsupported` against a host that cannot drain or on Windows. The endpoint is `--socket`, else `SENPI_RPC_SOCKET`, else `<agentDir>/rpc/rpc.sock`. ([#1782](https://github.com/code-yeongyu/senpi/issues/1782))
96
+
97
+ - `senpi host ensure|handoff --launch-spec <file>` states what a daemon should be started with — `{ spec_version: 1, core: { session_runtime, multi_session, extensions }, tunables: { idleExitMs, coldStart }, env }` — with extension paths resolved against the SPEC FILE's own directory. The spec decides which code a long-lived machine-wide daemon loads, so it is a file rather than stdin or an argv blob (neither has an owner to check) and four properties are proven before anything is started, each with exit 2 and a typed reason: `launch_spec_insecure` (not owned by this user, or group/world writable), `launch_spec_path_escape` (an extension path leaves the spec directory, lexically or through a symlink), `launch_spec_env_denied` (an `env` key outside `^(SENPI|OMO|PI)_[A-Z0-9_]+$`) and `launch_spec_missing_extension` (a listed extension does not exist — a daemon never boots with half a profile). The daemon itself no longer inherits the ensuring process's environment: it receives an allowlist of NAMES (`PATH`, `HOME`, `USER`, `LOGNAME`, `SHELL`, `TMPDIR`, `TERM`, `LANG`, `LC_*`, `XDG_*`, `SENPI_*`/`OMO_*`/`PI_*`, the proxy variables, `*_API_KEY` and the provider prefixes) plus whatever the spec's `env` states, with the win32 system wiring allowed there as well — so a token exported in one terminal is no longer held for hours by a process serving every other client. ([#1782](https://github.com/code-yeongyu/senpi/issues/1782))
98
+
99
+
100
+ ### Changed
101
+
102
+ ### Fixed
103
+
104
+ - **Devin and Cursor login work again on the bundled CLI.** Since 2026.9.17-3 both failed with `Cannot find module .../dist/bundle/chunks/devin.js`. The bundle resolves each provider's login flow through a relative import the bundler cannot see, so it ships those flows as sibling files next to the chunk that loads them; the Devin and Cursor flows, and their two provider streams, were missing from that list. They are emitted now, and the bundle smoke test starts a login for six providers under Node and Bun to keep it that way. ([#1810](https://github.com/code-yeongyu/senpi/issues/1810))
105
+
106
+
13
107
  ### Removed
14
108
 
15
109
  ## [2026.9.18] - 2026-09-18
@@ -69,6 +163,8 @@
69
163
 
70
164
  ### Changed
71
165
 
166
+ - The RPC reference now documents the shared daemon as it behaves, including what it costs. The socket host's in-process runtime has NO session limit — no admission counter, no eviction to make room, and no `too_many_sessions`, which belongs only to the worker runtime that stdio hosts and embedders use — and the price of that is published rather than implied: about one OS thread, two file descriptors and 6–8 MB of memory per open session, growing linearly with no plateau up to 1,000 sessions, where the thread comes from the per-session filesystem watcher the `config-reload` builtin spawns ([#1794](https://github.com/code-yeongyu/senpi/issues/1794)) and not from the session runtime, which allocates none. The same pass documents the rule that keeps one event loop serving everyone (no synchronous shelling out, sleeping or large synchronous reads on the session path — extensions included, where nothing can enforce it), the two shared-daemon invariants that were enforced but unwritten (only the generation that owns the daemon state writes it, everyone else reads and fails closed; worker sessions stay invisible without `include_workers: true`), the `session_opened` / `session_closed { reason }` / `session_parked` / `session_replaced` event types, the live QA drivers that verify a daemon build, and `pi.sessionKind` / `pi.sessionContext` / `pi.sharedHostEnabled` in the extension reference. ([#1782](https://github.com/code-yeongyu/senpi/issues/1782))
167
+
72
168
  ### Fixed
73
169
  - The z.ai Coding Plan tests follow the provider's current catalog. Upstream retired `glm-4.7`, `glm-5.1`, `glm-5.2`, `glm-5.2-highspeed`, `glm-5-turbo` and `glm-5v-turbo` from `zai-coding-cn` in favour of the `glm-5.3` family, so assertions naming the retired ids stopped type-checking the moment the release regenerated the catalog, which blocked publishing. The suites now assert models both providers actually carry, and the `glm-5.3` reasoning map (`off: null`, `low: "low"`) rather than the `5.2` shape.
74
170
 
@@ -310,6 +406,7 @@
310
406
  - Fixed the `/btw` panel having no off switch: a bare `/btw` now dismisses the panel (or cancels the in-flight side query), Escape is matched through the shared key matcher so it also works under the kitty keyboard protocol (and kitty key-release events are ignored so they cannot cancel the query), and the panel footer names both.
311
407
 
312
408
  - Fixed publish staging so the packed tarball mirrors `publish-deps.lock.json` exactly regardless of how the developer's package manager laid out `node_modules`: nested manifest entries (such as `htmlparser2`'s own `entities@7`) are staged at their manifest path from a version-matched installed copy, npm's workspace-local placements keep the top-level slot with a conflicting root copy re-nested under the dependents npm resolved to it, and packages the manifest no longer lists are pruned instead of riding along. A tarball staged from a bun-hoisted install previously shipped `htmlparser2@10` next to a stale `entities@8` (compiling the engine failed with `No matching export ... for import "fromCodePoint"`), and the published tarball carried `zod@3` and `https-proxy-agent@7` under a manifest declaring `zod@4.4.3` and `https-proxy-agent@9.1.0` ([#1677](https://github.com/code-yeongyu/senpi/issues/1677)).
409
+
313
410
  ### Removed
314
411
 
315
412
  ## [2026.9.13-2] - 2026-09-13
@@ -815,6 +912,7 @@
815
912
  - Starting a session with a compatible `-fast` catalog variant now keeps fast mode enabled and preserves the requested thinking level when the variant is normalized to its base model; remembered service-tier behavior for ordinary base-model starts is unchanged.
816
913
  - Interactive shared-host regression tests now wait for RPC child processes to exit before removing their temporary roots, preventing teardown `ENOTEMPTY` races.
817
914
  - Make the reftable polling fallback detect content changes without relying on filesystem timestamp precision, and test the fallback with deterministic timer/event control.
915
+
818
916
  ### Removed
819
917
 
820
918
  ## [2026.9.4-3] - 2026-09-04
@@ -837,6 +935,7 @@
837
935
  - Image generation no longer fails with an OpenAI 401 when a placeholder API key is stored for the `openai` provider. A seeded `SK-SENTINEL-DO-NOT-LOG` value is treated as absent instead of as a credential, so resolution falls through to a configured OpenAI-compatible gateway, and image generation is reported as not configured when no gateway exists.
838
936
  - Hook trust-state reads no longer fail tool execution when the lock directory cannot be created (`EPERM`/`EACCES`/`EROFS` in sandboxed or read-only children); writers still fail closed on those errors.
839
937
  - File-backed credential, auth, and settings locks now wait through bounded contention retries; exhausted waits report an actionable transient `CredentialStoreBusyError` instead of burning the provider fallback chain.
938
+
840
939
  ### Removed
841
940
 
842
941
  ## [2026.9.4-2] - 2026-09-04
@@ -966,6 +1065,7 @@
966
1065
  - The wait-as-subscription guidance moved from the model presets into the `eval` tool description, where it can name the reachable `tool.monitor(...)` form. Because the preset rule was gated on `monitor` being directly selectable, it would otherwise have stopped rendering entirely once monitor became eval-only.
967
1066
  - Per-model system prompt presets for Claude Opus 4.5-4.8, Claude Opus 5, and GLM 5.2/5.3 are audited against their prompting guides and the dieted shared core: the Opus 5 core is rebuilt on the Fable 5.1 skeleton with the Opus 5 guide behaviors stated once each and gains the guide's outcome-first final-summary shape; Opus 4.7/4.8 keep only their documented deltas and gain the same-turn subagent fan-out direction; Opus 4.6 drops tuning text the core now carries; GLM 5.2/5.3 share one builder, gain the eval/monitor execution-tooling stance, and lose the lineage preamble, undefined-mode reference, and unconditional todo procedure. The shared core gains a conditional delegation rule and states the auto-compaction mechanism behind the context-limits rule.
968
1067
  - The Kimi K3 prompt preset is rebuilt on the Fable 5.1 skeleton for Moonshot's documented K3 "excessive proactiveness": a Scope section makes the request the deliverable (pre-existing problems become follow-ups, tests are committed only where the task or repository calls for them), the ambiguity gate does the answer-independent work first and then asks one question, a bounded failure cap stops improvisation after three failed approaches, delegation propagates a stop condition to subagents, and the K2.6-era act-bias repetition that outvoted those boundaries is gone - at 11 fewer Kimi K3 tokens than before.
1068
+
969
1069
  ### Fixed
970
1070
 
971
1071
  - RPC logins now answer providers' mid-flow prompts over the extension UI dialog channel (`extension_ui_request` `input` for pasted codes, text, and secrets; `select` for account choices) and release an unanswered dialog when the login settles, so Anthropic Claude Pro/Max and other prompt-driven OAuth flows complete through the browser callback instead of failing with `Interactive login input is not supported over RPC` and a dead callback port ([#1316](https://github.com/code-yeongyu/senpi/issues/1316)).
@@ -1512,6 +1612,7 @@
1512
1612
  ### Breaking Changes
1513
1613
 
1514
1614
  - Renamed the inherited `GoogleThinkingLevel` type to `GoogleApiThinkingLevel` and added `ResolvedGoogleThinkingLevel` for normalized adapter levels.
1615
+
1515
1616
  ### Fixed
1516
1617
 
1517
1618
  - Cursor token-bearing `resource_exhausted` failures now fall back to the next provider model without incorrectly triggering compaction, and terminal quota failures explain the likely usage-pool cause.
@@ -1570,6 +1671,7 @@
1570
1671
  - **PowerShell tool** — Use optional native PowerShell command execution on Windows. See [PowerShell Tool](docs/windows.md#powershell-tool).
1571
1672
  - **Safer managed updates** — Stage, verify, and atomically activate updates for installer-managed installations. See [Install and Manage](docs/packages.md#install-and-manage).
1572
1673
  - **Model and thinking controls** — Select thinking levels with `/thinking`, search defaults, keep selections session-scoped, and persist them explicitly with Ctrl+S. See [Models and Thinking](docs/keybindings.md#models-and-thinking).
1674
+
1573
1675
  ### Changed
1574
1676
 
1575
1677
  - RPC child startup now lazy-loads the interactive TUI mode graph at mode dispatch, avoiding parsing interactive-only components for headless sessions while preserving the interactive path.
@@ -1582,6 +1684,7 @@
1582
1684
  - Changed the bundled Node.js runtime to load jiti only when importing an extension and Babel only when uncached source needs transformation, reducing CLI startup time and bundle size.
1583
1685
  - Changed syntax highlighting to initialize only twenty common languages eagerly and defer the remaining grammars until after the initial TUI render, reducing CLI startup time.
1584
1686
  - Changed the Node.js CLI and RPC entrypoints to load a bundled runtime, reducing startup filesystem reads while keeping the public library and legacy module paths on the modular runtime for normal dependency identity.
1687
+
1585
1688
  ### Removed
1586
1689
 
1587
1690
  ## [2026.8.24] - 2026-08-24
@@ -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{combineAbortSignals}from"./chunk-SJ5DSOBX.js";import{isForcedToolChoiceUnsupportedError,omitToolChoiceParam,resolveRootObjectSchema}from"./chunk-AGXZF7RF.js";import{resolveCloudflareBaseUrl}from"./chunk-VD7TJ3D6.js";import{splitDeferredTools}from"./chunk-HK46JMSC.js";import{buildCopilotDynamicHeaders,hasCopilotVisionInput}from"./chunk-PUWVIQW6.js";import{normalizeToolCallId}from"./chunk-T6XA2IZR.js";import{getPiUserAgent}from"./chunk-QTG7MY2X.js";import{ANTHROPIC_RESERVED_BODY_KEYS,adjustMaxTokensForThinking,buildBaseOptions,clampMaxTokensToContext}from"./chunk-POMPEGWQ.js";import{retryProviderRequest}from"./chunk-ZTVQY5V6.js";import{applyServerFallbackAbort,applyServerFallbackContinuation,parseServerFallbackReceipt,parseStickyFallbackReceipt,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{registerSessionResourceCleanup}from"./chunk-WVGCQOLJ.js";import{getAnthropicCompat,isAnthropicApiBaseUrl}from"./chunk-EAMTSSEH.js";import{getProviderEnvValue}from"./chunk-V55B77HQ.js";import{parseJsonWithRepair,parseStreamingJson}from"./chunk-FC7R7NOV.js";import{calculateCost,getJsonSchemaToolParameters,isVideoMimeType,resolveJsonSchemaStrictSampling,transformMessages}from"./chunk-I3F6VZZF.js";import{appendRetryAfterMsMarker,extract429RetryAfterMs}from"./chunk-BPX6QWPD.js";import{sanitizeSurrogates}from"./chunk-WDTJ6JKE.js";import{AssistantMessageEventStream,appendAssistantMessageDiagnostic}from"./chunk-DMI55M2N.js";import{headersToRecord,providerHeadersToRecord}from"./chunk-BQVVQ2LQ.js";import{Anthropic}from"./chunk-XSDYVJIM.js";import"./chunk-VR4X5O2Z.js";var MAX_MESSAGE_CHARS=500,QUOTA_WORDING_PATTERN=/exceeded_current_quota_error|insufficient\s+balance|credits?_required|quota|billing/i,IMAGE_FORMAT_PATTERN=/unsupported image format|unsupported media type for base64 image|invalid data url for image/i;function sdkErrorClassName(error){if(!(error instanceof Error))return;let name=error.constructor?.name;return typeof name=="string"&&name.length>0?name:void 0}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function toShaped(error){return error instanceof Error?error:void 0}function numericStatus(shaped){let status=shaped?.status;return typeof status=="number"&&Number.isFinite(status)?status:void 0}function headerObject(shaped){return shaped?.headers instanceof Headers?shaped.headers:void 0}function nestedProviderCodes(body){if(!isRecord(body))return;let inner=body.error;if(!isRecord(inner))return;let codes=[];for(let key of["type","code"]){let value=inner[key];typeof value=="string"&&value.length>0&&codes.push(value)}return codes.length>0?codes:void 0}function parseLeadingJson(text){let candidate=text.slice(text.indexOf("{"),text.lastIndexOf("}")+1);if(!(!candidate.startsWith("{")||!candidate.endsWith("}")))try{return JSON.parse(candidate)}catch{return}}function quotaWording(shaped,bodyText){return[shaped?.message,bodyText].some(text=>typeof text=="string"&&QUOTA_WORDING_PATTERN.test(text))}function normalizeAnthropicRetryFailure(error,context){let message=error instanceof Error?error.message:String(error),shaped=toShaped(error),status=numericStatus(shaped),headers=headerObject(shaped),bodyText=context?.bodyText??message,kind,providerCodes;if(error instanceof Error&&error.name==="AbortError")kind="abort";else if(sdkErrorClassName(error)==="APIConnectionTimeoutError")kind="timeout";else if(sdkErrorClassName(error)==="APIConnectionError")kind="connection";else if(typeof message=="string"&&IMAGE_FORMAT_PATTERN.test(message))kind="image-format";else if(status!==void 0)kind=status===429&&quotaWording(shaped,bodyText)?"quota-exhausted":"http-status",providerCodes=nestedProviderCodes(shaped?.error);else{let parsed=parseLeadingJson(bodyText);providerCodes=nestedProviderCodes(parsed),kind=providerCodes!==void 0?"provider":"unknown"}let retryAfterMs=extract429RetryAfterMs({status,headers,bodyText}),shouldRetryHeader=headers?.get("x-should-retry"),shouldRetry=shouldRetryHeader==="true"?!0:shouldRetryHeader==="false"?!1:void 0;return{origin:"anthropic-messages",kind,message:message.slice(0,MAX_MESSAGE_CHARS),...status!==void 0?{statusCode:status}:{},...providerCodes!==void 0?{providerCodes}:{},...retryAfterMs!==void 0?{retryAfterMs}:{},...shouldRetry!==void 0?{shouldRetry}:{}}}function escapeXmlAttribute(value){return value.replaceAll("&","&amp;").replaceAll('"',"&quot;").replaceAll("'","&apos;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function availableToolGuidance(availableToolNames){if(availableToolNames.length===0)return"To edit files, call only tools available in this request.";let listed=availableToolNames.slice(0,8).join(", "),omitted=availableToolNames.length-8,suffix=omitted>0?` (and ${omitted} more)`:"";return`To edit files, call your own tools: ${listed}${suffix}.`}function demotedToolCallText(name,availableToolNames,firstOccurrence){let escapedName=escapeXmlAttribute(name);return firstOccurrence?[`<unavailable-tool-call name="${escapedName}">`,"Transcript record, not an action available to you. An earlier model in this session",`called "${escapedName}"; that tool does not exist for you and its input is omitted.`,availableToolGuidance(availableToolNames),"</unavailable-tool-call>"].join(`
2
+ import{combineAbortSignals}from"./chunk-SJ5DSOBX.js";import{isForcedToolChoiceUnsupportedError,omitToolChoiceParam}from"./chunk-NQAVM5XL.js";import{resolveCloudflareBaseUrl}from"./chunk-VD7TJ3D6.js";import{splitDeferredTools}from"./chunk-HK46JMSC.js";import{buildCopilotDynamicHeaders,hasCopilotVisionInput}from"./chunk-PUWVIQW6.js";import{normalizeToolCallId}from"./chunk-T6XA2IZR.js";import{getPiUserAgent}from"./chunk-QTG7MY2X.js";import{ANTHROPIC_RESERVED_BODY_KEYS,adjustMaxTokensForThinking,buildBaseOptions,clampMaxTokensToContext}from"./chunk-POMPEGWQ.js";import{retryProviderRequest}from"./chunk-ZTVQY5V6.js";import{applyServerFallbackAbort,applyServerFallbackContinuation,parseServerFallbackReceipt,parseStickyFallbackReceipt,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{registerSessionResourceCleanup}from"./chunk-WVGCQOLJ.js";import{resolveRootObjectSchema}from"./chunk-IXAUDPOK.js";import{getAnthropicCompat,isAnthropicApiBaseUrl}from"./chunk-EAMTSSEH.js";import{getProviderEnvValue}from"./chunk-V55B77HQ.js";import{parseJsonWithRepair,parseStreamingJson}from"./chunk-FC7R7NOV.js";import{calculateCost,getJsonSchemaToolParameters,isVideoMimeType,resolveJsonSchemaStrictSampling,transformMessages}from"./chunk-I3F6VZZF.js";import{appendRetryAfterMsMarker,extract429RetryAfterMs}from"./chunk-BPX6QWPD.js";import{sanitizeSurrogates}from"./chunk-WDTJ6JKE.js";import{AssistantMessageEventStream,appendAssistantMessageDiagnostic}from"./chunk-DMI55M2N.js";import{headersToRecord,providerHeadersToRecord}from"./chunk-BQVVQ2LQ.js";import{Anthropic}from"./chunk-XSDYVJIM.js";import"./chunk-VR4X5O2Z.js";var MAX_MESSAGE_CHARS=500,QUOTA_WORDING_PATTERN=/exceeded_current_quota_error|insufficient\s+balance|credits?_required|quota|billing/i,IMAGE_FORMAT_PATTERN=/unsupported image format|unsupported media type for base64 image|invalid data url for image/i;function sdkErrorClassName(error){if(!(error instanceof Error))return;let name=error.constructor?.name;return typeof name=="string"&&name.length>0?name:void 0}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function toShaped(error){return error instanceof Error?error:void 0}function numericStatus(shaped){let status=shaped?.status;return typeof status=="number"&&Number.isFinite(status)?status:void 0}function headerObject(shaped){return shaped?.headers instanceof Headers?shaped.headers:void 0}function nestedProviderCodes(body){if(!isRecord(body))return;let inner=body.error;if(!isRecord(inner))return;let codes=[];for(let key of["type","code"]){let value=inner[key];typeof value=="string"&&value.length>0&&codes.push(value)}return codes.length>0?codes:void 0}function parseLeadingJson(text){let candidate=text.slice(text.indexOf("{"),text.lastIndexOf("}")+1);if(!(!candidate.startsWith("{")||!candidate.endsWith("}")))try{return JSON.parse(candidate)}catch{return}}function quotaWording(shaped,bodyText){return[shaped?.message,bodyText].some(text=>typeof text=="string"&&QUOTA_WORDING_PATTERN.test(text))}function normalizeAnthropicRetryFailure(error,context){let message=error instanceof Error?error.message:String(error),shaped=toShaped(error),status=numericStatus(shaped),headers=headerObject(shaped),bodyText=context?.bodyText??message,kind,providerCodes;if(error instanceof Error&&error.name==="AbortError")kind="abort";else if(sdkErrorClassName(error)==="APIConnectionTimeoutError")kind="timeout";else if(sdkErrorClassName(error)==="APIConnectionError")kind="connection";else if(typeof message=="string"&&IMAGE_FORMAT_PATTERN.test(message))kind="image-format";else if(status!==void 0)kind=status===429&&quotaWording(shaped,bodyText)?"quota-exhausted":"http-status",providerCodes=nestedProviderCodes(shaped?.error);else{let parsed=parseLeadingJson(bodyText);providerCodes=nestedProviderCodes(parsed),kind=providerCodes!==void 0?"provider":"unknown"}let retryAfterMs=extract429RetryAfterMs({status,headers,bodyText}),shouldRetryHeader=headers?.get("x-should-retry"),shouldRetry=shouldRetryHeader==="true"?!0:shouldRetryHeader==="false"?!1:void 0;return{origin:"anthropic-messages",kind,message:message.slice(0,MAX_MESSAGE_CHARS),...status!==void 0?{statusCode:status}:{},...providerCodes!==void 0?{providerCodes}:{},...retryAfterMs!==void 0?{retryAfterMs}:{},...shouldRetry!==void 0?{shouldRetry}:{}}}function escapeXmlAttribute(value){return value.replaceAll("&","&amp;").replaceAll('"',"&quot;").replaceAll("'","&apos;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function availableToolGuidance(availableToolNames){if(availableToolNames.length===0)return"To edit files, call only tools available in this request.";let listed=availableToolNames.slice(0,8).join(", "),omitted=availableToolNames.length-8,suffix=omitted>0?` (and ${omitted} more)`:"";return`To edit files, call your own tools: ${listed}${suffix}.`}function demotedToolCallText(name,availableToolNames,firstOccurrence){let escapedName=escapeXmlAttribute(name);return firstOccurrence?[`<unavailable-tool-call name="${escapedName}">`,"Transcript record, not an action available to you. An earlier model in this session",`called "${escapedName}"; that tool does not exist for you and its input is omitted.`,availableToolGuidance(availableToolNames),"</unavailable-tool-call>"].join(`
3
3
  `):`<unavailable-tool-call name="${escapedName}"/>`}function demotedToolResultText(name,content){let escapedName=escapeXmlAttribute(name),safeContent=content.replace(/<\/unavailable-tool-result/gi,match=>`&lt;${match.slice(1)}`);return`<unavailable-tool-result name="${escapedName}">${safeContent}</unavailable-tool-result>`}function isRecord2(value){return typeof value=="object"&&value!==null}var GATEWAY_TOOL_NAMESPACE=/^mcp__[^_]+__(.+)$/;function foldToolNameKey(name){return name.toLowerCase().replaceAll(/[-_]/g,"")}function collectAvailableToolNames(tools){let defined=new Set;if(Array.isArray(tools))for(let tool of tools)isRecord2(tool)&&typeof tool.name=="string"&&defined.add(tool.name);let folded=new Map,ambiguous=new Set;for(let name of defined){let key=foldToolNameKey(name);folded.has(key)?ambiguous.add(key):folded.set(key,name)}for(let key of ambiguous)folded.delete(key);return{defined,folded}}function resolveAvailableToolName(name,available){let suffix=GATEWAY_TOOL_NAMESPACE.exec(name)?.[1],candidates=suffix===void 0?[name]:[name,suffix];for(let candidate of candidates)if(available.defined.has(candidate))return candidate;for(let candidate of candidates){let folded=available.folded.get(foldToolNameKey(candidate));if(folded!==void 0)return folded}}function isNativeToolSearchResultBlock(block){return isRecord2(block)&&block.type==="tool_search_tool_result"&&typeof block.tool_use_id=="string"&&isRecord2(block.content)&&Array.isArray(block.content.tool_references)}function demoteUnavailableToolReferences(params){let messages=params.messages;if(!Array.isArray(messages)||messages.length===0)return params;let available=collectAvailableToolNames(params.tools),resolve=name=>resolveAvailableToolName(name,available),demotedCallNames=new Map,renamedCallNames=new Map;for(let message of messages)if(!(message.role!=="assistant"||!Array.isArray(message.content)))for(let block of message.content){if(!isRecord2(block)||block.type!=="tool_use"||typeof block.name!="string")continue;let resolved=resolve(block.name);resolved===void 0?demotedCallNames.set(block.id,block.name):resolved!==block.name&&renamedCallNames.set(block.id,resolved)}let changed=!1,availableToolNames=[...available.defined],seenDemotedCallNames=new Set,rewrittenMessages=[];for(let message of messages){if(!Array.isArray(message.content)){rewrittenMessages.push(message);continue}let messageChanged=!1,droppedSearchUseIds=new Set,droppedSearchNames=new Map;if(message.role==="assistant")for(let block of message.content){if(!isNativeToolSearchResultBlock(block))continue;let names=block.content.tool_references.filter(item=>isRecord2(item)&&item.type==="tool_reference").map(item=>typeof item.tool_name=="string"?item.tool_name:"");names.length>0&&names.every(name=>resolve(name)===void 0)&&(droppedSearchUseIds.add(block.tool_use_id),droppedSearchNames.set(block.tool_use_id,names))}let content=[];for(let block of message.content){if(message.role==="assistant"&&isRecord2(block)&&block.type==="tool_use"){let demotedName=demotedCallNames.get(block.id);if(demotedName!==void 0){messageChanged=!0;let firstOccurrence=!seenDemotedCallNames.has(demotedName);seenDemotedCallNames.add(demotedName),content.push({type:"text",text:demotedToolCallText(demotedName,availableToolNames,firstOccurrence)});continue}let renamedName=renamedCallNames.get(block.id);if(renamedName!==void 0){messageChanged=!0,content.push({...block,name:renamedName});continue}}if(message.role==="assistant"&&isRecord2(block)&&block.type==="server_tool_use"&&typeof block.id=="string"&&droppedSearchUseIds.has(block.id)){messageChanged=!0;continue}if(message.role==="assistant"&&isNativeToolSearchResultBlock(block)){let omitted=droppedSearchNames.get(block.tool_use_id);if(omitted!==void 0){messageChanged=!0,content.push({type:"text",text:`Tool reference unavailable: ${[...new Set(omitted)].join(", ")}`});continue}let rewritten=rewriteToolReferenceItems(block.content.tool_references,resolve);if(rewritten!==void 0){messageChanged=!0,content.push({...block,content:{...block.content,tool_references:rewritten.kept}});continue}}if(isRecord2(block)&&block.type==="tool_result"){let demotedName=demotedCallNames.get(block.tool_use_id);if(demotedName!==void 0){messageChanged=!0,content.push({type:"text",text:demotedToolResultText(demotedName,toolResultText(block.content))});continue}if(Array.isArray(block.content)){let rewritten=rewriteToolReferenceItems(block.content,resolve);if(rewritten!==void 0){messageChanged=!0;let nextContent=rewritten.kept.length>0?rewritten.kept:[{type:"text",text:`Tool reference unavailable: ${[...new Set(rewritten.omitted)].join(", ")}`}];content.push({...block,content:nextContent});continue}}}content.push(block)}if(content.length===0){changed=!0;continue}if(messageChanged){changed=!0,rewrittenMessages.push({...message,content});continue}rewrittenMessages.push(message)}return changed?{...params,messages:rewrittenMessages}:params}function rewriteToolReferenceItems(items,resolve){let kept=[],omitted=[],rewritten=!1;for(let item of items){if(!isRecord2(item)||item.type!=="tool_reference"||typeof item.tool_name!="string"){kept.push(item);continue}let resolved=resolve(item.tool_name);if(resolved===void 0){omitted.push(item.tool_name),rewritten=!0;continue}if(resolved!==item.tool_name){kept.push({...item,tool_name:resolved}),rewritten=!0;continue}kept.push(item)}return rewritten?{kept,omitted}:void 0}function toolResultText(content){if(typeof content=="string")return content;if(Array.isArray(content)){let parts=[];for(let item of content)isRecord2(item)&&(item.type==="text"&&typeof item.text=="string"?parts.push(item.text):typeof item.type=="string"&&parts.push(`[${item.type}]`));if(parts.length>0)return parts.join(`
4
4
  `)}return"Tool output unavailable."}function resolveCacheRetention(cacheRetention,env,fallback="short"){return cacheRetention||(getProviderEnvValue("PI_CACHE_RETENTION",env)==="long"?"long":typeof process<"u"&&process.env.PI_CACHE_RETENTION!==void 0?"short":fallback)}function getCacheControl(model,cacheRetention,env){let retention=resolveCacheRetention(cacheRetention,env,"short");if(retention==="none")return{retention};let ttl=retention==="long"&&isAnthropicApiBaseUrl(model.baseUrl)&&getAnthropicCompat(model).supportsLongCacheRetention?"1h":void 0;return{retention,cacheControl:{type:"ephemeral",...ttl&&{ttl}}}}var claudeCodeVersion="2.1.251",claudeCodeTools=["Read","Write","Edit","Bash","Grep","Glob","AskUserQuestion","EnterPlanMode","ExitPlanMode","KillShell","NotebookEdit","Skill","Task","TaskOutput","TodoWrite","WebFetch","WebSearch"],ccToolLookup=new Map(claudeCodeTools.map(t=>[t.toLowerCase(),t])),ccToolAliases=new Map([["ask_user_question","AskUserQuestion"]]),toClaudeCodeName=name=>ccToolAliases.get(name)??ccToolLookup.get(name.toLowerCase())??name,fromClaudeCodeName=(name,tools)=>{if(tools&&tools.length>0){let alias=[...ccToolAliases].find(([,wireName])=>wireName===name);if(alias&&tools.some(tool=>tool.name===alias[0]))return alias[0];let lowerName=name.toLowerCase(),matchedTool=tools.find(tool=>tool.name.toLowerCase()===lowerName);if(matchedTool)return matchedTool.name}return name};function convertContentBlocks(content){if(!content.some(c=>c.type==="image"))return sanitizeSurrogates(content.map(c=>c.text).join(`
5
5
  `));let blocks=content.map(block=>block.type==="text"?{type:"text",text:sanitizeSurrogates(block.text)}:isVideoMimeType(block.mimeType)?{type:"video",source:{type:"base64",media_type:block.mimeType,data:block.data}}:{type:"image",source:{type:"base64",media_type:block.mimeType,data:block.data}});return blocks.some(b=>b.type==="text")||blocks.unshift({type:"text",text:"(see attached image)"}),blocks}var FINE_GRAINED_TOOL_STREAMING_BETA="fine-grained-tool-streaming-2025-05-14",INTERLEAVED_THINKING_BETA="interleaved-thinking-2025-05-14",COMPUTER_USE_BETA_PREFIX="computer-use-",NATIVE_COMPUTER_TOOL_TYPE="computer_20250124",ADAPTIVE_THINKING_MODEL_MARKERS=["opus-4-6","opus-4-7","opus-4-8","opus-5","sonnet-4-6","sonnet-5","fable-5","mythos-5"],NATIVE_XHIGH_EFFORT_MODEL_MARKERS=["opus-4-7","opus-4-8","opus-5","sonnet-5","fable-5","mythos-5"],DISABLED_THINKING_REJECTING_MODEL_MARKERS=["fable-5","mythos-5"],UNSUPPORTED_NATIVE_COMPUTER_TOOL_MODEL_MARKERS=["opus-4-6","opus-4.6","opus-4-7","opus-4.7","opus-4-8","opus-4.8"],SERVER_SIDE_FALLBACK_BETA="server-side-fallback-2026-07-01";function shouldUseServerSideFallbackBeta(model){return(model.compat?.allowedFallbackModels?.length??0)>0}var MID_CONVERSATION_OUTPUT_CONFIG_BETA="mid-conversation-output-config-2026-07-01",THINKING_BINDING_CONTROLS_BETA="thinking-binding-controls-2026-08-01",unsignedThinkingTextReplayFallbacks=new Set;registerSessionResourceCleanup(sessionId=>{if(sessionId===void 0){unsignedThinkingTextReplayFallbacks.clear();return}let prefix=`${sessionId}\0`;for(let key of unsignedThinkingTextReplayFallbacks)key.startsWith(prefix)&&unsignedThinkingTextReplayFallbacks.delete(key)});function unsignedThinkingFallbackKey(model,sessionId){return sessionId===void 0?void 0:`${sessionId}\0${model.baseUrl}\0${model.id}`}function isInvalidUnsignedThinkingSignatureError(error){return typeof error=="object"&&error!==null&&"status"in error&&error.status===400&&error instanceof Error&&/Invalid signature in thinking block/i.test(error.message)}function mergeHeaders(...headerSources){let merged={};for(let headers of headerSources)headers&&Object.assign(merged,headers);return merged}function mergeClientHeaders(_model,...headerSources){return mergeHeaders({"User-Agent":getPiUserAgent()},...headerSources)}function hasHeader(headers,name){if(!headers)return!1;let expected=name.toLowerCase();for(let[key,value]of Object.entries(headers))if(key.toLowerCase()===expected&&value!==null&&value.trim().length>0)return!0;return!1}function assertRequestAuth(provider,apiKey,headers){if(!apiKey&&!(hasHeader(headers,"authorization")||hasHeader(headers,"x-api-key")||hasHeader(headers,"cf-aig-authorization")))throw new Error(`No API key for provider: ${provider}`)}function isRecord3(value){return typeof value=="object"&&value!==null}var REPLAYABLE_ANTHROPIC_PROVIDER_NATIVE_TYPES=new Set(["server_tool_use","web_search_tool_result","web_fetch_tool_result","code_execution_tool_result","bash_code_execution_tool_result","text_editor_code_execution_tool_result","tool_search_tool_result","container_upload"]);function isReplayableAnthropicProviderNativeBlock(raw){return isRecord3(raw)&&typeof raw.type=="string"&&REPLAYABLE_ANTHROPIC_PROVIDER_NATIVE_TYPES.has(raw.type)}function isSameAnthropicModel(message,model){return message.provider===model.provider&&message.api===model.api&&message.model===model.id}function isAnthropicFallbackMarkerBlock(block){return block.type==="providerNative"&&block.subtype==="fallback"&&isRecord3(block.raw)&&block.raw.type==="fallback"}function lastAnthropicFallbackBoundary(content){let boundary=-1;for(let index=0;index<content.length;index++)isAnthropicFallbackMarkerBlock(content[index])&&(boundary=index);return boundary}function isAnthropicServerToolUseBlock(raw){return isRecord3(raw)&&raw.type==="server_tool_use"&&typeof raw.id=="string"}function isProviderNativeToolUseBlock(raw){return isRecord3(raw)&&(raw.type==="server_tool_use"||raw.type==="mcp_tool_use")}function isAnthropicWebSearchReplayBlock(raw){return isRecord3(raw)?raw.type==="web_search_tool_result"?!0:raw.type==="server_tool_use"&&raw.name==="web_search":!1}function userMessageClosesServerTurn(message){return typeof message.content=="string"?message.content.trim().length>0:message.content.some(block=>block.type==="text"&&block.text.trim().length>0||block.type==="image")}function collectProviderNativeToolPairing(messages,model,deferredToolNames,normalizeToolName,discardedFallbackToolCallIds){let resolvedUseIds=new Set,validResultIds=new Set,pendingUseIds=new Set,loadedReferenceNames=new Set;for(let message of messages){if(message.role==="assistant"){let priorUseIds=pendingUseIds;if(pendingUseIds=new Set,!isSameAnthropicModel(message,model))continue;for(let block of message.content){if(block.type!=="providerNative"||!isRecord3(block.raw))continue;let raw=block.raw;typeof raw.type!="string"||!REPLAYABLE_ANTHROPIC_PROVIDER_NATIVE_TYPES.has(raw.type)||isProviderNativeToolUseBlock(raw)&&typeof raw.id=="string"&&pendingUseIds.add(raw.id)}for(let block of message.content){if(block.type!=="providerNative"||!isRecord3(block.raw))continue;let raw=block.raw;if(typeof raw.type!="string"||!REPLAYABLE_ANTHROPIC_PROVIDER_NATIVE_TYPES.has(raw.type))continue;let toolUseId=raw.tool_use_id;typeof toolUseId=="string"&&(priorUseIds.has(toolUseId)||pendingUseIds.has(toolUseId))&&(resolvedUseIds.add(toolUseId),validResultIds.add(toolUseId))}continue}if(message.role==="toolResult"){if(discardedFallbackToolCallIds.has(message.toolCallId))continue;let emitsReferences=!1;for(let name of message.addedToolNames??[]){let normalizedName=normalizeToolName(name);!deferredToolNames.has(normalizedName)||loadedReferenceNames.has(normalizedName)||(loadedReferenceNames.add(normalizedName),emitsReferences=!0)}emitsReferences&&(pendingUseIds=new Set);continue}message.role==="user"&&userMessageClosesServerTurn(message)&&(pendingUseIds=new Set)}return{resolvedUseIds,liveUseIds:pendingUseIds,validResultIds}}function isUnpairedProviderNativeToolBlock(raw,pairing){if(!isRecord3(raw))return!1;if(isProviderNativeToolUseBlock(raw))return typeof raw.id!="string"||!(pairing.resolvedUseIds.has(raw.id)||pairing.liveUseIds.has(raw.id));let toolUseId=raw.tool_use_id;return typeof toolUseId=="string"&&!pairing.validResultIds.has(toolUseId)}function pairedServerToolUseIdsBeforeBoundary(content,boundary){let paired=new Set;for(let index=0;index<boundary;index++){let block=content[index];if(block.type!=="providerNative"||!isRecord3(block.raw))continue;let toolUseId=block.raw.tool_use_id;typeof toolUseId=="string"&&paired.add(toolUseId)}return paired}function collectDiscardedFallbackToolCallIds(messages,model){let discarded=new Set;for(let message of messages){if(message.role!=="assistant"||!isSameAnthropicModel(message,model))continue;let boundary=lastAnthropicFallbackBoundary(message.content);if(!(boundary<0))for(let index=0;index<boundary;index++){let block=message.content[index];block.type==="toolCall"&&discarded.add(block.id)}}return discarded}function stringRecord(value){if(!isRecord3(value))return;let entries=Object.entries(value);if(!entries.some(([,item])=>typeof item!="string"))return Object.fromEntries(entries)}function isForcedAnthropicToolChoice(toolChoice){return isRecord3(toolChoice)&&(toolChoice.type==="any"||toolChoice.type==="tool")}function extractPayloadRequestMetadata(params){let payload=params,headers=stringRecord(payload.headers);if(!("headers"in payload)&&!("extra_body"in payload))return headers?{params,headers}:{params};let stripped={...payload};return delete stripped.headers,delete stripped.extra_body,headers?{params:stripped,headers}:{params:stripped}}function removeAnthropicBetaHeaders(headers,shouldRemoveBeta){if(!headers)return{changed:!1};let nextHeaders={},changed=!1;for(let[key,value]of Object.entries(headers)){if(key.toLowerCase()!=="anthropic-beta"||value===null){nextHeaders[key]=value;continue}let betas=value.split(",").map(beta=>beta.trim()).filter(beta=>beta.length>0),supportedBetas=betas.filter(beta=>!shouldRemoveBeta(beta));changed=changed||supportedBetas.length!==betas.length,supportedBetas.length>0&&(nextHeaders[key]=supportedBetas.join(", "))}return changed?{changed:!0,headers:Object.keys(nextHeaders).length>0?nextHeaders:void 0}:{changed:!1,headers}}function removeComputerUseBetaHeader(headers){return removeAnthropicBetaHeaders(headers,beta=>beta.startsWith(COMPUTER_USE_BETA_PREFIX))}function sanitizeAdaptiveThinkingHeaders(model,headers){if(!supportsAdaptiveThinking(model))return headers;let headerSanitization=removeAnthropicBetaHeaders(headers,beta=>beta===INTERLEAVED_THINKING_BETA);return headerSanitization.changed?headerSanitization.headers??{}:headers}function rejectsNativeComputerTool(model,toolType){return model.provider==="cloudflare-ai-gateway"&&model.baseUrl.includes("anthropic")?toolType.startsWith("computer_"):matchesModelMarker(model,UNSUPPORTED_NATIVE_COMPUTER_TOOL_MODEL_MARKERS)&&toolType===NATIVE_COMPUTER_TOOL_TYPE}function rejectsComputerUseBeta(model){return model.provider==="cloudflare-ai-gateway"&&model.baseUrl.includes("anthropic")||matchesModelMarker(model,UNSUPPORTED_NATIVE_COMPUTER_TOOL_MODEL_MARKERS)}function isAnthropicWebSearchToolType(toolType){return toolType.startsWith("web_search_")}function sanitizeUnsupportedNativeTools(model,params){let payload=params,headers=stringRecord(payload.headers),headerSanitization=rejectsComputerUseBeta(model)?removeComputerUseBetaHeader(headers):{changed:!1},rejectsNativeWebSearch=!getAnthropicCompat(model).supportsWebSearch,tools=payload.tools,sanitized={...payload},changed=!1;if(Array.isArray(tools)){let supportedTools=[];for(let tool of tools){let hookTool=tool;if(isRecord3(hookTool)&&typeof hookTool.type=="string"&&(rejectsNativeComputerTool(model,hookTool.type)||rejectsNativeWebSearch&&isAnthropicWebSearchToolType(hookTool.type))){changed=!0;continue}supportedTools.push(tool)}changed&&(supportedTools.length>0?sanitized.tools=supportedTools:delete sanitized.tools)}if(headerSanitization.changed&&(changed=!0,headerSanitization.headers?sanitized.headers=headerSanitization.headers:delete sanitized.headers),changed&&isRecord3(sanitized.tool_choice)){let toolChoiceName=sanitized.tool_choice.name,hasSelectedTool=typeof toolChoiceName=="string"&&Array.isArray(sanitized.tools)&&sanitized.tools.some(tool=>isRecord3(tool)&&tool.name===toolChoiceName);(sanitized.tools===void 0||typeof toolChoiceName=="string"&&!hasSelectedTool)&&delete sanitized.tool_choice}return changed?sanitized:params}function httpStatusOfError(error){if(!isRecord3(error))return;let status=error.status;return typeof status=="number"&&Number.isInteger(status)&&status>=100&&status<600?status:void 0}function sanitizeAdaptiveThinkingPayload(model,params,options){if(!supportsAdaptiveThinking(model))return params;let payload=params,headers=stringRecord(payload.headers),headerSanitization=removeAnthropicBetaHeaders(headers,beta=>beta===INTERLEAVED_THINKING_BETA),sanitized={...payload},changed=!1,thinking=isRecord3(payload.thinking)?payload.thinking:void 0;if(thinking?.type==="enabled"){let display=thinking.display==="omitted"||thinking.display==="summarized"?thinking.display:options?.thinkingDisplay??"summarized";sanitized.thinking={type:"adaptive",display},options?.effort!==void 0&&!isRecord3(payload.output_config)&&(sanitized.output_config={effort:options.effort}),changed=!0}return headerSanitization.changed&&(changed=!0,headerSanitization.headers?sanitized.headers=headerSanitization.headers:delete sanitized.headers),changed?sanitized:params}function isCacheableUserContentBlock(block){return block?.type==="text"||block?.type==="image"||block?.type==="tool_result"}function appendUserBlocks(params,newBlocks){if(newBlocks.length===0)return;let lastParam=params[params.length-1];lastParam?.role==="user"?typeof lastParam.content=="string"?lastParam.content=[{type:"text",text:lastParam.content},...newBlocks]:Array.isArray(lastParam.content)&&lastParam.content.push(...newBlocks):params.push({role:"user",content:newBlocks})}function isToolLoopContinuation(messages){let tail=messages[messages.length-1],preceding=messages[messages.length-2];return tail?.role==="user"&&Array.isArray(tail.content)&&tail.content.some(block=>block.type==="tool_result")&&preceding?.role==="assistant"&&Array.isArray(preceding.content)&&preceding.content.some(block=>block.type==="tool_use")}function markUserMessageCacheCheckpoint(message,cacheControl){if(message.role!=="user")return!1;if(Array.isArray(message.content)){let lastBlock=message.content[message.content.length-1];return isCacheableUserContentBlock(lastBlock)?(lastBlock.cache_control=cacheControl,!0):!1}return typeof message.content=="string"?(message.content=[{type:"text",text:message.content,cache_control:cacheControl}],!0):!1}var ANTHROPIC_MESSAGE_EVENTS=new Set(["message_start","message_delta","message_stop","content_block_start","content_block_delta","content_block_stop"]);function flushSseEvent(state){if(!state.event&&state.data.length===0)return null;let event={event:state.event,data:state.data.join(`
@@ -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{import_websocket_server,wrapper_default}from"./chunk-2DQQ4XNS.js";import{AuthStorage,DefaultResourceLoader,GOAL_STORE_CHANGED_EVENT,ModelRegistry,clearGoal,createAgentSession,createGoal,createPendingQuestion,defaultModelPerProvider,formatProviderNativeBody,formatProviderNativeSummary,getMcpService,goalStoreRef,loadMcpConfig,loadSkills,readGoal,resolveAuthMode,updateGoal}from"./chunk-AH72FRZ2.js";import"./chunk-EONVPHVX.js";import{SessionManager,acquireOwnershipSafeLock,loadEntriesFromFile}from"./chunk-7A47FVQC.js";import{parseDaemonPidFile,processMatchesPidFile,readProcessStartTime,stopValidatedPid,waitForGone,waitForStartTime}from"./chunk-NLOZDJQX.js";import{getCredentialAccounts,getModels,getProviders,getSupportedThinkingLevels,pinCredentialAccount,removeCredentialAccount,subscribeProviderAccountEvents}from"./chunk-F5JZNLDE.js";import"./chunk-U6Z6OBX4.js";import{attachJsonlLineReader}from"./chunk-QGBRSL64.js";import{require_ignore}from"./chunk-XJUVWITG.js";import"./chunk-3Q4WGKFA.js";import{getAvailableThemesWithPaths,getThemeByName,takeOverStdout,theme,waitForRawStdoutBackpressure,writeRawStdout}from"./chunk-CKNRCW35.js";import{x}from"./chunk-YRN3PCTM.js";import{SettingsManager}from"./chunk-4C7LNOHI.js";import"./chunk-GFUZPFHN.js";import"./chunk-QOBJEPJZ.js";import"./chunk-BMX2U22F.js";import"./chunk-BQVRDBW6.js";import"./chunk-H4QOEVS5.js";import"./chunk-HB35RBP4.js";import"./chunk-QROWINIH.js";import"./chunk-ANTGWIGI.js";import"./chunk-2H3Y7EYQ.js";import"./chunk-VRAYXSST.js";import"./chunk-56TWFZ2C.js";import"./chunk-Y6HDGVS5.js";import"./chunk-3XHLKHSK.js";import"./chunk-7X72IACK.js";import"./chunk-X4Q5YSTE.js";import"./chunk-WVGCQOLJ.js";import"./chunk-EAMTSSEH.js";import"./chunk-RFB5CBW7.js";import"./chunk-OYXTZDVT.js";import"./chunk-V55B77HQ.js";import"./chunk-FC7R7NOV.js";import"./chunk-PRC5XIIH.js";import"./chunk-I3F6VZZF.js";import"./chunk-BPX6QWPD.js";import"./chunk-WDTJ6JKE.js";import"./chunk-DMI55M2N.js";import"./chunk-BQVVQ2LQ.js";import"./chunk-TVOODZJH.js";import"./chunk-I7YUNMWH.js";import"./chunk-2SOVDETB.js";import"./chunk-U7RQY7MH.js";import"./chunk-7FXIHFZU.js";import"./chunk-QPIXPR6I.js";import"./chunk-QNZ24YOQ.js";import"./chunk-26UBFF6N.js";import"./chunk-3P23SBT3.js";import{APP_NAME,CONFIG_DIR_NAME,ENV_SESSION_DIR,VERSION,getAgentDir,getSessionsDir,resolvePath}from"./chunk-H5RK2RYZ.js";import"./chunk-TDTKQR7C.js";import{__toESM}from"./chunk-VR4X5O2Z.js";import{isIP}from"node:net";var APP_SERVER_LISTEN_USAGE="Invalid --listen value. Use stdio://, unix://, unix:///abs/path, or ws://IP:PORT.";function formatAppServerUsage(){let listenForms="stdio://|unix://|unix:///abs/path|ws://IP:PORT";return[`Usage: ${APP_NAME} app-server [--listen <${listenForms}>] [--ws-auth <token-file|off>] [--json-logs]`,` ${APP_NAME} app-server daemon <start|stop|status|restart> [--listen <${listenForms}>]`].join(`
2
+ import{import_websocket_server,wrapper_default}from"./chunk-2DQQ4XNS.js";import{AuthStorage,DefaultResourceLoader,GOAL_STORE_CHANGED_EVENT,ModelRegistry,clearGoal,createAgentSession,createGoal,createPendingQuestion,defaultModelPerProvider,formatProviderNativeBody,formatProviderNativeSummary,getMcpService,goalStoreRef,loadMcpConfig,loadSkills,readGoal,resolveAuthMode,updateGoal}from"./chunk-KKDSBABY.js";import{require_ignore}from"./chunk-3FRTRCR6.js";import"./chunk-EONVPHVX.js";import"./chunk-3Q4WGKFA.js";import{SessionManager,loadEntriesFromFile}from"./chunk-W4SRGDQ4.js";import"./chunk-GFUZPFHN.js";import{getCredentialAccounts,getModels,getProviders,getSupportedThinkingLevels,pinCredentialAccount,removeCredentialAccount,subscribeProviderAccountEvents}from"./chunk-NARL7XFO.js";import{getAvailableThemesWithPaths,getThemeByName,takeOverStdout,theme,waitForRawStdoutBackpressure,writeRawStdout}from"./chunk-RLRLQRI2.js";import{x}from"./chunk-YRN3PCTM.js";import{SettingsManager}from"./chunk-PLZK7ABD.js";import"./chunk-QOBJEPJZ.js";import"./chunk-BMX2U22F.js";import"./chunk-IUZUN32Z.js";import{acquireOwnershipSafeLock}from"./chunk-P7PWCGLJ.js";import"./chunk-U6Z6OBX4.js";import{parseDaemonPidFile,processMatchesPidFile,readProcessStartTime,stopValidatedPid,waitForGone,waitForStartTime}from"./chunk-LF3XTYYF.js";import{attachJsonlLineReader}from"./chunk-HSH674C6.js";import"./chunk-BQVRDBW6.js";import"./chunk-H4QOEVS5.js";import"./chunk-HB35RBP4.js";import"./chunk-XK24AFYU.js";import"./chunk-MUC3MZTV.js";import"./chunk-2H3Y7EYQ.js";import"./chunk-FDLVINNY.js";import"./chunk-56TWFZ2C.js";import"./chunk-34GCWLNV.js";import"./chunk-7X72IACK.js";import"./chunk-3XHLKHSK.js";import"./chunk-X4Q5YSTE.js";import"./chunk-WVGCQOLJ.js";import"./chunk-IXAUDPOK.js";import"./chunk-EAMTSSEH.js";import"./chunk-RFB5CBW7.js";import"./chunk-OYXTZDVT.js";import"./chunk-V55B77HQ.js";import"./chunk-FC7R7NOV.js";import"./chunk-PRC5XIIH.js";import"./chunk-I3F6VZZF.js";import"./chunk-BPX6QWPD.js";import"./chunk-WDTJ6JKE.js";import"./chunk-DMI55M2N.js";import"./chunk-BQVVQ2LQ.js";import"./chunk-TVOODZJH.js";import"./chunk-I7YUNMWH.js";import"./chunk-2SOVDETB.js";import"./chunk-U7RQY7MH.js";import"./chunk-UAYBYTFN.js";import"./chunk-QPIXPR6I.js";import"./chunk-HGAX6JZ7.js";import"./chunk-26UBFF6N.js";import"./chunk-3P23SBT3.js";import{APP_NAME,CONFIG_DIR_NAME,ENV_SESSION_DIR,VERSION,getAgentDir,getSessionsDir,resolvePath}from"./chunk-H5RK2RYZ.js";import"./chunk-TDTKQR7C.js";import{__toESM}from"./chunk-VR4X5O2Z.js";import{isIP}from"node:net";var APP_SERVER_LISTEN_USAGE="Invalid --listen value. Use stdio://, unix://, unix:///abs/path, or ws://IP:PORT.";function formatAppServerUsage(){let listenForms="stdio://|unix://|unix:///abs/path|ws://IP:PORT";return[`Usage: ${APP_NAME} app-server [--listen <${listenForms}>] [--ws-auth <token-file|off>] [--json-logs]`,` ${APP_NAME} app-server daemon <start|stop|status|restart> [--listen <${listenForms}>]`].join(`
3
3
  `)}function parseListen(value){if(value==="stdio://")return{kind:"stdio",url:"stdio://"};if(value==="unix://")return{kind:"unix",url:"unix://"};if(value.startsWith("unix:///")){let path=value.slice(7);return path.startsWith("/")?{kind:"unix",url:value,path}:void 0}if(!value.startsWith("ws://"))return;let parsed;try{parsed=new URL(value)}catch(error){if(error instanceof TypeError)return;throw error}let port=Number(parsed.port);if(!(parsed.protocol!=="ws:"||parsed.username!==""||parsed.password!==""||parsed.pathname!=="/"||parsed.search!==""||parsed.hash!==""||parsed.port===""||!Number.isInteger(port)||port<1||port>65535||isIP(parsed.hostname)===0))return{kind:"ws",url:value,host:parsed.hostname,port}}function parseDaemonVerb(value){switch(value){case"start":case"stop":case"status":case"restart":return value;default:return}}function parseWsAuth(value){return value==="off"?{kind:"off"}:{kind:"token-file",path:value}}function parseServerArgs(args){let listen3={kind:"stdio",url:"stdio://"},wsAuth,jsonLogs=!1;for(let index=0;index<args.length;index++){let arg=args[index];if(arg==="--listen"){let value=args[index+1];if(value===void 0)return{kind:"usage-error",message:APP_SERVER_LISTEN_USAGE};let parsed=parseListen(value);if(parsed===void 0)return{kind:"usage-error",message:APP_SERVER_LISTEN_USAGE};listen3=parsed,index++;continue}if(arg==="--ws-auth"){let value=args[index+1];if(value===void 0)return{kind:"usage-error",message:"--ws-auth requires <token-file|off>."};wsAuth=parseWsAuth(value),index++;continue}if(arg==="--json-logs"){jsonLogs=!0;continue}return{kind:"usage-error",message:`Unexpected app-server argument: ${arg}`}}return{kind:"server",listen:listen3,wsAuth,jsonLogs}}function parseDaemonArgs(args){let verb=parseDaemonVerb(args[0]);if(verb===void 0)return{kind:"usage-error",message:"Usage: app-server daemon <start|stop|status|restart>."};let listen3={kind:"ws",url:"ws://127.0.0.1:18800",host:"127.0.0.1",port:18800};for(let index=1;index<args.length;index++){let arg=args[index];if(arg==="--listen"){let value=args[index+1];if(value===void 0)return{kind:"usage-error",message:APP_SERVER_LISTEN_USAGE};let parsed=parseListen(value);if(parsed===void 0)return{kind:"usage-error",message:APP_SERVER_LISTEN_USAGE};listen3=parsed,index++;continue}return{kind:"usage-error",message:`Unexpected app-server daemon argument: ${arg}`}}return{kind:"daemon",verb,listen:listen3}}function parseAppServerCliArgs(args){return args[0]==="daemon"?parseDaemonArgs(args.slice(1)):parseServerArgs(args)}var RpcHandlerError=class extends Error{constructor(error){super(error.message),this.name="RpcHandlerError",this.rpcError=error}};function invalidRequestError(){return{code:-32600,message:"Invalid request"}}function methodNotFoundError(method){return{code:-32601,message:`Method not found: ${method}`}}function invalidParamsError(){return{code:-32602,message:"Invalid params"}}function internalError(message="Internal error"){return{code:-32603,message}}function notInitializedError(){return{code:-32600,message:"Not initialized"}}function alreadyInitializedError(){return{code:-32600,message:"Already initialized"}}function experimentalCapabilityError(method){return{code:-32600,message:`${method} requires experimentalApi capability`}}function registerExtensionRequestMethod(registry,getThread){registry.register("extension_request",{scope:"thread",handler:async({request})=>{let params=request.params;if(typeof params!="object"||params===null||Array.isArray(params))throw new RpcHandlerError({code:-32602,message:"Invalid params"});let threadId=Reflect.get(params,"threadId"),name=Reflect.get(params,"name");if(typeof threadId!="string"||threadId.length===0||typeof name!="string"||name.length===0)throw new RpcHandlerError({code:-32602,message:"Invalid params"});try{return await getThread(threadId).extensionRunner.requestRpc(name,Reflect.get(params,"data"))}catch(error){throw new RpcHandlerError(internalError(error instanceof Error?error.message:String(error)))}}})}function createRegistry(){return new InMemoryMethodRegistry}var InMemoryMethodRegistry=class{constructor(){this.methods=new Map}register(method,registration){this.methods.set(method,registration)}async dispatch(connection,request){if(!connection.initialized){let registration2=this.methods.get(request.method);if(request.method!=="initialize"||registration2?.requiresInit!==!1)return{id:request.id,error:notInitializedError()}}if(connection.initialized&&request.method==="initialize")return{id:request.id,error:alreadyInitializedError()};let registration=this.methods.get(request.method);if(!registration)return{id:request.id,error:methodNotFoundError(request.method)};if(registration.experimental===!0&&connection.capabilities?.experimentalApi!==!0)return{id:request.id,error:experimentalCapabilityError(request.method)};try{let result=await registration.handler({connection,request});return{id:request.id,result}}catch(error){return error instanceof RpcHandlerError?{id:request.id,error:error.rpcError}:{id:request.id,error:internalError(error instanceof Error?error.message:String(error))}}}};function registerFuzzyFileSearchMethods(registry,service){registry.register("fuzzyFileSearch",{scope:"global",handler:({request})=>service.search(parseOneShotParams(request.params))}),registry.register("fuzzyFileSearch/sessionStart",{experimental:!0,scope:"global",handler:({request})=>service.startSession(parseSessionStartParams(request.params))}),registry.register("fuzzyFileSearch/sessionUpdate",{experimental:!0,scope:"global",handler:({request})=>service.updateSession(parseSessionUpdateParams(request.params))}),registry.register("fuzzyFileSearch/sessionStop",{experimental:!0,scope:"global",handler:({request})=>service.stopSession(parseSessionStopParams(request.params))})}function parseOneShotParams(value){let params=objectParams(value,"fuzzyFileSearch");return{query:requiredString(params.query,"fuzzyFileSearch query"),roots:requiredStringArray(params.roots,"fuzzyFileSearch roots"),cancellationToken:optionalString(params.cancellationToken,"fuzzyFileSearch cancellationToken")}}function parseSessionStartParams(value){let params=objectParams(value,"fuzzyFileSearch/sessionStart");return{sessionId:requiredString(params.sessionId,"fuzzyFileSearch/sessionStart sessionId"),roots:requiredStringArray(params.roots,"fuzzyFileSearch/sessionStart roots")}}function parseSessionUpdateParams(value){let params=objectParams(value,"fuzzyFileSearch/sessionUpdate");return{sessionId:requiredString(params.sessionId,"fuzzyFileSearch/sessionUpdate sessionId"),query:requiredString(params.query,"fuzzyFileSearch/sessionUpdate query")}}function parseSessionStopParams(value){let params=objectParams(value,"fuzzyFileSearch/sessionStop");return{sessionId:requiredString(params.sessionId,"fuzzyFileSearch/sessionStop sessionId")}}function objectParams(value,method){if(!isRecord(value))throw invalidRequest(`${method} params must be an object`);return value}function requiredString(value,field){if(typeof value!="string")throw invalidRequest(`${field} must be a string`);return value}function requiredStringArray(value,field){if(!Array.isArray(value)||value.some(entry=>typeof entry!="string"))throw invalidRequest(`${field} must be an array of strings`);return value}function optionalString(value,field){if(value==null)return null;if(typeof value!="string")throw invalidRequest(`${field} must be a string or null`);return value}function invalidRequest(message){return new RpcHandlerError({code:-32600,message})}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}import{lstat,readdir}from"node:fs/promises";import{basename,join as join2,relative as relative2,resolve,sep as sep2}from"node:path";var import_ignore=__toESM(require_ignore(),1);import{readFile}from"node:fs/promises";import{join,relative,sep}from"node:path";async function addGitignoreScope(matchers,directory){let gitignore=await readableText(join(directory,".gitignore"));return gitignore===void 0?matchers:[...matchers,{directory,matcher:(0,import_ignore.default)().add(gitignore)}]}function isIgnored(matchers,path,isDirectory){let ignored=!1;for(let scope of matchers){let relativePath=relative(scope.directory,path).split(sep).join("/"),result=scope.matcher.test(isDirectory?`${relativePath}/`:relativePath);result.ignored&&(ignored=!0),result.unignored&&(ignored=!1)}return ignored}async function readableText(path){try{return await readFile(path,"utf8")}catch(error){if(error instanceof Error)return;throw error}}var FUZZY_SEARCH_MAX_DEPTH=12,FUZZY_SEARCH_MAX_VISITED_ENTRIES=5e4,FUZZY_SEARCH_RESULT_LIMIT=50,FILENAME_MATCH_BONUS=1e6,CHARACTER_MATCH_SCORE=10,CONTIGUOUS_MATCH_BONUS=20,BOUNDARY_MATCH_BONUS=5,CANCELLATION_YIELD_INTERVAL=256;async function collectFuzzyFileEntries(roots,options={}){let entries=[],state={visitedEntries:0,stopped:!1},maxDepth=options.maxDepth??FUZZY_SEARCH_MAX_DEPTH,maxVisitedEntries=options.maxVisitedEntries??FUZZY_SEARCH_MAX_VISITED_ENTRIES;for(let root of roots){if(options.signal?.aborted||state.stopped)break;let absoluteRoot=resolve(root),rootStat=await readableStat(absoluteRoot);!rootStat?.isDirectory()||rootStat.isSymbolicLink()||await walkDirectory({wireRoot:root,absoluteRoot,absoluteDirectory:absoluteRoot,depth:0,matchers:[],entries,state,signal:options.signal,maxDepth,maxVisitedEntries})}return entries}function rankFuzzyFileEntries(query,entries){if(query.length===0)return[];let results=[];for(let entry of entries){let filenameMatch=scoreSubsequence(entry.fileName,query),pathMatch=filenameMatch??scoreSubsequence(entry.path,query);if(!pathMatch)continue;let filenameOffset=Array.from(entry.path).length-Array.from(entry.fileName).length,indices=filenameMatch?filenameMatch.indices.map(index=>index+filenameOffset):pathMatch.indices;results.push({root:entry.root,path:entry.path,match_type:entry.matchType,file_name:entry.fileName,score:pathMatch.score+(filenameMatch?FILENAME_MATCH_BONUS:0),indices})}return results.sort(compareResults),results.slice(0,FUZZY_SEARCH_RESULT_LIMIT)}async function walkDirectory(input){let matchers=await addGitignoreScope(input.matchers,input.absoluteDirectory),directoryEntries=await readableDirectory(input.absoluteDirectory);directoryEntries.sort((left,right)=>compareText(left.name,right.name));for(let directoryEntry of directoryEntries){if(input.signal?.aborted||input.state.stopped)return;if(input.state.visitedEntries>=input.maxVisitedEntries){input.state.stopped=!0;return}if(input.state.visitedEntries+=1,directoryEntry.name===".git"||directoryEntry.name==="node_modules"||directoryEntry.isSymbolicLink())continue;let isDirectory=directoryEntry.isDirectory();if(!isDirectory&&!directoryEntry.isFile())continue;let absolutePath=join2(input.absoluteDirectory,directoryEntry.name),relativePath=toPosixPath(relative2(input.absoluteRoot,absolutePath));if(isIgnored(matchers,absolutePath,isDirectory))continue;input.entries.push({root:input.wireRoot,path:relativePath,matchType:isDirectory?"directory":"file",fileName:basename(relativePath)});let entryDepth=input.depth+1;isDirectory&&entryDepth<input.maxDepth&&await walkDirectory({...input,absoluteDirectory:absolutePath,depth:entryDepth,matchers}),input.state.visitedEntries%CANCELLATION_YIELD_INTERVAL===0&&await yieldToEventLoop()}}function scoreSubsequence(candidate,query){let normalizedCandidate=normalizeText(candidate),normalizedQuery=query.toLowerCase(),contiguousStart=normalizedCandidate.value.indexOf(normalizedQuery),normalizedIndices=[];if(contiguousStart>=0){let cursor=contiguousStart;for(let character of normalizedQuery)normalizedIndices.push(cursor),cursor+=character.length}else{let cursor=0;for(let character of normalizedQuery){let matchIndex=normalizedCandidate.value.indexOf(character,cursor);if(matchIndex<0)return;normalizedIndices.push(matchIndex),cursor=matchIndex+character.length}}let indices=[];for(let normalizedIndex of normalizedIndices){let sourceIndex=normalizedCandidate.sourceIndices[normalizedIndex];if(sourceIndex===void 0)return;indices.at(-1)!==sourceIndex&&indices.push(sourceIndex)}let candidateCharacters=Array.from(candidate),score=indices.length*CHARACTER_MATCH_SCORE;for(let index=0;index<indices.length;index++){let current=indices[index];if(current===void 0)continue;let previous=indices[index-1];previous!==void 0&&current===previous+1&&(score+=CONTIGUOUS_MATCH_BONUS),(current===0||isBoundary(candidateCharacters[current-1]))&&(score+=BOUNDARY_MATCH_BONUS)}return{score,indices}}function normalizeText(value){let sourceIndices=[];for(let[sourceIndex,character]of Array.from(value).entries())for(let index=0;index<character.toLowerCase().length;index++)sourceIndices.push(sourceIndex);return{value:value.toLowerCase(),sourceIndices}}function compareResults(left,right){return left.score!==right.score?right.score-left.score:compareText(left.path,right.path)}function compareText(left,right){return left<right?-1:left>right?1:0}function isBoundary(character){return character==="/"||character==="-"||character==="_"||character==="."||character===" "}async function readableDirectory(path){try{return await readdir(path,{withFileTypes:!0})}catch(error){if(error instanceof Error)return[];throw error}}async function readableStat(path){try{return await lstat(path)}catch(error){if(error instanceof Error)return;throw error}}function toPosixPath(path){return path.split(sep2).join("/")}function yieldToEventLoop(){return new Promise(resolve4=>setImmediate(resolve4))}var FuzzyFileSearchService=class{constructor(options){this.activeSearches=new Set,this.pendingSearches=new Map,this.sessions=new Map,this.disposed=!1,this.broadcast=options.broadcast,this.collectEntries=options.collectEntries??((roots,signal)=>collectFuzzyFileEntries(roots,{signal})),this.rankEntries=options.rankEntries??rankFuzzyFileEntries}async search(params){if(this.disposed)return{files:[]};let controller=new AbortController;this.activeSearches.add(controller);let token=params.cancellationToken;token!==null&&(this.pendingSearches.get(token)?.abort(),this.pendingSearches.set(token,controller));try{if(params.query.length===0)return{files:[]};let entries=await this.collectEntries(params.roots,controller.signal);return controller.signal.aborted||this.disposed?{files:[]}:{files:this.rankEntries(params.query,entries)}}finally{this.activeSearches.delete(controller),token!==null&&this.pendingSearches.get(token)===controller&&this.pendingSearches.delete(token)}}startSession(params){if(params.sessionId.length===0)throw invalidRequest2("sessionId must not be empty");this.cancelSession(params.sessionId);let session={id:params.sessionId,roots:params.roots,controller:new AbortController,query:"",version:0,entries:void 0,active:!this.disposed,completedVersion:void 0};return this.sessions.set(session.id,session),this.runTraversal(session),{}}updateSession(params){let session=this.sessions.get(params.sessionId);if(!session?.active)throw invalidRequest2(`fuzzy file search session not found: ${params.sessionId}`);return session.query=params.query,session.version+=1,session.entries!==void 0&&this.emitVersion(session,session.version),{}}stopSession(params){return this.cancelSession(params.sessionId),{}}dispose(){if(!this.disposed){this.disposed=!0;for(let controller of this.activeSearches)controller.abort();this.activeSearches.clear(),this.pendingSearches.clear();for(let session of this.sessions.values())this.deactivate(session);this.sessions.clear()}}async runTraversal(session){let entries;try{entries=await this.collectEntries(session.roots,session.controller.signal)}catch(error){if(!(error instanceof Error))throw error;entries=[]}if(this.isLive(session))for(session.entries=entries;this.isLive(session);){let version=session.version;if(await this.emitVersion(session,version))break}}async emitVersion(session,version){if(await Promise.resolve(),!this.isLive(session)||session.version!==version||session.entries===void 0)return!1;if(session.completedVersion===version)return!0;let query=session.query,files=query.length===0?[]:this.rankEntries(query,session.entries);return!this.isLive(session)||session.version!==version||(this.broadcast({method:"fuzzyFileSearch/sessionUpdated",params:{sessionId:session.id,query,files}}),!this.isLive(session)||session.version!==version)?!1:(session.completedVersion=version,this.broadcast({method:"fuzzyFileSearch/sessionCompleted",params:{sessionId:session.id}}),!0)}cancelSession(sessionId){let session=this.sessions.get(sessionId);session&&(this.deactivate(session),this.sessions.get(sessionId)===session&&this.sessions.delete(sessionId))}deactivate(session){session.active=!1,session.controller.abort()}isLive(session){return!this.disposed&&session.active&&this.sessions.get(session.id)===session}};function invalidRequest2(message){return new RpcHandlerError({code:-32600,message})}var APPROVAL_DECISIONS=["accept","acceptForSession","decline","cancel"],PERMISSION_OPTIONS=["Allow once","Allow always","Deny","Deny with feedback"],CANCEL_REASON="approval request was cancelled because the turn ended",NO_SUBSCRIBER_REASON="no client connected to approve";var ApprovalBridge=class{constructor(sendToThreadSubscribers){this.nextServerRequestId=0,this.pending=new Map,this.sessionAllows=new Set,this.sendToThreadSubscribers=sendToThreadSubscribers}get pendingCount(){return this.pending.size}requestApproval(threadId,kind,payload){let allowKey=createAllowKey(threadId,kind,payload);if(allowKey&&this.sessionAllows.has(allowKey))return Promise.resolve({allow:!0,decision:"acceptForSession"});let requestId=this.nextServerRequestId;this.nextServerRequestId+=1;let request=buildApprovalRequest(threadId,requestId,kind,payload);return new Promise(resolve4=>{this.pending.set(requestId,{threadId,request,allowKey,resolve:resolve4}),!(this.sendToThreadSubscribers(threadId,request)>0)&&(this.pending.delete(requestId),resolve4({allow:!1,decision:"decline",reason:NO_SUBSCRIBER_REASON}))})}resolveResponse(response){let pending=this.pending.get(response.id);if(!pending)return!1;let decision=readDecision(response);return this.pending.delete(response.id),decision==="acceptForSession"&&pending.allowKey&&this.sessionAllows.add(pending.allowKey),this.emitResolved(pending.threadId,response.id),pending.resolve(decisionToOutcome(decision,readReason(response))),!0}replayPendingForThread(threadId){let replayed=0;for(let pending of this.pending.values())pending.threadId===threadId&&(this.sendToThreadSubscribers(threadId,pending.request),replayed+=1);return replayed}cancelPendingForThread(threadId){let cancelled=0;for(let[requestId,pending]of Array.from(this.pending.entries()))pending.threadId===threadId&&(this.pending.delete(requestId),this.emitResolved(threadId,requestId),pending.resolve({allow:!1,decision:"cancel",reason:CANCEL_REASON}),cancelled+=1);return cancelled}emitResolved(threadId,requestId){this.sendToThreadSubscribers(threadId,{method:"serverRequest/resolved",params:{threadId,requestId}})}};function buildApprovalRequest(threadId,requestId,kind,payload){let base={threadId,turnId:payload.turnId??"turn-approval",itemId:payload.itemId??(kind==="commandExecution"?"approval-command":"approval-file-change"),startedAtMs:Date.now()};return kind==="fileChange"?{id:requestId,method:"item/fileChange/requestApproval",params:{...base,reason:payload.reason??null,grantRoot:payload.grantRoot??null}}:{id:requestId,method:"item/commandExecution/requestApproval",params:{...base,approvalId:payload.approvalId??null,environmentId:payload.environmentId??null,reason:payload.reason??null,command:payload.command??null,cwd:payload.cwd??null,availableDecisions:[...APPROVAL_DECISIONS]}}}function decisionToOutcome(decision,reason){return decision==="accept"||decision==="acceptForSession"?{allow:!0,decision}:reason?{allow:!1,decision,reason}:{allow:!1,decision}}function readDecision(response){let decision=isRecord2(response.result)?response.result.decision:void 0;return isApprovalDecision(decision)?decision:"cancel"}function readReason(response){let resultReason=isRecord2(response.result)?response.result.reason??response.result.message:void 0,errorReason=isRecord2(response.error)?response.error.message:void 0,reason=typeof resultReason=="string"?resultReason:errorReason;return typeof reason=="string"&&reason.length>0?reason:void 0}function createAllowKey(threadId,kind,payload){if(!(!payload.toolName||typeof payload.command!="string"))return`${threadId}\0${kind}\0${payload.toolName}\0${payload.command}`}function isApprovalDecision(value){return value==="accept"||value==="acceptForSession"||value==="decline"||value==="cancel"}function isRecord2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function createAppServerUIContext(bridge,threadId,userInput,getTurnId=()=>"turn-user-input"){let pendingInput,editorText="",editorFactory,toolsExpanded=!1;return{question(request,opts){return userInput?.requestUserInput(threadId,getTurnId(),request.requestId,request,opts)??Promise.resolve({status:"unavailable",answers:{},unanswered:request.questions.map(question=>question.id)})},async select(title,options){let prompt=parsePermissionPrompt(title);if(!prompt||!isPermissionOptions(options))return;let outcome=await bridge.requestApproval(threadId,prompt.kind,{turnId:"turn-approval",itemId:`approval-${prompt.toolName}`,toolName:prompt.toolName,command:prompt.command,reason:prompt.reason});return outcome.decision==="accept"?"Allow once":outcome.decision==="acceptForSession"?"Allow always":outcome.reason&&outcome.reason!==NO_SUBSCRIBER_REASON&&outcome.reason!==CANCEL_REASON?(pendingInput=outcome.reason,"Deny with feedback"):"Deny"},async confirm(title,message){return(await bridge.requestApproval(threadId,"commandExecution",{turnId:"turn-approval",itemId:"approval-confirm",toolName:"confirm",command:title,reason:message})).allow},async input(){let value=pendingInput;return pendingInput=void 0,value},notify(){},onTerminalInput(){return()=>{}},setStatus(){},setWorkingMessage(){},setWorkingVisible(){},setWorkingIndicator(){},setHiddenThinkingLabel(){},setWidget(){},setFooter(){},setHeader(){},setTitle(){},custom(){return Promise.reject(new Error("Custom UI is not available in app-server mode."))},pasteToEditor(text){editorText=text},setEditorText(text){editorText=text},getEditorText(){return editorText},async editor(_title,prefill){return prefill},addAutocompleteProvider(){},setEditorComponent(factory){editorFactory=factory},getEditorComponent(){return editorFactory},theme,getAllThemes:getAvailableThemesWithPaths,getTheme(name){return getThemeByName(name)},setTheme(_nextTheme){return{success:!1,error:"Theme switching is not available in app-server mode."}},getToolsExpanded(){return toolsExpanded},setToolsExpanded(expanded){toolsExpanded=expanded}}}function parsePermissionPrompt(title){let[firstLine="",...rest]=title.split(`
4
4
  `),prefix="Permission required: ";if(!firstLine.startsWith(prefix))return;let toolName=firstLine.slice(prefix.length).trim(),reason=rest.join(`
5
5
  `).trim();return{kind:permissionKind(toolName),toolName,command:readLineValue(reason,"Command: $ ")??readLineValue(reason,"File: ")??readLineValue(reason,"Path: ")??null,reason}}function permissionKind(toolName){return toolName==="edit"||toolName==="write"||toolName==="apply_patch"||toolName==="multiedit"?"fileChange":"commandExecution"}function readLineValue(text,prefix){return text.split(`
@@ -0,0 +1,10 @@
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{external_exports}from"./chunk-3XHLKHSK.js";import"./chunk-VR4X5O2Z.js";import{readFileSync as readFileSync2,realpathSync}from"node:fs";import{createRequire,isBuiltin}from"node:module";import{dirname as dirname2,extname as extname2,resolve}from"node:path";import{fileURLToPath as fileURLToPath2}from"node:url";var e,a,r,i=1048576,s=new Uint8Array(new Uint16Array([1]).buffer)[0]===1?function(e2,a2){let r2=e2.length,i2=0;for(;i2<r2;)a2[i2]=e2.charCodeAt(i2++)}:function(e2,a2){let r2=e2.length,i2=0;for(;i2<r2;){let r3=e2.charCodeAt(i2);a2[i2++]=(255&r3)<<8|r3>>>8}},f="xportmportlassforetaourceeferromsyncunctionvoyiedelecontininstantybreareturdebuggeawaithrwhileifcatcfinallels",t,c,n;function parse(k2,u2="@"){t=k2,c=u2;let l2=2*t.length+(2<<18);if(l2>i||!e){for(;l2>i;)i*=2;a=new ArrayBuffer(i),s(f,new Uint16Array(a,16,109)),e=(function(e2,a2,r2){var i2=new e2.Int8Array(r2),s2=new e2.Int16Array(r2),f2=new e2.Int32Array(r2),t2=new e2.Uint8Array(r2),c2=new e2.Uint16Array(r2),n2=1040;function b2(){var e3=0,a3=0,r3=0,t3=0,c3=0,b3=0,l4=0,d3=0,C2=0,g2=0;g2=n2,n2=n2+10240|0,i2[808]=1,i2[807]=0,s2[401]=0,s2[402]=0,f2[70]=f2[2],i2[809]=0,f2[68]=0,i2[806]=0,f2[71]=g2+2048,f2[72]=g2,i2[810]=0,e3=(f2[3]|0)+-2|0,f2[73]=e3,a3=e3+(f2[66]<<1)|0,f2[74]=a3;e:for(;;){if(r3=e3+2|0,f2[73]=r3,e3>>>0>=a3>>>0){t3=18;break}a:do switch(s2[r3>>1]|0){case 9:case 10:case 11:case 12:case 13:case 32:break;case 101:{if((s2[402]|0)==0&&J(r3)|0&&(I(e3+4|0,16,10)|0)==0&&(k3(),(i2[808]|0)==0)){t3=9;break e}else t3=17;break}case 105:{J(r3)|0&&(I(e3+4|0,26,10)|0)==0&&u3(),t3=17;break}case 59:{t3=17;break}case 47:switch(s2[e3+4>>1]|0){case 47:{P();break a}case 42:{m(1);break a}default:{t3=16;break e}}default:{t3=16;break e}}while(!1);(t3|0)==17&&(t3=0,f2[70]=f2[73]),e3=f2[73]|0,a3=f2[74]|0}(t3|0)==9?(e3=f2[73]|0,f2[70]=e3,t3=19):(t3|0)==16?(i2[808]=0,f2[73]=e3,t3=19):(t3|0)==18&&(i2[806]|0?e3=0:(e3=r3,t3=19));do if((t3|0)==19){e:for(;;){if(a3=e3+2|0,f2[73]=a3,e3>>>0>=(f2[74]|0)>>>0){t3=102;break}a:do switch(s2[a3>>1]|0){case 9:case 10:case 11:case 12:case 13:case 32:break;case 101:{(s2[402]|0)==0&&J(a3)|0&&(I(e3+4|0,16,10)|0)==0&&k3(),t3=101;break}case 105:{J(a3)|0&&(I(e3+4|0,26,10)|0)==0&&u3(),t3=101;break}case 99:{J(a3)|0&&(I(e3+4|0,36,8)|0)==0&&X(s2[e3+12>>1]|0)|0&&(i2[810]=1),t3=101;break}case 40:{r3=f2[71]|0,e3=s2[402]|0,t3=e3&65535,f2[r3+(t3<<3)>>2]=1,a3=f2[70]|0,s2[402]=e3+1<<16>>16,f2[r3+(t3<<3)+4>>2]=a3,t3=101;break}case 91:{r3=f2[71]|0,e3=s2[402]|0,t3=e3&65535,f2[r3+(t3<<3)>>2]=8,a3=f2[70]|0,s2[402]=e3+1<<16>>16,f2[r3+(t3<<3)+4>>2]=a3,t3=101;break}case 93:{if(e3=s2[402]|0,!(e3<<16>>16)){t3=37;break e}s2[402]=e3+-1<<16>>16,t3=101;break}case 44:{t3=s2[401]|0,a3=t3&65535,t3<<16>>16!=0&&(c3=s2[402]|0,c3<<16>>16!=0)&&(f2[(f2[71]|0)+((c3&65535)+-1<<3)>>2]|0)==5&&(b3=f2[(f2[72]|0)+(a3+-1<<2)>>2]|0,d3=b3+4|0,(f2[d3>>2]|0)==0)&&(f2[d3>>2]=(f2[70]|0)+2,f2[73]=e3+4,w2(1)|0,t3=f2[73]|0,f2[b3+16>>2]=t3,f2[73]=t3+-2),t3=101;break}case 41:{if(a3=s2[402]|0,!(a3<<16>>16)){t3=45;break e}r3=a3+-1<<16>>16,s2[402]=r3,t3=s2[401]|0,a3=t3&65535,t3<<16>>16!=0&&(f2[(f2[71]|0)+((r3&65535)<<3)>>2]|0)==5&&(a3=f2[(f2[72]|0)+(a3+-1<<2)>>2]|0,r3=a3+4|0,f2[r3>>2]|0||(f2[r3>>2]=(f2[70]|0)+2),f2[a3+12>>2]=e3+4,s2[401]=t3+-1<<16>>16),t3=101;break}case 123:{t3=f2[70]|0,r3=f2[63]|0,e3=t3;do if((s2[t3>>1]|0)==41&(r3|0)!=0&&(f2[r3+4>>2]|0)==(t3|0))if(a3=f2[64]|0,f2[63]=a3,a3){f2[a3+36>>2]=0;break}else{f2[59]=0;break}while(!1);r3=f2[71]|0,a3=s2[402]|0,t3=a3&65535,f2[r3+(t3<<3)>>2]=(i2[810]|0)==0?2:6,s2[402]=a3+1<<16>>16,f2[r3+(t3<<3)+4>>2]=e3,i2[810]=0,t3=101;break}case 125:{if(e3=s2[402]|0,!(e3<<16>>16)){t3=58;break e}r3=f2[71]|0,t3=e3+-1<<16>>16,s2[402]=t3,(f2[r3+((t3&65535)<<3)>>2]|0)==4&&h2(),t3=101;break}case 39:{v2(39),t3=101;break}case 34:{v2(34),t3=101;break}case 47:switch(s2[e3+4>>1]|0){case 47:{P();break a}case 42:{m(1);break a}default:{e3=f2[70]|0,a3=s2[e3>>1]|0;r:do if(!(x(a3)|0))a3<<16>>16==41?(r3=s2[402]|0,D(f2[(f2[71]|0)+((r3&65535)<<3)+4>>2]|0)|0||(t3=74)):t3=73;else switch(a3<<16>>16){case 46:if(((s2[e3+-2>>1]|0)+-48&65535)<10){t3=73;break r}else break r;case 43:if((s2[e3+-2>>1]|0)==43){t3=73;break r}else break r;case 45:if((s2[e3+-2>>1]|0)==45){t3=73;break r}else break r;default:break r}while(!1);(t3|0)==73&&(r3=s2[402]|0,t3=74);r:do if((t3|0)==74){if(t3=0,r3<<16>>16!=0&&(l4=f2[71]|0,C2=(r3&65535)+-1|0,a3<<16>>16==102?(f2[l4+(C2<<3)>>2]|0)==1:0)){if((s2[e3+-2>>1]|0)==111&&A(e3+-4|0)|0&&T(f2[l4+(C2<<3)+4>>2]|0,44,3)|0)break}else t3=79;if((t3|0)==79&&a3<<16>>16==125&&(t3=f2[71]|0,r3=r3&65535,y(f2[t3+(r3<<3)+4>>2]|0)|0||(f2[t3+(r3<<3)>>2]|0)==6))break;if(!(o2(e3)|0)){switch(a3<<16>>16){case 0:break r;case 47:{if(i2[809]|0)break r;break}default:}if(t3=f2[65]|0,t3|0&&e3>>>0>=(f2[t3>>2]|0)>>>0&&e3>>>0<=(f2[t3+4>>2]|0)>>>0){p(),i2[809]=0,t3=101;break a}r3=f2[3]|0;do{if(e3>>>0<=r3>>>0)break;e3=e3+-2|0,f2[70]=e3,a3=s2[e3>>1]|0}while(!(E(a3)|0));if(F(a3)|0){do{if(e3>>>0<=r3>>>0)break;e3=e3+-2|0,f2[70]=e3}while(F(s2[e3>>1]|0)|0);if(j(e3)|0){p(),i2[809]=0,t3=101;break a}}i2[809]=1,t3=101;break a}}while(!1);p(),i2[809]=0,t3=101;break a}}case 96:{r3=f2[71]|0,a3=s2[402]|0,t3=a3&65535,f2[r3+(t3<<3)+4>>2]=f2[70],s2[402]=a3+1<<16>>16,f2[r3+(t3<<3)>>2]=3,h2(),t3=101;break}default:t3=101}while(!1);(t3|0)==101&&(t3=0,f2[70]=f2[73]),e3=f2[73]|0}if((t3|0)==37){W(),e3=0;break}else if((t3|0)==45){W(),e3=0;break}else if((t3|0)==58){W(),e3=0;break}else if((t3|0)==102){e3=(i2[806]|0)==0?(s2[401]|s2[402])<<16>>16==0:0;break}}while(!1);return n2=g2,e3|0}function k3(){var e3=0,a3=0,r3=0,t3=0,c3=0,n3=0,b3=0,k4=0,u4=0,o3=0,h3=0,d3=0,A2=0,g2=0;k4=f2[73]|0,u4=f2[65]|0,g2=k4+12|0,f2[73]=g2,r3=w2(1)|0,e3=f2[73]|0,(e3|0)==(g2|0)&&!(U(r3)|0)||(A2=3);e:do if((A2|0)==3){a:do switch(r3<<16>>16){case 123:{for(f2[73]=e3+2,e3=w2(1)|0,a3=f2[73]|0;;){if(Y(e3)|0?(v2(e3),e3=(f2[73]|0)+2|0,f2[73]=e3):(q(e3)|0,e3=f2[73]|0),w2(1)|0,e3=C(a3,e3)|0,e3<<16>>16==44&&(f2[73]=(f2[73]|0)+2,e3=w2(1)|0),e3<<16>>16==125){A2=15;break}if(g2=a3,a3=f2[73]|0,(a3|0)==(g2|0)){A2=12;break}if(a3>>>0>(f2[74]|0)>>>0){A2=14;break}}if((A2|0)==12){W();break e}else if((A2|0)==14){W();break e}else if((A2|0)==15){i2[807]=1,f2[73]=(f2[73]|0)+2;break a}break}case 42:{f2[73]=e3+2,w2(1)|0,g2=f2[73]|0,C(g2,g2)|0;break}default:{switch(i2[808]=0,r3<<16>>16){case 100:{switch(k4=e3+14|0,f2[73]=k4,(w2(1)|0)<<16>>16){case 97:{a3=f2[73]|0,(I(a3+2|0,80,8)|0)==0&&(c3=a3+10|0,F(s2[c3>>1]|0)|0)&&(f2[73]=c3,w2(0)|0,A2=22);break}case 102:{A2=22;break}case 99:{a3=f2[73]|0,(I(a3+2|0,36,8)|0)==0&&(t3=a3+10|0,g2=s2[t3>>1]|0,X(g2)|0|g2<<16>>16==123)&&(f2[73]=t3,n3=w2(1)|0,n3<<16>>16!=123)&&(d3=n3,A2=31);break}default:}r:do if((A2|0)==22&&(b3=f2[73]|0,(I(b3+2|0,88,14)|0)==0)){if(r3=b3+16|0,a3=s2[r3>>1]|0,!(X(a3)|0))switch(a3<<16>>16){case 40:case 42:break;default:break r}f2[73]=r3,a3=w2(1)|0,a3<<16>>16==42&&(f2[73]=(f2[73]|0)+2,a3=w2(1)|0),a3<<16>>16!=40&&(d3=a3,A2=31)}while(!1);if((A2|0)==31&&(o3=f2[73]|0,q(d3)|0,h3=f2[73]|0,h3>>>0>o3>>>0)){$(e3,k4,o3,h3),f2[73]=(f2[73]|0)+-2;break e}$(e3,k4,0,0),f2[73]=e3+12;break e}case 97:{f2[73]=e3+10,w2(0)|0,e3=f2[73]|0,A2=35;break}case 102:{A2=35;break}case 99:{if((I(e3+2|0,36,8)|0)==0&&(a3=e3+10|0,E(s2[a3>>1]|0)|0)){f2[73]=a3,g2=w2(1)|0,A2=f2[73]|0,q(g2)|0,g2=f2[73]|0,$(A2,g2,A2,g2),f2[73]=(f2[73]|0)+-2;break e}e3=e3+4|0,f2[73]=e3;break}case 108:case 118:break;default:break e}if((A2|0)==35){f2[73]=e3+16,e3=w2(1)|0,e3<<16>>16==42&&(f2[73]=(f2[73]|0)+2,e3=w2(1)|0),A2=f2[73]|0,q(e3)|0,g2=f2[73]|0,$(A2,g2,A2,g2),f2[73]=(f2[73]|0)+-2;break e}f2[73]=e3+6,i2[808]=0,r3=w2(1)|0,e3=f2[73]|0,r3=(q(r3)|0|32)<<16>>16==123,t3=f2[73]|0,r3&&(f2[73]=t3+2,g2=w2(1)|0,e3=f2[73]|0,q(g2)|0);r:for(;a3=f2[73]|0,(a3|0)!=(e3|0);){if($(e3,a3,e3,a3),a3=w2(1)|0,r3)switch(a3<<16>>16){case 93:case 125:break e;default:}if(e3=f2[73]|0,a3<<16>>16!=44){A2=51;break}switch(f2[73]=e3+2,a3=w2(1)|0,e3=f2[73]|0,a3<<16>>16){case 91:case 123:{A2=51;break r}default:}q(a3)|0}if((A2|0)==51&&(f2[73]=e3+-2),!r3)break e;f2[73]=t3+-2;break e}}while(!1);if(g2=(w2(1)|0)<<16>>16==102,e3=f2[73]|0,g2&&(I(e3+2|0,74,6)|0)==0)for(f2[73]=e3+8,l3(k4,w2(1)|0,0),e3=(u4|0)==0?240:u4+16|0;;){if(e3=f2[e3>>2]|0,!e3)break e;f2[e3+12>>2]=0,f2[e3+8>>2]=0,e3=e3+16|0}f2[73]=e3+-2}while(!1)}function u3(){var e3=0,a3=0,r3=0,t3=0,c3=0,n3=0,b3=0;b3=f2[73]|0,c3=b3+12|0,f2[73]=c3,e3=w2(1)|0,t3=f2[73]|0;e:do if(e3<<16>>16!=46){if(!(e3<<16>>16==115&t3>>>0>c3>>>0)){if(!(e3<<16>>16==100&t3>>>0>(b3+10|0)>>>0)){t3=0,n3=28;break}if(I(t3+2|0,66,8)|0){a3=t3,e3=100,t3=0,n3=59;break}if(e3=t3+10|0,!(X(s2[e3>>1]|0)|0)){a3=t3,e3=100,t3=0,n3=59;break}if(f2[73]=e3,e3=w2(1)|0,e3<<16>>16==42){e3=42,t3=2,n3=61;break}f2[73]=t3,t3=0,n3=28;break}if((I(t3+2|0,56,10)|0)==0&&(r3=t3+12|0,X(s2[r3>>1]|0)|0)){if(f2[73]=r3,e3=w2(1)|0,a3=f2[73]|0,(a3|0)!=(r3|0)){if(e3<<16>>16!=102){t3=1,n3=28;break}if(I(a3+2|0,74,6)|0){e3=102,t3=1,n3=59;break}if(!(E(s2[a3+8>>1]|0)|0)){e3=102,t3=1,n3=59;break}}f2[73]=t3,t3=0,n3=28}else a3=t3,e3=115,t3=0,n3=59}else switch(f2[73]=t3+2,(w2(1)|0)<<16>>16){case 109:{if(e3=f2[73]|0,I(e3+2|0,50,6)|0||(a3=f2[70]|0,!(G(a3)|0)&&(s2[a3>>1]|0)==46))break e;d2(b3,b3,e3+8|0,2);break e}case 115:{if(e3=f2[73]|0,I(e3+2|0,56,10)|0||(a3=f2[70]|0,!(G(a3)|0)&&(s2[a3>>1]|0)==46))break e;f2[73]=e3+12,e3=w2(1)|0,t3=1,n3=28;break e}case 100:{if(e3=f2[73]|0,I(e3+2|0,66,8)|0||(a3=f2[70]|0,!(G(a3)|0)&&(s2[a3>>1]|0)==46))break e;f2[73]=e3+10,e3=w2(1)|0,t3=2,n3=28;break e}default:break e}while(!1);e:do if((n3|0)==28){if(e3<<16>>16==40){if(r3=f2[71]|0,a3=s2[402]|0,c3=a3&65535,f2[r3+(c3<<3)>>2]=5,e3=f2[73]|0,s2[402]=a3+1<<16>>16,f2[r3+(c3<<3)+4>>2]=e3,(s2[f2[70]>>1]|0)==46)break;switch(f2[73]=e3+2,a3=w2(1)|0,d2(b3,f2[73]|0,0,e3),t3?(e3=f2[63]|0,f2[e3+28>>2]=(t3|0)==1?5:7):e3=f2[63]|0,c3=f2[72]|0,b3=s2[401]|0,s2[401]=b3+1<<16>>16,f2[c3+((b3&65535)<<2)>>2]=e3,a3<<16>>16){case 39:{v2(39);break}case 34:{v2(34);break}default:{f2[73]=(f2[73]|0)+-2;break e}}switch(e3=(f2[73]|0)+2|0,f2[73]=e3,(w2(1)|0)<<16>>16){case 44:{f2[73]=(f2[73]|0)+2,w2(1)|0,c3=f2[63]|0,f2[c3+4>>2]=e3,b3=f2[73]|0,f2[c3+16>>2]=b3,i2[c3+24>>0]=1,f2[73]=b3+-2;break e}case 41:{s2[402]=(s2[402]|0)+-1<<16>>16,b3=f2[63]|0,f2[b3+4>>2]=e3,f2[b3+12>>2]=(f2[73]|0)+2,i2[b3+24>>0]=1,s2[401]=(s2[401]|0)+-1<<16>>16;break e}default:{f2[73]=(f2[73]|0)+-2;break e}}}if(!((t3|0)==0&e3<<16>>16==123)){switch(e3<<16>>16){case 42:case 39:case 34:{n3=61;break e}default:}a3=f2[73]|0,n3=59;break}if(e3=f2[73]|0,s2[402]|0){f2[73]=e3+-2;break}for(;!(e3>>>0>=(f2[74]|0)>>>0);){if(e3=w2(1)|0,Y(e3)|0)v2(e3);else if(e3<<16>>16==125){n3=49;break}e3=(f2[73]|0)+2|0,f2[73]=e3}if((n3|0)==49&&(f2[73]=(f2[73]|0)+2),c3=(w2(1)|0)<<16>>16==102,e3=f2[73]|0,c3&&I(e3+2|0,74,6)|0){W();break}if(f2[73]=e3+8,e3=w2(1)|0,Y(e3)|0){l3(b3,e3,0);break}else{W();break}}while(!1);(n3|0)==59&&((a3|0)==(c3|0)?f2[73]=b3+10:n3=61);do if((n3|0)==61){if(!((e3<<16>>16==42|(t3|0)!=2)&(s2[402]|0)==0)){f2[73]=(f2[73]|0)+-2;break}for(e3=f2[74]|0,a3=f2[73]|0;;){if(a3>>>0>=e3>>>0){n3=68;break}if(r3=s2[a3>>1]|0,Y(r3)|0){n3=66;break}n3=a3+2|0,f2[73]=n3,a3=n3}if((n3|0)==66){l3(b3,r3,t3);break}else if((n3|0)==68){W();break}}while(!1)}function l3(e3,a3,r3){e3=e3|0,a3=a3|0,r3=r3|0;var i3=0,t3=0,c3=0,n3=0,b3=0;switch(i3=(f2[73]|0)+2|0,a3<<16>>16){case 39:{v2(39),t3=5;break}case 34:{v2(34),t3=5;break}default:W()}do if((t3|0)==5){if(d2(e3,i3,f2[73]|0,1),(r3|0)>0&&(f2[(f2[63]|0)+28>>2]=(r3|0)==1?4:6),f2[73]=(f2[73]|0)+2,n3=(w2(0)|0)<<16>>16==119,c3=f2[73]|0,n3&&(s2[c3+2>>1]|0)==105&&(s2[c3+4>>1]|0)==116&&(s2[c3+6>>1]|0)==104){if(f2[73]=c3+8,(w2(1)|0)<<16>>16!=123){f2[73]=c3;break}n3=f2[73]|0,i3=n3,t3=0;e:for(;;){f2[73]=i3+2,i3=w2(1)|0;do if(i3<<16>>16!=39)if(a3=f2[73]|0,i3<<16>>16==34){v2(34),e3=(f2[73]|0)+2|0,f2[73]=e3,i3=w2(1)|0;break}else{i3=q(i3)|0,e3=f2[73]|0;break}else a3=f2[73]|0,v2(39),e3=(f2[73]|0)+2|0,f2[73]=e3,i3=w2(1)|0;while(!1);if(i3<<16>>16!=58){t3=21;break}switch(f2[73]=(f2[73]|0)+2,(w2(1)|0)<<16>>16){case 39:{i3=f2[73]|0,v2(39);break}case 34:{i3=f2[73]|0,v2(34);break}default:{t3=25;break e}}switch(b3=(f2[73]|0)+2|0,r3=f2[67]|0,f2[67]=r3+20,f2[r3>>2]=a3,f2[r3+4>>2]=e3,f2[r3+8>>2]=i3,f2[r3+12>>2]=b3,f2[r3+16>>2]=0,f2[((t3|0)==0?(f2[63]|0)+32|0:t3+16|0)>>2]=r3,f2[73]=(f2[73]|0)+2,(w2(1)|0)<<16>>16){case 125:{t3=29;break e}case 44:break;default:{t3=27;break e}}i3=(f2[73]|0)+2|0,f2[73]=i3,t3=r3}if((t3|0)==21){f2[73]=c3;break}else if((t3|0)==25){f2[73]=c3;break}else if((t3|0)==27){f2[73]=c3;break}else if((t3|0)==29){b3=f2[63]|0,f2[b3+16>>2]=n3,f2[b3+12>>2]=(f2[73]|0)+2;break}}f2[73]=c3+-2}while(!1)}function o2(e3){e3=e3|0;e:do switch(s2[e3>>1]|0){case 100:switch(s2[e3+-2>>1]|0){case 105:{e3=T(e3+-4|0,102,2)|0;break e}case 108:{e3=T(e3+-4|0,106,3)|0;break e}default:{e3=0;break e}}case 101:switch(s2[e3+-2>>1]|0){case 115:switch(s2[e3+-4>>1]|0){case 108:{e3=B(e3+-6|0,101)|0;break e}case 97:{e3=B(e3+-6|0,99)|0;break e}default:{e3=0;break e}}case 116:{e3=T(e3+-4|0,112,4)|0;break e}case 117:{e3=T(e3+-4|0,120,6)|0;break e}default:{e3=0;break e}}case 102:{if((s2[e3+-2>>1]|0)==111&&(s2[e3+-4>>1]|0)==101)switch(s2[e3+-6>>1]|0){case 99:{e3=T(e3+-8|0,132,6)|0;break e}case 112:{e3=T(e3+-8|0,144,2)|0;break e}default:{e3=0;break e}}else e3=0;break}case 107:{e3=T(e3+-2|0,148,4)|0;break}case 110:{e3=e3+-2|0,B(e3,105)|0?e3=1:e3=T(e3,156,5)|0;break}case 111:{e3=B(e3+-2|0,100)|0;break}case 114:{e3=T(e3+-2|0,166,7)|0;break}case 116:{e3=T(e3+-2|0,180,4)|0;break}case 119:switch(s2[e3+-2>>1]|0){case 101:{e3=B(e3+-4|0,110)|0;break e}case 111:{e3=T(e3+-4|0,188,3)|0;break e}default:{e3=0;break e}}default:e3=0}while(!1);return e3|0}function h2(){var e3=0,a3=0,r3=0,i3=0;a3=f2[74]|0,r3=f2[73]|0;e:for(;;){if(e3=r3+2|0,r3>>>0>=a3>>>0){a3=10;break}switch(s2[e3>>1]|0){case 96:{a3=7;break e}case 36:{if((s2[r3+4>>1]|0)==123){a3=6;break e}break}case 92:{e3=r3+4|0;break}default:}r3=e3}(a3|0)==6?(e3=r3+4|0,f2[73]=e3,a3=f2[71]|0,i3=s2[402]|0,r3=i3&65535,f2[a3+(r3<<3)>>2]=4,s2[402]=i3+1<<16>>16,f2[a3+(r3<<3)+4>>2]=e3):(a3|0)==7?(f2[73]=e3,r3=f2[71]|0,i3=(s2[402]|0)+-1<<16>>16,s2[402]=i3,(f2[r3+((i3&65535)<<3)>>2]|0)!=3&&W()):(a3|0)==10&&(f2[73]=e3,W())}function w2(e3){e3=e3|0;var a3=0,r3=0,i3=0;r3=f2[73]|0;e:do{a3=s2[r3>>1]|0;a:do if(a3<<16>>16!=47)if(e3){if(X(a3)|0)break;break e}else{if(F(a3)|0)break;break e}else switch(s2[r3+2>>1]|0){case 47:{P();break a}case 42:{m(e3);break a}default:{a3=47;break e}}while(!1);i3=f2[73]|0,r3=i3+2|0,f2[73]=r3}while(i3>>>0<(f2[74]|0)>>>0);return a3|0}function d2(e3,a3,r3,s3){e3=e3|0,a3=a3|0,r3=r3|0,s3=s3|0;var t3=0,c3=0;c3=f2[67]|0,f2[67]=c3+40,t3=f2[63]|0,f2[((t3|0)==0?236:t3+36|0)>>2]=c3,f2[64]=t3,f2[63]=c3,f2[c3+8>>2]=e3,(s3|0)==2?(e3=3,t3=r3):(t3=(s3|0)==1,e3=t3?1:2,t3=t3?r3+2|0:0),f2[c3+12>>2]=t3,f2[c3+28>>2]=e3,f2[c3>>2]=a3,f2[c3+4>>2]=r3,f2[c3+16>>2]=0,f2[c3+20>>2]=s3,a3=(s3|0)==1,i2[c3+24>>0]=a3&1,f2[c3+32>>2]=0,f2[c3+36>>2]=0,a3|(s3|0)==2&&(i2[807]=1)}function v2(e3){e3=e3|0;var a3=0,r3=0,i3=0,t3=0;for(t3=f2[74]|0,a3=f2[73]|0;;){if(i3=a3+2|0,a3>>>0>=t3>>>0){a3=9;break}if(r3=s2[i3>>1]|0,r3<<16>>16==e3<<16>>16){a3=10;break}if(r3<<16>>16==92)r3=a3+4|0,(s2[r3>>1]|0)==13?(a3=a3+6|0,a3=(s2[a3>>1]|0)==10?a3:r3):a3=r3;else if(ie(r3)|0){a3=9;break}else a3=i3}(a3|0)==9?(f2[73]=i3,W()):(a3|0)==10&&(f2[73]=i3)}function A(e3){e3=e3|0;var a3=0,r3=0;if(a3=s2[e3>>1]|0,X(a3)|0)r3=3;else switch(a3<<16>>16){case 41:case 125:case 93:{r3=3;break}default:e3=0}e:do if((r3|0)==3){for(r3=f2[3]|0;!(e3>>>0<=r3>>>0||(e3=e3+-2|0,!(X(a3)|0)));)a3=s2[e3>>1]|0;switch(a3<<16>>16){case 41:case 125:case 93:{e3=1;break e}default:}e3=(U(a3)|0)^1}while(!1);return e3|0}function C(e3,a3){e3=e3|0,a3=a3|0;var r3=0,i3=0,t3=0,c3=0;return r3=f2[73]|0,i3=s2[r3>>1]|0,c3=(e3|0)==(a3|0),t3=c3?0:e3,c3=c3?0:a3,i3<<16>>16==97&&(f2[73]=r3+4,r3=w2(1)|0,e3=f2[73]|0,Y(r3)|0?(v2(r3),a3=(f2[73]|0)+2|0,f2[73]=a3):(q(r3)|0,a3=f2[73]|0),i3=w2(1)|0,r3=f2[73]|0),(r3|0)!=(e3|0)&&$(e3,a3,t3,c3),i3|0}function g(){var e3=0,a3=0,r3=0;r3=f2[74]|0,a3=f2[73]|0;e:for(;;){if(e3=a3+2|0,a3>>>0>=r3>>>0){a3=6;break}switch(s2[e3>>1]|0){case 13:case 10:{a3=6;break e}case 93:{a3=7;break e}case 92:{e3=a3+4|0;break}default:}a3=e3}return(a3|0)==6?(f2[73]=e3,W(),e3=0):(a3|0)==7&&(f2[73]=e3,e3=93),e3|0}function p(){var e3=0,a3=0,r3=0;e:for(;;){if(e3=f2[73]|0,a3=e3+2|0,f2[73]=a3,e3>>>0>=(f2[74]|0)>>>0){r3=7;break}switch(s2[a3>>1]|0){case 13:case 10:{r3=7;break e}case 47:break e;case 91:{g()|0;break}case 92:{f2[73]=e3+4;break}default:}}(r3|0)==7&&W()}function y(e3){switch(e3=e3|0,s2[e3>>1]|0){case 62:{e3=(s2[e3+-2>>1]|0)==61;break}case 41:case 59:{e3=1;break}case 104:{e3=T(e3+-2|0,208,4)|0;break}case 121:{e3=T(e3+-2|0,216,6)|0;break}case 101:{e3=T(e3+-2|0,228,3)|0;break}default:e3=0}return e3|0}function m(e3){e3=e3|0;var a3=0,r3=0,i3=0,t3=0,c3=0;for(t3=(f2[73]|0)+2|0,f2[73]=t3,r3=f2[74]|0;a3=t3+2|0,!(t3>>>0>=r3>>>0||(i3=s2[a3>>1]|0,!e3&&ie(i3)|0));){if(i3<<16>>16==42&&(s2[t3+4>>1]|0)==47){c3=8;break}t3=a3}(c3|0)==8&&(f2[73]=a3,a3=t3+4|0),f2[73]=a3}function I(e3,a3,r3){e3=e3|0,a3=a3|0,r3=r3|0;var s3=0,f3=0;e:do if(!r3)e3=0;else{for(;s3=i2[e3>>0]|0,f3=i2[a3>>0]|0,s3<<24>>24==f3<<24>>24;)if(r3=r3+-1|0,r3)e3=e3+1|0,a3=a3+1|0;else{e3=0;break e}e3=(s3&255)-(f3&255)|0}while(!1);return e3|0}function U(e3){e3=e3|0;e:do switch(e3<<16>>16){case 38:case 37:case 33:{e3=1;break}default:if((e3&-8)<<16>>16==40|(e3+-58&65535)<6)e3=1;else{switch(e3<<16>>16){case 91:case 93:case 94:{e3=1;break e}default:}e3=(e3+-123&65535)<4}}while(!1);return e3|0}function x(e3){e3=e3|0;e:do switch(e3<<16>>16){case 38:case 37:case 33:break;default:if(!((e3+-58&65535)<6|(e3+-40&65535)<7&e3<<16>>16!=41)){switch(e3<<16>>16){case 91:case 94:break e;default:}return e3<<16>>16!=125&(e3+-123&65535)<4|0}}while(!1);return 1}function S(e3){e3=e3|0;var a3=0;a3=s2[e3>>1]|0;e:do if((a3+-9&65535)>=5){switch(a3<<16>>16){case 160:case 32:{a3=1;break e}default:}if(U(a3)|0)return a3<<16>>16!=46|(G(e3)|0)|0;a3=0}else a3=1;while(!1);return a3|0}function O(e3){e3=e3|0;var a3=0,r3=0,i3=0,t3=0;return r3=n2,n2=n2+16|0,i3=r3,f2[i3>>2]=0,f2[66]=e3,a3=f2[3]|0,t3=a3+(e3<<1)|0,e3=t3+2|0,s2[t3>>1]=0,f2[i3>>2]=e3,f2[67]=e3,f2[59]=0,f2[63]=0,f2[61]=0,f2[60]=0,f2[65]=0,f2[62]=0,n2=r3,a3|0}function $(e3,a3,r3,s3){e3=e3|0,a3=a3|0,r3=r3|0,s3=s3|0;var t3=0,c3=0;t3=f2[67]|0,f2[67]=t3+20,c3=f2[65]|0,f2[((c3|0)==0?240:c3+16|0)>>2]=t3,f2[65]=t3,f2[t3>>2]=e3,f2[t3+4>>2]=a3,f2[t3+8>>2]=r3,f2[t3+12>>2]=s3,f2[t3+16>>2]=0,i2[807]=1}function T(e3,a3,r3){e3=e3|0,a3=a3|0,r3=r3|0;var i3=0,s3=0;return i3=e3+(0-r3<<1)|0,s3=i3+2|0,e3=f2[3]|0,s3>>>0>=e3>>>0&&(I(s3,a3,r3<<1)|0)==0?(s3|0)==(e3|0)?e3=1:e3=S(i3)|0:e3=0,e3|0}function j(e3){switch(e3=e3|0,s2[e3>>1]|0){case 107:{e3=T(e3+-2|0,148,4)|0;break}case 101:{(s2[e3+-2>>1]|0)==117?e3=T(e3+-4|0,120,6)|0:e3=0;break}default:e3=0}return e3|0}function B(e3,a3){e3=e3|0,a3=a3|0;var r3=0;return r3=f2[3]|0,r3>>>0<=e3>>>0&&(s2[e3>>1]|0)==a3<<16>>16?(r3|0)==(e3|0)?r3=1:r3=E(s2[e3+-2>>1]|0)|0:r3=0,r3|0}function E(e3){e3=e3|0;e:do if((e3+-9&65535)<5)e3=1;else{switch(e3<<16>>16){case 32:case 160:{e3=1;break e}default:}e3=e3<<16>>16!=46&(U(e3)|0)}while(!1);return e3|0}function P(){var e3=0,a3=0,r3=0;e3=f2[74]|0,r3=f2[73]|0;e:for(;a3=r3+2|0,!(r3>>>0>=e3>>>0);)switch(s2[a3>>1]|0){case 13:case 10:break e;default:r3=a3}f2[73]=a3}function q(e3){for(e3=e3|0;!(X(e3)|0||U(e3)|0);)if(e3=(f2[73]|0)+2|0,f2[73]=e3,e3=s2[e3>>1]|0,!(e3<<16>>16)){e3=0;break}return e3|0}function z(){var e3=0;switch(e3=f2[(f2[61]|0)+20>>2]|0,e3|0){case 1:{e3=-1;break}case 2:{e3=-2;break}default:e3=e3-(f2[3]|0)>>1}return e3|0}function D(e3){return e3=e3|0,!(T(e3,194,5)|0)&&!(T(e3,44,3)|0)?e3=T(e3,204,2)|0:e3=1,e3|0}function F(e3){switch(e3=e3|0,e3<<16>>16){case 160:case 32:case 12:case 11:case 9:{e3=1;break}default:e3=0}return e3|0}function G(e3){return e3=e3|0,(s2[e3>>1]|0)==46&&(s2[e3+-2>>1]|0)==46?e3=(s2[e3+-4>>1]|0)==46:e3=0,e3|0}function H(){var e3=0;return e3=f2[69]|0,e3=f2[((e3|0)==0?(f2[61]|0)+32|0:e3+16|0)>>2]|0,f2[69]=e3,(e3|0)!=0|0}function J(e3){return e3=e3|0,(f2[3]|0)==(e3|0)?e3=1:e3=S(e3+-2|0)|0,e3|0}function K(){var e3=0;return e3=f2[(f2[62]|0)+12>>2]|0,e3?e3=e3-(f2[3]|0)>>1:e3=-1,e3|0}function L(){var e3=0;return e3=f2[(f2[61]|0)+12>>2]|0,e3?e3=e3-(f2[3]|0)>>1:e3=-1,e3|0}function M(){var e3=0;return e3=f2[(f2[62]|0)+8>>2]|0,e3?e3=e3-(f2[3]|0)>>1:e3=-1,e3|0}function N(){var e3=0;return e3=f2[(f2[61]|0)+16>>2]|0,e3?e3=e3-(f2[3]|0)>>1:e3=-1,e3|0}function Q(){var e3=0;return e3=f2[(f2[61]|0)+4>>2]|0,e3?e3=e3-(f2[3]|0)>>1:e3=-1,e3|0}function R(){var e3=0;return e3=f2[61]|0,e3=f2[((e3|0)==0?236:e3+36|0)>>2]|0,f2[61]=e3,(e3|0)!=0|0}function V(){var e3=0;return e3=f2[62]|0,e3=f2[((e3|0)==0?240:e3+16|0)>>2]|0,f2[62]=e3,(e3|0)!=0|0}function W(){i2[806]=1,f2[68]=(f2[73]|0)-(f2[3]|0)>>1,f2[73]=(f2[74]|0)+2}function X(e3){return e3=e3|0,(e3|128)<<16>>16==160|(e3+-9&65535)<5|0}function Y(e3){return e3=e3|0,e3<<16>>16==39|e3<<16>>16==34|0}function Z(){return(f2[(f2[69]|0)+12>>2]|0)-(f2[3]|0)>>1|0}function _(){return(f2[(f2[69]|0)+8>>2]|0)-(f2[3]|0)>>1|0}function ee(){return(f2[(f2[69]|0)+4>>2]|0)-(f2[3]|0)>>1|0}function ae(){return(f2[(f2[61]|0)+8>>2]|0)-(f2[3]|0)>>1|0}function re(){return(f2[(f2[62]|0)+4>>2]|0)-(f2[3]|0)>>1|0}function ie(e3){return e3=e3|0,e3<<16>>16==13|e3<<16>>16==10|0}function se(){return(f2[f2[69]>>2]|0)-(f2[3]|0)>>1|0}function fe(){return(f2[f2[61]>>2]|0)-(f2[3]|0)>>1|0}function te(){return(f2[f2[62]>>2]|0)-(f2[3]|0)>>1|0}function ce(){return t2[(f2[61]|0)+24>>0]|0|0}function ne(e3){e3=e3|0,f2[3]=e3}function be(){return f2[(f2[61]|0)+28>>2]|0}function ke(){return(i2[807]|0)!=0|0}function ue(){return(i2[808]|0)!=0|0}function le(){f2[69]=0}function oe(){return f2[68]|0}function he(e3){return e3=e3|0,n2=e3+992+15&-16,992}return{su:he,ai:N,ake:ee,aks:se,ave:Z,avs:_,e:oe,ee:re,ele:K,els:M,es:te,f:ue,id:z,ie:Q,ip:ce,is:fe,it:be,ms:ke,p:b2,ra:H,re:V,ri:R,rsa:le,sa:O,se:L,ses:ne,ss:ae}})(typeof globalThis<"u"?globalThis:self,{},a),r=e.su(i-(2<<17))}let h=t.length+1;e.ses(r),e.sa(h-1),s(t,new Uint16Array(a,r,h)),e.p()||(n=e.e(),o());let w=[],d=[];for(;e.ri();){let a2=e.is(),r2=e.ie(),i2=e.ai(),s2=e.id(),f2=e.ss(),c2=e.se(),n2=e.it(),k3;e.ip()&&(k3=b(s2===-1?a2:a2+1,t.charCodeAt(s2===-1?a2-1:a2)));let u3=[];for(e.rsa();e.ra();){let a3=e.aks(),r3=e.ake(),i3=e.avs(),s3=e.ave(),f3=v(a3,r3),t2=v(i3,s3);u3.push([f3,t2])}w.push({t:n2,n:k3,s:a2,e:r2,ss:f2,se:c2,d:s2,a:i2,at:u3.length>0?u3:null})}for(;e.re();){let a2=e.es(),r2=e.ee(),i2=e.els(),s2=e.ele(),f2=v(a2,r2),t2=i2<0?void 0:v(i2,s2);d.push({s:a2,e:r2,ls:i2,le:s2,n:f2,ln:t2})}return[w,d,!!e.f(),!!e.ms()];function v(e2,a2){let r2=t.charCodeAt(e2);return r2===34||r2===39?b(e2+1,r2):t.slice(e2,a2)}}function b(e2,a2){n=e2;let r2="",i2=n;for(;;){n>=t.length&&o();let e3=t.charCodeAt(n);if(e3===a2)break;e3===92?(r2+=t.slice(i2,n),r2+=k(),i2=n):(e3===8232||e3===8233||l(e3)&&o(),++n)}return r2+=t.slice(i2,n++),r2}function k(){let e2=t.charCodeAt(++n);switch(++n,e2){case 110:return`
3
+ `;case 114:return"\r";case 120:return String.fromCharCode(u(2));case 117:return(function(){let e3=t.charCodeAt(n),a2;return e3===123?(++n,a2=u(t.indexOf("}",n)-n),++n,a2>1114111&&o()):a2=u(4),a2<=65535?String.fromCharCode(a2):(a2-=65536,String.fromCharCode(55296+(a2>>10),56320+(1023&a2)))})();case 116:return" ";case 98:return"\b";case 118:return"\v";case 102:return"\f";case 13:t.charCodeAt(n)===10&&++n;case 10:return"";case 56:case 57:o();default:if(e2>=48&&e2<=55){let a2=t.substr(n-1,3).match(/^[0-7]+/)[0],r2=parseInt(a2,8);return r2>255&&(a2=a2.slice(0,-1),r2=parseInt(a2,8)),n+=a2.length-1,e2=t.charCodeAt(n),a2==="0"&&e2!==56&&e2!==57||o(),String.fromCharCode(r2)}return l(e2)?"":String.fromCharCode(e2)}}function u(e2){let a2=n,r2=0,i2=0;for(let a3=0;a3<e2;++a3,++n){let e3,s2=t.charCodeAt(n);if(s2!==95){if(s2>=97)e3=s2-97+10;else if(s2>=65)e3=s2-65+10;else{if(!(s2>=48&&s2<=57))break;e3=s2-48}if(e3>=16)break;i2=s2,r2=16*r2+e3}else i2!==95&&a3!==0||o(),i2=s2}return i2!==95&&n-a2===e2||o(),r2}function l(e2){return e2===13||e2===10}function o(){throw Object.assign(Error(`Parse error ${c}:${t.slice(0,n).split(`
4
+ `).length}:${n-t.lastIndexOf(`
5
+ `,n-1)}`),{idx:n})}import{readFileSync}from"node:fs";import{extname}from"node:path";var commonJsByPath=new Map;function isCommonJsFile(path){let cached=commonJsByPath.get(path);if(cached!==void 0)return cached;let result=detect(path);return commonJsByPath.set(path,result),result}function detect(path){let extension=extname(path);if(extension===".cjs")return!0;if(extension===".mjs"||extension===".ts"||extension===".tsx"||extension===".mts")return!1;try{let[,,,hasModuleSyntax]=parse(readFileSync(path,"utf8"),path);return!hasModuleSyntax}catch{return!1}}function parseImportClause(clause){let rest=clause.trim();if(rest==="")return;let defaultBinding,namespaceBinding,named=[],braceStart=rest.indexOf("{"),head=(braceStart>=0?rest.slice(0,braceStart):rest).trim().replace(/,$/,"").trim();if(head!==""){let namespace=/^\*\s+as\s+([A-Za-z_$][\w$]*)$/.exec(head);if(namespace?.[1]!==void 0)namespaceBinding=namespace[1];else if(/^[A-Za-z_$][\w$]*$/.test(head))defaultBinding=head;else return}if(braceStart>=0){let braceEnd=rest.lastIndexOf("}");if(braceEnd<braceStart)return;rest=rest.slice(braceStart+1,braceEnd);for(let raw of rest.split(",")){let entry=raw.trim();if(entry==="")continue;let aliased=/^(?:(["'])(.+?)\1|([A-Za-z_$][\w$]*))\s+as\s+([A-Za-z_$][\w$]*)$/.exec(entry);if(aliased){named.push({imported:aliased[2]??aliased[3]??"",local:aliased[4]??""});continue}if(/^[A-Za-z_$][\w$]*$/.test(entry)){named.push({imported:entry,local:entry});continue}return}}return{defaultBinding,namespaceBinding,named}}function rewriteCommonJsImport(clause,resolvedId,alias){let parsed=parseImportClause(clause);if(parsed===void 0)return`import ${JSON.stringify(resolvedId)};`;let lines=[`import ${alias} from ${JSON.stringify(resolvedId)};`];if(parsed.defaultBinding!==void 0&&lines.push(`const ${parsed.defaultBinding} = ${alias};`),parsed.namespaceBinding!==void 0&&lines.push(`const ${parsed.namespaceBinding} = ${alias};`),parsed.named.length>0){let pattern=parsed.named.map(({imported,local})=>{let key=/^[A-Za-z_$][\w$]*$/.test(imported)?imported:JSON.stringify(imported);return key===local?key:`${key}: ${local}`}).join(", ");lines.push(`const { ${pattern} } = ${alias};`)}return lines.join(" ")}var diagnosticSchema=external_exports.object({message:external_exports.string(),position:external_exports.object({line:external_exports.number(),column:external_exports.number()}).nullish()}),ExtensionSourceError=class extends Error{constructor(filename,cause){let diagnostics=external_exports.array(diagnosticSchema).parse(cause.errors).map(({message,position})=>({message,...position?{line:position.line,column:position.column}:{}}));super(diagnostics.map(item=>`${filename}${item.line===void 0?"":`:${item.line}:${item.column}`}: ${item.message}`).join(`
6
+ `),{cause}),this.name="ExtensionSourceError",this.filename=filename,this.diagnostics=diagnostics}};import{existsSync}from"node:fs";import{dirname}from"node:path";import{fileURLToPath,pathToFileURL}from"node:url";var RUNTIME_METADATA=Symbol.for("senpi.extension.runtime.metadata");function publishRuntimeMetadata(value){globalThis[RUNTIME_METADATA]=value}var __rewriteRelativeImportExtension=function(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path},extensionNamespace="senpi-extension",RUNTIME_SPECIFIER="runtime",runtimeModulePath=resolveRuntimeModulePath();function resolveRuntimeModulePath(){try{let candidate=fileURLToPath(new URL("./extension-runtime-module.js",import.meta.url));return existsSync(candidate)?candidate:void 0}catch{return}}function splitModuleId(id){let slash=id.indexOf("/");if(!(slash<=0||slash===id.length-1))return{generation:id.slice(0,slash),filename:decodeURIComponent(id.slice(slash+1))}}var graphs=new Map,collected=new FinalizationRegistry(generation=>graphs.delete(generation)),nextGeneration=0,installed=!1,pluginRegistrations=0,registeredHosts=new Set,ExtensionModuleIdError=class extends Error{constructor(id){super(`Extension module id is not "<generation>/<encoded filename>": ${id}`),this.name="ExtensionModuleIdError"}},ExtensionGenerationDisposedError=class extends Error{constructor(generation){super(`Extension generation ${generation} has been disposed`),this.name="ExtensionGenerationDisposedError",this.generation=generation}};function graphFor(generation){let graph=graphs.get(generation)?.deref();if(!graph)throw new ExtensionGenerationDisposedError(generation);return graph}function metadata(generation,filename){let resolvePath=specifier=>{let id=graphFor(generation).resolve(specifier,filename);return id.startsWith(`${extensionNamespace}:`)?decodeURIComponent(id.slice(id.indexOf("/")+1)):void 0},require2=Object.assign(specifier=>graphFor(generation).require(specifier,filename),{resolve:specifier=>resolvePath(specifier)??graphFor(generation).resolve(specifier,filename)});return{url:pathToFileURL(filename).href,path:filename,dir:dirname(filename),require:require2,commonJs:body=>graphFor(generation).evaluateCommonJs(filename,body),import:async(specifier,options)=>import(__rewriteRelativeImportExtension(graphFor(generation).resolve(specifier,filename)),{...options}),resolve:specifier=>{let path=resolvePath(specifier);return path===void 0?graphFor(generation).resolve(specifier,filename):pathToFileURL(path).href}}}function installRegistry(virtualModules){let hosts=Object.entries(virtualModules).filter(([name])=>!registeredHosts.has(name));(!installed||hosts.length>0)&&(pluginRegistrations++,Bun.plugin({name:extensionNamespace,setup(builder){for(let[name,exports]of hosts)builder.module(name,()=>({exports,loader:"object"})),registeredHosts.add(name);installed||(publishRuntimeMetadata(metadata),builder.module(`${extensionNamespace}:${RUNTIME_SPECIFIER}`,()=>({exports:{metadata},loader:"object"})),builder.onResolve({filter:/.*/,namespace:extensionNamespace},({path})=>{if(path===RUNTIME_SPECIFIER)return runtimeModulePath===void 0?{path,namespace:extensionNamespace}:{path:runtimeModulePath,namespace:"file"};let parsed=splitModuleId(path);if(parsed===void 0)throw new ExtensionModuleIdError(path);return graphFor(parsed.generation),/\.[cm]?[jt]sx?$/.test(parsed.filename)?{path,namespace:extensionNamespace}:{path:parsed.filename,namespace:"file"}}),builder.onLoad({filter:/.*/,namespace:extensionNamespace},({path})=>{let parsed=splitModuleId(path);if(parsed===void 0)throw new ExtensionModuleIdError(path);return graphFor(parsed.generation).load(parsed.filename)}),installed=!0)}}))}function registerExtensionGraph(graph,virtualModules){installRegistry(virtualModules);let generation=String(nextGeneration++);return graphs.set(generation,new WeakRef(graph)),collected.register(graph,generation,graph),{generation,dispose(){graphs.delete(generation),collected.unregister(graph)}}}function bunExtensionImporterStats(){return{generations:[...graphs.values()].filter(entry=>entry.deref()).length,plugins:pluginRegistrations}}var __rewriteRelativeImportExtension2=function(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path};function createBunExtensionImporter(virtualModules){let sources=new Map,commonJs=new Set,commonJsModules=new Map,nativeRequire=createRequire(import.meta.url),active=!0,assertActive=()=>{if(!active)throw new ExtensionGenerationDisposedError(registration.generation)},moduleId=filename=>`${extensionNamespace}:${registration.generation}/${encodeURIComponent(filename)}`,resolveTarget=(specifier,filename)=>{if(assertActive(),Object.hasOwn(virtualModules,specifier)||isBuiltin(specifier)||specifier.startsWith("bun:"))return{id:specifier};if(specifier.startsWith(`${extensionNamespace}:`))return{id:specifier};let path=specifier.startsWith("file:")?fileURLToPath2(specifier):specifier,resolved=realpathSync(Bun.resolveSync(path,dirname2(filename)));return{id:moduleId(resolved),path:resolved}},graph={assertActive,resolve(specifier,filename){return resolveTarget(specifier,filename).id},require(specifier,filename){let id=graph.resolve(specifier,filename),evaluating=commonJsModules.get(id);if(evaluating!==void 0)return evaluating.exports;let result=nativeRequire(id);return commonJs.has(id)?result.default:result},evaluateCommonJs(filename,body){assertActive();let id=moduleId(filename),module={exports:{}};commonJsModules.set(id,module);try{body.call(module.exports,module.exports,module)}catch(error){throw commonJsModules.delete(id),error}return module.exports},load(filename){assertActive();let existing=sources.get(filename);if(existing)return existing;let source=readFileSync2(filename,"utf8"),name="__senpiExtensionMeta";for(;source.includes(name);)name+="_";let extension=extname2(filename),transpiler=new Bun.Transpiler({loader:extension===".tsx"?"tsx":extension===".jsx"?"jsx":"ts",target:"bun",define:{"import.meta":name,require:`${name}.require`,__filename:`${name}.path`,__dirname:`${name}.dir`}}),contents;try{contents=transpiler.transformSync(source)}catch(error){throw error instanceof AggregateError?new ExtensionSourceError(filename,error):error}let[imports,,,hasModuleSyntax]=parse(contents,filename),edits=[],commonJsImports=0;for(let edge of imports)if(edge.d>=0)edits.push({start:edge.ss,end:edge.d,text:`${name}.import`});else if(edge.n!==void 0){let target=resolveTarget(edge.n,filename);if(target.path!==void 0&&isCommonJsFile(target.path)){let clause=contents.slice(edge.ss+6,edge.s-1).replace(/\bfrom\s*$/,"");edits.push({start:edge.ss,end:edge.se,text:rewriteCommonJsImport(clause,target.id,`${name}Cjs${commonJsImports++}`)})}else edits.push({start:edge.s-1,end:edge.e+1,text:JSON.stringify(target.id)})}for(let edit of edits.sort((a2,b2)=>b2.start-a2.start))contents=contents.slice(0,edit.start)+edit.text+contents.slice(edit.end);contents=contents.replace(/^#![^\n]*\n/,""),!hasModuleSyntax&&extension!==".mjs"&&extension!==".mts"&&(commonJs.add(moduleId(filename)),contents=`export default ${name}.commonJs(function (exports, module) {
7
+ ${contents}
8
+ });`),contents=`import { metadata as ${name}Factory } from "${extensionNamespace}:runtime";
9
+ const ${name} = ${name}Factory(${JSON.stringify(registration.generation)}, ${JSON.stringify(filename)});
10
+ ${contents}`;let prepared={contents,loader:"js"};return sources.set(filename,prepared),prepared}},registration=registerExtensionGraph(graph,virtualModules);return{async import(path,_options){assertActive();let id=moduleId(realpathSync(resolve(path))),factory=(await import(__rewriteRelativeImportExtension2(id))).default;return typeof factory!="function"?factory:function(...args){return graph.assertActive(),factory.apply(this,args)}},dispose(){active=!1,registration.dispose(),sources.clear(),commonJs.clear(),commonJsModules.clear()}}}export{bunExtensionImporterStats,createBunExtensionImporter};
@@ -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{external_exports}from"./chunk-3XHLKHSK.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,isLockError}from"./chunk-7X72IACK.js";import{require_proper_lockfile}from"./chunk-3P23SBT3.js";import{getAgentDir}from"./chunk-H5RK2RYZ.js";import{__toESM}from"./chunk-VR4X5O2Z.js";var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{createHmac,randomBytes,randomUUID}from"node:crypto";import{existsSync,mkdirSync,readFileSync,writeFileSync}from"node:fs";import{dirname,join}from"node:path";var CREDENTIAL_POOL_STATE_FILENAME="credential-pool-state.json",HEX_256_BIT=/^[0-9a-f]{64}$/,leaseSchema=external_exports.strictObject({id:external_exports.string().min(1).max(128),expiresAt:external_exports.number().int().positive()}),slotStateSchema=external_exports.strictObject({stateVersion:external_exports.number().int().nonnegative(),blockedUntil:external_exports.number().int().positive().optional(),blockReason:external_exports.enum(["auth_error","rate_limit","account_disabled"]).optional(),failureCount:external_exports.number().int().nonnegative().optional(),lastSuccessAt:external_exports.number().int().positive().optional(),credentialRevision:external_exports.string().regex(HEX_256_BIT).optional(),lease:leaseSchema.optional()}),documentSchema=external_exports.strictObject({schemaVersion:external_exports.literal(1),installationKey:external_exports.string().regex(HEX_256_BIT),providers:external_exports.record(external_exports.string(),external_exports.strictObject({lanes:external_exports.record(external_exports.string(),external_exports.strictObject({slots:external_exports.record(external_exports.string(),slotStateSchema)}))}))});function credentialPoolStatePath(agentDir=getAgentDir()){return join(agentDir,CREDENTIAL_POOL_STATE_FILENAME)}var FILE_WRITE_OPTIONS={encoding:"utf-8",mode:384};function freshDocument(){return{schemaVersion:1,installationKey:randomBytes(32).toString("hex"),providers:{}}}function parseDocument(content){try{let parsed=documentSchema.safeParse(JSON.parse(content));return parsed.success?parsed.data:freshDocument()}catch{return freshDocument()}}function slotHealth(state,now){return state?state.blockReason==="auth_error"||state.blockReason==="account_disabled"||state.blockedUntil!==void 0&&state.blockedUntil>now?"blocked":state.blockedUntil!==void 0&&state.lease!==void 0&&state.lease.expiresAt>now?"half_open":"ready":"ready"}var CredentialSlotRepository=class{constructor(path=credentialPoolStatePath()){this.path=path}ensureFile(){existsSync(this.path)||(mkdirSync(dirname(this.path),{recursive:!0,mode:448}),writeFileSync(this.path,JSON.stringify(freshDocument(),null,2),FILE_WRITE_OPTIONS))}async withDocument(fn){this.ensureFile();let release=await this.acquire();try{let document=parseDocument(readFileSync(this.path,"utf-8")),{result,next}=fn(document);return next&&writeFileSync(this.path,JSON.stringify(next,null,2),FILE_WRITE_OPTIONS),result}finally{await release()}}async acquire(){let startedAt=Date.now(),attempt=0;for(;;)try{return await import_proper_lockfile.default.lock(this.path,FILE_STORAGE_LOCK_OPTIONS)}catch(error){if(!isLockError(error))throw error;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_LOCK_RETRY_BUDGET_MS)throw new CredentialStoreBusyError(this.path,waitedMs,error);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS-waitedMs);attempt++,await new Promise(resolve=>setTimeout(resolve,delayMs))}}async installationKey(){return this.withDocument(document=>({result:document.installationKey,next:document}))}async envCredentialRevision(envVarName,envValue){let key=await this.installationKey();return createHmac("sha256",key).update(`${envVarName}\0${envValue}`).digest("hex")}async storedCredentialRevision(providerId,slotName,material){let key=await this.installationKey();return createHmac("sha256",key).update(`${providerId}\0${slotName}\0${material.key??""}\0${material.access??""}\0${material.refresh??""}`).digest("hex")}async listSlots(providerId,laneId){return this.withDocument(document=>({result:{...document.providers[providerId]?.lanes[laneId]?.slots}}))}async mutateSlotState(providerId,laneId,slotId,fn){return this.withDocument(document=>{let provider=document.providers[providerId]??{lanes:{}},lane=provider.lanes[laneId]??{slots:{}},current=lane.slots[slotId],mutated=fn(current),slots={...lane.slots},result;mutated===void 0?delete slots[slotId]:(result={...mutated,stateVersion:(current?.stateVersion??0)+1},slots[slotId]=result);let next={...document,providers:{...document.providers,[providerId]:{lanes:{...provider.lanes,[laneId]:{slots}}}}};return{result,next}})}};async function acquireHalfOpenLease(repository,providerId,laneId,slotId,options={}){let now=options.now??Date.now(),leaseTtlMs=options.leaseTtlMs??3e4,lease;return await repository.mutateSlotState(providerId,laneId,slotId,current=>{if(!current)return current;let expired=current.blockedUntil!==void 0&&current.blockedUntil<=now,leaseLive=current.lease!==void 0&&current.lease.expiresAt>now;return!expired||leaseLive||current.blockReason==="auth_error"?current:(lease={leaseId:randomUUID(),expiresAt:now+leaseTtlMs},{...current,lease:{id:lease.leaseId,expiresAt:lease.expiresAt}})}),lease}export{CREDENTIAL_POOL_STATE_FILENAME,credentialPoolStatePath,slotHealth,CredentialSlotRepository,acquireHalfOpenLease};
2
+ import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,isLockError}from"./chunk-7X72IACK.js";import{external_exports}from"./chunk-3XHLKHSK.js";import{require_proper_lockfile}from"./chunk-3P23SBT3.js";import{getAgentDir}from"./chunk-H5RK2RYZ.js";import{__toESM}from"./chunk-VR4X5O2Z.js";var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{createHmac,randomBytes,randomUUID}from"node:crypto";import{existsSync,mkdirSync,readFileSync,writeFileSync}from"node:fs";import{dirname,join}from"node:path";var CREDENTIAL_POOL_STATE_FILENAME="credential-pool-state.json",HEX_256_BIT=/^[0-9a-f]{64}$/,leaseSchema=external_exports.strictObject({id:external_exports.string().min(1).max(128),expiresAt:external_exports.number().int().positive()}),slotStateSchema=external_exports.strictObject({stateVersion:external_exports.number().int().nonnegative(),blockedUntil:external_exports.number().int().positive().optional(),blockReason:external_exports.enum(["auth_error","rate_limit","account_disabled"]).optional(),failureCount:external_exports.number().int().nonnegative().optional(),lastSuccessAt:external_exports.number().int().positive().optional(),credentialRevision:external_exports.string().regex(HEX_256_BIT).optional(),lease:leaseSchema.optional()}),documentSchema=external_exports.strictObject({schemaVersion:external_exports.literal(1),installationKey:external_exports.string().regex(HEX_256_BIT),providers:external_exports.record(external_exports.string(),external_exports.strictObject({lanes:external_exports.record(external_exports.string(),external_exports.strictObject({slots:external_exports.record(external_exports.string(),slotStateSchema)}))}))});function credentialPoolStatePath(agentDir=getAgentDir()){return join(agentDir,CREDENTIAL_POOL_STATE_FILENAME)}var FILE_WRITE_OPTIONS={encoding:"utf-8",mode:384};function freshDocument(){return{schemaVersion:1,installationKey:randomBytes(32).toString("hex"),providers:{}}}function parseDocument(content){try{let parsed=documentSchema.safeParse(JSON.parse(content));return parsed.success?parsed.data:freshDocument()}catch{return freshDocument()}}function slotHealth(state,now){return state?state.blockReason==="auth_error"||state.blockReason==="account_disabled"||state.blockedUntil!==void 0&&state.blockedUntil>now?"blocked":state.blockedUntil!==void 0&&state.lease!==void 0&&state.lease.expiresAt>now?"half_open":"ready":"ready"}var CredentialSlotRepository=class{constructor(path=credentialPoolStatePath()){this.path=path}ensureFile(){existsSync(this.path)||(mkdirSync(dirname(this.path),{recursive:!0,mode:448}),writeFileSync(this.path,JSON.stringify(freshDocument(),null,2),FILE_WRITE_OPTIONS))}async withDocument(fn){this.ensureFile();let release=await this.acquire();try{let document=parseDocument(readFileSync(this.path,"utf-8")),{result,next}=fn(document);return next&&writeFileSync(this.path,JSON.stringify(next,null,2),FILE_WRITE_OPTIONS),result}finally{await release()}}async acquire(){let startedAt=Date.now(),attempt=0;for(;;)try{return await import_proper_lockfile.default.lock(this.path,FILE_STORAGE_LOCK_OPTIONS)}catch(error){if(!isLockError(error))throw error;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_LOCK_RETRY_BUDGET_MS)throw new CredentialStoreBusyError(this.path,waitedMs,error);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS-waitedMs);attempt++,await new Promise(resolve=>setTimeout(resolve,delayMs))}}async installationKey(){return this.withDocument(document=>({result:document.installationKey,next:document}))}async envCredentialRevision(envVarName,envValue){let key=await this.installationKey();return createHmac("sha256",key).update(`${envVarName}\0${envValue}`).digest("hex")}async storedCredentialRevision(providerId,slotName,material){let key=await this.installationKey();return createHmac("sha256",key).update(`${providerId}\0${slotName}\0${material.key??""}\0${material.access??""}\0${material.refresh??""}`).digest("hex")}async listSlots(providerId,laneId){return this.withDocument(document=>({result:{...document.providers[providerId]?.lanes[laneId]?.slots}}))}async mutateSlotState(providerId,laneId,slotId,fn){return this.withDocument(document=>{let provider=document.providers[providerId]??{lanes:{}},lane=provider.lanes[laneId]??{slots:{}},current=lane.slots[slotId],mutated=fn(current),slots={...lane.slots},result;mutated===void 0?delete slots[slotId]:(result={...mutated,stateVersion:(current?.stateVersion??0)+1},slots[slotId]=result);let next={...document,providers:{...document.providers,[providerId]:{lanes:{...provider.lanes,[laneId]:{slots}}}}};return{result,next}})}};async function acquireHalfOpenLease(repository,providerId,laneId,slotId,options={}){let now=options.now??Date.now(),leaseTtlMs=options.leaseTtlMs??3e4,lease;return await repository.mutateSlotState(providerId,laneId,slotId,current=>{if(!current)return current;let expired=current.blockedUntil!==void 0&&current.blockedUntil<=now,leaseLive=current.lease!==void 0&&current.lease.expiresAt>now;return!expired||leaseLive||current.blockReason==="auth_error"?current:(lease={leaseId:randomUUID(),expiresAt:now+leaseTtlMs},{...current,lease:{id:lease.leaseId,expiresAt:lease.expiresAt}})}),lease}export{CREDENTIAL_POOL_STATE_FILENAME,credentialPoolStatePath,slotHealth,CredentialSlotRepository,acquireHalfOpenLease};