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.
- {interlatch-0.28.6 → interlatch-0.28.7}/CHANGELOG.md +5 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/PKG-INFO +1 -1
- interlatch-0.28.7/changelog.d/doctor-agents.md +4 -0
- interlatch-0.28.7/changelog.d/feedback.md +5 -0
- interlatch-0.28.7/changelog.d/knowledge-freshness.md +4 -0
- interlatch-0.28.7/changelog.d/mcp-resume.md +4 -0
- interlatch-0.28.7/changelog.d/session-start-budget.md +4 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/analysis.md +9 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/cli.md +2 -1
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/configuration.md +1 -1
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/analysis.md +8 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/cli.md +2 -1
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/configuration.md +1 -1
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/mcp.md +4 -2
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/troubleshooting.md +7 -1
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/vscode.md +7 -2
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/mcp.md +5 -2
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/troubleshooting.md +8 -2
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/vscode.md +7 -2
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/session.py +11 -5
- interlatch-0.28.7/src/interlatch/core/budget.py +56 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/operations.py +71 -2
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/parser.py +3 -3
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/mcp.py +35 -1
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/settings.py +26 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/routes.py +2 -0
- interlatch-0.28.7/src/interlatch/knowledge/freshness.py +116 -0
- interlatch-0.28.7/src/interlatch/projects/resume.py +103 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/connectors.py +120 -5
- interlatch-0.28.7/src/interlatch/runtime/feedback.py +96 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/hooks.py +68 -26
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/schema.py +3 -2
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/app.css +12 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/app.js +34 -4
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/index.html +1 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/ja.js +12 -0
- interlatch-0.28.7/tests/fixtures/db/0.21.3/chronicle.db +0 -0
- interlatch-0.28.7/tests/fixtures/db/0.21.3/expected.json +125 -0
- interlatch-0.28.7/tests/fixtures/db/0.27.8/chronicle.db +0 -0
- interlatch-0.28.7/tests/fixtures/db/0.27.8/expected.json +125 -0
- interlatch-0.28.7/tests/fixtures/db/0.5.0/chronicle.db +0 -0
- interlatch-0.28.7/tests/fixtures/db/0.5.0/expected.json +108 -0
- interlatch-0.28.7/tests/fixtures/db/README.md +61 -0
- interlatch-0.28.7/tests/fixtures/db/make_fixture.py +271 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/cli.json +60 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_cli_pins.py +1 -0
- interlatch-0.28.7/tests/test_db_compat.py +145 -0
- interlatch-0.28.7/tests/test_doctor_agents.py +136 -0
- interlatch-0.28.7/tests/test_feedback.py +87 -0
- interlatch-0.28.7/tests/test_knowledge_freshness.py +115 -0
- interlatch-0.28.7/tests/test_mcp_resume.py +114 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_route_matrix.py +1 -0
- interlatch-0.28.7/tests/test_session_context_budget.py +98 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/uv.lock +87 -82
- {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/extension.js +31 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/package.json +7 -1
- interlatch-0.28.6/changelog.d/hubs-tabs.md +0 -2
- {interlatch-0.28.6 → interlatch-0.28.7}/.github/dependabot.yml +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.github/windows-ja-qa/driver.ps1 +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.github/windows-ja-qa/ja_check.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.github/windows-ja-qa/report.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.github/windows-ja-qa/shots.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.github/windows-ja-qa/user.ps1 +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.github/workflows/changelog.yml +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.github/workflows/ci.yml +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.github/workflows/docs.yml +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.github/workflows/release.yml +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.github/workflows/windows-ja-qa.yml +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.gitignore +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.pre-commit-config.yaml +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/.python-version +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/CONTRIBUTING.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/LICENSE +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/README.ja.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/README.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/ROADMAP.ja.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/ROADMAP.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/SECURITY.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/careers/README.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/careers/boards.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/careers/pipeline.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/changelog.d/README.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/dev.sh +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docker/.dockerignore +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docker/.env.example +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docker/Caddyfile +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docker/Dockerfile +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docker/compose.yaml +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docker/wheels/.gitignore +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/README.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/_site/hooks.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/dashboard.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/demo/make_demo.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/demo/record_demo.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/design/innerlatch.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/design/ja/innerlatch.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/design/ja/learning.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/design/learning.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/development.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/devices.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/diagrams/analysis.excalidraw.svg +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/diagrams/architecture.excalidraw.svg +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/docker.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/faq.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/images/demo.gif +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/images/home.png +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/images/map.png +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/images/palette.png +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/images/session.png +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/install.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/README.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/dashboard.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/development.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/devices.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/docker.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/faq.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/install.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/join-a-hub.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/moving-from-chronicle.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/party.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/postgres.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/privacy.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/profiles.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/sources.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/ja/suggestions.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/join-a-hub.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/moving-from-chronicle.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/party.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/postgres.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/privacy.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/profiles.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/sources.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/docs/suggestions.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/leaderboard/.firebaserc +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/leaderboard/.gitignore +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/leaderboard/README.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/leaderboard/firebase.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/leaderboard/firestore.indexes.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/leaderboard/firestore.rules +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/mkdocs.yml +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/README.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/art.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/filing.html +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/loops.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/loops.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/members.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/render.html +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/render.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/scenes-more.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/icons3d/scenes.html +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/Chronicle.icns +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/Interlatch.spec +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/build.sh +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/entitlements.plist +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/icon-3d.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/icon-blueprint-prompt.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/icon-blueprint.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/icon.png +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/interlatch_app.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/macos/make_icon.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/packaging/release.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/pyproject.toml +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/chronicle/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/chronicle/__main__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/chronicle/windows.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/__main__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/digest.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/language.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/queue.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/api.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/base.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/bob.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/claude.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/codex.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/factory.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/off.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/opencode.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/process.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/replies.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/runners/settings.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/screen.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/analysis/worker.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/application/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/application/profiles.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/application/records.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/application/search.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/application/workflows.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/artifacts/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/artifacts/files.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/artifacts/queries.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/cli.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/agents.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/artifact_records.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/config.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/diagrams.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/i18n/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/i18n/ja.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/machine.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/paths.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/pricing.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/process.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/profiles.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/redact.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/sessions.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/core/util.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/analyses.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/archive.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/chat_import.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/deletion.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/history.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/memory.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/persistence.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/report.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/ingestion/service.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/archive.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/hubs.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/knowledge.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/recording.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/setup.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/sharing.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/common.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/main.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/exports/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/exports/diagrams.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/exports/markdown.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/exports/sessions.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/exports/vault.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/artifacts.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/common.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/devices.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/hub_admin.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/hubs.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/knowledge.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/leaderboard.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/party.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/projects.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/sessions.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/sources.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/status.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/storage.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/api/team.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/app.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/assets.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/context.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/handler.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/jobs.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/web/server.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/arena.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/bag.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/cases.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/formation.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/friction.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/glossary.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/group_graph.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/instructions.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/ladder.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/learning.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/market.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/party.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/reviews.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/roadmap.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/study.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/suggest.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/synthesize.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/knowledge/weekly.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/groups.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/hubgroups.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/labels.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/owners.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/progress.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/routing.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/scope.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/projects/systems.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/container.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/install.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/migrate.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/notify.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/platforms/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/platforms/desktop.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/platforms/menubar.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/platforms/windows.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/statusline.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/tailnet.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/runtime/update.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/access.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/arena.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/client.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/identity.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/leaderboard.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/market.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/membership.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/news.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/people.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/projects.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/protocol.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/pull.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/push.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sharing/receiver.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/antigravity.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/bob.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/builder.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/chatgpt.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/chats.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/claude/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/claude/export.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/claude/files.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/claude/parser.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/codex/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/codex/cloud.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/codex/parser.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/copilot.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/discovery.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/opencode.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/sources/prompts.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/__init__.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/fts.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/kv.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/migrations.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/mirror.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/postgres.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/sqlite.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/storage/team.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/AGENT-ICONS.txt +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/PLEX-OFL.txt +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/adventure.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-antigravity.svg +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-bob.svg +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-chatgpt.svg +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-claude-ai.svg +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-claude.svg +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-codex.svg +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-copilot.svg +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/agent-opencode.svg +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-book.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-camera.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-chip.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-clock.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-cloud.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-coins.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-container.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-dashboard.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-dex.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-document.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-flag.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-folder.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-gateway.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-gears.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-glitch.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-globe.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-laptop.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-log.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-lumi.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-magnifier.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-pip.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-plug.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-rack.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/art-tink.webp +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/battle.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/boot.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/favicon.png +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/field.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/i18n.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/icon-180.png +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/icon-192.png +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/icon-512.png +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/icon.png +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/innerlatch.css +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/innerlatch.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/learning.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/manifest.webmanifest +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/panel.css +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/panel.html +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/panel.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-mono-400.woff2 +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-mono-500.woff2 +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-mono-600.woff2 +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-sans-400.woff2 +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-sans-500.woff2 +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-sans-600.woff2 +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/plex-sans-700.woff2 +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/rough.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/scene.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/web/sprites.js +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/windows.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/antigravity_fixture.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/codex_fixture.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/conftest.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/copilot_fixture.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/friction_fixture.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/golden.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/diagram.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/parsers/antigravity.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/parsers/bob.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/parsers/claude_code.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/parsers/codex.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/parsers/copilot.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/parsers/opencode.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/goldens/systems.json +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/hubs_fixture.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/opencode_fixture.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_adventure_web.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_analysis.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_antigravity.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_architecture.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_arena.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_artifacts.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_bag.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_battle_web.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_bob_analysis.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_boot_web.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_careers.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_case_files.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_cases.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_chat_import.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_codex.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_codex_analysis.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_codex_cloud.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_container.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_copilot_bob.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_dedicated_hub.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_dedupe.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_desktop.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_diagram.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_ee_boundary.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_field_web.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_fix_effect.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_formation.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_friction.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_game_mode.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_glossary.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_group_graph.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_group_sharing.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_guidance.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_home_agents.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_accept.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_cookie.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_groups.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_inventory_scope.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_leave_join.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_news.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_payload_privacy.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_projects.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_projects_listed.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_purge.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_send_problems.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_hub_sharing_race.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_i18n_web.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_ingest.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_instructions.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_integration.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_ladder.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_language.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_leaderboard.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_learning_glance.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_learning_interests.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_learning_web.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_leave_project.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_legacy_package.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_map_goldens.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_market.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_menubar.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_migrate.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_mirror.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_notify.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_opencode.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_opencode_analysis.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_parser.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_parser_goldens.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_party.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_party_map.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_people.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_people_hub.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_people_web.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_profile_hubs.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_profile_scope.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_profiles.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_project_groups.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_project_progress.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_providers.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_queue.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_regressions.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_release.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_roadmap_catalog.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_screen.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_security.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_setup.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_statusline.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_study.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_suggest.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_suggest_cli.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_systems.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_team.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_team_home.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_update.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_weekly_reanalysis.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/test_windows.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/tests/windows_smoke.py +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/.vscodeignore +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/LICENSE +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/README.md +0 -0
- {interlatch-0.28.6 → interlatch-0.28.7}/vscode-extension/media/icon.png +0 -0
- {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.
|
|
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
|
|
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.
|
|
37
|
-
code --install-extension interlatch-0.
|
|
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.
|
|
7
|
-
|
|
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.
|
|
37
|
-
code --install-extension interlatch-0.
|
|
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)))
|
{interlatch-0.28.6 → interlatch-0.28.7}/src/interlatch/interfaces/cli/commands/operations.py
RENAMED
|
@@ -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.
|
|
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(
|
|
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,
|
|
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)
|