@undefineds.co/linx 0.3.25 → 0.3.27

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 (362) hide show
  1. package/README.md +4 -3
  2. package/dist/index.js +3 -832
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/agent-stream-bridge-contract.js +2 -0
  5. package/dist/lib/agent-stream-bridge-contract.js.map +1 -0
  6. package/dist/lib/auto-mode/auth.js +100 -2
  7. package/dist/lib/auto-mode/auth.js.map +1 -1
  8. package/dist/lib/auto-mode/backend-kind.js +13 -0
  9. package/dist/lib/auto-mode/backend-kind.js.map +1 -0
  10. package/dist/lib/auto-mode/display.js +1 -1
  11. package/dist/lib/auto-mode/display.js.map +1 -1
  12. package/dist/lib/auto-mode/format.js +1 -1
  13. package/dist/lib/auto-mode/format.js.map +1 -1
  14. package/dist/lib/auto-mode/hooks/{index.js → registry.js} +1 -1
  15. package/dist/lib/auto-mode/hooks/registry.js.map +1 -0
  16. package/dist/lib/auto-mode/pod-ai.js +1 -14
  17. package/dist/lib/auto-mode/pod-ai.js.map +1 -1
  18. package/dist/lib/auto-mode/pod-approval-store.js +596 -0
  19. package/dist/lib/auto-mode/pod-approval-store.js.map +1 -0
  20. package/dist/lib/auto-mode/pod-approval.js +4 -607
  21. package/dist/lib/auto-mode/pod-approval.js.map +1 -1
  22. package/dist/lib/auto-mode/pod-persistence-builders.js +266 -0
  23. package/dist/lib/auto-mode/pod-persistence-builders.js.map +1 -0
  24. package/dist/lib/auto-mode/pod-persistence.js +1 -281
  25. package/dist/lib/auto-mode/pod-persistence.js.map +1 -1
  26. package/dist/lib/auto-mode/runner.js +41 -378
  27. package/dist/lib/auto-mode/runner.js.map +1 -1
  28. package/dist/lib/auto-mode/runtime.js +25 -0
  29. package/dist/lib/auto-mode/runtime.js.map +1 -0
  30. package/dist/lib/auto-mode/secretary-reaction-window.js +12 -0
  31. package/dist/lib/auto-mode/secretary-reaction-window.js.map +1 -0
  32. package/dist/lib/auto-mode/secretary-runtime-config.js +66 -0
  33. package/dist/lib/auto-mode/secretary-runtime-config.js.map +1 -0
  34. package/dist/lib/auto-mode/secretary.js +2 -64
  35. package/dist/lib/auto-mode/secretary.js.map +1 -1
  36. package/dist/lib/auto-mode/session-log.js +25 -0
  37. package/dist/lib/auto-mode/session-log.js.map +1 -0
  38. package/dist/lib/auto-mode/shell-command.js +172 -0
  39. package/dist/lib/auto-mode/shell-command.js.map +1 -0
  40. package/dist/lib/auto-mode-command.js +2 -1
  41. package/dist/lib/auto-mode-command.js.map +1 -1
  42. package/dist/lib/backend-command-router-contract.js +2 -0
  43. package/dist/lib/backend-command-router-contract.js.map +1 -0
  44. package/dist/lib/{pi-adapter/backend-credentials.js → backend-credentials.js} +8 -8
  45. package/dist/lib/backend-credentials.js.map +1 -0
  46. package/dist/lib/linx-ai-connect-command.js +201 -0
  47. package/dist/lib/linx-ai-connect-command.js.map +1 -0
  48. package/dist/lib/linx-assistant-message-rendering.js +33 -0
  49. package/dist/lib/linx-assistant-message-rendering.js.map +1 -0
  50. package/dist/lib/linx-auto-command-routing.js +53 -0
  51. package/dist/lib/linx-auto-command-routing.js.map +1 -0
  52. package/dist/lib/linx-auto-editor-indicator-host.js +15 -0
  53. package/dist/lib/linx-auto-editor-indicator-host.js.map +1 -0
  54. package/dist/lib/linx-auto-editor-indicator.js +56 -0
  55. package/dist/lib/linx-auto-editor-indicator.js.map +1 -0
  56. package/dist/lib/linx-auto-mode-cli-admission.js +16 -0
  57. package/dist/lib/linx-auto-mode-cli-admission.js.map +1 -0
  58. package/dist/lib/linx-backend-command-router.js +64 -0
  59. package/dist/lib/linx-backend-command-router.js.map +1 -0
  60. package/dist/lib/linx-backend-event-source.js +32 -0
  61. package/dist/lib/linx-backend-event-source.js.map +1 -0
  62. package/dist/lib/linx-chat-completion-projection.js +276 -0
  63. package/dist/lib/linx-chat-completion-projection.js.map +1 -0
  64. package/dist/lib/linx-cloud-errors.js +1 -0
  65. package/dist/lib/linx-cloud-errors.js.map +1 -1
  66. package/dist/lib/linx-cloud-models.js +75 -0
  67. package/dist/lib/linx-cloud-models.js.map +1 -0
  68. package/dist/lib/linx-cloud-runtime-auth.js +146 -0
  69. package/dist/lib/linx-cloud-runtime-auth.js.map +1 -0
  70. package/dist/lib/linx-cloud-runtime-coordinator.js +102 -0
  71. package/dist/lib/linx-cloud-runtime-coordinator.js.map +1 -0
  72. package/dist/lib/linx-codex-plugin-command.js +56 -0
  73. package/dist/lib/linx-codex-plugin-command.js.map +1 -0
  74. package/dist/lib/linx-command-autocomplete.js +123 -0
  75. package/dist/lib/linx-command-autocomplete.js.map +1 -0
  76. package/dist/lib/linx-completion-backend.js +2 -0
  77. package/dist/lib/linx-completion-backend.js.map +1 -0
  78. package/dist/lib/linx-config-command.js +12 -0
  79. package/dist/lib/linx-config-command.js.map +1 -0
  80. package/dist/lib/linx-editor-component-router.js +83 -0
  81. package/dist/lib/linx-editor-component-router.js.map +1 -0
  82. package/dist/lib/linx-extension-ui-context-router.js +43 -0
  83. package/dist/lib/linx-extension-ui-context-router.js.map +1 -0
  84. package/dist/lib/linx-external-open-host.js +8 -0
  85. package/dist/lib/linx-external-open-host.js.map +1 -0
  86. package/dist/lib/linx-external-url.js +16 -0
  87. package/dist/lib/linx-external-url.js.map +1 -0
  88. package/dist/lib/linx-footer-patch.js +52 -0
  89. package/dist/lib/linx-footer-patch.js.map +1 -0
  90. package/dist/lib/linx-input-command-routing.js +65 -0
  91. package/dist/lib/linx-input-command-routing.js.map +1 -0
  92. package/dist/lib/linx-interactive-auth-state-host.js +50 -0
  93. package/dist/lib/linx-interactive-auth-state-host.js.map +1 -0
  94. package/dist/lib/linx-interactive-autocomplete-host.js +32 -0
  95. package/dist/lib/linx-interactive-autocomplete-host.js.map +1 -0
  96. package/dist/lib/linx-interactive-bootstrap.js +66 -0
  97. package/dist/lib/linx-interactive-bootstrap.js.map +1 -0
  98. package/dist/lib/linx-interactive-branding.js +24 -0
  99. package/dist/lib/linx-interactive-branding.js.map +1 -0
  100. package/dist/lib/linx-interactive-chat-text-host.js +16 -0
  101. package/dist/lib/linx-interactive-chat-text-host.js.map +1 -0
  102. package/dist/lib/linx-interactive-command-routing-host.js +31 -0
  103. package/dist/lib/linx-interactive-command-routing-host.js.map +1 -0
  104. package/dist/lib/linx-interactive-command-routing.js +75 -0
  105. package/dist/lib/linx-interactive-command-routing.js.map +1 -0
  106. package/dist/lib/linx-interactive-command-surface.js +16 -0
  107. package/dist/lib/linx-interactive-command-surface.js.map +1 -0
  108. package/dist/lib/linx-interactive-editor-text-host.js +16 -0
  109. package/dist/lib/linx-interactive-editor-text-host.js.map +1 -0
  110. package/dist/lib/linx-interactive-error-display.js +8 -0
  111. package/dist/lib/linx-interactive-error-display.js.map +1 -0
  112. package/dist/lib/linx-interactive-event-router.js +91 -0
  113. package/dist/lib/linx-interactive-event-router.js.map +1 -0
  114. package/dist/lib/linx-interactive-extension-input-host.js +7 -0
  115. package/dist/lib/linx-interactive-extension-input-host.js.map +1 -0
  116. package/dist/lib/linx-interactive-extension-selector-host.js +12 -0
  117. package/dist/lib/linx-interactive-extension-selector-host.js.map +1 -0
  118. package/dist/lib/linx-interactive-header-host.js +14 -0
  119. package/dist/lib/linx-interactive-header-host.js.map +1 -0
  120. package/dist/lib/linx-interactive-lifecycle-host.js +4 -0
  121. package/dist/lib/linx-interactive-lifecycle-host.js.map +1 -0
  122. package/dist/lib/linx-interactive-login-ui-router.js +81 -0
  123. package/dist/lib/linx-interactive-login-ui-router.js.map +1 -0
  124. package/dist/lib/linx-interactive-model-registry-host.js +14 -0
  125. package/dist/lib/linx-interactive-model-registry-host.js.map +1 -0
  126. package/dist/lib/linx-interactive-post-init.js +60 -0
  127. package/dist/lib/linx-interactive-post-init.js.map +1 -0
  128. package/dist/lib/linx-interactive-provider-count-host.js +4 -0
  129. package/dist/lib/linx-interactive-provider-count-host.js.map +1 -0
  130. package/dist/lib/linx-interactive-run-router.js +43 -0
  131. package/dist/lib/linx-interactive-run-router.js.map +1 -0
  132. package/dist/lib/linx-interactive-runtime-host.js +113 -0
  133. package/dist/lib/linx-interactive-runtime-host.js.map +1 -0
  134. package/dist/lib/linx-interactive-selector-host.js +12 -0
  135. package/dist/lib/linx-interactive-selector-host.js.map +1 -0
  136. package/dist/lib/linx-interactive-shell-state.js +215 -0
  137. package/dist/lib/linx-interactive-shell-state.js.map +1 -0
  138. package/dist/lib/linx-interactive-status-display.js +9 -0
  139. package/dist/lib/linx-interactive-status-display.js.map +1 -0
  140. package/dist/lib/linx-interactive-stop-router.js +85 -0
  141. package/dist/lib/linx-interactive-stop-router.js.map +1 -0
  142. package/dist/lib/linx-interactive-streaming-message-host.js +11 -0
  143. package/dist/lib/linx-interactive-streaming-message-host.js.map +1 -0
  144. package/dist/lib/linx-interactive-submit-router.js +63 -0
  145. package/dist/lib/linx-interactive-submit-router.js.map +1 -0
  146. package/dist/lib/linx-interactive-update-router.js +78 -0
  147. package/dist/lib/linx-interactive-update-router.js.map +1 -0
  148. package/dist/lib/linx-interactive-update-state-host.js +43 -0
  149. package/dist/lib/linx-interactive-update-state-host.js.map +1 -0
  150. package/dist/lib/linx-interactive-warning-display.js +4 -0
  151. package/dist/lib/linx-interactive-warning-display.js.map +1 -0
  152. package/dist/lib/linx-interrupt-control-host.js +22 -0
  153. package/dist/lib/linx-interrupt-control-host.js.map +1 -0
  154. package/dist/lib/linx-interrupt-control.js +96 -0
  155. package/dist/lib/linx-interrupt-control.js.map +1 -0
  156. package/dist/lib/linx-login-flow.js +566 -0
  157. package/dist/lib/linx-login-flow.js.map +1 -0
  158. package/dist/lib/linx-models-command.js +71 -0
  159. package/dist/lib/linx-models-command.js.map +1 -0
  160. package/dist/lib/linx-package-command.js +117 -0
  161. package/dist/lib/linx-package-command.js.map +1 -0
  162. package/dist/lib/linx-peer-command-routing.js +20 -0
  163. package/dist/lib/linx-peer-command-routing.js.map +1 -0
  164. package/dist/lib/linx-pi-cli-command.js +121 -0
  165. package/dist/lib/linx-pi-cli-command.js.map +1 -0
  166. package/dist/lib/linx-pi-completion-events.js +101 -0
  167. package/dist/lib/linx-pi-completion-events.js.map +1 -0
  168. package/dist/lib/linx-pi-normalized-event-stream.js +41 -0
  169. package/dist/lib/linx-pi-normalized-event-stream.js.map +1 -0
  170. package/dist/lib/linx-pi-resume-cli-admission.js +21 -0
  171. package/dist/lib/linx-pi-resume-cli-admission.js.map +1 -0
  172. package/dist/lib/linx-pi-runtime-execution.js +67 -0
  173. package/dist/lib/linx-pi-runtime-execution.js.map +1 -0
  174. package/dist/lib/linx-pi-startup-control.js +49 -0
  175. package/dist/lib/linx-pi-startup-control.js.map +1 -0
  176. package/dist/lib/linx-pi-startup-plan.js +103 -0
  177. package/dist/lib/linx-pi-startup-plan.js.map +1 -0
  178. package/dist/lib/linx-pi-stream-errors.js +10 -0
  179. package/dist/lib/linx-pi-stream-errors.js.map +1 -0
  180. package/dist/lib/linx-pod-backed-extension-ui.js +29 -0
  181. package/dist/lib/linx-pod-backed-extension-ui.js.map +1 -0
  182. package/dist/lib/linx-pod-data-session-factory.js +19 -0
  183. package/dist/lib/linx-pod-data-session-factory.js.map +1 -0
  184. package/dist/lib/linx-pod-mirror-runtime-host.js +50 -0
  185. package/dist/lib/linx-pod-mirror-runtime-host.js.map +1 -0
  186. package/dist/lib/linx-pod-mirror-sync-cli-admission.js +18 -0
  187. package/dist/lib/linx-pod-mirror-sync-cli-admission.js.map +1 -0
  188. package/dist/lib/linx-pod-mirror-sync-command.js +30 -0
  189. package/dist/lib/linx-pod-mirror-sync-command.js.map +1 -0
  190. package/dist/lib/{pi-adapter/sync-recovery.js → linx-pod-mirror-sync-recovery.js} +13 -13
  191. package/dist/lib/linx-pod-mirror-sync-recovery.js.map +1 -0
  192. package/dist/lib/{pi-adapter/pod-mirror.js → linx-pod-mirror.js} +63 -40
  193. package/dist/lib/linx-pod-mirror.js.map +1 -0
  194. package/dist/lib/linx-restored-auto-startup.js +21 -0
  195. package/dist/lib/linx-restored-auto-startup.js.map +1 -0
  196. package/dist/lib/linx-resume-output.js +209 -0
  197. package/dist/lib/linx-resume-output.js.map +1 -0
  198. package/dist/lib/linx-retired-command.js +22 -0
  199. package/dist/lib/linx-retired-command.js.map +1 -0
  200. package/dist/lib/linx-rewind-command.js +209 -0
  201. package/dist/lib/linx-rewind-command.js.map +1 -0
  202. package/dist/lib/linx-runtime-adapter-contract.js +2 -0
  203. package/dist/lib/linx-runtime-adapter-contract.js.map +1 -0
  204. package/dist/lib/linx-runtime-adapter-defaults.js +17 -0
  205. package/dist/lib/linx-runtime-adapter-defaults.js.map +1 -0
  206. package/dist/lib/linx-runtime-adapter-dependencies.js +2 -0
  207. package/dist/lib/linx-runtime-adapter-dependencies.js.map +1 -0
  208. package/dist/lib/linx-runtime-agent-session.js +130 -0
  209. package/dist/lib/linx-runtime-agent-session.js.map +1 -0
  210. package/dist/lib/linx-runtime-auth.js +5 -0
  211. package/dist/lib/linx-runtime-auth.js.map +1 -0
  212. package/dist/lib/linx-runtime-backend-composition.js +73 -0
  213. package/dist/lib/linx-runtime-backend-composition.js.map +1 -0
  214. package/dist/lib/linx-runtime-coding-tools.js +58 -0
  215. package/dist/lib/linx-runtime-coding-tools.js.map +1 -0
  216. package/dist/lib/linx-runtime-completion-backend.js +27 -0
  217. package/dist/lib/linx-runtime-completion-backend.js.map +1 -0
  218. package/dist/lib/linx-runtime-oauth-provider.js +57 -0
  219. package/dist/lib/linx-runtime-oauth-provider.js.map +1 -0
  220. package/dist/lib/linx-runtime-provider-registration.js +33 -0
  221. package/dist/lib/linx-runtime-provider-registration.js.map +1 -0
  222. package/dist/lib/linx-runtime-resources.js +167 -0
  223. package/dist/lib/linx-runtime-resources.js.map +1 -0
  224. package/dist/lib/linx-runtime-system-prompt.js +27 -0
  225. package/dist/lib/linx-runtime-system-prompt.js.map +1 -0
  226. package/dist/lib/linx-runtime-thinking.js +21 -0
  227. package/dist/lib/linx-runtime-thinking.js.map +1 -0
  228. package/dist/lib/linx-selector-choice.js +38 -0
  229. package/dist/lib/linx-selector-choice.js.map +1 -0
  230. package/dist/lib/linx-self-update.js +113 -0
  231. package/dist/lib/linx-self-update.js.map +1 -0
  232. package/dist/lib/linx-session-command-routing-host.js +24 -0
  233. package/dist/lib/linx-session-command-routing-host.js.map +1 -0
  234. package/dist/lib/linx-session-command-routing.js +68 -0
  235. package/dist/lib/linx-session-command-routing.js.map +1 -0
  236. package/dist/lib/linx-session-cwd-router.js +15 -0
  237. package/dist/lib/linx-session-cwd-router.js.map +1 -0
  238. package/dist/lib/linx-session-history.js +388 -0
  239. package/dist/lib/linx-session-history.js.map +1 -0
  240. package/dist/lib/{pi-adapter/session.js → linx-session-manager.js} +94 -46
  241. package/dist/lib/linx-session-manager.js.map +1 -0
  242. package/dist/lib/linx-session-metadata.js +55 -0
  243. package/dist/lib/linx-session-metadata.js.map +1 -0
  244. package/dist/lib/linx-session-selector-ui.js +32 -0
  245. package/dist/lib/linx-session-selector-ui.js.map +1 -0
  246. package/dist/lib/linx-session-thinking-capability-router.js +55 -0
  247. package/dist/lib/linx-session-thinking-capability-router.js.map +1 -0
  248. package/dist/lib/linx-session-work-control.js +163 -0
  249. package/dist/lib/linx-session-work-control.js.map +1 -0
  250. package/dist/lib/linx-shell-command-executor.js +41 -0
  251. package/dist/lib/linx-shell-command-executor.js.map +1 -0
  252. package/dist/lib/linx-shell-command-router.js +151 -0
  253. package/dist/lib/linx-shell-command-router.js.map +1 -0
  254. package/dist/lib/{pi-adapter/control-state.js → linx-startup-control-state.js} +6 -6
  255. package/dist/lib/linx-startup-control-state.js.map +1 -0
  256. package/dist/lib/linx-startup-login-policy.js +48 -0
  257. package/dist/lib/linx-startup-login-policy.js.map +1 -0
  258. package/dist/lib/linx-status-line-command.js +382 -0
  259. package/dist/lib/linx-status-line-command.js.map +1 -0
  260. package/dist/lib/{status-line-command.js → linx-status-line-config-command.js} +2 -12
  261. package/dist/lib/linx-status-line-config-command.js.map +1 -0
  262. package/dist/lib/linx-status-line.js +12 -4
  263. package/dist/lib/linx-status-line.js.map +1 -1
  264. package/dist/lib/linx-stream-abort.js +12 -0
  265. package/dist/lib/linx-stream-abort.js.map +1 -0
  266. package/dist/lib/linx-stream-error-formatting.js +54 -0
  267. package/dist/lib/linx-stream-error-formatting.js.map +1 -0
  268. package/dist/lib/linx-submitted-user-message-recording.js +16 -0
  269. package/dist/lib/linx-submitted-user-message-recording.js.map +1 -0
  270. package/dist/lib/linx-symphony-interactive-command.js +493 -0
  271. package/dist/lib/linx-symphony-interactive-command.js.map +1 -0
  272. package/dist/lib/linx-terminal-title-router.js +49 -0
  273. package/dist/lib/linx-terminal-title-router.js.map +1 -0
  274. package/dist/lib/{pi-adapter/theme.js → linx-theme.js} +2 -2
  275. package/dist/lib/linx-theme.js.map +1 -0
  276. package/dist/lib/linx-top-level-command-admission.js +27 -0
  277. package/dist/lib/linx-top-level-command-admission.js.map +1 -0
  278. package/dist/lib/linx-update-notification.js +176 -0
  279. package/dist/lib/linx-update-notification.js.map +1 -0
  280. package/dist/lib/linx-welcome-header.js +148 -0
  281. package/dist/lib/linx-welcome-header.js.map +1 -0
  282. package/dist/lib/linx-workspace-command.js +45 -0
  283. package/dist/lib/linx-workspace-command.js.map +1 -0
  284. package/dist/lib/native-backend-command-router.js +25 -0
  285. package/dist/lib/native-backend-command-router.js.map +1 -0
  286. package/dist/lib/native-backend-proxy.js +2 -0
  287. package/dist/lib/native-backend-proxy.js.map +1 -0
  288. package/dist/lib/native-backend-stream-backend.js +15 -0
  289. package/dist/lib/native-backend-stream-backend.js.map +1 -0
  290. package/dist/lib/oidc-auth.js +2 -4
  291. package/dist/lib/oidc-auth.js.map +1 -1
  292. package/dist/lib/pi-adapter/runtime.js +32 -841
  293. package/dist/lib/pi-adapter/runtime.js.map +1 -1
  294. package/dist/lib/pi-adapter/stream.js +17 -516
  295. package/dist/lib/pi-adapter/stream.js.map +1 -1
  296. package/dist/lib/{pi-adapter/pod-approval.js → pod-backed-extension-ui-context.js} +2 -2
  297. package/dist/lib/pod-backed-extension-ui-context.js.map +1 -0
  298. package/dist/lib/pod-chat-store-runtime.js +38 -0
  299. package/dist/lib/pod-chat-store-runtime.js.map +1 -0
  300. package/dist/lib/pod-chat-store.js +15 -65
  301. package/dist/lib/pod-chat-store.js.map +1 -1
  302. package/dist/lib/{pi-adapter/pod-mirror-mapping.js → pod-mirror-mapping.js} +8 -18
  303. package/dist/lib/pod-mirror-mapping.js.map +1 -0
  304. package/dist/lib/{pi-adapter/pod-native.js → pod-native.js} +1 -1
  305. package/dist/lib/pod-native.js.map +1 -0
  306. package/dist/lib/pod-status-output.js.map +1 -0
  307. package/dist/lib/{pi-adapter/auto-input-controller.js → secretary-auto-input-controller.js} +62 -77
  308. package/dist/lib/secretary-auto-input-controller.js.map +1 -0
  309. package/dist/lib/{pi-adapter/session-control.js → session-control.js} +80 -29
  310. package/dist/lib/session-control.js.map +1 -0
  311. package/dist/lib/shell-lifecycle.js +179 -0
  312. package/dist/lib/shell-lifecycle.js.map +1 -0
  313. package/dist/lib/solid-local-store.js +3 -3
  314. package/dist/lib/solid-local-store.js.map +1 -1
  315. package/dist/lib/symphony/pod-projection.js +1 -31
  316. package/dist/lib/symphony/pod-projection.js.map +1 -1
  317. package/dist/lib/{symphony-command.js → symphony/run.js} +11 -16
  318. package/dist/lib/symphony/run.js.map +1 -0
  319. package/dist/lib/symphony/runtime.js +30 -0
  320. package/dist/lib/symphony/runtime.js.map +1 -0
  321. package/dist/lib/symphony/status.js +242 -0
  322. package/dist/lib/symphony/status.js.map +1 -0
  323. package/dist/linx-cli-app.js +70 -0
  324. package/dist/linx-cli-app.js.map +1 -0
  325. package/dist/linx-cli-runtime-adapter-factory.js +12 -0
  326. package/dist/linx-cli-runtime-adapter-factory.js.map +1 -0
  327. package/dist/plugins/linx-symphony-codex/.codex-plugin/plugin.json +1 -1
  328. package/package.json +1 -1
  329. package/dist/lib/auto-mode/hooks/index.js.map +0 -1
  330. package/dist/lib/auto-mode/index.js +0 -10
  331. package/dist/lib/auto-mode/index.js.map +0 -1
  332. package/dist/lib/codex-plugin/index.js +0 -5
  333. package/dist/lib/codex-plugin/index.js.map +0 -1
  334. package/dist/lib/pi-adapter/auth.js +0 -68
  335. package/dist/lib/pi-adapter/auth.js.map +0 -1
  336. package/dist/lib/pi-adapter/auto-input-controller.js.map +0 -1
  337. package/dist/lib/pi-adapter/backend-command.js +0 -2
  338. package/dist/lib/pi-adapter/backend-command.js.map +0 -1
  339. package/dist/lib/pi-adapter/backend-credentials.js.map +0 -1
  340. package/dist/lib/pi-adapter/branding.js +0 -1188
  341. package/dist/lib/pi-adapter/branding.js.map +0 -1
  342. package/dist/lib/pi-adapter/control-state.js.map +0 -1
  343. package/dist/lib/pi-adapter/index.js +0 -4
  344. package/dist/lib/pi-adapter/index.js.map +0 -1
  345. package/dist/lib/pi-adapter/interactive.js +0 -3186
  346. package/dist/lib/pi-adapter/interactive.js.map +0 -1
  347. package/dist/lib/pi-adapter/pod-approval.js.map +0 -1
  348. package/dist/lib/pi-adapter/pod-mirror-mapping.js.map +0 -1
  349. package/dist/lib/pi-adapter/pod-mirror.js.map +0 -1
  350. package/dist/lib/pi-adapter/pod-native.js.map +0 -1
  351. package/dist/lib/pi-adapter/pod-status-output.js.map +0 -1
  352. package/dist/lib/pi-adapter/pod-tools.js +0 -140
  353. package/dist/lib/pi-adapter/pod-tools.js.map +0 -1
  354. package/dist/lib/pi-adapter/session-control.js.map +0 -1
  355. package/dist/lib/pi-adapter/session.js.map +0 -1
  356. package/dist/lib/pi-adapter/sync-recovery.js.map +0 -1
  357. package/dist/lib/pi-adapter/theme.js.map +0 -1
  358. package/dist/lib/pi-adapter/web-fetch.js +0 -170
  359. package/dist/lib/pi-adapter/web-fetch.js.map +0 -1
  360. package/dist/lib/status-line-command.js.map +0 -1
  361. package/dist/lib/symphony-command.js.map +0 -1
  362. /package/dist/lib/{pi-adapter/pod-status-output.js → pod-status-output.js} +0 -0
package/dist/index.js CHANGED
@@ -1,835 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import './lib/node-warning-filter.js';
3
- import { readFileSync } from 'node:fs';
4
- import { join } from 'node:path';
5
- import yargs from 'yargs';
6
- import { hideBin } from 'yargs/helpers';
7
- import { aiCommand } from './lib/ai-command.js';
8
- import { resolveAccountBaseUrl } from './lib/account-api.js';
9
- import { loadCredentials } from './lib/credentials-store.js';
10
- import { loginCommand, logoutCommand, whoamiCommand } from './lib/login-command.js';
11
- import { configCommand } from './lib/status-line-command.js';
12
- import { DefaultPackageManager, SettingsManager, SessionSelectorComponent, initTheme, runPrintMode } from '@earendil-works/pi-coding-agent';
13
- import { ProcessTerminal, TUI } from '@earendil-works/pi-tui';
14
- import { promptText } from './lib/prompt.js';
15
- import { buildAutoModeOptions, isAutoModeRequest, runAutoModeCommand, } from './lib/auto-mode-command.js';
16
- import { resolveRuntimeTarget } from './lib/runtime-target.js';
17
- import { createCodexNativeProxy, createSymphonyCodexMcpServer } from './lib/codex-plugin/index.js';
18
- import { bootstrapLinxInteractiveMode, createLinxRuntimeAdapter, resolveLinxInteractiveLoginReason, resolveLinxStartupLoginPromptDecision, } from './lib/pi-adapter/index.js';
19
- import { clearDefaultPodDataSession, createPodDataSession, getDefaultPodDataSession } from './lib/pod-data-session.js';
20
- import { DEFAULT_LINX_CLOUD_MODEL_ID, FALLBACK_LINX_CLOUD_MODEL_IDS } from './lib/default-model.js';
21
- import { createLinxPiSessionManager, listLinxPiSessions, } from './lib/pi-adapter/session.js';
22
- import { LinxPiPodMirror } from './lib/pi-adapter/pod-mirror.js';
23
- import { listPendingPiPodMirrorSync, retryPendingPiPodMirrorSync } from './lib/pi-adapter/sync-recovery.js';
24
- import { LINX_AGENT_DIR } from './lib/pi-adapter/branding.js';
25
- import { createFileSyncCheckpointStore } from './lib/sync-checkpoint-store.js';
26
- import { deriveLinxPiStartupControlState, hydrateLinxPiControlState } from './lib/pi-adapter/control-state.js';
27
- import { drizzle, solidResources } from './lib/models.js';
28
- import { formatLinxCliErrorMessage } from './lib/linx-cloud-errors.js';
29
- function readPackageVersion() {
30
- try {
31
- const raw = readFileSync(new URL('../package.json', import.meta.url), 'utf-8');
32
- const pkg = JSON.parse(raw);
33
- return typeof pkg.version === 'string' && pkg.version.trim() ? pkg.version.trim() : 'unknown';
34
- }
35
- catch {
36
- return 'unknown';
37
- }
38
- }
39
- function formatRemoteModelMetadata(model) {
40
- const provider = resolveRemoteModelProviderLabel(model);
41
- return [provider, model.contextWindow ? `${model.contextWindow}` : '']
42
- .filter(Boolean)
43
- .join(' · ');
44
- }
45
- function resolveRemoteModelProviderLabel(model) {
46
- if (FALLBACK_LINX_CLOUD_MODEL_IDS.includes(model.id)) {
47
- return 'undefineds';
48
- }
49
- return model.provider || model.ownedBy;
50
- }
51
- let chatRuntimePromise = null;
52
- const RESERVED_NON_TOP_LEVEL_COMMANDS = new Set([
53
- 'automode',
54
- 'footer',
55
- 'resume',
56
- 'status-line',
57
- 'statusline',
58
- 'watch',
59
- ]);
60
- async function loadChatRuntime() {
61
- if (!chatRuntimePromise) {
62
- chatRuntimePromise = Promise.all([
63
- import('./lib/chat-api.js'),
64
- import('./lib/pod-chat-store.js'),
65
- import('./lib/solid-auth.js'),
66
- ]).then(([chatApi, podChatStore, solidAuth]) => ({
67
- createRemoteCompletion: chatApi.createRemoteCompletion,
68
- listRemoteModels: chatApi.listRemoteModels,
69
- createThread: podChatStore.createThread,
70
- formatThreadLabel: podChatStore.formatThreadLabel,
71
- getLatestThreadId: podChatStore.getLatestThreadId,
72
- getOrCreateDefaultChat: podChatStore.getOrCreateDefaultChat,
73
- initPodData: podChatStore.initPodData,
74
- listThreads: podChatStore.listThreads,
75
- loadMessages: podChatStore.loadMessages,
76
- loadThread: podChatStore.loadThread,
77
- saveAssistantMessage: podChatStore.saveAssistantMessage,
78
- saveUserMessage: podChatStore.saveUserMessage,
79
- toOpenAiMessages: podChatStore.toOpenAiMessages,
80
- authenticate: solidAuth.authenticate,
81
- authenticatedFetch: solidAuth.authenticatedFetch,
82
- }));
83
- }
84
- return chatRuntimePromise;
85
- }
86
- async function resolveContext(urlOverride) {
87
- const runtime = await loadChatRuntime();
88
- const podSession = await createLinxPodDataSession();
89
- const target = resolveRuntimeTarget({
90
- issuerUrl: podSession.credentials.url,
91
- runtimeUrlOverride: urlOverride,
92
- });
93
- const session = podSession.solidSession;
94
- await runtime.initPodData(session);
95
- const chatId = await runtime.getOrCreateDefaultChat(session);
96
- return { runtimeUrl: target.runtimeUrl, authFetch: podSession.runtimeFetch, session, podSession, chatId, runtime };
97
- }
98
- async function resolveRuntimeAuthContext(urlOverride) {
99
- const runtime = await loadChatRuntime();
100
- const podSession = await createLinxPodDataSession();
101
- const target = resolveRuntimeTarget({
102
- issuerUrl: podSession.credentials.url,
103
- runtimeUrlOverride: urlOverride,
104
- });
105
- return {
106
- runtimeUrl: target.runtimeUrl,
107
- authFetch: podSession.runtimeFetch,
108
- session: podSession.solidSession,
109
- podSession,
110
- runtime,
111
- };
112
- }
113
- async function createLinxPodDataSession() {
114
- if (!loadCredentials()) {
115
- throw new Error('No credentials found. Run `linx login` first.');
116
- }
117
- const podSession = await createPodDataSession();
118
- if (!podSession) {
119
- throw new Error('Unsupported LinX auth type. Run `linx login` again.');
120
- }
121
- return podSession;
122
- }
123
- async function resolveStartupLinxPodDataSession() {
124
- if (!loadCredentials()) {
125
- return null;
126
- }
127
- return createLinxPodDataSession();
128
- }
129
- async function runSingleTurn(options) {
130
- const { ctx, threadId, model, prompt } = options;
131
- const history = await tryLoadMessages(ctx, threadId);
132
- const reply = await ctx.runtime.createRemoteCompletion({
133
- runtimeUrl: ctx.runtimeUrl,
134
- authFetch: ctx.authFetch,
135
- model,
136
- messages: [...ctx.runtime.toOpenAiMessages(history), { role: 'user', content: prompt }],
137
- });
138
- const replyText = typeof reply === 'string' ? reply : reply.content ?? '';
139
- process.stdout.write(`\n${replyText}\n\n`);
140
- await persistSingleTurnBestEffort(ctx, threadId, prompt, replyText);
141
- }
142
- async function tryLoadMessages(ctx, threadId) {
143
- try {
144
- return await ctx.runtime.loadMessages(ctx.session, threadId);
145
- }
146
- catch (error) {
147
- process.stderr.write(`Warning: failed to load Pod chat history; continuing without history: ${formatLinxCliErrorMessage(error)}\n`);
148
- return [];
149
- }
150
- }
151
- async function persistSingleTurnBestEffort(ctx, threadId, prompt, replyText) {
152
- try {
153
- await ctx.runtime.saveUserMessage(ctx.session, ctx.chatId, threadId, prompt);
154
- await ctx.runtime.saveAssistantMessage(ctx.session, ctx.chatId, threadId, replyText);
155
- }
156
- catch (error) {
157
- process.stderr.write(`Warning: failed to persist Pod chat turn: ${formatLinxCliErrorMessage(error)}\n`);
158
- }
159
- }
160
- async function resolveThreadId(options) {
161
- const { ctx, continueMode, explicitThreadId, workspace, bestEffort } = options;
162
- if (explicitThreadId) {
163
- return explicitThreadId;
164
- }
165
- if (continueMode) {
166
- const latest = bestEffort
167
- ? await tryGetLatestThreadId(ctx)
168
- : await ctx.runtime.getLatestThreadId(ctx.session, ctx.chatId);
169
- if (latest) {
170
- return latest;
171
- }
172
- }
173
- if (!bestEffort) {
174
- return ctx.runtime.createThread(ctx.session, ctx.chatId, workspace || process.cwd(), 'CLI Session');
175
- }
176
- try {
177
- return await ctx.runtime.createThread(ctx.session, ctx.chatId, workspace || process.cwd(), 'CLI Session');
178
- }
179
- catch (error) {
180
- const fallbackThreadId = `local-${Date.now().toString(36)}`;
181
- process.stderr.write(`Warning: failed to create Pod chat thread; using temporary thread ${fallbackThreadId}: ${formatLinxCliErrorMessage(error)}\n`);
182
- return fallbackThreadId;
183
- }
184
- }
185
- async function tryGetLatestThreadId(ctx) {
186
- try {
187
- return await ctx.runtime.getLatestThreadId(ctx.session, ctx.chatId);
188
- }
189
- catch (error) {
190
- process.stderr.write(`Warning: failed to load latest Pod chat thread: ${formatLinxCliErrorMessage(error)}\n`);
191
- return null;
192
- }
193
- }
194
- async function runInteractive(options) {
195
- const { ctx, initialThreadId, initialModel, initialPrompt } = options;
196
- let threadId = initialThreadId;
197
- let model = initialModel;
198
- process.stdout.write(`LinX CLI ready\nthread: ${threadId}\nmodel: ${model || DEFAULT_LINX_CLOUD_MODEL_ID}\n输入 /hotkeys 查看快捷键。\n\n`);
199
- if (initialPrompt) {
200
- await runSingleTurn({ ctx, threadId, model, prompt: initialPrompt });
201
- }
202
- while (true) {
203
- const input = (await promptText('you> ')).trim();
204
- if (!input)
205
- continue;
206
- if (input === '/exit' || input === '/quit') {
207
- break;
208
- }
209
- if (input === '/help') {
210
- process.stdout.write('/hotkeys 查看快捷键\n/threads 列出 threads\n/new 新建 thread\n/use <threadId> 切换 thread\n/model <modelId> 切换模型\n/exit 退出\n\n');
211
- continue;
212
- }
213
- if (input === '/threads') {
214
- const threads = await ctx.runtime.listThreads(ctx.session, ctx.chatId);
215
- if (threads.length === 0) {
216
- process.stdout.write('暂无 threads\n\n');
217
- continue;
218
- }
219
- process.stdout.write(`${threads.map((thread) => `- ${ctx.runtime.formatThreadLabel(thread)}`).join('\n')}\n\n`);
220
- continue;
221
- }
222
- if (input === '/new') {
223
- threadId = await ctx.runtime.createThread(ctx.session, ctx.chatId, process.cwd(), 'CLI Session');
224
- process.stdout.write(`已创建 thread: ${threadId}\n\n`);
225
- continue;
226
- }
227
- if (input.startsWith('/use ')) {
228
- const nextThreadId = input.slice(5).trim();
229
- const thread = await ctx.runtime.loadThread(ctx.session, nextThreadId);
230
- if (!thread) {
231
- process.stdout.write(`未找到 thread: ${nextThreadId}\n\n`);
232
- continue;
233
- }
234
- threadId = nextThreadId;
235
- process.stdout.write(`已切换到 thread: ${threadId}\n\n`);
236
- continue;
237
- }
238
- if (input.startsWith('/model ')) {
239
- model = input.slice(7).trim() || undefined;
240
- process.stdout.write(`当前模型: ${model || DEFAULT_LINX_CLOUD_MODEL_ID}\n\n`);
241
- continue;
242
- }
243
- await runSingleTurn({ ctx, threadId, model, prompt: input });
244
- }
245
- }
246
- async function runLinxPackageCommand(command, options = {}) {
247
- if ((command === 'install' || command === 'remove') && !options.source) {
248
- throw new Error(`Missing ${command} source. Usage: linx ${command} <source> [-l]`);
249
- }
250
- const cwd = process.cwd();
251
- const settingsManager = SettingsManager.create(cwd, LINX_AGENT_DIR);
252
- const packageManager = new DefaultPackageManager({
253
- cwd,
254
- agentDir: LINX_AGENT_DIR,
255
- settingsManager,
256
- });
257
- packageManager.setProgressCallback((event) => {
258
- if (event.type === 'start' && event.message) {
259
- process.stdout.write(`${event.message}\n`);
260
- }
261
- });
262
- switch (command) {
263
- case 'install':
264
- await packageManager.installAndPersist(options.source, { local: Boolean(options.local) });
265
- process.stdout.write(`Installed ${options.source}\n`);
266
- return;
267
- case 'remove': {
268
- const removed = await packageManager.removeAndPersist(options.source, { local: Boolean(options.local) });
269
- if (!removed) {
270
- throw new Error(`No matching package found for ${options.source}`);
271
- }
272
- process.stdout.write(`Removed ${options.source}\n`);
273
- return;
274
- }
275
- case 'update':
276
- await packageManager.update(options.source);
277
- process.stdout.write(options.source ? `Updated ${options.source}\n` : 'Updated packages\n');
278
- return;
279
- case 'list':
280
- printConfiguredLinxPackages(packageManager);
281
- return;
282
- }
283
- }
284
- function printConfiguredLinxPackages(packageManager) {
285
- const configuredPackages = packageManager.listConfiguredPackages();
286
- if (configuredPackages.length === 0) {
287
- process.stdout.write('No packages installed.\n');
288
- return;
289
- }
290
- const printGroup = (title, packages) => {
291
- if (packages.length === 0) {
292
- return;
293
- }
294
- process.stdout.write(`${title}:\n`);
295
- for (const pkg of packages) {
296
- const display = pkg.filtered ? `${pkg.source} (filtered)` : pkg.source;
297
- process.stdout.write(` ${display}\n`);
298
- if (pkg.installedPath) {
299
- process.stdout.write(` ${pkg.installedPath}\n`);
300
- }
301
- }
302
- };
303
- printGroup('User packages', configuredPackages.filter((pkg) => pkg.scope === 'user'));
304
- printGroup('Project packages', configuredPackages.filter((pkg) => pkg.scope === 'project'));
305
- }
306
- async function runPiCommand(argv) {
307
- const firstPromptToken = Array.isArray(argv.prompt) ? argv.prompt[0] : undefined;
308
- // Reject command-shaped aliases that should not fall through to the default TUI prompt.
309
- if (firstPromptToken && RESERVED_NON_TOP_LEVEL_COMMANDS.has(firstPromptToken)) {
310
- throw new Error(`Unknown command: ${firstPromptToken}`);
311
- }
312
- if (argv.resume) {
313
- const selectedSession = await selectLinxSession(cwdFromArg(argv.cwd));
314
- if (!selectedSession) {
315
- process.stdout.write('No session selected\n');
316
- return;
317
- }
318
- await runPiCommand({
319
- ...argv,
320
- resume: false,
321
- session: selectedSession,
322
- });
323
- return;
324
- }
325
- if (isAutoModeRequest(argv)) {
326
- await runAutoModeCommand(argv);
327
- return;
328
- }
329
- if (argv['pi-sync-status']) {
330
- await runPiSyncStatusCommand();
331
- return;
332
- }
333
- if (argv['pi-sync-retry']) {
334
- await runPiSyncRetryCommand({
335
- cwd: argv.cwd || process.cwd(),
336
- sessionId: argv['pi-sync-retry'],
337
- });
338
- return;
339
- }
340
- if (argv.backend) {
341
- await runAutoModeCommand({
342
- ...argv,
343
- plain: Boolean(argv.plain || argv.print),
344
- });
345
- return;
346
- }
347
- const cwd = argv.cwd || process.cwd();
348
- const startupLoginPrompt = await resolveLinxStartupLoginPromptDecision({
349
- backend: 'cloud',
350
- print: argv.print,
351
- issuerUrl: resolveAccountBaseUrl(),
352
- resolveSession: resolveStartupLinxPodDataSession,
353
- });
354
- const sessionManager = await createLinxPiSessionManager({
355
- cwd,
356
- agentDir: LINX_AGENT_DIR,
357
- session: argv.session,
358
- last: Boolean(argv.continue || argv.last),
359
- });
360
- const restoreAutoFromHydration = Boolean(argv.session || argv.continue || argv.last);
361
- const controlState = await resolvePiStartupControlState({
362
- requestedAuto: typeof argv.auto === 'boolean' ? argv.auto : undefined,
363
- hydrateFromPod: !argv.print && !startupLoginPrompt.shouldPrompt,
364
- restoreAutoFromHydration,
365
- sessionManager,
366
- });
367
- const autoEnabled = controlState.autoEnabled;
368
- const symphonyEnabled = controlState.symphonyEnabled;
369
- const adapter = createLinxRuntimeAdapter({
370
- async createRemoteCompletion(options) {
371
- const chatApi = await import('./lib/chat-api.js');
372
- return chatApi.createRemoteCompletionResult(options);
373
- },
374
- async listRemoteModels(authFetch, runtimeUrl, options) {
375
- const chatApi = await import('./lib/chat-api.js');
376
- return chatApi.listRemoteModels(authFetch, runtimeUrl, options ?? { fallback: false, timeoutMs: 5000 });
377
- },
378
- }, {
379
- cwd,
380
- model: argv.model,
381
- backend: 'cloud',
382
- autoEnabled,
383
- symphonyEnabled,
384
- getPodDataSession: getDefaultPodDataSession,
385
- port: argv.port,
386
- providerConfig: {
387
- baseUrl: String(argv['runtime-url'] ?? 'https://api.undefineds.co/v1'),
388
- issuerUrl: resolveAccountBaseUrl(),
389
- },
390
- });
391
- await adapter.start();
392
- const runtime = await adapter.createRuntime({
393
- cwd: adapter.cwd,
394
- agentDir: LINX_AGENT_DIR,
395
- sessionManager,
396
- });
397
- const prompt = (argv.prompt ?? []).join(' ').trim();
398
- try {
399
- if (argv.print) {
400
- const exitCode = await runPrintMode(runtime, {
401
- mode: 'text',
402
- initialMessage: prompt || undefined,
403
- });
404
- if (exitCode !== 0) {
405
- process.exitCode = exitCode;
406
- }
407
- return;
408
- }
409
- const podMirror = new LinxPiPodMirror({
410
- cwd: adapter.cwd,
411
- sessionManager,
412
- autoEnabled,
413
- symphonyEnabled,
414
- checkpointStore: createFileSyncCheckpointStore({
415
- dir: join(LINX_AGENT_DIR, 'sync', 'pi-pod-mirror', sessionManager.getSessionId()),
416
- }),
417
- onError(error) {
418
- if (process.env.LINX_DEBUG === '1') {
419
- const message = error instanceof Error ? error.stack || error.message : String(error);
420
- process.stderr.write(`[linx pod mirror] ${message}\n`);
421
- }
422
- },
423
- });
424
- runtime.__linxPodMirror = podMirror;
425
- const unsubscribePodMirror = runtime.session.subscribe((event) => {
426
- podMirror.handleEvent(event);
427
- });
428
- const interactive = bootstrapLinxInteractiveMode(runtime, {
429
- initialMessage: prompt || undefined,
430
- restoredAuto: autoEnabled && restoreAutoFromHydration,
431
- onAutoControlChange(enabled) {
432
- void podMirror.syncAutoControlState(enabled);
433
- },
434
- onSymphonyControlChange(enabled) {
435
- void podMirror.syncSymphonyControlState(enabled);
436
- },
437
- });
438
- const bridge = runtime;
439
- const loginPromptReason = resolveLinxInteractiveLoginReason({
440
- startupDecision: startupLoginPrompt,
441
- runtimePromptOnStart: bridge.linxAuthBridge?.shouldPromptLoginOnStart,
442
- });
443
- if (loginPromptReason) {
444
- interactive.requestLogin?.(loginPromptReason);
445
- }
446
- try {
447
- await interactive.run();
448
- }
449
- finally {
450
- unsubscribePodMirror();
451
- await podMirror.close().catch(() => undefined);
452
- interactive.stop();
453
- }
454
- }
455
- finally {
456
- await adapter.close();
457
- clearDefaultPodDataSession();
458
- }
459
- }
460
- async function resolvePiStartupControlState(options) {
461
- if (!options.hydrateFromPod) {
462
- return {
463
- autoEnabled: options.requestedAuto === true,
464
- symphonyEnabled: false,
465
- };
466
- }
467
- const session = await createLinxPodDataSession().catch(() => null);
468
- if (!session) {
469
- return {
470
- autoEnabled: options.requestedAuto === true,
471
- symphonyEnabled: false,
472
- };
473
- }
474
- try {
475
- const db = drizzle(session.solidSession, {
476
- logger: false,
477
- disableInteropDiscovery: true,
478
- podUrl: session.podUrl,
479
- resourcePreparation: 'off',
480
- schema: solidResources,
481
- });
482
- const hydration = await hydrateLinxPiControlState({
483
- db,
484
- sessionId: options.sessionManager.getSessionId(),
485
- createdAt: getPiSessionCreatedAt(options.sessionManager),
486
- onError(error) {
487
- if (process.env.LINX_DEBUG === '1') {
488
- const message = error instanceof Error ? error.stack || error.message : String(error);
489
- process.stderr.write(`[linx control state] ${message}\n`);
490
- }
491
- },
492
- });
493
- return {
494
- ...deriveLinxPiStartupControlState({
495
- requestedAuto: options.requestedAuto,
496
- hydration,
497
- restoreAutoFromHydration: options.restoreAutoFromHydration,
498
- }),
499
- };
500
- }
501
- finally {
502
- await session.close().catch(() => undefined);
503
- }
504
- }
505
- function getPiSessionCreatedAt(sessionManager) {
506
- const entryDate = sessionManager.getEntries()
507
- .map((entry) => toDate(entry.timestamp))
508
- .find((date) => date instanceof Date);
509
- return entryDate ?? parseTimestampFromUuidLikeId(sessionManager.getSessionId()) ?? new Date();
510
- }
511
- function parseTimestampFromUuidLikeId(id) {
512
- const prefix = id.replace(/-/g, '').slice(0, 12);
513
- if (!/^[\da-f]{12}$/i.test(prefix)) {
514
- return null;
515
- }
516
- const millis = Number.parseInt(prefix, 16);
517
- if (!Number.isFinite(millis) || millis <= 0) {
518
- return null;
519
- }
520
- const date = new Date(millis);
521
- return Number.isNaN(date.getTime()) ? null : date;
522
- }
523
- function toDate(value) {
524
- if (value instanceof Date && !Number.isNaN(value.getTime())) {
525
- return value;
526
- }
527
- if (typeof value === 'number' || typeof value === 'string') {
528
- const date = new Date(value);
529
- return Number.isNaN(date.getTime()) ? null : date;
530
- }
531
- return null;
532
- }
533
- function cwdFromArg(cwd) {
534
- return typeof cwd === 'string' && cwd.trim() ? cwd : process.cwd();
535
- }
536
- async function selectLinxSession(cwd) {
537
- const settingsManager = SettingsManager.create(cwd, LINX_AGENT_DIR);
538
- initTheme(settingsManager.getTheme());
539
- return new Promise((resolve) => {
540
- const ui = new TUI(new ProcessTerminal());
541
- let resolved = false;
542
- const finish = (sessionPath) => {
543
- if (resolved) {
544
- return;
545
- }
546
- resolved = true;
547
- ui.stop();
548
- resolve(sessionPath);
549
- };
550
- const loadSessions = () => listLinxPiSessions(cwd, LINX_AGENT_DIR, { podSessionSource: null });
551
- const selector = new SessionSelectorComponent(loadSessions, loadSessions, (sessionPath) => finish(sessionPath), () => finish(null), () => {
552
- ui.stop();
553
- process.exit(0);
554
- }, () => ui.requestRender(), { showRenameHint: false });
555
- ui.addChild(selector);
556
- ui.setFocus(selector.getSessionList());
557
- ui.start();
558
- });
559
- }
560
- async function runPiSyncStatusCommand() {
561
- const sessions = await listPendingPiPodMirrorSync(LINX_AGENT_DIR);
562
- if (sessions.length === 0) {
563
- process.stdout.write('No pending LinX Pod sync sessions.\n');
564
- return;
565
- }
566
- process.stdout.write(`${sessions.map((session) => {
567
- const failed = session.checkpoints.filter((checkpoint) => checkpoint.status === 'failed').length;
568
- const partial = session.checkpoints.filter((checkpoint) => checkpoint.status === 'partial').length;
569
- const latest = session.checkpoints.at(-1)?.completedAt ?? 'unknown';
570
- return `${session.sessionId} · failed=${failed} partial=${partial} latest=${latest}`;
571
- }).join('\n')}\n`);
572
- }
573
- async function runPiSyncRetryCommand(options) {
574
- const result = await retryPendingPiPodMirrorSync({
575
- cwd: options.cwd,
576
- agentDir: LINX_AGENT_DIR,
577
- sessionId: options.sessionId,
578
- });
579
- if (!result.attempted) {
580
- process.stdout.write(`LinX Pod sync skipped: ${options.sessionId}\n`);
581
- return;
582
- }
583
- const status = result.results.map((item) => item.status).join(', ') || 'none';
584
- process.stdout.write(status === 'none'
585
- ? `LinX Pod sync has no replayable local projections: ${options.sessionId}\n`
586
- : `Retried LinX Pod sync: ${options.sessionId} (${status})\n`);
587
- }
588
- function buildPiCommand(command) {
589
- const configured = buildAutoModeOptions(command)
590
- .option('cwd', {
591
- type: 'string',
592
- describe: 'Workspace path for the LinX session',
593
- })
594
- .option('model', {
595
- type: 'string',
596
- describe: 'Model id to expose through the LinX runtime adapter; defaults to the last LinX selection',
597
- })
598
- .option('runtime-url', {
599
- type: 'string',
600
- default: 'https://api.undefineds.co/v1',
601
- describe: 'Cloud runtime API base URL',
602
- })
603
- .option('print', {
604
- type: 'boolean',
605
- default: false,
606
- describe: 'Run a single prompt without entering interactive mode',
607
- })
608
- .option('session', {
609
- type: 'string',
610
- describe: 'Resume a specific LinX session id or JSONL file',
611
- })
612
- .option('continue', {
613
- alias: 'c',
614
- type: 'boolean',
615
- default: false,
616
- describe: 'Continue previous LinX session',
617
- })
618
- .option('resume', {
619
- alias: 'r',
620
- type: 'boolean',
621
- default: false,
622
- describe: 'Select a LinX session to resume',
623
- })
624
- .option('last', {
625
- type: 'boolean',
626
- default: false,
627
- hidden: true,
628
- })
629
- .option('pi-sync-status', {
630
- type: 'boolean',
631
- hidden: true,
632
- })
633
- .option('pi-sync-retry', {
634
- type: 'string',
635
- hidden: true,
636
- })
637
- .positional('prompt', {
638
- array: true,
639
- type: 'string',
640
- describe: 'Single-shot prompt when --print is enabled',
641
- });
642
- return configured;
643
- }
644
- const defaultPiCommand = {
645
- command: '$0 [prompt..]',
646
- describe: 'Run LinX with the selected runtime backend',
647
- builder: buildPiCommand,
648
- handler: runPiCommand,
649
- };
650
- const hiddenPiAliasCommand = {
651
- command: 'pi [prompt..]',
652
- describe: false,
653
- builder: buildPiCommand,
654
- handler: runPiCommand,
655
- };
656
- const hiddenPiFrontendAliasCommand = {
657
- command: 'pi-frontend [prompt..]',
658
- describe: false,
659
- builder: buildPiCommand,
660
- handler: runPiCommand,
661
- };
662
- const execCommand = {
663
- command: 'exec [prompt..]',
664
- aliases: ['e'],
665
- describe: 'Run LinX non-interactively',
666
- builder: buildPiCommand,
667
- async handler(argv) {
668
- await runPiCommand({ ...argv, print: true });
669
- },
670
- };
671
- const retiredSymphonyCommand = {
672
- command: 'symphony [args..]',
673
- describe: false,
674
- builder(command) {
675
- return command
676
- .help(false)
677
- .version(false)
678
- .positional('args', {
679
- array: true,
680
- type: 'string',
681
- describe: 'Retired Symphony CLI arguments',
682
- });
683
- },
684
- handler() {
685
- throw new Error('`linx symphony` is not a product command. Enter the TUI, run `/symphony on`, then send the objective as normal chat to Secretary.');
686
- },
687
- };
688
- const cli = yargs(hideBin(process.argv))
689
- .scriptName('linx')
690
- .version(readPackageVersion())
691
- .parserConfiguration({
692
- 'populate--': true,
693
- })
694
- .command(loginCommand)
695
- .command(logoutCommand)
696
- .command(whoamiCommand)
697
- .command(aiCommand)
698
- .command(configCommand)
699
- .command(retiredSymphonyCommand)
700
- .command('install [source]', 'Install a LinX package or extension', (command) => command
701
- .positional('source', { type: 'string', describe: 'Package source to install' })
702
- .option('local', { alias: 'l', type: 'boolean', default: false, describe: 'Install project-locally (.pi/settings.json)' }), async (argv) => {
703
- await runLinxPackageCommand('install', {
704
- source: typeof argv.source === 'string' ? argv.source : undefined,
705
- local: Boolean(argv.local),
706
- });
707
- })
708
- .command('remove [source]', 'Remove a LinX package or extension', (command) => command
709
- .positional('source', { type: 'string', describe: 'Package source to remove' })
710
- .option('local', { alias: 'l', type: 'boolean', default: false, describe: 'Remove from project settings (.pi/settings.json)' }), async (argv) => {
711
- await runLinxPackageCommand('remove', {
712
- source: typeof argv.source === 'string' ? argv.source : undefined,
713
- local: Boolean(argv.local),
714
- });
715
- })
716
- .command('update [source]', 'Update installed LinX packages', (command) => command.positional('source', { type: 'string', describe: 'Package source to update' }), async (argv) => {
717
- await runLinxPackageCommand('update', {
718
- source: typeof argv.source === 'string' ? argv.source : undefined,
719
- });
720
- })
721
- .command('list', 'List installed LinX packages', () => undefined, async () => {
722
- await runLinxPackageCommand('list');
723
- })
724
- .command(execCommand)
725
- .command(defaultPiCommand)
726
- .command('chat [prompt..]', false, (command) => command
727
- .option('model', { type: 'string', describe: 'Model ID override' })
728
- .option('continue', { type: 'boolean', default: false, describe: 'Continue latest thread' })
729
- .option('thread', { type: 'string', describe: 'Use an existing thread ID' })
730
- .option('url', { type: 'string', describe: 'Runtime API base URL override' })
731
- .option('workspace', { type: 'string', describe: 'Workspace/worktree path metadata' }), async (argv) => {
732
- const ctx = await resolveContext(argv.url);
733
- const threadId = await resolveThreadId({
734
- ctx,
735
- continueMode: argv.continue,
736
- explicitThreadId: argv.thread,
737
- workspace: argv.workspace,
738
- bestEffort: Boolean(argv.prompt?.join(' ').trim()),
739
- });
740
- const prompt = argv.prompt?.join(' ').trim() || undefined;
741
- if (prompt) {
742
- await runSingleTurn({ ctx, threadId, model: argv.model, prompt });
743
- await ctx.podSession.close();
744
- return;
745
- }
746
- await runInteractive({ ctx, initialThreadId: threadId, initialModel: argv.model });
747
- await ctx.podSession.close();
748
- })
749
- .command('models', 'List available remote models', (command) => command.option('url', { type: 'string', describe: 'Runtime API base URL override' }), async (argv) => {
750
- const ctx = await resolveRuntimeAuthContext(argv.url);
751
- let models;
752
- try {
753
- models = await ctx.runtime.listRemoteModels(ctx.authFetch, ctx.runtimeUrl, { fallback: false });
754
- }
755
- catch (error) {
756
- const message = error instanceof Error ? error.message : String(error);
757
- throw new Error(`Failed to load cloud models from ${ctx.runtimeUrl}: ${message}`);
758
- }
759
- if (models.length === 0) {
760
- process.stdout.write(`Cloud runtime returned an empty model list.\n`);
761
- }
762
- else {
763
- for (const model of models) {
764
- const meta = formatRemoteModelMetadata(model);
765
- process.stdout.write(`- ${model.id}${meta ? ` (${meta})` : ''}\n`);
766
- }
767
- }
768
- await ctx.podSession.close();
769
- })
770
- .command('fork [thread]', 'Fork a previous interactive session', (command) => command
771
- .positional('thread', { type: 'string', describe: 'Thread ID to fork' })
772
- .option('last', { type: 'boolean', default: false, describe: 'Fork the most recent thread' }), () => {
773
- throw new Error('Fork is not implemented yet for LinX Pod-backed sessions.');
774
- })
775
- .command(hiddenPiAliasCommand)
776
- .command(hiddenPiFrontendAliasCommand)
777
- .command('symphony-codex-mcp', false, (command) => command, async () => {
778
- const server = createSymphonyCodexMcpServer();
779
- const exitCode = await server.run();
780
- process.exit(exitCode);
781
- })
782
- .command('codex-native-proxy', false, (command) => command
783
- .option('cwd', {
784
- type: 'string',
785
- describe: 'Workspace path exposed to the native Codex shell',
786
- })
787
- .option('model', {
788
- type: 'string',
789
- describe: 'Model override forwarded to the native proxy session metadata',
790
- })
791
- .option('port', {
792
- type: 'number',
793
- default: 8787,
794
- describe: 'Local websocket listen port for codex --remote',
795
- }), async (argv) => {
796
- const proxy = createCodexNativeProxy({
797
- cwd: argv.cwd || process.cwd(),
798
- model: argv.model,
799
- listenPort: argv.port,
800
- });
801
- await proxy.start();
802
- process.stdout.write(`[linx] native codex proxy ready\n`);
803
- process.stdout.write(`[linx] connect with: codex --remote ${proxy.remoteUrl} -C ${proxy.record.cwd}\n`);
804
- const shutdown = async () => {
805
- await proxy.close();
806
- process.exit(0);
807
- };
808
- process.on('SIGINT', () => {
809
- void shutdown();
810
- });
811
- process.on('SIGTERM', () => {
812
- void shutdown();
813
- });
814
- await new Promise(() => { });
815
- })
816
- .strict()
817
- .help()
818
- .fail((message, error, yargsInstance) => {
819
- if (error) {
820
- console.error(formatLinxCliErrorMessage(error));
821
- process.exit(1);
822
- }
823
- if (message) {
824
- console.error(formatLinxCliErrorMessage(message));
825
- process.exit(1);
826
- }
827
- yargsInstance.showHelp();
828
- process.exit(1);
829
- });
830
- process.on('unhandledRejection', (error) => {
831
- console.error(formatLinxCliErrorMessage(error));
832
- process.exit(1);
833
- });
834
- cli.parse();
3
+ import { installLinxCliUnhandledRejectionHandler, runLinxCli } from './linx-cli-app.js';
4
+ installLinxCliUnhandledRejectionHandler();
5
+ runLinxCli(process.argv);
835
6
  //# sourceMappingURL=index.js.map