dsh-cliworker-now 0.0.0-stage → 0.7.7

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 (344) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +364 -0
  3. package/README.md +368 -2
  4. package/cordis.patch.yml +3 -0
  5. package/lib/account-models.mjs +262 -0
  6. package/lib/client.js +22139 -0
  7. package/lib/client.js.map +1 -0
  8. package/lib/grok-catalog.mjs +145 -0
  9. package/lib/hermes-native-entry.py +96 -0
  10. package/lib/hermes-nous-refresh.py +331 -0
  11. package/lib/index.js +14544 -0
  12. package/lib/index.js.map +1 -0
  13. package/lib/native-launch.mjs +234 -0
  14. package/lib/native-spawn.mjs +32 -0
  15. package/lib/own-account-lease.mjs +105 -0
  16. package/lib/pi-installation.mjs +87 -0
  17. package/lib/pi-login.mjs +80 -0
  18. package/lib/pi-native-catalog.mjs +417 -0
  19. package/lib/pi-omp-bridge.mjs +602 -0
  20. package/lib/pi-omp-environment.mjs +15 -0
  21. package/lib/pi-omp-refresh.mjs +324 -0
  22. package/lib/private-launch.mjs +23 -0
  23. package/lib/terminal-bridge.mjs +18 -0
  24. package/lib/typert.host.d.ts +3 -0
  25. package/lib/typert.host.js +1430 -0
  26. package/lib/typert.remote-client.d.ts +72 -0
  27. package/lib/typert.remote-client.d.ts.map +1 -0
  28. package/lib/typert.remote-client.js +1256 -0
  29. package/lib/types/client/account-query-queue.d.ts +16 -0
  30. package/lib/types/client/account-query-queue.js +61 -0
  31. package/lib/types/client/account-query-queue.js.map +1 -0
  32. package/lib/types/client/account-terminal-css.d.ts +1 -0
  33. package/lib/types/client/account-terminal-css.js +3 -0
  34. package/lib/types/client/account-terminal-css.js.map +1 -0
  35. package/lib/types/client/account-terminal.d.ts +17 -0
  36. package/lib/types/client/account-terminal.js +525 -0
  37. package/lib/types/client/account-terminal.js.map +1 -0
  38. package/lib/types/client/assets/antigravity.png +0 -0
  39. package/lib/types/client/assets/claude-code.png +0 -0
  40. package/lib/types/client/assets/cliworker-now-logo.png +0 -0
  41. package/lib/types/client/assets/codex.png +0 -0
  42. package/lib/types/client/assets/grok.png +0 -0
  43. package/lib/types/client/assets/hermes.png +0 -0
  44. package/lib/types/client/assets/kimi-dark.png +0 -0
  45. package/lib/types/client/assets/kimi-light.png +0 -0
  46. package/lib/types/client/assets/mimo-code.png +0 -0
  47. package/lib/types/client/assets/omp.png +0 -0
  48. package/lib/types/client/assets/opencode.png +0 -0
  49. package/lib/types/client/assets/pi.png +0 -0
  50. package/lib/types/client/assets/zcode.png +0 -0
  51. package/lib/types/client/composer-keymap.d.ts +18 -0
  52. package/lib/types/client/composer-keymap.js +49 -0
  53. package/lib/types/client/composer-keymap.js.map +1 -0
  54. package/lib/types/client/conversation-timeline.d.ts +6 -0
  55. package/lib/types/client/conversation-timeline.js +65 -0
  56. package/lib/types/client/conversation-timeline.js.map +1 -0
  57. package/lib/types/client/copy-text.d.ts +5 -0
  58. package/lib/types/client/copy-text.js +45 -0
  59. package/lib/types/client/copy-text.js.map +1 -0
  60. package/lib/types/client/icons.d.ts +21 -0
  61. package/lib/types/client/icons.js +68 -0
  62. package/lib/types/client/icons.js.map +1 -0
  63. package/lib/types/client/index.d.ts +3 -0
  64. package/lib/types/client/index.js +124 -0
  65. package/lib/types/client/index.js.map +1 -0
  66. package/lib/types/client/management-styles.d.ts +1 -0
  67. package/lib/types/client/management-styles.js +17 -0
  68. package/lib/types/client/management-styles.js.map +1 -0
  69. package/lib/types/client/name-copy.d.ts +5 -0
  70. package/lib/types/client/name-copy.js +107 -0
  71. package/lib/types/client/name-copy.js.map +1 -0
  72. package/lib/types/client/native-job-overlay.d.ts +11 -0
  73. package/lib/types/client/native-job-overlay.js +129 -0
  74. package/lib/types/client/native-job-overlay.js.map +1 -0
  75. package/lib/types/client/operation-error.d.ts +2 -0
  76. package/lib/types/client/operation-error.js +12 -0
  77. package/lib/types/client/operation-error.js.map +1 -0
  78. package/lib/types/client/panel.d.ts +8 -0
  79. package/lib/types/client/panel.js +310 -0
  80. package/lib/types/client/panel.js.map +1 -0
  81. package/lib/types/client/rename-copy-styles.d.ts +1 -0
  82. package/lib/types/client/rename-copy-styles.js +21 -0
  83. package/lib/types/client/rename-copy-styles.js.map +1 -0
  84. package/lib/types/client/rename-worker.d.ts +9 -0
  85. package/lib/types/client/rename-worker.js +53 -0
  86. package/lib/types/client/rename-worker.js.map +1 -0
  87. package/lib/types/client/role-presets.d.ts +6 -0
  88. package/lib/types/client/role-presets.js +111 -0
  89. package/lib/types/client/role-presets.js.map +1 -0
  90. package/lib/types/client/settings-dialog.d.ts +13 -0
  91. package/lib/types/client/settings-dialog.js +442 -0
  92. package/lib/types/client/settings-dialog.js.map +1 -0
  93. package/lib/types/client/stat-popover.d.ts +10 -0
  94. package/lib/types/client/stat-popover.js +32 -0
  95. package/lib/types/client/stat-popover.js.map +1 -0
  96. package/lib/types/client/styles.d.ts +9 -0
  97. package/lib/types/client/styles.js +221 -0
  98. package/lib/types/client/styles.js.map +1 -0
  99. package/lib/types/client/telemetry.d.ts +11 -0
  100. package/lib/types/client/telemetry.js +24 -0
  101. package/lib/types/client/telemetry.js.map +1 -0
  102. package/lib/types/client/worker-card.d.ts +10 -0
  103. package/lib/types/client/worker-card.js +75 -0
  104. package/lib/types/client/worker-card.js.map +1 -0
  105. package/lib/types/client/worker-model-menu.d.ts +9 -0
  106. package/lib/types/client/worker-model-menu.js +136 -0
  107. package/lib/types/client/worker-model-menu.js.map +1 -0
  108. package/lib/types/client/workers.d.ts +21 -0
  109. package/lib/types/client/workers.js +59 -0
  110. package/lib/types/client/workers.js.map +1 -0
  111. package/lib/types/client/zcode-login-link-provider.d.ts +9 -0
  112. package/lib/types/client/zcode-login-link-provider.js +105 -0
  113. package/lib/types/client/zcode-login-link-provider.js.map +1 -0
  114. package/lib/types/client/zcode-login-link.d.ts +16 -0
  115. package/lib/types/client/zcode-login-link.js +194 -0
  116. package/lib/types/client/zcode-login-link.js.map +1 -0
  117. package/lib/types/host/account-identity.d.ts +16 -0
  118. package/lib/types/host/account-identity.js +126 -0
  119. package/lib/types/host/account-identity.js.map +1 -0
  120. package/lib/types/host/account-login.d.ts +10 -0
  121. package/lib/types/host/account-login.js +126 -0
  122. package/lib/types/host/account-login.js.map +1 -0
  123. package/lib/types/host/account-models.d.mts +21 -0
  124. package/lib/types/host/account-models.mjs +262 -0
  125. package/lib/types/host/accounts.d.ts +42 -0
  126. package/lib/types/host/accounts.js +945 -0
  127. package/lib/types/host/accounts.js.map +1 -0
  128. package/lib/types/host/adapters.d.ts +24 -0
  129. package/lib/types/host/adapters.js +380 -0
  130. package/lib/types/host/adapters.js.map +1 -0
  131. package/lib/types/host/agy-context.d.ts +8 -0
  132. package/lib/types/host/agy-context.js +122 -0
  133. package/lib/types/host/agy-context.js.map +1 -0
  134. package/lib/types/host/agy-models.d.ts +5 -0
  135. package/lib/types/host/agy-models.js +37 -0
  136. package/lib/types/host/agy-models.js.map +1 -0
  137. package/lib/types/host/agy-windows-account.d.ts +14 -0
  138. package/lib/types/host/agy-windows-account.js +104 -0
  139. package/lib/types/host/agy-windows-account.js.map +1 -0
  140. package/lib/types/host/authorized-catalog.d.ts +14 -0
  141. package/lib/types/host/authorized-catalog.js +35 -0
  142. package/lib/types/host/authorized-catalog.js.map +1 -0
  143. package/lib/types/host/bridge-protocol.d.ts +15 -0
  144. package/lib/types/host/bridge-protocol.js +80 -0
  145. package/lib/types/host/bridge-protocol.js.map +1 -0
  146. package/lib/types/host/claude-native-oauth.d.ts +17 -0
  147. package/lib/types/host/claude-native-oauth.js +272 -0
  148. package/lib/types/host/claude-native-oauth.js.map +1 -0
  149. package/lib/types/host/claude-own-route.d.ts +33 -0
  150. package/lib/types/host/claude-own-route.js +250 -0
  151. package/lib/types/host/claude-own-route.js.map +1 -0
  152. package/lib/types/host/cli-account-binding.d.ts +33 -0
  153. package/lib/types/host/cli-account-binding.js +540 -0
  154. package/lib/types/host/cli-account-binding.js.map +1 -0
  155. package/lib/types/host/cli-protocol.d.ts +27 -0
  156. package/lib/types/host/cli-protocol.js +212 -0
  157. package/lib/types/host/cli-protocol.js.map +1 -0
  158. package/lib/types/host/codex-account.d.ts +8 -0
  159. package/lib/types/host/codex-account.js +143 -0
  160. package/lib/types/host/codex-account.js.map +1 -0
  161. package/lib/types/host/codex-models.d.ts +6 -0
  162. package/lib/types/host/codex-models.js +169 -0
  163. package/lib/types/host/codex-models.js.map +1 -0
  164. package/lib/types/host/extended-adapters.d.ts +44 -0
  165. package/lib/types/host/extended-adapters.js +207 -0
  166. package/lib/types/host/extended-adapters.js.map +1 -0
  167. package/lib/types/host/first-party-account-context.d.ts +26 -0
  168. package/lib/types/host/first-party-account-context.js +55 -0
  169. package/lib/types/host/first-party-account-context.js.map +1 -0
  170. package/lib/types/host/first-party-models.d.ts +29 -0
  171. package/lib/types/host/first-party-models.js +459 -0
  172. package/lib/types/host/first-party-models.js.map +1 -0
  173. package/lib/types/host/grok-adapter.d.ts +44 -0
  174. package/lib/types/host/grok-adapter.js +293 -0
  175. package/lib/types/host/grok-adapter.js.map +1 -0
  176. package/lib/types/host/grok-models.d.ts +47 -0
  177. package/lib/types/host/grok-models.js +320 -0
  178. package/lib/types/host/grok-models.js.map +1 -0
  179. package/lib/types/host/harness-opencode-accounts.d.ts +17 -0
  180. package/lib/types/host/harness-opencode-accounts.js +80 -0
  181. package/lib/types/host/harness-opencode-accounts.js.map +1 -0
  182. package/lib/types/host/hermes-account-context.d.ts +8 -0
  183. package/lib/types/host/hermes-account-context.js +99 -0
  184. package/lib/types/host/hermes-account-context.js.map +1 -0
  185. package/lib/types/host/hermes-accounts.d.ts +19 -0
  186. package/lib/types/host/hermes-accounts.js +356 -0
  187. package/lib/types/host/hermes-accounts.js.map +1 -0
  188. package/lib/types/host/hermes-adapter.d.ts +93 -0
  189. package/lib/types/host/hermes-adapter.js +455 -0
  190. package/lib/types/host/hermes-adapter.js.map +1 -0
  191. package/lib/types/host/hermes-env.d.ts +4 -0
  192. package/lib/types/host/hermes-env.js +22 -0
  193. package/lib/types/host/hermes-env.js.map +1 -0
  194. package/lib/types/host/hermes-installation.d.ts +10 -0
  195. package/lib/types/host/hermes-installation.js +181 -0
  196. package/lib/types/host/hermes-installation.js.map +1 -0
  197. package/lib/types/host/hermes-models.d.ts +26 -0
  198. package/lib/types/host/hermes-models.js +328 -0
  199. package/lib/types/host/hermes-models.js.map +1 -0
  200. package/lib/types/host/hermes-native-entry.py +96 -0
  201. package/lib/types/host/hermes-nous-refresh.py +331 -0
  202. package/lib/types/host/hermes-nous.d.ts +53 -0
  203. package/lib/types/host/hermes-nous.js +343 -0
  204. package/lib/types/host/hermes-nous.js.map +1 -0
  205. package/lib/types/host/hermes-renewal.d.ts +27 -0
  206. package/lib/types/host/hermes-renewal.js +292 -0
  207. package/lib/types/host/hermes-renewal.js.map +1 -0
  208. package/lib/types/host/hermes-suppression.d.ts +7 -0
  209. package/lib/types/host/hermes-suppression.js +69 -0
  210. package/lib/types/host/hermes-suppression.js.map +1 -0
  211. package/lib/types/host/hermes-windows-installation.d.ts +5 -0
  212. package/lib/types/host/hermes-windows-installation.js +91 -0
  213. package/lib/types/host/hermes-windows-installation.js.map +1 -0
  214. package/lib/types/host/index.d.ts +140 -0
  215. package/lib/types/host/index.js +947 -0
  216. package/lib/types/host/index.js.map +1 -0
  217. package/lib/types/host/kimi-accounts.d.ts +17 -0
  218. package/lib/types/host/kimi-accounts.js +220 -0
  219. package/lib/types/host/kimi-accounts.js.map +1 -0
  220. package/lib/types/host/kimi-oauth-models.d.ts +14 -0
  221. package/lib/types/host/kimi-oauth-models.js +246 -0
  222. package/lib/types/host/kimi-oauth-models.js.map +1 -0
  223. package/lib/types/host/managed-agent.d.ts +4 -0
  224. package/lib/types/host/managed-agent.js +127 -0
  225. package/lib/types/host/managed-agent.js.map +1 -0
  226. package/lib/types/host/mimo-configuration.d.ts +22 -0
  227. package/lib/types/host/mimo-configuration.js +258 -0
  228. package/lib/types/host/mimo-configuration.js.map +1 -0
  229. package/lib/types/host/mimo-metadata-cache.d.ts +22 -0
  230. package/lib/types/host/mimo-metadata-cache.js +121 -0
  231. package/lib/types/host/mimo-metadata-cache.js.map +1 -0
  232. package/lib/types/host/native-capability-cache.d.ts +11 -0
  233. package/lib/types/host/native-capability-cache.js +94 -0
  234. package/lib/types/host/native-capability-cache.js.map +1 -0
  235. package/lib/types/host/native-launch.d.mts +2 -0
  236. package/lib/types/host/native-launch.mjs +234 -0
  237. package/lib/types/host/native-process.d.ts +5 -0
  238. package/lib/types/host/native-process.js +41 -0
  239. package/lib/types/host/native-process.js.map +1 -0
  240. package/lib/types/host/native-spawn.mjs +32 -0
  241. package/lib/types/host/opencode-adapter.d.ts +94 -0
  242. package/lib/types/host/opencode-adapter.js +507 -0
  243. package/lib/types/host/opencode-adapter.js.map +1 -0
  244. package/lib/types/host/opencode-native.d.ts +27 -0
  245. package/lib/types/host/opencode-native.js +403 -0
  246. package/lib/types/host/opencode-native.js.map +1 -0
  247. package/lib/types/host/own-account-lease.d.mts +5 -0
  248. package/lib/types/host/own-account-lease.mjs +105 -0
  249. package/lib/types/host/pi-installation.d.mts +7 -0
  250. package/lib/types/host/pi-installation.mjs +87 -0
  251. package/lib/types/host/pi-omp-accounts.d.ts +28 -0
  252. package/lib/types/host/pi-omp-accounts.js +175 -0
  253. package/lib/types/host/pi-omp-accounts.js.map +1 -0
  254. package/lib/types/host/pi-omp-adapter.d.ts +32 -0
  255. package/lib/types/host/pi-omp-adapter.js +190 -0
  256. package/lib/types/host/pi-omp-adapter.js.map +1 -0
  257. package/lib/types/host/pi-omp-environment.d.mts +1 -0
  258. package/lib/types/host/pi-omp-environment.mjs +15 -0
  259. package/lib/types/host/pi-omp-identity.d.ts +2 -0
  260. package/lib/types/host/pi-omp-identity.js +142 -0
  261. package/lib/types/host/pi-omp-identity.js.map +1 -0
  262. package/lib/types/host/pi-omp-logout.d.ts +3 -0
  263. package/lib/types/host/pi-omp-logout.js +152 -0
  264. package/lib/types/host/pi-omp-logout.js.map +1 -0
  265. package/lib/types/host/pi-omp-native.d.ts +71 -0
  266. package/lib/types/host/pi-omp-native.js +753 -0
  267. package/lib/types/host/pi-omp-native.js.map +1 -0
  268. package/lib/types/host/pi-omp-refresh.d.mts +7 -0
  269. package/lib/types/host/pi-omp-refresh.mjs +324 -0
  270. package/lib/types/host/private-launch.mjs +23 -0
  271. package/lib/types/host/process.d.ts +43 -0
  272. package/lib/types/host/process.js +134 -0
  273. package/lib/types/host/process.js.map +1 -0
  274. package/lib/types/host/protocol.d.ts +23 -0
  275. package/lib/types/host/protocol.js +112 -0
  276. package/lib/types/host/protocol.js.map +1 -0
  277. package/lib/types/host/roles.d.ts +34 -0
  278. package/lib/types/host/roles.js +80 -0
  279. package/lib/types/host/roles.js.map +1 -0
  280. package/lib/types/host/routing.d.ts +31 -0
  281. package/lib/types/host/routing.js +248 -0
  282. package/lib/types/host/routing.js.map +1 -0
  283. package/lib/types/host/runtime.d.ts +60 -0
  284. package/lib/types/host/runtime.js +598 -0
  285. package/lib/types/host/runtime.js.map +1 -0
  286. package/lib/types/host/storage.d.ts +48 -0
  287. package/lib/types/host/storage.js +449 -0
  288. package/lib/types/host/storage.js.map +1 -0
  289. package/lib/types/host/telemetry.d.ts +17 -0
  290. package/lib/types/host/telemetry.js +158 -0
  291. package/lib/types/host/telemetry.js.map +1 -0
  292. package/lib/types/host/windows-account-bootstrap.ps1 +44 -0
  293. package/lib/types/host/windows-account-launch.mjs +47 -0
  294. package/lib/types/host/windows-account-owner.ps1 +137 -0
  295. package/lib/types/host/windows-account-stdio.mjs +19 -0
  296. package/lib/types/host/windows-account-terminal.d.ts +17 -0
  297. package/lib/types/host/windows-account-terminal.js +208 -0
  298. package/lib/types/host/windows-account-terminal.js.map +1 -0
  299. package/lib/types/host/windows-agy-account.ps1 +81 -0
  300. package/lib/types/host/windows-cli-installation.d.ts +31 -0
  301. package/lib/types/host/windows-cli-installation.js +157 -0
  302. package/lib/types/host/windows-cli-installation.js.map +1 -0
  303. package/lib/types/host/windows-hidden-launch.mjs +49 -0
  304. package/lib/types/host/windows-hidden-process.d.ts +12 -0
  305. package/lib/types/host/windows-hidden-process.js +116 -0
  306. package/lib/types/host/windows-hidden-process.js.map +1 -0
  307. package/lib/types/host/zcode-account-models.d.ts +16 -0
  308. package/lib/types/host/zcode-account-models.js +114 -0
  309. package/lib/types/host/zcode-account-models.js.map +1 -0
  310. package/lib/types/host/zcode-adapter.d.ts +93 -0
  311. package/lib/types/host/zcode-adapter.js +808 -0
  312. package/lib/types/host/zcode-adapter.js.map +1 -0
  313. package/lib/types/host/zcode-grok-accounts.d.ts +30 -0
  314. package/lib/types/host/zcode-grok-accounts.js +408 -0
  315. package/lib/types/host/zcode-grok-accounts.js.map +1 -0
  316. package/lib/types/shared/accounts.d.ts +47 -0
  317. package/lib/types/shared/accounts.js +2 -0
  318. package/lib/types/shared/accounts.js.map +1 -0
  319. package/lib/types/shared/builtin-presets.d.ts +2 -0
  320. package/lib/types/shared/builtin-presets.js +231 -0
  321. package/lib/types/shared/builtin-presets.js.map +1 -0
  322. package/lib/types/shared/cli-settings.d.ts +5 -0
  323. package/lib/types/shared/cli-settings.js +2 -0
  324. package/lib/types/shared/cli-settings.js.map +1 -0
  325. package/lib/types/shared/model-presentation.d.ts +10 -0
  326. package/lib/types/shared/model-presentation.js +95 -0
  327. package/lib/types/shared/model-presentation.js.map +1 -0
  328. package/lib/types/shared/models.d.ts +7 -0
  329. package/lib/types/shared/models.js +35 -0
  330. package/lib/types/shared/models.js.map +1 -0
  331. package/lib/types/shared/telemetry.d.ts +18 -0
  332. package/lib/types/shared/telemetry.js +16 -0
  333. package/lib/types/shared/telemetry.js.map +1 -0
  334. package/lib/types/shared/types.d.ts +127 -0
  335. package/lib/types/shared/types.js +147 -0
  336. package/lib/types/shared/types.js.map +1 -0
  337. package/lib/windows-account-bootstrap.ps1 +44 -0
  338. package/lib/windows-account-launch.mjs +47 -0
  339. package/lib/windows-account-owner.ps1 +137 -0
  340. package/lib/windows-account-stdio.mjs +19 -0
  341. package/lib/windows-agy-account.ps1 +81 -0
  342. package/lib/windows-hidden-launch.mjs +49 -0
  343. package/lib/zcode-resume.mjs +423 -0
  344. package/package.json +109 -4
@@ -0,0 +1,28 @@
1
+ import type { AccountAction, AccountSource } from '../shared/accounts.ts';
2
+ import type { PiOmpCli } from './pi-omp-adapter.ts';
3
+ import { type RuntimeConfig } from './process.ts';
4
+ export interface PiOmpAccountTerminalInput {
5
+ cli: PiOmpCli;
6
+ action?: AccountAction;
7
+ source?: AccountSource;
8
+ executable: string;
9
+ project: string;
10
+ stateDirectory: string;
11
+ /** Read-only native source override for isolated integrations/tests. */
12
+ nativeHome?: string;
13
+ config: RuntimeConfig;
14
+ signal?: AbortSignal;
15
+ }
16
+ export interface PiOmpAccountTerminalLaunch {
17
+ argv: string[];
18
+ cwd: string;
19
+ env: Record<string, string>;
20
+ instruction: string;
21
+ /** Call only after the complete terminal process range has exited. */
22
+ cleanup: () => Promise<void>;
23
+ }
24
+ /**
25
+ * User-operated native account UI. No task prompt or automatic login is sent;
26
+ * original global sources remain unchanged and this plugin keeps its own account store.
27
+ */
28
+ export declare function preparePiOmpAccountTerminal(input: PiOmpAccountTerminalInput): Promise<PiOmpAccountTerminalLaunch>;
@@ -0,0 +1,175 @@
1
+ import { constants } from 'node:fs';
2
+ import { chmod, lstat, mkdir, mkdtemp, open, realpath, rename, rm, writeFile, readFile } from 'node:fs/promises';
3
+ import { join, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { snapshotPiOmpNative, safePiOmpAncestors } from "./pi-omp-native.js";
6
+ import { preparePiOmpLogout } from "./pi-omp-logout.js";
7
+ import { ompConfigurationEnvironment } from './pi-omp-environment.mjs';
8
+ import { projectDirectory } from "./process.js";
9
+ async function privateDirectory(path) {
10
+ await safePiOmpAncestors(path);
11
+ await mkdir(path, { recursive: true, mode: 0o700 });
12
+ const before = await lstat(path);
13
+ if (before.isSymbolicLink() || !before.isDirectory())
14
+ throw new Error('Unsafe account directory symlink');
15
+ if (process.platform === 'win32') {
16
+ const canonical = await realpath(path);
17
+ await chmod(path, 0o700);
18
+ const after = await lstat(path);
19
+ if (after.isSymbolicLink() ||
20
+ !after.isDirectory() ||
21
+ before.dev !== after.dev ||
22
+ before.ino !== after.ino ||
23
+ (await realpath(path)) !== canonical)
24
+ throw new Error('Account directory changed while opening');
25
+ return canonical;
26
+ }
27
+ const handle = await open(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
28
+ try {
29
+ const opened = await handle.stat();
30
+ if (opened.dev !== before.dev || opened.ino !== before.ino)
31
+ throw new Error('Account directory changed while opening');
32
+ await handle.chmod(0o700);
33
+ }
34
+ finally {
35
+ await handle.close();
36
+ }
37
+ return realpath(path);
38
+ }
39
+ async function writePrivateJSON(path, value) {
40
+ const temporary = `${path}.tmp`;
41
+ try {
42
+ await writeFile(temporary, JSON.stringify(value), { flag: 'wx', mode: 0o600 });
43
+ await rename(temporary, path);
44
+ }
45
+ finally {
46
+ await rm(temporary, { force: true });
47
+ }
48
+ }
49
+ /**
50
+ * User-operated native account UI. No task prompt or automatic login is sent;
51
+ * original global sources remain unchanged and this plugin keeps its own account store.
52
+ */
53
+ export async function preparePiOmpAccountTerminal(input) {
54
+ const { cli, signal } = input;
55
+ if (cli !== 'pi' && cli !== 'omp')
56
+ throw new Error('Unsupported Pi/OMP account terminal');
57
+ if (input.action === 'logout')
58
+ return preparePiOmpLogout(input);
59
+ signal?.throwIfAborted();
60
+ projectDirectory(input.project);
61
+ const root = await privateDirectory(resolve(input.stateDirectory));
62
+ const accountRoot = await privateDirectory(join(root, 'account-runtime'));
63
+ const runtime = await mkdtemp(join(accountRoot, `${cli}-`));
64
+ const identity = await lstat(runtime);
65
+ let removed = false;
66
+ const cleanup = async () => {
67
+ if (removed)
68
+ return;
69
+ let current;
70
+ try {
71
+ current = await lstat(runtime);
72
+ }
73
+ catch (error) {
74
+ if (error.code === 'ENOENT') {
75
+ removed = true;
76
+ return;
77
+ }
78
+ throw error;
79
+ }
80
+ if (current.isSymbolicLink() || current.dev !== identity.dev || current.ino !== identity.ino)
81
+ throw new Error('Account runtime changed before cleanup');
82
+ await rm(runtime, { recursive: true, force: true });
83
+ removed = true;
84
+ };
85
+ try {
86
+ signal?.throwIfAborted();
87
+ const accounts = await privateDirectory(join(root, 'accounts'));
88
+ const account = await privateDirectory(join(accounts, cli));
89
+ const agent = await privateDirectory(join(account, 'agent'));
90
+ const native = await snapshotPiOmpNative(cli, agent, { accountRoot: root, nativeHome: input.nativeHome });
91
+ const temporary = await privateDirectory(join(runtime, 'tmp'));
92
+ const nativeArgs = ['--no-session', '--no-tools', '--no-extensions', '--no-skills'];
93
+ const env = {
94
+ ...native.env,
95
+ PI_CODING_AGENT_DIR: agent,
96
+ TMPDIR: temporary,
97
+ TMP: temporary,
98
+ TEMP: temporary,
99
+ ELECTRON_RUN_AS_NODE: '1',
100
+ // Do not let a caller's active profile redirect this disposable TUI to
101
+ // another credential store. Harness already scrubs ambient secret names.
102
+ OMP_AUTH_BROKER_URL: '',
103
+ OMP_AUTH_BROKER_TOKEN: '',
104
+ OMP_PROFILE: '',
105
+ PI_PROFILE: '',
106
+ };
107
+ if (cli === 'pi') {
108
+ nativeArgs.push('--no-prompt-templates', '--no-themes', '--no-context-files', '--no-approve', '--offline');
109
+ env.PI_OFFLINE = '1';
110
+ env.PI_TELEMETRY = '0';
111
+ }
112
+ else {
113
+ const nativeAuth = JSON.parse(await readFile(join(agent, 'native-auth.json'), 'utf8'));
114
+ await writePrivateJSON(join(agent, 'config.yml'), {
115
+ ...nativeAuth,
116
+ // Native OMP 16.4.4 setup scene selection reads startup.setupWizard.
117
+ // Account login is an explicit action; manage does not start onboarding.
118
+ startup: { setupWizard: false, showSplash: false, checkUpdate: false },
119
+ // OMP 16.4.4 has no --no-mcp. Its native discovery registry filters these
120
+ // provider IDs before reading global/project MCP files or spawning servers.
121
+ // Account terminals must not import other applications' tools or hooks.
122
+ disabledProviders: [
123
+ 'native',
124
+ 'claude',
125
+ 'claude-plugins',
126
+ 'codex',
127
+ 'cursor',
128
+ 'gemini',
129
+ 'opencode',
130
+ 'mcp-json',
131
+ 'vscode',
132
+ 'windsurf',
133
+ 'omp-plugins',
134
+ ],
135
+ mcp: { enableProjectConfig: false },
136
+ retry: { modelFallback: false },
137
+ memory: { backend: 'off' },
138
+ tools: { approvalMode: 'always-ask' },
139
+ });
140
+ Object.assign(env, ompConfigurationEnvironment(account));
141
+ nativeArgs.push('--no-rules', '--no-title', '--no-lsp', '--no-pty', '--approval-mode', 'always-ask', '--config', join(agent, 'config.yml'));
142
+ }
143
+ signal?.throwIfAborted();
144
+ let nativeArgv = /\.[cm]?js$/.test(input.executable)
145
+ ? [process.execPath, input.executable, ...nativeArgs]
146
+ : [input.executable, ...nativeArgs];
147
+ if (input.action === 'login') {
148
+ // No prompt injection: OMP's native onboarding, or Pi's native UI API.
149
+ nativeArgv =
150
+ cli === 'omp'
151
+ ? [input.executable, 'setup']
152
+ : [process.execPath, fileURLToPath(new URL('./pi-login.mjs', import.meta.url)), input.executable];
153
+ }
154
+ const argv = [process.execPath, fileURLToPath(new URL('./private-launch.mjs', import.meta.url)), ...nativeArgv];
155
+ if (cli === 'omp') {
156
+ // OMP's native logger uses configRoot/logs, beside its agent directory.
157
+ await privateDirectory(join(account, 'logs'));
158
+ }
159
+ return {
160
+ argv,
161
+ // Avoid loading project files while operating account controls.
162
+ cwd: runtime,
163
+ env,
164
+ instruction: input.action === 'login'
165
+ ? '选择提供商并完成登录。'
166
+ : '输入 /login 或 /logout 管理终端账号;现有任务保留已选择的模型与凭据。',
167
+ cleanup,
168
+ };
169
+ }
170
+ catch (error) {
171
+ await cleanup();
172
+ throw error;
173
+ }
174
+ }
175
+ //# sourceMappingURL=pi-omp-accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-omp-accounts.js","sourceRoot":"","sources":["../../../src/host/pi-omp-accounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type ModelChoice, type TaskMode } from '../shared/types.ts';
2
+ import { type PiOmpNativeOptions } from './pi-omp-native.ts';
3
+ export type PiOmpCli = 'pi' | 'omp';
4
+ export type PiOmpMetadataPhase = 'native-candidates' | 'account-scope';
5
+ export type PiOmpMetadataCapture = (argv: string[], env?: Record<string, string>, phase?: PiOmpMetadataPhase, scope?: {
6
+ leaseDirectory?: string;
7
+ }) => Promise<string>;
8
+ export interface PiOmpInput extends PiOmpNativeOptions {
9
+ managedCredentials?: boolean;
10
+ cli: PiOmpCli;
11
+ executable: string;
12
+ project: string;
13
+ preference: {
14
+ model: string;
15
+ effort: string;
16
+ };
17
+ mode: TaskMode;
18
+ prompt: string;
19
+ conversationId?: string;
20
+ stateDirectory: string;
21
+ }
22
+ /** The bridge validates exact native model capabilities before sending any prompt. */
23
+ export declare function preparePiOmp(input: PiOmpInput, capture?: PiOmpMetadataCapture): Promise<{
24
+ argv: string[];
25
+ env?: Record<string, string>;
26
+ leaseDirectory?: string;
27
+ activate: () => Promise<void>;
28
+ cleanup: () => Promise<void>;
29
+ }>;
30
+ export declare function discoverPiOmp(cli: PiOmpCli, executable: string, capture: PiOmpMetadataCapture, stateDirectory: string, options?: PiOmpNativeOptions & {
31
+ managedCredentials?: boolean;
32
+ }): Promise<ModelChoice[]>;
@@ -0,0 +1,190 @@
1
+ import { mkdir, mkdtemp, realpath, writeFile, lstat, open, rename, rm, chmod } from 'node:fs/promises';
2
+ import { constants, existsSync } from 'node:fs';
3
+ import { createHash, randomUUID } from 'node:crypto';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { EFFORTS } from "../shared/types.js";
7
+ import { ProcessCleanupUnconfirmedError } from "./process.js";
8
+ import { snapshotPiOmpNative, safePiOmpAncestors } from "./pi-omp-native.js";
9
+ import { finishPiOmpRefresh } from './pi-omp-refresh.mjs';
10
+ import { acquireOwnAccountLease } from './own-account-lease.mjs';
11
+ import { assertPiOmpRefreshSources, assertPiOmpRefreshCache } from './pi-omp-refresh.mjs';
12
+ const bridgePath = () => {
13
+ const here = dirname(fileURLToPath(import.meta.url));
14
+ for (const candidate of [join(here, 'pi-omp-bridge.mjs'), resolve(here, '../../pi-omp-bridge.mjs')])
15
+ if (existsSync(candidate))
16
+ return candidate;
17
+ throw new Error('Pi/OMP bridge 未安装,请重新构建插件');
18
+ };
19
+ async function privateDirectory(path) {
20
+ await safePiOmpAncestors(path);
21
+ await mkdir(path, { recursive: true, mode: 0o700 });
22
+ const info = await lstat(path);
23
+ if (info.isSymbolicLink() || !info.isDirectory())
24
+ throw new Error('Unsafe Pi/OMP state directory symlink');
25
+ if (process.platform === 'win32') {
26
+ // Node's POSIX directory descriptor/chmod path is not supported on Windows.
27
+ // Match account preparation: pin the path and inode around the path-based operation.
28
+ const canonical = await realpath(path);
29
+ await chmod(path, 0o700);
30
+ const current = await lstat(path);
31
+ if (current.isSymbolicLink() ||
32
+ !current.isDirectory() ||
33
+ info.dev !== current.dev ||
34
+ info.ino !== current.ino ||
35
+ (await realpath(path)) !== canonical)
36
+ throw new Error('Pi/OMP state directory changed while opening');
37
+ return canonical;
38
+ }
39
+ const handle = await open(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
40
+ try {
41
+ const opened = await handle.stat();
42
+ if (info.dev !== opened.dev || info.ino !== opened.ino)
43
+ throw new Error('Pi/OMP state directory changed while opening');
44
+ await handle.chmod(0o700);
45
+ }
46
+ finally {
47
+ await handle.close();
48
+ }
49
+ return realpath(path);
50
+ }
51
+ async function contextFor(input) {
52
+ const stateDirectory = resolve(input.stateDirectory);
53
+ const root = await privateDirectory(stateDirectory);
54
+ const identity = 'discover' in input
55
+ ? 'catalog'
56
+ : createHash('sha256')
57
+ .update(await realpath(input.project))
58
+ .digest('hex');
59
+ const cliDirectory = await privateDirectory(join(root, input.cli));
60
+ const isolated = await privateDirectory(join(cliDirectory, identity));
61
+ const agent = await privateDirectory(join(isolated, 'agent'));
62
+ // Rebuild from this CLI's current sources, including on continuation.
63
+ const native = await snapshotPiOmpNative(input.cli, agent, {
64
+ accountRoot: input.accountRoot ?? stateDirectory,
65
+ nativeHome: input.nativeHome,
66
+ signal: input.signal,
67
+ sharedOAuth: true,
68
+ });
69
+ const request = async (extra = {}) => {
70
+ const leaseNonce = randomUUID();
71
+ const requestDirectory = await mkdtemp(join(isolated, 'request-'));
72
+ const requestPath = join(requestDirectory, 'request.json');
73
+ const temporary = join(requestDirectory, `.request-${randomUUID()}.tmp`);
74
+ try {
75
+ await writeFile(temporary, JSON.stringify({
76
+ ...input,
77
+ ...extra,
78
+ stateDirectory: isolated,
79
+ nativeRoot: native.directory,
80
+ ...(native.leaseDirectory
81
+ ? { leaseDirectory: native.leaseDirectory, leaseNonce, refreshReceipt: native.receipt }
82
+ : {}),
83
+ ...('project' in input ? { project: await realpath(input.project) } : {}),
84
+ }), { flag: 'wx', mode: 0o600 });
85
+ await rename(temporary, requestPath);
86
+ }
87
+ finally {
88
+ await rm(temporary, { force: true });
89
+ }
90
+ return {
91
+ argv: [process.execPath, bridgePath(), requestPath],
92
+ env: native.env,
93
+ leaseDirectory: native.leaseDirectory,
94
+ activate: async () => {
95
+ if (native.leaseDirectory) {
96
+ await acquireOwnAccountLease(native.leaseDirectory, leaseNonce);
97
+ await assertPiOmpRefreshSources(native.leaseDirectory, native.receipt);
98
+ await assertPiOmpRefreshCache(native.leaseDirectory, native.receipt);
99
+ }
100
+ },
101
+ cleanup: async () => {
102
+ if (native.leaseDirectory)
103
+ await finishPiOmpRefresh(native.leaseDirectory, leaseNonce, input.executable, native.receipt);
104
+ },
105
+ };
106
+ };
107
+ return { request };
108
+ }
109
+ async function confirmedCatalog(context, capture) {
110
+ for (const phase of ['native-candidates', 'account-scope']) {
111
+ const launch = await context.request({ metadataPhase: phase });
112
+ let raw;
113
+ let cleanupUnconfirmed = false;
114
+ try {
115
+ await launch.activate();
116
+ raw = JSON.parse(await capture(launch.argv, launch.env, phase, { leaseDirectory: launch.leaseDirectory }));
117
+ }
118
+ catch (error) {
119
+ if (error instanceof ProcessCleanupUnconfirmedError) {
120
+ cleanupUnconfirmed = true;
121
+ throw error;
122
+ }
123
+ throw new Error('无法读取 Pi/OMP 原生模型目录,请检查本机配置');
124
+ }
125
+ finally {
126
+ if (!cleanupUnconfirmed)
127
+ await launch.cleanup();
128
+ }
129
+ if (phase === 'account-scope')
130
+ return parseCatalog(raw);
131
+ if (!raw ||
132
+ typeof raw !== 'object' ||
133
+ raw.phase !== phase ||
134
+ !Number.isSafeInteger(raw.count) ||
135
+ raw.count < 0)
136
+ throw new Error('Invalid Pi/OMP candidate phase result');
137
+ }
138
+ throw new Error('Missing Pi/OMP account scope');
139
+ }
140
+ /** The bridge validates exact native model capabilities before sending any prompt. */
141
+ export async function preparePiOmp(input, capture) {
142
+ if (input.cli !== 'pi' && input.cli !== 'omp')
143
+ throw new Error('Unsupported Pi/OMP CLI');
144
+ if (!/^[A-Za-z0-9_.:-]+\/[^\s\x00-\x1f]+$/.test(input.preference.model))
145
+ throw new Error('Pi/OMP 需要原生 provider/model 选型');
146
+ if (!EFFORTS.includes(input.preference.effort))
147
+ throw new Error('Unsupported native model effort');
148
+ if (!['plan', 'accept-edits'].includes(input.mode))
149
+ throw new Error('Unsupported task mode');
150
+ if (!input.prompt.trim())
151
+ throw new Error('Prompt must not be empty');
152
+ const context = await contextFor(input);
153
+ // Preparing a request is reversible. Execution requires the Host's two
154
+ // captures on this exact snapshot; an unconfirmed request cannot send prompts.
155
+ const catalog = capture ? await confirmedCatalog(context, capture) : undefined;
156
+ return context.request(catalog ? { confirmedCatalog: catalog } : {});
157
+ }
158
+ export async function discoverPiOmp(cli, executable, capture, stateDirectory, options = {}) {
159
+ if (cli !== 'pi' && cli !== 'omp')
160
+ throw new Error('Unsupported Pi/OMP CLI');
161
+ const context = await contextFor({ cli, executable, stateDirectory, discover: true, ...options });
162
+ return confirmedCatalog(context, capture);
163
+ }
164
+ function parseCatalog(raw) {
165
+ if (!Array.isArray(raw))
166
+ throw new Error('Invalid Pi/OMP model catalog');
167
+ const ids = new Set();
168
+ return raw.map((model) => {
169
+ if (!model ||
170
+ typeof model !== 'object' ||
171
+ typeof model.id !== 'string' ||
172
+ !/^[A-Za-z0-9_.:-]+\/[^\s\x00-\x1f]+$/.test(model.id) ||
173
+ typeof model.label !== 'string' ||
174
+ !Array.isArray(model.efforts) ||
175
+ !model.efforts.length ||
176
+ model.efforts.some((effort) => !EFFORTS.includes(effort)) ||
177
+ ids.has(model.id))
178
+ throw new Error('Invalid Pi/OMP native model entry');
179
+ ids.add(model.id);
180
+ return {
181
+ id: model.id,
182
+ label: model.label,
183
+ efforts: [...new Set(model.efforts)],
184
+ ...(model.cost === 'free' || model.cost === 'paid' || model.cost === 'unknown'
185
+ ? { cost: model.cost }
186
+ : {}),
187
+ };
188
+ });
189
+ }
190
+ //# sourceMappingURL=pi-omp-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-omp-adapter.js","sourceRoot":"","sources":["../../../src/host/pi-omp-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export function ompConfigurationEnvironment(configRoot: string): Record<string, string>
@@ -0,0 +1,15 @@
1
+ import { homedir } from 'node:os'
2
+ import { basename, dirname, relative, resolve } from 'node:path'
3
+
4
+ /** OMP 16 resolves its config root with join(os.homedir(), PI_CONFIG_DIR).
5
+ * Windows roots on another drive cannot be expressed relative to the real home.
6
+ * Rebase only this child environment; Host account discovery retains the real home.
7
+ */
8
+ export function ompConfigurationEnvironment(configRoot) {
9
+ if (typeof configRoot !== 'string' || !configRoot.trim() || configRoot.includes('\0'))
10
+ throw new Error('Invalid OMP configuration root')
11
+ const root = resolve(configRoot)
12
+ if (process.platform === 'win32')
13
+ return { HOME: dirname(root), USERPROFILE: dirname(root), PI_CONFIG_DIR: basename(root) }
14
+ return { PI_CONFIG_DIR: relative(homedir(), root) }
15
+ }
@@ -0,0 +1,2 @@
1
+ /** Runs only bounded --help metadata, never login, OAuth refresh or a model prompt. */
2
+ export declare function verifyPiOmpExecutable(cli: 'pi' | 'omp', executable: string, capture: (argv: string[], cwd: string, env: Record<string, string>) => Promise<string>): Promise<string>;
@@ -0,0 +1,142 @@
1
+ import { mkdir, mkdtemp, rm, open, realpath } from 'node:fs/promises';
2
+ import { constants } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { inspectPiInstallation } from './pi-installation.mjs';
6
+ import { ProcessCleanupUnconfirmedError } from "./process.js";
7
+ import { ompConfigurationEnvironment } from './pi-omp-environment.mjs';
8
+ import { nativeLaunchArgv } from './native-launch.mjs';
9
+ const mismatch = (message) => Object.assign(new Error(message), { code: 'CLI_IDENTITY_MISMATCH' });
10
+ // This is installation capability evidence, never account or model evidence.
11
+ // Only standalone native binaries qualify: script dependencies may change
12
+ // without changing the launcher's own metadata.
13
+ const ompCapabilities = new Map();
14
+ async function binaryRevision(executable) {
15
+ let handle;
16
+ try {
17
+ const path = await realpath(executable);
18
+ handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
19
+ const info = await handle.stat({ bigint: true });
20
+ if (!info.isFile())
21
+ return undefined;
22
+ const magic = Buffer.alloc(4);
23
+ if ((await handle.read(magic, 0, 4, 0)).bytesRead !== 4)
24
+ return undefined;
25
+ let portableExecutable = false;
26
+ if (magic.subarray(0, 2).toString('ascii') === 'MZ' && info.size >= 64n) {
27
+ const offset = Buffer.alloc(4), signature = Buffer.alloc(4);
28
+ if ((await handle.read(offset, 0, 4, 0x3c)).bytesRead === 4) {
29
+ const pe = offset.readUInt32LE();
30
+ portableExecutable =
31
+ pe >= 64 &&
32
+ BigInt(pe + 4) <= info.size &&
33
+ (await handle.read(signature, 0, 4, pe)).bytesRead === 4 &&
34
+ signature.toString('hex') === '50450000';
35
+ }
36
+ }
37
+ if (!portableExecutable &&
38
+ ![
39
+ '7f454c46',
40
+ 'cffaedfe',
41
+ 'cefaedfe',
42
+ 'feedfacf',
43
+ 'feedface',
44
+ 'cafebabe',
45
+ 'bebafeca',
46
+ 'cafebabf',
47
+ 'bfbafeca',
48
+ ].includes(magic.toString('hex')))
49
+ return undefined;
50
+ return {
51
+ path,
52
+ revision: [info.dev, info.ino, info.size, info.mtimeNs, info.ctimeNs].join(':'),
53
+ };
54
+ }
55
+ catch {
56
+ return undefined;
57
+ }
58
+ finally {
59
+ await handle?.close();
60
+ }
61
+ }
62
+ /** Runs only bounded --help metadata, never login, OAuth refresh or a model prompt. */
63
+ export async function verifyPiOmpExecutable(cli, executable, capture) {
64
+ if (cli === 'pi')
65
+ return inspectPiInstallation(executable).executable;
66
+ let isPi = false;
67
+ try {
68
+ inspectPiInstallation(executable);
69
+ isPi = true;
70
+ }
71
+ catch {
72
+ // A standalone OMP binary has no Pi manifest; its native help must identify it.
73
+ }
74
+ if (isPi)
75
+ throw mismatch('OMP 入口指向 Pi Coding Agent;二者是独立 CLI,请修正 OMP 程序路径');
76
+ const before = await binaryRevision(executable);
77
+ if (before && ompCapabilities.get(before.path) === before.revision)
78
+ return executable;
79
+ const root = await mkdtemp(join(tmpdir(), 'cliworker-omp-identity-'));
80
+ let cleanupConfirmed = true;
81
+ try {
82
+ const windowsAgent = join(root, 'config', 'agent');
83
+ if (process.platform === 'win32')
84
+ await mkdir(windowsAgent, { recursive: true, mode: 0o700 });
85
+ const argv = /\.(?:[cm]?js|cmd|bat)$/i.test(executable)
86
+ ? nativeLaunchArgv([executable, '--help'])
87
+ : [executable, '--help'];
88
+ const help = await capture(argv, root, {
89
+ PI_CODING_AGENT_DIR: root,
90
+ PI_CONFIG_DIR: root,
91
+ OMP_PROFILE: '',
92
+ PI_PROFILE: '',
93
+ TMPDIR: root,
94
+ ELECTRON_RUN_AS_NODE: '1',
95
+ ...(process.platform === 'win32'
96
+ ? {
97
+ ...ompConfigurationEnvironment(join(root, 'config')),
98
+ PI_CODING_AGENT_DIR: windowsAgent,
99
+ TMP: root,
100
+ TEMP: root,
101
+ }
102
+ : {}),
103
+ });
104
+ if (!/^omp v\d+\.\d+\.\d+\b/m.test(help) ||
105
+ !/\brpc\b/.test(help) ||
106
+ !/^\s+setup\s/m.test(help) ||
107
+ !/^\s+models\s/m.test(help) ||
108
+ [
109
+ '--mode',
110
+ '--config',
111
+ '--thinking',
112
+ '--session-dir',
113
+ '--tools',
114
+ '--no-rules',
115
+ '--no-title',
116
+ '--no-lsp',
117
+ '--no-pty',
118
+ '--approval-mode',
119
+ ].some((flag) => !help.includes(flag)))
120
+ throw mismatch('OMP 安装身份或原生接口不匹配;需要支持 RPC、models 和 setup 的 Oh My Pi,不能使用 Pi 入口');
121
+ if (before) {
122
+ const after = await binaryRevision(executable);
123
+ if (after?.path === before.path && after.revision === before.revision) {
124
+ ompCapabilities.delete(before.path);
125
+ ompCapabilities.set(before.path, before.revision);
126
+ if (ompCapabilities.size > 64)
127
+ ompCapabilities.delete(ompCapabilities.keys().next().value);
128
+ }
129
+ }
130
+ return executable;
131
+ }
132
+ catch (error) {
133
+ if (error instanceof ProcessCleanupUnconfirmedError)
134
+ cleanupConfirmed = false;
135
+ throw error;
136
+ }
137
+ finally {
138
+ if (cleanupConfirmed)
139
+ await rm(root, { recursive: true, force: true });
140
+ }
141
+ }
142
+ //# sourceMappingURL=pi-omp-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-omp-identity.js","sourceRoot":"","sources":["../../../src/host/pi-omp-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PiOmpAccountTerminalInput, PiOmpAccountTerminalLaunch } from './pi-omp-accounts.ts';
2
+ /** No snapshot, migration or credential deletion here: only native user-operated menus. */
3
+ export declare function preparePiOmpLogout(input: PiOmpAccountTerminalInput): Promise<PiOmpAccountTerminalLaunch>;