shortcutxl 0.3.77 → 0.3.78

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 (351) hide show
  1. package/BINARY-INVENTORY.json +9 -9
  2. package/CHANGELOG.md +8 -0
  3. package/dist/app/agent-session.d.ts +0 -15
  4. package/dist/app/agent-session.js +0 -37
  5. package/dist/app/extensions/slash-commands.js +1 -3
  6. package/dist/app/modes/action/agent.js +4 -5
  7. package/dist/app/modes/ask/agent.js +4 -6
  8. package/dist/app/modes/index.js +20 -10
  9. package/dist/app/modes/installation/agent.js +4 -5
  10. package/dist/app/modes/manage/agent.js +3 -4
  11. package/dist/app/modes/manage/prompt.js +1 -2
  12. package/dist/app/modes/metadata.d.ts +31 -0
  13. package/dist/app/modes/metadata.js +35 -0
  14. package/dist/app/modes/plan/agent.js +5 -8
  15. package/dist/app/modes/plan/prompt.js +3 -3
  16. package/dist/app/prompts/com-api.js +1 -1
  17. package/dist/app/prompts/shared-guidelines.js +6 -2
  18. package/dist/app/providers/register-shortcut-provider.js +4 -0
  19. package/dist/app/tools/bash.js +3 -3
  20. package/dist/app/tools/switch-mode.js +2 -2
  21. package/dist/app/tools/web-search.js +12 -2
  22. package/dist/cli.js +871 -2144
  23. package/dist/constants.d.ts +0 -2
  24. package/dist/constants.js +0 -3
  25. package/dist/contracts/model-call.d.ts +0 -1
  26. package/dist/contracts/model-call.js +1 -2
  27. package/dist/contracts/wire.d.ts +8 -1
  28. package/dist/contracts/wire.js +8 -0
  29. package/dist/embedded-agent/ai-invoke.d.ts +1 -2
  30. package/dist/embedded-agent/ai-invoke.js +0 -70
  31. package/dist/embedded-agent/anthropic-messages-transport.d.ts +1 -2
  32. package/dist/embedded-agent/google-vertex-transport.d.ts +1 -2
  33. package/dist/embedded-agent/host-tools/invoke-llm/contract.d.ts +1 -1
  34. package/dist/embedded-agent/host-tools/invoke-llm/contract.js +1 -1
  35. package/dist/embedded-agent/host-tools/shared/index.d.ts +1 -1
  36. package/dist/embedded-agent/host-tools/shared/index.js +1 -1
  37. package/dist/embedded-agent/host-tools/shared/llm-stream-error.d.ts +7 -0
  38. package/dist/embedded-agent/host-tools/shared/llm-stream-error.js +10 -0
  39. package/dist/embedded-agent/index.d.ts +3 -4
  40. package/dist/embedded-agent/index.js +2 -3
  41. package/dist/embedded-agent/openai-completions-transport.d.ts +1 -2
  42. package/dist/embedded-agent/openai-responses-transport.d.ts +1 -2
  43. package/dist/embedded-agent/prompt/sections.d.ts +1 -1
  44. package/dist/embedded-agent/prompt/sections.js +2 -0
  45. package/dist/embedded-agent/provider-native-request.d.ts +5 -0
  46. package/dist/embedded-agent/provider-native-request.js +3 -2
  47. package/dist/embedded-agent/stream.d.ts +8 -88
  48. package/dist/embedded-agent/stream.js +20 -537
  49. package/dist/embedded-agent/suggestions.d.ts +1 -1
  50. package/dist/embedded-agent/suggestions.js +1 -1
  51. package/dist/embedded-agent/worker-bridge/host-client.d.ts +7 -0
  52. package/dist/embedded-agent/worker-bridge/host-client.js +15 -0
  53. package/dist/embedded-agent/worker-bridge/worker-port.js +17 -1
  54. package/dist/main.js +16 -1
  55. package/dist/rpc/index.d.ts +1 -1
  56. package/dist/rpc/rpc-host.d.ts +4 -0
  57. package/dist/rpc/rpc-host.js +13 -24
  58. package/dist/rpc/rpc-types.d.ts +6 -17
  59. package/dist/shared/platform/open.d.ts +4 -1
  60. package/dist/shared/platform/open.js +14 -2
  61. package/dist/shell/interactive/interactive-mode-options.d.ts +10 -0
  62. package/dist/shell/interactive/interactive-mode.d.ts +6 -12
  63. package/dist/shell/interactive/interactive-mode.js +36 -157
  64. package/dist/shell/interactive/slash-commands.d.ts +0 -34
  65. package/dist/shell/interactive/slash-commands.js +0 -2
  66. package/dist/shell/links/local-file-link-input.d.ts +15 -0
  67. package/dist/shell/links/local-file-link-input.js +38 -0
  68. package/dist/shell/links/local-file-link.d.ts +7 -0
  69. package/dist/shell/links/local-file-link.js +35 -0
  70. package/dist/shell/links/local-file-opener.d.ts +16 -0
  71. package/dist/shell/links/local-file-opener.js +90 -0
  72. package/dist/shell/session-client.d.ts +0 -1
  73. package/dist/shell/session-client.js +0 -6
  74. package/dist/shell/status/update-check-scheduler.d.ts +30 -0
  75. package/dist/shell/status/update-check-scheduler.js +71 -0
  76. package/dist/shell/status/update-reminder-controller.d.ts +22 -0
  77. package/dist/shell/status/update-reminder-controller.js +40 -0
  78. package/dist/shell/status/update-reminder.d.ts +6 -0
  79. package/dist/shell/status/update-reminder.js +4 -0
  80. package/dist/shell/theme/dark.json +1 -2
  81. package/dist/shell/theme/light.json +1 -2
  82. package/dist/shell/theme/runtime.d.ts +1 -2
  83. package/dist/shell/theme/runtime.js +1 -6
  84. package/dist/shell/theme/theme-schema.json +1 -6
  85. package/dist/shortcut-model-catalog.js +12 -5
  86. package/dist/startup/update-manager.d.ts +6 -6
  87. package/dist/startup/update-manager.js +23 -38
  88. package/dist/startup/update-prompt.d.ts +1 -0
  89. package/dist/startup/update-prompt.js +2 -2
  90. package/dist/tui/components/markdown.js +15 -6
  91. package/dist/tui/index.d.ts +7 -1
  92. package/dist/tui/index.js +7 -1
  93. package/dist/tui/tui.d.ts +2 -0
  94. package/dist/tui/tui.js +16 -1
  95. package/dist/tui/utils.d.ts +7 -0
  96. package/dist/tui/utils.js +58 -8
  97. package/native-app/main/index.js +1 -1
  98. package/native-app/package.json +1 -1
  99. package/native-app/renderer/assets/{index-CtherCML.js → index-B4jz6epR.js} +594 -151
  100. package/native-app/renderer/assets/{index-B9UxxO8s.css → index-C__g36ft.css} +408 -160
  101. package/native-app/renderer/assets/shortcutagent-DxFsGSkw.png +0 -0
  102. package/native-app/renderer/index.html +2 -2
  103. package/package.json +2 -1
  104. package/user-docs/dist/index.html +1 -1
  105. package/user-docs/dist/shortcutxl-docs.pdf +0 -0
  106. package/xll/ShortcutXL.xll +0 -0
  107. package/xll/modules/shortcut_xl/_managed.py +26 -7
  108. package/xll/modules/shortcut_xl/_tracking.py +141 -251
  109. package/xll/modules/shortcut_xl/api/__init__.py +60 -0
  110. package/xll/modules/shortcut_xl/api/workbook.py +9 -1
  111. package/xll/modules/shortcut_xl/api/worksheet.py +4 -1
  112. package/xll/python/Lib/site-packages/httpx-0.28.1.dist-info/RECORD +1 -1
  113. package/xll/python/Lib/site-packages/idna-3.18.dist-info/RECORD +1 -1
  114. package/xll/python/Lib/site-packages/pip/__init__.py +1 -1
  115. package/xll/python/Lib/site-packages/pip/_internal/build_env/__init__.py +25 -0
  116. package/xll/python/Lib/site-packages/pip/_internal/build_env/base.py +103 -0
  117. package/xll/python/Lib/site-packages/pip/_internal/build_env/installer.py +333 -0
  118. package/xll/python/Lib/site-packages/pip/_internal/build_env/noop.py +42 -0
  119. package/xll/python/Lib/site-packages/pip/_internal/build_env/venv.py +145 -0
  120. package/xll/python/Lib/site-packages/pip/_internal/build_env/virtual.py +139 -0
  121. package/xll/python/Lib/site-packages/pip/_internal/cache.py +4 -1
  122. package/xll/python/Lib/site-packages/pip/_internal/cli/autocompletion.py +4 -1
  123. package/xll/python/Lib/site-packages/pip/_internal/cli/base_command.py +11 -14
  124. package/xll/python/Lib/site-packages/pip/_internal/cli/cmdoptions.py +133 -22
  125. package/xll/python/Lib/site-packages/pip/_internal/cli/index_command.py +11 -6
  126. package/xll/python/Lib/site-packages/pip/_internal/cli/main.py +2 -1
  127. package/xll/python/Lib/site-packages/pip/_internal/cli/main_parser.py +1 -2
  128. package/xll/python/Lib/site-packages/pip/_internal/cli/parser.py +10 -2
  129. package/xll/python/Lib/site-packages/pip/_internal/cli/progress_bars.py +2 -2
  130. package/xll/python/Lib/site-packages/pip/_internal/cli/req_command.py +57 -25
  131. package/xll/python/Lib/site-packages/pip/_internal/cli/status_codes.py +1 -0
  132. package/xll/python/Lib/site-packages/pip/_internal/commands/cache.py +7 -6
  133. package/xll/python/Lib/site-packages/pip/_internal/commands/configuration.py +2 -1
  134. package/xll/python/Lib/site-packages/pip/_internal/commands/debug.py +4 -5
  135. package/xll/python/Lib/site-packages/pip/_internal/commands/download.py +4 -0
  136. package/xll/python/Lib/site-packages/pip/_internal/commands/freeze.py +1 -1
  137. package/xll/python/Lib/site-packages/pip/_internal/commands/index.py +10 -3
  138. package/xll/python/Lib/site-packages/pip/_internal/commands/inspect.py +1 -1
  139. package/xll/python/Lib/site-packages/pip/_internal/commands/install.py +6 -6
  140. package/xll/python/Lib/site-packages/pip/_internal/commands/list.py +11 -6
  141. package/xll/python/Lib/site-packages/pip/_internal/commands/lock.py +4 -6
  142. package/xll/python/Lib/site-packages/pip/_internal/commands/show.py +14 -8
  143. package/xll/python/Lib/site-packages/pip/_internal/commands/wheel.py +7 -1
  144. package/xll/python/Lib/site-packages/pip/_internal/configuration.py +2 -3
  145. package/xll/python/Lib/site-packages/pip/_internal/distributions/base.py +5 -3
  146. package/xll/python/Lib/site-packages/pip/_internal/distributions/installed.py +3 -2
  147. package/xll/python/Lib/site-packages/pip/_internal/distributions/sdist.py +45 -20
  148. package/xll/python/Lib/site-packages/pip/_internal/distributions/wheel.py +3 -2
  149. package/xll/python/Lib/site-packages/pip/_internal/exceptions.py +174 -0
  150. package/xll/python/Lib/site-packages/pip/_internal/index/collector.py +70 -48
  151. package/xll/python/Lib/site-packages/pip/_internal/index/package_finder.py +46 -7
  152. package/xll/python/Lib/site-packages/pip/_internal/index/sources.py +1 -2
  153. package/xll/python/Lib/site-packages/pip/_internal/locations/_sysconfig.py +1 -1
  154. package/xll/python/Lib/site-packages/pip/_internal/locations/base.py +1 -1
  155. package/xll/python/Lib/site-packages/pip/_internal/metadata/base.py +10 -5
  156. package/xll/python/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +1 -1
  157. package/xll/python/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +8 -3
  158. package/xll/python/Lib/site-packages/pip/_internal/models/candidate.py +5 -1
  159. package/xll/python/Lib/site-packages/pip/_internal/models/link.py +53 -13
  160. package/xll/python/Lib/site-packages/pip/_internal/network/auth.py +38 -21
  161. package/xll/python/Lib/site-packages/pip/_internal/network/cache.py +2 -2
  162. package/xll/python/Lib/site-packages/pip/_internal/network/download.py +58 -11
  163. package/xll/python/Lib/site-packages/pip/_internal/network/session.py +35 -40
  164. package/xll/python/Lib/site-packages/pip/_internal/network/utils.py +109 -1
  165. package/xll/python/Lib/site-packages/pip/_internal/operations/check.py +2 -3
  166. package/xll/python/Lib/site-packages/pip/_internal/operations/install/wheel.py +23 -18
  167. package/xll/python/Lib/site-packages/pip/_internal/operations/prepare.py +152 -7
  168. package/xll/python/Lib/site-packages/pip/_internal/req/__init__.py +2 -0
  169. package/xll/python/Lib/site-packages/pip/_internal/req/constructors.py +54 -69
  170. package/xll/python/Lib/site-packages/pip/_internal/req/req_file.py +6 -6
  171. package/xll/python/Lib/site-packages/pip/_internal/req/req_install.py +25 -21
  172. package/xll/python/Lib/site-packages/pip/_internal/req/req_uninstall.py +13 -8
  173. package/xll/python/Lib/site-packages/pip/_internal/resolution/base.py +2 -2
  174. package/xll/python/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +2 -2
  175. package/xll/python/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +1 -1
  176. package/xll/python/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +0 -1
  177. package/xll/python/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +39 -52
  178. package/xll/python/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +3 -3
  179. package/xll/python/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +3 -0
  180. package/xll/python/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +9 -0
  181. package/xll/python/Lib/site-packages/pip/_internal/utils/compat.py +15 -9
  182. package/xll/python/Lib/site-packages/pip/_internal/utils/deprecation.py +6 -1
  183. package/xll/python/Lib/site-packages/pip/_internal/utils/filesystem.py +2 -2
  184. package/xll/python/Lib/site-packages/pip/_internal/utils/logging.py +11 -3
  185. package/xll/python/Lib/site-packages/pip/_internal/utils/misc.py +48 -4
  186. package/xll/python/Lib/site-packages/pip/_internal/utils/pylock.py +18 -2
  187. package/xll/python/Lib/site-packages/pip/_internal/utils/retry.py +2 -1
  188. package/xll/python/Lib/site-packages/pip/_internal/utils/subprocess.py +4 -3
  189. package/xll/python/Lib/site-packages/pip/_internal/utils/temp_dir.py +1 -2
  190. package/xll/python/Lib/site-packages/pip/_internal/utils/unpacking.py +30 -4
  191. package/xll/python/Lib/site-packages/pip/_internal/utils/urls.py +5 -2
  192. package/xll/python/Lib/site-packages/pip/_internal/utils/virtualenv.py +2 -36
  193. package/xll/python/Lib/site-packages/pip/_internal/vcs/git.py +8 -5
  194. package/xll/python/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +1 -2
  195. package/xll/python/Lib/site-packages/pip/_internal/wheel_builder.py +5 -1
  196. package/xll/python/Lib/site-packages/pip/_vendor/bom.cdx.json +231 -0
  197. package/xll/python/Lib/site-packages/pip/_vendor/certifi/__init__.py +1 -1
  198. package/xll/python/Lib/site-packages/pip/_vendor/certifi/cacert.pem +0 -631
  199. package/xll/python/Lib/site-packages/pip/_vendor/distlib/__init__.py +1 -1
  200. package/xll/python/Lib/site-packages/pip/_vendor/distlib/compat.py +34 -64
  201. package/xll/python/Lib/site-packages/pip/_vendor/distlib/resources.py +28 -14
  202. package/xll/python/Lib/site-packages/pip/_vendor/distlib/scripts.py +7 -3
  203. package/xll/python/Lib/site-packages/pip/_vendor/distlib/util.py +48 -11
  204. package/xll/python/Lib/site-packages/pip/_vendor/idna/LICENSE.md +1 -1
  205. package/xll/python/Lib/site-packages/pip/_vendor/idna/__main__.py +6 -0
  206. package/xll/python/Lib/site-packages/pip/_vendor/idna/cli.py +128 -0
  207. package/xll/python/Lib/site-packages/pip/_vendor/idna/codec.py +50 -13
  208. package/xll/python/Lib/site-packages/pip/_vendor/idna/compat.py +26 -0
  209. package/xll/python/Lib/site-packages/pip/_vendor/idna/core.py +352 -141
  210. package/xll/python/Lib/site-packages/pip/_vendor/idna/idnadata.py +571 -2983
  211. package/xll/python/Lib/site-packages/pip/_vendor/idna/intranges.py +5 -7
  212. package/xll/python/Lib/site-packages/pip/_vendor/idna/package_data.py +1 -1
  213. package/xll/python/Lib/site-packages/pip/_vendor/idna/uts46data.py +16887 -8832
  214. package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/__init__.py +352 -66
  215. package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/__main__.py +11 -0
  216. package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/_xdg.py +171 -0
  217. package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/android.py +92 -41
  218. package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/api.py +213 -49
  219. package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/macos.py +128 -51
  220. package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/unix.py +176 -127
  221. package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/version.py +8 -18
  222. package/xll/python/Lib/site-packages/pip/_vendor/platformdirs/windows.py +185 -68
  223. package/xll/python/Lib/site-packages/pip/_vendor/pygments/__init__.py +2 -2
  224. package/xll/python/Lib/site-packages/pip/_vendor/pygments/__main__.py +1 -1
  225. package/xll/python/Lib/site-packages/pip/_vendor/pygments/console.py +1 -1
  226. package/xll/python/Lib/site-packages/pip/_vendor/pygments/filter.py +1 -1
  227. package/xll/python/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py +10 -8
  228. package/xll/python/Lib/site-packages/pip/_vendor/pygments/formatter.py +1 -1
  229. package/xll/python/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +1 -1
  230. package/xll/python/Lib/site-packages/pip/_vendor/pygments/lexer.py +7 -5
  231. package/xll/python/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +1 -1
  232. package/xll/python/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +9 -8
  233. package/xll/python/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +35 -32
  234. package/xll/python/Lib/site-packages/pip/_vendor/pygments/modeline.py +1 -1
  235. package/xll/python/Lib/site-packages/pip/_vendor/pygments/plugin.py +3 -1
  236. package/xll/python/Lib/site-packages/pip/_vendor/pygments/regexopt.py +13 -2
  237. package/xll/python/Lib/site-packages/pip/_vendor/pygments/scanner.py +1 -1
  238. package/xll/python/Lib/site-packages/pip/_vendor/pygments/sphinxext.py +1 -1
  239. package/xll/python/Lib/site-packages/pip/_vendor/pygments/style.py +1 -1
  240. package/xll/python/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py +1 -1
  241. package/xll/python/Lib/site-packages/pip/_vendor/pygments/token.py +1 -1
  242. package/xll/python/Lib/site-packages/pip/_vendor/pygments/unistring.py +1 -1
  243. package/xll/python/Lib/site-packages/pip/_vendor/pygments/util.py +2 -2
  244. package/xll/python/Lib/site-packages/pip/_vendor/requests/__init__.py +52 -16
  245. package/xll/python/Lib/site-packages/pip/_vendor/requests/__version__.py +2 -2
  246. package/xll/python/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +2 -2
  247. package/xll/python/Lib/site-packages/pip/_vendor/requests/_types.py +183 -0
  248. package/xll/python/Lib/site-packages/pip/_vendor/requests/adapters.py +101 -50
  249. package/xll/python/Lib/site-packages/pip/_vendor/requests/api.py +31 -8
  250. package/xll/python/Lib/site-packages/pip/_vendor/requests/auth.py +80 -40
  251. package/xll/python/Lib/site-packages/pip/_vendor/requests/compat.py +9 -3
  252. package/xll/python/Lib/site-packages/pip/_vendor/requests/cookies.py +143 -79
  253. package/xll/python/Lib/site-packages/pip/_vendor/requests/exceptions.py +15 -5
  254. package/xll/python/Lib/site-packages/pip/_vendor/requests/help.py +13 -10
  255. package/xll/python/Lib/site-packages/pip/_vendor/requests/hooks.py +23 -9
  256. package/xll/python/Lib/site-packages/pip/_vendor/requests/models.py +265 -126
  257. package/xll/python/Lib/site-packages/pip/_vendor/requests/py.typed +0 -0
  258. package/xll/python/Lib/site-packages/pip/_vendor/requests/sessions.py +164 -78
  259. package/xll/python/Lib/site-packages/pip/_vendor/requests/status_codes.py +2 -2
  260. package/xll/python/Lib/site-packages/pip/_vendor/requests/structures.py +51 -20
  261. package/xll/python/Lib/site-packages/pip/_vendor/requests/utils.py +161 -89
  262. package/xll/python/Lib/site-packages/pip/_vendor/tomli/__init__.py +1 -1
  263. package/xll/python/Lib/site-packages/pip/_vendor/tomli/_parser.py +9 -4
  264. package/xll/python/Lib/site-packages/pip/_vendor/tomli/_re.py +13 -9
  265. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/_base_connection.py +3 -1
  266. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/_collections.py +0 -1
  267. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/_version.py +8 -18
  268. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/connection.py +4 -4
  269. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +23 -10
  270. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/contrib/emscripten/response.py +5 -1
  271. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +7 -8
  272. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +1 -1
  273. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +2 -2
  274. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/fields.py +14 -14
  275. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +8 -6
  276. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/response.py +35 -22
  277. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +8 -0
  278. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +11 -61
  279. package/xll/python/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +5 -11
  280. package/xll/python/Lib/site-packages/pip/_vendor/vendor.txt +8 -8
  281. package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/METADATA +3 -2
  282. package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/RECORD +208 -188
  283. package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/AUTHORS.txt +20 -0
  284. package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/idna/LICENSE.md +1 -1
  285. package/xll/python/Lib/site-packages/pywin32-311.dist-info/RECORD +2 -2
  286. package/xll/python/Scripts/httpx.exe +0 -0
  287. package/xll/python/Scripts/idna.exe +0 -0
  288. package/xll/python/Scripts/pip.exe +0 -0
  289. package/xll/python/Scripts/pip3.13.exe +0 -0
  290. package/xll/python/Scripts/pip3.exe +0 -0
  291. package/xll/python/Scripts/pywin32_postinstall.exe +0 -0
  292. package/xll/python/Scripts/pywin32_testall.exe +0 -0
  293. package/dist/app/collab/awareness.d.ts +0 -32
  294. package/dist/app/collab/awareness.js +0 -52
  295. package/dist/app/collab/collab-client.d.ts +0 -37
  296. package/dist/app/collab/collab-client.js +0 -208
  297. package/dist/app/collab/collab-manager.d.ts +0 -91
  298. package/dist/app/collab/collab-manager.js +0 -218
  299. package/dist/app/collab/collab-sync.d.ts +0 -62
  300. package/dist/app/collab/collab-sync.js +0 -215
  301. package/dist/app/collab/index.d.ts +0 -9
  302. package/dist/app/collab/index.js +0 -6
  303. package/dist/app/collab/super-fight.d.ts +0 -90
  304. package/dist/app/collab/super-fight.js +0 -310
  305. package/dist/app/collab/sync-bridge.d.ts +0 -35
  306. package/dist/app/collab/sync-bridge.js +0 -109
  307. package/dist/app/collab/types.d.ts +0 -75
  308. package/dist/app/collab/types.js +0 -5
  309. package/dist/embedded-agent/ai-content.d.ts +0 -52
  310. package/dist/embedded-agent/ai-content.js +0 -101
  311. package/dist/embedded-agent/host-tools/shared/llm-stream.d.ts +0 -31
  312. package/dist/embedded-agent/host-tools/shared/llm-stream.js +0 -136
  313. package/dist/embedded-agent/model-call-orchestrator.d.ts +0 -22
  314. package/dist/embedded-agent/model-call-orchestrator.js +0 -22
  315. package/dist/embedded-agent/stream-errors.d.ts +0 -10
  316. package/dist/embedded-agent/stream-errors.js +0 -73
  317. package/dist/embedded-agent/stream-message-state.d.ts +0 -14
  318. package/dist/embedded-agent/stream-message-state.js +0 -271
  319. package/dist/embedded-agent/stream-sse.d.ts +0 -78
  320. package/dist/embedded-agent/stream-sse.js +0 -73
  321. package/dist/shell/interactive/collab-command.d.ts +0 -9
  322. package/dist/shell/interactive/collab-command.js +0 -115
  323. package/dist/shell/interactive/super-fight-ui.d.ts +0 -80
  324. package/dist/shell/interactive/super-fight-ui.js +0 -484
  325. package/dist/shell/status/collab-status.d.ts +0 -18
  326. package/dist/shell/status/collab-status.js +0 -46
  327. package/xll/python/Lib/site-packages/pip/_internal/build_env.py +0 -606
  328. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/INSTALLER +0 -0
  329. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/REQUESTED +0 -0
  330. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/WHEEL +0 -0
  331. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/entry_points.txt +0 -0
  332. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/LICENSE.txt +0 -0
  333. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt +0 -0
  334. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/certifi/LICENSE +0 -0
  335. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/distlib/LICENSE.txt +0 -0
  336. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/distro/LICENSE +0 -0
  337. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/msgpack/COPYING +0 -0
  338. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/packaging/LICENSE +0 -0
  339. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/packaging/LICENSE.APACHE +0 -0
  340. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/packaging/LICENSE.BSD +0 -0
  341. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/pkg_resources/LICENSE +0 -0
  342. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/platformdirs/LICENSE +0 -0
  343. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/pygments/LICENSE +0 -0
  344. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/pyproject_hooks/LICENSE +0 -0
  345. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/requests/LICENSE +0 -0
  346. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/resolvelib/LICENSE +0 -0
  347. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/rich/LICENSE +0 -0
  348. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/tomli/LICENSE +0 -0
  349. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/tomli_w/LICENSE +0 -0
  350. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/truststore/LICENSE +0 -0
  351. /package/xll/python/Lib/site-packages/{pip-26.1.2.dist-info → pip-26.2.dist-info}/licenses/src/pip/_vendor/urllib3/LICENSE.txt +0 -0
@@ -18,13 +18,15 @@ import { hydrateParsedSkillBlock } from '../../app/resources/skills.js';
18
18
  import { getSharedSkillProposalBackground } from '../../app/skill-proposals/background.js';
19
19
  import { fuzzyFilter } from '../../autocomplete/fuzzy.js';
20
20
  import { CombinedAutocompleteProvider } from '../../autocomplete/index.js';
21
- import { APP_NAME, BARE_SKILL_NAMES, getAgentDir, getDebugLogPath, VERSION } from '../../config.js';
21
+ import { APP_NAME, BARE_SKILL_NAMES, getDebugLogPath, VERSION } from '../../config.js';
22
22
  import { getActiveUserMessageId } from '../../core/user-message-id.js';
23
23
  import { getCurrentMode, MODE, onModeChange } from '../../mode-names.js';
24
24
  import { Container, Loader, Markdown, matchesKey, ProcessTerminal, Spacer, Text, TruncatedText, TUI, visibleWidth } from '../../tui/index.js';
25
25
  import { parseMouseEvent, parseMouseWheelDelta } from '../../tui/keys.js';
26
26
  import { FooterDataProvider } from '../footer-data-provider.js';
27
27
  import { KeybindingsManager } from '../keybindings.js';
28
+ import { LocalFileLinkInput } from '../links/local-file-link-input.js';
29
+ import { openLocalFileLink } from '../links/local-file-opener.js';
28
30
  import { PromptHistoryStore } from '../prompt-history-store.js';
29
31
  import { drainPendingRefreshes } from '../../app/session/pending-refresh-runner.js';
30
32
  import { formatWorkbookScopeAnnotation, getScopedWorkbookNames, SCOPE_NONE, SCOPE_SELECTED } from '../../app/workbook-scope.js';
@@ -33,14 +35,11 @@ import { getChangelogPath, getNewEntries, parseChangelog } from '../changelog.js
33
35
  import { extensionForImageMimeType, readClipboardImage } from '../clipboard/clipboard-image.js';
34
36
  import { copyToClipboard } from '../clipboard/clipboard.js';
35
37
  import { getAvailableThemes, initTheme, onThemeChange, setTheme, theme } from '../theme/runtime.js';
36
- import { CollabManager, FileDisplayNameProvider } from '../../app/collab/collab-manager.js';
37
- import { decodeGameMsg, encodeGameMsg, GAME_MSG_PREFIX } from '../../app/collab/super-fight.js';
38
38
  import { getModeNames } from '../../app/modes/index.js';
39
39
  import { filterInteractiveSelectableModels } from '../../app/session/session-models.js';
40
40
  import { getShellConfig, getShellEnv, sanitizeBinaryOutput } from '../../app/tools/bash-runtime.js';
41
41
  import { TASK_NOTIFICATION_CUSTOM_TYPE, taskManager } from '../../app/tools/task/manager.js';
42
42
  import { ensureTool } from '../../app/tools/tool-binaries.js';
43
- import { COLLAB_SERVER_URL } from '../../constants.js';
44
43
  import { interceptProcessWarnings } from '../../shared/logging/agent-log.js';
45
44
  import { manageChildProcess } from '../../shared/process/lifecycle.js';
46
45
  import { CustomEditor } from '../components/editors/custom-editor.js';
@@ -67,8 +66,8 @@ import { WorkbookScopeSelectorComponent } from '../components/selectors/workbook
67
66
  import { createInteractiveRenderTrace } from '../dev/interactive-render-trace.js';
68
67
  import { appendAttachedFiles, AttachmentManager, parseAttachedFiles, stripQuotes } from '../input/file-attachments.js';
69
68
  import { buildScopeGroups, createResourceDisplayHelpers, formatDiagnostics, formatDisplayPath, formatScopeGroups, getShortPath } from '../presentation/resource-display.js';
70
- import { startCollabStatusUpdater } from '../status/collab-status.js';
71
69
  import { refreshSkillProposalStatus } from '../status/skill-proposals-status.js';
70
+ import { UpdateReminderController } from '../status/update-reminder-controller.js';
72
71
  import { getEditorTheme, getMarkdownTheme } from '../theme/theme.js';
73
72
  import { getToolPresentation } from '../tools/presentation/index.js';
74
73
  import { ToolExecutionComponent } from '../tools/runtime/tool-execution.js';
@@ -85,12 +84,11 @@ import { ReloadWorkflow } from './reload-workflow.js';
85
84
  import { SessionWorkflow } from './session-workflow.js';
86
85
  import { SkillsWorkflow } from './skills-workflow.js';
87
86
  import { buildDefaultCommands, REBUILD_CHAT_COMMANDS } from './slash-commands.js';
88
- import { SuperFightUI } from './super-fight-ui.js';
89
87
  import { WorkbookScopeController } from './workbook-scope-controller.js';
90
88
  const MOUSE_WHEEL_LINES = 8;
91
89
  // Position of editorContainer within the shell layout's bottom stack (see the
92
90
  // InteractiveShellLayout constructor call). Kept in sync with that array order.
93
- const EDITOR_BOTTOM_INDEX = 0;
91
+ const EDITOR_BOTTOM_INDEX = 1;
94
92
  function isSelectionCapableEditor(editor) {
95
93
  return (typeof editor.startSelectionAtScreenRow === 'function' &&
96
94
  typeof editor.extendSelectionAtScreenRow === 'function' &&
@@ -115,6 +113,7 @@ export class InteractiveMode {
115
113
  options;
116
114
  session;
117
115
  ui;
116
+ localFileLinkInput;
118
117
  renderTracePath = undefined;
119
118
  shellLayout;
120
119
  mainContentContainer;
@@ -315,13 +314,13 @@ export class InteractiveMode {
315
314
  customFooter = undefined;
316
315
  // Header container that holds the built-in or custom header
317
316
  headerContainer;
317
+ updateReminderController;
318
318
  // Built-in header (logo + keybinding hints + changelog)
319
319
  builtInHeader = undefined;
320
320
  // Custom header from extension (undefined = use built-in header)
321
321
  customHeader = undefined;
322
322
  // Bash prefix mode — tracks whether the editor text starts with '!'
323
323
  isBashMode = false;
324
- isChatMode = false;
325
324
  // Credit balance polling during active agent turns
326
325
  creditPollInterval = undefined;
327
326
  static CREDIT_POLL_INTERVAL_MS = 10_000;
@@ -329,8 +328,6 @@ export class InteractiveMode {
329
328
  // Slash command registry
330
329
  _commands;
331
330
  _resourceDisplay;
332
- _collabManager = null;
333
- _superFight = null;
334
331
  manualMemoryCoordinator = new DurableMemoryCoordinator();
335
332
  manualSkillProposalBackground = getSharedSkillProposalBackground();
336
333
  // Convenience accessors
@@ -356,6 +353,12 @@ export class InteractiveMode {
356
353
  this.renderTracePath = renderTrace?.path;
357
354
  this.ui.setRenderTrace(renderTrace);
358
355
  this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());
356
+ this.localFileLinkInput = new LocalFileLinkInput({
357
+ getHyperlinkAtScreenPosition: (row, col) => this.ui.getHyperlinkAtScreenPosition(row, col),
358
+ openHref: (href) => {
359
+ void this.handleLocalFileLink(href);
360
+ }
361
+ });
359
362
  this.headerContainer = new Container();
360
363
  this.chatContainer = new Container();
361
364
  this.mainContentContainer = new Container();
@@ -374,6 +377,12 @@ export class InteractiveMode {
374
377
  this.mainContentContainer.addChild(this.statusContainer);
375
378
  this.mainContentContainer.addChild(this.widgetContainerAbove);
376
379
  this.scrollableMainContent = new LineSelectionScrollContainer(this.mainContentContainer);
380
+ this.updateReminderController = new UpdateReminderController({
381
+ initialUpdate: this.options.availableUpdate,
382
+ lastCheckedAt: this.options.updateLastCheckedAt,
383
+ checkForUpdate: this.options.checkForUpdate,
384
+ onChange: () => this.ui.requestRender()
385
+ });
377
386
  this.keybindings = KeybindingsManager.create();
378
387
  this.promptHistoryStore = new PromptHistoryStore({
379
388
  sessionId: () => this.sessionManager.getSessionId()
@@ -411,6 +420,7 @@ export class InteractiveMode {
411
420
  // Index of editorContainer within the shell layout's bottom stack; used to
412
421
  // read its cached screen geometry for mouse hit-testing (see EDITOR_BOTTOM_INDEX).
413
422
  this.shellLayout = new InteractiveShellLayout(this.ui.terminal, this.scrollableMainContent, [
423
+ this.updateReminderController.container,
414
424
  this.editorContainer,
415
425
  this.widgetContainerBelow,
416
426
  this.footerContainer
@@ -748,6 +758,7 @@ export class InteractiveMode {
748
758
  });
749
759
  await this.updateAvailableProviderCount();
750
760
  this.refreshAgentFooterStatus();
761
+ this.updateReminderController.start();
751
762
  }
752
763
  /**
753
764
  * Update terminal title with session name and cwd.
@@ -1717,6 +1728,7 @@ export class InteractiveMode {
1717
1728
  cycleMode: async () => this.cycleMode()
1718
1729
  }
1719
1730
  });
1731
+ this.ui.addInputListener((data) => this.localFileLinkInput.handleInput(data));
1720
1732
  this.ui.addInputListener((data) => this.handleEditorSelectionInput(data));
1721
1733
  this.ui.addInputListener((data) => this.handleTranscriptSelectionInput(data));
1722
1734
  this.ui.addInputListener((data) => this.handleTranscriptScrollInput(data));
@@ -1798,6 +1810,15 @@ export class InteractiveMode {
1798
1810
  this.ui.requestRender();
1799
1811
  return { consume: true };
1800
1812
  }
1813
+ async handleLocalFileLink(href) {
1814
+ try {
1815
+ const result = await (this.options.openLocalFileHref ?? openLocalFileLink)(href);
1816
+ this.showStatus(`Opened ${result.path}`);
1817
+ }
1818
+ catch (error) {
1819
+ this.showError(error instanceof Error ? error.message : String(error));
1820
+ }
1821
+ }
1801
1822
  /**
1802
1823
  * Screen-row range (1-based, inclusive) occupied by the editor, derived from
1803
1824
  * geometry cached during the last frame render — no re-render per mouse event.
@@ -2092,43 +2113,11 @@ export class InteractiveMode {
2092
2113
  },
2093
2114
  updateTerminalTitle: () => this.updateTerminalTitle(),
2094
2115
  resourceDisplay: this._resourceDisplay,
2095
- getCollabClient: () => this.getCollabCommandClient(),
2096
- stopSuperFight: () => {
2097
- if (this._superFight?.isRunning) {
2098
- this._superFight.stop();
2099
- this._superFight = null;
2100
- }
2101
- },
2102
2116
  showSkillsSelector: () => this.skillsWorkflow.showSkillsSelector(),
2103
2117
  selectOption: (title, options) => this.showExtensionSelector(title, options)
2104
2118
  };
2105
2119
  }
2106
- /** Lazily build the collaboration command client backed by CollabManager. */
2107
- getCollabCommandClient() {
2108
- if (!this._collabManager) {
2109
- const pool = this.session.sheetPool;
2110
- if (!pool)
2111
- throw new Error('Cannot use collab without a sheet pool');
2112
- const nameProvider = new FileDisplayNameProvider(getAgentDir());
2113
- this._collabManager = new CollabManager(COLLAB_SERVER_URL, pool, nameProvider);
2114
- this.session.collabClient = this._collabManager.client;
2115
- this._attachCollabEvents(this._collabManager);
2116
- }
2117
- const manager = this._collabManager;
2118
- return {
2119
- get inRoom() {
2120
- return manager.inRoom;
2121
- },
2122
- createRoom: (displayName) => manager.createRoom(displayName),
2123
- currentDisplayName: () => manager.currentDisplayName(),
2124
- getDisplayName: () => manager.getDisplayName(),
2125
- getStatus: () => manager.getStatus(),
2126
- joinRoom: (roomId, displayName) => manager.joinRoom(roomId, displayName),
2127
- leave: () => manager.leave(),
2128
- setDisplayName: (name) => manager.setDisplayName(name)
2129
- };
2130
- }
2131
- /** Wire the default editor submit handler covering bash, chat, slash, and prompt dispatch. */
2120
+ /** Wire the default editor submit handler covering bash, slash, and prompt dispatch. */
2132
2121
  setupEditorSubmitHandler() {
2133
2122
  this.defaultEditor.onSubmit = async (text) => {
2134
2123
  this.clearCtrlCHint();
@@ -2153,39 +2142,6 @@ export class InteractiveMode {
2153
2142
  await this.executeBashCommand(command);
2154
2143
  return;
2155
2144
  }
2156
- // Chat prefix dispatch — send to collab peers, never sent to the agent
2157
- if (text.startsWith(':')) {
2158
- const chatText = text.slice(1).trim();
2159
- this.editor.setText('');
2160
- this.isChatMode = false;
2161
- this.updateEditorBorderColor();
2162
- this.editor.addToHistory?.(text);
2163
- if (!chatText) {
2164
- this.showStatus('No message to send');
2165
- return;
2166
- }
2167
- const client = this.session.collabClient;
2168
- if (!client || !client.state.roomId) {
2169
- this.showError('Not in a collaboration session. Use /collab to create or join one.');
2170
- return;
2171
- }
2172
- // Super Fight easter egg
2173
- if (chatText === 'super-fight') {
2174
- if (this._superFight?.isRunning) {
2175
- this.showStatus('Super Fight is already running!');
2176
- return;
2177
- }
2178
- // Broadcast start message
2179
- client.sendChat(encodeGameMsg({ type: 'start' }));
2180
- this.launchSuperFight(client);
2181
- return;
2182
- }
2183
- client.sendChat(chatText);
2184
- // Render locally as "You: text"
2185
- this.chatContainer.addChild(new Text(theme.fg('chatMode', `You: ${chatText}`), 1, 0));
2186
- this.ui.requestRender();
2187
- return;
2188
- }
2189
2145
  // Slash command dispatch via registry
2190
2146
  if (text.startsWith('/')) {
2191
2147
  const spaceIndex = text.indexOf(' ');
@@ -2999,101 +2955,23 @@ export class InteractiveMode {
2999
2955
  this.showStatus(`Restored ${restored} queued message${restored > 1 ? 's' : ''} to editor`);
3000
2956
  }
3001
2957
  }
3002
- /** Refresh the editor border color based on bash/chat/thinking state. */
2958
+ /** Refresh the editor border color based on bash/thinking state. */
3003
2959
  updateEditorBorderColor() {
3004
2960
  if (this.isBashMode) {
3005
2961
  this.editor.borderColor = theme.getBashModeBorderColor();
3006
2962
  }
3007
- else if (this.isChatMode) {
3008
- this.editor.borderColor = theme.getChatModeBorderColor();
3009
- }
3010
2963
  else {
3011
2964
  const level = this.session.thinkingLevel || 'off';
3012
2965
  this.editor.borderColor = theme.getThinkingBorderColor(level);
3013
2966
  }
3014
2967
  this.ui.requestRender();
3015
2968
  }
3016
- /** Subscribe to CollabClient events and surface peer activity in chat. */
3017
- _attachCollabEvents(manager) {
3018
- const client = manager.client;
3019
- client.on('onPeerJoined', (peer) => {
3020
- this.chatContainer.addChild(new Text(theme.fg('dim', `[collab] ${peer.displayName} joined`), 1, 0));
3021
- this.ui.requestRender();
3022
- // Add to active game if running
3023
- this._superFight?.addPeer(peer.peerId, peer.displayName);
3024
- });
3025
- client.on('onPeerLeft', (peerId, displayName) => {
3026
- this.chatContainer.addChild(new Text(theme.fg('dim', `[collab] ${displayName ?? peerId} left`), 1, 0));
3027
- this.ui.requestRender();
3028
- // Remove from active game if running
3029
- this._superFight?.removePeer(peerId);
3030
- });
3031
- client.on('onChat', (peerId, displayName, text) => {
3032
- // Route game messages to the active game, don't show in chat
3033
- if (text.startsWith(GAME_MSG_PREFIX)) {
3034
- if (this._superFight?.isRunning) {
3035
- this._superFight.handleGameMessage(peerId, text);
3036
- }
3037
- else {
3038
- // Auto-launch game when receiving a start message
3039
- const msg = decodeGameMsg(text);
3040
- if (msg?.type === 'start') {
3041
- this.launchSuperFight(client);
3042
- }
3043
- }
3044
- return;
3045
- }
3046
- this.chatContainer.addChild(new Text(theme.fg('chatMode', `${displayName}: ${text}`), 1, 0));
3047
- this.ui.requestRender();
3048
- });
3049
- client.on('onAwareness', (_peerId, displayName, sheets) => {
3050
- if (sheets.length > 0) {
3051
- const names = sheets.map((s) => s.name).join(', ');
3052
- this.chatContainer.addChild(new Text(theme.fg('dim', `[collab] ${displayName} has: ${names}`), 1, 0));
3053
- this.ui.requestRender();
3054
- }
3055
- });
3056
- client.on('onDisconnect', () => {
3057
- // Force-stop game on disconnect
3058
- if (this._superFight?.isRunning) {
3059
- this._superFight.stop();
3060
- this._superFight = null;
3061
- }
3062
- this.chatContainer.addChild(new Text(theme.fg('dim', '[collab] disconnected from server'), 1, 0));
3063
- this.ui.requestRender();
3064
- });
3065
- client.on('onError', (message) => {
3066
- this.chatContainer.addChild(new Text(theme.fg('error', `[collab] error: ${message}`), 1, 0));
3067
- this.ui.requestRender();
3068
- });
3069
- // Footer status line
3070
- startCollabStatusUpdater(this.session, client, (key, text) => this.setExtensionStatus(key, text), () => this.ui.requestRender());
3071
- }
3072
- /** Launch the SuperFight collab mini-game UI for the current room. */
3073
- launchSuperFight(client) {
3074
- const peerId = client.state.peerId;
3075
- if (!peerId)
3076
- return;
3077
- this._superFight = new SuperFightUI({
3078
- ui: this.ui,
3079
- client,
3080
- localPeerId: peerId,
3081
- localDisplayName: this._collabManager?.getDisplayName().name ?? 'You',
3082
- peers: client.state.peers
3083
- });
3084
- this._superFight.onStop = () => {
3085
- this._superFight = null;
3086
- };
3087
- this._superFight.start();
3088
- }
3089
- /** Watch editor text and toggle bash/chat-mode borders based on `!`/`:` prefixes. */
2969
+ /** Watch editor text and toggle bash-mode borders based on the `!` prefix. */
3090
2970
  setupBashModeDetection() {
3091
2971
  this.defaultEditor.onChange = (text) => {
3092
2972
  const shouldBeBashMode = text.startsWith('!');
3093
- const shouldBeChatMode = text.startsWith(':');
3094
- if (shouldBeBashMode !== this.isBashMode || shouldBeChatMode !== this.isChatMode) {
2973
+ if (shouldBeBashMode !== this.isBashMode) {
3095
2974
  this.isBashMode = shouldBeBashMode;
3096
- this.isChatMode = shouldBeChatMode;
3097
2975
  this.updateEditorBorderColor();
3098
2976
  }
3099
2977
  };
@@ -4061,6 +3939,7 @@ export class InteractiveMode {
4061
3939
  }
4062
3940
  /** Tear down the interactive shell: loaders, listeners, polling, footer, and UI. */
4063
3941
  stop() {
3942
+ this.updateReminderController.stop();
4064
3943
  this.stopTranscriptSelectionAutoScroll();
4065
3944
  if (this.loadingAnimation) {
4066
3945
  this.loadingAnimation.stop();
@@ -21,36 +21,6 @@ export interface CommandChat {
21
21
  addChild(component: Component): void;
22
22
  clear(): void;
23
23
  }
24
- export interface CollabCommandClient {
25
- readonly inRoom: boolean;
26
- createRoom: (displayName: string) => Promise<{
27
- roomId: string;
28
- }>;
29
- currentDisplayName: () => string | null | undefined;
30
- getDisplayName: () => {
31
- name: string;
32
- isNew: boolean;
33
- };
34
- getStatus: () => {
35
- roomId: string | null;
36
- peers: Array<{
37
- displayName: string;
38
- sheets?: Array<{
39
- name: string;
40
- cellCount: number;
41
- usedRange?: string | null;
42
- }>;
43
- }>;
44
- };
45
- joinRoom: (roomId: string, displayName: string) => Promise<{
46
- roomId: string;
47
- peers: Array<{
48
- displayName: string;
49
- }>;
50
- }>;
51
- leave: () => void;
52
- setDisplayName: (name: string) => void;
53
- }
54
24
  /**
55
25
  * The context passed to every slash command handler.
56
26
  * Kept deliberately narrow — commands should not reach into InteractiveMode internals.
@@ -72,10 +42,6 @@ export interface CommandContext {
72
42
  updateTerminalTitle(): void;
73
43
  /** Resource display helpers (formatting, scope groups). */
74
44
  resourceDisplay: ResourceDisplayHelpers;
75
- /** Get or lazily create the collaboration command client. */
76
- getCollabClient(): CollabCommandClient;
77
- /** Stop any active Super Fight game (called on /collab leave). */
78
- stopSuperFight?(): void;
79
45
  /** Open the interactive skill visibility selector when supported by the shell. */
80
46
  showSkillsSelector?(): void;
81
47
  selectOption?(title: string, options: SelectItem[]): Promise<string | undefined>;
@@ -12,7 +12,6 @@ import { getChangelogPath, parseChangelog } from '../changelog.js';
12
12
  import { copyToClipboard } from '../clipboard/clipboard.js';
13
13
  import { buildChangelogComponents, buildHotkeysComponents, buildSessionInfoText, buildSkillsComponents, buildSkillsText } from '../presentation/slash-command-rendering.js';
14
14
  import { theme } from '../theme/runtime.js';
15
- import { collabCommand } from './collab-command.js';
16
15
  // ============================================================================
17
16
  // Command Implementations
18
17
  // ============================================================================
@@ -220,7 +219,6 @@ export function buildDefaultCommands(additionalCommands = []) {
220
219
  commands.set('hotkeys', hotkeysCommand);
221
220
  commands.set('skills', skillsCommand);
222
221
  commands.set('hide-thinking', hideThinkingCommand);
223
- commands.set('collab', collabCommand);
224
222
  for (const command of additionalCommands) {
225
223
  commands.set(command.name, command.handler);
226
224
  }
@@ -0,0 +1,15 @@
1
+ export interface LocalFileLinkInputDependencies {
2
+ getHyperlinkAtScreenPosition(row: number, col: number): string | undefined;
3
+ openHref(href: string): void;
4
+ platform?: NodeJS.Platform;
5
+ }
6
+ /** Converts a left click on a rendered local-file hyperlink into an open request. */
7
+ export declare class LocalFileLinkInput {
8
+ private readonly dependencies;
9
+ private pendingClick?;
10
+ constructor(dependencies: LocalFileLinkInputDependencies);
11
+ handleInput(data: string): {
12
+ consume?: boolean;
13
+ } | undefined;
14
+ }
15
+ //# sourceMappingURL=local-file-link-input.d.ts.map
@@ -0,0 +1,38 @@
1
+ import { parseMouseEvent } from '../../tui/keys.js';
2
+ import { parseLocalFileLink } from './local-file-link.js';
3
+ /** Converts a left click on a rendered local-file hyperlink into an open request. */
4
+ export class LocalFileLinkInput {
5
+ dependencies;
6
+ pendingClick;
7
+ constructor(dependencies) {
8
+ this.dependencies = dependencies;
9
+ }
10
+ handleInput(data) {
11
+ const event = parseMouseEvent(data);
12
+ if (!event || event.kind !== 'button' || (event.button & 0x03) !== 0)
13
+ return undefined;
14
+ const isMotion = (event.button & 0x20) !== 0;
15
+ if (isMotion) {
16
+ if (!this.pendingClick)
17
+ return undefined;
18
+ this.pendingClick = undefined;
19
+ return { consume: true };
20
+ }
21
+ const href = this.dependencies.getHyperlinkAtScreenPosition(event.row, event.col);
22
+ if (event.action === 'press') {
23
+ if (!href || !parseLocalFileLink(href, this.dependencies.platform))
24
+ return undefined;
25
+ this.pendingClick = { href, row: event.row, col: event.col };
26
+ return { consume: true };
27
+ }
28
+ const pending = this.pendingClick;
29
+ this.pendingClick = undefined;
30
+ if (!pending)
31
+ return undefined;
32
+ if (href === pending.href && event.row === pending.row && event.col === pending.col) {
33
+ this.dependencies.openHref(pending.href);
34
+ }
35
+ return { consume: true };
36
+ }
37
+ }
38
+ //# sourceMappingURL=local-file-link-input.js.map
@@ -0,0 +1,7 @@
1
+ export interface LocalFileLink {
2
+ href: string;
3
+ path: string;
4
+ }
5
+ /** Parse an absolute file URL emitted in assistant Markdown. */
6
+ export declare function parseLocalFileLink(href: string, platform?: NodeJS.Platform): LocalFileLink | undefined;
7
+ //# sourceMappingURL=local-file-link.d.ts.map
@@ -0,0 +1,35 @@
1
+ import { posix, win32 } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ function hasControlCharacters(value) {
4
+ return /[\u0000-\u001f\u007f]/u.test(value);
5
+ }
6
+ /** Parse an absolute file URL emitted in assistant Markdown. */
7
+ export function parseLocalFileLink(href, platform = process.platform) {
8
+ let url;
9
+ try {
10
+ url = new URL(href);
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ if (url.protocol !== 'file:' ||
16
+ url.hostname ||
17
+ url.username ||
18
+ url.password ||
19
+ url.search ||
20
+ url.hash) {
21
+ return undefined;
22
+ }
23
+ let filePath;
24
+ try {
25
+ filePath = fileURLToPath(url, { windows: platform === 'win32' });
26
+ }
27
+ catch {
28
+ return undefined;
29
+ }
30
+ const pathApi = platform === 'win32' ? win32 : posix;
31
+ if (!pathApi.isAbsolute(filePath) || hasControlCharacters(filePath))
32
+ return undefined;
33
+ return { href, path: filePath };
34
+ }
35
+ //# sourceMappingURL=local-file-link.js.map
@@ -0,0 +1,16 @@
1
+ export interface LocalFileOpenResult {
2
+ path: string;
3
+ }
4
+ export interface LocalFileOpenerDependencies {
5
+ platform?: NodeJS.Platform;
6
+ statPath?: (path: string) => Promise<{
7
+ isFile(): boolean;
8
+ isDirectory(): boolean;
9
+ isSymbolicLink?(): boolean;
10
+ mode?: number;
11
+ }>;
12
+ openPath?: (path: string) => Promise<unknown>;
13
+ }
14
+ /** Validate and open a local file or folder link with the platform default application. */
15
+ export declare function openLocalFileLink(href: string, dependencies?: LocalFileOpenerDependencies): Promise<LocalFileOpenResult>;
16
+ //# sourceMappingURL=local-file-opener.d.ts.map
@@ -0,0 +1,90 @@
1
+ import { lstat } from 'node:fs/promises';
2
+ import { posix, win32 } from 'node:path';
3
+ import { openInEditor } from '../../shared/platform/open.js';
4
+ import { parseLocalFileLink } from './local-file-link.js';
5
+ const UNSAFE_OPEN_EXTENSIONS = new Set([
6
+ '.app',
7
+ '.appimage',
8
+ '.command',
9
+ '.desktop',
10
+ '.dmg',
11
+ '.jar',
12
+ '.mobileconfig',
13
+ '.pkg',
14
+ '.url',
15
+ '.webloc'
16
+ ]);
17
+ const UNSAFE_WINDOWS_OPEN_EXTENSIONS = new Set([
18
+ '.application',
19
+ '.bat',
20
+ '.cmd',
21
+ '.com',
22
+ '.cpl',
23
+ '.exe',
24
+ '.gadget',
25
+ '.hta',
26
+ '.js',
27
+ '.jse',
28
+ '.lnk',
29
+ '.msc',
30
+ '.msh',
31
+ '.msh1',
32
+ '.msh1xml',
33
+ '.msh2',
34
+ '.msh2xml',
35
+ '.mshxml',
36
+ '.msi',
37
+ '.msp',
38
+ '.pif',
39
+ '.pl',
40
+ '.ps1',
41
+ '.py',
42
+ '.pyw',
43
+ '.reg',
44
+ '.rb',
45
+ '.scf',
46
+ '.scr',
47
+ '.sh',
48
+ '.vb',
49
+ '.vbe',
50
+ '.vbs',
51
+ '.wsf',
52
+ '.wsh'
53
+ ]);
54
+ function hasUnsafeOpenExtension(filePath, platform) {
55
+ const pathApi = platform === 'win32' ? win32 : posix;
56
+ const extension = pathApi.extname(filePath).toLowerCase();
57
+ return (UNSAFE_OPEN_EXTENSIONS.has(extension) ||
58
+ (platform === 'win32' && UNSAFE_WINDOWS_OPEN_EXTENSIONS.has(extension)));
59
+ }
60
+ function isExecutableFile(fileStats, platform) {
61
+ return (platform !== 'win32' &&
62
+ fileStats.isFile() &&
63
+ fileStats.mode !== undefined &&
64
+ (fileStats.mode & 0o111) !== 0);
65
+ }
66
+ /** Validate and open a local file or folder link with the platform default application. */
67
+ export async function openLocalFileLink(href, dependencies = {}) {
68
+ const platform = dependencies.platform ?? process.platform;
69
+ const link = parseLocalFileLink(href, platform);
70
+ if (!link)
71
+ throw new Error('Only absolute local file links can be opened.');
72
+ if (hasUnsafeOpenExtension(link.path, platform)) {
73
+ throw new Error(`Executable applications, scripts, installers, and shortcuts cannot be opened from links: ${link.path}`);
74
+ }
75
+ const fileStats = await (dependencies.statPath ?? lstat)(link.path);
76
+ if (fileStats.isSymbolicLink?.() || (!fileStats.isFile() && !fileStats.isDirectory())) {
77
+ throw new Error(`The link target is not a regular file or folder: ${link.path}`);
78
+ }
79
+ if (isExecutableFile(fileStats, platform)) {
80
+ throw new Error(`Executable files cannot be opened from links: ${link.path}`);
81
+ }
82
+ if (dependencies.openPath) {
83
+ await dependencies.openPath(link.path);
84
+ }
85
+ else {
86
+ await openInEditor(link.path, { directory: fileStats.isDirectory() });
87
+ }
88
+ return { path: link.path };
89
+ }
90
+ //# sourceMappingURL=local-file-opener.js.map
@@ -166,7 +166,6 @@ interface LocalSessionServices {
166
166
  export interface InteractiveSessionClient extends LocalSessionServices {
167
167
  readonly agent: AgentSession['agent'];
168
168
  readonly approvalState: AgentSession['approvalState'];
169
- collabClient: AgentSession['collabClient'];
170
169
  readonly extensionRunner: AgentSession['extensionRunner'];
171
170
  readonly lastPrePromptDetails: AgentSession['lastPrePromptDetails'];
172
171
  readonly messages: AgentSession['messages'];
@@ -52,12 +52,6 @@ function createInteractiveSessionSurface(session) {
52
52
  get approvalState() {
53
53
  return session.approvalState;
54
54
  },
55
- get collabClient() {
56
- return session.collabClient;
57
- },
58
- set collabClient(client) {
59
- session.collabClient = client;
60
- },
61
55
  get extensionRunner() {
62
56
  return session.extensionRunner;
63
57
  },
@@ -0,0 +1,30 @@
1
+ export declare const UPDATE_CHECK_INTERVAL_MS: number;
2
+ interface UpdateCheckSchedulerOptions<T> {
3
+ check: () => Promise<T>;
4
+ onResult: (result: T) => void;
5
+ intervalMs?: number;
6
+ }
7
+ interface UpdateCheckSchedulerDeps {
8
+ now?: () => number;
9
+ setTimer?: typeof setTimeout;
10
+ clearTimer?: typeof clearTimeout;
11
+ }
12
+ /** Schedules one coalesced asynchronous update check at most once per interval. */
13
+ export declare class UpdateCheckScheduler<T> {
14
+ private readonly options;
15
+ private readonly intervalMs;
16
+ private readonly now;
17
+ private readonly setTimer;
18
+ private readonly clearTimer;
19
+ private timer;
20
+ private inFlight;
21
+ private nextCheckAt;
22
+ private stopped;
23
+ constructor(options: UpdateCheckSchedulerOptions<T>, deps?: UpdateCheckSchedulerDeps);
24
+ start(lastCheckedAt?: string): void;
25
+ stop(): void;
26
+ private schedule;
27
+ private runCheck;
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=update-check-scheduler.d.ts.map