interlatch 0.28.7__tar.gz → 0.28.8__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 (519) hide show
  1. {interlatch-0.28.7 → interlatch-0.28.8}/CHANGELOG.md +24 -0
  2. {interlatch-0.28.7 → interlatch-0.28.8}/PKG-INFO +1 -1
  3. interlatch-0.28.8/changelog.d/signin-page-design.md +3 -0
  4. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/i18n/ja.py +2 -2
  5. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/handler.py +46 -16
  6. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/app.css +12 -0
  7. interlatch-0.28.8/src/interlatch/web/signin.js +28 -0
  8. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_i18n_web.py +1 -1
  9. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_mcp_resume.py +4 -0
  10. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_people_web.py +9 -4
  11. interlatch-0.28.7/changelog.d/doctor-agents.md +0 -4
  12. interlatch-0.28.7/changelog.d/feedback.md +0 -5
  13. interlatch-0.28.7/changelog.d/knowledge-freshness.md +0 -4
  14. interlatch-0.28.7/changelog.d/mcp-resume.md +0 -4
  15. interlatch-0.28.7/changelog.d/session-start-budget.md +0 -4
  16. {interlatch-0.28.7 → interlatch-0.28.8}/.github/dependabot.yml +0 -0
  17. {interlatch-0.28.7 → interlatch-0.28.8}/.github/windows-ja-qa/driver.ps1 +0 -0
  18. {interlatch-0.28.7 → interlatch-0.28.8}/.github/windows-ja-qa/ja_check.py +0 -0
  19. {interlatch-0.28.7 → interlatch-0.28.8}/.github/windows-ja-qa/report.py +0 -0
  20. {interlatch-0.28.7 → interlatch-0.28.8}/.github/windows-ja-qa/shots.py +0 -0
  21. {interlatch-0.28.7 → interlatch-0.28.8}/.github/windows-ja-qa/user.ps1 +0 -0
  22. {interlatch-0.28.7 → interlatch-0.28.8}/.github/workflows/changelog.yml +0 -0
  23. {interlatch-0.28.7 → interlatch-0.28.8}/.github/workflows/ci.yml +0 -0
  24. {interlatch-0.28.7 → interlatch-0.28.8}/.github/workflows/docs.yml +0 -0
  25. {interlatch-0.28.7 → interlatch-0.28.8}/.github/workflows/release.yml +0 -0
  26. {interlatch-0.28.7 → interlatch-0.28.8}/.github/workflows/windows-ja-qa.yml +0 -0
  27. {interlatch-0.28.7 → interlatch-0.28.8}/.gitignore +0 -0
  28. {interlatch-0.28.7 → interlatch-0.28.8}/.pre-commit-config.yaml +0 -0
  29. {interlatch-0.28.7 → interlatch-0.28.8}/.python-version +0 -0
  30. {interlatch-0.28.7 → interlatch-0.28.8}/CONTRIBUTING.md +0 -0
  31. {interlatch-0.28.7 → interlatch-0.28.8}/LICENSE +0 -0
  32. {interlatch-0.28.7 → interlatch-0.28.8}/README.ja.md +0 -0
  33. {interlatch-0.28.7 → interlatch-0.28.8}/README.md +0 -0
  34. {interlatch-0.28.7 → interlatch-0.28.8}/ROADMAP.ja.md +0 -0
  35. {interlatch-0.28.7 → interlatch-0.28.8}/ROADMAP.md +0 -0
  36. {interlatch-0.28.7 → interlatch-0.28.8}/SECURITY.md +0 -0
  37. {interlatch-0.28.7 → interlatch-0.28.8}/careers/README.md +0 -0
  38. {interlatch-0.28.7 → interlatch-0.28.8}/careers/boards.json +0 -0
  39. {interlatch-0.28.7 → interlatch-0.28.8}/careers/pipeline.py +0 -0
  40. {interlatch-0.28.7 → interlatch-0.28.8}/changelog.d/README.md +0 -0
  41. {interlatch-0.28.7 → interlatch-0.28.8}/dev.sh +0 -0
  42. {interlatch-0.28.7 → interlatch-0.28.8}/docker/.dockerignore +0 -0
  43. {interlatch-0.28.7 → interlatch-0.28.8}/docker/.env.example +0 -0
  44. {interlatch-0.28.7 → interlatch-0.28.8}/docker/Caddyfile +0 -0
  45. {interlatch-0.28.7 → interlatch-0.28.8}/docker/Dockerfile +0 -0
  46. {interlatch-0.28.7 → interlatch-0.28.8}/docker/compose.yaml +0 -0
  47. {interlatch-0.28.7 → interlatch-0.28.8}/docker/wheels/.gitignore +0 -0
  48. {interlatch-0.28.7 → interlatch-0.28.8}/docs/README.md +0 -0
  49. {interlatch-0.28.7 → interlatch-0.28.8}/docs/_site/hooks.py +0 -0
  50. {interlatch-0.28.7 → interlatch-0.28.8}/docs/analysis.md +0 -0
  51. {interlatch-0.28.7 → interlatch-0.28.8}/docs/cli.md +0 -0
  52. {interlatch-0.28.7 → interlatch-0.28.8}/docs/configuration.md +0 -0
  53. {interlatch-0.28.7 → interlatch-0.28.8}/docs/dashboard.md +0 -0
  54. {interlatch-0.28.7 → interlatch-0.28.8}/docs/demo/make_demo.py +0 -0
  55. {interlatch-0.28.7 → interlatch-0.28.8}/docs/demo/record_demo.py +0 -0
  56. {interlatch-0.28.7 → interlatch-0.28.8}/docs/design/innerlatch.md +0 -0
  57. {interlatch-0.28.7 → interlatch-0.28.8}/docs/design/ja/innerlatch.md +0 -0
  58. {interlatch-0.28.7 → interlatch-0.28.8}/docs/design/ja/learning.md +0 -0
  59. {interlatch-0.28.7 → interlatch-0.28.8}/docs/design/learning.md +0 -0
  60. {interlatch-0.28.7 → interlatch-0.28.8}/docs/development.md +0 -0
  61. {interlatch-0.28.7 → interlatch-0.28.8}/docs/devices.md +0 -0
  62. {interlatch-0.28.7 → interlatch-0.28.8}/docs/diagrams/analysis.excalidraw.svg +0 -0
  63. {interlatch-0.28.7 → interlatch-0.28.8}/docs/diagrams/architecture.excalidraw.svg +0 -0
  64. {interlatch-0.28.7 → interlatch-0.28.8}/docs/docker.md +0 -0
  65. {interlatch-0.28.7 → interlatch-0.28.8}/docs/faq.md +0 -0
  66. {interlatch-0.28.7 → interlatch-0.28.8}/docs/images/demo.gif +0 -0
  67. {interlatch-0.28.7 → interlatch-0.28.8}/docs/images/home.png +0 -0
  68. {interlatch-0.28.7 → interlatch-0.28.8}/docs/images/map.png +0 -0
  69. {interlatch-0.28.7 → interlatch-0.28.8}/docs/images/palette.png +0 -0
  70. {interlatch-0.28.7 → interlatch-0.28.8}/docs/images/session.png +0 -0
  71. {interlatch-0.28.7 → interlatch-0.28.8}/docs/install.md +0 -0
  72. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/README.md +0 -0
  73. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/analysis.md +0 -0
  74. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/cli.md +0 -0
  75. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/configuration.md +0 -0
  76. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/dashboard.md +0 -0
  77. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/development.md +0 -0
  78. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/devices.md +0 -0
  79. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/docker.md +0 -0
  80. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/faq.md +0 -0
  81. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/install.md +0 -0
  82. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/join-a-hub.md +0 -0
  83. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/mcp.md +0 -0
  84. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/moving-from-chronicle.md +0 -0
  85. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/party.md +0 -0
  86. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/postgres.md +0 -0
  87. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/privacy.md +0 -0
  88. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/profiles.md +0 -0
  89. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/sources.md +0 -0
  90. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/suggestions.md +0 -0
  91. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/troubleshooting.md +0 -0
  92. {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/vscode.md +0 -0
  93. {interlatch-0.28.7 → interlatch-0.28.8}/docs/join-a-hub.md +0 -0
  94. {interlatch-0.28.7 → interlatch-0.28.8}/docs/mcp.md +0 -0
  95. {interlatch-0.28.7 → interlatch-0.28.8}/docs/moving-from-chronicle.md +0 -0
  96. {interlatch-0.28.7 → interlatch-0.28.8}/docs/party.md +0 -0
  97. {interlatch-0.28.7 → interlatch-0.28.8}/docs/postgres.md +0 -0
  98. {interlatch-0.28.7 → interlatch-0.28.8}/docs/privacy.md +0 -0
  99. {interlatch-0.28.7 → interlatch-0.28.8}/docs/profiles.md +0 -0
  100. {interlatch-0.28.7 → interlatch-0.28.8}/docs/sources.md +0 -0
  101. {interlatch-0.28.7 → interlatch-0.28.8}/docs/suggestions.md +0 -0
  102. {interlatch-0.28.7 → interlatch-0.28.8}/docs/troubleshooting.md +0 -0
  103. {interlatch-0.28.7 → interlatch-0.28.8}/docs/vscode.md +0 -0
  104. {interlatch-0.28.7 → interlatch-0.28.8}/leaderboard/.firebaserc +0 -0
  105. {interlatch-0.28.7 → interlatch-0.28.8}/leaderboard/.gitignore +0 -0
  106. {interlatch-0.28.7 → interlatch-0.28.8}/leaderboard/README.md +0 -0
  107. {interlatch-0.28.7 → interlatch-0.28.8}/leaderboard/firebase.json +0 -0
  108. {interlatch-0.28.7 → interlatch-0.28.8}/leaderboard/firestore.indexes.json +0 -0
  109. {interlatch-0.28.7 → interlatch-0.28.8}/leaderboard/firestore.rules +0 -0
  110. {interlatch-0.28.7 → interlatch-0.28.8}/mkdocs.yml +0 -0
  111. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/README.md +0 -0
  112. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/art.json +0 -0
  113. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/filing.html +0 -0
  114. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/loops.json +0 -0
  115. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/loops.py +0 -0
  116. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/members.js +0 -0
  117. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/render.html +0 -0
  118. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/render.py +0 -0
  119. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/scenes-more.js +0 -0
  120. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/scenes.html +0 -0
  121. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/Chronicle.icns +0 -0
  122. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/Interlatch.spec +0 -0
  123. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/build.sh +0 -0
  124. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/entitlements.plist +0 -0
  125. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/icon-3d.webp +0 -0
  126. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/icon-blueprint-prompt.md +0 -0
  127. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/icon-blueprint.webp +0 -0
  128. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/icon.png +0 -0
  129. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/interlatch_app.py +0 -0
  130. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/make_icon.py +0 -0
  131. {interlatch-0.28.7 → interlatch-0.28.8}/packaging/release.py +0 -0
  132. {interlatch-0.28.7 → interlatch-0.28.8}/pyproject.toml +0 -0
  133. {interlatch-0.28.7 → interlatch-0.28.8}/src/chronicle/__init__.py +0 -0
  134. {interlatch-0.28.7 → interlatch-0.28.8}/src/chronicle/__main__.py +0 -0
  135. {interlatch-0.28.7 → interlatch-0.28.8}/src/chronicle/windows.py +0 -0
  136. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/__init__.py +0 -0
  137. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/__main__.py +0 -0
  138. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/__init__.py +0 -0
  139. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/digest.py +0 -0
  140. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/language.py +0 -0
  141. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/queue.py +0 -0
  142. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/__init__.py +0 -0
  143. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/api.py +0 -0
  144. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/base.py +0 -0
  145. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/bob.py +0 -0
  146. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/claude.py +0 -0
  147. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/codex.py +0 -0
  148. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/factory.py +0 -0
  149. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/off.py +0 -0
  150. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/opencode.py +0 -0
  151. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/process.py +0 -0
  152. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/replies.py +0 -0
  153. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/settings.py +0 -0
  154. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/screen.py +0 -0
  155. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/session.py +0 -0
  156. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/worker.py +0 -0
  157. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/application/__init__.py +0 -0
  158. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/application/profiles.py +0 -0
  159. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/application/records.py +0 -0
  160. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/application/search.py +0 -0
  161. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/application/workflows.py +0 -0
  162. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/artifacts/__init__.py +0 -0
  163. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/artifacts/files.py +0 -0
  164. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/artifacts/queries.py +0 -0
  165. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/cli.py +0 -0
  166. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/__init__.py +0 -0
  167. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/agents.py +0 -0
  168. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/artifact_records.py +0 -0
  169. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/budget.py +0 -0
  170. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/config.py +0 -0
  171. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/diagrams.py +0 -0
  172. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/i18n/__init__.py +0 -0
  173. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/machine.py +0 -0
  174. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/paths.py +0 -0
  175. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/pricing.py +0 -0
  176. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/process.py +0 -0
  177. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/profiles.py +0 -0
  178. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/redact.py +0 -0
  179. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/sessions.py +0 -0
  180. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/util.py +0 -0
  181. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/__init__.py +0 -0
  182. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/analyses.py +0 -0
  183. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/archive.py +0 -0
  184. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/chat_import.py +0 -0
  185. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/deletion.py +0 -0
  186. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/history.py +0 -0
  187. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/memory.py +0 -0
  188. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/persistence.py +0 -0
  189. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/report.py +0 -0
  190. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/service.py +0 -0
  191. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/__init__.py +0 -0
  192. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/__init__.py +0 -0
  193. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/__init__.py +0 -0
  194. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/archive.py +0 -0
  195. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/hubs.py +0 -0
  196. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/knowledge.py +0 -0
  197. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/operations.py +0 -0
  198. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/recording.py +0 -0
  199. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/setup.py +0 -0
  200. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/sharing.py +0 -0
  201. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/common.py +0 -0
  202. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/main.py +0 -0
  203. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/parser.py +0 -0
  204. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/exports/__init__.py +0 -0
  205. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/exports/diagrams.py +0 -0
  206. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/exports/markdown.py +0 -0
  207. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/exports/sessions.py +0 -0
  208. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/exports/vault.py +0 -0
  209. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/mcp.py +0 -0
  210. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/__init__.py +0 -0
  211. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/__init__.py +0 -0
  212. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/artifacts.py +0 -0
  213. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/common.py +0 -0
  214. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/devices.py +0 -0
  215. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/hub_admin.py +0 -0
  216. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/hubs.py +0 -0
  217. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/knowledge.py +0 -0
  218. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/leaderboard.py +0 -0
  219. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/party.py +0 -0
  220. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/projects.py +0 -0
  221. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/sessions.py +0 -0
  222. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/settings.py +0 -0
  223. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/sources.py +0 -0
  224. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/status.py +0 -0
  225. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/storage.py +0 -0
  226. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/team.py +0 -0
  227. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/app.py +0 -0
  228. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/assets.py +0 -0
  229. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/context.py +0 -0
  230. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/jobs.py +0 -0
  231. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/routes.py +0 -0
  232. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/server.py +0 -0
  233. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/__init__.py +0 -0
  234. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/arena.py +0 -0
  235. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/bag.py +0 -0
  236. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/cases.py +0 -0
  237. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/formation.py +0 -0
  238. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/freshness.py +0 -0
  239. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/friction.py +0 -0
  240. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/glossary.py +0 -0
  241. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/group_graph.py +0 -0
  242. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/instructions.py +0 -0
  243. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/ladder.py +0 -0
  244. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/learning.py +0 -0
  245. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/market.json +0 -0
  246. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/party.py +0 -0
  247. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/reviews.py +0 -0
  248. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/roadmap.json +0 -0
  249. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/study.py +0 -0
  250. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/suggest.py +0 -0
  251. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/synthesize.py +0 -0
  252. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/weekly.py +0 -0
  253. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/__init__.py +0 -0
  254. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/groups.py +0 -0
  255. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/hubgroups.py +0 -0
  256. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/labels.py +0 -0
  257. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/owners.py +0 -0
  258. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/progress.py +0 -0
  259. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/resume.py +0 -0
  260. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/routing.py +0 -0
  261. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/scope.py +0 -0
  262. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/systems.py +0 -0
  263. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/__init__.py +0 -0
  264. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/connectors.py +0 -0
  265. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/container.py +0 -0
  266. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/feedback.py +0 -0
  267. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/hooks.py +0 -0
  268. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/install.py +0 -0
  269. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/migrate.py +0 -0
  270. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/notify.py +0 -0
  271. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/platforms/__init__.py +0 -0
  272. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/platforms/desktop.py +0 -0
  273. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/platforms/menubar.py +0 -0
  274. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/platforms/windows.py +0 -0
  275. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/statusline.py +0 -0
  276. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/tailnet.py +0 -0
  277. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/update.py +0 -0
  278. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/__init__.py +0 -0
  279. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/access.py +0 -0
  280. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/arena.py +0 -0
  281. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/client.py +0 -0
  282. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/identity.py +0 -0
  283. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/leaderboard.py +0 -0
  284. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/market.py +0 -0
  285. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/membership.py +0 -0
  286. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/news.py +0 -0
  287. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/people.py +0 -0
  288. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/projects.py +0 -0
  289. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/protocol.py +0 -0
  290. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/pull.py +0 -0
  291. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/push.py +0 -0
  292. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/receiver.py +0 -0
  293. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/__init__.py +0 -0
  294. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/antigravity.py +0 -0
  295. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/bob.py +0 -0
  296. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/builder.py +0 -0
  297. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/chatgpt.py +0 -0
  298. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/chats.py +0 -0
  299. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/claude/__init__.py +0 -0
  300. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/claude/export.py +0 -0
  301. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/claude/files.py +0 -0
  302. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/claude/parser.py +0 -0
  303. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/codex/__init__.py +0 -0
  304. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/codex/cloud.py +0 -0
  305. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/codex/parser.py +0 -0
  306. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/copilot.py +0 -0
  307. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/discovery.py +0 -0
  308. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/opencode.py +0 -0
  309. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/prompts.py +0 -0
  310. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/__init__.py +0 -0
  311. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/fts.py +0 -0
  312. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/kv.py +0 -0
  313. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/migrations.py +0 -0
  314. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/mirror.py +0 -0
  315. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/postgres.py +0 -0
  316. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/schema.py +0 -0
  317. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/sqlite.py +0 -0
  318. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/team.py +0 -0
  319. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/AGENT-ICONS.txt +0 -0
  320. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/PLEX-OFL.txt +0 -0
  321. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/adventure.js +0 -0
  322. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-antigravity.svg +0 -0
  323. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-bob.svg +0 -0
  324. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-chatgpt.svg +0 -0
  325. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-claude-ai.svg +0 -0
  326. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-claude.svg +0 -0
  327. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-codex.svg +0 -0
  328. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-copilot.svg +0 -0
  329. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-opencode.svg +0 -0
  330. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/app.js +0 -0
  331. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-book.webp +0 -0
  332. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-camera.webp +0 -0
  333. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-chip.webp +0 -0
  334. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-clock.webp +0 -0
  335. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-cloud.webp +0 -0
  336. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-coins.webp +0 -0
  337. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-container.webp +0 -0
  338. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-dashboard.webp +0 -0
  339. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-dex.webp +0 -0
  340. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-document.webp +0 -0
  341. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-flag.webp +0 -0
  342. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-folder.webp +0 -0
  343. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-gateway.webp +0 -0
  344. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-gears.webp +0 -0
  345. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-glitch.webp +0 -0
  346. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-globe.webp +0 -0
  347. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-laptop.webp +0 -0
  348. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-log.webp +0 -0
  349. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-lumi.webp +0 -0
  350. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-magnifier.webp +0 -0
  351. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-pip.webp +0 -0
  352. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-plug.webp +0 -0
  353. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-rack.webp +0 -0
  354. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-tink.webp +0 -0
  355. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/battle.js +0 -0
  356. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/boot.js +0 -0
  357. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/favicon.png +0 -0
  358. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/field.js +0 -0
  359. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/i18n.js +0 -0
  360. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/icon-180.png +0 -0
  361. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/icon-192.png +0 -0
  362. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/icon-512.png +0 -0
  363. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/icon.png +0 -0
  364. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/index.html +0 -0
  365. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/innerlatch.css +0 -0
  366. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/innerlatch.js +0 -0
  367. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/ja.js +0 -0
  368. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/learning.js +0 -0
  369. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/manifest.webmanifest +0 -0
  370. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/panel.css +0 -0
  371. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/panel.html +0 -0
  372. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/panel.js +0 -0
  373. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-mono-400.woff2 +0 -0
  374. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-mono-500.woff2 +0 -0
  375. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-mono-600.woff2 +0 -0
  376. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-sans-400.woff2 +0 -0
  377. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-sans-500.woff2 +0 -0
  378. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-sans-600.woff2 +0 -0
  379. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-sans-700.woff2 +0 -0
  380. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/rough.js +0 -0
  381. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/scene.js +0 -0
  382. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/sprites.js +0 -0
  383. {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/windows.py +0 -0
  384. {interlatch-0.28.7 → interlatch-0.28.8}/tests/antigravity_fixture.py +0 -0
  385. {interlatch-0.28.7 → interlatch-0.28.8}/tests/codex_fixture.py +0 -0
  386. {interlatch-0.28.7 → interlatch-0.28.8}/tests/conftest.py +0 -0
  387. {interlatch-0.28.7 → interlatch-0.28.8}/tests/copilot_fixture.py +0 -0
  388. {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/0.21.3/chronicle.db +0 -0
  389. {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/0.21.3/expected.json +0 -0
  390. {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/0.27.8/chronicle.db +0 -0
  391. {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/0.27.8/expected.json +0 -0
  392. {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/0.5.0/chronicle.db +0 -0
  393. {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/0.5.0/expected.json +0 -0
  394. {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/README.md +0 -0
  395. {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/make_fixture.py +0 -0
  396. {interlatch-0.28.7 → interlatch-0.28.8}/tests/friction_fixture.py +0 -0
  397. {interlatch-0.28.7 → interlatch-0.28.8}/tests/golden.py +0 -0
  398. {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/cli.json +0 -0
  399. {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/diagram.json +0 -0
  400. {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/parsers/antigravity.json +0 -0
  401. {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/parsers/bob.json +0 -0
  402. {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/parsers/claude_code.json +0 -0
  403. {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/parsers/codex.json +0 -0
  404. {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/parsers/copilot.json +0 -0
  405. {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/parsers/opencode.json +0 -0
  406. {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/systems.json +0 -0
  407. {interlatch-0.28.7 → interlatch-0.28.8}/tests/hubs_fixture.py +0 -0
  408. {interlatch-0.28.7 → interlatch-0.28.8}/tests/opencode_fixture.py +0 -0
  409. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_adventure_web.py +0 -0
  410. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_analysis.py +0 -0
  411. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_antigravity.py +0 -0
  412. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_architecture.py +0 -0
  413. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_arena.py +0 -0
  414. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_artifacts.py +0 -0
  415. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_bag.py +0 -0
  416. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_battle_web.py +0 -0
  417. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_bob_analysis.py +0 -0
  418. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_boot_web.py +0 -0
  419. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_careers.py +0 -0
  420. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_case_files.py +0 -0
  421. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_cases.py +0 -0
  422. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_chat_import.py +0 -0
  423. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_cli_pins.py +0 -0
  424. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_codex.py +0 -0
  425. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_codex_analysis.py +0 -0
  426. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_codex_cloud.py +0 -0
  427. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_container.py +0 -0
  428. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_copilot_bob.py +0 -0
  429. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_db_compat.py +0 -0
  430. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_dedicated_hub.py +0 -0
  431. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_dedupe.py +0 -0
  432. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_desktop.py +0 -0
  433. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_diagram.py +0 -0
  434. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_doctor_agents.py +0 -0
  435. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_ee_boundary.py +0 -0
  436. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_feedback.py +0 -0
  437. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_field_web.py +0 -0
  438. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_fix_effect.py +0 -0
  439. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_formation.py +0 -0
  440. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_friction.py +0 -0
  441. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_game_mode.py +0 -0
  442. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_glossary.py +0 -0
  443. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_group_graph.py +0 -0
  444. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_group_sharing.py +0 -0
  445. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_guidance.py +0 -0
  446. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_home_agents.py +0 -0
  447. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub.py +0 -0
  448. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_accept.py +0 -0
  449. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_cookie.py +0 -0
  450. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_groups.py +0 -0
  451. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_inventory_scope.py +0 -0
  452. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_leave_join.py +0 -0
  453. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_news.py +0 -0
  454. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_payload_privacy.py +0 -0
  455. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_projects.py +0 -0
  456. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_projects_listed.py +0 -0
  457. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_purge.py +0 -0
  458. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_send_problems.py +0 -0
  459. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_sharing_race.py +0 -0
  460. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_ingest.py +0 -0
  461. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_instructions.py +0 -0
  462. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_integration.py +0 -0
  463. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_knowledge_freshness.py +0 -0
  464. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_ladder.py +0 -0
  465. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_language.py +0 -0
  466. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_leaderboard.py +0 -0
  467. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_learning_glance.py +0 -0
  468. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_learning_interests.py +0 -0
  469. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_learning_web.py +0 -0
  470. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_leave_project.py +0 -0
  471. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_legacy_package.py +0 -0
  472. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_map_goldens.py +0 -0
  473. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_market.py +0 -0
  474. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_menubar.py +0 -0
  475. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_migrate.py +0 -0
  476. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_mirror.py +0 -0
  477. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_notify.py +0 -0
  478. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_opencode.py +0 -0
  479. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_opencode_analysis.py +0 -0
  480. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_parser.py +0 -0
  481. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_parser_goldens.py +0 -0
  482. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_party.py +0 -0
  483. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_party_map.py +0 -0
  484. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_people.py +0 -0
  485. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_people_hub.py +0 -0
  486. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_profile_hubs.py +0 -0
  487. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_profile_scope.py +0 -0
  488. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_profiles.py +0 -0
  489. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_project_groups.py +0 -0
  490. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_project_progress.py +0 -0
  491. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_providers.py +0 -0
  492. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_queue.py +0 -0
  493. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_regressions.py +0 -0
  494. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_release.py +0 -0
  495. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_roadmap_catalog.py +0 -0
  496. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_route_matrix.py +0 -0
  497. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_screen.py +0 -0
  498. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_security.py +0 -0
  499. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_session_context_budget.py +0 -0
  500. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_setup.py +0 -0
  501. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_statusline.py +0 -0
  502. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_study.py +0 -0
  503. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_suggest.py +0 -0
  504. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_suggest_cli.py +0 -0
  505. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_systems.py +0 -0
  506. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_team.py +0 -0
  507. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_team_home.py +0 -0
  508. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_update.py +0 -0
  509. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_weekly_reanalysis.py +0 -0
  510. {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_windows.py +0 -0
  511. {interlatch-0.28.7 → interlatch-0.28.8}/tests/windows_smoke.py +0 -0
  512. {interlatch-0.28.7 → interlatch-0.28.8}/uv.lock +0 -0
  513. {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/.vscodeignore +0 -0
  514. {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/LICENSE +0 -0
  515. {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/README.md +0 -0
  516. {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/extension.js +0 -0
  517. {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/media/icon.png +0 -0
  518. {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/media/interlatch.svg +0 -0
  519. {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/package.json +0 -0
@@ -3,6 +3,30 @@
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.28.7 (2026-10-21)
7
+
8
+ - **Feedback:** report a problem or suggest an idea from wherever you use Interlatch: `interlatch feedback` (or
9
+ `interlatch bug`), **Settings › Feedback** and the **Feedback** link in the dashboard's status bar, or **Interlatch:
10
+ Send Feedback** in VS Code (extension 0.4.0). Each opens a new GitHub issue, or a discussion in Ideas, with your
11
+ install's details filled in (versions, system, how it was installed), never your paths, addresses or sessions.
12
+ Nothing is sent until you post it there ([Command line](docs/cli.md)).
13
+ - **`interlatch status` checks every agent:** it has a line for each coding agent found on this computer (Claude Code,
14
+ Codex, Copilot, Bob, Antigravity, OpenCode, Cursor and the other MCP clients) saying whether Interlatch's MCP server
15
+ is in it, and flags one whose command is gone or runs another install, such as an old `chronicle` or a checkout's
16
+ `.venv`; `interlatch connect <name>` points it back ([Troubleshooting](docs/troubleshooting.md)).
17
+ - **New sessions get whole notes, never a cut-off one:** the knowledge digest a new session receives
18
+ (`interlatch install --inject-context`) now fits its length limit by leaving out the least useful notes and the
19
+ oldest sessions whole, and its last line says how many it left out so the agent knows to search for them. It is also
20
+ checked for secrets once more on its way out ([Configuration](docs/configuration.md#synthesis-export-server-inject-updates)).
21
+ - **Agents can pick up where the last session left off:** the new `resume` MCP tool tells an agent starting in a project
22
+ what the last session set out to do, how it went and what it left open, what waits on you, and what other agents did
23
+ and learned since its own previous session there, all from the archive and within a length limit
24
+ ([MCP server](docs/mcp.md#tools)).
25
+ - **Lessons say when their code has changed:** a lesson now records the files it was learned from (those the session
26
+ read or changed), and when one of them changes, the SessionStart digest and the MCP search mark it *may be out of
27
+ date* and name the file, so an agent checks it before relying on it
28
+ ([When a lesson may be out of date](docs/analysis.md#when-a-lesson-may-be-out-of-date)).
29
+
6
30
  ## 0.28.6 (2026-10-20)
7
31
 
8
32
  - **Hubs page, tidier:** **Settings › Hubs** has a tab for each hub and one to add a hub. A hub's tab fits on one
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: interlatch
3
- Version: 0.28.7
3
+ Version: 0.28.8
4
4
  Summary: Shared memory for your coding agents: records every session (Claude Code, Codex, Copilot, Bob, Antigravity, OpenCode) 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/
@@ -0,0 +1,3 @@
1
+ - **A sign-in page that looks like Interlatch:** opening a hub's sign-in or invite link now shows the dashboard's own
2
+ card, with the person you'll sign in as, a full-width **Sign in as …** button, and the light/dark and language
3
+ buttons, in place of a bare unstyled page. The page still asks before it signs anyone in.
@@ -409,10 +409,10 @@ JA: dict[str, str] = {
409
409
  "このハブの管理者に新しい招待を頼むか、自分の Interlatch(「設定」›「デバイス」)からハブのダッシュボードを開き直してください。",
410
410
  "Open the dashboard": "ダッシュボードを開く",
411
411
  "Sign in to this hub": "このハブにサインイン",
412
- "Sign in as {who}?": "{who} としてサインインしますか?",
412
+ "Sign in as {name}": "{name} としてサインイン",
413
413
  "Go on only if you opened this link from your own Interlatch or an admin of this hub sent it to you.":
414
414
  "このリンクを自分の Interlatch から開いた場合か、このハブの管理者から送られてきた場合だけ続けてください。",
415
- "Sign in": "サインイン",
415
+ "Toggle theme": "テーマを切り替え",
416
416
  "open the sign-in link again": "サインインのリンクをもう一度開いてください",
417
417
  "bad form": "フォームが正しくありません",
418
418
  "no such computer or browser session": "そのコンピューターまたはブラウザーのセッションはありません",
@@ -79,6 +79,17 @@ SIGNIN_HELP = ("Ask an admin of this hub for a new invite, or open the hub's das
79
79
  "(Settings › Devices).")
80
80
  SIGNIN_CHECK = "Go on only if you opened this link from your own Interlatch or an admin of this hub sent it to you."
81
81
  TOO_MANY_CODES = "too many wrong codes from this address; try again in {seconds} s" # people.CodeAttempts
82
+ # The /signin page's policy: the dashboard's own stylesheet, fonts, logo and signin.js, nothing inline, and its form
83
+ # posts only here. It may not be framed: a page that shows it in a frame can't trick a click on Sign in.
84
+ SIGNIN_CSP = ("default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self'; font-src 'self'; "
85
+ "form-action 'self'; frame-ancestors 'none'; base-uri 'none'")
86
+ # line icons, drawn as app.js's icon() draws them
87
+ _ICON = '<svg class="icon{cls}" viewBox="0 0 24 24" aria-hidden="true">{paths}</svg>'
88
+ SUN = _ICON.format(cls=" ic-sun", paths='<circle cx="12" cy="12" r="4"/>' + "".join(
89
+ f'<path d="{d}"/>' for d in ("M12 2v2", "M12 20v2", "m4.93 4.93 1.41 1.41", "m17.66 17.66 1.41 1.41", "M2 12h2",
90
+ "M20 12h2", "m6.34 17.66-1.41 1.41", "m19.07 4.93-1.41 1.41")))
91
+ MOON = _ICON.format(cls=" ic-moon", paths='<path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9z"/>')
92
+ SHIELD = _ICON.format(cls="", paths='<path d="M12 3l7 3v5c0 4.5-3 8-7 10-4-2-7-5.5-7-10V6z"/><path d="m9 12 2 2 4-4"/>')
82
93
 
83
94
 
84
95
  def make_handler(app: App, port: int):
@@ -280,16 +291,33 @@ def make_handler(app: App, port: int):
280
291
  origin = (self.headers.get("Origin") or "").strip().lower()
281
292
  return origin not in ("", "null") and urlparse(origin).netloc == self._host()
282
293
 
283
- def _signin_page(self, status: int, title: str, body: str, retry: int = 0):
284
- """The small page /signin answers with: asking before a sign-in, or why one didn't happen."""
294
+ def _signin_page(self, status: int, title: str, body: str, retry: int = 0, switch_lang: bool = False):
295
+ """The small page /signin answers with: asking before a sign-in, or why one didn't happen. The dashboard's
296
+ own sign-in card (app.css), with its theme and language buttons (signin.js), under a policy that lets in
297
+ the dashboard's own files and nothing inline."""
285
298
  import html
299
+ from urllib.parse import urlencode
286
300
 
287
301
  title = html.escape(title)
288
- page = (f'<!doctype html><html lang="{i18n.lang.get()}"><meta charset="utf-8">'
302
+ hub = app.cfg.hub_name or self._host()
303
+ switch = ""
304
+ if switch_lang: # the same link in the other language; not on a refusal, where it would try the code again
305
+ other = "en" if i18n.lang.get() == "ja" else "ja"
306
+ q = {k: v[-1] for k, v in parse_qs(urlparse(self.path).query).items()} | {"lang": other}
307
+ switch = (f'<a class="btn small" id="signin-lang" lang="{other}" href="/signin?{html.escape(urlencode(q))}">'
308
+ f'{"日本語" if other == "ja" else "English"}</a>')
309
+ theme = html.escape(tr("Toggle theme"))
310
+ page = (f'<!doctype html><html lang="{i18n.lang.get()}"><head><meta charset="utf-8">'
289
311
  '<meta name="viewport" content="width=device-width, initial-scale=1">'
290
312
  f'<meta name="color-scheme" content="light dark"><title>{title} · Interlatch</title>'
291
- '<body style="font: 16px/1.5 system-ui, sans-serif; max-width: 36rem; margin: 12vh auto; '
292
- f'padding: 0 16px"><h1 style="font-size: 1.3rem">{title}</h1>{body}</body></html>').encode()
313
+ '<link rel="icon" href="/favicon.png" type="image/png"><link rel="stylesheet" href="/app.css">'
314
+ '<script src="/signin.js"></script></head><body><main class="signin-screen">'
315
+ '<div class="card signin-card"><div class="signin-brand">'
316
+ '<img src="/icon.png" width="26" height="26" alt="">Interlatch'
317
+ f'{f"<span class=signin-hub>{html.escape(hub)}</span>" if hub else ""}</div>'
318
+ f'<h1>{title}</h1>{body}<div class="signin-foot">{switch}'
319
+ f'<button class="btn small" id="signin-theme" type="button" aria-label="{theme}" title="{theme}">'
320
+ f'{SUN}{MOON}</button></div></div></main></body></html>').encode()
293
321
  self.send_response(status)
294
322
  self.send_header("Content-Type", "text/html; charset=utf-8")
295
323
  self.send_header("Content-Length", str(len(page)))
@@ -298,8 +326,7 @@ def make_handler(app: App, port: int):
298
326
  self.send_header("Retry-After", str(retry))
299
327
  self.send_header("X-Content-Type-Options", "nosniff")
300
328
  self.send_header("Referrer-Policy", "no-referrer") # the code is in this page's address
301
- self.send_header("Content-Security-Policy",
302
- "default-src 'none'; style-src 'unsafe-inline'; form-action 'self'; frame-ancestors 'none'")
329
+ self.send_header("Content-Security-Policy", SIGNIN_CSP)
303
330
  self.end_headers()
304
331
  self.wfile.write(page)
305
332
 
@@ -307,8 +334,8 @@ def make_handler(app: App, port: int):
307
334
  import html
308
335
 
309
336
  self._signin_page(429 if wait else status, tr("Could not sign in"),
310
- f"<p>{html.escape(exc.shown())}</p><p>{html.escape(tr(SIGNIN_HELP))}</p>"
311
- f'<p><a href="/">{html.escape(tr("Open the dashboard"))}</a></p>', wait)
337
+ f'<p class="signin-note">{html.escape(exc.shown())}</p><p>{html.escape(tr(SIGNIN_HELP))}</p>'
338
+ f'<a class="btn primary signin-go" href="/">{html.escape(tr("Open the dashboard"))}</a>', wait)
312
339
 
313
340
  def _signin_code(self, code: str, take):
314
341
  """take(code) for a sign-in, after the wrong-code wait (people.CodeAttempts): its answer, or None once the
@@ -316,7 +343,9 @@ def make_handler(app: App, port: int):
316
343
  from ...sharing import people
317
344
 
318
345
  accept = (self.headers.get("Accept-Language") or "").strip().lower()
319
- i18n.lang.set("ja" if accept.startswith("ja") else "en") # a link opened by hand sends no X-Interlatch-Lang
346
+ asked = parse_qs(urlparse(self.path).query).get("lang", [""])[-1] # the page's language button
347
+ # a link opened by hand sends no X-Interlatch-Lang
348
+ i18n.lang.set(asked if asked in i18n.LANGS else "ja" if accept.startswith("ja") else "en")
320
349
  who = self._client()
321
350
  wait = app.code_attempts.wait(who)
322
351
  try:
@@ -340,15 +369,16 @@ def make_handler(app: App, port: int):
340
369
  person = self._signin_code(code, lambda c: people.code_person(app.conn, c))
341
370
  if person is None:
342
371
  return
343
- who = person["name"] + (f" ({person['email']})" if person.get("email") else "")
372
+ name, email = person["name"], person.get("email") or ""
344
373
  hidden = "".join(f'<input type="hidden" name="{k}" value="{html.escape(v)}">'
345
374
  for k, v in (("code", code), ("next", page)) if v)
346
375
  self._signin_page(200, tr("Sign in to this hub"),
347
- f"<p>{html.escape(tr('Sign in as {who}?', who=who))}</p>"
348
- f"<p>{html.escape(tr(SIGNIN_CHECK))}</p>"
349
- f'<form method="post" action="/signin">{hidden}'
350
- f'<button type="submit" style="font: inherit; padding: 6px 16px">'
351
- f"{html.escape(tr('Sign in'))}</button></form>")
376
+ f'<div class="signin-who"><span class="signin-avatar" aria-hidden="true">'
377
+ f"{html.escape(name[:1].upper())}</span><div><b>{html.escape(name)}</b>"
378
+ f'{f"<span>{html.escape(email)}</span>" if email else ""}</div></div>'
379
+ f'<p class="signin-check">{SHIELD}<span>{html.escape(tr(SIGNIN_CHECK))}</span></p>'
380
+ f'<form method="post" action="/signin">{hidden}<button class="btn primary signin-go" '
381
+ f'type="submit">{html.escape(tr("Sign in as {name}", name=name))}</button></form>', switch_lang=True)
352
382
 
353
383
  def _signin(self, code: str, page: str | None = None):
354
384
  """POST /signin, from the page above or the dashboard's own sign-in form: opens a browser session, on the
@@ -2143,6 +2143,18 @@ a.ar-tile-media.empty:hover { background: var(--accent-wash); }
2143
2143
  .signin-form .input { flex: 1; min-width: 0; font-family: var(--mono); letter-spacing: 0.04em; }
2144
2144
  .signin-foot { display: flex; justify-content: flex-end; gap: 6px; margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--grid); }
2145
2145
  .signin-foot .icon { width: 14px; height: 14px; }
2146
+ /* the /signin page (handler.py): the same card, asking before a link signs this browser in */
2147
+ .signin-hub { margin-left: auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 500 11px/1.4 var(--mono); letter-spacing: 0.08em; color: var(--muted); padding: 2px 8px; border: 1px solid var(--border); border-radius: 999px; }
2148
+ .signin-who { display: flex; align-items: center; gap: 12px; margin: 16px 0 14px; padding: 12px 14px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface-2); }
2149
+ .signin-who > div { display: flex; flex-direction: column; min-width: 0; }
2150
+ .signin-who b { font-size: 15px; overflow-wrap: anywhere; }
2151
+ .signin-who > div > span { color: var(--muted); font-size: 13px; overflow-wrap: anywhere; }
2152
+ .signin-avatar { flex: none; display: grid; place-items: center; width: 38px; height: 38px; border-radius: 50%; background: var(--cta); color: var(--cta-ink); font-weight: 700; font-size: 16px; }
2153
+ .signin-check { display: flex; gap: 8px; align-items: flex-start; color: var(--muted); font-size: 13px; }
2154
+ .signin-check .icon { flex: none; width: 16px; height: 16px; margin-top: 2px; }
2155
+ .signin-go { display: block; width: 100%; padding: 9px 14px; text-align: center; font-size: 14.5px; }
2156
+ a.signin-go:hover { text-decoration: none; }
2157
+ .signin-card .signin-note + p { margin-bottom: 18px; }
2146
2158
  .pp-table td { vertical-align: top; }
2147
2159
  .pp-table td:first-child { min-width: 170px; }
2148
2160
  .pp-table select { max-width: 150px; }
@@ -0,0 +1,28 @@
1
+ // The /signin page's one script (handler.py, _signin_page): the theme this browser chose, before the first paint, and
2
+ // the page's theme and language buttons. Its own file, not inline, so the page's policy can allow scripts from 'self' only.
3
+ (function () {
4
+ var root = document.documentElement;
5
+ try { var t = localStorage.getItem("interlatch-theme"); if (t) root.dataset.theme = t; } catch (e) {}
6
+ var dark = function () {
7
+ return root.dataset.theme ? root.dataset.theme === "dark" : matchMedia("(prefers-color-scheme: dark)").matches;
8
+ };
9
+ document.addEventListener("DOMContentLoaded", function () {
10
+ var btn = document.getElementById("signin-theme");
11
+ if (btn) {
12
+ var show = function () { // the sun in the dark, the moon in the light: what a press switches to
13
+ btn.querySelector(".ic-sun").toggleAttribute("hidden", !dark());
14
+ btn.querySelector(".ic-moon").toggleAttribute("hidden", dark());
15
+ };
16
+ show();
17
+ btn.addEventListener("click", function () {
18
+ root.dataset.theme = dark() ? "light" : "dark";
19
+ try { localStorage.setItem("interlatch-theme", root.dataset.theme); } catch (e) {}
20
+ show();
21
+ });
22
+ }
23
+ var lang = document.getElementById("signin-lang");
24
+ if (lang) lang.addEventListener("click", function () { // the dashboard opens in it too, once signed in
25
+ try { localStorage.setItem("interlatch-lang", lang.getAttribute("lang")); } catch (e) {}
26
+ });
27
+ });
28
+ })();
@@ -220,7 +220,7 @@ NODE = shutil.which("node")
220
220
 
221
221
 
222
222
  @pytest.mark.skipif(not NODE, reason="node is not installed")
223
- @pytest.mark.parametrize("name", ["app.js", "i18n.js", "ja.js", "sprites.js", "scene.js", "innerlatch.js", "adventure.js", "field.js", "battle.js"])
223
+ @pytest.mark.parametrize("name", ["app.js", "i18n.js", "ja.js", "sprites.js", "scene.js", "innerlatch.js", "adventure.js", "field.js", "battle.js", "signin.js"])
224
224
  def test_scripts_parse(name):
225
225
  proc = subprocess.run([NODE, "--check", str(WEB / name)], capture_output=True, text=True)
226
226
  assert proc.returncode == 0, proc.stderr
@@ -100,6 +100,10 @@ def test_an_empty_project_says_so(synced):
100
100
  def test_the_mcp_tool_knows_the_client_from_initialize(synced):
101
101
  conn = synced["conn"]
102
102
  _story(conn)
103
+ # the server reads the real clock: the running session moved just now, not at NOW
104
+ conn.execute("UPDATE sessions SET ended_at = ? WHERE id = 'claude-now'",
105
+ (datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z"),))
106
+ conn.commit()
103
107
  msgs = [{"jsonrpc": "2.0", "id": 1, "method": "initialize",
104
108
  "params": {"protocolVersion": "2025-06-18", "clientInfo": {"name": "claude-code", "version": "2"}}},
105
109
  {"jsonrpc": "2.0", "id": 2, "method": "tools/list"},
@@ -115,6 +115,7 @@ def test_a_hub_without_people_answers_as_before(hubweb):
115
115
  assert _call(url, "/api/learning/interests") == (200, {"interests": []})
116
116
  status, headers, page = _raw(url, "/signin?code=AAAA-BBBB-CCCC")
117
117
  assert status == 400 and b"known on this hub" in page and headers["Content-Type"].startswith("text/html")
118
+ assert b'id="signin-lang"' not in page # switching language here would try the wrong code again
118
119
 
119
120
 
120
121
  def test_who_may_look_and_who_may_change(team):
@@ -204,13 +205,17 @@ def test_a_link_alone_signs_nobody_in(team):
204
205
  url, conn = team["url"], team["conn"]
205
206
  code = people.invite(conn, team["vic"]["id"])
206
207
  status, headers, page = _raw(url, f"/signin?code={code}&next={quote('/project?path=%2Fx', safe='')}", headers=REMOTE)
207
- assert status == 200 and "Set-Cookie" not in headers and b"Sign in as Vic (vic@example.com)?" in page
208
+ assert status == 200 and "Set-Cookie" not in headers and b"<b>Vic</b><span>vic@example.com</span>" in page
209
+ assert b">Sign in as Vic</button>" in page
208
210
  assert f'name="code" value="{code}"'.encode() in page and b'name="next" value="/project?path=%2Fx"' in page
209
- csp = headers["Content-Security-Policy"]
210
- assert "form-action 'self'" in csp and "frame-ancestors 'none'" in csp and "script-src" not in csp
211
+ csp = dict(d.strip().split(" ", 1) for d in headers["Content-Security-Policy"].split(";"))
212
+ assert csp["form-action"] == csp["script-src"] == csp["style-src"] == "'self'" and csp["frame-ancestors"] == "'none'"
213
+ assert b"<script>" not in page and b" style=" not in page # the page's own files only: nothing inline
211
214
  assert people.peek_invite(conn, code) # asking used nothing up
212
215
  page = _raw(url, f"/signin?code={code}", headers={**REMOTE, "Accept-Language": "ja"})[2]
213
- assert "Vic (vic@example.com) としてサインインしますか?".encode() in page
216
+ assert "Vic としてサインイン</button>".encode() in page and b'id="signin-lang" lang="en"' in page
217
+ page = _raw(url, f"/signin?code={code}&lang=ja", headers=REMOTE)[2] # the page's language button
218
+ assert "Vic としてサインイン</button>".encode() in page and f"code={code}&amp;lang=en".encode() in page
214
219
 
215
220
  for other in ({}, {"Origin": "https://evil.example"}, {"Origin": "null"}, {"Origin": "http://127.0.0.1.evil.example"},
216
221
  {"Sec-Fetch-Site": "cross-site", "Origin": "https://evil.example"}, {"Sec-Fetch-Site": "same-site"}):
@@ -1,4 +0,0 @@
1
- - **`interlatch status` checks every agent:** it has a line for each coding agent found on this computer (Claude Code,
2
- Codex, Copilot, Bob, Antigravity, OpenCode, Cursor and the other MCP clients) saying whether Interlatch's MCP server
3
- is in it, and flags one whose command is gone or runs another install, such as an old `chronicle` or a checkout's
4
- `.venv`; `interlatch connect <name>` points it back ([Troubleshooting](docs/troubleshooting.md)).
@@ -1,5 +0,0 @@
1
- - **Feedback:** report a problem or suggest an idea from wherever you use Interlatch: `interlatch feedback` (or
2
- `interlatch bug`), **Settings › Feedback** and the **Feedback** link in the dashboard's status bar, or **Interlatch:
3
- Send Feedback** in VS Code (extension 0.4.0). Each opens a new GitHub issue, or a discussion in Ideas, with your
4
- install's details filled in (versions, system, how it was installed), never your paths, addresses or sessions.
5
- Nothing is sent until you post it there ([Command line](docs/cli.md)).
@@ -1,4 +0,0 @@
1
- - **Lessons say when their code has changed:** a lesson now records the files it was learned from (those the session
2
- read or changed), and when one of them changes, the SessionStart digest and the MCP search mark it *may be out of
3
- date* and name the file, so an agent checks it before relying on it
4
- ([When a lesson may be out of date](docs/analysis.md#when-a-lesson-may-be-out-of-date)).
@@ -1,4 +0,0 @@
1
- - **Agents can pick up where the last session left off:** the new `resume` MCP tool tells an agent starting in a project
2
- what the last session set out to do, how it went and what it left open, what waits on you, and what other agents did
3
- and learned since its own previous session there, all from the archive and within a length limit
4
- ([MCP server](docs/mcp.md#tools)).
@@ -1,4 +0,0 @@
1
- - **New sessions get whole notes, never a cut-off one:** the knowledge digest a new session receives
2
- (`interlatch install --inject-context`) now fits its length limit by leaving out the least useful notes and the
3
- oldest sessions whole, and its last line says how many it left out so the agent knows to search for them. It is also
4
- checked for secrets once more on its way out ([Configuration](docs/configuration.md#synthesis-export-server-inject-updates)).
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes