interlatch 0.28.7__tar.gz → 0.28.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {interlatch-0.28.7 → interlatch-0.28.8}/CHANGELOG.md +24 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/PKG-INFO +1 -1
- interlatch-0.28.8/changelog.d/signin-page-design.md +3 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/i18n/ja.py +2 -2
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/handler.py +46 -16
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/app.css +12 -0
- interlatch-0.28.8/src/interlatch/web/signin.js +28 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_i18n_web.py +1 -1
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_mcp_resume.py +4 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_people_web.py +9 -4
- interlatch-0.28.7/changelog.d/doctor-agents.md +0 -4
- interlatch-0.28.7/changelog.d/feedback.md +0 -5
- interlatch-0.28.7/changelog.d/knowledge-freshness.md +0 -4
- interlatch-0.28.7/changelog.d/mcp-resume.md +0 -4
- interlatch-0.28.7/changelog.d/session-start-budget.md +0 -4
- {interlatch-0.28.7 → interlatch-0.28.8}/.github/dependabot.yml +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.github/windows-ja-qa/driver.ps1 +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.github/windows-ja-qa/ja_check.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.github/windows-ja-qa/report.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.github/windows-ja-qa/shots.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.github/windows-ja-qa/user.ps1 +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.github/workflows/changelog.yml +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.github/workflows/ci.yml +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.github/workflows/docs.yml +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.github/workflows/release.yml +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.github/workflows/windows-ja-qa.yml +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.gitignore +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.pre-commit-config.yaml +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/.python-version +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/CONTRIBUTING.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/LICENSE +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/README.ja.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/README.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/ROADMAP.ja.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/ROADMAP.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/SECURITY.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/careers/README.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/careers/boards.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/careers/pipeline.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/changelog.d/README.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/dev.sh +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docker/.dockerignore +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docker/.env.example +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docker/Caddyfile +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docker/Dockerfile +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docker/compose.yaml +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docker/wheels/.gitignore +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/README.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/_site/hooks.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/analysis.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/cli.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/configuration.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/dashboard.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/demo/make_demo.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/demo/record_demo.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/design/innerlatch.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/design/ja/innerlatch.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/design/ja/learning.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/design/learning.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/development.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/devices.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/diagrams/analysis.excalidraw.svg +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/diagrams/architecture.excalidraw.svg +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/docker.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/faq.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/images/demo.gif +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/images/home.png +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/images/map.png +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/images/palette.png +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/images/session.png +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/install.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/README.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/analysis.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/cli.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/configuration.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/dashboard.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/development.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/devices.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/docker.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/faq.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/install.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/join-a-hub.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/mcp.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/moving-from-chronicle.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/party.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/postgres.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/privacy.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/profiles.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/sources.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/suggestions.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/troubleshooting.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/ja/vscode.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/join-a-hub.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/mcp.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/moving-from-chronicle.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/party.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/postgres.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/privacy.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/profiles.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/sources.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/suggestions.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/troubleshooting.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/docs/vscode.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/leaderboard/.firebaserc +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/leaderboard/.gitignore +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/leaderboard/README.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/leaderboard/firebase.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/leaderboard/firestore.indexes.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/leaderboard/firestore.rules +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/mkdocs.yml +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/README.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/art.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/filing.html +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/loops.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/loops.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/members.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/render.html +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/render.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/scenes-more.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/icons3d/scenes.html +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/Chronicle.icns +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/Interlatch.spec +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/build.sh +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/entitlements.plist +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/icon-3d.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/icon-blueprint-prompt.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/icon-blueprint.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/icon.png +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/interlatch_app.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/macos/make_icon.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/packaging/release.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/pyproject.toml +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/chronicle/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/chronicle/__main__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/chronicle/windows.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/__main__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/digest.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/language.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/queue.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/api.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/base.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/bob.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/claude.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/codex.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/factory.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/off.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/opencode.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/process.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/replies.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/runners/settings.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/screen.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/session.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/analysis/worker.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/application/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/application/profiles.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/application/records.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/application/search.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/application/workflows.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/artifacts/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/artifacts/files.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/artifacts/queries.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/cli.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/agents.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/artifact_records.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/budget.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/config.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/diagrams.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/i18n/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/machine.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/paths.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/pricing.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/process.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/profiles.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/redact.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/sessions.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/core/util.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/analyses.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/archive.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/chat_import.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/deletion.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/history.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/memory.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/persistence.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/report.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/ingestion/service.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/archive.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/hubs.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/knowledge.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/operations.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/recording.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/setup.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/commands/sharing.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/common.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/main.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/cli/parser.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/exports/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/exports/diagrams.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/exports/markdown.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/exports/sessions.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/exports/vault.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/mcp.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/artifacts.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/common.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/devices.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/hub_admin.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/hubs.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/knowledge.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/leaderboard.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/party.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/projects.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/sessions.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/settings.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/sources.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/status.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/storage.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/api/team.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/app.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/assets.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/context.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/jobs.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/routes.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/interfaces/web/server.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/arena.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/bag.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/cases.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/formation.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/freshness.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/friction.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/glossary.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/group_graph.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/instructions.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/ladder.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/learning.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/market.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/party.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/reviews.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/roadmap.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/study.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/suggest.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/synthesize.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/knowledge/weekly.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/groups.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/hubgroups.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/labels.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/owners.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/progress.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/resume.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/routing.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/scope.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/projects/systems.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/connectors.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/container.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/feedback.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/hooks.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/install.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/migrate.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/notify.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/platforms/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/platforms/desktop.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/platforms/menubar.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/platforms/windows.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/statusline.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/tailnet.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/runtime/update.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/access.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/arena.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/client.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/identity.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/leaderboard.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/market.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/membership.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/news.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/people.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/projects.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/protocol.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/pull.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/push.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sharing/receiver.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/antigravity.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/bob.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/builder.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/chatgpt.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/chats.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/claude/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/claude/export.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/claude/files.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/claude/parser.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/codex/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/codex/cloud.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/codex/parser.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/copilot.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/discovery.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/opencode.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/sources/prompts.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/__init__.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/fts.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/kv.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/migrations.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/mirror.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/postgres.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/schema.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/sqlite.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/storage/team.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/AGENT-ICONS.txt +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/PLEX-OFL.txt +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/adventure.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-antigravity.svg +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-bob.svg +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-chatgpt.svg +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-claude-ai.svg +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-claude.svg +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-codex.svg +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-copilot.svg +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/agent-opencode.svg +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/app.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-book.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-camera.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-chip.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-clock.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-cloud.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-coins.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-container.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-dashboard.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-dex.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-document.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-flag.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-folder.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-gateway.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-gears.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-glitch.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-globe.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-laptop.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-log.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-lumi.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-magnifier.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-pip.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-plug.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-rack.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/art-tink.webp +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/battle.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/boot.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/favicon.png +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/field.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/i18n.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/icon-180.png +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/icon-192.png +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/icon-512.png +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/icon.png +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/index.html +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/innerlatch.css +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/innerlatch.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/ja.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/learning.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/manifest.webmanifest +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/panel.css +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/panel.html +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/panel.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-mono-400.woff2 +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-mono-500.woff2 +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-mono-600.woff2 +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-sans-400.woff2 +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-sans-500.woff2 +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-sans-600.woff2 +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/plex-sans-700.woff2 +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/rough.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/scene.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/web/sprites.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/src/interlatch/windows.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/antigravity_fixture.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/codex_fixture.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/conftest.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/copilot_fixture.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/0.21.3/chronicle.db +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/0.21.3/expected.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/0.27.8/chronicle.db +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/0.27.8/expected.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/0.5.0/chronicle.db +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/0.5.0/expected.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/README.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/fixtures/db/make_fixture.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/friction_fixture.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/golden.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/cli.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/diagram.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/parsers/antigravity.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/parsers/bob.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/parsers/claude_code.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/parsers/codex.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/parsers/copilot.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/parsers/opencode.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/goldens/systems.json +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/hubs_fixture.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/opencode_fixture.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_adventure_web.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_analysis.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_antigravity.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_architecture.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_arena.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_artifacts.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_bag.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_battle_web.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_bob_analysis.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_boot_web.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_careers.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_case_files.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_cases.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_chat_import.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_cli_pins.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_codex.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_codex_analysis.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_codex_cloud.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_container.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_copilot_bob.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_db_compat.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_dedicated_hub.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_dedupe.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_desktop.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_diagram.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_doctor_agents.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_ee_boundary.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_feedback.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_field_web.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_fix_effect.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_formation.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_friction.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_game_mode.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_glossary.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_group_graph.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_group_sharing.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_guidance.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_home_agents.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_accept.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_cookie.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_groups.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_inventory_scope.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_leave_join.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_news.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_payload_privacy.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_projects.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_projects_listed.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_purge.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_send_problems.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_hub_sharing_race.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_ingest.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_instructions.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_integration.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_knowledge_freshness.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_ladder.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_language.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_leaderboard.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_learning_glance.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_learning_interests.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_learning_web.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_leave_project.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_legacy_package.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_map_goldens.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_market.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_menubar.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_migrate.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_mirror.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_notify.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_opencode.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_opencode_analysis.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_parser.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_parser_goldens.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_party.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_party_map.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_people.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_people_hub.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_profile_hubs.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_profile_scope.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_profiles.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_project_groups.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_project_progress.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_providers.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_queue.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_regressions.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_release.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_roadmap_catalog.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_route_matrix.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_screen.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_security.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_session_context_budget.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_setup.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_statusline.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_study.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_suggest.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_suggest_cli.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_systems.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_team.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_team_home.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_update.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_weekly_reanalysis.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/test_windows.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/tests/windows_smoke.py +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/uv.lock +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/.vscodeignore +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/LICENSE +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/README.md +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/extension.js +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/media/icon.png +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/media/interlatch.svg +0 -0
- {interlatch-0.28.7 → interlatch-0.28.8}/vscode-extension/package.json +0 -0
|
@@ -3,6 +3,30 @@
|
|
|
3
3
|
<!-- Don't add lines here: a pull request puts its line in a new file in changelog.d/ (see changelog.d/README.md),
|
|
4
4
|
and each release moves the files it took into a dated section below. -->
|
|
5
5
|
|
|
6
|
+
## 0.28.7 (2026-10-21)
|
|
7
|
+
|
|
8
|
+
- **Feedback:** report a problem or suggest an idea from wherever you use Interlatch: `interlatch feedback` (or
|
|
9
|
+
`interlatch bug`), **Settings › Feedback** and the **Feedback** link in the dashboard's status bar, or **Interlatch:
|
|
10
|
+
Send Feedback** in VS Code (extension 0.4.0). Each opens a new GitHub issue, or a discussion in Ideas, with your
|
|
11
|
+
install's details filled in (versions, system, how it was installed), never your paths, addresses or sessions.
|
|
12
|
+
Nothing is sent until you post it there ([Command line](docs/cli.md)).
|
|
13
|
+
- **`interlatch status` checks every agent:** it has a line for each coding agent found on this computer (Claude Code,
|
|
14
|
+
Codex, Copilot, Bob, Antigravity, OpenCode, Cursor and the other MCP clients) saying whether Interlatch's MCP server
|
|
15
|
+
is in it, and flags one whose command is gone or runs another install, such as an old `chronicle` or a checkout's
|
|
16
|
+
`.venv`; `interlatch connect <name>` points it back ([Troubleshooting](docs/troubleshooting.md)).
|
|
17
|
+
- **New sessions get whole notes, never a cut-off one:** the knowledge digest a new session receives
|
|
18
|
+
(`interlatch install --inject-context`) now fits its length limit by leaving out the least useful notes and the
|
|
19
|
+
oldest sessions whole, and its last line says how many it left out so the agent knows to search for them. It is also
|
|
20
|
+
checked for secrets once more on its way out ([Configuration](docs/configuration.md#synthesis-export-server-inject-updates)).
|
|
21
|
+
- **Agents can pick up where the last session left off:** the new `resume` MCP tool tells an agent starting in a project
|
|
22
|
+
what the last session set out to do, how it went and what it left open, what waits on you, and what other agents did
|
|
23
|
+
and learned since its own previous session there, all from the archive and within a length limit
|
|
24
|
+
([MCP server](docs/mcp.md#tools)).
|
|
25
|
+
- **Lessons say when their code has changed:** a lesson now records the files it was learned from (those the session
|
|
26
|
+
read or changed), and when one of them changes, the SessionStart digest and the MCP search mark it *may be out of
|
|
27
|
+
date* and name the file, so an agent checks it before relying on it
|
|
28
|
+
([When a lesson may be out of date](docs/analysis.md#when-a-lesson-may-be-out-of-date)).
|
|
29
|
+
|
|
6
30
|
## 0.28.6 (2026-10-20)
|
|
7
31
|
|
|
8
32
|
- **Hubs page, tidier:** **Settings › Hubs** has a tab for each hub and one to add a hub. A hub's tab fits on one
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: interlatch
|
|
3
|
-
Version: 0.28.
|
|
3
|
+
Version: 0.28.8
|
|
4
4
|
Summary: Shared memory for your coding agents: records every session (Claude Code, Codex, Copilot, Bob, Antigravity, OpenCode) locally and keeps what they learned, each lesson linked to the session it came from.
|
|
5
5
|
Project-URL: Homepage, https://interlatch.com
|
|
6
6
|
Project-URL: Documentation, https://interlatch.com/docs/
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
- **A sign-in page that looks like Interlatch:** opening a hub's sign-in or invite link now shows the dashboard's own
|
|
2
|
+
card, with the person you'll sign in as, a full-width **Sign in as …** button, and the light/dark and language
|
|
3
|
+
buttons, in place of a bare unstyled page. The page still asks before it signs anyone in.
|
|
@@ -409,10 +409,10 @@ JA: dict[str, str] = {
|
|
|
409
409
|
"このハブの管理者に新しい招待を頼むか、自分の Interlatch(「設定」›「デバイス」)からハブのダッシュボードを開き直してください。",
|
|
410
410
|
"Open the dashboard": "ダッシュボードを開く",
|
|
411
411
|
"Sign in to this hub": "このハブにサインイン",
|
|
412
|
-
"Sign in as {
|
|
412
|
+
"Sign in as {name}": "{name} としてサインイン",
|
|
413
413
|
"Go on only if you opened this link from your own Interlatch or an admin of this hub sent it to you.":
|
|
414
414
|
"このリンクを自分の Interlatch から開いた場合か、このハブの管理者から送られてきた場合だけ続けてください。",
|
|
415
|
-
"
|
|
415
|
+
"Toggle theme": "テーマを切り替え",
|
|
416
416
|
"open the sign-in link again": "サインインのリンクをもう一度開いてください",
|
|
417
417
|
"bad form": "フォームが正しくありません",
|
|
418
418
|
"no such computer or browser session": "そのコンピューターまたはブラウザーのセッションはありません",
|
|
@@ -79,6 +79,17 @@ SIGNIN_HELP = ("Ask an admin of this hub for a new invite, or open the hub's das
|
|
|
79
79
|
"(Settings › Devices).")
|
|
80
80
|
SIGNIN_CHECK = "Go on only if you opened this link from your own Interlatch or an admin of this hub sent it to you."
|
|
81
81
|
TOO_MANY_CODES = "too many wrong codes from this address; try again in {seconds} s" # people.CodeAttempts
|
|
82
|
+
# The /signin page's policy: the dashboard's own stylesheet, fonts, logo and signin.js, nothing inline, and its form
|
|
83
|
+
# posts only here. It may not be framed: a page that shows it in a frame can't trick a click on Sign in.
|
|
84
|
+
SIGNIN_CSP = ("default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self'; font-src 'self'; "
|
|
85
|
+
"form-action 'self'; frame-ancestors 'none'; base-uri 'none'")
|
|
86
|
+
# line icons, drawn as app.js's icon() draws them
|
|
87
|
+
_ICON = '<svg class="icon{cls}" viewBox="0 0 24 24" aria-hidden="true">{paths}</svg>'
|
|
88
|
+
SUN = _ICON.format(cls=" ic-sun", paths='<circle cx="12" cy="12" r="4"/>' + "".join(
|
|
89
|
+
f'<path d="{d}"/>' for d in ("M12 2v2", "M12 20v2", "m4.93 4.93 1.41 1.41", "m17.66 17.66 1.41 1.41", "M2 12h2",
|
|
90
|
+
"M20 12h2", "m6.34 17.66-1.41 1.41", "m19.07 4.93-1.41 1.41")))
|
|
91
|
+
MOON = _ICON.format(cls=" ic-moon", paths='<path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9z"/>')
|
|
92
|
+
SHIELD = _ICON.format(cls="", paths='<path d="M12 3l7 3v5c0 4.5-3 8-7 10-4-2-7-5.5-7-10V6z"/><path d="m9 12 2 2 4-4"/>')
|
|
82
93
|
|
|
83
94
|
|
|
84
95
|
def make_handler(app: App, port: int):
|
|
@@ -280,16 +291,33 @@ def make_handler(app: App, port: int):
|
|
|
280
291
|
origin = (self.headers.get("Origin") or "").strip().lower()
|
|
281
292
|
return origin not in ("", "null") and urlparse(origin).netloc == self._host()
|
|
282
293
|
|
|
283
|
-
def _signin_page(self, status: int, title: str, body: str, retry: int = 0):
|
|
284
|
-
"""The small page /signin answers with: asking before a sign-in, or why one didn't happen.
|
|
294
|
+
def _signin_page(self, status: int, title: str, body: str, retry: int = 0, switch_lang: bool = False):
|
|
295
|
+
"""The small page /signin answers with: asking before a sign-in, or why one didn't happen. The dashboard's
|
|
296
|
+
own sign-in card (app.css), with its theme and language buttons (signin.js), under a policy that lets in
|
|
297
|
+
the dashboard's own files and nothing inline."""
|
|
285
298
|
import html
|
|
299
|
+
from urllib.parse import urlencode
|
|
286
300
|
|
|
287
301
|
title = html.escape(title)
|
|
288
|
-
|
|
302
|
+
hub = app.cfg.hub_name or self._host()
|
|
303
|
+
switch = ""
|
|
304
|
+
if switch_lang: # the same link in the other language; not on a refusal, where it would try the code again
|
|
305
|
+
other = "en" if i18n.lang.get() == "ja" else "ja"
|
|
306
|
+
q = {k: v[-1] for k, v in parse_qs(urlparse(self.path).query).items()} | {"lang": other}
|
|
307
|
+
switch = (f'<a class="btn small" id="signin-lang" lang="{other}" href="/signin?{html.escape(urlencode(q))}">'
|
|
308
|
+
f'{"日本語" if other == "ja" else "English"}</a>')
|
|
309
|
+
theme = html.escape(tr("Toggle theme"))
|
|
310
|
+
page = (f'<!doctype html><html lang="{i18n.lang.get()}"><head><meta charset="utf-8">'
|
|
289
311
|
'<meta name="viewport" content="width=device-width, initial-scale=1">'
|
|
290
312
|
f'<meta name="color-scheme" content="light dark"><title>{title} · Interlatch</title>'
|
|
291
|
-
'<
|
|
292
|
-
|
|
313
|
+
'<link rel="icon" href="/favicon.png" type="image/png"><link rel="stylesheet" href="/app.css">'
|
|
314
|
+
'<script src="/signin.js"></script></head><body><main class="signin-screen">'
|
|
315
|
+
'<div class="card signin-card"><div class="signin-brand">'
|
|
316
|
+
'<img src="/icon.png" width="26" height="26" alt="">Interlatch'
|
|
317
|
+
f'{f"<span class=signin-hub>{html.escape(hub)}</span>" if hub else ""}</div>'
|
|
318
|
+
f'<h1>{title}</h1>{body}<div class="signin-foot">{switch}'
|
|
319
|
+
f'<button class="btn small" id="signin-theme" type="button" aria-label="{theme}" title="{theme}">'
|
|
320
|
+
f'{SUN}{MOON}</button></div></div></main></body></html>').encode()
|
|
293
321
|
self.send_response(status)
|
|
294
322
|
self.send_header("Content-Type", "text/html; charset=utf-8")
|
|
295
323
|
self.send_header("Content-Length", str(len(page)))
|
|
@@ -298,8 +326,7 @@ def make_handler(app: App, port: int):
|
|
|
298
326
|
self.send_header("Retry-After", str(retry))
|
|
299
327
|
self.send_header("X-Content-Type-Options", "nosniff")
|
|
300
328
|
self.send_header("Referrer-Policy", "no-referrer") # the code is in this page's address
|
|
301
|
-
self.send_header("Content-Security-Policy",
|
|
302
|
-
"default-src 'none'; style-src 'unsafe-inline'; form-action 'self'; frame-ancestors 'none'")
|
|
329
|
+
self.send_header("Content-Security-Policy", SIGNIN_CSP)
|
|
303
330
|
self.end_headers()
|
|
304
331
|
self.wfile.write(page)
|
|
305
332
|
|
|
@@ -307,8 +334,8 @@ def make_handler(app: App, port: int):
|
|
|
307
334
|
import html
|
|
308
335
|
|
|
309
336
|
self._signin_page(429 if wait else status, tr("Could not sign in"),
|
|
310
|
-
f
|
|
311
|
-
f'<
|
|
337
|
+
f'<p class="signin-note">{html.escape(exc.shown())}</p><p>{html.escape(tr(SIGNIN_HELP))}</p>'
|
|
338
|
+
f'<a class="btn primary signin-go" href="/">{html.escape(tr("Open the dashboard"))}</a>', wait)
|
|
312
339
|
|
|
313
340
|
def _signin_code(self, code: str, take):
|
|
314
341
|
"""take(code) for a sign-in, after the wrong-code wait (people.CodeAttempts): its answer, or None once the
|
|
@@ -316,7 +343,9 @@ def make_handler(app: App, port: int):
|
|
|
316
343
|
from ...sharing import people
|
|
317
344
|
|
|
318
345
|
accept = (self.headers.get("Accept-Language") or "").strip().lower()
|
|
319
|
-
|
|
346
|
+
asked = parse_qs(urlparse(self.path).query).get("lang", [""])[-1] # the page's language button
|
|
347
|
+
# a link opened by hand sends no X-Interlatch-Lang
|
|
348
|
+
i18n.lang.set(asked if asked in i18n.LANGS else "ja" if accept.startswith("ja") else "en")
|
|
320
349
|
who = self._client()
|
|
321
350
|
wait = app.code_attempts.wait(who)
|
|
322
351
|
try:
|
|
@@ -340,15 +369,16 @@ def make_handler(app: App, port: int):
|
|
|
340
369
|
person = self._signin_code(code, lambda c: people.code_person(app.conn, c))
|
|
341
370
|
if person is None:
|
|
342
371
|
return
|
|
343
|
-
|
|
372
|
+
name, email = person["name"], person.get("email") or ""
|
|
344
373
|
hidden = "".join(f'<input type="hidden" name="{k}" value="{html.escape(v)}">'
|
|
345
374
|
for k, v in (("code", code), ("next", page)) if v)
|
|
346
375
|
self._signin_page(200, tr("Sign in to this hub"),
|
|
347
|
-
f
|
|
348
|
-
f"
|
|
349
|
-
f'<
|
|
350
|
-
f'<
|
|
351
|
-
f"{
|
|
376
|
+
f'<div class="signin-who"><span class="signin-avatar" aria-hidden="true">'
|
|
377
|
+
f"{html.escape(name[:1].upper())}</span><div><b>{html.escape(name)}</b>"
|
|
378
|
+
f'{f"<span>{html.escape(email)}</span>" if email else ""}</div></div>'
|
|
379
|
+
f'<p class="signin-check">{SHIELD}<span>{html.escape(tr(SIGNIN_CHECK))}</span></p>'
|
|
380
|
+
f'<form method="post" action="/signin">{hidden}<button class="btn primary signin-go" '
|
|
381
|
+
f'type="submit">{html.escape(tr("Sign in as {name}", name=name))}</button></form>', switch_lang=True)
|
|
352
382
|
|
|
353
383
|
def _signin(self, code: str, page: str | None = None):
|
|
354
384
|
"""POST /signin, from the page above or the dashboard's own sign-in form: opens a browser session, on the
|
|
@@ -2143,6 +2143,18 @@ a.ar-tile-media.empty:hover { background: var(--accent-wash); }
|
|
|
2143
2143
|
.signin-form .input { flex: 1; min-width: 0; font-family: var(--mono); letter-spacing: 0.04em; }
|
|
2144
2144
|
.signin-foot { display: flex; justify-content: flex-end; gap: 6px; margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--grid); }
|
|
2145
2145
|
.signin-foot .icon { width: 14px; height: 14px; }
|
|
2146
|
+
/* the /signin page (handler.py): the same card, asking before a link signs this browser in */
|
|
2147
|
+
.signin-hub { margin-left: auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 500 11px/1.4 var(--mono); letter-spacing: 0.08em; color: var(--muted); padding: 2px 8px; border: 1px solid var(--border); border-radius: 999px; }
|
|
2148
|
+
.signin-who { display: flex; align-items: center; gap: 12px; margin: 16px 0 14px; padding: 12px 14px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface-2); }
|
|
2149
|
+
.signin-who > div { display: flex; flex-direction: column; min-width: 0; }
|
|
2150
|
+
.signin-who b { font-size: 15px; overflow-wrap: anywhere; }
|
|
2151
|
+
.signin-who > div > span { color: var(--muted); font-size: 13px; overflow-wrap: anywhere; }
|
|
2152
|
+
.signin-avatar { flex: none; display: grid; place-items: center; width: 38px; height: 38px; border-radius: 50%; background: var(--cta); color: var(--cta-ink); font-weight: 700; font-size: 16px; }
|
|
2153
|
+
.signin-check { display: flex; gap: 8px; align-items: flex-start; color: var(--muted); font-size: 13px; }
|
|
2154
|
+
.signin-check .icon { flex: none; width: 16px; height: 16px; margin-top: 2px; }
|
|
2155
|
+
.signin-go { display: block; width: 100%; padding: 9px 14px; text-align: center; font-size: 14.5px; }
|
|
2156
|
+
a.signin-go:hover { text-decoration: none; }
|
|
2157
|
+
.signin-card .signin-note + p { margin-bottom: 18px; }
|
|
2146
2158
|
.pp-table td { vertical-align: top; }
|
|
2147
2159
|
.pp-table td:first-child { min-width: 170px; }
|
|
2148
2160
|
.pp-table select { max-width: 150px; }
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// The /signin page's one script (handler.py, _signin_page): the theme this browser chose, before the first paint, and
|
|
2
|
+
// the page's theme and language buttons. Its own file, not inline, so the page's policy can allow scripts from 'self' only.
|
|
3
|
+
(function () {
|
|
4
|
+
var root = document.documentElement;
|
|
5
|
+
try { var t = localStorage.getItem("interlatch-theme"); if (t) root.dataset.theme = t; } catch (e) {}
|
|
6
|
+
var dark = function () {
|
|
7
|
+
return root.dataset.theme ? root.dataset.theme === "dark" : matchMedia("(prefers-color-scheme: dark)").matches;
|
|
8
|
+
};
|
|
9
|
+
document.addEventListener("DOMContentLoaded", function () {
|
|
10
|
+
var btn = document.getElementById("signin-theme");
|
|
11
|
+
if (btn) {
|
|
12
|
+
var show = function () { // the sun in the dark, the moon in the light: what a press switches to
|
|
13
|
+
btn.querySelector(".ic-sun").toggleAttribute("hidden", !dark());
|
|
14
|
+
btn.querySelector(".ic-moon").toggleAttribute("hidden", dark());
|
|
15
|
+
};
|
|
16
|
+
show();
|
|
17
|
+
btn.addEventListener("click", function () {
|
|
18
|
+
root.dataset.theme = dark() ? "light" : "dark";
|
|
19
|
+
try { localStorage.setItem("interlatch-theme", root.dataset.theme); } catch (e) {}
|
|
20
|
+
show();
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
var lang = document.getElementById("signin-lang");
|
|
24
|
+
if (lang) lang.addEventListener("click", function () { // the dashboard opens in it too, once signed in
|
|
25
|
+
try { localStorage.setItem("interlatch-lang", lang.getAttribute("lang")); } catch (e) {}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
})();
|
|
@@ -220,7 +220,7 @@ NODE = shutil.which("node")
|
|
|
220
220
|
|
|
221
221
|
|
|
222
222
|
@pytest.mark.skipif(not NODE, reason="node is not installed")
|
|
223
|
-
@pytest.mark.parametrize("name", ["app.js", "i18n.js", "ja.js", "sprites.js", "scene.js", "innerlatch.js", "adventure.js", "field.js", "battle.js"])
|
|
223
|
+
@pytest.mark.parametrize("name", ["app.js", "i18n.js", "ja.js", "sprites.js", "scene.js", "innerlatch.js", "adventure.js", "field.js", "battle.js", "signin.js"])
|
|
224
224
|
def test_scripts_parse(name):
|
|
225
225
|
proc = subprocess.run([NODE, "--check", str(WEB / name)], capture_output=True, text=True)
|
|
226
226
|
assert proc.returncode == 0, proc.stderr
|
|
@@ -100,6 +100,10 @@ def test_an_empty_project_says_so(synced):
|
|
|
100
100
|
def test_the_mcp_tool_knows_the_client_from_initialize(synced):
|
|
101
101
|
conn = synced["conn"]
|
|
102
102
|
_story(conn)
|
|
103
|
+
# the server reads the real clock: the running session moved just now, not at NOW
|
|
104
|
+
conn.execute("UPDATE sessions SET ended_at = ? WHERE id = 'claude-now'",
|
|
105
|
+
(datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z"),))
|
|
106
|
+
conn.commit()
|
|
103
107
|
msgs = [{"jsonrpc": "2.0", "id": 1, "method": "initialize",
|
|
104
108
|
"params": {"protocolVersion": "2025-06-18", "clientInfo": {"name": "claude-code", "version": "2"}}},
|
|
105
109
|
{"jsonrpc": "2.0", "id": 2, "method": "tools/list"},
|
|
@@ -115,6 +115,7 @@ def test_a_hub_without_people_answers_as_before(hubweb):
|
|
|
115
115
|
assert _call(url, "/api/learning/interests") == (200, {"interests": []})
|
|
116
116
|
status, headers, page = _raw(url, "/signin?code=AAAA-BBBB-CCCC")
|
|
117
117
|
assert status == 400 and b"known on this hub" in page and headers["Content-Type"].startswith("text/html")
|
|
118
|
+
assert b'id="signin-lang"' not in page # switching language here would try the wrong code again
|
|
118
119
|
|
|
119
120
|
|
|
120
121
|
def test_who_may_look_and_who_may_change(team):
|
|
@@ -204,13 +205,17 @@ def test_a_link_alone_signs_nobody_in(team):
|
|
|
204
205
|
url, conn = team["url"], team["conn"]
|
|
205
206
|
code = people.invite(conn, team["vic"]["id"])
|
|
206
207
|
status, headers, page = _raw(url, f"/signin?code={code}&next={quote('/project?path=%2Fx', safe='')}", headers=REMOTE)
|
|
207
|
-
assert status == 200 and "Set-Cookie" not in headers and b"
|
|
208
|
+
assert status == 200 and "Set-Cookie" not in headers and b"<b>Vic</b><span>vic@example.com</span>" in page
|
|
209
|
+
assert b">Sign in as Vic</button>" in page
|
|
208
210
|
assert f'name="code" value="{code}"'.encode() in page and b'name="next" value="/project?path=%2Fx"' in page
|
|
209
|
-
csp = headers["Content-Security-Policy"]
|
|
210
|
-
assert "form-action
|
|
211
|
+
csp = dict(d.strip().split(" ", 1) for d in headers["Content-Security-Policy"].split(";"))
|
|
212
|
+
assert csp["form-action"] == csp["script-src"] == csp["style-src"] == "'self'" and csp["frame-ancestors"] == "'none'"
|
|
213
|
+
assert b"<script>" not in page and b" style=" not in page # the page's own files only: nothing inline
|
|
211
214
|
assert people.peek_invite(conn, code) # asking used nothing up
|
|
212
215
|
page = _raw(url, f"/signin?code={code}", headers={**REMOTE, "Accept-Language": "ja"})[2]
|
|
213
|
-
assert "Vic
|
|
216
|
+
assert "Vic としてサインイン</button>".encode() in page and b'id="signin-lang" lang="en"' in page
|
|
217
|
+
page = _raw(url, f"/signin?code={code}&lang=ja", headers=REMOTE)[2] # the page's language button
|
|
218
|
+
assert "Vic としてサインイン</button>".encode() in page and f"code={code}&lang=en".encode() in page
|
|
214
219
|
|
|
215
220
|
for other in ({}, {"Origin": "https://evil.example"}, {"Origin": "null"}, {"Origin": "http://127.0.0.1.evil.example"},
|
|
216
221
|
{"Sec-Fetch-Site": "cross-site", "Origin": "https://evil.example"}, {"Sec-Fetch-Site": "same-site"}):
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
- **`interlatch status` checks every agent:** it has a line for each coding agent found on this computer (Claude Code,
|
|
2
|
-
Codex, Copilot, Bob, Antigravity, OpenCode, Cursor and the other MCP clients) saying whether Interlatch's MCP server
|
|
3
|
-
is in it, and flags one whose command is gone or runs another install, such as an old `chronicle` or a checkout's
|
|
4
|
-
`.venv`; `interlatch connect <name>` points it back ([Troubleshooting](docs/troubleshooting.md)).
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
- **Feedback:** report a problem or suggest an idea from wherever you use Interlatch: `interlatch feedback` (or
|
|
2
|
-
`interlatch bug`), **Settings › Feedback** and the **Feedback** link in the dashboard's status bar, or **Interlatch:
|
|
3
|
-
Send Feedback** in VS Code (extension 0.4.0). Each opens a new GitHub issue, or a discussion in Ideas, with your
|
|
4
|
-
install's details filled in (versions, system, how it was installed), never your paths, addresses or sessions.
|
|
5
|
-
Nothing is sent until you post it there ([Command line](docs/cli.md)).
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
- **Lessons say when their code has changed:** a lesson now records the files it was learned from (those the session
|
|
2
|
-
read or changed), and when one of them changes, the SessionStart digest and the MCP search mark it *may be out of
|
|
3
|
-
date* and name the file, so an agent checks it before relying on it
|
|
4
|
-
([When a lesson may be out of date](docs/analysis.md#when-a-lesson-may-be-out-of-date)).
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
- **Agents can pick up where the last session left off:** the new `resume` MCP tool tells an agent starting in a project
|
|
2
|
-
what the last session set out to do, how it went and what it left open, what waits on you, and what other agents did
|
|
3
|
-
and learned since its own previous session there, all from the archive and within a length limit
|
|
4
|
-
([MCP server](docs/mcp.md#tools)).
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
- **New sessions get whole notes, never a cut-off one:** the knowledge digest a new session receives
|
|
2
|
-
(`interlatch install --inject-context`) now fits its length limit by leaving out the least useful notes and the
|
|
3
|
-
oldest sessions whole, and its last line says how many it left out so the agent knows to search for them. It is also
|
|
4
|
-
checked for secrets once more on its way out ([Configuration](docs/configuration.md#synthesis-export-server-inject-updates)).
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|