interlatch 0.23.0__tar.gz → 0.23.2__tar.gz

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 (331) hide show
  1. {interlatch-0.23.0 → interlatch-0.23.2}/.github/workflows/release.yml +8 -66
  2. {interlatch-0.23.0 → interlatch-0.23.2}/CHANGELOG.md +41 -0
  3. {interlatch-0.23.0 → interlatch-0.23.2}/PKG-INFO +3 -3
  4. {interlatch-0.23.0 → interlatch-0.23.2}/README.ja.md +2 -2
  5. {interlatch-0.23.0 → interlatch-0.23.2}/README.md +2 -2
  6. interlatch-0.23.2/changelog.d/agent-icons.md +3 -0
  7. interlatch-0.23.2/changelog.d/devices-admin-only.md +3 -0
  8. interlatch-0.23.2/changelog.d/windows-polish.md +5 -0
  9. {interlatch-0.23.0 → interlatch-0.23.2}/docs/development.md +2 -3
  10. {interlatch-0.23.0 → interlatch-0.23.2}/docs/devices.md +3 -2
  11. {interlatch-0.23.0 → interlatch-0.23.2}/docs/install.md +12 -5
  12. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/development.md +2 -3
  13. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/devices.md +2 -2
  14. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/install.md +11 -4
  15. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/moving-from-chronicle.md +3 -3
  16. {interlatch-0.23.0 → interlatch-0.23.2}/docs/moving-from-chronicle.md +4 -4
  17. {interlatch-0.23.0 → interlatch-0.23.2}/leaderboard/README.md +9 -5
  18. interlatch-0.23.2/leaderboard/firebase.json +8 -0
  19. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/cli.py +4 -2
  20. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/config.py +11 -3
  21. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/copilot_parser.py +8 -3
  22. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/hub.py +37 -20
  23. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/install.py +2 -0
  24. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/leaderboard.py +3 -2
  25. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/menubar.py +18 -3
  26. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/migrate.py +2 -1
  27. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/notify.py +57 -1
  28. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/people.py +3 -3
  29. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/server.py +55 -28
  30. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/util.py +73 -0
  31. interlatch-0.23.2/src/chronicle/web/AGENT-ICONS.txt +29 -0
  32. interlatch-0.23.2/src/chronicle/web/agent-antigravity.svg +1 -0
  33. interlatch-0.23.2/src/chronicle/web/agent-bob.svg +1 -0
  34. interlatch-0.23.2/src/chronicle/web/agent-chatgpt.svg +1 -0
  35. interlatch-0.23.2/src/chronicle/web/agent-claude-ai.svg +1 -0
  36. interlatch-0.23.2/src/chronicle/web/agent-claude.svg +1 -0
  37. interlatch-0.23.2/src/chronicle/web/agent-codex.svg +1 -0
  38. interlatch-0.23.2/src/chronicle/web/agent-copilot.svg +1 -0
  39. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/app.css +22 -2
  40. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/app.js +48 -6
  41. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/panel.css +5 -0
  42. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/panel.js +7 -2
  43. interlatch-0.23.2/src/chronicle/windows.py +569 -0
  44. interlatch-0.23.2/tests/golden.py +33 -0
  45. interlatch-0.23.2/tests/goldens/cli.json +2786 -0
  46. interlatch-0.23.2/tests/goldens/diagram.json +3077 -0
  47. interlatch-0.23.2/tests/goldens/parsers/antigravity.json +564 -0
  48. interlatch-0.23.2/tests/goldens/parsers/bob.json +604 -0
  49. interlatch-0.23.2/tests/goldens/parsers/claude_code.json +557 -0
  50. interlatch-0.23.2/tests/goldens/parsers/codex.json +1400 -0
  51. interlatch-0.23.2/tests/goldens/parsers/copilot.json +445 -0
  52. interlatch-0.23.2/tests/goldens/systems.json +1019 -0
  53. interlatch-0.23.2/tests/test_cli_pins.py +191 -0
  54. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_hub_projects.py +7 -9
  55. interlatch-0.23.2/tests/test_map_goldens.py +66 -0
  56. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_notify.py +29 -0
  57. interlatch-0.23.2/tests/test_parser_goldens.py +151 -0
  58. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_people_web.py +5 -0
  59. interlatch-0.23.2/tests/test_route_matrix.py +508 -0
  60. interlatch-0.23.2/tests/test_windows.py +465 -0
  61. interlatch-0.23.0/changelog.d/docs-review.md +0 -4
  62. interlatch-0.23.0/changelog.d/interlatch-vscode.md +0 -4
  63. interlatch-0.23.0/changelog.d/leaderboard.md +0 -4
  64. interlatch-0.23.0/changelog.d/move-keeps-commands.md +0 -4
  65. interlatch-0.23.0/changelog.d/restart-animation.md +0 -5
  66. interlatch-0.23.0/changelog.d/vscode-marketplace.md +0 -2
  67. interlatch-0.23.0/changelog.d/windows.md +0 -3
  68. interlatch-0.23.0/leaderboard/firebase.json +0 -23
  69. interlatch-0.23.0/leaderboard/public/signin.html +0 -151
  70. interlatch-0.23.0/packaging/agents-chronicle-farewell/README.md +0 -24
  71. interlatch-0.23.0/packaging/agents-chronicle-farewell/pyproject.toml +0 -42
  72. interlatch-0.23.0/src/chronicle/windows.py +0 -266
  73. interlatch-0.23.0/tests/test_windows.py +0 -203
  74. {interlatch-0.23.0 → interlatch-0.23.2}/.github/dependabot.yml +0 -0
  75. {interlatch-0.23.0 → interlatch-0.23.2}/.github/workflows/changelog.yml +0 -0
  76. {interlatch-0.23.0 → interlatch-0.23.2}/.github/workflows/ci.yml +0 -0
  77. {interlatch-0.23.0 → interlatch-0.23.2}/.github/workflows/docs.yml +0 -0
  78. {interlatch-0.23.0 → interlatch-0.23.2}/.gitignore +0 -0
  79. {interlatch-0.23.0 → interlatch-0.23.2}/.pre-commit-config.yaml +0 -0
  80. {interlatch-0.23.0 → interlatch-0.23.2}/.python-version +0 -0
  81. {interlatch-0.23.0 → interlatch-0.23.2}/CONTRIBUTING.md +0 -0
  82. {interlatch-0.23.0 → interlatch-0.23.2}/LICENSE +0 -0
  83. {interlatch-0.23.0 → interlatch-0.23.2}/ROADMAP.ja.md +0 -0
  84. {interlatch-0.23.0 → interlatch-0.23.2}/ROADMAP.md +0 -0
  85. {interlatch-0.23.0 → interlatch-0.23.2}/SECURITY.md +0 -0
  86. {interlatch-0.23.0 → interlatch-0.23.2}/changelog.d/README.md +0 -0
  87. {interlatch-0.23.0 → interlatch-0.23.2}/dev.sh +0 -0
  88. {interlatch-0.23.0 → interlatch-0.23.2}/docker/.dockerignore +0 -0
  89. {interlatch-0.23.0 → interlatch-0.23.2}/docker/.env.example +0 -0
  90. {interlatch-0.23.0 → interlatch-0.23.2}/docker/Caddyfile +0 -0
  91. {interlatch-0.23.0 → interlatch-0.23.2}/docker/Dockerfile +0 -0
  92. {interlatch-0.23.0 → interlatch-0.23.2}/docker/compose.yaml +0 -0
  93. {interlatch-0.23.0 → interlatch-0.23.2}/docker/wheels/.gitignore +0 -0
  94. {interlatch-0.23.0 → interlatch-0.23.2}/docs/README.md +0 -0
  95. {interlatch-0.23.0 → interlatch-0.23.2}/docs/_site/hooks.py +0 -0
  96. {interlatch-0.23.0 → interlatch-0.23.2}/docs/analysis.md +0 -0
  97. {interlatch-0.23.0 → interlatch-0.23.2}/docs/cli.md +0 -0
  98. {interlatch-0.23.0 → interlatch-0.23.2}/docs/configuration.md +0 -0
  99. {interlatch-0.23.0 → interlatch-0.23.2}/docs/dashboard.md +0 -0
  100. {interlatch-0.23.0 → interlatch-0.23.2}/docs/demo/make_demo.py +0 -0
  101. {interlatch-0.23.0 → interlatch-0.23.2}/docs/demo/record_demo.py +0 -0
  102. {interlatch-0.23.0 → interlatch-0.23.2}/docs/design/ja/learning.md +0 -0
  103. {interlatch-0.23.0 → interlatch-0.23.2}/docs/design/learning.md +0 -0
  104. {interlatch-0.23.0 → interlatch-0.23.2}/docs/diagrams/analysis.excalidraw.svg +0 -0
  105. {interlatch-0.23.0 → interlatch-0.23.2}/docs/diagrams/architecture.excalidraw.svg +0 -0
  106. {interlatch-0.23.0 → interlatch-0.23.2}/docs/docker.md +0 -0
  107. {interlatch-0.23.0 → interlatch-0.23.2}/docs/images/demo.gif +0 -0
  108. {interlatch-0.23.0 → interlatch-0.23.2}/docs/images/home.png +0 -0
  109. {interlatch-0.23.0 → interlatch-0.23.2}/docs/images/map.png +0 -0
  110. {interlatch-0.23.0 → interlatch-0.23.2}/docs/images/palette.png +0 -0
  111. {interlatch-0.23.0 → interlatch-0.23.2}/docs/images/session.png +0 -0
  112. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/README.md +0 -0
  113. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/analysis.md +0 -0
  114. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/cli.md +0 -0
  115. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/configuration.md +0 -0
  116. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/dashboard.md +0 -0
  117. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/docker.md +0 -0
  118. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/join-a-hub.md +0 -0
  119. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/mcp.md +0 -0
  120. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/postgres.md +0 -0
  121. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/privacy.md +0 -0
  122. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/sources.md +0 -0
  123. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/suggestions.md +0 -0
  124. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/troubleshooting.md +0 -0
  125. {interlatch-0.23.0 → interlatch-0.23.2}/docs/ja/vscode.md +0 -0
  126. {interlatch-0.23.0 → interlatch-0.23.2}/docs/join-a-hub.md +0 -0
  127. {interlatch-0.23.0 → interlatch-0.23.2}/docs/mcp.md +0 -0
  128. {interlatch-0.23.0 → interlatch-0.23.2}/docs/postgres.md +0 -0
  129. {interlatch-0.23.0 → interlatch-0.23.2}/docs/privacy.md +0 -0
  130. {interlatch-0.23.0 → interlatch-0.23.2}/docs/sources.md +0 -0
  131. {interlatch-0.23.0 → interlatch-0.23.2}/docs/suggestions.md +0 -0
  132. {interlatch-0.23.0 → interlatch-0.23.2}/docs/troubleshooting.md +0 -0
  133. {interlatch-0.23.0 → interlatch-0.23.2}/docs/vscode.md +0 -0
  134. {interlatch-0.23.0 → interlatch-0.23.2}/leaderboard/.firebaserc +0 -0
  135. {interlatch-0.23.0 → interlatch-0.23.2}/leaderboard/.gitignore +0 -0
  136. {interlatch-0.23.0 → interlatch-0.23.2}/leaderboard/firestore.indexes.json +0 -0
  137. {interlatch-0.23.0 → interlatch-0.23.2}/leaderboard/firestore.rules +0 -0
  138. {interlatch-0.23.0 → interlatch-0.23.2}/mkdocs.yml +0 -0
  139. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/icons3d/README.md +0 -0
  140. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/icons3d/art.json +0 -0
  141. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/icons3d/filing.html +0 -0
  142. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/icons3d/loops.json +0 -0
  143. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/icons3d/loops.py +0 -0
  144. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/icons3d/members.js +0 -0
  145. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/icons3d/render.html +0 -0
  146. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/icons3d/render.py +0 -0
  147. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/icons3d/scenes-more.js +0 -0
  148. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/icons3d/scenes.html +0 -0
  149. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/macos/Chronicle.icns +0 -0
  150. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/macos/Interlatch.spec +0 -0
  151. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/macos/build.sh +0 -0
  152. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/macos/chronicle_app.py +0 -0
  153. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/macos/entitlements.plist +0 -0
  154. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/macos/icon-3d.webp +0 -0
  155. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/macos/icon-blueprint-prompt.md +0 -0
  156. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/macos/icon-blueprint.webp +0 -0
  157. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/macos/icon.png +0 -0
  158. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/macos/make_icon.py +0 -0
  159. {interlatch-0.23.0 → interlatch-0.23.2}/packaging/release.py +0 -0
  160. {interlatch-0.23.0 → interlatch-0.23.2}/pyproject.toml +0 -0
  161. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/__init__.py +0 -0
  162. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/__main__.py +0 -0
  163. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/access.py +0 -0
  164. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/agents.py +0 -0
  165. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/analyze.py +0 -0
  166. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/antigravity_parser.py +0 -0
  167. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/artifacts.py +0 -0
  168. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/bob_parser.py +0 -0
  169. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/cases.py +0 -0
  170. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/chat_import.py +0 -0
  171. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/chatgpt_export.py +0 -0
  172. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/claude_export.py +0 -0
  173. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/codex_cloud.py +0 -0
  174. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/codex_parser.py +0 -0
  175. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/connectors.py +0 -0
  176. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/container.py +0 -0
  177. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/db.py +0 -0
  178. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/desktop.py +0 -0
  179. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/diagram.py +0 -0
  180. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/digest.py +0 -0
  181. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/export_md.py +0 -0
  182. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/friction.py +0 -0
  183. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/glossary.py +0 -0
  184. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/groups.py +0 -0
  185. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/hooks.py +0 -0
  186. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/i18n.py +0 -0
  187. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/i18n_ja.py +0 -0
  188. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/ingest.py +0 -0
  189. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/instructions.py +0 -0
  190. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/ladder.py +0 -0
  191. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/learning.py +0 -0
  192. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/llm.py +0 -0
  193. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/mcp_server.py +0 -0
  194. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/mirror.py +0 -0
  195. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/news.py +0 -0
  196. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/parser.py +0 -0
  197. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/pg.py +0 -0
  198. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/pricing.py +0 -0
  199. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/providers.py +0 -0
  200. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/redact.py +0 -0
  201. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/reviews.py +0 -0
  202. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/screen.py +0 -0
  203. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/search.py +0 -0
  204. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/session_export.py +0 -0
  205. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/statusline.py +0 -0
  206. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/suggest.py +0 -0
  207. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/synthesize.py +0 -0
  208. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/systems.py +0 -0
  209. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/tailnet.py +0 -0
  210. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/team_store.py +0 -0
  211. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/update.py +0 -0
  212. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/views.py +0 -0
  213. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/PLEX-OFL.txt +0 -0
  214. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-book.webp +0 -0
  215. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-camera.webp +0 -0
  216. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-chip.webp +0 -0
  217. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-clock.webp +0 -0
  218. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-cloud.webp +0 -0
  219. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-coins.webp +0 -0
  220. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-container.webp +0 -0
  221. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-dashboard.webp +0 -0
  222. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-dex.webp +0 -0
  223. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-document.webp +0 -0
  224. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-flag.webp +0 -0
  225. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-folder.webp +0 -0
  226. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-gateway.webp +0 -0
  227. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-gears.webp +0 -0
  228. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-glitch.webp +0 -0
  229. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-globe.webp +0 -0
  230. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-laptop.webp +0 -0
  231. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-log.webp +0 -0
  232. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-lumi.webp +0 -0
  233. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-magnifier.webp +0 -0
  234. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-pip.webp +0 -0
  235. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-plug.webp +0 -0
  236. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-rack.webp +0 -0
  237. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/art-tink.webp +0 -0
  238. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/boot.js +0 -0
  239. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/favicon.png +0 -0
  240. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/i18n.js +0 -0
  241. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/icon-180.png +0 -0
  242. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/icon-192.png +0 -0
  243. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/icon-512.png +0 -0
  244. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/icon.png +0 -0
  245. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/index.html +0 -0
  246. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/ja.js +0 -0
  247. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/learning.js +0 -0
  248. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/manifest.webmanifest +0 -0
  249. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/panel.html +0 -0
  250. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/plex-mono-400.woff2 +0 -0
  251. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/plex-mono-500.woff2 +0 -0
  252. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/plex-mono-600.woff2 +0 -0
  253. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/plex-sans-400.woff2 +0 -0
  254. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/plex-sans-500.woff2 +0 -0
  255. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/plex-sans-600.woff2 +0 -0
  256. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/plex-sans-700.woff2 +0 -0
  257. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/web/rough.js +0 -0
  258. {interlatch-0.23.0 → interlatch-0.23.2}/src/chronicle/worker.py +0 -0
  259. {interlatch-0.23.0 → interlatch-0.23.2}/tests/antigravity_fixture.py +0 -0
  260. {interlatch-0.23.0 → interlatch-0.23.2}/tests/codex_fixture.py +0 -0
  261. {interlatch-0.23.0 → interlatch-0.23.2}/tests/conftest.py +0 -0
  262. {interlatch-0.23.0 → interlatch-0.23.2}/tests/copilot_fixture.py +0 -0
  263. {interlatch-0.23.0 → interlatch-0.23.2}/tests/friction_fixture.py +0 -0
  264. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_analysis.py +0 -0
  265. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_antigravity.py +0 -0
  266. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_artifacts.py +0 -0
  267. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_bob_analysis.py +0 -0
  268. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_boot_web.py +0 -0
  269. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_case_files.py +0 -0
  270. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_cases.py +0 -0
  271. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_chat_import.py +0 -0
  272. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_codex.py +0 -0
  273. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_codex_analysis.py +0 -0
  274. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_codex_cloud.py +0 -0
  275. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_container.py +0 -0
  276. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_copilot_bob.py +0 -0
  277. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_dedicated_hub.py +0 -0
  278. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_dedupe.py +0 -0
  279. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_desktop.py +0 -0
  280. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_diagram.py +0 -0
  281. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_ee_boundary.py +0 -0
  282. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_friction.py +0 -0
  283. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_glossary.py +0 -0
  284. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_group_sharing.py +0 -0
  285. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_hub.py +0 -0
  286. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_hub_accept.py +0 -0
  287. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_hub_news.py +0 -0
  288. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_hub_projects_listed.py +0 -0
  289. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_hub_purge.py +0 -0
  290. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_hub_sharing_race.py +0 -0
  291. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_i18n_web.py +0 -0
  292. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_ingest.py +0 -0
  293. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_instructions.py +0 -0
  294. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_integration.py +0 -0
  295. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_ladder.py +0 -0
  296. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_language.py +0 -0
  297. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_leaderboard.py +0 -0
  298. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_learning_glance.py +0 -0
  299. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_learning_interests.py +0 -0
  300. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_learning_web.py +0 -0
  301. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_leave_project.py +0 -0
  302. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_menubar.py +0 -0
  303. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_migrate.py +0 -0
  304. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_mirror.py +0 -0
  305. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_parser.py +0 -0
  306. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_people.py +0 -0
  307. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_people_hub.py +0 -0
  308. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_project_groups.py +0 -0
  309. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_providers.py +0 -0
  310. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_queue.py +0 -0
  311. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_regressions.py +0 -0
  312. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_release.py +0 -0
  313. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_screen.py +0 -0
  314. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_security.py +0 -0
  315. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_setup.py +0 -0
  316. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_statusline.py +0 -0
  317. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_suggest.py +0 -0
  318. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_suggest_cli.py +0 -0
  319. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_systems.py +0 -0
  320. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_team.py +0 -0
  321. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_team_home.py +0 -0
  322. {interlatch-0.23.0 → interlatch-0.23.2}/tests/test_update.py +0 -0
  323. {interlatch-0.23.0 → interlatch-0.23.2}/tests/windows_smoke.py +0 -0
  324. {interlatch-0.23.0 → interlatch-0.23.2}/uv.lock +0 -0
  325. {interlatch-0.23.0 → interlatch-0.23.2}/vscode-extension/.vscodeignore +0 -0
  326. {interlatch-0.23.0 → interlatch-0.23.2}/vscode-extension/LICENSE +0 -0
  327. {interlatch-0.23.0 → interlatch-0.23.2}/vscode-extension/README.md +0 -0
  328. {interlatch-0.23.0 → interlatch-0.23.2}/vscode-extension/extension.js +0 -0
  329. {interlatch-0.23.0 → interlatch-0.23.2}/vscode-extension/media/icon.png +0 -0
  330. {interlatch-0.23.0 → interlatch-0.23.2}/vscode-extension/media/interlatch.svg +0 -0
  331. {interlatch-0.23.0 → interlatch-0.23.2}/vscode-extension/package.json +0 -0
@@ -3,18 +3,17 @@ name: Release
3
3
  # Releasing is one button: Actions → Release → Run workflow on main, and pick patch, minor or major. The version
4
4
  # lives in the git tags (hatch-vcs), so nothing is committed first. The run works out the next version from the
5
5
  # latest vX.Y.Z tag, runs the tests, creates the tag and the GitHub release (its notes are the changelog.d/ files
6
- # added since the previous tag), publishes interlatch to PyPI (trusted publishing, no token) and then agents-chronicle
7
- # at the same version (its name before the rename, which installs interlatch: packaging/agents-chronicle-farewell),
8
- # publishes the hub's image ghcr.io/chatixia-ai/interlatch-hub (docker/, built from that PyPI release; also as
9
- # chronicle-hub, its name before the rename), attaches Interlatch-X.Y.Z-arm64.dmg, publishes the VS Code
10
- # extension when its own version went up (the vscode job says what it needs), and opens a pull request that moves
11
- # those files' lines into CHANGELOG.md under "## X.Y.Z (date)". The next release doesn't wait for that pull request: a
12
- # file merged after the tag is simply new since it.
6
+ # added since the previous tag), publishes interlatch to PyPI (trusted publishing, no token), publishes the hub's
7
+ # image ghcr.io/chatixia-ai/interlatch-hub (docker/, built from that PyPI release; also as chronicle-hub, its name
8
+ # before the rename), attaches Interlatch-X.Y.Z-arm64.dmg, publishes the VS Code extension when its own version went
9
+ # up (the vscode job says what it needs), and opens a pull request that moves those files' lines into CHANGELOG.md
10
+ # under "## X.Y.Z (date)". The next release doesn't wait for that pull request: a file merged after the tag is
11
+ # simply new since it.
13
12
  # "dry run" (the default) runs the tests and keeps the DMG as a workflow artifact, publishing nothing.
14
13
  # Publishing a release tagged vX.Y.Z on GitHub by hand runs the same tests, PyPI and DMG jobs.
15
14
  #
16
- # PyPI takes each package only from the trusted publisher it lists for it: this repository, release.yml and the
17
- # environment pypi, for interlatch and for agents-chronicle alike.
15
+ # PyPI takes interlatch only from the trusted publisher it lists for it: this repository, release.yml and the
16
+ # environment pypi. (agents-chronicle, the name before the rename, is no longer on PyPI.)
18
17
  #
19
18
  # The DMG is signed and notarized when these repository secrets exist, otherwise it is ad-hoc signed:
20
19
  # MACOS_CERT_P12 base64 of the "Developer ID Application" certificate + key (.p12)
@@ -89,8 +88,6 @@ jobs:
89
88
  with:
90
89
  enable-cache: false # a release never restores a cache another run could have written
91
90
  - run: uv run --locked pytest -q
92
- - name: agents-chronicle builds (the farewell job publishes it)
93
- run: uv build --wheel packaging/agents-chronicle-farewell -o "$RUNNER_TEMP/farewell"
94
91
 
95
92
  release:
96
93
  needs: [plan, test]
@@ -144,61 +141,6 @@ jobs:
144
141
  fi
145
142
  - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
146
143
 
147
- farewell:
148
- # agents-chronicle, Interlatch's name before the rename, at the same version: it installs interlatch, so a copy
149
- # installed under that name keeps updating, and one from before the rename (which asks PyPI about agents-chronicle)
150
- # sees the release. Published after interlatch, so it never names a version PyPI doesn't have. It carries the same
151
- # chronicle/ files as interlatch, which pip needs (packaging/agents-chronicle-farewell/pyproject.toml): a wheel only.
152
- needs: [plan, pypi]
153
- if: ${{ !cancelled() && needs.pypi.result == 'success' }}
154
- runs-on: ubuntu-latest
155
- environment: pypi
156
- permissions:
157
- contents: read # checkout
158
- id-token: write # OIDC for PyPI trusted publishing
159
- env:
160
- VERSION: ${{ needs.plan.outputs.version }}
161
- steps:
162
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
163
- with:
164
- ref: v${{ needs.plan.outputs.version }}
165
- persist-credentials: false
166
- - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
167
- with:
168
- enable-cache: false # a release never restores a cache another run could have written
169
- - name: Wait until PyPI serves interlatch
170
- run: |
171
- for _ in $(seq 1 30); do
172
- if python3 -m pip download --quiet --no-deps --no-cache-dir --dest "$RUNNER_TEMP/probe" \
173
- "interlatch==$VERSION"; then
174
- exit 0
175
- fi
176
- sleep 10
177
- done
178
- echo "::error::PyPI does not serve interlatch $VERSION after 5 minutes"
179
- exit 1
180
- - name: Build agents-chronicle at the release's version, pinned to the same interlatch
181
- run: |
182
- sed -i "s/0\.0\.0/$VERSION/g" packaging/agents-chronicle-farewell/pyproject.toml
183
- uv build --wheel packaging/agents-chronicle-farewell -o dist
184
- ls dist
185
- if [ ! -f "dist/agents_chronicle-$VERSION-py3-none-any.whl" ]; then
186
- echo "::error::The build is not version $VERSION"
187
- exit 1
188
- fi
189
- - name: Check it carries the chronicle/ files of the interlatch on PyPI
190
- run: |
191
- python3 - "$RUNNER_TEMP/probe/interlatch-$VERSION-py3-none-any.whl" "dist/agents_chronicle-$VERSION-py3-none-any.whl" <<'EOF'
192
- import sys, zipfile
193
- def files(wheel): # chronicle/ path -> hash, from the wheel's RECORD
194
- z = zipfile.ZipFile(wheel)
195
- record = next(n for n in z.namelist() if n.endswith(".dist-info/RECORD"))
196
- return {r.split(",")[0]: r.split(",")[1] for r in z.read(record).decode().splitlines() if r.startswith("chronicle/")}
197
- if not files(sys.argv[1]) or files(sys.argv[1]) != files(sys.argv[2]):
198
- sys.exit("::error::agents-chronicle's chronicle/ files differ from interlatch's")
199
- EOF
200
- - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
201
-
202
144
  image:
203
145
  needs: [plan, pypi]
204
146
  if: ${{ !cancelled() && needs.pypi.result == 'success' }}
@@ -3,6 +3,47 @@
3
3
  <!-- Don't add lines here: a pull request puts its line in a new file in changelog.d/ (see changelog.d/README.md),
4
4
  and each release moves the files it took into a dated section below. -->
5
5
 
6
+ ## 0.23.1 (2026-10-13)
7
+
8
+ - **`agents-chronicle` is retired:** Interlatch is published only as `interlatch` now, and `agents-chronicle` is no
9
+ longer on PyPI. An install under the old name gets no more updates: **Update** in the dashboard still moves it to
10
+ `interlatch`, or see [Moving from Chronicle](docs/moving-from-chronicle.md) for the commands.
11
+
12
+ ## 0.23.0 (2026-10-13)
13
+
14
+ - **Leaderboard:** sign in with Google and compare your hours of agent time, sessions and tokens over 7, 30 or 90
15
+ days with everyone else who joined, under **Leaderboard** in the dashboard (`interlatch leaderboard` shows where
16
+ you stand). Only the totals from this computer's coding-agent sessions are sent, with your first name (rename it
17
+ any time) and your Google picture. No email, projects, prompts or titles. **Leave** deletes your row.
18
+
19
+ ## 0.22.1 (2026-10-11)
20
+
21
+ This release never reached PyPI (its upload failed after the repository's rename); these changes first shipped
22
+ there in 0.23.0.
23
+
24
+ - **Docs:** the quick links atop the docs home (Docs, 日本語, English) open their pages instead of a 404, Install
25
+ lists every way to analyze sessions (Claude Code, Codex, IBM Bob with a Bob API key, or a model provider's API with
26
+ your own key), and links, **What's new** and **Download** under **Status › Updates** among them, point at the
27
+ repository's new name, [Chatixia-AI/interlatch](https://github.com/Chatixia-AI/interlatch).
28
+ - **Moving from Chronicle keeps the commands:** **Update** on an `agents-chronicle` install no longer leaves it
29
+ without the `interlatch` and `chronicle` commands, which kept the dashboard from coming back and stopped the
30
+ background sync, the session hooks and the MCP server. Already hit by it? [Troubleshooting](docs/troubleshooting.md#moving-from-chronicle)
31
+ has the two commands that put it right.
32
+ - **Restarting, animated:** while the dashboard restarts after an update, its dialog turns the arrows inside a ring
33
+ that swells and fades, with a sweep along its foot (with animations off they turn slowly and the rest holds still).
34
+ The last places that still said Chronicle say Interlatch: the diagrams in the docs, the log file's lines, the
35
+ Postgres quick start, and the names the dashboard and menu-bar panel use for their requests and what the browser
36
+ remembers. Settings a browser kept under the old names carry over, and a sign-in to a hub from before stays valid.
37
+ - **Windows:** `uv tool install interlatch` and `interlatch install` now work on Windows 10 and 11. Task Scheduler runs
38
+ the 15-minute sync and keeps the dashboard up, without a window, and the hooks run in Git Bash and in PowerShell
39
+ ([Windows](docs/install.md#windows)). A Windows computer can't join a team hub yet.
40
+ - **The VS Code extension is now Interlatch:** a new extension, `Chatixia-AI.interlatch` 0.3.0, with the sections
41
+ **Interlatch: This File** and **Interlatch: Files in Workspace**. Your `chronicle.*` settings still apply until you
42
+ set their `interlatch.*` counterparts. Uninstall the Chronicle extension after installing it; Interlatch offers to,
43
+ once ([VS Code extension](docs/vscode.md)).
44
+ - **The VS Code extension on the Marketplace:** install **Interlatch** from VS Code's Extensions view
45
+ ([VS Code extension](docs/vscode.md#install)). Releases publish it whenever its own version goes up.
46
+
6
47
  ## 0.22.0 (2026-10-10)
7
48
 
8
49
  - **Your Chronicle setup moves over by itself:** the first time the dashboard or the background sync starts,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: interlatch
3
- Version: 0.23.0
3
+ Version: 0.23.2
4
4
  Summary: Shared memory for your coding agents: records every session (Claude Code, Codex, Copilot, Bob, Antigravity) locally and keeps what they learned, each lesson linked to the session it came from.
5
5
  Project-URL: Homepage, https://interlatch.com
6
6
  Project-URL: Documentation, https://interlatch.com/docs/
@@ -46,7 +46,7 @@ claude.ai and ChatGPT chats, recorded on your own machine, and every lesson in t
46
46
  <img src="https://img.shields.io/badge/python-3.11%2B-blue" alt="Python 3.11+">
47
47
  <img src="https://img.shields.io/badge/macOS-app%20%2B%20CLI-lightgrey?logo=apple" alt="macOS app and CLI">
48
48
  <a href="https://github.com/Chatixia-AI/interlatch/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="MIT license"></a>
49
- <a href="https://github.com/Chatixia-AI/interlatch/pkgs/container/interlatch-hub"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fipitio%2Fbackage%2Fraw%2Findex%2FChatixia-AI%2Fagents-chronicle%2Finterlatch-hub.json&query=%24.downloads&logo=docker&label=hub%20image%20pulls" alt="Hub Docker image pulls"></a>
49
+ <a href="https://github.com/Chatixia-AI/interlatch/pkgs/container/interlatch-hub"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fipitio%2Fbackage%2Fraw%2Findex%2FChatixia-AI%2Finterlatch%2Finterlatch-hub.json&query=%24.downloads&logo=docker&label=hub%20image%20pulls" alt="Hub Docker image pulls"></a>
50
50
  </p>
51
51
  <p align="center">
52
52
  <a href="https://github.com/Chatixia-AI/interlatch/actions/workflows/ci.yml"><img src="https://github.com/Chatixia-AI/interlatch/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"></a>
@@ -191,7 +191,7 @@ sessions are archived and wait in the analysis queue.
191
191
 
192
192
  **Windows or Linux?** The desktop app is macOS only. On Windows, `uv tool install interlatch` and `interlatch install`
193
193
  work as on a Mac, with Task Scheduler running the sync and the dashboard ([Windows](https://github.com/Chatixia-AI/interlatch/blob/main/docs/install.md#windows)); a
194
- Windows computer can't join a team hub yet. On Linux, `interlatch install` runs the sync and the dashboard
194
+ Windows computer joining a team hub is untested yet. On Linux, `interlatch install` runs the sync and the dashboard
195
195
  as systemd user units, so a Linux box can be the [hub](https://github.com/Chatixia-AI/interlatch/blob/main/docs/devices.md#a-linux-hub) for your other computers. A
196
196
  team's hub also runs [in Docker](https://github.com/Chatixia-AI/interlatch/blob/main/docs/docker.md).
197
197
 
@@ -11,7 +11,7 @@ claude.ai・ChatGPT のチャットを自分のマシンの中で記録し、そ
11
11
  <img src="https://img.shields.io/badge/python-3.11%2B-blue" alt="Python 3.11 以上">
12
12
  <img src="https://img.shields.io/badge/macOS-app%20%2B%20CLI-lightgrey?logo=apple" alt="macOS アプリと CLI">
13
13
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="MIT ライセンス"></a>
14
- <a href="https://github.com/Chatixia-AI/interlatch/pkgs/container/interlatch-hub"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fipitio%2Fbackage%2Fraw%2Findex%2FChatixia-AI%2Fagents-chronicle%2Finterlatch-hub.json&query=%24.downloads&logo=docker&label=hub%20image%20pulls" alt="ハブの Docker イメージの pull 数"></a>
14
+ <a href="https://github.com/Chatixia-AI/interlatch/pkgs/container/interlatch-hub"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fipitio%2Fbackage%2Fraw%2Findex%2FChatixia-AI%2Finterlatch%2Finterlatch-hub.json&query=%24.downloads&logo=docker&label=hub%20image%20pulls" alt="ハブの Docker イメージの pull 数"></a>
15
15
  </p>
16
16
  <p align="center">
17
17
  <a href="https://github.com/Chatixia-AI/interlatch/actions/workflows/ci.yml"><img src="https://github.com/Chatixia-AI/interlatch/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"></a>
@@ -154,7 +154,7 @@ Ollama。**Status › Analysis** または `interlatch config set analysis.backe
154
154
 
155
155
  **Windows や Linux は?** デスクトップアプリは macOS 専用です。Windows では `uv tool install interlatch` と `interlatch install` が
156
156
  Mac と同じように使え、同期とダッシュボードはタスク スケジューラが動かします([Windows](docs/ja/install.md#windows))。
157
- Windows のコンピューターはまだチームのハブに参加できません。Linux では `interlatch install` が同期とダッシュボードを systemd の
157
+ Windows のコンピューターからのチームのハブへの参加はまだ未検証です。Linux では `interlatch install` が同期とダッシュボードを systemd の
158
158
  ユーザーユニットとして動かすので、Linux マシンをほかのコンピューターの[ハブ](docs/ja/devices.md#linux-のハブ)にできます。
159
159
  チームのハブは [Docker](docs/ja/docker.md) でも動かせます。
160
160
 
@@ -11,7 +11,7 @@ claude.ai and ChatGPT chats, recorded on your own machine, and every lesson in t
11
11
  <img src="https://img.shields.io/badge/python-3.11%2B-blue" alt="Python 3.11+">
12
12
  <img src="https://img.shields.io/badge/macOS-app%20%2B%20CLI-lightgrey?logo=apple" alt="macOS app and CLI">
13
13
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="MIT license"></a>
14
- <a href="https://github.com/Chatixia-AI/interlatch/pkgs/container/interlatch-hub"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fipitio%2Fbackage%2Fraw%2Findex%2FChatixia-AI%2Fagents-chronicle%2Finterlatch-hub.json&query=%24.downloads&logo=docker&label=hub%20image%20pulls" alt="Hub Docker image pulls"></a>
14
+ <a href="https://github.com/Chatixia-AI/interlatch/pkgs/container/interlatch-hub"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fipitio%2Fbackage%2Fraw%2Findex%2FChatixia-AI%2Finterlatch%2Finterlatch-hub.json&query=%24.downloads&logo=docker&label=hub%20image%20pulls" alt="Hub Docker image pulls"></a>
15
15
  </p>
16
16
  <p align="center">
17
17
  <a href="https://github.com/Chatixia-AI/interlatch/actions/workflows/ci.yml"><img src="https://github.com/Chatixia-AI/interlatch/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"></a>
@@ -156,7 +156,7 @@ sessions are archived and wait in the analysis queue.
156
156
 
157
157
  **Windows or Linux?** The desktop app is macOS only. On Windows, `uv tool install interlatch` and `interlatch install`
158
158
  work as on a Mac, with Task Scheduler running the sync and the dashboard ([Windows](docs/install.md#windows)); a
159
- Windows computer can't join a team hub yet. On Linux, `interlatch install` runs the sync and the dashboard
159
+ Windows computer joining a team hub is untested yet. On Linux, `interlatch install` runs the sync and the dashboard
160
160
  as systemd user units, so a Linux box can be the [hub](docs/devices.md#a-linux-hub) for your other computers. A
161
161
  team's hub also runs [in Docker](docs/docker.md).
162
162
 
@@ -0,0 +1,3 @@
1
+ - **Agent logos:** the Sessions list and its agent filter, Sources, MCP and the menu-bar panel mark each session and
2
+ source with its agent's own logo (Claude Code, Codex, GitHub Copilot, IBM Bob, Google Antigravity, claude.ai,
3
+ ChatGPT) instead of a colour dot.
@@ -0,0 +1,3 @@
1
+ - **Hub computers stay with admins:** on a hub with people, a member or read-only person no longer receives the hub's
2
+ computers, its team store's database, host and status, or its allowed sign-ins; only admins (and the hub computer
3
+ itself) do.
@@ -0,0 +1,5 @@
1
+ - **Windows polish:** The dashboard can show an Interlatch icon in the notification area (turn on the menu-bar icon
2
+ under **Status › Recording**, or run `interlatch ui --menu-bar`): click it to open the dashboard, right-click for Sync
3
+ Now and Quit, which stops the dashboard until you next sign in. Release notifications show as Windows toasts. The VS
4
+ Code extension's file history and folder list, hub folders and projects, and a person's projects now match Windows
5
+ paths however they're spelled (`C:\work\app`, `c:/work/app`).
@@ -84,9 +84,8 @@ confirm the icon is in the menu bar of every display:
84
84
  ### One-time setup before the first release
85
85
 
86
86
  1. On PyPI, add a *pending publisher* (Account → Publishing): project `interlatch`, owner
87
- `Chatixia-AI`, repository `interlatch`, workflow `release.yml`, environment `pypi`; the project
88
- `agents-chronicle` (the old name, which each release also publishes) needs the same publisher. PyPI matches the
89
- repository by its name, so after renaming the repository, update both publishers there.
87
+ `Chatixia-AI`, repository `interlatch`, workflow `release.yml`, environment `pypi`. PyPI matches the
88
+ repository by its name, so after renaming the repository, update the publisher there.
90
89
  2. In the GitHub repository, create an environment named `pypi` (Settings → Environments).
91
90
  3. To ship a signed, notarized DMG (Apple Developer Program membership): export the *Developer ID Application*
92
91
  certificate with its key as a `.p12`, and add the secrets `MACOS_CERT_P12` (base64 of the file),
@@ -602,5 +602,6 @@ corrupted.
602
602
  your phone, so the hub's tailnet address is out of their reach. Claude Code's Remote Control, from the phone into
603
603
  a session on the hub, does have Interlatch's tools.
604
604
  - **A copy to read offline** on the other computers.
605
- - **A Windows computer in a hub.** Interlatch runs on Windows on its own ([Windows](install.md#windows)), but parts of
606
- the hub expect project folders as `/…` paths.
605
+ - **A Windows computer in a hub.** Interlatch runs on Windows on its own ([Windows](install.md#windows)), and the hub
606
+ matches Windows folders however they're spelled (`C:\work\app`, `c:/work/app`), but joining one from Windows is
607
+ untested.
@@ -117,7 +117,7 @@ launchd agents do not run alongside it (harmless, but redundant).
117
117
 
118
118
  ## Windows
119
119
 
120
- On Windows 10 and 11 Interlatch is the command-line install; there is no desktop app or menu-bar icon. In PowerShell:
120
+ On Windows 10 and 11 Interlatch is the command-line install; there is no desktop app. In PowerShell:
121
121
 
122
122
  ```powershell
123
123
  powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" # uv, if you don't have it yet
@@ -141,13 +141,20 @@ The hooks it adds to Claude Code run `C:/Users/<you>/.local/bin/interlatch.exe h
141
141
  hook in Git Bash, or in PowerShell without Git for Windows, and forward slashes read the same in both. A folder with
142
142
  a space in its name is written in its short form (`C:/Users/ADALOV~1/…`).
143
143
 
144
- Interlatch reads and writes text in UTF-8, as the coding agents write it, whatever language Windows is set to.
144
+ Interlatch reads and writes text in UTF-8, as the coding agents write it, whatever language Windows is set to. It
145
+ matches a Windows path however an agent or VS Code spells it (`C:\work\app`, `c:/work/app`), so the
146
+ [VS Code extension](vscode.md)'s file history and folder list work there too.
147
+
148
+ The **Menu-bar icon** switch under **Settings › Status › Recording** puts Interlatch's icon in the notification area
149
+ (by the clock) while the Dashboard task runs the dashboard; `interlatch ui --menu-bar` shows it from a terminal. Click
150
+ it to open the dashboard, or right-click for **Sync Now** and **Quit Interlatch**. Quit stops the dashboard and the icon
151
+ until you next sign in, run `interlatch install`, or run `interlatch ui`; the Sync task keeps recording. A new
152
+ version's [notification](#updating) (`[updates] notify`) shows as a Windows notification.
145
153
 
146
154
  Not on Windows yet:
147
155
 
148
- - **Joining a team hub.** Parts of the hub expect project folders as `/…` paths, so it is untested from Windows.
149
- - **The VS Code extension's file history,** which looks files up by `/…` paths.
150
- - **Desktop notifications** of a new version, and the menu-bar icon.
156
+ - **Joining a team hub** is untested from Windows: the hub matches Windows folders however they're spelled, but no
157
+ team has run one with a Windows computer yet.
151
158
 
152
159
  ## The menu-bar icon
153
160
 
@@ -84,9 +84,8 @@ GitHub で `v<version>` タグのリリースを手動で公開する方法も
84
84
  ### 最初のリリースの前に一度だけ必要な設定
85
85
 
86
86
  1. PyPI で *pending publisher* を追加します(Account → Publishing):プロジェクト `interlatch`、オーナー
87
- `Chatixia-AI`、リポジトリ `interlatch`、ワークフロー `release.yml`、環境 `pypi`。プロジェクト `agents-chronicle`
88
- (以前の名前で、リリースのたびにこちらも公開します)にも同じパブリッシャーが必要です。PyPI はリポジトリを名前で
89
- 照合するので、リポジトリの名前を変えたら、PyPI 側で両方のパブリッシャーを更新してください。
87
+ `Chatixia-AI`、リポジトリ `interlatch`、ワークフロー `release.yml`、環境 `pypi`。PyPI はリポジトリを名前で
88
+ 照合するので、リポジトリの名前を変えたら、PyPI 側でパブリッシャーを更新してください。
90
89
  2. GitHub リポジトリで `pypi` という名前の環境を作成します(Settings → Environments)。
91
90
  3. 署名・公証済みの DMG を配布するには(Apple Developer Program への加入が必要):*Developer ID Application*
92
91
  証明書を鍵ごと `.p12` として書き出し、シークレット `MACOS_CERT_P12`(ファイルの base64)、
@@ -598,5 +598,5 @@ sudo tailscale set --operator=$USER # `interlatch tailnet on` が Tailscale
598
598
  接続するので、ハブの tailnet 内のアドレスには届きません。スマートフォンから Claude Code の Remote Control でハブのセッションを
599
599
  操作すれば、Interlatch のツールを使えます。
600
600
  - **ほかのコンピューターでオフラインで読めるコピー。**
601
- - **ハブに参加する Windows のコンピューター。** Interlatch は Windows 単体では動きます([Windows](install.md#windows))が、
602
- ハブの一部はプロジェクトのフォルダーを `/…` 形式のパスとして扱います。
601
+ - **ハブに参加する Windows のコンピューター。** Interlatch は Windows 単体では動き([Windows](install.md#windows))、
602
+ ハブは Windows のフォルダーを書き方(`C:\work\app`、`c:/work/app`)にかかわらず照合しますが、Windows からの参加は未検証です。
@@ -113,7 +113,7 @@ Claude Code と Mac 本体には、次の 4 つを設定します(それぞれ
113
113
 
114
114
  ## Windows
115
115
 
116
- Windows 10 と 11 では、Interlatch はコマンドライン版を使います。デスクトップアプリとメニューバーアイコンはありません。PowerShell で:
116
+ Windows 10 と 11 では、Interlatch はコマンドライン版を使います。デスクトップアプリはありません。PowerShell で:
117
117
 
118
118
  ```powershell
119
119
  powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" # uv, if you don't have it yet
@@ -138,12 +138,19 @@ Claude Code に追加するフックは `C:/Users/<you>/.local/bin/interlatch.ex
138
138
  名前に空白を含むフォルダーは短い形式(`C:/Users/ADALOV~1/…`)で書きます。
139
139
 
140
140
  Interlatch は、Windows の表示言語にかかわらず、コーディングエージェントが書くのと同じ UTF-8 でテキストを読み書きします。
141
+ Windows のパスは、エージェントや VS Code の書き方(`C:\work\app`、`c:/work/app`)にかかわらず同じものとして扱うので、
142
+ [VS Code 拡張](vscode.md)のファイル履歴とフォルダーの一覧も使えます。
143
+
144
+ **Settings › Status › Recording** の **Menu-bar icon** スイッチをオンにすると、Dashboard タスクがダッシュボードを動かしている間、
145
+ 通知領域(時計の横)に Interlatch のアイコンが出ます。ターミナルからは `interlatch ui --menu-bar` で表示できます。クリックで
146
+ ダッシュボードを開き、右クリックで **Sync Now** と **Quit Interlatch** を選べます。Quit すると、次にサインインするか、
147
+ `interlatch install` か `interlatch ui` を実行するまで、ダッシュボードとアイコンは止まります(Sync タスクは記録を続けます)。
148
+ 新しいバージョンの[通知](#アップデート)(`[updates] notify`)は Windows の通知として表示されます。
141
149
 
142
150
  Windows ではまだできないこと:
143
151
 
144
- - **チームのハブへの参加。** ハブの一部はプロジェクトのフォルダーを `/…` 形式のパスとして扱うため、Windows からは未検証です。
145
- - **VS Code 拡張のファイル履歴。** ファイルを `/…` 形式のパスで探します。
146
- - 新しいバージョンの**デスクトップ通知**と、メニューバーアイコン。
152
+ - **チームのハブへの参加**は Windows から未検証です。ハブは Windows のフォルダーを書き方にかかわらず照合しますが、
153
+ Windows のコンピューターを含むチームではまだ運用されていません。
147
154
 
148
155
  ## メニューバーアイコン
149
156
 
@@ -17,9 +17,9 @@ uv tool uninstall agents-chronicle
17
17
  uv tool install --python 3.13 'interlatch[app]' # デスクトップアプリが不要なら interlatch だけ
18
18
  ```
19
19
 
20
- pipx では `pipx uninstall agents-chronicle` のあとに `pipx install interlatch` です。切り替えるまでは
21
- `uv tool upgrade agents-chronicle` もそのまま使えます。最後の `agents-chronicle` のリリースが Interlatch をインストールし、
22
- 両方のコマンドを残します。チェックアウトや git の URL からのインストールは、ボタンでは切り替わりません。
20
+ pipx では `pipx uninstall agents-chronicle` のあとに `pipx install interlatch` です。`agents-chronicle` は
21
+ PyPI からなくなったので、`uv tool upgrade agents-chronicle` では何も更新されず、名前が変わる前のバージョンには
22
+ 新しいリリースが通知されません。上のコマンドで切り替えてください。チェックアウトや git の URL からのインストールは、ボタンでは切り替わりません。
23
23
  アンインストールしてから、同じ方法で `interlatch` をインストールしてください。
24
24
 
25
25
  **デスクトップアプリの場合:** [最新リリース](https://github.com/Chatixia-AI/interlatch/releases/latest)から
@@ -17,10 +17,10 @@ uv tool uninstall agents-chronicle
17
17
  uv tool install --python 3.13 'interlatch[app]' # or plain interlatch, without the desktop app
18
18
  ```
19
19
 
20
- With pipx it is `pipx uninstall agents-chronicle`, then `pipx install interlatch`. Until you switch,
21
- `uv tool upgrade agents-chronicle` keeps working: the last `agents-chronicle` release installs Interlatch and keeps
22
- both commands. An install from a checkout or a git URL is not switched by the button: uninstall it and install
23
- `interlatch` the same way.
20
+ With pipx it is `pipx uninstall agents-chronicle`, then `pipx install interlatch`. `agents-chronicle` is no longer
21
+ on PyPI, so `uv tool upgrade agents-chronicle` gets nothing new, and a version from before the rename doesn't hear of
22
+ new releases: switch with the commands above. An install from a checkout or a git URL is not switched by the button:
23
+ uninstall it and install `interlatch` the same way.
24
24
 
25
25
  **The desktop app:** download `Interlatch-<version>-arm64.dmg` from the
26
26
  [latest release](https://github.com/Chatixia-AI/interlatch/releases/latest), drag **Interlatch** into
@@ -7,11 +7,15 @@ over REST.
7
7
  - `firestore.rules`: anyone may read the board (100 rows per query at most). A signed-in Google (or GitHub) user may
8
8
  write only their own row, `players/{uid}`, with a fixed set of bounded fields and `at` set to the server time. Their
9
9
  provider id must be the one in the sign-in token.
10
- - `public/signin.html`, served at `https://interlatch.firebaseapp.com/signin.html`: the dashboard opens it with its own
11
- loopback address and a one-time state. It signs in with Google through Firebase Auth (in memory only), then goes
12
- back to that dashboard with the refresh token in the URL fragment. The dashboard keeps the token only if the state
13
- matches the one it made. The page accepts only `http://127.0.0.1`, `localhost` or `[::1]` as the address to return to.
14
- - Deploy both from this folder: `firebase deploy --only firestore:rules,hosting`.
10
+ - The sign-in page, `https://interlatch.firebaseapp.com/signin.html`, lives in
11
+ [Chatixia-AI/chronicle-site](https://github.com/Chatixia-AI/chronicle-site) (`public/signin.html`). interlatch.com is
12
+ served from the same Firebase Hosting site, and a Hosting deploy replaces the whole site, so only that repository
13
+ deploys Hosting. The dashboard opens the page with its own loopback address and a one-time state. The page signs in
14
+ with Google through Firebase Auth (in memory only), then goes back to that dashboard with the refresh token in the
15
+ URL fragment. The dashboard keeps the token only if the state matches the one it made. The page accepts only
16
+ `http://127.0.0.1`, `localhost` or `[::1]` as the address to return to.
17
+ - Deploy the rules from this folder: `firebase deploy --only firestore`. Never deploy Hosting from here: it would
18
+ replace interlatch.com with nothing.
15
19
 
16
20
  Setup that lives outside this repository: Google is turned on under Authentication › Sign-in method. Firebase creates
17
21
  the OAuth client itself, and `interlatch.firebaseapp.com` is an authorized domain by default. The web app
@@ -0,0 +1,8 @@
1
+ {
2
+ "firestore": {
3
+ "rules": "firestore.rules",
4
+ "indexes": "firestore.indexes.json",
5
+ "database": "(default)",
6
+ "location": "asia-northeast1"
7
+ }
8
+ }
@@ -2364,6 +2364,7 @@ def _hub_leave_project(cfg, console, args) -> int:
2364
2364
  from pathlib import Path
2365
2365
 
2366
2366
  from . import hub
2367
+ from .util import normalize_project_path
2367
2368
 
2368
2369
  if not cfg.is_spoke:
2369
2370
  console.print("This computer has not joined a hub.")
@@ -2376,14 +2377,15 @@ def _hub_leave_project(cfg, console, args) -> int:
2376
2377
  known = hub.handshake(cfg).get("projects") or []
2377
2378
  except hub.HubError:
2378
2379
  known = (hub.last_folders(cfg) or {}).get("projects") or []
2379
- known += [{"path": x, "name": Path(x).name} for x in cfg.hub_left if x not in {k["path"] for k in known}]
2380
+ known += [{"path": x, "name": Path(x).name} for x in cfg.hub_left
2381
+ if x not in {normalize_project_path(k.get("path")) for k in known}]
2380
2382
  project, problem = _pick_project(known, wanted)
2381
2383
  if problem:
2382
2384
  console.print(problem, highlight=False)
2383
2385
  return 1
2384
2386
  name = project.get("name") or Path(project["path"]).name
2385
2387
  if args.action == "rejoin":
2386
- if project["path"] not in cfg.hub_left:
2388
+ if normalize_project_path(project["path"]) not in cfg.hub_left:
2387
2389
  console.print(f"This computer hasn't left {name}.", highlight=False)
2388
2390
  return 0
2389
2391
  cfg = hub.rejoin_project(cfg, project["path"])
@@ -11,6 +11,8 @@ from collections.abc import Mapping
11
11
  from dataclasses import dataclass, field
12
12
  from pathlib import Path
13
13
 
14
+ from .util import is_abs_path, normalize_project_path, path_kind
15
+
14
16
  DEFAULT_CONFIG_TOML = """\
15
17
  # Interlatch configuration.
16
18
  # Edit freely; changes apply on the next sync / worker run.
@@ -441,6 +443,12 @@ def _pick(cls, values: dict):
441
443
  return cls(**{k: v for k, v in values.items() if k in allowed})
442
444
 
443
445
 
446
+ def _map_path(path: str) -> str:
447
+ """A [hub] path_map side: a Windows folder as normalize_project_path spells it; a POSIX one without a trailing /
448
+ ("/" becomes "", which maps every path)."""
449
+ return normalize_project_path(path) if path_kind(path) in ("drive", "unc") else path.rstrip("/")
450
+
451
+
444
452
  def load_config(home: Path | None = None, *, create: bool = True) -> Config:
445
453
  home = (home or chronicle_home()).expanduser()
446
454
  path = home / "config.toml"
@@ -498,12 +506,12 @@ def load_config(home: Path | None = None, *, create: bool = True) -> Config:
498
506
  server_menu_bar=bool(server.get("menu_bar", False)),
499
507
  server_trusted_proxies=[str(x).strip() for x in server.get("trusted_proxies", ["127.0.0.1", "::1"]) or [] if str(x).strip()],
500
508
  hub_url=str(hub.get("url") or "").strip().rstrip("/"),
501
- hub_path_map={str(k).rstrip("/"): str(v).rstrip("/") for k, v in path_map.items()} if isinstance(path_map, dict) else {},
502
- hub_folders={str(Path(str(k)).expanduser()).rstrip("/") or "/": str(v).rstrip("/") for k, v in folders.items()
509
+ hub_path_map={_map_path(str(k)): _map_path(str(v)) for k, v in path_map.items()} if isinstance(path_map, dict) else {},
510
+ hub_folders={normalize_project_path(str(Path(str(k)).expanduser())): normalize_project_path(str(v)) for k, v in folders.items()
503
511
  if str(k).strip() and str(v).strip()} if isinstance(folders, dict) else {},
504
512
  hub_share=share if share in SHARE_MODES else "everything",
505
513
  hub_all_folders=hub.get("all_folders") is True, # only an explicit true shares every folder
506
- hub_left=sorted({str(x).rstrip("/") for x in hub.get("left") or [] if str(x).startswith("/")})
514
+ hub_left=sorted({normalize_project_path(str(x)) for x in hub.get("left") or [] if is_abs_path(str(x))})
507
515
  if isinstance(hub.get("left"), list) else [],
508
516
  hub_accept="everything" if accept == "everything" else "knowledge", # a typo never lets transcripts in
509
517
  hub_store=store if store in STORES else "",
@@ -47,12 +47,17 @@ def shift_iso(ts: str | None, ms: float) -> str | None:
47
47
  return (dt + timedelta(milliseconds=ms)).isoformat(timespec="milliseconds").replace("+00:00", "Z") if dt else ts
48
48
 
49
49
 
50
+ _URI_DRIVE = re.compile(r"/[A-Za-z]:(?:/|$)") # a Windows drive as a URI's path spells it
51
+
52
+
50
53
  def uri_path(uri) -> str | None:
51
- """file:///Users/x or a VS Code URI object -> /Users/x."""
54
+ """file:///Users/x or a VS Code URI object -> /Users/x. On Windows file:///c%3A/x -> c:/x, not /c:/x."""
52
55
  if isinstance(uri, dict):
53
- return uri.get("fsPath") or uri.get("path")
56
+ p = uri.get("fsPath") or uri.get("path")
57
+ return p[1:] if isinstance(p, str) and _URI_DRIVE.match(p) else p
54
58
  if isinstance(uri, str) and uri.startswith("file:"):
55
- return unquote(urlparse(uri).path) or None
59
+ p = unquote(urlparse(uri).path)
60
+ return (p[1:] if _URI_DRIVE.match(p) else p) or None
56
61
  if isinstance(uri, str) and uri.startswith("vscode-remote:"): # vscode-remote://ssh-remote+host/path -> host:/path
57
62
  u = urlparse(uri)
58
63
  host = unquote(u.netloc).split("+", 1)[-1]