immich-api 0.2.2__tar.gz → 0.2.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.
- immich_api-0.2.4/.bumpversion.cfg +8 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pre-commit-config.yaml +0 -12
- {immich_api-0.2.2/immich_api.egg-info → immich_api-0.2.4}/PKG-INFO +4 -4
- {immich_api-0.2.2 → immich_api-0.2.4}/docker/Dockerfile +1 -1
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/__init__.py +8 -0
- immich_api-0.2.4/immich_api/connector_sources.py +123 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/mcp_server.py +9 -2
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/ontology/immich.ttl +1 -1
- {immich_api-0.2.2 → immich_api-0.2.4/immich_api.egg-info}/PKG-INFO +4 -4
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api.egg-info/SOURCES.txt +1 -8
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api.egg-info/entry_points.txt +1 -4
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api.egg-info/requires.txt +3 -3
- {immich_api-0.2.2 → immich_api-0.2.4}/pyproject.toml +6 -9
- {immich_api-0.2.2 → immich_api-0.2.4}/requirements.txt +1 -1
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/bootstrap_environment.py +24 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/generate_immich_content.py +1 -54
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/connector-content/status.json +3 -1
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/immich-api/status.json +4 -4
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/parity_support.py +3 -3
- immich_api-0.2.4/tests/test_default_content_surfaces.py +198 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_fleet_name.py +3 -11
- immich_api-0.2.4/tests/test_immich_content.py +44 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_kg_ingest.py +0 -30
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_operation_parity.py +75 -11
- immich_api-0.2.2/.bumpversion.cfg +0 -12
- immich_api-0.2.2/immich_api/connector_manifest.yml +0 -212
- immich_api-0.2.2/immich_api/connectors/mcp_source_presets.json +0 -3
- immich_api-0.2.2/immich_api/connectors/tool_schema_fingerprints.json +0 -1
- immich_api-0.2.2/scripts/generate_tool_schemas.py +0 -100
- immich_api-0.2.2/scripts/generated_schema_clones.py +0 -163
- immich_api-0.2.2/scripts/verify_generated_schemas.py +0 -111
- immich_api-0.2.2/tests/test_default_content_surfaces.py +0 -43
- immich_api-0.2.2/tests/test_generated_schema_policy.py +0 -159
- immich_api-0.2.2/tests/test_immich_content.py +0 -149
- immich_api-0.2.2/tests/test_source_image.py +0 -24
- {immich_api-0.2.2 → immich_api-0.2.4}/.config/spec-dashboard.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.github/workflows/connector-pr.yml +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.github/workflows/pages.yml +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.github/workflows/pipeline.yml +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.github/workflows/scanners.yml +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.github/workflows/windows-ci.yml +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/provenance.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/scripts/sync_mkdocs_theme.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/README.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-connector-sdk-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-terminal-ui-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-utilities-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-webui-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/epistemic-graph-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/geniusbot-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/graph-os-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/favicon.svg +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/graph-mark.svg +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/runtime-architecture.mmd +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/runtime-architecture.svg +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/base.mkdocs.yml +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/extra.css +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/glossary.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/overrides/main.html +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/LICENSE +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/MANIFEST.in +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/README.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docker/debug.Dockerfile +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docker/mcp.compose.yml +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docker/starship.toml +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/agent-readiness.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/agent-readiness.schema.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/architecture.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/agent-connector-sdk-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/agent-terminal-ui-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/agent-utilities-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/agent-webui-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/epistemic-graph-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/geniusbot-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/graph-os-logo-v1.png +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/favicon.svg +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/graph-mark.svg +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/runtime-architecture.mmd +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/runtime-architecture.svg +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/capabilities/api.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/capabilities/mcp.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/concepts.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/deployment.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/glossary.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/immich-capabilities.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/index.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/installation.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/openapi-parity.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/overview.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/platform.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/spec-delivery.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/stylesheets/extra.css +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/docs/usage.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/__main__.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/album_metadata.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/api/__init__.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/api/api_client_system.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/auth.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/connectors/__init__.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/error_authority.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/error_rendering.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/immich_input_models.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/immich_response_models.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/kg_ingest.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/mcp/__init__.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/mcp/album_sample.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/mcp_config.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/ontology/__init__.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/ontology/schema-provenance.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/ontology/shapes/immich.ttl +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_auth_scheme.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_contract.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_execution.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_inventory.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_request.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_response.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_runtime.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/__init__.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/check_openapi_parity.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_discovery.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_parity.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_provider_evidence.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_provider_overlay.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_provider_responses.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_schema.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_schema_budget.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_schema_inputs.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_schema_types.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_security.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_source_parity.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_transport_parity.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/unicode_patterns.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/unicode_properties.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/prompts/__init__.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/prompts/immich_album_review.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/prompts/immich_asset_metadata.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/prompts/immich_person_record.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/prompts/immich_specialist.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/prompts/main_agent.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/skills/__init__.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/skills/immich-album-review/SKILL.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/skills/immich-asset-metadata/SKILL.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/skills/immich-health/SKILL.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/skills/immich-person-record/SKILL.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api.egg-info/dependency_links.txt +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/immich_api.egg-info/top_level.txt +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/mkdocs.yml +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/pytest.ini +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/agent_readiness_tck.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/bootstrap.sh +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/bootstrap_sources.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/check_connector_contract.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/check_import_safety.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/check_workspace_source_drift.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/generate_agent_readiness.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/measure_operation_parity.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/reviewed_secret_history.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/security_sanitizer.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/select_python.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/upstream_evidence.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/verify_api_integration.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/scripts/workspace_sources.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/setup.cfg +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/README.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/connector-content/plan.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/connector-content/requirements.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/connector-content/spec.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/connector-content/tasks.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/connector-content/test-spec.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/immich-api/plan.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/immich-api/requirements.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/immich-api/spec.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/immich-api/tasks.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/specs/immich-api/test-spec.md +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/__init__.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/conftest.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/fixtures/native-client-budget.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/fixtures/operation-cases.json +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/operation_fixtures.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_album_metadata.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_api_wrapper.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_auth.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_concept_parity.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_error_authority.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_immich_mcp_validation.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_init_dynamics.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_oauth_redirect_response.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_openapi_auth_provider.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_reviewed_secret_history.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_session_auth_isolation.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_startup.py +0 -0
- {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_upstream_evidence.py +0 -0
|
@@ -20,12 +20,6 @@ repos:
|
|
|
20
20
|
stages: [pre-push]
|
|
21
21
|
- id: kiss-census
|
|
22
22
|
stages: [pre-push]
|
|
23
|
-
- id: jscpd-differential
|
|
24
|
-
entry: python scripts/generated_schema_clones.py differential
|
|
25
|
-
stages: [pre-push]
|
|
26
|
-
- id: jscpd-census
|
|
27
|
-
entry: python scripts/generated_schema_clones.py census
|
|
28
|
-
stages: [pre-push]
|
|
29
23
|
- id: public-surface
|
|
30
24
|
- id: security-sanitizer
|
|
31
25
|
- id: secret-history
|
|
@@ -72,12 +66,6 @@ repos:
|
|
|
72
66
|
language: system
|
|
73
67
|
pass_filenames: false
|
|
74
68
|
always_run: true
|
|
75
|
-
- id: connector-tool-schemas
|
|
76
|
-
name: Live SDK input and output schema contracts
|
|
77
|
-
entry: python scripts/generate_tool_schemas.py --check
|
|
78
|
-
language: system
|
|
79
|
-
pass_filenames: false
|
|
80
|
-
always_run: true
|
|
81
69
|
- id: pytest
|
|
82
70
|
name: Generated connector contracts
|
|
83
71
|
entry: python -m pytest tests -q
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: immich-api
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: Immich Api API + MCP Server
|
|
5
5
|
Author: Repository Maintainers
|
|
6
6
|
License: MIT
|
|
@@ -16,11 +16,11 @@ Requires-Dist: rfc3986-validator<0.2,>=0.1.1
|
|
|
16
16
|
Requires-Dist: rfc3339-validator<0.2,>=0.1.4
|
|
17
17
|
Requires-Dist: jsonschema<5,>=4.23
|
|
18
18
|
Requires-Dist: regex>=2026.9.29
|
|
19
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
19
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.5.5
|
|
20
20
|
Provides-Extra: mcp
|
|
21
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
21
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.5.5; extra == "mcp"
|
|
22
22
|
Provides-Extra: all
|
|
23
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
23
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.5.5; extra == "all"
|
|
24
24
|
Provides-Extra: test
|
|
25
25
|
Requires-Dist: pytest-xdist>=3.6.0; extra == "test"
|
|
26
26
|
Requires-Dist: pytest; extra == "test"
|
|
@@ -20,7 +20,7 @@ ENV HOST=${HOST} \
|
|
|
20
20
|
XDG_CONFIG_HOME=/tmp/.config \
|
|
21
21
|
XDG_CACHE_HOME=/tmp/.cache
|
|
22
22
|
# Fixed identity for least-privilege runtime and stable volume ownership.
|
|
23
|
-
RUN pip install --only-binary :all: immich-api[mcp]==0.2.
|
|
23
|
+
RUN pip install --only-binary :all: immich-api[mcp]==0.2.3 \
|
|
24
24
|
&& groupadd --system --gid 10001 app \
|
|
25
25
|
&& useradd --system --uid 10001 --gid 10001 --no-create-home \
|
|
26
26
|
--home-dir /tmp --shell /usr/sbin/nologin app
|
|
@@ -52,3 +52,11 @@ for module_name, extra_name in OPTIONAL_MODULES.items():
|
|
|
52
52
|
globals()[f"_{extra_name.upper()}_AVAILABLE"] = False
|
|
53
53
|
|
|
54
54
|
__all__.extend(["_MCP_AVAILABLE"])
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
from agent_connector_sdk.connector import Connector
|
|
58
|
+
|
|
59
|
+
connector = Connector(
|
|
60
|
+
tools="immich_api.mcp",
|
|
61
|
+
instructions="Immich Api API + MCP Server",
|
|
62
|
+
)
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""Data sources of this connector, declared by tool name (generated by connector-ontology-map migrate).
|
|
2
|
+
|
|
3
|
+
Served live as ``connector://resources``. Regenerate by editing the declarations, not the tools.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# ruff: noqa: E501
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
CONNECTOR: str = "immich"
|
|
12
|
+
|
|
13
|
+
SOURCES: tuple[Any, ...] = ()
|
|
14
|
+
|
|
15
|
+
SCHEMA_MAPPINGS: dict[str, Any] = {
|
|
16
|
+
"ImmichAlbum": {
|
|
17
|
+
"fields": {
|
|
18
|
+
"immichAlbumAlbumName": "xsd:string",
|
|
19
|
+
"immichAlbumAlbumThumbnailAssetId": "xsd:string",
|
|
20
|
+
"immichAlbumAssetCount": "xsd:integer",
|
|
21
|
+
"immichAlbumCreatedAt": "xsd:dateTime",
|
|
22
|
+
"immichAlbumHasSharedLink": "xsd:boolean",
|
|
23
|
+
"immichAlbumId": "xsd:string",
|
|
24
|
+
"immichAlbumShared": "xsd:boolean",
|
|
25
|
+
"immichAlbumUpdatedAt": "xsd:dateTime",
|
|
26
|
+
},
|
|
27
|
+
"ontology_class": "ImmichAlbum",
|
|
28
|
+
},
|
|
29
|
+
"ImmichAlbumMembership": {
|
|
30
|
+
"fields": {
|
|
31
|
+
"immichAlbumMembershipRole": "xsd:string",
|
|
32
|
+
},
|
|
33
|
+
"ontology_class": "ImmichAlbumMembership",
|
|
34
|
+
},
|
|
35
|
+
"ImmichAsset": {
|
|
36
|
+
"fields": {
|
|
37
|
+
"immichAssetDuration": "xsd:integer",
|
|
38
|
+
"immichAssetFileCreatedAt": "xsd:dateTime",
|
|
39
|
+
"immichAssetHeight": "xsd:integer",
|
|
40
|
+
"immichAssetId": "xsd:string",
|
|
41
|
+
"immichAssetIsArchived": "xsd:boolean",
|
|
42
|
+
"immichAssetIsFavorite": "xsd:boolean",
|
|
43
|
+
"immichAssetIsTrashed": "xsd:boolean",
|
|
44
|
+
"immichAssetOriginalMimeType": "xsd:string",
|
|
45
|
+
"immichAssetType": "xsd:string",
|
|
46
|
+
"immichAssetUpdatedAt": "xsd:dateTime",
|
|
47
|
+
"immichAssetVisibility": "xsd:string",
|
|
48
|
+
"immichAssetWidth": "xsd:integer",
|
|
49
|
+
},
|
|
50
|
+
"ontology_class": "ImmichAsset",
|
|
51
|
+
},
|
|
52
|
+
"ImmichAssetStack": {
|
|
53
|
+
"fields": {
|
|
54
|
+
"immichAssetStackAssetCount": "xsd:integer",
|
|
55
|
+
"immichAssetStackId": "xsd:string",
|
|
56
|
+
"immichAssetStackPrimaryAssetId": "xsd:string",
|
|
57
|
+
},
|
|
58
|
+
"ontology_class": "ImmichAssetStack",
|
|
59
|
+
},
|
|
60
|
+
"ImmichLibrary": {
|
|
61
|
+
"fields": {
|
|
62
|
+
"immichLibraryAssetCount": "xsd:integer",
|
|
63
|
+
"immichLibraryCreatedAt": "xsd:dateTime",
|
|
64
|
+
"immichLibraryId": "xsd:string",
|
|
65
|
+
"immichLibraryName": "xsd:string",
|
|
66
|
+
"immichLibraryUpdatedAt": "xsd:dateTime",
|
|
67
|
+
},
|
|
68
|
+
"ontology_class": "ImmichLibrary",
|
|
69
|
+
},
|
|
70
|
+
"ImmichPersonRecord": {
|
|
71
|
+
"fields": {
|
|
72
|
+
"immichPersonRecordId": "xsd:string",
|
|
73
|
+
"immichPersonRecordIsFavorite": "xsd:boolean",
|
|
74
|
+
"immichPersonRecordIsHidden": "xsd:boolean",
|
|
75
|
+
"immichPersonRecordName": "xsd:string",
|
|
76
|
+
"immichPersonRecordUpdatedAt": "xsd:dateTime",
|
|
77
|
+
},
|
|
78
|
+
"ontology_class": "ImmichPersonRecord",
|
|
79
|
+
},
|
|
80
|
+
"ImmichTag": {
|
|
81
|
+
"fields": {
|
|
82
|
+
"immichTagCreatedAt": "xsd:dateTime",
|
|
83
|
+
"immichTagId": "xsd:string",
|
|
84
|
+
"immichTagName": "xsd:string",
|
|
85
|
+
"immichTagUpdatedAt": "xsd:dateTime",
|
|
86
|
+
},
|
|
87
|
+
"ontology_class": "ImmichTag",
|
|
88
|
+
},
|
|
89
|
+
"ImmichUser": {
|
|
90
|
+
"fields": {
|
|
91
|
+
"immichUserId": "xsd:string",
|
|
92
|
+
"immichUserName": "xsd:string",
|
|
93
|
+
},
|
|
94
|
+
"ontology_class": "ImmichUser",
|
|
95
|
+
},
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
RESOURCES: tuple[dict[str, str], ...] = (
|
|
99
|
+
{
|
|
100
|
+
"name": "ImmichAsset",
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"name": "ImmichAlbum",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"name": "ImmichPersonRecord",
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"name": "ImmichUser",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "ImmichLibrary",
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"name": "ImmichAlbumMembership",
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"name": "ImmichTag",
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"name": "ImmichAssetStack",
|
|
122
|
+
},
|
|
123
|
+
)
|
|
@@ -1,22 +1,29 @@
|
|
|
1
1
|
import sys
|
|
2
|
+
from pathlib import Path
|
|
2
3
|
|
|
3
4
|
from agent_connector_sdk.config import load_config
|
|
5
|
+
from agent_connector_sdk.connector_identity import connector_version
|
|
6
|
+
from agent_connector_sdk.mcp.content import ConnectorContent
|
|
4
7
|
from agent_connector_sdk.mcp.server import create_mcp_server
|
|
5
8
|
from agent_connector_sdk.mcp.tool_surface import register_tool_surface
|
|
6
9
|
|
|
7
10
|
from . import mcp as tool_modules
|
|
8
11
|
|
|
9
|
-
__version__ = "
|
|
12
|
+
__version__ = connector_version("immich_api")
|
|
10
13
|
|
|
11
14
|
|
|
12
15
|
def get_mcp_instance(*, command_args=None):
|
|
13
16
|
"""Construct one SDK-governed server and its native package content."""
|
|
14
17
|
load_config()
|
|
18
|
+
package_version = connector_version("immich_api")
|
|
15
19
|
args, mcp, middlewares = create_mcp_server(
|
|
16
20
|
name="Immich Api",
|
|
17
|
-
version=
|
|
21
|
+
version=package_version,
|
|
18
22
|
instructions="Immich Api API + MCP Server",
|
|
19
23
|
command_args=command_args,
|
|
24
|
+
content=ConnectorContent.for_package(
|
|
25
|
+
"immich_api", Path(__file__).resolve().parent, package_version
|
|
26
|
+
),
|
|
20
27
|
)
|
|
21
28
|
register_tool_surface(mcp, service="immich-api", tools_module=tool_modules)
|
|
22
29
|
for middleware in middlewares:
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
<urn:sha256:7db8383741eeb5c5c8c87a6221cd1cdd1206c8b1190b83363c64223a00bb020b> a prov:Entity ; rdfs:label "Immich 3.2.2 OpenAPI source bytes" .
|
|
10
10
|
|
|
11
|
-
<http://knuckles.team/kg/immich> a owl:Ontology ;
|
|
11
|
+
<http://knuckles.team/kg/immich> a owl:Ontology ; prov:wasDerivedFrom <urn:sha256:7db8383741eeb5c5c8c87a6221cd1cdd1206c8b1190b83363c64223a00bb020b> ; rdfs:comment "Selected structural DTO model. No live ingestion or identity equivalence is asserted." .
|
|
12
12
|
|
|
13
13
|
:ImmichAsset a owl:Class ; rdfs:comment "Structural projection of AssetResponseDto." ; prov:wasDerivedFrom <urn:sha256:7db8383741eeb5c5c8c87a6221cd1cdd1206c8b1190b83363c64223a00bb020b#/components/schemas/AssetResponseDto> .
|
|
14
14
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: immich-api
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: Immich Api API + MCP Server
|
|
5
5
|
Author: Repository Maintainers
|
|
6
6
|
License: MIT
|
|
@@ -16,11 +16,11 @@ Requires-Dist: rfc3986-validator<0.2,>=0.1.1
|
|
|
16
16
|
Requires-Dist: rfc3339-validator<0.2,>=0.1.4
|
|
17
17
|
Requires-Dist: jsonschema<5,>=4.23
|
|
18
18
|
Requires-Dist: regex>=2026.9.29
|
|
19
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
19
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.5.5
|
|
20
20
|
Provides-Extra: mcp
|
|
21
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
21
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.5.5; extra == "mcp"
|
|
22
22
|
Provides-Extra: all
|
|
23
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
23
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.5.5; extra == "all"
|
|
24
24
|
Provides-Extra: test
|
|
25
25
|
Requires-Dist: pytest-xdist>=3.6.0; extra == "test"
|
|
26
26
|
Requires-Dist: pytest; extra == "test"
|
|
@@ -67,7 +67,7 @@ immich_api/__init__.py
|
|
|
67
67
|
immich_api/__main__.py
|
|
68
68
|
immich_api/album_metadata.py
|
|
69
69
|
immich_api/auth.py
|
|
70
|
-
immich_api/
|
|
70
|
+
immich_api/connector_sources.py
|
|
71
71
|
immich_api/error_authority.py
|
|
72
72
|
immich_api/error_rendering.py
|
|
73
73
|
immich_api/immich_input_models.py
|
|
@@ -91,8 +91,6 @@ immich_api.egg-info/top_level.txt
|
|
|
91
91
|
immich_api/api/__init__.py
|
|
92
92
|
immich_api/api/api_client_system.py
|
|
93
93
|
immich_api/connectors/__init__.py
|
|
94
|
-
immich_api/connectors/mcp_source_presets.json
|
|
95
|
-
immich_api/connectors/tool_schema_fingerprints.json
|
|
96
94
|
immich_api/mcp/__init__.py
|
|
97
95
|
immich_api/mcp/album_sample.py
|
|
98
96
|
immich_api/ontology/__init__.py
|
|
@@ -135,15 +133,12 @@ scripts/check_import_safety.py
|
|
|
135
133
|
scripts/check_workspace_source_drift.py
|
|
136
134
|
scripts/generate_agent_readiness.py
|
|
137
135
|
scripts/generate_immich_content.py
|
|
138
|
-
scripts/generate_tool_schemas.py
|
|
139
|
-
scripts/generated_schema_clones.py
|
|
140
136
|
scripts/measure_operation_parity.py
|
|
141
137
|
scripts/reviewed_secret_history.py
|
|
142
138
|
scripts/security_sanitizer.py
|
|
143
139
|
scripts/select_python.py
|
|
144
140
|
scripts/upstream_evidence.py
|
|
145
141
|
scripts/verify_api_integration.py
|
|
146
|
-
scripts/verify_generated_schemas.py
|
|
147
142
|
scripts/workspace_sources.py
|
|
148
143
|
specs/README.md
|
|
149
144
|
specs/connector-content/plan.md
|
|
@@ -169,7 +164,6 @@ tests/test_concept_parity.py
|
|
|
169
164
|
tests/test_default_content_surfaces.py
|
|
170
165
|
tests/test_error_authority.py
|
|
171
166
|
tests/test_fleet_name.py
|
|
172
|
-
tests/test_generated_schema_policy.py
|
|
173
167
|
tests/test_immich_content.py
|
|
174
168
|
tests/test_immich_mcp_validation.py
|
|
175
169
|
tests/test_init_dynamics.py
|
|
@@ -179,7 +173,6 @@ tests/test_openapi_auth_provider.py
|
|
|
179
173
|
tests/test_operation_parity.py
|
|
180
174
|
tests/test_reviewed_secret_history.py
|
|
181
175
|
tests/test_session_auth_isolation.py
|
|
182
|
-
tests/test_source_image.py
|
|
183
176
|
tests/test_startup.py
|
|
184
177
|
tests/test_upstream_evidence.py
|
|
185
178
|
tests/fixtures/native-client-budget.json
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
[agent_connector_sdk.connector]
|
|
2
|
-
immich = immich_api
|
|
2
|
+
immich = immich_api:connector
|
|
3
3
|
|
|
4
4
|
[agent_utilities.ontology_providers]
|
|
5
5
|
immich-api = immich_api.ontology
|
|
@@ -10,8 +10,5 @@ immich-api = immich_api.prompts
|
|
|
10
10
|
[agent_utilities.skill_providers]
|
|
11
11
|
immich-api = immich_api.skills
|
|
12
12
|
|
|
13
|
-
[agent_utilities.source_connector_providers]
|
|
14
|
-
immich-api = immich_api.connectors
|
|
15
|
-
|
|
16
13
|
[console_scripts]
|
|
17
14
|
immich-mcp = immich_api.mcp_server:mcp_server
|
|
@@ -2,13 +2,13 @@ rfc3986-validator<0.2,>=0.1.1
|
|
|
2
2
|
rfc3339-validator<0.2,>=0.1.4
|
|
3
3
|
jsonschema<5,>=4.23
|
|
4
4
|
regex>=2026.9.29
|
|
5
|
-
agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
5
|
+
agent-connector-sdk[mcp]<1.0.0,>=0.5.5
|
|
6
6
|
|
|
7
7
|
[all]
|
|
8
|
-
agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
8
|
+
agent-connector-sdk[mcp]<1.0.0,>=0.5.5
|
|
9
9
|
|
|
10
10
|
[mcp]
|
|
11
|
-
agent-connector-sdk[mcp]<1.0.0,>=0.
|
|
11
|
+
agent-connector-sdk[mcp]<1.0.0,>=0.5.5
|
|
12
12
|
|
|
13
13
|
[test]
|
|
14
14
|
pytest-xdist>=3.6.0
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "immich-api"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.4"
|
|
8
8
|
description = "Immich Api API + MCP Server"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
classifiers = [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Environment :: Console", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3",]
|
|
@@ -14,7 +14,7 @@ dependencies = [
|
|
|
14
14
|
"rfc3339-validator>=0.1.4,<0.2",
|
|
15
15
|
"jsonschema>=4.23,<5",
|
|
16
16
|
"regex>=2026.9.29",
|
|
17
|
-
"agent-connector-sdk[mcp]>=0.
|
|
17
|
+
"agent-connector-sdk[mcp]>=0.5.5,<1.0.0",
|
|
18
18
|
]
|
|
19
19
|
[[project.authors]]
|
|
20
20
|
name = "Repository Maintainers"
|
|
@@ -23,9 +23,9 @@ name = "Repository Maintainers"
|
|
|
23
23
|
text = "MIT"
|
|
24
24
|
|
|
25
25
|
[project.optional-dependencies]
|
|
26
|
-
mcp = [ "agent-connector-sdk[mcp]>=0.
|
|
26
|
+
mcp = [ "agent-connector-sdk[mcp]>=0.5.5,<1.0.0",]
|
|
27
27
|
all = [
|
|
28
|
-
"agent-connector-sdk[mcp]>=0.
|
|
28
|
+
"agent-connector-sdk[mcp]>=0.5.5,<1.0.0",
|
|
29
29
|
]
|
|
30
30
|
test = [
|
|
31
31
|
"pytest-xdist>=3.6.0", "pytest", "pytest-asyncio", "pytest-cov",]
|
|
@@ -46,12 +46,9 @@ immich-api = "immich_api.prompts"
|
|
|
46
46
|
[project.entry-points."agent_utilities.ontology_providers"]
|
|
47
47
|
immich-api = "immich_api.ontology"
|
|
48
48
|
|
|
49
|
-
[project.entry-points."agent_utilities.source_connector_providers"]
|
|
50
|
-
immich-api = "immich_api.connectors"
|
|
51
|
-
|
|
52
49
|
# The one declared connector identity: the fleet name (SDK-CONNECTOR-CONTROL-R071).
|
|
53
50
|
[project.entry-points."agent_connector_sdk.connector"]
|
|
54
|
-
immich = "immich_api"
|
|
51
|
+
immich = "immich_api:connector"
|
|
55
52
|
|
|
56
53
|
[tool.uv.workspace]
|
|
57
54
|
members = ["."]
|
|
@@ -87,7 +84,7 @@ dev = [
|
|
|
87
84
|
]
|
|
88
85
|
|
|
89
86
|
[tool.setuptools.package-data]
|
|
90
|
-
immich_api = [ "openapi_inventory.json", "parity/unicode_properties.json", "openapi_contract.json", "mcp_config.json", "prompts/**", "skills/**", "ontology/**", "connectors/**",
|
|
87
|
+
immich_api = [ "openapi_inventory.json", "parity/unicode_properties.json", "openapi_contract.json", "mcp_config.json", "prompts/**", "skills/**", "ontology/**", "connectors/**", ]
|
|
91
88
|
|
|
92
89
|
[tool.ruff.lint]
|
|
93
90
|
select = [ "E", "F", "I", "UP", "B",]
|
|
@@ -45,6 +45,22 @@ def sync_commands(uv, python, bindings, *, root):
|
|
|
45
45
|
]
|
|
46
46
|
|
|
47
47
|
|
|
48
|
+
def install_project(root, python, uv, *, env):
|
|
49
|
+
"""Install editable project metadata without resolving source dependencies."""
|
|
50
|
+
command = [
|
|
51
|
+
uv,
|
|
52
|
+
"pip",
|
|
53
|
+
"install",
|
|
54
|
+
"--python",
|
|
55
|
+
str(python),
|
|
56
|
+
"--no-deps",
|
|
57
|
+
"--editable",
|
|
58
|
+
str(root),
|
|
59
|
+
]
|
|
60
|
+
subprocess.run(command, cwd=root, env=env, check=True)
|
|
61
|
+
return command
|
|
62
|
+
|
|
63
|
+
|
|
48
64
|
def add_source_paths(root, python, sources, *, env):
|
|
49
65
|
purelib = Path(
|
|
50
66
|
run(
|
|
@@ -79,6 +95,10 @@ def inspect_environment(root, python, *, bindings, sources, env):
|
|
|
79
95
|
probe = """
|
|
80
96
|
import importlib, importlib.metadata, json, pathlib, sys
|
|
81
97
|
expected = json.loads(sys.argv[1])
|
|
98
|
+
project = json.loads(sys.argv[3])
|
|
99
|
+
distribution = importlib.metadata.distribution(project["name"])
|
|
100
|
+
if distribution.version != project["version"]:
|
|
101
|
+
raise ValueError("Installed project metadata differs from reviewed pyproject.toml")
|
|
82
102
|
prefix = pathlib.Path(sys.prefix).resolve()
|
|
83
103
|
if prefix != pathlib.Path(sys.argv[2]).resolve():
|
|
84
104
|
raise ValueError('Unexpected interpreter environment')
|
|
@@ -103,6 +123,9 @@ print(json.dumps({'executable': sys.executable, 'python': sys.version, 'source_i
|
|
|
103
123
|
probe,
|
|
104
124
|
json.dumps(expected),
|
|
105
125
|
str(root / ".ci/connector-venv"),
|
|
126
|
+
json.dumps(
|
|
127
|
+
tomllib.loads((root / "pyproject.toml").read_text())["project"]
|
|
128
|
+
),
|
|
106
129
|
],
|
|
107
130
|
root=root,
|
|
108
131
|
env=env,
|
|
@@ -189,6 +212,7 @@ def prepare(root, *, uv="uv", github=False):
|
|
|
189
212
|
/ "connector-venv"
|
|
190
213
|
/ ("Scripts/python.exe" if os.name == "nt" else "bin/python")
|
|
191
214
|
)
|
|
215
|
+
commands.append(install_project(root, python, uv, env=env))
|
|
192
216
|
add_source_paths(root, python, sources, env=env)
|
|
193
217
|
environment = inspect_environment(
|
|
194
218
|
root, python, bindings=bindings, sources=sources, env=env
|
|
@@ -81,7 +81,7 @@ def artifacts():
|
|
|
81
81
|
f'<{source}> a prov:Entity ; rdfs:label "Immich 3.2.2 OpenAPI source bytes" .\n',
|
|
82
82
|
]
|
|
83
83
|
ontology.append(
|
|
84
|
-
f'<http://knuckles.team/kg/immich> a owl:Ontology ;
|
|
84
|
+
f'<http://knuckles.team/kg/immich> a owl:Ontology ; prov:wasDerivedFrom <{source}> ; rdfs:comment "Selected structural DTO model. No live ingestion or identity equivalence is asserted." .\n'
|
|
85
85
|
)
|
|
86
86
|
shapes = [PREFIXES]
|
|
87
87
|
resources, mappings, provenance = [], {}, []
|
|
@@ -180,58 +180,6 @@ def artifacts():
|
|
|
180
180
|
resources.append({"name": class_name, "relations": relations})
|
|
181
181
|
mappings[class_name] = {"ontology_class": class_name, "fields": fields}
|
|
182
182
|
ontology_text, shapes_text = "\n".join(ontology), "\n".join(shapes)
|
|
183
|
-
manifest = json.loads((PACKAGE / "connector_manifest.yml").read_text())
|
|
184
|
-
manifest.update(
|
|
185
|
-
{
|
|
186
|
-
"resources": resources,
|
|
187
|
-
"identity": {
|
|
188
|
-
"id_field": {
|
|
189
|
-
name: "immich" + name.removeprefix("Immich") + "Id"
|
|
190
|
-
for name in mappings
|
|
191
|
-
if name != "ImmichAlbumMembership"
|
|
192
|
-
},
|
|
193
|
-
"title_field": {
|
|
194
|
-
"ImmichAlbum": "immichAlbumAlbumName",
|
|
195
|
-
"ImmichPersonRecord": "immichPersonRecordName",
|
|
196
|
-
"ImmichUser": "immichUserName",
|
|
197
|
-
"ImmichLibrary": "immichLibraryName",
|
|
198
|
-
"ImmichTag": "immichTagName",
|
|
199
|
-
},
|
|
200
|
-
"updated_field": {
|
|
201
|
-
"ImmichAlbum": "immichAlbumUpdatedAt",
|
|
202
|
-
"ImmichAsset": "immichAssetUpdatedAt",
|
|
203
|
-
},
|
|
204
|
-
},
|
|
205
|
-
"schema_mappings": mappings,
|
|
206
|
-
"policy": {
|
|
207
|
-
"pii_fields": {
|
|
208
|
-
"ImmichAlbum": ["immichAlbumAlbumName"],
|
|
209
|
-
"ImmichPersonRecord": ["immichPersonRecordName"],
|
|
210
|
-
"ImmichUser": ["immichUserName"],
|
|
211
|
-
"ImmichTag": ["immichTagName"],
|
|
212
|
-
}
|
|
213
|
-
},
|
|
214
|
-
"provenance": {
|
|
215
|
-
"generated_by": "scripts/generate_immich_content.py",
|
|
216
|
-
"source_artifacts": [
|
|
217
|
-
"openapi_contract.json",
|
|
218
|
-
"ontology/schema-provenance.json",
|
|
219
|
-
"ontology/immich.ttl",
|
|
220
|
-
"ontology/shapes/immich.ttl",
|
|
221
|
-
],
|
|
222
|
-
"integrity": {
|
|
223
|
-
"algorithm": "sha256",
|
|
224
|
-
"hash": hashlib.sha256(ontology_text.encode()).hexdigest(),
|
|
225
|
-
},
|
|
226
|
-
},
|
|
227
|
-
"review_todos": [
|
|
228
|
-
"Structural schema declarations are not evidence of live EG capture or semantic identity alignment.",
|
|
229
|
-
"Only the bounded album metadata projection is implemented for ingestion; remaining DTO classes are structural declarations.",
|
|
230
|
-
"Require explicit source/account binding, existing scoped credentials and a verified EG receipt/readback before enabling ingestion.",
|
|
231
|
-
"Ontology integrity is a byte SHA256, not canonical RDF or release certification.",
|
|
232
|
-
],
|
|
233
|
-
}
|
|
234
|
-
)
|
|
235
183
|
evidence = {
|
|
236
184
|
"status": "schema-derived; live ingestion unverified",
|
|
237
185
|
"source_version": "3.2.2",
|
|
@@ -263,7 +211,6 @@ def artifacts():
|
|
|
263
211
|
evidence, indent=2, sort_keys=True
|
|
264
212
|
)
|
|
265
213
|
+ "\n",
|
|
266
|
-
PACKAGE / "connector_manifest.yml": json.dumps(manifest, indent=2) + "\n",
|
|
267
214
|
}
|
|
268
215
|
|
|
269
216
|
|
|
@@ -12,10 +12,12 @@
|
|
|
12
12
|
"title": "Default content",
|
|
13
13
|
"delivery_state": "VERIFIED",
|
|
14
14
|
"landed_in": [
|
|
15
|
+
"4ea81792f111",
|
|
16
|
+
"5f862f905963",
|
|
15
17
|
"9c7f32a3d826"
|
|
16
18
|
],
|
|
17
19
|
"verified_by": [
|
|
18
|
-
"tests/test_default_content_surfaces.py:
|
|
20
|
+
"tests/test_default_content_surfaces.py:17"
|
|
19
21
|
]
|
|
20
22
|
}
|
|
21
23
|
]
|
|
@@ -68,11 +68,11 @@
|
|
|
68
68
|
"47656ecb1833"
|
|
69
69
|
],
|
|
70
70
|
"verified_by": [
|
|
71
|
-
"tests/test_generated_schema_policy.py:18",
|
|
72
71
|
"tests/test_oauth_redirect_response.py:26",
|
|
73
|
-
"tests/test_operation_parity.py:
|
|
72
|
+
"tests/test_operation_parity.py:34",
|
|
74
73
|
"tests/test_reviewed_secret_history.py:13",
|
|
75
|
-
"tests/test_session_auth_isolation.py:17"
|
|
74
|
+
"tests/test_session_auth_isolation.py:17",
|
|
75
|
+
"tests/test_upstream_evidence.py:14"
|
|
76
76
|
]
|
|
77
77
|
},
|
|
78
78
|
{
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"f155d6a2ee97"
|
|
85
85
|
],
|
|
86
86
|
"verified_by": [
|
|
87
|
-
"tests/test_fleet_name.py:
|
|
87
|
+
"tests/test_fleet_name.py:34"
|
|
88
88
|
]
|
|
89
89
|
}
|
|
90
90
|
]
|
|
@@ -61,7 +61,6 @@ async def native_initial_discovery(client):
|
|
|
61
61
|
|
|
62
62
|
async def native_discovery(client, name):
|
|
63
63
|
"""Verify one complete tool so discovery has its own bounded test budget."""
|
|
64
|
-
await asyncio.sleep(0.12)
|
|
65
64
|
result = await client.call_tool(
|
|
66
65
|
"search_tools", {"pattern": "^" + re.escape(name) + r"(?:\s|$)"}
|
|
67
66
|
)
|
|
@@ -113,11 +112,12 @@ class DiscoveredClient:
|
|
|
113
112
|
|
|
114
113
|
|
|
115
114
|
@asynccontextmanager
|
|
116
|
-
async def isolated_native_client(server, elicitation_handler):
|
|
115
|
+
async def isolated_native_client(server, elicitation_handler, pace=0.22):
|
|
117
116
|
"""Drain outstanding calls and close the protocol before the next provider."""
|
|
118
117
|
# Each fresh client adds server/discover and result-validation tools/list.
|
|
119
118
|
# Reserve those two requests at the unchanged SDK limit of 10 requests/s.
|
|
120
|
-
|
|
119
|
+
if pace:
|
|
120
|
+
await asyncio.sleep(pace)
|
|
121
121
|
async with Client(
|
|
122
122
|
server, elicitation_handler=elicitation_handler, timeout=10
|
|
123
123
|
) as native:
|