immich-api 0.2.1__tar.gz → 0.2.2__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.1 → immich_api-0.2.2}/.bumpversion.cfg +1 -1
- immich_api-0.2.2/.github/workflows/connector-pr.yml +16 -0
- {immich_api-0.2.1/immich_api.egg-info → immich_api-0.2.2}/PKG-INFO +4 -4
- {immich_api-0.2.1 → immich_api-0.2.2}/docker/Dockerfile +1 -1
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/mcp_server.py +0 -9
- {immich_api-0.2.1 → immich_api-0.2.2/immich_api.egg-info}/PKG-INFO +4 -4
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api.egg-info/SOURCES.txt +8 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api.egg-info/requires.txt +3 -3
- {immich_api-0.2.1 → immich_api-0.2.2}/pyproject.toml +4 -4
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/generated_schema_clones.py +18 -3
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/verify_generated_schemas.py +1 -1
- {immich_api-0.2.1 → immich_api-0.2.2}/specs/README.md +1 -0
- immich_api-0.2.2/specs/connector-content/plan.md +7 -0
- immich_api-0.2.2/specs/connector-content/requirements.md +9 -0
- immich_api-0.2.2/specs/connector-content/spec.md +11 -0
- immich_api-0.2.2/specs/connector-content/status.json +22 -0
- immich_api-0.2.2/specs/connector-content/tasks.md +5 -0
- immich_api-0.2.2/specs/connector-content/test-spec.md +7 -0
- immich_api-0.2.2/tests/test_default_content_surfaces.py +43 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.config/spec-dashboard.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.github/workflows/pages.yml +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.github/workflows/pipeline.yml +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.github/workflows/scanners.yml +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.github/workflows/windows-ci.yml +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/provenance.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/scripts/sync_mkdocs_theme.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/README.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-connector-sdk-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-terminal-ui-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-utilities-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-webui-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/brands/epistemic-graph-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/brands/geniusbot-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/brands/graph-os-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/favicon.svg +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/graph-mark.svg +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/runtime-architecture.mmd +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/runtime-architecture.svg +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/base.mkdocs.yml +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/extra.css +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/glossary.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/overrides/main.html +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/.pre-commit-config.yaml +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/LICENSE +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/MANIFEST.in +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/README.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docker/debug.Dockerfile +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docker/mcp.compose.yml +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docker/starship.toml +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/agent-readiness.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/agent-readiness.schema.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/architecture.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/assets/brands/agent-connector-sdk-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/assets/brands/agent-terminal-ui-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/assets/brands/agent-utilities-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/assets/brands/agent-webui-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/assets/brands/epistemic-graph-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/assets/brands/geniusbot-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/assets/brands/graph-os-logo-v1.png +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/assets/favicon.svg +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/assets/graph-mark.svg +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/assets/runtime-architecture.mmd +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/assets/runtime-architecture.svg +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/capabilities/api.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/capabilities/mcp.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/concepts.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/deployment.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/glossary.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/immich-capabilities.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/index.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/installation.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/openapi-parity.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/overview.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/platform.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/spec-delivery.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/stylesheets/extra.css +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/docs/usage.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/__init__.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/__main__.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/album_metadata.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/api/__init__.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/api/api_client_system.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/auth.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/connector_manifest.yml +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/connectors/__init__.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/connectors/mcp_source_presets.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/connectors/tool_schema_fingerprints.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/error_authority.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/error_rendering.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/immich_input_models.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/immich_response_models.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/kg_ingest.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/mcp/__init__.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/mcp/album_sample.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/mcp_config.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/ontology/__init__.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/ontology/immich.ttl +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/ontology/schema-provenance.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/ontology/shapes/immich.ttl +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/openapi_auth_scheme.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/openapi_contract.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/openapi_execution.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/openapi_inventory.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/openapi_request.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/openapi_response.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/openapi_runtime.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/__init__.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/check_openapi_parity.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/openapi_discovery.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/openapi_parity.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/openapi_provider_evidence.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/openapi_provider_overlay.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/openapi_provider_responses.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/openapi_schema.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/openapi_schema_budget.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/openapi_schema_inputs.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/openapi_schema_types.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/openapi_security.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/openapi_source_parity.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/openapi_transport_parity.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/unicode_patterns.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/parity/unicode_properties.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/prompts/__init__.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/prompts/immich_album_review.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/prompts/immich_asset_metadata.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/prompts/immich_person_record.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/prompts/immich_specialist.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/prompts/main_agent.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/skills/__init__.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/skills/immich-album-review/SKILL.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/skills/immich-asset-metadata/SKILL.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/skills/immich-health/SKILL.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api/skills/immich-person-record/SKILL.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api.egg-info/dependency_links.txt +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api.egg-info/entry_points.txt +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/immich_api.egg-info/top_level.txt +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/mkdocs.yml +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/pytest.ini +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/requirements.txt +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/agent_readiness_tck.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/bootstrap.sh +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/bootstrap_environment.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/bootstrap_sources.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/check_connector_contract.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/check_import_safety.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/check_workspace_source_drift.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/generate_agent_readiness.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/generate_immich_content.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/generate_tool_schemas.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/measure_operation_parity.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/reviewed_secret_history.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/security_sanitizer.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/select_python.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/upstream_evidence.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/verify_api_integration.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/scripts/workspace_sources.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/setup.cfg +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/specs/immich-api/plan.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/specs/immich-api/requirements.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/specs/immich-api/spec.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/specs/immich-api/status.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/specs/immich-api/tasks.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/specs/immich-api/test-spec.md +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/__init__.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/conftest.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/fixtures/native-client-budget.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/fixtures/operation-cases.json +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/operation_fixtures.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/parity_support.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_album_metadata.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_api_wrapper.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_auth.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_concept_parity.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_error_authority.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_fleet_name.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_generated_schema_policy.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_immich_content.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_immich_mcp_validation.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_init_dynamics.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_kg_ingest.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_oauth_redirect_response.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_openapi_auth_provider.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_operation_parity.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_reviewed_secret_history.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_session_auth_isolation.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_source_image.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_startup.py +0 -0
- {immich_api-0.2.1 → immich_api-0.2.2}/tests/test_upstream_evidence.py +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
name: Connector PR
|
|
2
|
+
|
|
3
|
+
on: pull_request
|
|
4
|
+
|
|
5
|
+
concurrency:
|
|
6
|
+
group: pr-${{ github.workflow }}-${{ github.event.pull_request.number }}
|
|
7
|
+
cancel-in-progress: true
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
gates:
|
|
14
|
+
uses: Knuckles-Team/pipelines/.github/workflows/connector_pr_pipeline.yml@main
|
|
15
|
+
with:
|
|
16
|
+
runner: '"self-hosted"'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: immich-api
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
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.3.
|
|
19
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18
|
|
20
20
|
Provides-Extra: mcp
|
|
21
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
21
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "mcp"
|
|
22
22
|
Provides-Extra: all
|
|
23
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
23
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; 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.2 \
|
|
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
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import sys
|
|
2
|
-
from pathlib import Path
|
|
3
2
|
|
|
4
3
|
from agent_connector_sdk.config import load_config
|
|
5
|
-
from agent_connector_sdk.mcp.content import ConnectorContent
|
|
6
4
|
from agent_connector_sdk.mcp.server import create_mcp_server
|
|
7
5
|
from agent_connector_sdk.mcp.tool_surface import register_tool_surface
|
|
8
6
|
|
|
@@ -14,18 +12,11 @@ __version__ = "0.1.0"
|
|
|
14
12
|
def get_mcp_instance(*, command_args=None):
|
|
15
13
|
"""Construct one SDK-governed server and its native package content."""
|
|
16
14
|
load_config()
|
|
17
|
-
package_root = Path(__file__).resolve().parent
|
|
18
15
|
args, mcp, middlewares = create_mcp_server(
|
|
19
16
|
name="Immich Api",
|
|
20
17
|
version=__version__,
|
|
21
18
|
instructions="Immich Api API + MCP Server",
|
|
22
19
|
command_args=command_args,
|
|
23
|
-
content=ConnectorContent(
|
|
24
|
-
connector="immich",
|
|
25
|
-
package_root=package_root,
|
|
26
|
-
package_version=__version__,
|
|
27
|
-
manifest_path=package_root / "connector_manifest.yml",
|
|
28
|
-
),
|
|
29
20
|
)
|
|
30
21
|
register_tool_surface(mcp, service="immich-api", tools_module=tool_modules)
|
|
31
22
|
for middleware in middlewares:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: immich-api
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
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.3.
|
|
19
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18
|
|
20
20
|
Provides-Extra: mcp
|
|
21
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
21
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "mcp"
|
|
22
22
|
Provides-Extra: all
|
|
23
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
23
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; 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"
|
|
@@ -8,6 +8,7 @@ pyproject.toml
|
|
|
8
8
|
pytest.ini
|
|
9
9
|
requirements.txt
|
|
10
10
|
.config/spec-dashboard.json
|
|
11
|
+
.github/workflows/connector-pr.yml
|
|
11
12
|
.github/workflows/pages.yml
|
|
12
13
|
.github/workflows/pipeline.yml
|
|
13
14
|
.github/workflows/scanners.yml
|
|
@@ -145,6 +146,12 @@ scripts/verify_api_integration.py
|
|
|
145
146
|
scripts/verify_generated_schemas.py
|
|
146
147
|
scripts/workspace_sources.py
|
|
147
148
|
specs/README.md
|
|
149
|
+
specs/connector-content/plan.md
|
|
150
|
+
specs/connector-content/requirements.md
|
|
151
|
+
specs/connector-content/spec.md
|
|
152
|
+
specs/connector-content/status.json
|
|
153
|
+
specs/connector-content/tasks.md
|
|
154
|
+
specs/connector-content/test-spec.md
|
|
148
155
|
specs/immich-api/plan.md
|
|
149
156
|
specs/immich-api/requirements.md
|
|
150
157
|
specs/immich-api/spec.md
|
|
@@ -159,6 +166,7 @@ tests/test_album_metadata.py
|
|
|
159
166
|
tests/test_api_wrapper.py
|
|
160
167
|
tests/test_auth.py
|
|
161
168
|
tests/test_concept_parity.py
|
|
169
|
+
tests/test_default_content_surfaces.py
|
|
162
170
|
tests/test_error_authority.py
|
|
163
171
|
tests/test_fleet_name.py
|
|
164
172
|
tests/test_generated_schema_policy.py
|
|
@@ -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.3.
|
|
5
|
+
agent-connector-sdk[mcp]<1.0.0,>=0.3.18
|
|
6
6
|
|
|
7
7
|
[all]
|
|
8
|
-
agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
8
|
+
agent-connector-sdk[mcp]<1.0.0,>=0.3.18
|
|
9
9
|
|
|
10
10
|
[mcp]
|
|
11
|
-
agent-connector-sdk[mcp]<1.0.0,>=0.3.
|
|
11
|
+
agent-connector-sdk[mcp]<1.0.0,>=0.3.18
|
|
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.2"
|
|
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.3.
|
|
17
|
+
"agent-connector-sdk[mcp]>=0.3.18,<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.3.
|
|
26
|
+
mcp = [ "agent-connector-sdk[mcp]>=0.3.18,<1.0.0",]
|
|
27
27
|
all = [
|
|
28
|
-
"agent-connector-sdk[mcp]>=0.3.
|
|
28
|
+
"agent-connector-sdk[mcp]>=0.3.18,<1.0.0",
|
|
29
29
|
]
|
|
30
30
|
test = [
|
|
31
31
|
"pytest-xdist>=3.6.0", "pytest", "pytest-asyncio", "pytest-cov",]
|
|
@@ -86,13 +86,28 @@ def retain_pairs(pairs: dict, verified: dict) -> dict:
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
|
|
89
|
-
def scan(
|
|
89
|
+
def scan(
|
|
90
|
+
root: Path,
|
|
91
|
+
ref: str | None,
|
|
92
|
+
scratch: Path,
|
|
93
|
+
executable: str,
|
|
94
|
+
*,
|
|
95
|
+
baseline: bool = False,
|
|
96
|
+
) -> dict:
|
|
90
97
|
from pipelines_hooks.clones import jscpd_keys, jscpd_run, jscpd_snapshot
|
|
91
98
|
|
|
92
99
|
if ref is None:
|
|
93
100
|
return {}
|
|
94
101
|
snapshot = jscpd_snapshot.materialize(root, ref, scratch)
|
|
95
|
-
|
|
102
|
+
try:
|
|
103
|
+
verified = verified_artifacts(snapshot, root)
|
|
104
|
+
except ValueError as exc:
|
|
105
|
+
if not baseline:
|
|
106
|
+
raise
|
|
107
|
+
# A baseline whose receipts were already stale cannot prove any artifact
|
|
108
|
+
# generated, so it admits no exclusions: every pair stays in the baseline.
|
|
109
|
+
print(f"Baseline {ref[:12]} unverified, admitting no exclusions: {exc}")
|
|
110
|
+
verified = {}
|
|
96
111
|
document = jscpd_run.run(executable, snapshot)
|
|
97
112
|
pairs = jscpd_keys.keys(document, snapshot)
|
|
98
113
|
retained = retain_pairs(pairs, verified)
|
|
@@ -126,7 +141,7 @@ def main() -> int:
|
|
|
126
141
|
print(jscpd_keys.render_pair(key, current[key]))
|
|
127
142
|
return 0
|
|
128
143
|
base = change_base(root, args.base_ref)
|
|
129
|
-
before = scan(root, base, scratch / "before", executable)
|
|
144
|
+
before = scan(root, base, scratch / "before", executable, baseline=True)
|
|
130
145
|
after = scan(
|
|
131
146
|
root, jscpd_gate._after_tree(root, base), scratch / "after", executable
|
|
132
147
|
)
|
|
@@ -8,7 +8,7 @@ import sys
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
|
|
10
10
|
MANIFEST = ".config/generated-schema-policy.json"
|
|
11
|
-
MANIFEST_SHA256 = "
|
|
11
|
+
MANIFEST_SHA256 = "dd1149e1c804a7684863c8e1ccd095ad19a3666d96199ac5b55007ce20487e96"
|
|
12
12
|
INVENTORY = "immich_api/openapi_inventory.json"
|
|
13
13
|
|
|
14
14
|
|
|
@@ -10,6 +10,7 @@ Follow the [shared spec standard](https://github.com/Knuckles-Team/pipelines/blo
|
|
|
10
10
|
| `IMMICH` | This repository's concept registry |
|
|
11
11
|
|
|
12
12
|
- [`CONN-IMMICH-API`](immich-api/spec.md) — Integrate Immich Api through the shared connector contracts.
|
|
13
|
+
- [`CONN-IMMICH-API-CONNECTOR-CONTENT`](connector-content/spec.md) — The connector serves its packaged content.
|
|
13
14
|
|
|
14
15
|
The lifecycle generator owns delivery receipts in `status.json`.
|
|
15
16
|
Run `pipelines-hook spec-status --write` after reviewed source changes enter Git history.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# CONN-IMMICH-API-CONNECTOR-CONTENT — Design and implementation plan
|
|
2
|
+
|
|
3
|
+
Governing spec: [spec.md](spec.md).
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
`pyproject.toml` declares `immich` as the connector identity. `create_mcp_server` resolves the packaged content of `immich_api` from it.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# CONN-IMMICH-API-CONNECTOR-CONTENT — Requirements
|
|
2
|
+
|
|
3
|
+
Governing spec: [spec.md](spec.md).
|
|
4
|
+
|
|
5
|
+
Each row is one requirement. A row names the file it touches and the test that proves it. The generator sets each row's state in `status.json`.
|
|
6
|
+
|
|
7
|
+
| ID | Requirement | Acceptance |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| `CONN-IMMICH-API-CONNECTOR-CONTENT-R001` | **Default content.** `pyproject.toml` declares `immich` as the single `agent_connector_sdk.connector` entry point. The server lists the packaged `skill://` and `ontology://` resources and the packaged prompts with no `content=` argument. Proving test: `tests/test_default_content_surfaces.py`. | `resources/list` includes `skill://` and `ontology://`; `prompts/list` includes each packaged prompt. |
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# CONN-IMMICH-API-CONNECTOR-CONTENT — The connector serves its packaged content
|
|
2
|
+
|
|
3
|
+
Owner: immich-api. Cross-repo IDs: `SDK-CONNECTOR-CONTROL-R071`, `SDK-CONNECTOR-CONTROL-R073`.
|
|
4
|
+
|
|
5
|
+
## Purpose and user stories
|
|
6
|
+
|
|
7
|
+
The `immich` server serves its packaged skills, prompts and ontology to any client, with no wiring of its own.
|
|
8
|
+
|
|
9
|
+
## Requirements and acceptance
|
|
10
|
+
|
|
11
|
+
See [requirements.md](requirements.md).
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 2,
|
|
3
|
+
"spec_id": "CONN-IMMICH-API-CONNECTOR-CONTENT",
|
|
4
|
+
"owner_repo": "immich-api",
|
|
5
|
+
"delivery_state": "VERIFIED",
|
|
6
|
+
"requirement_ids": [
|
|
7
|
+
"CONN-IMMICH-API-CONNECTOR-CONTENT-R001"
|
|
8
|
+
],
|
|
9
|
+
"requirements": [
|
|
10
|
+
{
|
|
11
|
+
"id": "CONN-IMMICH-API-CONNECTOR-CONTENT-R001",
|
|
12
|
+
"title": "Default content",
|
|
13
|
+
"delivery_state": "VERIFIED",
|
|
14
|
+
"landed_in": [
|
|
15
|
+
"9c7f32a3d826"
|
|
16
|
+
],
|
|
17
|
+
"verified_by": [
|
|
18
|
+
"tests/test_default_content_surfaces.py:15"
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# CONN-IMMICH-API-CONNECTOR-CONTENT — Implementation tasks
|
|
2
|
+
|
|
3
|
+
Governing spec: [spec.md](spec.md). Design: [plan.md](plan.md). Rows: [requirements.md](requirements.md).
|
|
4
|
+
|
|
5
|
+
- [x] **CONN-IMMICH-API-CONNECTOR-CONTENT-R001:** Declare the fleet identity and serve the packaged content by default.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# CONN-IMMICH-API-CONNECTOR-CONTENT — Test specification
|
|
2
|
+
|
|
3
|
+
Governing spec: [spec.md](spec.md).
|
|
4
|
+
|
|
5
|
+
| Test ID | Requirement | Proving test | Expected observation |
|
|
6
|
+
|---|---|---|---|
|
|
7
|
+
| T-001 | `CONN-IMMICH-API-CONNECTOR-CONTENT-R001` | `tests/test_default_content_surfaces.py` | The listings include the packaged skills, ontology and prompts. |
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""CONN-IMMICH-API-CONNECTOR-CONTENT-R001: the server lists its packaged skills, ontology and prompts by default."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import importlib
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
from fastmcp import Client
|
|
11
|
+
|
|
12
|
+
PACKAGE = "immich_api"
|
|
13
|
+
ROOT = Path(list(importlib.import_module(PACKAGE).__path__)[0])
|
|
14
|
+
|
|
15
|
+
pytestmark = pytest.mark.spec("CONN-IMMICH-API-CONNECTOR-CONTENT-R001")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _server():
|
|
19
|
+
namespace = {"__name__": PACKAGE + ".mcp_server"}
|
|
20
|
+
exec(
|
|
21
|
+
"from agent_connector_sdk.mcp.server import create_mcp_server\n"
|
|
22
|
+
"result = create_mcp_server('immich', version='0', command_args=[])",
|
|
23
|
+
namespace,
|
|
24
|
+
)
|
|
25
|
+
return namespace["result"][1]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
async def _listings():
|
|
29
|
+
async with Client(_server()) as client:
|
|
30
|
+
resources = {str(r.uri) for r in await client.list_resources()}
|
|
31
|
+
prompts = {p.name for p in await client.list_prompts()}
|
|
32
|
+
return resources, prompts
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_default_content_surfaces() -> None:
|
|
36
|
+
resources, prompts = asyncio.run(_listings())
|
|
37
|
+
if list(ROOT.glob("skills/*/SKILL.md")):
|
|
38
|
+
assert any(u.startswith("skill://") for u in resources)
|
|
39
|
+
if list(ROOT.glob("ontology/*.ttl")):
|
|
40
|
+
assert any(u.startswith("ontology://immich/") for u in resources)
|
|
41
|
+
for path in ROOT.glob("prompts/*.json"):
|
|
42
|
+
if not path.name.startswith("_"):
|
|
43
|
+
assert path.stem in prompts
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/favicon.svg
RENAMED
|
File without changes
|
{immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/assets/graph-mark.svg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/base.mkdocs.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{immich_api-0.2.1 → immich_api-0.2.2}/.pipeline-theme/templates/mkdocs-theme/overrides/main.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|