interlatch 0.28.6__tar.gz → 0.28.7__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 (518) hide show
  1. {interlatch-0.28.6 → interlatch-0.28.7}/CHANGELOG.md +5 -0
  2. {interlatch-0.28.6 → interlatch-0.28.7}/PKG-INFO +1 -1
  3. interlatch-0.28.7/changelog.d/doctor-agents.md +4 -0
  4. interlatch-0.28.7/changelog.d/feedback.md +5 -0
  5. interlatch-0.28.7/changelog.d/knowledge-freshness.md +4 -0
  6. interlatch-0.28.7/changelog.d/mcp-resume.md +4 -0
  7. interlatch-0.28.7/changelog.d/session-start-budget.md +4 -0
  8. {interlatch-0.28.6 → interlatch-0.28.7}/docs/analysis.md +9 -0
  9. {interlatch-0.28.6 → interlatch-0.28.7}/docs/cli.md +2 -1
  10. {interlatch-0.28.6 → interlatch-0.28.7}/docs/configuration.md +1 -1
  11. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/analysis.md +8 -0
  12. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/cli.md +2 -1
  13. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/configuration.md +1 -1
  14. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/mcp.md +4 -2
  15. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/troubleshooting.md +7 -1
  16. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/vscode.md +7 -2
  17. {interlatch-0.28.6 → interlatch-0.28.7}/docs/mcp.md +5 -2
  18. {interlatch-0.28.6 → interlatch-0.28.7}/docs/troubleshooting.md +8 -2
  19. {interlatch-0.28.6 → interlatch-0.28.7}/docs/vscode.md +7 -2
  20. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/session.py +11 -5
  21. interlatch-0.28.7/src/interlatch/core/budget.py +56 -0
  22. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/operations.py +71 -2
  23. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/parser.py +3 -3
  24. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/mcp.py +35 -1
  25. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/settings.py +26 -0
  26. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/routes.py +2 -0
  27. interlatch-0.28.7/src/interlatch/knowledge/freshness.py +116 -0
  28. interlatch-0.28.7/src/interlatch/projects/resume.py +103 -0
  29. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/connectors.py +120 -5
  30. interlatch-0.28.7/src/interlatch/runtime/feedback.py +96 -0
  31. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/hooks.py +68 -26
  32. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/schema.py +3 -2
  33. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/app.css +12 -0
  34. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/app.js +34 -4
  35. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/index.html +1 -0
  36. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/ja.js +12 -0
  37. interlatch-0.28.7/tests/fixtures/db/0.21.3/chronicle.db +0 -0
  38. interlatch-0.28.7/tests/fixtures/db/0.21.3/expected.json +125 -0
  39. interlatch-0.28.7/tests/fixtures/db/0.27.8/chronicle.db +0 -0
  40. interlatch-0.28.7/tests/fixtures/db/0.27.8/expected.json +125 -0
  41. interlatch-0.28.7/tests/fixtures/db/0.5.0/chronicle.db +0 -0
  42. interlatch-0.28.7/tests/fixtures/db/0.5.0/expected.json +108 -0
  43. interlatch-0.28.7/tests/fixtures/db/README.md +61 -0
  44. interlatch-0.28.7/tests/fixtures/db/make_fixture.py +271 -0
  45. {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/cli.json +60 -0
  46. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_cli_pins.py +1 -0
  47. interlatch-0.28.7/tests/test_db_compat.py +145 -0
  48. interlatch-0.28.7/tests/test_doctor_agents.py +136 -0
  49. interlatch-0.28.7/tests/test_feedback.py +87 -0
  50. interlatch-0.28.7/tests/test_knowledge_freshness.py +115 -0
  51. interlatch-0.28.7/tests/test_mcp_resume.py +114 -0
  52. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_route_matrix.py +1 -0
  53. interlatch-0.28.7/tests/test_session_context_budget.py +98 -0
  54. {interlatch-0.28.6 → interlatch-0.28.7}/uv.lock +87 -82
  55. {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/extension.js +31 -0
  56. {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/package.json +7 -1
  57. interlatch-0.28.6/changelog.d/hubs-tabs.md +0 -2
  58. {interlatch-0.28.6 → interlatch-0.28.7}/.github/dependabot.yml +0 -0
  59. {interlatch-0.28.6 → interlatch-0.28.7}/.github/windows-ja-qa/driver.ps1 +0 -0
  60. {interlatch-0.28.6 → interlatch-0.28.7}/.github/windows-ja-qa/ja_check.py +0 -0
  61. {interlatch-0.28.6 → interlatch-0.28.7}/.github/windows-ja-qa/report.py +0 -0
  62. {interlatch-0.28.6 → interlatch-0.28.7}/.github/windows-ja-qa/shots.py +0 -0
  63. {interlatch-0.28.6 → interlatch-0.28.7}/.github/windows-ja-qa/user.ps1 +0 -0
  64. {interlatch-0.28.6 → interlatch-0.28.7}/.github/workflows/changelog.yml +0 -0
  65. {interlatch-0.28.6 → interlatch-0.28.7}/.github/workflows/ci.yml +0 -0
  66. {interlatch-0.28.6 → interlatch-0.28.7}/.github/workflows/docs.yml +0 -0
  67. {interlatch-0.28.6 → interlatch-0.28.7}/.github/workflows/release.yml +0 -0
  68. {interlatch-0.28.6 → interlatch-0.28.7}/.github/workflows/windows-ja-qa.yml +0 -0
  69. {interlatch-0.28.6 → interlatch-0.28.7}/.gitignore +0 -0
  70. {interlatch-0.28.6 → interlatch-0.28.7}/.pre-commit-config.yaml +0 -0
  71. {interlatch-0.28.6 → interlatch-0.28.7}/.python-version +0 -0
  72. {interlatch-0.28.6 → interlatch-0.28.7}/CONTRIBUTING.md +0 -0
  73. {interlatch-0.28.6 → interlatch-0.28.7}/LICENSE +0 -0
  74. {interlatch-0.28.6 → interlatch-0.28.7}/README.ja.md +0 -0
  75. {interlatch-0.28.6 → interlatch-0.28.7}/README.md +0 -0
  76. {interlatch-0.28.6 → interlatch-0.28.7}/ROADMAP.ja.md +0 -0
  77. {interlatch-0.28.6 → interlatch-0.28.7}/ROADMAP.md +0 -0
  78. {interlatch-0.28.6 → interlatch-0.28.7}/SECURITY.md +0 -0
  79. {interlatch-0.28.6 → interlatch-0.28.7}/careers/README.md +0 -0
  80. {interlatch-0.28.6 → interlatch-0.28.7}/careers/boards.json +0 -0
  81. {interlatch-0.28.6 → interlatch-0.28.7}/careers/pipeline.py +0 -0
  82. {interlatch-0.28.6 → interlatch-0.28.7}/changelog.d/README.md +0 -0
  83. {interlatch-0.28.6 → interlatch-0.28.7}/dev.sh +0 -0
  84. {interlatch-0.28.6 → interlatch-0.28.7}/docker/.dockerignore +0 -0
  85. {interlatch-0.28.6 → interlatch-0.28.7}/docker/.env.example +0 -0
  86. {interlatch-0.28.6 → interlatch-0.28.7}/docker/Caddyfile +0 -0
  87. {interlatch-0.28.6 → interlatch-0.28.7}/docker/Dockerfile +0 -0
  88. {interlatch-0.28.6 → interlatch-0.28.7}/docker/compose.yaml +0 -0
  89. {interlatch-0.28.6 → interlatch-0.28.7}/docker/wheels/.gitignore +0 -0
  90. {interlatch-0.28.6 → interlatch-0.28.7}/docs/README.md +0 -0
  91. {interlatch-0.28.6 → interlatch-0.28.7}/docs/_site/hooks.py +0 -0
  92. {interlatch-0.28.6 → interlatch-0.28.7}/docs/dashboard.md +0 -0
  93. {interlatch-0.28.6 → interlatch-0.28.7}/docs/demo/make_demo.py +0 -0
  94. {interlatch-0.28.6 → interlatch-0.28.7}/docs/demo/record_demo.py +0 -0
  95. {interlatch-0.28.6 → interlatch-0.28.7}/docs/design/innerlatch.md +0 -0
  96. {interlatch-0.28.6 → interlatch-0.28.7}/docs/design/ja/innerlatch.md +0 -0
  97. {interlatch-0.28.6 → interlatch-0.28.7}/docs/design/ja/learning.md +0 -0
  98. {interlatch-0.28.6 → interlatch-0.28.7}/docs/design/learning.md +0 -0
  99. {interlatch-0.28.6 → interlatch-0.28.7}/docs/development.md +0 -0
  100. {interlatch-0.28.6 → interlatch-0.28.7}/docs/devices.md +0 -0
  101. {interlatch-0.28.6 → interlatch-0.28.7}/docs/diagrams/analysis.excalidraw.svg +0 -0
  102. {interlatch-0.28.6 → interlatch-0.28.7}/docs/diagrams/architecture.excalidraw.svg +0 -0
  103. {interlatch-0.28.6 → interlatch-0.28.7}/docs/docker.md +0 -0
  104. {interlatch-0.28.6 → interlatch-0.28.7}/docs/faq.md +0 -0
  105. {interlatch-0.28.6 → interlatch-0.28.7}/docs/images/demo.gif +0 -0
  106. {interlatch-0.28.6 → interlatch-0.28.7}/docs/images/home.png +0 -0
  107. {interlatch-0.28.6 → interlatch-0.28.7}/docs/images/map.png +0 -0
  108. {interlatch-0.28.6 → interlatch-0.28.7}/docs/images/palette.png +0 -0
  109. {interlatch-0.28.6 → interlatch-0.28.7}/docs/images/session.png +0 -0
  110. {interlatch-0.28.6 → interlatch-0.28.7}/docs/install.md +0 -0
  111. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/README.md +0 -0
  112. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/dashboard.md +0 -0
  113. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/development.md +0 -0
  114. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/devices.md +0 -0
  115. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/docker.md +0 -0
  116. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/faq.md +0 -0
  117. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/install.md +0 -0
  118. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/join-a-hub.md +0 -0
  119. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/moving-from-chronicle.md +0 -0
  120. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/party.md +0 -0
  121. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/postgres.md +0 -0
  122. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/privacy.md +0 -0
  123. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/profiles.md +0 -0
  124. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/sources.md +0 -0
  125. {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/suggestions.md +0 -0
  126. {interlatch-0.28.6 → interlatch-0.28.7}/docs/join-a-hub.md +0 -0
  127. {interlatch-0.28.6 → interlatch-0.28.7}/docs/moving-from-chronicle.md +0 -0
  128. {interlatch-0.28.6 → interlatch-0.28.7}/docs/party.md +0 -0
  129. {interlatch-0.28.6 → interlatch-0.28.7}/docs/postgres.md +0 -0
  130. {interlatch-0.28.6 → interlatch-0.28.7}/docs/privacy.md +0 -0
  131. {interlatch-0.28.6 → interlatch-0.28.7}/docs/profiles.md +0 -0
  132. {interlatch-0.28.6 → interlatch-0.28.7}/docs/sources.md +0 -0
  133. {interlatch-0.28.6 → interlatch-0.28.7}/docs/suggestions.md +0 -0
  134. {interlatch-0.28.6 → interlatch-0.28.7}/leaderboard/.firebaserc +0 -0
  135. {interlatch-0.28.6 → interlatch-0.28.7}/leaderboard/.gitignore +0 -0
  136. {interlatch-0.28.6 → interlatch-0.28.7}/leaderboard/README.md +0 -0
  137. {interlatch-0.28.6 → interlatch-0.28.7}/leaderboard/firebase.json +0 -0
  138. {interlatch-0.28.6 → interlatch-0.28.7}/leaderboard/firestore.indexes.json +0 -0
  139. {interlatch-0.28.6 → interlatch-0.28.7}/leaderboard/firestore.rules +0 -0
  140. {interlatch-0.28.6 → interlatch-0.28.7}/mkdocs.yml +0 -0
  141. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/README.md +0 -0
  142. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/art.json +0 -0
  143. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/filing.html +0 -0
  144. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/loops.json +0 -0
  145. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/loops.py +0 -0
  146. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/members.js +0 -0
  147. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/render.html +0 -0
  148. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/render.py +0 -0
  149. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/scenes-more.js +0 -0
  150. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/scenes.html +0 -0
  151. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/Chronicle.icns +0 -0
  152. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/Interlatch.spec +0 -0
  153. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/build.sh +0 -0
  154. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/entitlements.plist +0 -0
  155. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/icon-3d.webp +0 -0
  156. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/icon-blueprint-prompt.md +0 -0
  157. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/icon-blueprint.webp +0 -0
  158. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/icon.png +0 -0
  159. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/interlatch_app.py +0 -0
  160. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/make_icon.py +0 -0
  161. {interlatch-0.28.6 → interlatch-0.28.7}/packaging/release.py +0 -0
  162. {interlatch-0.28.6 → interlatch-0.28.7}/pyproject.toml +0 -0
  163. {interlatch-0.28.6 → interlatch-0.28.7}/src/chronicle/__init__.py +0 -0
  164. {interlatch-0.28.6 → interlatch-0.28.7}/src/chronicle/__main__.py +0 -0
  165. {interlatch-0.28.6 → interlatch-0.28.7}/src/chronicle/windows.py +0 -0
  166. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/__init__.py +0 -0
  167. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/__main__.py +0 -0
  168. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/__init__.py +0 -0
  169. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/digest.py +0 -0
  170. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/language.py +0 -0
  171. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/queue.py +0 -0
  172. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/__init__.py +0 -0
  173. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/api.py +0 -0
  174. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/base.py +0 -0
  175. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/bob.py +0 -0
  176. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/claude.py +0 -0
  177. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/codex.py +0 -0
  178. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/factory.py +0 -0
  179. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/off.py +0 -0
  180. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/opencode.py +0 -0
  181. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/process.py +0 -0
  182. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/replies.py +0 -0
  183. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/settings.py +0 -0
  184. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/screen.py +0 -0
  185. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/worker.py +0 -0
  186. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/application/__init__.py +0 -0
  187. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/application/profiles.py +0 -0
  188. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/application/records.py +0 -0
  189. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/application/search.py +0 -0
  190. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/application/workflows.py +0 -0
  191. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/artifacts/__init__.py +0 -0
  192. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/artifacts/files.py +0 -0
  193. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/artifacts/queries.py +0 -0
  194. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/cli.py +0 -0
  195. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/__init__.py +0 -0
  196. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/agents.py +0 -0
  197. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/artifact_records.py +0 -0
  198. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/config.py +0 -0
  199. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/diagrams.py +0 -0
  200. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/i18n/__init__.py +0 -0
  201. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/i18n/ja.py +0 -0
  202. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/machine.py +0 -0
  203. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/paths.py +0 -0
  204. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/pricing.py +0 -0
  205. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/process.py +0 -0
  206. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/profiles.py +0 -0
  207. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/redact.py +0 -0
  208. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/sessions.py +0 -0
  209. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/util.py +0 -0
  210. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/__init__.py +0 -0
  211. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/analyses.py +0 -0
  212. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/archive.py +0 -0
  213. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/chat_import.py +0 -0
  214. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/deletion.py +0 -0
  215. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/history.py +0 -0
  216. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/memory.py +0 -0
  217. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/persistence.py +0 -0
  218. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/report.py +0 -0
  219. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/service.py +0 -0
  220. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/__init__.py +0 -0
  221. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/__init__.py +0 -0
  222. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/__init__.py +0 -0
  223. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/archive.py +0 -0
  224. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/hubs.py +0 -0
  225. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/knowledge.py +0 -0
  226. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/recording.py +0 -0
  227. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/setup.py +0 -0
  228. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/sharing.py +0 -0
  229. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/common.py +0 -0
  230. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/main.py +0 -0
  231. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/exports/__init__.py +0 -0
  232. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/exports/diagrams.py +0 -0
  233. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/exports/markdown.py +0 -0
  234. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/exports/sessions.py +0 -0
  235. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/exports/vault.py +0 -0
  236. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/__init__.py +0 -0
  237. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/__init__.py +0 -0
  238. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/artifacts.py +0 -0
  239. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/common.py +0 -0
  240. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/devices.py +0 -0
  241. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/hub_admin.py +0 -0
  242. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/hubs.py +0 -0
  243. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/knowledge.py +0 -0
  244. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/leaderboard.py +0 -0
  245. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/party.py +0 -0
  246. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/projects.py +0 -0
  247. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/sessions.py +0 -0
  248. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/sources.py +0 -0
  249. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/status.py +0 -0
  250. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/storage.py +0 -0
  251. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/team.py +0 -0
  252. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/app.py +0 -0
  253. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/assets.py +0 -0
  254. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/context.py +0 -0
  255. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/handler.py +0 -0
  256. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/jobs.py +0 -0
  257. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/server.py +0 -0
  258. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/__init__.py +0 -0
  259. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/arena.py +0 -0
  260. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/bag.py +0 -0
  261. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/cases.py +0 -0
  262. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/formation.py +0 -0
  263. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/friction.py +0 -0
  264. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/glossary.py +0 -0
  265. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/group_graph.py +0 -0
  266. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/instructions.py +0 -0
  267. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/ladder.py +0 -0
  268. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/learning.py +0 -0
  269. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/market.json +0 -0
  270. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/party.py +0 -0
  271. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/reviews.py +0 -0
  272. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/roadmap.json +0 -0
  273. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/study.py +0 -0
  274. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/suggest.py +0 -0
  275. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/synthesize.py +0 -0
  276. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/weekly.py +0 -0
  277. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/__init__.py +0 -0
  278. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/groups.py +0 -0
  279. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/hubgroups.py +0 -0
  280. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/labels.py +0 -0
  281. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/owners.py +0 -0
  282. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/progress.py +0 -0
  283. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/routing.py +0 -0
  284. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/scope.py +0 -0
  285. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/systems.py +0 -0
  286. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/__init__.py +0 -0
  287. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/container.py +0 -0
  288. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/install.py +0 -0
  289. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/migrate.py +0 -0
  290. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/notify.py +0 -0
  291. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/platforms/__init__.py +0 -0
  292. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/platforms/desktop.py +0 -0
  293. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/platforms/menubar.py +0 -0
  294. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/platforms/windows.py +0 -0
  295. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/statusline.py +0 -0
  296. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/tailnet.py +0 -0
  297. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/update.py +0 -0
  298. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/__init__.py +0 -0
  299. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/access.py +0 -0
  300. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/arena.py +0 -0
  301. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/client.py +0 -0
  302. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/identity.py +0 -0
  303. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/leaderboard.py +0 -0
  304. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/market.py +0 -0
  305. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/membership.py +0 -0
  306. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/news.py +0 -0
  307. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/people.py +0 -0
  308. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/projects.py +0 -0
  309. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/protocol.py +0 -0
  310. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/pull.py +0 -0
  311. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/push.py +0 -0
  312. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/receiver.py +0 -0
  313. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/__init__.py +0 -0
  314. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/antigravity.py +0 -0
  315. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/bob.py +0 -0
  316. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/builder.py +0 -0
  317. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/chatgpt.py +0 -0
  318. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/chats.py +0 -0
  319. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/claude/__init__.py +0 -0
  320. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/claude/export.py +0 -0
  321. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/claude/files.py +0 -0
  322. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/claude/parser.py +0 -0
  323. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/codex/__init__.py +0 -0
  324. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/codex/cloud.py +0 -0
  325. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/codex/parser.py +0 -0
  326. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/copilot.py +0 -0
  327. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/discovery.py +0 -0
  328. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/opencode.py +0 -0
  329. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/prompts.py +0 -0
  330. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/__init__.py +0 -0
  331. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/fts.py +0 -0
  332. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/kv.py +0 -0
  333. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/migrations.py +0 -0
  334. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/mirror.py +0 -0
  335. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/postgres.py +0 -0
  336. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/sqlite.py +0 -0
  337. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/team.py +0 -0
  338. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/AGENT-ICONS.txt +0 -0
  339. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/PLEX-OFL.txt +0 -0
  340. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/adventure.js +0 -0
  341. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-antigravity.svg +0 -0
  342. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-bob.svg +0 -0
  343. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-chatgpt.svg +0 -0
  344. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-claude-ai.svg +0 -0
  345. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-claude.svg +0 -0
  346. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-codex.svg +0 -0
  347. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-copilot.svg +0 -0
  348. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-opencode.svg +0 -0
  349. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-book.webp +0 -0
  350. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-camera.webp +0 -0
  351. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-chip.webp +0 -0
  352. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-clock.webp +0 -0
  353. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-cloud.webp +0 -0
  354. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-coins.webp +0 -0
  355. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-container.webp +0 -0
  356. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-dashboard.webp +0 -0
  357. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-dex.webp +0 -0
  358. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-document.webp +0 -0
  359. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-flag.webp +0 -0
  360. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-folder.webp +0 -0
  361. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-gateway.webp +0 -0
  362. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-gears.webp +0 -0
  363. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-glitch.webp +0 -0
  364. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-globe.webp +0 -0
  365. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-laptop.webp +0 -0
  366. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-log.webp +0 -0
  367. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-lumi.webp +0 -0
  368. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-magnifier.webp +0 -0
  369. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-pip.webp +0 -0
  370. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-plug.webp +0 -0
  371. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-rack.webp +0 -0
  372. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-tink.webp +0 -0
  373. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/battle.js +0 -0
  374. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/boot.js +0 -0
  375. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/favicon.png +0 -0
  376. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/field.js +0 -0
  377. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/i18n.js +0 -0
  378. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/icon-180.png +0 -0
  379. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/icon-192.png +0 -0
  380. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/icon-512.png +0 -0
  381. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/icon.png +0 -0
  382. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/innerlatch.css +0 -0
  383. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/innerlatch.js +0 -0
  384. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/learning.js +0 -0
  385. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/manifest.webmanifest +0 -0
  386. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/panel.css +0 -0
  387. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/panel.html +0 -0
  388. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/panel.js +0 -0
  389. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-mono-400.woff2 +0 -0
  390. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-mono-500.woff2 +0 -0
  391. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-mono-600.woff2 +0 -0
  392. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-sans-400.woff2 +0 -0
  393. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-sans-500.woff2 +0 -0
  394. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-sans-600.woff2 +0 -0
  395. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-sans-700.woff2 +0 -0
  396. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/rough.js +0 -0
  397. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/scene.js +0 -0
  398. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/sprites.js +0 -0
  399. {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/windows.py +0 -0
  400. {interlatch-0.28.6 → interlatch-0.28.7}/tests/antigravity_fixture.py +0 -0
  401. {interlatch-0.28.6 → interlatch-0.28.7}/tests/codex_fixture.py +0 -0
  402. {interlatch-0.28.6 → interlatch-0.28.7}/tests/conftest.py +0 -0
  403. {interlatch-0.28.6 → interlatch-0.28.7}/tests/copilot_fixture.py +0 -0
  404. {interlatch-0.28.6 → interlatch-0.28.7}/tests/friction_fixture.py +0 -0
  405. {interlatch-0.28.6 → interlatch-0.28.7}/tests/golden.py +0 -0
  406. {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/diagram.json +0 -0
  407. {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/parsers/antigravity.json +0 -0
  408. {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/parsers/bob.json +0 -0
  409. {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/parsers/claude_code.json +0 -0
  410. {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/parsers/codex.json +0 -0
  411. {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/parsers/copilot.json +0 -0
  412. {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/parsers/opencode.json +0 -0
  413. {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/systems.json +0 -0
  414. {interlatch-0.28.6 → interlatch-0.28.7}/tests/hubs_fixture.py +0 -0
  415. {interlatch-0.28.6 → interlatch-0.28.7}/tests/opencode_fixture.py +0 -0
  416. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_adventure_web.py +0 -0
  417. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_analysis.py +0 -0
  418. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_antigravity.py +0 -0
  419. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_architecture.py +0 -0
  420. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_arena.py +0 -0
  421. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_artifacts.py +0 -0
  422. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_bag.py +0 -0
  423. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_battle_web.py +0 -0
  424. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_bob_analysis.py +0 -0
  425. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_boot_web.py +0 -0
  426. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_careers.py +0 -0
  427. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_case_files.py +0 -0
  428. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_cases.py +0 -0
  429. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_chat_import.py +0 -0
  430. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_codex.py +0 -0
  431. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_codex_analysis.py +0 -0
  432. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_codex_cloud.py +0 -0
  433. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_container.py +0 -0
  434. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_copilot_bob.py +0 -0
  435. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_dedicated_hub.py +0 -0
  436. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_dedupe.py +0 -0
  437. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_desktop.py +0 -0
  438. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_diagram.py +0 -0
  439. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_ee_boundary.py +0 -0
  440. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_field_web.py +0 -0
  441. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_fix_effect.py +0 -0
  442. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_formation.py +0 -0
  443. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_friction.py +0 -0
  444. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_game_mode.py +0 -0
  445. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_glossary.py +0 -0
  446. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_group_graph.py +0 -0
  447. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_group_sharing.py +0 -0
  448. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_guidance.py +0 -0
  449. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_home_agents.py +0 -0
  450. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub.py +0 -0
  451. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_accept.py +0 -0
  452. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_cookie.py +0 -0
  453. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_groups.py +0 -0
  454. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_inventory_scope.py +0 -0
  455. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_leave_join.py +0 -0
  456. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_news.py +0 -0
  457. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_payload_privacy.py +0 -0
  458. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_projects.py +0 -0
  459. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_projects_listed.py +0 -0
  460. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_purge.py +0 -0
  461. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_send_problems.py +0 -0
  462. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_sharing_race.py +0 -0
  463. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_i18n_web.py +0 -0
  464. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_ingest.py +0 -0
  465. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_instructions.py +0 -0
  466. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_integration.py +0 -0
  467. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_ladder.py +0 -0
  468. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_language.py +0 -0
  469. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_leaderboard.py +0 -0
  470. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_learning_glance.py +0 -0
  471. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_learning_interests.py +0 -0
  472. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_learning_web.py +0 -0
  473. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_leave_project.py +0 -0
  474. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_legacy_package.py +0 -0
  475. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_map_goldens.py +0 -0
  476. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_market.py +0 -0
  477. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_menubar.py +0 -0
  478. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_migrate.py +0 -0
  479. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_mirror.py +0 -0
  480. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_notify.py +0 -0
  481. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_opencode.py +0 -0
  482. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_opencode_analysis.py +0 -0
  483. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_parser.py +0 -0
  484. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_parser_goldens.py +0 -0
  485. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_party.py +0 -0
  486. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_party_map.py +0 -0
  487. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_people.py +0 -0
  488. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_people_hub.py +0 -0
  489. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_people_web.py +0 -0
  490. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_profile_hubs.py +0 -0
  491. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_profile_scope.py +0 -0
  492. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_profiles.py +0 -0
  493. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_project_groups.py +0 -0
  494. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_project_progress.py +0 -0
  495. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_providers.py +0 -0
  496. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_queue.py +0 -0
  497. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_regressions.py +0 -0
  498. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_release.py +0 -0
  499. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_roadmap_catalog.py +0 -0
  500. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_screen.py +0 -0
  501. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_security.py +0 -0
  502. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_setup.py +0 -0
  503. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_statusline.py +0 -0
  504. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_study.py +0 -0
  505. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_suggest.py +0 -0
  506. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_suggest_cli.py +0 -0
  507. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_systems.py +0 -0
  508. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_team.py +0 -0
  509. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_team_home.py +0 -0
  510. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_update.py +0 -0
  511. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_weekly_reanalysis.py +0 -0
  512. {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_windows.py +0 -0
  513. {interlatch-0.28.6 → interlatch-0.28.7}/tests/windows_smoke.py +0 -0
  514. {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/.vscodeignore +0 -0
  515. {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/LICENSE +0 -0
  516. {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/README.md +0 -0
  517. {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/media/icon.png +0 -0
  518. {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/media/interlatch.svg +0 -0
@@ -3,6 +3,11 @@
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.6 (2026-10-20)
7
+
8
+ - **Hubs page, tidier:** **Settings › Hubs** has a tab for each hub and one to add a hub. A hub's tab fits on one
9
+ screen: how sending goes and its buttons on top, then its projects beside what this computer shares with it.
10
+
6
11
  ## 0.28.5 (2026-10-20)
7
12
 
8
13
  - **Settings › Hubs shows each hub's projects and sharing right under it**, on one page, instead of a page per hub
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: interlatch
3
- Version: 0.28.6
3
+ Version: 0.28.7
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,4 @@
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)).
@@ -0,0 +1,5 @@
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)).
@@ -0,0 +1,4 @@
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)).
@@ -0,0 +1,4 @@
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)).
@@ -0,0 +1,4 @@
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)).
@@ -150,6 +150,15 @@ source, and syntheses see each item's stage. Leaving the ladder is a status, not
150
150
  its stage and names its successor, and when an established or canonical item is overturned by a newer one (not
151
151
  just merged as a duplicate), that week's review lists it under **Overturned**.
152
152
 
153
+ ### When a lesson may be out of date
154
+
155
+ The analysis names the files each lesson is about. Interlatch keeps those that the session read or changed in the
156
+ project's folder (up to five) with a hash of what they held when the session was analyzed. When the lesson is read
157
+ later and one of those files has changed or gone, the SessionStart digest and the MCP search add *(may be out of date:
158
+ src/billing.py changed since)*. In the digest, such a bullet is also among the first left out when space is short.
159
+ Only the project's folder on this computer is read. A lesson from a teammate's hub, or from before this was recorded,
160
+ carries no mark. Nothing changes the lesson itself: whether it still holds is for you or the agent to check.
161
+
153
162
  ## Case files
154
163
 
155
164
  Fixes, gotchas and decisions are also kept as case files, so you can learn from them as well as look them up. For
@@ -33,6 +33,7 @@
33
33
  | `interlatch connect <client>` / `disconnect <client>` | Add or remove the MCP server in `claude-desktop`, `cursor`, `windsurf` or `gemini` |
34
34
  | `interlatch mcp [--print-config]` | Run the MCP server (clients start it), or print a config entry for any other MCP client |
35
35
  | `interlatch status` | Health: hooks, agents, MCP, queue, failures |
36
+ | `interlatch feedback [bug\|idea] [--title T] [--print]` | Report a problem (a new issue on GitHub, the default) or suggest an idea (a new discussion in Ideas): shows this install's details (versions, system, how it was installed, analysis, its part in a hub, agents recorded; never paths, addresses or what is in your sessions), then opens the page with them filled in. Nothing is sent until you post it there. `--print`: only print the page's address. Alias `bug`. In the dashboard: **Settings › Feedback** |
36
37
  | `interlatch migrate [--dry-run]` | Move a Chronicle setup over: `~/.claude-chronicle` to `~/.interlatch`, and hooks, MCP servers, permission rules and background agents to the new names. Runs by itself when the dashboard, the sync, `install` or the app starts; `--dry-run` shows what it would change ([Moving from Chronicle](moving-from-chronicle.md)) |
37
38
  | `interlatch tailnet on\|off\|status [--anyone]` | Open the dashboard on your phone and other devices through Tailscale Serve, to your Tailscale login only (`--anyone`: everyone in your tailnet) ([Phone and other computers](devices.md#your-phone)) |
38
39
  | `interlatch mirror [status]` / `mirror sync [--full]` | The copy of this archive in Postgres: where it is, what each table holds and the last write; or write it now (`--full`: every row again) ([A copy in Postgres](postgres.md)) |
@@ -61,7 +62,7 @@
61
62
  `Sessions/YYYY/MM/*.md` with YAML frontmatter, `Projects/*.md` (knowledge base + session list),
62
63
  `Knowledge/<Kind>.md`, `Reviews/YYYY-Www.md`, `Glossary.md`, `Global Playbook.md`.
63
64
 
64
- **Inside your agents** (MCP tools, registered in Claude Code and in each connected agent): `search_knowledge`, `search_sessions`, `get_session`,
65
+ **Inside your agents** (MCP tools, registered in Claude Code and in each connected agent): `resume`, `search_knowledge`, `search_sessions`, `get_session`,
65
66
  `get_transcript`, `project_knowledge`, `glossary`, `find_artifacts`, `recent_sessions`. Ask e.g. *"have we hit this error before?"*
66
67
  or *"what is the deployer_ip rule?"*.
67
68
 
@@ -73,7 +73,7 @@ Settings for `analysis.backend = "<name>"`; [Model providers](analysis.md#model-
73
73
  | `server.trusted_proxies` | `["127.0.0.1", "::1"]` | addresses of the proxies whose `auth_header`, `X-Forwarded-Proto` and `X-Forwarded-For` the dashboard believes; the last `X-Forwarded-For` entry tells visitors apart when they try codes ([too many wrong codes](troubleshooting.md#a-hub)) ([Reaching the hub without Tailscale](devices.md#reaching-the-hub-without-tailscale)) |
74
74
  | `server.behind_proxy` | `false` | a reverse proxy on this computer forwards to the dashboard: no request through it counts as made at the hub itself (which is always an admin), so admins sign in or use the `interlatch hub` commands ([Reaching the hub without Tailscale](devices.md#reaching-the-hub-without-tailscale)) |
75
75
  | `server.menu_bar` | `false` | macOS: the dashboard that runs at login also shows Interlatch's icon in the menu bar (needs the `app` extra); `interlatch install --menu-bar` turns it on ([The menu-bar icon](install.md#the-menu-bar-icon)) |
76
- | `inject.session_start` / `max_chars` | `false` / `3000` | give new sessions a digest of the project's knowledge base (SessionStart hook) |
76
+ | `inject.session_start` / `max_chars` | `false` / `3000` | give new sessions a digest of the project's knowledge base (SessionStart hook), at most `max_chars` characters: to fit, whole items are left out, least useful first, and its last line says how many |
77
77
  | `updates.check_daily` | `false` | ask pypi.org for the latest version once a day while the dashboard is open (Status › Updates) |
78
78
  | `updates.notify` | `false` | the background sync asks pypi.org once a day and shows a desktop notification once per new release (Status › Updates, or `interlatch install --notify-updates`) |
79
79
 
@@ -132,6 +132,14 @@ Codex、Copilot、Bob、Antigravity、OpenCode のセッションも、ログに
132
132
  モデルに渡されます。段階から外れるのは状態(status)の変化です:置き換えられた項目は段階を保ったまま後継の項目を記録し、
133
133
  established や canonical の項目が(単なる重複の統合ではなく)新しい項目に覆されると、その週の振り返りの **Overturned** に載ります。
134
134
 
135
+ ### 教訓が古くなったかもしれないとき
136
+
137
+ 分析は、各教訓がどのファイルについてのものかを挙げます。Interlatch はそのうち、セッションがプロジェクトのフォルダーで読んだか
138
+ 変更したもの(最大 5 つ)を、セッションを分析した時点の中身のハッシュと一緒に記録します。あとで教訓が読まれたとき、そのファイルが
139
+ 変わっていたりなくなっていたりすると、SessionStart の要約と MCP の検索に *(may be out of date: src/billing.py changed since)*
140
+ と付きます。要約では、そうした項目は場所が足りないときに先に省かれます。読むのはこのコンピューター上のプロジェクトのフォルダーだけです。
141
+ チームのハブから届いた教訓や、この記録より前の教訓には付きません。教訓そのものは変わりません。まだ正しいかは、あなたかエージェントが確かめます。
142
+
135
143
  ## 事件簿
136
144
 
137
145
  修正・落とし穴・決定は、調べるためだけでなく学ぶためにも、事件簿(ケースファイル)として残ります。分析はそれぞれについて次を記録します:
@@ -33,6 +33,7 @@
33
33
  | `interlatch connect <client>` / `disconnect <client>` | `claude-desktop`、`cursor`、`windsurf`、`gemini` に MCP サーバーを追加/削除 |
34
34
  | `interlatch mcp [--print-config]` | MCP サーバーを実行(クライアントが起動します)、またはほかの MCP クライアント用の設定項目を出力 |
35
35
  | `interlatch status` | 状態確認:フック、エージェント、MCP、キュー、失敗 |
36
+ | `interlatch feedback [bug\|idea] [--title T] [--print]` | 不具合を報告(GitHub の新しい Issue、既定)、またはアイデアを提案(Ideas の新しいディスカッション)。このインストールの情報(バージョン、システム、インストール方法、分析、ハブでの役割、記録しているエージェント。パス、アドレス、セッションの中身は含みません)を表示してから、それを記入済みのページを開きます。そこで投稿するまで何も送られません。`--print`:ページのアドレスを表示するだけ。別名 `bug`。ダッシュボードでは **設定 › フィードバック** |
36
37
  | `interlatch migrate [--dry-run]` | Chronicle の環境を移行:`~/.claude-chronicle` を `~/.interlatch` に移し、フック、MCP サーバー、許可ルール、バックグラウンドエージェントを新しい名前にします。ダッシュボード、同期、`install`、アプリが始まるときに自動で行われます。`--dry-run` は何が変わるかを表示するだけです([Chronicle からの移行](moving-from-chronicle.md)) |
37
38
  | `interlatch tailnet on\|off\|status [--anyone]` | Tailscale Serve でダッシュボードをスマートフォンやほかのデバイスから開けるようにする。通すのはあなたの Tailscale ログインだけ(`--anyone` で tailnet の全員)([スマートフォンとほかのコンピューター](devices.md#スマートフォン)) |
38
39
  | `interlatch mirror [status]` / `mirror sync [--full]` | このアーカイブの Postgres へのコピー:書き込み先、テーブルごとの中身、最後の書き込みを表示。または今すぐ書き込む(`--full`:すべての行を書き直す)([Postgres へのコピー](postgres.md)) |
@@ -61,7 +62,7 @@
61
62
  `Sessions/YYYY/MM/*.md`、`Projects/*.md`(ナレッジベース+セッション一覧)、`Knowledge/<Kind>.md`、`Reviews/YYYY-Www.md`、
62
63
  `Glossary.md`、`Global Playbook.md`。
63
64
 
64
- **エージェントの中から**(MCP ツール。Claude Code と接続済みの各エージェントに登録):`search_knowledge`、`search_sessions`、
65
+ **エージェントの中から**(MCP ツール。Claude Code と接続済みの各エージェントに登録):`resume`、`search_knowledge`、`search_sessions`、
65
66
  `get_session`、`get_transcript`、`project_knowledge`、`glossary`、`find_artifacts`、`recent_sessions`。たとえば *「このエラー、前にも出た?」* や
66
67
  *「deployer_ip のルールって何だっけ?」* のように尋ねられます。
67
68
 
@@ -73,7 +73,7 @@
73
73
  | `server.trusted_proxies` | `["127.0.0.1", "::1"]` | ダッシュボードが `auth_header`、`X-Forwarded-Proto`、`X-Forwarded-For` を信頼するプロキシのアドレス。コードを試す訪問者は、`X-Forwarded-For` の最後の項目で見分けます([間違ったコードが続いたとき](troubleshooting.md#ハブ))([Tailscale を使わずにハブにつなぐ](devices.md#tailscale-を使わずにハブにつなぐ)) |
74
74
  | `server.behind_proxy` | `false` | このコンピューター上のリバースプロキシがダッシュボードに転送する:それを通るリクエストはハブ自身から(常に管理者)とは見なされず、管理者はサインインするか `interlatch hub` コマンドを使う([Tailscale を使わずにハブにつなぐ](devices.md#tailscale-を使わずにハブにつなぐ)) |
75
75
  | `server.menu_bar` | `false` | macOS:ログイン時に起動するダッシュボードが、メニューバーに Interlatch のアイコンも表示する(`app` エクストラが必要)。`interlatch install --menu-bar` でオンになります([メニューバーアイコン](install.md#メニューバーアイコン)) |
76
- | `inject.session_start` / `max_chars` | `false` / `3000` | 新しいセッションにプロジェクトのナレッジベースの要約を渡す(SessionStart フック) |
76
+ | `inject.session_start` / `max_chars` | `false` / `3000` | 新しいセッションにプロジェクトのナレッジベースの要約を渡す(SessionStart フック)。長さは `max_chars` 文字以内で、収まらないときは役立ちにくい項目から丸ごと省き、最後の行に省いた数を示す |
77
77
  | `updates.check_daily` | `false` | ダッシュボードを開いている間、1 日 1 回 pypi.org に最新バージョンを問い合わせる(Status › Updates) |
78
78
  | `updates.notify` | `false` | バックグラウンド同期が 1 日 1 回 pypi.org に問い合わせ、新しいリリースごとに 1 回デスクトップ通知を表示する(Status › Updates、または `interlatch install --notify-updates`) |
79
79
 
@@ -14,6 +14,7 @@ Interlatch には [Model Context Protocol](https://modelcontextprotocol.io) の
14
14
 
15
15
  | ツール | 返すもの | 引数 |
16
16
  | --- | --- | --- |
17
+ | `resume` | 作業を始めるエージェントのための、プロジェクトの現状:直前のセッションの目的と結果、残した未解決の事項、あなたの判断を待っているもの、そして尋ねたエージェントの前回のセッション以降にほかのセッションがしたことと信頼されるようになった教訓。`max_chars` に収まるよう項目を丸ごと省き、省いた数を示します。 | `project`, `agent`, `max_chars` |
17
18
  | `search_knowledge` | 語句に一致するナレッジ(修正、落とし穴、決定、事実、コマンド、好み)を信頼度の高い順に返し、各項目に[段階](analysis.md#ナレッジの信頼度)(`established ×3`)を付けます。[事件簿](analysis.md#事件簿)に載った項目には、問題が最初にどう見えたかと外れた手がかりも付きます。まず最初に使うツールです。 | `query`, `project`, `kind`, `limit` |
18
19
  | `search_sessions` | トランスクリプトか要約が一致するセッションと、その抜粋 | `query`, `project`, `limit` |
19
20
  | `get_session` | 1 つのセッション:要約、結果、ナレッジ、変更したファイル、プロンプト | `session_id`(または一意な先頭部分) |
@@ -23,9 +24,10 @@ Interlatch には [Model Context Protocol](https://modelcontextprotocol.io) の
23
24
  | `find_artifacts` | セッションが作ったもの:ドキュメント、ページ、図、スライド、公開したリンク、プルリクエスト、コミット。それぞれの場所、ファイルが書いたときのままディスクにあるか、作ったセッション | `query`, `kind`, `project`, `limit` |
24
25
  | `recent_sessions` | 最近のセッション(新しい順) | `project`, `days`, `limit` |
25
26
 
26
- `project` にはパスか名前(`billing-api`)を渡します。省略すると、`project_knowledge` と `glossary` はクライアントがサーバーを
27
+ `project` にはパスか名前(`billing-api`)を渡します。省略すると、`resume`、`project_knowledge` と `glossary` はクライアントがサーバーを
27
28
  起動したディレクトリのプロジェクトを使います。コーディングエージェントはプロジェクトの中で起動しますが、Claude Desktop のような
28
- チャットアプリはそうではないので、質問の中でプロジェクト名を挙げてください。
29
+ チャットアプリはそうではないので、質問の中でプロジェクト名を挙げてください。`resume` は、接続時にクライアントが名乗る名前から
30
+ どのエージェントが尋ねているかを知ります(Claude Code、Codex、Copilot、OpenCode、Antigravity、Bob)。ほかのクライアントは `agent` を渡せます。
29
31
 
30
32
  すべてのツールは読み取り専用(`readOnlyHint`)と宣言しているので、このヒントに対応したクライアントは確認なしで実行できます。
31
33
 
@@ -3,9 +3,15 @@
3
3
  [← Interlatch](../../README.ja.md) · [ドキュメント一覧](README.md)
4
4
 
5
5
  まずは `interlatch status`(またはダッシュボードの **Settings › Status**)を実行してください。フック、バックグラウンドエージェント、
6
- MCP サーバー、`claude` CLI を確認し、最近の分析の失敗を一覧表示します。ログは `~/.interlatch/logs/` にあります
6
+ MCP サーバー、`claude` CLI を確認し、最近の分析の失敗を一覧表示します。**agents** の下には、このコンピューターで
7
+ 見つかったコーディングエージェントごとに 1 行ずつ、Interlatch の MCP サーバーが登録されているか(Claude Code ではフックも)、
8
+ そして実行するコマンドがもう存在しないか、別のインストール(古い `chronicle`、チェックアウトの `.venv`)のものかを表示します。
9
+ `interlatch connect <name>` でこのインストールに向け直せます。ログは `~/.interlatch/logs/` にあります
7
10
  (すべてのログは `chronicle.log`、セッション終了フックのログは `hooks.log`)。
8
11
 
12
+ それでも解決しないときは、`interlatch feedback`(またはダッシュボードの **設定 › フィードバック**)で、インストールの情報を
13
+ 記入済みの GitHub の新しい Issue を開けます。
14
+
9
15
  ## インストールとアプリ
10
16
 
11
17
  **macOS に「“Interlatch”は開けません」や「開発元を検証できません」と表示される。** そのリリースは公証されていません。
@@ -24,6 +24,11 @@ Interlatch 拡張機能は、VS Code のエクスプローラーに 2 つのセ
24
24
  データは、すでに動いているダッシュボード(`interlatch ui`、または `interlatch install` が設定するバックグラウンド
25
25
  サービス)から `http://127.0.0.1:11524`(以前のインストールでは `:8765`)経由で読み込みます。ほかの場所には何も送らず、アカウントも不要です。
26
26
 
27
+ コマンドパレットの **Interlatch: Send Feedback** で、不具合を報告(GitHub の新しい Issue)したり、アイデアを提案
28
+ (Ideas の新しいディスカッション)したりできます。ダッシュボードにこのインストールの情報(`GET /api/feedback`)を
29
+ 尋ね、エディターの名前とバージョン、拡張機能のバージョンを加えて表示し、了承したときだけそれを記入済みの GitHub の
30
+ ページを開きます。そこで投稿するまで何も送られません。
31
+
27
32
  ## インストール
28
33
 
29
34
  VS Code の拡張機能ビューで Interlatch を検索するか、
@@ -33,8 +38,8 @@ Marketplace を使わないエディター(Cursor、Windsurf、Antigravity、V
33
38
 
34
39
  ```bash
35
40
  cd vscode-extension
36
- npx @vscode/vsce package # interlatch-0.3.1.vsix を作成
37
- code --install-extension interlatch-0.3.1.vsix
41
+ npx @vscode/vsce package # interlatch-0.4.0.vsix を作成
42
+ code --install-extension interlatch-0.4.0.vsix
38
43
  ```
39
44
 
40
45
  一覧が読み込む `/api/file` と `/api/files` エンドポイントは、Interlatch と 0.6.1 より新しい Chronicle にあります。
@@ -14,6 +14,7 @@ the network. Every tool only reads the local vault.
14
14
 
15
15
  | Tool | What it returns | Arguments |
16
16
  | --- | --- | --- |
17
+ | `resume` | Where a project stands for an agent starting work in it: the last session's goal, outcome and what it left open, what waits on you, and what other sessions did and which lessons became trusted since the asking agent's previous session there. Fits `max_chars` by leaving out whole items, and says how many. | `project`, `agent`, `max_chars` |
17
18
  | `search_knowledge` | Knowledge items (fixes, gotchas, decisions, facts, commands, preferences) matching the words, the most trusted first, each labelled with its [stage](analysis.md#how-knowledge-earns-trust) (`established ×3`); a [case file](analysis.md#case-files) adds how the problem first showed and the leads ruled out. The best first stop. | `query`, `project`, `kind`, `limit` |
18
19
  | `search_sessions` | Sessions whose transcript or summary matches, with snippets | `query`, `project`, `limit` |
19
20
  | `get_session` | One session: summary, outcome, knowledge, files changed, prompts | `session_id` (or a unique prefix) |
@@ -23,9 +24,11 @@ the network. Every tool only reads the local vault.
23
24
  | `find_artifacts` | What sessions made: documents, pages, diagrams, decks, published links, pull requests and commits, each with where it is, whether the file is still on disk as written, and the session that made it | `query`, `kind`, `project`, `limit` |
24
25
  | `recent_sessions` | Recent sessions, newest first | `project`, `days`, `limit` |
25
26
 
26
- `project` takes a path or a name (`billing-api`). When it is left out, `project_knowledge` and `glossary` use the
27
+ `project` takes a path or a name (`billing-api`). When it is left out, `resume`, `project_knowledge` and `glossary` use the
27
28
  project of the directory the client started the server in. Coding agents start it in your project; desktop chat apps
28
- such as Claude Desktop don't, so name the project in your question there.
29
+ such as Claude Desktop don't, so name the project in your question there. `resume` knows which agent is asking from
30
+ the name its client gives when it connects (Claude Code, Codex, Copilot, OpenCode, Antigravity, Bob); another client can
31
+ pass `agent`.
29
32
 
30
33
  All tools are marked read-only (`readOnlyHint`), so clients that honour the hint can run them without asking.
31
34
 
@@ -3,8 +3,14 @@
3
3
  [← Interlatch](../README.md) · [Docs index](README.md)
4
4
 
5
5
  Start with `interlatch status` (or **Settings › Status** in the dashboard). It checks the hook, the background
6
- agents, the MCP server and the `claude` CLI, and lists recent analysis failures. Logs are in
7
- `~/.interlatch/logs/` (`chronicle.log` for everything, `hooks.log` for session-end hooks).
6
+ agents, the MCP server and the `claude` CLI, and lists recent analysis failures. Under **agents** it has a line for
7
+ each coding agent found on this computer: whether Interlatch's MCP server is in it (and the hooks, for Claude Code), and
8
+ whether the command it runs is gone or belongs to another install (an old `chronicle`, a checkout's `.venv`).
9
+ `interlatch connect <name>` points it at this one. Logs are in `~/.interlatch/logs/` (`chronicle.log` for everything,
10
+ `hooks.log` for session-end hooks).
11
+
12
+ Still stuck? `interlatch feedback` (or **Settings › Feedback** in the dashboard) opens a new GitHub issue with your
13
+ install's details filled in.
8
14
 
9
15
  ## Install and the app
10
16
 
@@ -24,6 +24,11 @@ button on the row, opens the session in the dashboard.
24
24
  It reads from the dashboard you already run (`interlatch ui`, or the background service `interlatch install` sets up),
25
25
  over `http://127.0.0.1:11524` (or `:8765`, where older installs run it). It sends nothing anywhere else and needs no account.
26
26
 
27
+ **Interlatch: Send Feedback**, in the Command Palette, reports a problem (a new issue on GitHub) or suggests an idea (a
28
+ new discussion in Ideas). It asks the dashboard for this install's details (`GET /api/feedback`), adds the editor's
29
+ name and version and the extension's, shows them, and opens the GitHub page with them filled in only if you say so.
30
+ Nothing is sent until you post it there.
31
+
27
32
  ## Install
28
33
 
29
34
  Install **Interlatch** from VS Code's Extensions view (search for Interlatch), or from its
@@ -33,8 +38,8 @@ repository, installed with their own command (`cursor --install-extension …`,
33
38
 
34
39
  ```bash
35
40
  cd vscode-extension
36
- npx @vscode/vsce package # writes interlatch-0.3.1.vsix
37
- code --install-extension interlatch-0.3.1.vsix
41
+ npx @vscode/vsce package # writes interlatch-0.4.0.vsix
42
+ code --install-extension interlatch-0.4.0.vsix
38
43
  ```
39
44
 
40
45
  It needs Interlatch, or a Chronicle newer than 0.6.1, which adds the `/api/file` and `/api/files` endpoints the lists read. With an older one,
@@ -7,7 +7,7 @@ import logging
7
7
  import sqlite3
8
8
  from datetime import timedelta
9
9
 
10
- from ..knowledge import ladder
10
+ from ..knowledge import freshness, ladder
11
11
  from ..sharing import news
12
12
  from ..knowledge.cases import LESSON_KINDS, VISUAL_SCHEMA, lesson_of
13
13
  from ..core.config import Config
@@ -60,7 +60,7 @@ KNOWLEDGE_ITEM_SCHEMA = {
60
60
  "type": "object",
61
61
  "additionalProperties": False,
62
62
  "required": ["kind", "title", "body", "tags", "scope", "confidence", "evidence", "basis", "scene", "question", "answer",
63
- "ruled_out", "clues", "principle", "checklist", "topics", "visual"],
63
+ "ruled_out", "clues", "principle", "checklist", "topics", "visual", "files"],
64
64
  "properties": {
65
65
  "kind": {
66
66
  "type": "string",
@@ -97,6 +97,10 @@ KNOWLEDGE_ITEM_SCHEMA = {
97
97
  "topics": {"type": "array", "items": {"type": "string", "enum": list(TOPICS)},
98
98
  "description": "Up to 4 engineering areas this item actually teaches. Empty for other kinds"},
99
99
  "visual": VISUAL_SCHEMA,
100
+ "files": {"type": "array", "items": {"type": "string"},
101
+ "description": "Up to 5 paths, relative to the project folder, of the files whose code or contents "
102
+ "this item describes, so it can be flagged when they change: only files the session read or "
103
+ "changed. Empty when it isn't about particular files (a preference, a general learning)"},
100
104
  },
101
105
  }
102
106
  FRICTION_SCHEMA = {
@@ -319,6 +323,7 @@ def normalize_knowledge(items) -> list[dict]:
319
323
  **{k: str(item.get(k) or "").strip() if case else "" for k in ("scene", "question", "answer")},
320
324
  "ruled_out": _leads(item.get("ruled_out")) if case else [],
321
325
  **(lesson_of(item) if kind in LESSON_KINDS else {}),
326
+ "files": _str_list(item.get("files"))[:10],
322
327
  })
323
328
  return out
324
329
 
@@ -499,14 +504,14 @@ def store_analysis(conn: sqlite3.Connection, cfg: Config, session_id: str, data:
499
504
  # and a diagram it lacked while its text is unchanged
500
505
  conn.execute(
501
506
  "INSERT INTO knowledge(session_id, project_path, project_name, kind, title, body, tags_json, scope, "
502
- "confidence, evidence, basis, source, source_ref, fingerprint, created_at, updated_at, stage, case_json) "
503
- "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) "
507
+ "confidence, evidence, basis, source, source_ref, fingerprint, created_at, updated_at, stage, case_json, "
508
+ "sources_json) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) "
504
509
  "ON CONFLICT(fingerprint) DO UPDATE SET case_json = CASE WHEN knowledge.case_json IS NULL "
505
510
  "THEN excluded.case_json WHEN knowledge.body = excluded.body AND json_valid(knowledge.case_json) "
506
511
  "AND json_extract(knowledge.case_json, '$.visual') IS NULL "
507
512
  "AND json_extract(excluded.case_json, '$.visual') IS NOT NULL "
508
513
  "THEN json_set(knowledge.case_json, '$.visual', json_extract(excluded.case_json, '$.visual')) "
509
- "ELSE knowledge.case_json END",
514
+ "ELSE knowledge.case_json END, sources_json = COALESCE(knowledge.sources_json, excluded.sources_json)",
510
515
  (
511
516
  session_id, s["project_path"], s["project_name"], item["kind"], redact(item["title"]).strip(),
512
517
  redact(item.get("body") or "").strip(), dumps([t.lower() for t in item.get("tags") or []]),
@@ -515,6 +520,7 @@ def store_analysis(conn: sqlite3.Connection, cfg: Config, session_id: str, data:
515
520
  "guidance" if item.get("basis") == "guidance" else "observed", "analysis", f"prompt-v{PROMPT_VERSION}",
516
521
  fingerprint(session_id, item["kind"], item["title"]), now, now, ladder.initial_stage(item),
517
522
  dumps(case) if case else None,
523
+ freshness.sources_value(freshness.record(conn, session_id, s["project_path"], item.get("files"))),
518
524
  ),
519
525
  )
520
526
  ladder.after_reanalysis(conn, session_id, kept)
@@ -0,0 +1,56 @@
1
+ """Text for an agent's context that fits a character limit by leaving out whole items, least useful first, and says
2
+ what it left out, so the agent knows there is more to search for. A cut never lands mid-line unless even the headings
3
+ and that last line don't fit, and the same input always gives the same text."""
4
+
5
+ from __future__ import annotations
6
+
7
+ from collections.abc import Callable
8
+ from dataclasses import dataclass, field
9
+
10
+
11
+ @dataclass
12
+ class Block:
13
+ """A heading and its items. Each item is (value, group, text): the lowest value goes first when the text is over
14
+ its limit, and `group` names what it is in the "not shown" line. `inline` puts the items on the heading's own
15
+ line, joined by "; "."""
16
+
17
+ heading: str | None
18
+ items: list[tuple[int, str, str]] = field(default_factory=list)
19
+ inline: bool = False
20
+
21
+
22
+ def fit(header: list[str], blocks: list[Block], footer: Callable[[dict[str, int]], str], limit: int,
23
+ left_out: dict[str, int] | None = None) -> str:
24
+ """`header` lines, then each block with the items still in, then `footer(left_out)`, at most `limit` characters.
25
+ `left_out` starts with what the caller already left out (counted per group) and grows with each item dropped."""
26
+ kept = {(b, i) for b, block in enumerate(blocks) for i in range(len(block.items))}
27
+ left = dict(left_out or {})
28
+
29
+ def render() -> str:
30
+ lines = list(header)
31
+ for b, block in enumerate(blocks):
32
+ shown = [text for i, (_, _, text) in enumerate(block.items) if (b, i) in kept]
33
+ if not shown:
34
+ continue
35
+ if block.inline:
36
+ lines.append((block.heading or "") + "; ".join(shown))
37
+ else:
38
+ lines += ([block.heading] if block.heading else []) + shown
39
+ lines.append(footer(left))
40
+ return "\n".join(line for line in lines if line)
41
+
42
+ def weakest(): # the lowest value; on a tie, the later block, then the later item
43
+ return min(((value, -b, -i, group) for b, block in enumerate(blocks)
44
+ for i, (value, group, _) in enumerate(block.items) if (b, i) in kept), default=None)
45
+
46
+ text = render()
47
+ while len(text) > limit and (drop := weakest()):
48
+ kept.discard((-drop[1], -drop[2]))
49
+ left[drop[3]] = left.get(drop[3], 0) + 1
50
+ text = render()
51
+ return text[:limit]
52
+
53
+
54
+ def counted(left_out: dict[str, int], order: tuple[str, ...]) -> str:
55
+ """'3 notes, 1 session': what was left out, in `order`, with plurals."""
56
+ return ", ".join(f"{n} {what}{'s' if n > 1 else ''}" for what in order if (n := left_out.get(what)))
@@ -15,7 +15,8 @@ def cmd_status(args) -> int:
15
15
  from ....analysis.runners.factory import make_runner
16
16
  from ....analysis.runners.settings import env_only_key
17
17
  from ....core.util import human_cost, local_str
18
- from ....runtime.install import UI_LABEL, hooks_installed, launchd_status, mcp_registered, statusline_installed
18
+ from ....runtime.connectors import agents_doctor
19
+ from ....runtime.install import UI_LABEL, executable, hooks_installed, launchd_status, statusline_installed
19
20
  from ....runtime.statusline import WINDOW_LABEL, plan_usage
20
21
  from ....storage.kv import kv_get
21
22
 
@@ -57,11 +58,12 @@ def cmd_status(args) -> int:
57
58
  console.print(f" {ok(ld.get('loaded'))} background sync agent (runs: {ld.get('runs', '-')}, last exit: {ld.get('last_exit', '-')})")
58
59
  console.print(f" {ok(ui.get('loaded'))} dashboard agent: http://127.0.0.1:{cfg.server_port}/")
59
60
  runner = make_runner(cfg)
60
- console.print(f" {ok(mcp_registered())} MCP server registered {ok(runner.available())} analysis by {runner.label}: "
61
+ console.print(f" {ok(runner.available())} analysis by {runner.label}: "
61
62
  f"{runner.where() if runner.available() else runner.unavailable_reason()}")
62
63
  if runner.available() and (env := env_only_key(cfg, runner.name)):
63
64
  console.print(f" [yellow]![/] its key is only in ${env}: background analysis and the dashboard don't see it "
64
65
  f"(`interlatch config set-key {runner.name}` saves it)", highlight=False)
66
+ _print_agents(console, agents_doctor(cfg, conn, executable()), hooked=bool(hooks.get("SessionEnd")))
65
67
  console.print(f" sessions: {sum(counts.values())} · " + " · ".join(f"{k}: {v}" for k, v in sorted(counts.items())))
66
68
  console.print(f" analysis queue: {pending['ready']} ready now, {pending['queued']} queued in all, {pending['held']} held · "
67
69
  f"model {runner.model_label()} · auto={'on' if cfg.analysis.auto else 'off'} · spent {human_cost(spent)}")
@@ -78,6 +80,63 @@ def cmd_status(args) -> int:
78
80
  return 0
79
81
 
80
82
 
83
+ def _print_agents(console, rows: list[dict], *, hooked: bool) -> None:
84
+ """`interlatch status`: a line per agent found here, with Interlatch's MCP server (and Claude Code's hooks) in it,
85
+ and whether the command each one runs is still there and is this install."""
86
+ if not rows:
87
+ return
88
+ console.print(" agents:")
89
+ width = max(len(r["label"]) for r in rows)
90
+ for r in rows:
91
+ fix = f"`interlatch connect {r['name']}`"
92
+ what = {"mcp": "MCP server", "hook": "hook"}
93
+ problems = [f"{what[p['what']]} runs {p['command']}, " + ("which is gone" if p["problem"] == "missing" else "not this install")
94
+ for p in r["problems"]]
95
+ if problems:
96
+ missing = any(p["problem"] == "missing" for p in r["problems"])
97
+ mark, text = "[red]✗[/]" if missing else "[yellow]![/]", "; ".join(problems) + f" ({fix} fixes it)"
98
+ elif r["mcp"]:
99
+ mark, text = "[green]✓[/]", "MCP server" + (" + SessionEnd hook" if r["name"] == "claude" and hooked else "")
100
+ elif r["optional"]:
101
+ mark, text = "[dim]–[/]", f"no MCP server (optional: {fix})"
102
+ else:
103
+ mark, text = "[red]✗[/]", f"no MCP server ({fix} adds it)"
104
+ console.print(f" {mark} {r['label']:<{width}} {text} · [dim]{r['config']}[/]", highlight=False)
105
+
106
+
107
+ def cmd_feedback(args) -> int:
108
+ """`interlatch feedback`: report a problem or suggest an idea on GitHub, with this install's details filled in."""
109
+ from ....runtime.feedback import details, report
110
+
111
+ cfg = load_cfg()
112
+ console = new_console()
113
+ try:
114
+ conn = open_archive(cfg)
115
+ except Exception: # a broken archive is worth reporting too: the report just doesn't list the agents
116
+ conn = None
117
+ rows = details(cfg, conn)
118
+ if conn is not None:
119
+ conn.close()
120
+ r = report(args.kind, rows, args.title or "")
121
+ if args.print:
122
+ print(r["url"])
123
+ return 0
124
+ where = "a new issue" if r["kind"] == "bug" else "a new discussion in Ideas"
125
+ console.print(f"[bold]{'Report a problem' if r['kind'] == 'bug' else 'Suggest an idea'}[/]: opens {where} on "
126
+ "GitHub with these details filled in. Nothing is sent from here: you write the rest and post it "
127
+ "yourself.", highlight=False)
128
+ for label, value in r["details"]:
129
+ console.print(f" {label + ':':<17} {value}", highlight=False, markup=False)
130
+ if sys.stdin.isatty() and sys.stdout.isatty():
131
+ if input("Open it in your browser? [Y/n] ").strip().lower() in ("", "y", "yes"):
132
+ import webbrowser
133
+
134
+ if webbrowser.open(r["url"]):
135
+ return 0
136
+ console.print(f"Open this address to write it:\n{r['url']}", highlight=False, markup=False, soft_wrap=True)
137
+ return 0
138
+
139
+
81
140
  def cmd_container(args) -> int:
82
141
  from ....runtime.container import main
83
142
 
@@ -259,6 +318,16 @@ def add_status(sub) -> None:
259
318
  s.set_defaults(fn=cmd_status)
260
319
 
261
320
 
321
+ def add_feedback(sub) -> None:
322
+ s = sub.add_parser("feedback", aliases=["bug"],
323
+ help="report a problem or suggest an idea on GitHub, with this install's details filled in")
324
+ s.add_argument("kind", nargs="?", choices=["bug", "idea"], default="bug",
325
+ help="bug: a new issue (the default); idea: a new discussion in Ideas")
326
+ s.add_argument("--title", help="the title to start with")
327
+ s.add_argument("--print", action="store_true", help="only print the address, don't ask or open a browser")
328
+ s.set_defaults(fn=cmd_feedback)
329
+
330
+
262
331
  def add_leaderboard(sub) -> None:
263
332
  s = sub.add_parser("leaderboard", help="the usage leaderboard: sign in with Google and compare hours, sessions and tokens")
264
333
  s.add_argument("action", nargs="?", choices=["status", "join", "send", "leave"], default="status")
@@ -9,7 +9,7 @@ from ... import __version__
9
9
  from .commands.archive import add_export, add_forget, add_projects, add_search, add_sessions, add_show, add_stats
10
10
  from .commands.knowledge import (add_analyze, add_context, add_friction, add_glossary, add_knowledge, add_review,
11
11
  add_suggest, add_synthesize, add_systems)
12
- from .commands.operations import add_container, add_leaderboard, add_mirror, add_status, add_tailnet
12
+ from .commands.operations import add_container, add_feedback, add_leaderboard, add_mirror, add_status, add_tailnet
13
13
  from .commands.hubs import add_group, add_hubs, add_profile
14
14
  from .commands.recording import (add_connect, add_disconnect, add_hook, add_import, add_ingest_session, add_screen,
15
15
  add_sources, add_sync, add_work)
@@ -26,8 +26,8 @@ def prog_name() -> str:
26
26
 
27
27
 
28
28
  # every command, in the order `interlatch --help` lists them
29
- COMMANDS = (add_install, add_uninstall, add_status, add_sync, add_work, add_analyze, add_synthesize, add_sessions,
30
- add_show, add_search, add_knowledge, add_projects, add_stats, add_ui, add_app, add_export, add_glossary,
29
+ COMMANDS = (add_install, add_uninstall, add_status, add_feedback, add_sync, add_work, add_analyze, add_synthesize,
30
+ add_sessions, add_show, add_search, add_knowledge, add_projects, add_stats, add_ui, add_app, add_export, add_glossary,
31
31
  add_systems, add_review, add_suggest, add_friction, add_forget, add_sources, add_connect, add_disconnect,
32
32
  add_import, add_screen, add_context, add_config, add_migrate, add_mcp, add_leaderboard, add_mirror,
33
33
  add_tailnet, add_hub, add_push, add_hubs, add_group, add_profile, add_container, add_hook, add_ingest_session)
@@ -15,6 +15,7 @@ from ..core.artifact_records import KINDS as ARTIFACT_KINDS
15
15
  from ..artifacts.queries import STATUS as ARTIFACT_STATUS
16
16
  from ..storage.sqlite import connect
17
17
  from ..sharing.pull import team_from
18
+ from ..knowledge.freshness import stale_note
18
19
  from ..knowledge.ladder import stage_label
19
20
  from ..core.redact import redact
20
21
  from ..application.search import search_knowledge, search_sessions
@@ -32,7 +33,8 @@ INSTRUCTIONS = (
32
33
  "(fixes, gotchas, decisions, project facts, commands, preferences), per-project knowledge bases, and the artifacts "
33
34
  "sessions made (documents, pages, diagrams, decks, published links, pull requests, commits). "
34
35
  "Use it to recall how something was solved before, why a decision was made, how a project is run or "
35
- "deployed, what the user prefers, or where an earlier deliverable is, before re-deriving it."
36
+ "deployed, what the user prefers, or where an earlier deliverable is, before re-deriving it. "
37
+ "When you start work in a project, call `resume` first: where the last session left things and what changed since."
36
38
  )
37
39
 
38
40
  _PROJECT_PROP = {"type": "string", "description": "Project path or name. Defaults to all projects."}
@@ -41,6 +43,25 @@ _AGENT_PROP = {"type": "string", "enum": list(AGENTS),
41
43
  + ". Defaults to all."}
42
44
  # every tool only reads the local vault: clients may run them without asking, and nothing reaches the network
43
45
  TOOLS = [
46
+ {
47
+ "name": "resume",
48
+ "annotations": {"title": "Resume a project", "readOnlyHint": True, "destructiveHint": False,
49
+ "idempotentHint": True, "openWorldHint": False},
50
+ "description": "Call this when you start work in a project. Where the last session left things (its goal, "
51
+ "outcome and what it left open), what waits on the user, and, given `agent`, what other "
52
+ "sessions did and which lessons became trusted since your previous session here. Fits "
53
+ "`max_chars` by leaving out whole items and says how many it left out.",
54
+ "inputSchema": {
55
+ "type": "object",
56
+ "properties": {
57
+ "project": {"type": "string", "description": "Project path or name. Defaults to the current folder's project."},
58
+ "agent": {"type": "string", "enum": list(AGENTS),
59
+ "description": "You, the agent asking (" + ", ".join(f"{k}: {v[0]}" for k, v in AGENTS.items())
60
+ + "). Defaults to what your MCP client said it is when it connected."},
61
+ "max_chars": {"type": "integer", "default": 6000, "minimum": 1000, "maximum": 20000},
62
+ },
63
+ },
64
+ },
44
65
  {
45
66
  "name": "search_knowledge",
46
67
  "annotations": {"title": "Search knowledge", "readOnlyHint": True, "destructiveHint": False,
@@ -176,6 +197,7 @@ class Tools:
176
197
  self.cwd = os.getcwd()
177
198
  # named profiles: only what the agent's folder owns (Personal's, a profile's, or nothing while it waits)
178
199
  self.owner = scoped_for(cfg, self.conn, self.cwd)
200
+ self.client: str | None = None # the MCP client's own name, from `initialize`
179
201
 
180
202
  def _resolve_project(self, project: str | None) -> str | None:
181
203
  if not project:
@@ -190,6 +212,15 @@ class Tools:
190
212
  return path
191
213
  return project
192
214
 
215
+ def resume(self, project: str | None = None, agent: str | None = None, max_chars: int = 6000) -> str:
216
+ from ..projects.resume import agent_of_client, resume_text
217
+ from ..runtime.hooks import _project_here
218
+
219
+ path = self._resolve_project(project) if project else _project_here(self.conn, self.cwd)
220
+ name = project_labels(self.conn).get(path) or path.rstrip("/").rsplit("/", 1)[-1]
221
+ agent = agent if agent in AGENTS else agent_of_client(self.client)
222
+ return resume_text(self.conn, path, name, agent=agent, limit=max_chars)
223
+
193
224
  def search_knowledge(self, query: str, project: str | None = None, kind: str | None = None, limit: int = 15) -> str:
194
225
  rows = search_knowledge(self.conn, query, project=self._resolve_project(project), kind=kind, limit=limit)
195
226
  if not rows:
@@ -200,6 +231,7 @@ class Tools:
200
231
  if k["source"] == "team": # a teammate's lesson the team hub sent: whose sessions stated it
201
232
  src = "teammates' sessions" + (f" on {', '.join(who)}" if (who := team_from(k)) else "") + ", via the team hub"
202
233
  trust = stage_label(k) + (f" ({k['stage_reason']})" if k.get("stage_reason") else "")
234
+ trust += stale_note(k.get("project_path"), k.get("sources_json"))
203
235
  out.append(f"## [{k['kind']} · {stage_label(k)}] {k['title']}\n_{k.get('project_name') or '-'} · {trust} · "
204
236
  f"{k.get('confidence') or '-'} confidence · {src}_\n\n{truncate(k.get('body') or '', 1500)}\n"
205
237
  + "".join(f"{line}\n" for line in case_lines(k)))
@@ -367,6 +399,8 @@ def serve(cfg: Config) -> int:
367
399
  sys.stdout.write(json.dumps(replies, ensure_ascii=False) + "\n")
368
400
  sys.stdout.flush()
369
401
  continue
402
+ if isinstance(msg, dict) and msg.get("method") == "initialize":
403
+ tools.client = ((msg.get("params") or {}).get("clientInfo") or {}).get("name")
370
404
  reply = _handle(msg, handlers)
371
405
  if reply is not None:
372
406
  _write(reply)