interlatch 0.27.3__tar.gz → 0.27.4__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.27.3 → interlatch-0.27.4}/CHANGELOG.md +17 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/PKG-INFO +1 -1
- {interlatch-0.27.3 → interlatch-0.27.4}/ROADMAP.ja.md +5 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/ROADMAP.md +5 -0
- interlatch-0.27.4/changelog.d/analysis-queue-dialog.md +3 -0
- interlatch-0.27.4/docs/design/innerlatch.md +166 -0
- interlatch-0.27.4/docs/design/ja/innerlatch.md +162 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/party.md +38 -12
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/queue.py +70 -1
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/status.py +7 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/routes.py +1 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/app.css +20 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/app.js +69 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/index.html +1 -1
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/ja.js +11 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_queue.py +45 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_route_matrix.py +1 -0
- interlatch-0.27.3/changelog.d/adventure-study-fields.md +0 -6
- interlatch-0.27.3/changelog.d/windows-japanese.md +0 -8
- {interlatch-0.27.3 → interlatch-0.27.4}/.github/dependabot.yml +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.github/windows-ja-qa/driver.ps1 +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.github/windows-ja-qa/ja_check.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.github/windows-ja-qa/report.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.github/windows-ja-qa/shots.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.github/windows-ja-qa/user.ps1 +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.github/workflows/changelog.yml +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.github/workflows/ci.yml +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.github/workflows/docs.yml +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.github/workflows/release.yml +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.github/workflows/windows-ja-qa.yml +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.gitignore +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.pre-commit-config.yaml +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/.python-version +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/CONTRIBUTING.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/LICENSE +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/README.ja.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/README.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/SECURITY.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/careers/README.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/careers/boards.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/careers/pipeline.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/changelog.d/README.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/dev.sh +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docker/.dockerignore +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docker/.env.example +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docker/Caddyfile +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docker/Dockerfile +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docker/compose.yaml +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docker/wheels/.gitignore +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/README.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/_site/hooks.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/analysis.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/cli.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/configuration.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/dashboard.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/demo/make_demo.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/demo/record_demo.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/design/ja/learning.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/design/learning.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/development.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/devices.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/diagrams/analysis.excalidraw.svg +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/diagrams/architecture.excalidraw.svg +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/docker.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/faq.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/images/demo.gif +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/images/home.png +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/images/map.png +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/images/palette.png +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/images/session.png +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/install.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/README.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/analysis.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/cli.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/configuration.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/dashboard.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/development.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/devices.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/docker.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/faq.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/install.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/join-a-hub.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/mcp.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/moving-from-chronicle.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/postgres.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/privacy.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/sources.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/suggestions.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/troubleshooting.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/ja/vscode.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/join-a-hub.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/mcp.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/moving-from-chronicle.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/party.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/postgres.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/privacy.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/sources.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/suggestions.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/troubleshooting.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/docs/vscode.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/leaderboard/.firebaserc +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/leaderboard/.gitignore +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/leaderboard/README.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/leaderboard/firebase.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/leaderboard/firestore.indexes.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/leaderboard/firestore.rules +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/mkdocs.yml +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/icons3d/README.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/icons3d/art.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/icons3d/filing.html +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/icons3d/loops.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/icons3d/loops.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/icons3d/members.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/icons3d/render.html +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/icons3d/render.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/icons3d/scenes-more.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/icons3d/scenes.html +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/macos/Chronicle.icns +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/macos/Interlatch.spec +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/macos/build.sh +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/macos/entitlements.plist +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/macos/icon-3d.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/macos/icon-blueprint-prompt.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/macos/icon-blueprint.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/macos/icon.png +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/macos/interlatch_app.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/macos/make_icon.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/packaging/release.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/pyproject.toml +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/chronicle/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/chronicle/__main__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/chronicle/windows.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/__main__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/digest.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/language.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/runners/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/runners/api.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/runners/base.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/runners/bob.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/runners/claude.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/runners/codex.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/runners/factory.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/runners/process.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/runners/replies.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/runners/settings.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/screen.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/session.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/analysis/worker.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/application/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/application/records.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/application/search.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/application/workflows.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/artifacts/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/artifacts/files.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/artifacts/queries.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/cli.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/agents.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/artifact_records.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/config.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/diagrams.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/i18n/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/i18n/ja.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/machine.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/paths.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/pricing.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/process.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/redact.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/sessions.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/core/util.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/ingestion/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/ingestion/analyses.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/ingestion/archive.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/ingestion/chat_import.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/ingestion/deletion.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/ingestion/history.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/ingestion/memory.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/ingestion/persistence.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/ingestion/report.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/ingestion/service.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/cli/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/archive.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/knowledge.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/operations.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/recording.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/setup.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/cli/commands/sharing.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/cli/common.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/cli/main.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/cli/parser.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/exports/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/exports/diagrams.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/exports/markdown.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/exports/sessions.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/exports/vault.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/mcp.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/artifacts.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/common.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/devices.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/hub_admin.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/knowledge.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/leaderboard.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/party.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/projects.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/sessions.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/settings.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/sources.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/storage.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/api/team.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/app.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/assets.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/context.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/handler.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/jobs.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/interfaces/web/server.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/arena.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/bag.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/cases.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/formation.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/friction.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/glossary.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/instructions.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/ladder.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/learning.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/market.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/party.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/reviews.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/roadmap.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/study.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/suggest.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/knowledge/synthesize.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/projects/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/projects/groups.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/projects/labels.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/projects/progress.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/projects/routing.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/projects/systems.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/connectors.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/container.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/hooks.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/install.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/migrate.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/notify.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/platforms/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/platforms/desktop.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/platforms/menubar.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/platforms/windows.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/statusline.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/tailnet.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/runtime/update.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/access.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/arena.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/client.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/identity.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/leaderboard.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/market.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/news.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/people.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/projects.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/protocol.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/pull.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/push.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sharing/receiver.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/antigravity.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/bob.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/builder.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/chatgpt.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/chats.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/claude/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/claude/export.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/claude/files.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/claude/parser.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/codex/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/codex/cloud.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/codex/parser.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/copilot.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/discovery.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/opencode.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/sources/prompts.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/storage/__init__.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/storage/fts.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/storage/kv.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/storage/migrations.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/storage/mirror.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/storage/postgres.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/storage/schema.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/storage/sqlite.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/storage/team.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/AGENT-ICONS.txt +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/PLEX-OFL.txt +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/adventure.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/agent-antigravity.svg +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/agent-bob.svg +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/agent-chatgpt.svg +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/agent-claude-ai.svg +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/agent-claude.svg +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/agent-codex.svg +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/agent-copilot.svg +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/agent-opencode.svg +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-book.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-camera.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-chip.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-clock.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-cloud.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-coins.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-container.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-dashboard.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-dex.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-document.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-flag.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-folder.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-gateway.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-gears.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-glitch.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-globe.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-laptop.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-log.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-lumi.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-magnifier.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-pip.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-plug.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-rack.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/art-tink.webp +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/battle.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/boot.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/favicon.png +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/field.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/i18n.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/icon-180.png +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/icon-192.png +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/icon-512.png +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/icon.png +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/innerlatch.css +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/innerlatch.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/learning.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/manifest.webmanifest +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/panel.css +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/panel.html +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/panel.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/plex-mono-400.woff2 +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/plex-mono-500.woff2 +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/plex-mono-600.woff2 +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/plex-sans-400.woff2 +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/plex-sans-500.woff2 +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/plex-sans-600.woff2 +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/plex-sans-700.woff2 +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/rough.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/scene.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/web/sprites.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/src/interlatch/windows.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/antigravity_fixture.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/codex_fixture.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/conftest.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/copilot_fixture.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/friction_fixture.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/golden.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/goldens/cli.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/goldens/diagram.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/goldens/parsers/antigravity.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/goldens/parsers/bob.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/goldens/parsers/claude_code.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/goldens/parsers/codex.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/goldens/parsers/copilot.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/goldens/parsers/opencode.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/goldens/systems.json +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/opencode_fixture.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_adventure_web.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_analysis.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_antigravity.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_architecture.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_arena.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_artifacts.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_bag.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_battle_web.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_bob_analysis.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_boot_web.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_careers.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_case_files.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_cases.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_chat_import.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_cli_pins.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_codex.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_codex_analysis.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_codex_cloud.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_container.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_copilot_bob.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_dedicated_hub.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_dedupe.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_desktop.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_diagram.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_ee_boundary.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_field_web.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_formation.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_friction.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_glossary.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_group_sharing.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_home_agents.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_hub.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_hub_accept.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_hub_news.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_hub_projects.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_hub_projects_listed.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_hub_purge.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_hub_sharing_race.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_i18n_web.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_ingest.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_instructions.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_integration.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_ladder.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_language.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_leaderboard.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_learning_glance.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_learning_interests.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_learning_web.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_leave_project.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_legacy_package.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_map_goldens.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_market.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_menubar.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_migrate.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_mirror.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_notify.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_opencode.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_parser.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_parser_goldens.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_party.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_party_map.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_people.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_people_hub.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_people_web.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_project_groups.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_project_progress.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_providers.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_regressions.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_release.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_roadmap_catalog.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_screen.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_security.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_setup.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_statusline.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_study.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_suggest.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_suggest_cli.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_systems.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_team.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_team_home.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_update.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/test_windows.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/tests/windows_smoke.py +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/uv.lock +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/vscode-extension/.vscodeignore +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/vscode-extension/LICENSE +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/vscode-extension/README.md +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/vscode-extension/extension.js +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/vscode-extension/media/icon.png +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/vscode-extension/media/interlatch.svg +0 -0
- {interlatch-0.27.3 → interlatch-0.27.4}/vscode-extension/package.json +0 -0
|
@@ -3,6 +3,23 @@
|
|
|
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.27.3 (2026-10-18)
|
|
7
|
+
|
|
8
|
+
- **Windows in Japanese (and other languages):** Task Scheduler's and PowerShell's own messages now read in Windows'
|
|
9
|
+
language instead of coming out garbled, and a `claude.cmd` (npm) or another tool that reports an error in the console's
|
|
10
|
+
code page no longer ends `interlatch install` in a traceback. The tasks name your account by its SID, so a PC joined to
|
|
11
|
+
Microsoft Entra ID registers them too; a folder name with a full-width space works in hooks; an npm-installed Claude
|
|
12
|
+
Code gets the whole analysis prompt; the shared log no longer prints "Logging error" when another process holds it;
|
|
13
|
+
and the dashboard's scripts keep their type where Windows' registry calls .js plain text, which left the page blank.
|
|
14
|
+
The old console window prints `+` and `>` for ✓ and ›, the dashboard says Ctrl for ⌘ off a Mac, and the install steps
|
|
15
|
+
set PATH in the same window, where uv's installer left "uv is not recognized" ([Windows](docs/install.md#windows)).
|
|
16
|
+
- **Adventure, rebuilt for learning:** the Adventure opens on a field to walk around in, one region at a time, its
|
|
17
|
+
roadmap modules as zones and your lessons worth studying as monsters (main quest first, your agents' own setup traps
|
|
18
|
+
left out). A battle is now a question from your own sessions: four answers written for the lesson, choose one and
|
|
19
|
+
Answer. Right beats the monster and fills your readiness for that module; wrong shows why, the answer and the
|
|
20
|
+
principle, and the lesson comes back tomorrow. Lessons you got right come back as you'd forget them (3, 10, 30, 90
|
|
21
|
+
days). Your answers stay on your own computer ([Adventure](docs/party.md#adventure)).
|
|
22
|
+
|
|
6
23
|
## 0.27.2 (2026-10-16)
|
|
7
24
|
|
|
8
25
|
- **One row per browser on Team › People:** opening the hub from your own dashboard again no longer leaves the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: interlatch
|
|
3
|
-
Version: 0.27.
|
|
3
|
+
Version: 0.27.4
|
|
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/
|
|
@@ -56,6 +56,11 @@ Interlatch にこれから入るものを、おおよそ取り組む順に並べ
|
|
|
56
56
|
作りません)。エージェントには今までどおりすべての教訓を渡します。効果は、尋ねるのではなく、思い出せたかと、同じ gotcha が
|
|
57
57
|
あなたのセッションでまた起きるかで測り、一人ひとりの指標はすべてあなたのコンピューターに残します
|
|
58
58
|
([設計](docs/design/ja/learning.md))。
|
|
59
|
+
- **モジュールでのあなた自身のレベルを、実際の仕事から。** Innerlatch の冒険では、学びの戦闘で正解した教訓が、すでに
|
|
60
|
+
各ロードマップのモジュールの準備度として数えられ、あなたのコンピューターに残っています。これから: 5 つ理解すると
|
|
61
|
+
そのモジュールのゲートが開き、あなた自身のプルリクエストかコミットを結びつけて、それがモジュールの確認にどう合うかを
|
|
62
|
+
2〜3 文で書きます。分析モデルが判定し、合格するとそのモジュールに「あなたが示した」と印がつきます。エージェントの
|
|
63
|
+
レベルとは別です([設計](docs/design/ja/innerlatch.md#6-次-ゲートのボス))。
|
|
59
64
|
- **人の名前で、並べて見るチームメイトの教訓。** チームメイトの教訓は、プロジェクトのページと **All knowledge** に、
|
|
60
65
|
どのコンピューターから来たかを示して表示されます。これから: コンピューター名ではなく人の名前で示すこと、週次レビューに
|
|
61
66
|
チームメイトの教訓を入れること、2 人が述べた教訓を両方の事件として見せること([設計](docs/design/ja/learning.md#4-チーム))。
|
|
@@ -60,6 +60,11 @@ carefully.
|
|
|
60
60
|
getting every lesson. Whether it works is measured by recall and by whether the same gotcha comes back in your
|
|
61
61
|
sessions, not by asking, and every per-person measure stays on your computer
|
|
62
62
|
([design](docs/design/learning.md)).
|
|
63
|
+
- **Your own level in a module, from real work.** In Innerlatch's Adventure, the lessons you answer right in study
|
|
64
|
+
battles already count toward your readiness in each roadmap module, kept on your computer. Still to come: five
|
|
65
|
+
understood open the module's gate, where you link one of your own pull requests or commits and say in two or three
|
|
66
|
+
sentences how it meets the module's check. The analysis model judges it, and passing marks the module as shown by
|
|
67
|
+
you, apart from your agents' levels ([design](docs/design/innerlatch.md#6-next-gate-bosses)).
|
|
63
68
|
- **Teammates' lessons, by person and side by side.** They show on project pages and in **All knowledge**, marked
|
|
64
69
|
with the computers they came from. Still to come: the person's name instead of the computer's, teammates' lessons
|
|
65
70
|
in the weekly review, and a lesson two people stated shown as both their cases
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# Design: Innerlatch, learning from your own past
|
|
2
|
+
|
|
3
|
+
[← Roadmap](../../ROADMAP.md) · 日本語: [ja/innerlatch.md](ja/innerlatch.md) · Related: [lessons people learn from](learning.md)
|
|
4
|
+
|
|
5
|
+
Status: built in 0.27.3 (2026-10-18), except the gate bosses (section 6). The user guide is
|
|
6
|
+
[Adventure](../party.md#adventure).
|
|
7
|
+
|
|
8
|
+
Innerlatch is the game behind the door at the bottom of the dashboard's rail: the coding agents as a party of pixel
|
|
9
|
+
characters, the Adventure, towns, formations and the arena. This page records what its Adventure is for, what a lesson
|
|
10
|
+
and a battle mean in it, and why each part works the way it does, including what was tried and dropped on the way.
|
|
11
|
+
|
|
12
|
+
## 1. The goal
|
|
13
|
+
|
|
14
|
+
**You learn from your own past work and move along your career path.**
|
|
15
|
+
|
|
16
|
+
Your agents learned these lessons in your sessions; the Adventure is where you make them yours. That sets three
|
|
17
|
+
meters apart, and nothing ever moves one from another:
|
|
18
|
+
|
|
19
|
+
| Meter | What it says | Where it comes from |
|
|
20
|
+
| --- | --- | --- |
|
|
21
|
+
| Your agents' levels | How much of each roadmap module their lessons cover | Lessons only (unchanged since the Party began) |
|
|
22
|
+
| Your readiness | How many of a module's lessons you have shown you understand | Study battles you answered right |
|
|
23
|
+
| Your level in a module | That you can do it | A gate passed with real work (section 6, planned) |
|
|
24
|
+
|
|
25
|
+
Gold, gear and the arena stay a game around these: they change battle numbers, never a level, a readiness or XP.
|
|
26
|
+
|
|
27
|
+
## 2. What a lesson and a battle mean
|
|
28
|
+
|
|
29
|
+
**A lesson is a worked example from your own past**, filed under the roadmap module it speaks to. Until you show you
|
|
30
|
+
understand it, it is study material your agents collected for you, not something you know.
|
|
31
|
+
|
|
32
|
+
**A battle is one study rep on that example.** It opens on the scene (the moment as it was met, with the answer left
|
|
33
|
+
out) and a question, with four answers to choose from. The lesson's title stays hidden until it is answered: titles
|
|
34
|
+
often state the answer. You choose one, then **Answer**:
|
|
35
|
+
|
|
36
|
+
- **Right** is the finishing blow: the monster is beaten, the first win pays gold, and the lesson counts toward your
|
|
37
|
+
readiness in its module.
|
|
38
|
+
- **Wrong** lets it slip away. The end screen says why that answer is wrong, then shows the right one and the principle
|
|
39
|
+
behind it, the part that holds beyond that project.
|
|
40
|
+
|
|
41
|
+
**Run** (or Esc) leaves at any time. There is no Attack, Skill, Item or Defend in a study battle: the knowledge is the
|
|
42
|
+
only move.
|
|
43
|
+
|
|
44
|
+
## 3. Decisions and why
|
|
45
|
+
|
|
46
|
+
### What you explore: one region at a time
|
|
47
|
+
|
|
48
|
+
The world map used to put every counted lesson on one continent as a monster: over a thousand of them on one archive.
|
|
49
|
+
A map covered in icons reads as a checklist to clear, not a place (games call it "chickenpoxing"). The Adventure now
|
|
50
|
+
opens on a **field**: one region, each roadmap module a zone joined by paths, a few monsters per zone, walked like a
|
|
51
|
+
handheld RPG. The world map stays, without creatures, as an overview.
|
|
52
|
+
|
|
53
|
+
### Which lessons become monsters: the ones worth studying
|
|
54
|
+
|
|
55
|
+
- **Your main quest first.** Zones of the main quest's track hold four monsters, other zones two.
|
|
56
|
+
- **Study material first.** Lessons with a case file's question or a principle come before the rest.
|
|
57
|
+
- **Never your agents' own friction.** A gotcha that applies everywhere and keeps recurring, or one tagged as shell or
|
|
58
|
+
agent tooling (an aliased `rm`, zsh word splitting, where screenshots land), is a trap for the agents' rules, not
|
|
59
|
+
something for your career. On one archive that kept 97 lessons off the field.
|
|
60
|
+
|
|
61
|
+
### How understanding is checked: multiple choice written for each lesson
|
|
62
|
+
|
|
63
|
+
This took four tries:
|
|
64
|
+
|
|
65
|
+
1. **Number fights.** The first battles were stat and dice fights with the lesson as decoration. Replacing every
|
|
66
|
+
lesson's text in 300 simulated fights changed none of them: nothing the person knew went in, nothing came out.
|
|
67
|
+
2. **A pick from the case file with borrowed wrong answers** (the Diagnose experiment, closed unmerged). Only about one
|
|
68
|
+
lesson in ten had a case file, and 63% of the playable ones had no recorded dead ends, so their wrong answers were other
|
|
69
|
+
lessons' answers: easy to rule out. In about one case in five the title, shown first, held most of the answer, and a
|
|
70
|
+
wrong pick could simply be followed by the next one.
|
|
71
|
+
3. **A typed answer judged by the model.** Honest and flexible, but it asked for writing in the middle of a game, and
|
|
72
|
+
it didn't land.
|
|
73
|
+
4. **Multiple choice written for the lesson** (what shipped). The analysis model writes the scene, the question and
|
|
74
|
+
four answers once per lesson, from the lesson itself: the leads its session ruled out first, then likely
|
|
75
|
+
misconceptions, each with why it is wrong. The set is checked (exactly one right, no two alike, the right one never
|
|
76
|
+
the longest) and kept with the lesson. The first pick of a fight counts, and the server checks it, so no model call
|
|
77
|
+
is needed to answer.
|
|
78
|
+
|
|
79
|
+
### When a lesson comes back: spaced, never overdue
|
|
80
|
+
|
|
81
|
+
- **Right:** it rests and comes back for another look as you would start to forget it: 3 days, then 10, 30 and 90 as
|
|
82
|
+
you keep getting it right, marked ↻ on the field. Right on two separate days in a row, it is **owned**.
|
|
83
|
+
- **Not right:** it stays off the field until tomorrow, whatever the result (a wrong answer, a win without one, Run).
|
|
84
|
+
Trying again right after seeing the answer is copying, not remembering.
|
|
85
|
+
- **Never overdue.** No counts of what is due; a lesson that is back just waits on the field, and time away builds no
|
|
86
|
+
backlog ([learning design, rules](learning.md#rules-for-every-part-below)).
|
|
87
|
+
|
|
88
|
+
### Where your answers are kept: on your computer
|
|
89
|
+
|
|
90
|
+
Per-person learning data stays on the person's own computer ([learning design](learning.md)). Your answers are kept in
|
|
91
|
+
your archive on this computer. Signed in to a hub, battles are the plain turn-based kind and nothing about your answers
|
|
92
|
+
is kept there. The questions themselves belong to the lessons, not to anyone, and are kept with them.
|
|
93
|
+
|
|
94
|
+
## 4. What the evidence says
|
|
95
|
+
|
|
96
|
+
A research pass in October 2026 looked at boot.dev and two dozen other learning products, games laid over real work and
|
|
97
|
+
AI-agent activity, game patterns that make knowledge part of the world, and the learning research. What carried the
|
|
98
|
+
decisions above:
|
|
99
|
+
|
|
100
|
+
- **The knowledge has to be the move that decides the encounter.** Children learned more, and chose to play about
|
|
101
|
+
seven times longer, when the maths was the combat itself rather than quizzes between levels
|
|
102
|
+
([Habgood & Ainsworth, 2011](https://shura.shu.ac.uk/3556/)). It is not a blanket rule: separating the exercise from
|
|
103
|
+
play did better in one study with adults ([Nidd & Muldner, 2019](https://escholarship.org/content/qt8453p0gf/qt8453p0gf.pdf)).
|
|
104
|
+
The reading that holds: integration pays when the winning move forces the relevant thinking.
|
|
105
|
+
- **Recalling beats rereading,** and the rereaders feel more confident: 56% against 42% remembered after a week
|
|
106
|
+
([Roediger & Karpicke, 2006](https://psychology.ecu.edu/wp-content/pv-uploads/sites/216/2019/03/Roediger-Karpicke-2006.pdf)).
|
|
107
|
+
Multiple-choice practice with feedback works well
|
|
108
|
+
([Adesope et al., 2017](https://journals.sagepub.com/doi/10.3102/0034654316689306)), and spacing helps it stick;
|
|
109
|
+
Duolingo's spaced review raised daily engagement 12% ([Settles & Meeder, 2016](https://aclanthology.org/P16-1174/)).
|
|
110
|
+
- **A level means something only when a check stands behind it.** Boot.dev pays out only for work a machine has checked,
|
|
111
|
+
and in April 2026 replaced even its self-marked lessons with multiple-choice checks
|
|
112
|
+
([Boot.dev, April 2026](https://www.boot.dev/blog/news/bootdev-beat-2026-04)). Codewars raises rank only for problems
|
|
113
|
+
never solved before ([Codewars](https://docs.codewars.com/gamification/ranks/)); WaniKani unlocks items only once
|
|
114
|
+
their prerequisites are remembered, and lets them fall back
|
|
115
|
+
([WaniKani](https://knowledge.wanikani.com/wanikani/srs-stages/)). Hence readiness from answers and levels only from
|
|
116
|
+
gates.
|
|
117
|
+
- **Rewards for taking part lower the wish to do the task; feedback raises it**
|
|
118
|
+
([Deci, Koestner & Ryan, 1999](https://depts.washington.edu/techdocs/papers/deciExtrinsicRewardsAndIntrinsicMotivation99.pdf)).
|
|
119
|
+
Points, levels and leaderboards raise how much people do, not how well
|
|
120
|
+
([Mekler et al., 2017](https://glassmanlab.seas.harvard.edu/annotated_works/mekler17.pdf)). Hence gold only on a
|
|
121
|
+
right answer, and the end screen's feedback, answer and principle as the real reward.
|
|
122
|
+
- **Counters steer behaviour.** When GitHub removed its streak counters, weekend work and keep-alive commits fell
|
|
123
|
+
([Moldon et al., 2021](https://ar5iv.labs.arxiv.org/html/2006.02371)), and a broken streak lowers later engagement
|
|
124
|
+
even when the work behind it is the same
|
|
125
|
+
([Silverman & Barasch, 2023](https://www.colorado.edu/business/faculty-research/2023/04/19/or-track-how-broken-streaks-affect-consumer-decisions)).
|
|
126
|
+
Hence no streaks and no overdue counts.
|
|
127
|
+
- **Gamified learning helps moderately on average and varies a lot with the design.** Only its effect on learning held
|
|
128
|
+
up in the most rigorous studies, not the one on motivation
|
|
129
|
+
([Sailer & Homner, 2020](https://link.springer.com/article/10.1007/s10648-019-09498-w)), and most of the evidence
|
|
130
|
+
comes from classrooms, often with children. So each part ships as a small experiment, judged on what is remembered later
|
|
131
|
+
and on whether you come back, not on how effective it feels.
|
|
132
|
+
|
|
133
|
+
## 5. What the parts are
|
|
134
|
+
|
|
135
|
+
- `src/interlatch/knowledge/study.py`: which lessons are worth studying, the written question and answers
|
|
136
|
+
(`ask`), the first pick (`pick`), the record, readiness and when a lesson comes back (`schedule`).
|
|
137
|
+
- `src/interlatch/web/field.js`: the region's field (its layout is pure and tested), walking, the monsters, the HUD.
|
|
138
|
+
- `src/interlatch/web/battle.js`: the battle; a study battle's rules are pure and tested in Node.
|
|
139
|
+
- `GET /api/party/ask` sends the scene, the question and the answers' texts, never which is right;
|
|
140
|
+
`POST /api/party/pick` checks the first pick on the server.
|
|
141
|
+
|
|
142
|
+
## 6. Next: gate bosses
|
|
143
|
+
|
|
144
|
+
The last meter: your level in a module, moved only by real work.
|
|
145
|
+
|
|
146
|
+
- **When a gate opens.** Five lessons understood in a module open its gate. The zone's sign becomes the gate, with its
|
|
147
|
+
boss standing there.
|
|
148
|
+
- **What the gate asks.** The module's practice task and its pass check from the roadmap, such as "explain why the fix
|
|
149
|
+
works and when it would not".
|
|
150
|
+
- **How you pass.** Link one of your own pull requests, commits or documents that Interlatch already found, and write
|
|
151
|
+
two or three sentences on how it meets the check. The analysis model judges the explanation against the check's text:
|
|
152
|
+
passed, or not yet with what is missing.
|
|
153
|
+
- **What passing does.** The module is marked as shown by you on your career map, kept on this computer, apart from
|
|
154
|
+
your agents' levels. A "You" card on the Party page shows your readiness and the modules you have passed.
|
|
155
|
+
|
|
156
|
+
## Measuring it
|
|
157
|
+
|
|
158
|
+
On your own computer only: delayed recall (right answers when a lesson comes back after days), how often you run from
|
|
159
|
+
a question, how often you come back, and whether a lesson's trap stops recurring in your later sessions.
|
|
160
|
+
|
|
161
|
+
## Not doing
|
|
162
|
+
|
|
163
|
+
- Raising an agent's level from your answers, or your level from your agents' lessons.
|
|
164
|
+
- Streaks, overdue counts, or anything that punishes time away.
|
|
165
|
+
- Ranking people by what they understood, on a hub or anywhere else.
|
|
166
|
+
- Sending your answers to a hub.
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# 設計: Innerlatch、自分の過去から学ぶ
|
|
2
|
+
|
|
3
|
+
[← ロードマップ](../../../ROADMAP.ja.md) · English: [innerlatch.md](../innerlatch.md) · 関連: [人が学べる教訓](learning.md)
|
|
4
|
+
|
|
5
|
+
状態: 0.27.3(2026-10-18)でできています。ゲートのボス(6 節)はまだです。使い方は[冒険](../../ja/party.md#冒険)に
|
|
6
|
+
あります。
|
|
7
|
+
|
|
8
|
+
Innerlatch は、ダッシュボードのレールのいちばん下にある扉の奥のゲームです。コーディングエージェントがドット絵の
|
|
9
|
+
キャラクターのパーティーになり、冒険、町、編成、アリーナがあります。このページには、冒険が何のためにあるのか、そこで教訓と
|
|
10
|
+
戦闘が何を意味するのか、各部分がなぜそう動くのかを、途中で試してやめたことも含めて記録します。
|
|
11
|
+
|
|
12
|
+
## 1. 目標
|
|
13
|
+
|
|
14
|
+
**あなたが自分の過去の仕事から学び、キャリアの道を進むこと。**
|
|
15
|
+
|
|
16
|
+
教訓は、あなたのセッションでエージェントが学んだものです。冒険は、それをあなたのものにする場所です。そのため 3 つの
|
|
17
|
+
メーターを分けておき、どれかが別のどれかを動かすことはありません。
|
|
18
|
+
|
|
19
|
+
| メーター | 示すこと | どこから来るか |
|
|
20
|
+
| --- | --- | --- |
|
|
21
|
+
| エージェントのレベル | 各ロードマップのモジュールを、エージェントの教訓がどれだけカバーしているか | 教訓だけ(パーティーができたときから変わりません) |
|
|
22
|
+
| あなたの準備度 | モジュールの教訓のうち、理解していると示せたものの数 | 正解した学びの戦闘 |
|
|
23
|
+
| モジュールでのあなたのレベル | あなたがそれをできること | 実際の仕事で通ったゲート(6 節、予定) |
|
|
24
|
+
|
|
25
|
+
ゴールド、装備、アリーナは、これらのまわりのゲームのままです。変わるのは戦闘の数値だけで、レベル、準備度、経験値は
|
|
26
|
+
変わりません。
|
|
27
|
+
|
|
28
|
+
## 2. 教訓と戦闘の意味
|
|
29
|
+
|
|
30
|
+
**教訓は、あなた自身の過去から取り出した例題です。** いちばん関係するロードマップのモジュールに分類されています。
|
|
31
|
+
理解していると示すまでは、エージェントがあなたのために集めた学習材料であって、あなたが知っていることではありません。
|
|
32
|
+
|
|
33
|
+
**戦闘は、その例題での 1 回の練習です。** 場面(そのとき出会ったままの状況で、答えは伏せてあります)と問いで始まり、
|
|
34
|
+
4 つの答えから選びます。教訓の題名は答えるまで隠れています。題名が答えを言ってしまうことが多いからです。1 つ選んで
|
|
35
|
+
**答える**を押します。
|
|
36
|
+
|
|
37
|
+
- **正解**はとどめの一撃です。モンスターは倒れ、初めて勝つとゴールドが入り、その教訓はモジュールの準備度に数えられます。
|
|
38
|
+
- **不正解**ならモンスターは逃げていきます。終わりの画面で、その答えがなぜ違うのかが出て、続いて正しい答えと、その裏に
|
|
39
|
+
ある原則(そのプロジェクトの外でも通じる部分)が出ます。
|
|
40
|
+
|
|
41
|
+
**にげる**(または Esc)でいつでも抜けられます。学びの戦闘には、たたかう、スキル、どうぐ、ぼうぎょはありません。
|
|
42
|
+
使える手は知識だけです。
|
|
43
|
+
|
|
44
|
+
## 3. 決めたことと理由
|
|
45
|
+
|
|
46
|
+
### 何を歩くか: 一度に 1 つの地方
|
|
47
|
+
|
|
48
|
+
以前のワールドマップは、数えられる教訓をすべて 1 つの大陸にモンスターとして置いていました。あるアーカイブでは 1,000 体を
|
|
49
|
+
超えました。アイコンで埋まった地図は、場所ではなく、片づけるチェックリストに見えます(ゲームでは「chickenpoxing」と
|
|
50
|
+
呼ばれます)。今の冒険は**フィールド**で始まります。1 つの地方で、ロードマップのモジュールがそれぞれ道でつながったゾーンに
|
|
51
|
+
なり、ゾーンごとにモンスターが数体いて、携帯ゲーム機の RPG のように歩きます。ワールドマップは、モンスターのいない全体図
|
|
52
|
+
として残っています。
|
|
53
|
+
|
|
54
|
+
### どの教訓がモンスターになるか: 学ぶ価値のあるもの
|
|
55
|
+
|
|
56
|
+
- **メインクエストが先。** メインクエストのトラックのゾーンにはモンスターが 4 体、ほかのゾーンには 2 体います。
|
|
57
|
+
- **学習材料が先。** 事件簿の問いか原則のある教訓が、ほかより先に出ます。
|
|
58
|
+
- **エージェント自身の摩擦は出さない。** どこにでも当てはまってくり返し起きる落とし穴や、シェルやエージェントの道具の
|
|
59
|
+
タグがついたもの(エイリアスされた `rm`、zsh の単語分割、スクリーンショットの保存先)は、エージェントのルールのための
|
|
60
|
+
罠で、あなたのキャリアのものではありません。あるアーカイブでは、これで 97 件がフィールドから外れました。
|
|
61
|
+
|
|
62
|
+
### 理解をどう確かめるか: 教訓ごとに書いた選択問題
|
|
63
|
+
|
|
64
|
+
ここに来るまでに 4 回試しました。
|
|
65
|
+
|
|
66
|
+
1. **数値の戦闘。** 最初の戦闘は、教訓を飾りにしたステータスとサイコロの戦いでした。300 回の模擬戦闘で教訓の文章を
|
|
67
|
+
すべて入れ替えても、結果は 1 つも変わりませんでした。人が知っていることは何も入らず、何も出てきませんでした。
|
|
68
|
+
2. **事件簿からの選択と、借りてきた間違いの答え**(「診断」の試み。マージせずに閉じました)。事件簿のある教訓は 10 件に
|
|
69
|
+
1 件ほどで、遊べるもののうち 63% には外れた手がかりの記録がなく、間違いの答えはほかの教訓の答えでした。簡単に除外
|
|
70
|
+
できます。5 件に 1 件ほどは、最初に出る題名が答えのほとんどを含んでいました。間違えても、次の選択肢を選べば済みました。
|
|
71
|
+
3. **自由記述をモデルが判定する。** 正直で柔軟ですが、ゲームの途中で文章を書くことを求め、手応えがありませんでした。
|
|
72
|
+
4. **教訓のために書いた選択問題**(出荷したもの)。分析モデルが教訓ごとに一度、教訓そのものから場面、問い、4 つの答えを
|
|
73
|
+
書きます。間違いの答えは、まずそのセッションで外れた手がかり、次にありがちな思い違いで、それぞれになぜ違うのかが
|
|
74
|
+
つきます。セットは確かめられ(正解はちょうど 1 つ、同じような答えはなし、正解がいちばん長くはならない)、教訓と一緒に
|
|
75
|
+
残ります。数えるのは戦闘での最初の選択で、サーバーが確かめるので、答えるときにモデルを呼ぶ必要はありません。
|
|
76
|
+
|
|
77
|
+
### 教訓がいつ戻るか: 間隔をあけて、期限切れはなし
|
|
78
|
+
|
|
79
|
+
- **正解:** 休んでから、忘れかけるころにもう一度見に戻ってきます。3 日後、正解を続けるごとに 10 日、30 日、90 日後で、
|
|
80
|
+
フィールドでは ↻ の印がつきます。別々の日に続けて 2 回正解すると、**あなたのもの**です。
|
|
81
|
+
- **正解しなかった:** 結果にかかわらず(間違えた、答えずに勝った、にげた)、明日までフィールドに出ません。答えを見た直後に
|
|
82
|
+
もう一度挑むのは、思い出すのではなく写すことです。
|
|
83
|
+
- **期限切れはなし。** 期限の来た数は出しません。戻った教訓はフィールドで待っているだけで、離れていた時間が溜まることは
|
|
84
|
+
ありません([学びの設計、ルール](learning.md#すべての部分に共通するルール))。
|
|
85
|
+
|
|
86
|
+
### 答えをどこに残すか: あなたのコンピューター
|
|
87
|
+
|
|
88
|
+
人ごとの学びのデータは、その人のコンピューターに残します([学びの設計](learning.md))。答えは、このコンピューターの
|
|
89
|
+
あなたのアーカイブに残ります。ハブにサインインしているときは、戦闘はふつうのターン制で、答えについてはハブに何も残り
|
|
90
|
+
ません。問いそのものは教訓のもので、だれかのものではないので、教訓と一緒に残ります。
|
|
91
|
+
|
|
92
|
+
## 4. 根拠
|
|
93
|
+
|
|
94
|
+
2026 年 10 月の調査では、boot.dev とほか 20 余りの学習プロダクト、実際の作業や AI エージェントの活動に重ねたゲーム、知識を
|
|
95
|
+
世界の一部にするゲームの型、学習の研究を見ました。上の決定を支えたのは次の点です。
|
|
96
|
+
|
|
97
|
+
- **知識が、戦いを決める手でなければならない。** 算数がレベルの合間のクイズではなく戦闘そのものだったとき、子どもは
|
|
98
|
+
よりよく学び、自分から約 7 倍長く遊びました([Habgood & Ainsworth, 2011](https://shura.shu.ac.uk/3556/))。ただし
|
|
99
|
+
一律のルールではなく、大人を対象にしたある研究では、練習を遊びから切り離したほうがよい結果でした
|
|
100
|
+
([Nidd & Muldner, 2019](https://escholarship.org/content/qt8453p0gf/qt8453p0gf.pdf))。成り立つ読み方は、勝つ手が
|
|
101
|
+
関係する考えを強いるときに、組み込むことが報われる、というものです。
|
|
102
|
+
- **思い出すほうが読み返すより効き、**しかも読み返した人のほうが自信を持ちます。1 週間後に覚えていたのは 56% 対 42% でした
|
|
103
|
+
([Roediger & Karpicke, 2006](https://psychology.ecu.edu/wp-content/pv-uploads/sites/216/2019/03/Roediger-Karpicke-2006.pdf))。
|
|
104
|
+
フィードバックつきの選択問題の練習はよく効き
|
|
105
|
+
([Adesope et al., 2017](https://journals.sagepub.com/doi/10.3102/0034654316689306))、間隔をあけると定着します。
|
|
106
|
+
Duolingo の間隔をあけた復習は、毎日の利用を 12% 増やしました([Settles & Meeder, 2016](https://aclanthology.org/P16-1174/))。
|
|
107
|
+
- **レベルに意味があるのは、確認が裏にあるときだけ。** Boot.dev は機械が確かめた作業にだけ報酬を払い、2026 年 4 月には
|
|
108
|
+
自己申告のレッスンまで選択問題の確認に置き換えました
|
|
109
|
+
([Boot.dev, April 2026](https://www.boot.dev/blog/news/bootdev-beat-2026-04))。Codewars は初めて解いた問題でだけ
|
|
110
|
+
ランクが上がり([Codewars](https://docs.codewars.com/gamification/ranks/))、WaniKani は前提を覚えてから項目を開き、
|
|
111
|
+
忘れれば戻します([WaniKani](https://knowledge.wanikani.com/wanikani/srs-stages/))。だから準備度は答えから、レベルは
|
|
112
|
+
ゲートからだけ得られます。
|
|
113
|
+
- **参加への報酬はその作業をしたい気持ちを下げ、フィードバックは上げる**
|
|
114
|
+
([Deci, Koestner & Ryan, 1999](https://depts.washington.edu/techdocs/papers/deciExtrinsicRewardsAndIntrinsicMotivation99.pdf))。
|
|
115
|
+
ポイント、レベル、リーダーボードが増やすのはやる量で、質ではありません
|
|
116
|
+
([Mekler et al., 2017](https://glassmanlab.seas.harvard.edu/annotated_works/mekler17.pdf))。だからゴールドは正解の
|
|
117
|
+
ときだけで、本当の報酬は終わりの画面のフィードバック、答え、原則です。
|
|
118
|
+
- **カウンターは行動を動かす。** GitHub が連続記録のカウンターを外すと、週末の作業と、記録をつなぐためだけのコミットが
|
|
119
|
+
減りました([Moldon et al., 2021](https://ar5iv.labs.arxiv.org/html/2006.02371))。連続記録が途切れると、その裏の作業が
|
|
120
|
+
同じでも、その後の利用が下がります
|
|
121
|
+
([Silverman & Barasch, 2023](https://www.colorado.edu/business/faculty-research/2023/04/19/or-track-how-broken-streaks-affect-consumer-decisions))。
|
|
122
|
+
だから連続記録も、期限の来た数もありません。
|
|
123
|
+
- **ゲーム化した学習の効果は平均では中くらいで、設計しだいで大きく変わる。** 最も厳密な研究で残ったのは学習への効果
|
|
124
|
+
だけで、意欲への効果は残りませんでした
|
|
125
|
+
([Sailer & Homner, 2020](https://link.springer.com/article/10.1007/s10648-019-09498-w))。根拠のほとんどは教室からで、
|
|
126
|
+
子どもが対象のことも多いです。だから各部分は小さな実験として出し、効いている感じではなく、あとで覚えているかと、また
|
|
127
|
+
戻ってくるかで判断します。
|
|
128
|
+
|
|
129
|
+
## 5. 各部分
|
|
130
|
+
|
|
131
|
+
- `src/interlatch/knowledge/study.py`: どの教訓が学ぶ価値があるか、書いた問いと答え(`ask`)、最初の選択(`pick`)、
|
|
132
|
+
記録、準備度、教訓がいつ戻るか(`schedule`)。
|
|
133
|
+
- `src/interlatch/web/field.js`: 地方のフィールド(配置は純粋な関数で、テストがあります)、歩くこと、モンスター、HUD。
|
|
134
|
+
- `src/interlatch/web/battle.js`: 戦闘。学びの戦闘のルールは純粋な関数で、Node でテストしています。
|
|
135
|
+
- `GET /api/party/ask` は場面、問い、答えの文だけを送り、どれが正解かは送りません。`POST /api/party/pick` が最初の
|
|
136
|
+
選択をサーバーで確かめます。
|
|
137
|
+
|
|
138
|
+
## 6. 次: ゲートのボス
|
|
139
|
+
|
|
140
|
+
最後のメーター、モジュールでのあなたのレベルです。動かせるのは実際の仕事だけです。
|
|
141
|
+
|
|
142
|
+
- **ゲートが開くとき。** モジュールの教訓を 5 つ理解すると、そのゲートが開きます。ゾーンの看板がゲートになり、ボスが
|
|
143
|
+
立ちます。
|
|
144
|
+
- **ゲートが求めること。** ロードマップにある、そのモジュールの練習課題と合格の確認です。たとえば「修正がなぜ効くのか、
|
|
145
|
+
どんなときは効かないのかを説明できる」。
|
|
146
|
+
- **通り方。** Interlatch がすでに見つけた、あなた自身のプルリクエスト、コミット、ドキュメントのどれかを結びつけ、それが
|
|
147
|
+
確認にどう合うかを 2〜3 文で書きます。分析モデルが、確認の文に照らして説明を判定します。合格か、何が足りないかを
|
|
148
|
+
添えた「まだ」です。
|
|
149
|
+
- **合格すると。** そのモジュールには、キャリアマップで「あなたが示した」と印がつきます。このコンピューターに残り、
|
|
150
|
+
エージェントのレベルとは別です。パーティーのページの「あなた」のカードに、準備度と合格したモジュールが出ます。
|
|
151
|
+
|
|
152
|
+
## 効果の測り方
|
|
153
|
+
|
|
154
|
+
あなたのコンピューターの中だけで測ります。遅れて思い出せるか(数日たって教訓が戻ったときに正解するか)、問いからどれだけ
|
|
155
|
+
にげるか、どれだけ戻ってくるか、教訓の罠がその後のセッションでくり返されなくなるか、です。
|
|
156
|
+
|
|
157
|
+
## やらないこと
|
|
158
|
+
|
|
159
|
+
- あなたの答えでエージェントのレベルを上げること、エージェントの教訓であなたのレベルを上げること。
|
|
160
|
+
- 連続記録、期限の来た数、離れていた時間を罰するもの。
|
|
161
|
+
- 理解したことで人を順位づけること。ハブでも、ほかのどこでも。
|
|
162
|
+
- あなたの答えをハブに送ること。
|
|
@@ -58,18 +58,44 @@ Innerlatch の扉は、Google でサインインするまで開きません。
|
|
|
58
58
|
|
|
59
59
|
## 冒険
|
|
60
60
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
61
|
+
**冒険**を開くと、歩き回れるフィールドが出ます。一度に 1 つの地方を、携帯ゲーム機の RPG のように上から見下ろします。
|
|
62
|
+
最後に歩いた地方(初めてなら、パーティーが立っている地方)が開き、ほかの地方はサイドバーの**地方**から開けます。地方の
|
|
63
|
+
ロードマップのモジュールがそれぞれ看板のあるゾーンになり、ゾーンどうしは土の道でつながり、木の列で区切られ、真ん中に地方の
|
|
64
|
+
町があります。歩きたい場所をクリックかタップするか、矢印キーか WASD で動きます。パーティーは先頭について歩きます。上の
|
|
65
|
+
ゾーンの見出しには、いまいるモジュール、戦う教訓があといくつ残っているか、いくつ理解したかが出ます。★ はメインクエストの
|
|
66
|
+
ゾーンです。隅のミニマップには、いまいる場所と近くのモンスターが出ます。
|
|
67
|
+
|
|
68
|
+
モンスターは、学ぶ価値のある教訓です。各ゾーンで学べることの多いもの(事件簿か原則のあるもの)が先に出て、メインクエストの
|
|
69
|
+
ゾーンでは一度に 4 体、ほかのゾーンでは 2 体です。エージェントがあなたの環境でくり返しはまる罠(エイリアスされた `rm`、
|
|
70
|
+
zsh、スクリーンショットの保存先)は出てきません。それはエージェントのルールに入れるもので、あなたのキャリアのものでは
|
|
71
|
+
ありません。モンスターにぶつかると戦闘に、町の門に入ると買い物になります。
|
|
72
|
+
|
|
73
|
+
サイドバーの**ワールドマップ**には大陸全体が出ます。すべての地方とその領地で、まだ教訓が届いていないところは霧に包まれて
|
|
74
|
+
います。**遭遇リスト**には教訓が一覧で出て、地方、種類、エージェントで絞り込めます。
|
|
75
|
+
|
|
76
|
+
### 学びの戦闘
|
|
77
|
+
|
|
78
|
+
戦闘は、あなた自身のセッションの教訓を 1 つ、問いにしたものです。場面と問いが出て、4 つの答えから選びます。教訓の題名は
|
|
79
|
+
隠れています。題名が答えを言ってしまうことが多いからです。1 つ選び(クリックするか、1〜4 のキー。矢印キーで選択が動きます)、
|
|
80
|
+
**答える**(または Enter)を押します。**にげる**(または Esc)でいつでも抜けられます。
|
|
81
|
+
|
|
82
|
+
- **正解**: あなたの答えがとどめの一撃です。モンスターは倒れ、初めて勝つとゴールドが入り、その教訓はモジュールの準備度に
|
|
83
|
+
数えられます。
|
|
84
|
+
- **不正解**: モンスターは逃げていきます。終わりの画面で、その答えがなぜ違うのかが出て、続いて正しい答えとその裏にある
|
|
85
|
+
原則が出ます。
|
|
86
|
+
|
|
87
|
+
問いと答えは、教訓ごとに一度だけ、分析モデルが教訓そのものから書きます。間違いの答えは、そのセッションで外れた手がかりと、
|
|
88
|
+
ありがちな思い違いです。初めて出会う教訓では数秒かかり、そのあとは残ります。
|
|
89
|
+
|
|
90
|
+
今日戦って正解しなかった教訓は、明日までフィールドに出ません。もう一度挑むときは、見たばかりの答えを写すのではなく、
|
|
91
|
+
思い出すことになります。正解した教訓は休んでから、忘れかけるころにもう一度見に戻ってきます。3 日後、正解を続けるごとに
|
|
92
|
+
10 日、30 日、90 日後で、フィールドでは ↻ の印がつきます。別々の 2 日に正解すれば、あなたのものです。期限切れは
|
|
93
|
+
ありません。戻ってきた教訓はフィールドで待っているだけです。
|
|
94
|
+
|
|
95
|
+
答えはあなた自身の準備度にだけ数えられ、エージェントのレベルには入りません。エージェントのレベルは教訓からだけ得られます。
|
|
96
|
+
答えはあなたのコンピューターにだけ残ります。ハブにサインインしているときは、戦闘はふつうのターン制(**たたかう**、
|
|
97
|
+
**スキル**、**どうぐ**、**ぼうぎょ**、**にげる**)で、答えについては何も残りません。問いが書けないとき(分析モデルに
|
|
98
|
+
つながらないとき)も、同じふつうの戦闘になります。ボスとも戦えますが、倒れるのは**クエスト**でそのマイルストーンを
|
|
73
99
|
完了にしたときだけです。
|
|
74
100
|
|
|
75
101
|
## 町と装備
|
|
@@ -7,7 +7,7 @@ from datetime import datetime, timedelta
|
|
|
7
7
|
|
|
8
8
|
from ..core.config import Config
|
|
9
9
|
from ..core.i18n import tr
|
|
10
|
-
from ..core.util import local_str, one_line, to_iso, utcnow
|
|
10
|
+
from ..core.util import local_str, one_line, parse_ts, to_iso, utcnow
|
|
11
11
|
from ..storage.kv import kv_get
|
|
12
12
|
from .runners.base import Runner
|
|
13
13
|
from .runners.factory import make_runner
|
|
@@ -130,3 +130,72 @@ def queued_ids(conn, cfg: Config, code: str, limit: int) -> list[str]:
|
|
|
130
130
|
if len(ids) >= limit:
|
|
131
131
|
break
|
|
132
132
|
return ids
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
RUN_INTERVAL_S = 900 # the background agent: `interlatch sync --work` every 15 minutes (runtime/install.py)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def typical_analysis_s(conn) -> float:
|
|
139
|
+
"""How long one session's analysis takes on this computer: the median of the last 20 that got through."""
|
|
140
|
+
took = sorted(r[0] for r in conn.execute(
|
|
141
|
+
"SELECT (julianday(finished_at) - julianday(started_at)) * 86400 FROM analyses WHERE kind = 'session' "
|
|
142
|
+
"AND status = 'done' AND started_at IS NOT NULL AND finished_at IS NOT NULL ORDER BY id DESC LIMIT 20")
|
|
143
|
+
if r[0] and r[0] > 0)
|
|
144
|
+
return round(took[len(took) // 2], 1) if took else 60.0
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def queue_list(conn, cfg: Config, limit: int = 200) -> dict:
|
|
148
|
+
"""The sessions queued for analysis (the ones the status bar counts), each with its reason and `eta`: when it
|
|
149
|
+
should be analyzed. The background runs are played forward: one every RUN_INTERVAL_S after the last sync, each
|
|
150
|
+
taking max_per_run sessions in pending_sessions() order, a session joining the first run after it is ready.
|
|
151
|
+
No eta while the whole queue is stopped by something that needs a change (automatic analysis off, no agent)."""
|
|
152
|
+
now = utcnow()
|
|
153
|
+
block = queue_block(conn, cfg)
|
|
154
|
+
paused = kv_get(conn, PAUSE_KEY)
|
|
155
|
+
paused = parse_ts(paused) if paused and paused > to_iso(now) else None
|
|
156
|
+
each = typical_analysis_s(conn)
|
|
157
|
+
items = []
|
|
158
|
+
for s in conn.execute(
|
|
159
|
+
"SELECT id, title, project_name, project_path, agent, analysis_status, source, analysis_attempts, analysis_reason, "
|
|
160
|
+
"analysis_not_before, n_prompts, started_at, ended_at, ended_flag FROM sessions WHERE source NOT IN ('history', 'remote') "
|
|
161
|
+
"AND analysis_status IN ('pending','stale','error') ORDER BY ended_flag DESC, ended_at DESC"):
|
|
162
|
+
got = waiting_reason(conn, cfg, s)
|
|
163
|
+
if not got or got[0] not in QUEUED_CODES:
|
|
164
|
+
continue
|
|
165
|
+
code, why = got
|
|
166
|
+
ready_at = (parse_ts(s["analysis_not_before"]) if code == "retry"
|
|
167
|
+
else (parse_ts(s["ended_at"]) or now) + timedelta(minutes=cfg.analysis.idle_minutes) if code == "active"
|
|
168
|
+
else now)
|
|
169
|
+
items.append({"id": s["id"], "title": s["title"], "project": s["project_name"], "agent": s["agent"],
|
|
170
|
+
"prompts": s["n_prompts"], "ended_at": s["ended_at"], "code": code,
|
|
171
|
+
"label": tr(QUEUE_REASON_LABEL[code]), "why": why, "stale": s["analysis_status"] == "stale",
|
|
172
|
+
"ready_at": max(ready_at or now, now), "eta": None})
|
|
173
|
+
|
|
174
|
+
next_run = None
|
|
175
|
+
if not cfg.sends_files and (not block or paused): # a pause ends by itself; the other blocks need a change
|
|
176
|
+
last = parse_ts(kv_get(conn, "last_sync"))
|
|
177
|
+
slot = max(last + timedelta(seconds=RUN_INTERVAL_S), now) if last else now + timedelta(seconds=RUN_INTERVAL_S)
|
|
178
|
+
while paused and slot < paused:
|
|
179
|
+
slot += timedelta(seconds=RUN_INTERVAL_S)
|
|
180
|
+
next_run = slot
|
|
181
|
+
left, per_run = list(items), max(1, cfg.analysis.max_per_run)
|
|
182
|
+
for _ in range(2000): # a guard: a few thousand queued sessions is weeks of runs
|
|
183
|
+
if not left:
|
|
184
|
+
break
|
|
185
|
+
due = [x for x in left if x["ready_at"] <= slot][:per_run]
|
|
186
|
+
if not due: # nothing ready by this run: skip to the first run after the next one is
|
|
187
|
+
first = min(x["ready_at"] for x in left)
|
|
188
|
+
while slot < first:
|
|
189
|
+
slot += timedelta(seconds=RUN_INTERVAL_S)
|
|
190
|
+
continue
|
|
191
|
+
for i, x in enumerate(due):
|
|
192
|
+
x["eta"] = to_iso(slot + timedelta(seconds=each * (i + 1)))
|
|
193
|
+
left = [x for x in left if x["eta"] is None]
|
|
194
|
+
slot += timedelta(seconds=RUN_INTERVAL_S)
|
|
195
|
+
items.sort(key=lambda x: x["eta"] or "~") # stable: the worker's order within one run
|
|
196
|
+
for x in items:
|
|
197
|
+
x["ready_at"] = to_iso(x["ready_at"])
|
|
198
|
+
return {"sessions": items[:limit], "total": len(items), "ready": sum(x["code"] == "ready" for x in items),
|
|
199
|
+
"active": sum(x["code"] == "active" for x in items), "each_s": each, "per_run": cfg.analysis.max_per_run,
|
|
200
|
+
"interval_s": RUN_INTERVAL_S, "next_run": to_iso(next_run), "block": block,
|
|
201
|
+
"paused_until": to_iso(paused), "on_hub": bool(cfg.sends_files)}
|
|
@@ -237,6 +237,13 @@ def action_sync(ctx: Context) -> bool:
|
|
|
237
237
|
return ctx.jobs.start("sync", job)
|
|
238
238
|
|
|
239
239
|
|
|
240
|
+
def analysis_queue(ctx: Context) -> dict:
|
|
241
|
+
"""What the status bar's queue line opens: the queued sessions with their reasons and when each is analyzed."""
|
|
242
|
+
from ....analysis.queue import queue_list
|
|
243
|
+
|
|
244
|
+
return queue_list(ctx.conn, ctx.cfg)
|
|
245
|
+
|
|
246
|
+
|
|
240
247
|
def action_analyze(ctx: Context, sid: str) -> bool:
|
|
241
248
|
from ....application.workflows import run_worker
|
|
242
249
|
from ...exports.vault import export_markdown
|
|
@@ -247,6 +247,7 @@ GET: list[Route] = [
|
|
|
247
247
|
Route("/api/systems", ANYONE, lambda h, ctx, m, q: h._json(api.knowledge.systems(ctx))),
|
|
248
248
|
Route("/api/system", ANYONE, _system),
|
|
249
249
|
Route("/api/jobs", ANYONE, lambda h, ctx, m, q: h._json(api.status.status_small(ctx, limited=h.limited))),
|
|
250
|
+
Route("/api/analysis/queue", ANYONE, lambda h, ctx, m, q: h._json(api.status.analysis_queue(ctx))),
|
|
250
251
|
Route("/api/update", ANYONE, lambda h, ctx, m, q: h._json(api.settings.update_info(ctx, remote=False))),
|
|
251
252
|
Route("/api/imports", ANYONE, lambda h, ctx, m, q: h._json(api.sources.imports(ctx))),
|
|
252
253
|
Route("/api/devices", ANYONE, _devices),
|
|
@@ -2316,6 +2316,26 @@ td.pg-cell { width: 1%; text-align: right; }
|
|
|
2316
2316
|
.gd-rule { display: flex; align-items: center; gap: 8px; padding: 4px 4px 4px 8px; border: 1px solid var(--border); border-radius: 6px; background: var(--surface-2); }
|
|
2317
2317
|
.gd-rule .icon { width: 14px; height: 14px; color: var(--muted); flex: none; }
|
|
2318
2318
|
.gd-rule .mono { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--mono); font-size: 12px; }
|
|
2319
|
+
/* the analysis queue: what the status bar's queue line opens */
|
|
2320
|
+
.qd { width: min(640px, 100%); }
|
|
2321
|
+
.qd-body { display: flex; flex-direction: column; gap: 10px; min-height: 0; font-size: 13px; }
|
|
2322
|
+
.qd-body p { margin: 0; }
|
|
2323
|
+
.qd-run .queue-run { margin: 0; }
|
|
2324
|
+
.qd-took { margin-top: 4px; font-size: 12px; }
|
|
2325
|
+
.qd-list { list-style: none; margin: 0; padding: 0; max-height: min(52vh, 460px); overflow-y: auto; border-top: 1px solid var(--grid); }
|
|
2326
|
+
.qd-row { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; align-items: center; gap: 4px 12px; padding: 8px 2px; border-bottom: 1px solid var(--grid); }
|
|
2327
|
+
.qd-main { min-width: 0; }
|
|
2328
|
+
.qd-main a { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }
|
|
2329
|
+
.qd-meta { font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
2330
|
+
.qd-code { white-space: nowrap; }
|
|
2331
|
+
.qd-code.ready { color: var(--accent-ink); }
|
|
2332
|
+
.qd-code.retry { color: var(--warning-ink); }
|
|
2333
|
+
.qd-eta { display: grid; justify-items: end; min-width: 76px; font-variant-numeric: tabular-nums; font-size: 12px; }
|
|
2334
|
+
@media (max-width: 560px) {
|
|
2335
|
+
.qd-row { grid-template-columns: minmax(0, 1fr) auto; }
|
|
2336
|
+
.qd-code { grid-row: 2; justify-self: start; }
|
|
2337
|
+
.qd-eta { grid-row: 1 / span 2; grid-column: 2; }
|
|
2338
|
+
}
|
|
2319
2339
|
.gd-rule .icon-btn { width: 24px; height: 24px; }
|
|
2320
2340
|
.gd-none { font-size: 12px; }
|
|
2321
2341
|
.gd-add { display: flex; gap: 6px; }
|