immich-api 0.2.1__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.
Files changed (180) hide show
  1. immich_api-0.2.1/.bumpversion.cfg +12 -0
  2. immich_api-0.2.1/.config/spec-dashboard.json +4 -0
  3. immich_api-0.2.1/.github/workflows/pages.yml +25 -0
  4. immich_api-0.2.1/.github/workflows/pipeline.yml +27 -0
  5. immich_api-0.2.1/.github/workflows/scanners.yml +42 -0
  6. immich_api-0.2.1/.github/workflows/windows-ci.yml +78 -0
  7. immich_api-0.2.1/.pipeline-theme/provenance.json +32 -0
  8. immich_api-0.2.1/.pipeline-theme/scripts/sync_mkdocs_theme.py +207 -0
  9. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/README.md +23 -0
  10. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-connector-sdk-logo-v1.png +0 -0
  11. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-terminal-ui-logo-v1.png +0 -0
  12. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-utilities-logo-v1.png +0 -0
  13. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-webui-logo-v1.png +0 -0
  14. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/epistemic-graph-logo-v1.png +0 -0
  15. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/geniusbot-logo-v1.png +0 -0
  16. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/graph-os-logo-v1.png +0 -0
  17. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/favicon.svg +13 -0
  18. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/graph-mark.svg +13 -0
  19. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/runtime-architecture.mmd +26 -0
  20. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/runtime-architecture.svg +37 -0
  21. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/base.mkdocs.yml +105 -0
  22. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/extra.css +249 -0
  23. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/glossary.md +57 -0
  24. immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/overrides/main.html +57 -0
  25. immich_api-0.2.1/.pre-commit-config.yaml +87 -0
  26. immich_api-0.2.1/LICENSE +21 -0
  27. immich_api-0.2.1/MANIFEST.in +19 -0
  28. immich_api-0.2.1/PKG-INFO +242 -0
  29. immich_api-0.2.1/README.md +212 -0
  30. immich_api-0.2.1/docker/Dockerfile +30 -0
  31. immich_api-0.2.1/docker/debug.Dockerfile +31 -0
  32. immich_api-0.2.1/docker/mcp.compose.yml +35 -0
  33. immich_api-0.2.1/docker/starship.toml +70 -0
  34. immich_api-0.2.1/docs/agent-readiness.json +31 -0
  35. immich_api-0.2.1/docs/agent-readiness.schema.json +331 -0
  36. immich_api-0.2.1/docs/architecture.md +40 -0
  37. immich_api-0.2.1/docs/assets/brands/agent-connector-sdk-logo-v1.png +0 -0
  38. immich_api-0.2.1/docs/assets/brands/agent-terminal-ui-logo-v1.png +0 -0
  39. immich_api-0.2.1/docs/assets/brands/agent-utilities-logo-v1.png +0 -0
  40. immich_api-0.2.1/docs/assets/brands/agent-webui-logo-v1.png +0 -0
  41. immich_api-0.2.1/docs/assets/brands/epistemic-graph-logo-v1.png +0 -0
  42. immich_api-0.2.1/docs/assets/brands/geniusbot-logo-v1.png +0 -0
  43. immich_api-0.2.1/docs/assets/brands/graph-os-logo-v1.png +0 -0
  44. immich_api-0.2.1/docs/assets/favicon.svg +13 -0
  45. immich_api-0.2.1/docs/assets/graph-mark.svg +13 -0
  46. immich_api-0.2.1/docs/assets/runtime-architecture.mmd +26 -0
  47. immich_api-0.2.1/docs/assets/runtime-architecture.svg +37 -0
  48. immich_api-0.2.1/docs/capabilities/api.json +1 -0
  49. immich_api-0.2.1/docs/capabilities/mcp.json +1 -0
  50. immich_api-0.2.1/docs/concepts.md +21 -0
  51. immich_api-0.2.1/docs/deployment.md +130 -0
  52. immich_api-0.2.1/docs/glossary.md +57 -0
  53. immich_api-0.2.1/docs/immich-capabilities.md +110 -0
  54. immich_api-0.2.1/docs/index.md +33 -0
  55. immich_api-0.2.1/docs/installation.md +56 -0
  56. immich_api-0.2.1/docs/openapi-parity.md +200 -0
  57. immich_api-0.2.1/docs/overview.md +27 -0
  58. immich_api-0.2.1/docs/platform.md +22 -0
  59. immich_api-0.2.1/docs/spec-delivery.md +18 -0
  60. immich_api-0.2.1/docs/stylesheets/extra.css +249 -0
  61. immich_api-0.2.1/docs/usage.md +47 -0
  62. immich_api-0.2.1/immich_api/__init__.py +54 -0
  63. immich_api-0.2.1/immich_api/__main__.py +4 -0
  64. immich_api-0.2.1/immich_api/album_metadata.py +119 -0
  65. immich_api-0.2.1/immich_api/api/__init__.py +3 -0
  66. immich_api-0.2.1/immich_api/api/api_client_system.py +7 -0
  67. immich_api-0.2.1/immich_api/auth.py +94 -0
  68. immich_api-0.2.1/immich_api/connector_manifest.yml +212 -0
  69. immich_api-0.2.1/immich_api/connectors/__init__.py +0 -0
  70. immich_api-0.2.1/immich_api/connectors/mcp_source_presets.json +3 -0
  71. immich_api-0.2.1/immich_api/connectors/tool_schema_fingerprints.json +1 -0
  72. immich_api-0.2.1/immich_api/error_authority.py +248 -0
  73. immich_api-0.2.1/immich_api/error_rendering.py +105 -0
  74. immich_api-0.2.1/immich_api/immich_input_models.py +12 -0
  75. immich_api-0.2.1/immich_api/immich_response_models.py +15 -0
  76. immich_api-0.2.1/immich_api/kg_ingest.py +75 -0
  77. immich_api-0.2.1/immich_api/mcp/__init__.py +21 -0
  78. immich_api-0.2.1/immich_api/mcp/album_sample.py +38 -0
  79. immich_api-0.2.1/immich_api/mcp_config.json +3 -0
  80. immich_api-0.2.1/immich_api/mcp_server.py +50 -0
  81. immich_api-0.2.1/immich_api/ontology/__init__.py +6 -0
  82. immich_api-0.2.1/immich_api/ontology/immich.ttl +119 -0
  83. immich_api-0.2.1/immich_api/ontology/schema-provenance.json +483 -0
  84. immich_api-0.2.1/immich_api/ontology/shapes/immich.ttl +69 -0
  85. immich_api-0.2.1/immich_api/openapi_auth_scheme.py +77 -0
  86. immich_api-0.2.1/immich_api/openapi_contract.json +80122 -0
  87. immich_api-0.2.1/immich_api/openapi_execution.py +30 -0
  88. immich_api-0.2.1/immich_api/openapi_inventory.json +16154 -0
  89. immich_api-0.2.1/immich_api/openapi_request.py +119 -0
  90. immich_api-0.2.1/immich_api/openapi_response.py +76 -0
  91. immich_api-0.2.1/immich_api/openapi_runtime.py +203 -0
  92. immich_api-0.2.1/immich_api/parity/__init__.py +17 -0
  93. immich_api-0.2.1/immich_api/parity/check_openapi_parity.py +173 -0
  94. immich_api-0.2.1/immich_api/parity/openapi_discovery.py +95 -0
  95. immich_api-0.2.1/immich_api/parity/openapi_parity.py +239 -0
  96. immich_api-0.2.1/immich_api/parity/openapi_provider_evidence.py +143 -0
  97. immich_api-0.2.1/immich_api/parity/openapi_provider_overlay.py +239 -0
  98. immich_api-0.2.1/immich_api/parity/openapi_provider_responses.py +132 -0
  99. immich_api-0.2.1/immich_api/parity/openapi_schema.py +206 -0
  100. immich_api-0.2.1/immich_api/parity/openapi_schema_budget.py +104 -0
  101. immich_api-0.2.1/immich_api/parity/openapi_schema_inputs.py +89 -0
  102. immich_api-0.2.1/immich_api/parity/openapi_schema_types.py +163 -0
  103. immich_api-0.2.1/immich_api/parity/openapi_security.py +157 -0
  104. immich_api-0.2.1/immich_api/parity/openapi_source_parity.py +98 -0
  105. immich_api-0.2.1/immich_api/parity/openapi_transport_parity.py +169 -0
  106. immich_api-0.2.1/immich_api/parity/unicode_patterns.py +105 -0
  107. immich_api-0.2.1/immich_api/parity/unicode_properties.json +4719 -0
  108. immich_api-0.2.1/immich_api/prompts/__init__.py +0 -0
  109. immich_api-0.2.1/immich_api/prompts/immich_album_review.json +18 -0
  110. immich_api-0.2.1/immich_api/prompts/immich_asset_metadata.json +18 -0
  111. immich_api-0.2.1/immich_api/prompts/immich_person_record.json +18 -0
  112. immich_api-0.2.1/immich_api/prompts/immich_specialist.json +17 -0
  113. immich_api-0.2.1/immich_api/prompts/main_agent.json +24 -0
  114. immich_api-0.2.1/immich_api/skills/__init__.py +0 -0
  115. immich_api-0.2.1/immich_api/skills/immich-album-review/SKILL.md +17 -0
  116. immich_api-0.2.1/immich_api/skills/immich-asset-metadata/SKILL.md +17 -0
  117. immich_api-0.2.1/immich_api/skills/immich-health/SKILL.md +17 -0
  118. immich_api-0.2.1/immich_api/skills/immich-person-record/SKILL.md +17 -0
  119. immich_api-0.2.1/immich_api.egg-info/PKG-INFO +242 -0
  120. immich_api-0.2.1/immich_api.egg-info/SOURCES.txt +178 -0
  121. immich_api-0.2.1/immich_api.egg-info/dependency_links.txt +1 -0
  122. immich_api-0.2.1/immich_api.egg-info/entry_points.txt +17 -0
  123. immich_api-0.2.1/immich_api.egg-info/requires.txt +17 -0
  124. immich_api-0.2.1/immich_api.egg-info/top_level.txt +1 -0
  125. immich_api-0.2.1/mkdocs.yml +29 -0
  126. immich_api-0.2.1/pyproject.toml +104 -0
  127. immich_api-0.2.1/pytest.ini +11 -0
  128. immich_api-0.2.1/requirements.txt +3 -0
  129. immich_api-0.2.1/scripts/agent_readiness_tck.py +1138 -0
  130. immich_api-0.2.1/scripts/bootstrap.sh +61 -0
  131. immich_api-0.2.1/scripts/bootstrap_environment.py +235 -0
  132. immich_api-0.2.1/scripts/bootstrap_sources.py +129 -0
  133. immich_api-0.2.1/scripts/check_connector_contract.py +108 -0
  134. immich_api-0.2.1/scripts/check_import_safety.py +309 -0
  135. immich_api-0.2.1/scripts/check_workspace_source_drift.py +98 -0
  136. immich_api-0.2.1/scripts/generate_agent_readiness.py +1531 -0
  137. immich_api-0.2.1/scripts/generate_immich_content.py +284 -0
  138. immich_api-0.2.1/scripts/generate_tool_schemas.py +100 -0
  139. immich_api-0.2.1/scripts/generated_schema_clones.py +148 -0
  140. immich_api-0.2.1/scripts/measure_operation_parity.py +239 -0
  141. immich_api-0.2.1/scripts/reviewed_secret_history.py +121 -0
  142. immich_api-0.2.1/scripts/security_sanitizer.py +279 -0
  143. immich_api-0.2.1/scripts/select_python.py +85 -0
  144. immich_api-0.2.1/scripts/upstream_evidence.py +83 -0
  145. immich_api-0.2.1/scripts/verify_api_integration.py +78 -0
  146. immich_api-0.2.1/scripts/verify_generated_schemas.py +111 -0
  147. immich_api-0.2.1/scripts/workspace_sources.py +250 -0
  148. immich_api-0.2.1/setup.cfg +4 -0
  149. immich_api-0.2.1/specs/README.md +17 -0
  150. immich_api-0.2.1/specs/immich-api/plan.md +88 -0
  151. immich_api-0.2.1/specs/immich-api/requirements.md +15 -0
  152. immich_api-0.2.1/specs/immich-api/spec.md +32 -0
  153. immich_api-0.2.1/specs/immich-api/status.json +91 -0
  154. immich_api-0.2.1/specs/immich-api/tasks.md +13 -0
  155. immich_api-0.2.1/specs/immich-api/test-spec.md +32 -0
  156. immich_api-0.2.1/tests/__init__.py +0 -0
  157. immich_api-0.2.1/tests/conftest.py +7 -0
  158. immich_api-0.2.1/tests/fixtures/native-client-budget.json +10 -0
  159. immich_api-0.2.1/tests/fixtures/operation-cases.json +9742 -0
  160. immich_api-0.2.1/tests/operation_fixtures.py +157 -0
  161. immich_api-0.2.1/tests/parity_support.py +129 -0
  162. immich_api-0.2.1/tests/test_album_metadata.py +75 -0
  163. immich_api-0.2.1/tests/test_api_wrapper.py +204 -0
  164. immich_api-0.2.1/tests/test_auth.py +97 -0
  165. immich_api-0.2.1/tests/test_concept_parity.py +23 -0
  166. immich_api-0.2.1/tests/test_error_authority.py +68 -0
  167. immich_api-0.2.1/tests/test_fleet_name.py +50 -0
  168. immich_api-0.2.1/tests/test_generated_schema_policy.py +159 -0
  169. immich_api-0.2.1/tests/test_immich_content.py +149 -0
  170. immich_api-0.2.1/tests/test_immich_mcp_validation.py +14 -0
  171. immich_api-0.2.1/tests/test_init_dynamics.py +10 -0
  172. immich_api-0.2.1/tests/test_kg_ingest.py +134 -0
  173. immich_api-0.2.1/tests/test_oauth_redirect_response.py +138 -0
  174. immich_api-0.2.1/tests/test_openapi_auth_provider.py +149 -0
  175. immich_api-0.2.1/tests/test_operation_parity.py +399 -0
  176. immich_api-0.2.1/tests/test_reviewed_secret_history.py +91 -0
  177. immich_api-0.2.1/tests/test_session_auth_isolation.py +123 -0
  178. immich_api-0.2.1/tests/test_source_image.py +24 -0
  179. immich_api-0.2.1/tests/test_startup.py +9 -0
  180. immich_api-0.2.1/tests/test_upstream_evidence.py +118 -0
@@ -0,0 +1,12 @@
1
+ [bumpversion]
2
+ current_version = 0.2.1
3
+ commit = True
4
+ tag = True
5
+
6
+ [bumpversion:file:pyproject.toml]
7
+ search = version = "{current_version}"
8
+ replace = version = "{new_version}"
9
+
10
+ [bumpversion:file(dockerpin0):docker/Dockerfile]
11
+ search = immich-api[mcp]=={current_version}
12
+ replace = immich-api[mcp]=={new_version}
@@ -0,0 +1,4 @@
1
+ {
2
+ "version": 1,
3
+ "sources": [{"glob": "specs/*/status.json", "kind": "spec"}]
4
+ }
@@ -0,0 +1,25 @@
1
+ name: Deploy GitHub Pages
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ publish-pages:
13
+ uses: Knuckles-Team/pipelines/.github/workflows/pages_pipeline.yml@main
14
+ with:
15
+ content_source: docs
16
+ shared_theme_enabled: true
17
+ agent_readiness_enabled: true
18
+ readiness_input: docs/agent-readiness.json
19
+ readiness_schema: docs/agent-readiness.schema.json
20
+ spec_dashboard_enabled: true
21
+ spec_dashboard_config: .config/spec-dashboard.json
22
+ permissions:
23
+ contents: read
24
+ pages: write
25
+ id-token: write
@@ -0,0 +1,27 @@
1
+ name: Build|Upload|Release Python Package
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - 'main'
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ publish-pypi:
13
+ uses: Knuckles-Team/pipelines/.github/workflows/python_pipeline.yml@main
14
+ permissions:
15
+ contents: write
16
+ secrets:
17
+ PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
18
+ publish-docker:
19
+ needs: publish-pypi
20
+ uses: Knuckles-Team/pipelines/.github/workflows/container_pipeline.yml@main
21
+ permissions:
22
+ contents: read
23
+ secrets:
24
+ DOCKER_REGISTRY: ${{ secrets.DOCKER_REGISTRY }}
25
+ DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
26
+ DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
27
+ DOCKER_REPOSITORY: ${{ secrets.DOCKER_REPOSITORY }}
@@ -0,0 +1,42 @@
1
+ name: Connector quality
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ checks:
14
+ # The runner supplies bootstrap Python, uv, pre-commit and approved scanners.
15
+ # Prepare project dependencies separately; never build scanners here.
16
+ runs-on: self-hosted
17
+ env:
18
+ MCP_FLEET_REGISTRATION: 'false'
19
+ steps:
20
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
21
+ with:
22
+ fetch-depth: 0
23
+ persist-credentials: false
24
+ - name: Capture provisioned hook runner
25
+ shell: bash
26
+ run: |
27
+ hook_runner="$(realpath "$(command -v pre-commit)")"
28
+ test -x "$hook_runner"
29
+ echo "CONNECTOR_PRE_COMMIT=$hook_runner" >> "$GITHUB_ENV"
30
+ - name: Select provisioned Python baseline
31
+ run: python scripts/select_python.py
32
+ - name: Prepare frozen project test environment
33
+ run: '"$CONNECTOR_BOOTSTRAP_PYTHON" scripts/bootstrap_environment.py --github'
34
+ - name: Validate hooks
35
+ run: '"$CONNECTOR_PRE_COMMIT" validate-config'
36
+ - name: Commit checks
37
+ run: '"$CONNECTOR_PRE_COMMIT" run --all-files --show-diff-on-failure'
38
+ - name: Push checks and generated connector tests
39
+ env:
40
+ PRE_COMMIT_FROM_REF: ${{ github.event.pull_request.base.sha || github.event.before }}
41
+ PRE_COMMIT_TO_REF: ${{ github.event.pull_request.head.sha || github.sha }}
42
+ run: '"$CONNECTOR_PRE_COMMIT" run --all-files --hook-stage pre-push --show-diff-on-failure'
@@ -0,0 +1,78 @@
1
+ name: Cross-platform coverage
2
+
3
+ # Report-only (continue-on-error on every step) -- does not touch
4
+ # pipeline.yml/pages.yml. scripts/check_import_safety.py auto-detects this
5
+ # package's import name from pyproject.toml's [project].name, so this file
6
+ # needs no per-package templating. See that script's own docstring for
7
+ # exactly what --simulate-windows does and does not model, and its
8
+ # sys.platform-guard false-positive limitation -- if this package
9
+ # legitimately guards a POSIX-only import behind
10
+ # `sys.platform == "win32"`, add `--exclude <dotted.module.name>` to BOTH
11
+ # this file's windows job below and .pre-commit-config.yaml's
12
+ # check-import-safety hook.
13
+
14
+ on:
15
+ pull_request:
16
+ paths:
17
+ - 'immich_api/**'
18
+ - 'scripts/**'
19
+ - 'tests/**'
20
+ - 'pyproject.toml'
21
+ - 'uv.lock'
22
+ - '.github/workflows/windows-ci.yml'
23
+ push:
24
+ branches:
25
+ - 'main'
26
+
27
+ permissions:
28
+ contents: read
29
+
30
+ jobs:
31
+ windows:
32
+ name: Windows coverage (report only, never blocks)
33
+ runs-on: windows-latest
34
+ permissions:
35
+ contents: read
36
+ defaults:
37
+ run:
38
+ shell: bash
39
+ steps:
40
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
41
+ with:
42
+ persist-credentials: false
43
+
44
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
45
+ with:
46
+ python-version: '3.12'
47
+
48
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6
49
+ with:
50
+ version: '0.11.7'
51
+ enable-cache: true
52
+ cache-dependency-glob: uv.lock
53
+
54
+ - name: Sync test environment
55
+ id: sync
56
+ continue-on-error: true
57
+ run: |
58
+ uv sync --extra test
59
+ echo "$PWD/.venv/Scripts" >> "$GITHUB_PATH"
60
+ echo "$PWD/.venv/bin" >> "$GITHUB_PATH"
61
+
62
+ - name: Cross-platform import safety (real Windows interpreter)
63
+ if: steps.sync.outcome == 'success'
64
+ continue-on-error: true
65
+ run: python3 scripts/check_import_safety.py
66
+
67
+ - name: Unit tests
68
+ if: steps.sync.outcome == 'success'
69
+ continue-on-error: true
70
+ run: python3 -m pytest tests -q --tb=short --timeout=120
71
+
72
+ - name: Windows coverage summary
73
+ if: always()
74
+ run: |
75
+ echo "## Windows coverage ran in report-only mode" >> "$GITHUB_STEP_SUMMARY"
76
+ echo "Both steps above use continue-on-error: true -- a red step" >> "$GITHUB_STEP_SUMMARY"
77
+ echo "here is a real Windows regression and never blocks the" >> "$GITHUB_STEP_SUMMARY"
78
+ echo "publish pipeline." >> "$GITHUB_STEP_SUMMARY"
@@ -0,0 +1,32 @@
1
+ {
2
+ "file_hash_scope": "files records current vendored bytes; repository and revision identify the upstream source before any listed local derivations.",
3
+ "files": {
4
+ "scripts/sync_mkdocs_theme.py": "047dbd23cc46f1e8d0842d1518d404b01826a0fbe6cbcb881ca9ab424a5ffc0e",
5
+ "templates/mkdocs-theme/README.md": "5e0e109a935ce3a0ffc0f425e7086cc60ba69a3611213451556dc851abfb38f3",
6
+ "templates/mkdocs-theme/assets/brands/agent-connector-sdk-logo-v1.png": "6688810468a77118ee1960ac3872816c6ace4f750a849688d306d7a63132e1b1",
7
+ "templates/mkdocs-theme/assets/brands/agent-terminal-ui-logo-v1.png": "d5e3c011066e2241c09c885f65d9a07c6ff32f4244b00dbe8e7550a3bab20dc8",
8
+ "templates/mkdocs-theme/assets/brands/agent-utilities-logo-v1.png": "923319a3b89fa1fbd14ca14c27cf49d2e2d9f85bc45456e05b788692700f0103",
9
+ "templates/mkdocs-theme/assets/brands/agent-webui-logo-v1.png": "3939a7324f134c520fd544aadd2a37c99abba9db78dd2bf3fd5003ffd62502ff",
10
+ "templates/mkdocs-theme/assets/brands/epistemic-graph-logo-v1.png": "26671aef2c3b78ecdcca2ad13adfd266cebf8d7e666e614c2d83d166b853d272",
11
+ "templates/mkdocs-theme/assets/brands/geniusbot-logo-v1.png": "c4a17404f234f677496197ac202ca8fb30b136c5a69243811bbfa6e5d5352b28",
12
+ "templates/mkdocs-theme/assets/brands/graph-os-logo-v1.png": "bba183368e42927edea91013639311a5d64f5a9910ec2f1bdcc7f4cd32f9d230",
13
+ "templates/mkdocs-theme/assets/favicon.svg": "aa606f9668a363bfe533f7d835700c246efaed0b8895cce5fe4398f36c35e7ba",
14
+ "templates/mkdocs-theme/assets/graph-mark.svg": "d0c69cdc06aa51439b6ce04b4c6df4dbf02283329f01122a78e08f286186e25d",
15
+ "templates/mkdocs-theme/assets/runtime-architecture.mmd": "7fcbaed9a8fa8acbc1c30cccf31035e0d7048db9db45a73467f2e8faef7bc3cc",
16
+ "templates/mkdocs-theme/assets/runtime-architecture.svg": "2ecd201c6b7a170924195ce5578394f88365d3a539be4ece17aca15a439aef47",
17
+ "templates/mkdocs-theme/base.mkdocs.yml": "e324b30874e57ebe09a2ee0e7ae4a303e52dce808be1e7075dc3b445ad1e6bad",
18
+ "templates/mkdocs-theme/extra.css": "2cc17b7610b67c82895312e7e61cf84587a6fe291bbc154d3c83c59fba2ee843",
19
+ "templates/mkdocs-theme/glossary.md": "0c01322fff633a1d420fa3b0f4ee246124802f6b33bb0d4827b5d12fb9b56e09",
20
+ "templates/mkdocs-theme/overrides/main.html": "766234b5045a5815805bb2ce5223ddd93729f7854abc4b6cdf4fba9c7e0dab3b"
21
+ },
22
+ "local_derivations": {
23
+ "scripts/sync_mkdocs_theme.py": {
24
+ "derived_sha256": "047dbd23cc46f1e8d0842d1518d404b01826a0fbe6cbcb881ca9ab424a5ffc0e",
25
+ "review": "Upstream and derived Python ASTs are identical; no executable behavior change.",
26
+ "transformation": "Ruff 0.15.12 formatting using the consumer project line length of 88.",
27
+ "upstream_sha256": "2c48e594035288b14dda106f3cbdc745f9485c84297e3e34db398a41d57c3d60"
28
+ }
29
+ },
30
+ "repository": "https://github.com/Knuckles-Team/pipelines",
31
+ "revision": "7b3d18d72b5622d455ece3bbe45a9482bc6e8b5e"
32
+ }
@@ -0,0 +1,207 @@
1
+ """Synchronize generated ecosystem MkDocs theme files into a consumer repo."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import hashlib
7
+ import re
8
+ import sys
9
+ from dataclasses import dataclass
10
+ from pathlib import Path
11
+ from typing import Literal
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class ThemeFile:
16
+ """A canonical source file and its generated consumer-relative path."""
17
+
18
+ source: str
19
+ destination: str
20
+ content_relative: bool = True
21
+
22
+
23
+ THEME_FILES = (
24
+ ThemeFile("extra.css", "stylesheets/extra.css"),
25
+ ThemeFile("assets/graph-mark.svg", "assets/graph-mark.svg"),
26
+ ThemeFile("assets/favicon.svg", "assets/favicon.svg"),
27
+ ThemeFile("assets/runtime-architecture.mmd", "assets/runtime-architecture.mmd"),
28
+ ThemeFile("assets/runtime-architecture.svg", "assets/runtime-architecture.svg"),
29
+ ThemeFile(
30
+ "assets/brands/epistemic-graph-logo-v1.png",
31
+ "assets/brands/epistemic-graph-logo-v1.png",
32
+ ),
33
+ ThemeFile(
34
+ "assets/brands/agent-utilities-logo-v1.png",
35
+ "assets/brands/agent-utilities-logo-v1.png",
36
+ ),
37
+ ThemeFile(
38
+ "assets/brands/graph-os-logo-v1.png", "assets/brands/graph-os-logo-v1.png"
39
+ ),
40
+ ThemeFile(
41
+ "assets/brands/agent-connector-sdk-logo-v1.png",
42
+ "assets/brands/agent-connector-sdk-logo-v1.png",
43
+ ),
44
+ ThemeFile(
45
+ "assets/brands/agent-webui-logo-v1.png",
46
+ "assets/brands/agent-webui-logo-v1.png",
47
+ ),
48
+ ThemeFile(
49
+ "assets/brands/geniusbot-logo-v1.png", "assets/brands/geniusbot-logo-v1.png"
50
+ ),
51
+ ThemeFile(
52
+ "assets/brands/agent-terminal-ui-logo-v1.png",
53
+ "assets/brands/agent-terminal-ui-logo-v1.png",
54
+ ),
55
+ ThemeFile("glossary.md", "glossary.md"),
56
+ )
57
+
58
+
59
+ RUNTIME_PROVENANCE = re.compile(
60
+ rb"<!-- Generated compatibility copy; do not edit\.\n"
61
+ rb"Source: https://raw\.githubusercontent\.com/Knuckles-Team/epistemic-graph/"
62
+ rb"[0-9a-f]{40}/docs/assets/runtime-architecture\.svg\n"
63
+ rb"SHA-256: (?P<digest>[0-9a-f]{64})\n"
64
+ rb"Synchronize: https://github\.com/Knuckles-Team/\.github/blob/main/docs/runtime-diagram\.md\n"
65
+ rb"-->\n(?P<payload>.*)",
66
+ re.DOTALL,
67
+ )
68
+
69
+
70
+ class ThemeSyncError(Exception):
71
+ """The source, destination, or content-source contract is invalid."""
72
+
73
+
74
+ def _safe_relative_path(value: str, label: str) -> Path:
75
+ path = Path(value)
76
+ if (
77
+ path.is_absolute()
78
+ or not path.parts
79
+ or any(part in {".", ".."} for part in path.parts)
80
+ ):
81
+ raise ThemeSyncError(f"{label} must be a contained relative path")
82
+ return path
83
+
84
+
85
+ def _contained(root: Path, relative: Path, label: str) -> Path:
86
+ base = root.resolve()
87
+ result = (base / relative).resolve()
88
+ if not result.is_relative_to(base):
89
+ raise ThemeSyncError(f"{label} escapes the repository root")
90
+ return result
91
+
92
+
93
+ def _check_file(destination: Path, expected: bytes, repository: Path) -> str | None:
94
+ """Describe how ``destination`` diverges from ``expected``, or ``None`` when it matches."""
95
+ try:
96
+ actual = destination.read_bytes()
97
+ except OSError:
98
+ return f"missing generated file: {destination.relative_to(repository)}"
99
+ if actual != expected:
100
+ return f"generated file differs: {destination.relative_to(repository)}"
101
+ return None
102
+
103
+
104
+ def _runtime_diagram_content(destination: Path, expected: bytes) -> bytes:
105
+ """Keep the canonical sync tool's provenance without accepting SVG drift."""
106
+ if not destination.is_file():
107
+ return expected
108
+ actual = destination.read_bytes()
109
+ if not actual.startswith(b"<!--"):
110
+ return expected
111
+ provenance = RUNTIME_PROVENANCE.fullmatch(actual)
112
+ if (
113
+ provenance is None
114
+ or provenance["digest"] != hashlib.sha256(expected).hexdigest().encode()
115
+ or provenance["payload"] != expected
116
+ ):
117
+ raise ThemeSyncError(
118
+ "runtime diagram provenance or payload differs; use the canonical "
119
+ "sync guide: https://github.com/Knuckles-Team/.github/blob/main/docs/runtime-diagram.md"
120
+ )
121
+ return actual
122
+
123
+
124
+ def _expected_content(item: ThemeFile, source_file: Path, destination: Path) -> bytes:
125
+ """Resolve exact theme bytes while preserving validated runtime provenance."""
126
+ expected = source_file.read_bytes()
127
+ if item.source == "assets/runtime-architecture.svg":
128
+ return _runtime_diagram_content(destination, expected)
129
+ return expected
130
+
131
+
132
+ def sync_theme(
133
+ *,
134
+ source_root: Path,
135
+ repository_root: Path,
136
+ content_source: str,
137
+ mode: Literal["sync", "check"],
138
+ ) -> list[str]:
139
+ """Copy canonical files in ``sync`` mode or return mismatches in ``check`` mode."""
140
+ content_relative = _safe_relative_path(content_source, "content-source")
141
+ repository = repository_root.resolve()
142
+ content_root = _contained(repository, content_relative, "content-source")
143
+ source = (source_root / "templates" / "mkdocs-theme").resolve()
144
+ if not source.is_dir():
145
+ raise ThemeSyncError(f"canonical theme directory does not exist: {source}")
146
+
147
+ mismatches: list[str] = []
148
+ for item in THEME_FILES:
149
+ source_file = source / item.source
150
+ if not source_file.is_file():
151
+ raise ThemeSyncError(f"canonical theme file does not exist: {source_file}")
152
+ destination_root = content_root if item.content_relative else repository
153
+ destination = _contained(
154
+ destination_root, Path(item.destination), item.destination
155
+ )
156
+ expected = _expected_content(item, source_file, destination)
157
+ if mode == "check":
158
+ mismatch = _check_file(destination, expected, repository)
159
+ if mismatch:
160
+ mismatches.append(mismatch)
161
+ continue
162
+
163
+ destination.parent.mkdir(parents=True, exist_ok=True)
164
+ destination.write_bytes(expected)
165
+
166
+ return mismatches
167
+
168
+
169
+ def main(argv: list[str] | None = None) -> int:
170
+ parser = argparse.ArgumentParser(description=__doc__)
171
+ parser.add_argument("mode", choices=("sync", "check"))
172
+ parser.add_argument(
173
+ "--root", type=Path, default=Path.cwd(), help="consumer repository root"
174
+ )
175
+ parser.add_argument(
176
+ "--content-source",
177
+ default="docs",
178
+ help="consumer MkDocs content directory (normally docs or pages)",
179
+ )
180
+ parser.add_argument(
181
+ "--source-root",
182
+ type=Path,
183
+ default=Path(__file__).resolve().parents[1],
184
+ help="pipelines checkout containing templates/mkdocs-theme",
185
+ )
186
+ args = parser.parse_args(argv)
187
+ try:
188
+ mismatches = sync_theme(
189
+ source_root=args.source_root,
190
+ repository_root=args.root,
191
+ content_source=args.content_source,
192
+ mode=args.mode,
193
+ )
194
+ except (OSError, ThemeSyncError) as exc:
195
+ print(f"shared MkDocs theme: CANNOT RUN: {exc}", file=sys.stderr)
196
+ return 2
197
+ if mismatches:
198
+ print("shared MkDocs theme: generated files are out of sync:", file=sys.stderr)
199
+ for mismatch in mismatches:
200
+ print(f" - {mismatch}", file=sys.stderr)
201
+ return 1
202
+ print(f"shared MkDocs theme: {args.mode} complete")
203
+ return 0
204
+
205
+
206
+ if __name__ == "__main__":
207
+ raise SystemExit(main())
@@ -0,0 +1,23 @@
1
+ # Shared MkDocs theme
2
+
3
+ This folder is the canonical source for the five ecosystem documentation sites. `scripts/sync_mkdocs_theme.py` copies its generated files into a consuming repository and checks that committed copies are byte-identical.
4
+
5
+ ## Generated files
6
+
7
+ | Source | Consumer path |
8
+ | --- | --- |
9
+ | `extra.css` | `<content-source>/stylesheets/extra.css` |
10
+ | `overrides/main.html` | not synced: `custom_dir` serves it from the theme checkout (`.pipeline-theme/templates/mkdocs-theme/overrides`) |
11
+ | `assets/*` | `<content-source>/assets/*` |
12
+ | `glossary.md` | `<content-source>/glossary.md` |
13
+ | `base.mkdocs.yml` | inherited directly from the pinned pipelines checkout |
14
+
15
+ `<content-source>` is the explicitly declared `docs` or `pages` directory. Run `python scripts/sync_mkdocs_theme.py sync --root REPOSITORY --content-source docs` to update files, and the same command with `check` to check exact equality without writing. The Pages workflow checks the committed assets against its immutable workflow checkout before building.
16
+
17
+ ## MkDocs configuration
18
+
19
+ The repository's `mkdocs.yml` inherits `templates/mkdocs-theme/base.mkdocs.yml` and supplies `extra.ecosystem.current` with its own slug (`agent-webui`, `graph-os`, `agent-utilities`, `epistemic-graph`, or `agent-connector-sdk`). It continues to own its site name, URL, content directory, and navigation. For local builds, check out the exact pinned `pipelines` revision into `.pipeline-theme`, run the `sync` command above, then run `mkdocs build --strict`.
20
+
21
+ Use `.site-hero`, `.site-card-grid` / `.site-card`, `.site-ownership__grid` / `.site-ownership__item`, and the ordered `.site-flow` components for landing-page structure. Prefer semantic HTML and retain visible keyboard focus. The common theme uses native `<details>` for the site switcher and does not require custom JavaScript.
22
+
23
+ The root `README.md` remains the short entry point. It keeps its exact ordered headings: Overview, Key capabilities, Documentation, Architecture, Quick start, Contributing, License. Deep reference material belongs in Pages. Public home pages describe the current bundled ecosystem in present tense. They contain no planning, migration, worktree, or future-release status.
@@ -0,0 +1,13 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
2
+ <rect width="64" height="64" rx="14" fill="#f1f5fb"/>
3
+ <g fill="none" stroke="#2a5ca8" stroke-linecap="round" stroke-width="5">
4
+ <path d="M16 18 32 10l16 9v26l-16 9-16-9z"/>
5
+ <path d="m16 18 16 9 16-8M32 27v27M16 45l16-18 16 18"/>
6
+ </g>
7
+ <g fill="#e6a23a" stroke="#f1f5fb" stroke-width="2">
8
+ <circle cx="16" cy="18" r="6"/><circle cx="32" cy="10" r="6"/>
9
+ <circle cx="48" cy="19" r="6"/><circle cx="16" cy="45" r="6"/>
10
+ <circle cx="32" cy="54" r="6"/><circle cx="48" cy="45" r="6"/>
11
+ <circle cx="32" cy="27" r="6"/>
12
+ </g>
13
+ </svg>
@@ -0,0 +1,13 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-labelledby="title">
2
+ <title id="title">Knuckles-Team graph mark</title>
3
+ <g fill="none" stroke="#2a5ca8" stroke-linecap="round" stroke-width="5">
4
+ <path d="M16 18 32 10l16 9v26l-16 9-16-9z"/>
5
+ <path d="m16 18 16 9 16-8M32 27v27M16 45l16-18 16 18"/>
6
+ </g>
7
+ <g fill="#e6a23a" stroke="#fff" stroke-width="2">
8
+ <circle cx="16" cy="18" r="6"/><circle cx="32" cy="10" r="6"/>
9
+ <circle cx="48" cy="19" r="6"/><circle cx="16" cy="45" r="6"/>
10
+ <circle cx="32" cy="54" r="6"/><circle cx="48" cy="45" r="6"/>
11
+ <circle cx="32" cy="27" r="6"/>
12
+ </g>
13
+ </svg>
@@ -0,0 +1,26 @@
1
+ flowchart LR
2
+ People["People"]
3
+ WebUI["Graph OS web UI<br/>browser experience"]
4
+ TUI["Agent Terminal UI<br/>REST capabilities"]
5
+ Genius["Geniusbot<br/>desktop cockpit"]
6
+ Messaging["Messaging channels<br/>chat and voice"]
7
+ Clients["MCP / REST / A2A clients"]
8
+ GraphOS["Graph OS<br/>governed runtime gateway and composition host"]
9
+ AU["Agent Utilities<br/>agent control plane"]
10
+ EG["Epistemic Graph<br/>durable multimodal knowledge and reasoning engine"]
11
+ Sources["Source systems"]
12
+ SDK["Agent Connector SDK<br/>typed source integration"]
13
+
14
+ People --> WebUI
15
+ People --> TUI
16
+ People --> Genius
17
+ People --> Messaging
18
+ Clients --> GraphOS
19
+ WebUI --> GraphOS
20
+ TUI -->|REST| GraphOS
21
+ Genius --> GraphOS
22
+ Messaging -->|hosted co-service| GraphOS
23
+ GraphOS --> AU
24
+ AU --> EG
25
+ Sources --> SDK
26
+ SDK --> EG
@@ -0,0 +1,37 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1320 700" role="img" aria-labelledby="diagram-title diagram-description">
2
+ <title id="diagram-title">Knuckles-Team agent ecosystem runtime architecture</title>
3
+ <desc id="diagram-description">People use Graph OS web UI, Agent Terminal UI, Geniusbot, or messaging channels. MCP, REST, and A2A clients also enter through Graph OS. Graph OS is the governed gateway and composition host, Agent Utilities is the agent control plane, and Epistemic Graph is the durable multimodal knowledge and reasoning engine. Source systems connect through Agent Connector SDK.</desc>
4
+ <defs>
5
+ <linearGradient id="gateway-light" x1="0" x2="1"><stop stop-color="#e5f4ff"/><stop offset="1" stop-color="#e7fff5"/></linearGradient>
6
+ <linearGradient id="core-light" x1="0" x2="1"><stop stop-color="#eef0ff"/><stop offset="1" stop-color="#f3eaff"/></linearGradient>
7
+ <linearGradient id="gateway-dark" x1="0" x2="1"><stop stop-color="#173344"/><stop offset="1" stop-color="#153b36"/></linearGradient>
8
+ <linearGradient id="core-dark" x1="0" x2="1"><stop stop-color="#242c4b"/><stop offset="1" stop-color="#332646"/></linearGradient>
9
+ <marker id="arrow" markerWidth="10" markerHeight="10" refX="10" refY="5" orient="auto" markerUnits="strokeWidth"><path class="arrowhead" d="M0 0 10 5 0 10z"/></marker>
10
+ <style>
11
+ .bg{fill:none}.box{fill:#f5f8fc;stroke:#58769b;stroke-width:2}.entry{fill:#f7fbff;stroke:#2f75b5;stroke-width:2}.gateway{fill:url(#gateway-light);stroke:#087f6d;stroke-width:3}.core{fill:url(#core-light);stroke:#5b4cc4;stroke-width:2.5}.label{font:700 18px system-ui,-apple-system,Segoe UI,sans-serif;fill:#14243b;text-anchor:middle}.role{font:14px system-ui,-apple-system,Segoe UI,sans-serif;fill:#435773;text-anchor:middle}.small{font:13px system-ui,-apple-system,Segoe UI,sans-serif;fill:#526780;text-anchor:middle}.arrow,.bus{fill:none;stroke:#58769b;stroke-width:2.5}.arrow{marker-end:url(#arrow)}.arrowhead{fill:#365f93}
12
+ @media (prefers-color-scheme: light){.bg{fill:none}.box{fill:#f5f8fc;stroke:#58769b}.entry{fill:#f7fbff;stroke:#2f75b5}.gateway{fill:url(#gateway-light);stroke:#087f6d}.core{fill:url(#core-light);stroke:#5b4cc4}.label{fill:#14243b}.role{fill:#435773}.small{fill:#526780}.arrow,.bus{stroke:#58769b}.arrowhead{fill:#365f93}}
13
+ @media (prefers-color-scheme: dark){.bg{fill:none}.box{fill:#172338;stroke:#778ca9}.entry{fill:#192b43;stroke:#76aee9}.gateway{fill:url(#gateway-dark);stroke:#63d8b5}.core{fill:url(#core-dark);stroke:#b5a5ff}.label{fill:#f3f7ff}.role{fill:#d1dced}.small{fill:#b7c6dc}.arrow,.bus{stroke:#c2cee2}.arrowhead{fill:#d8e2f1}}
14
+ </style>
15
+ </defs>
16
+ <rect class="bg" width="1320" height="700" rx="24" fill="none"/>
17
+ <g>
18
+ <rect class="box" x="35" y="35" width="170" height="55" rx="14"/><text class="label" x="120" y="69">People</text>
19
+ <rect class="entry" x="35" y="135" width="170" height="90" rx="16"/><text class="label" x="120" y="172">Graph OS web UI</text><text class="role" x="120" y="198">browser experience</text>
20
+ <rect class="entry" x="225" y="135" width="170" height="90" rx="16"/><text class="label" x="310" y="169">Agent Terminal UI</text><text class="role" x="310" y="198">REST operations</text>
21
+ <rect class="entry" x="415" y="135" width="170" height="90" rx="16"/><text class="label" x="500" y="172">Geniusbot</text><text class="role" x="500" y="198">desktop cockpit</text>
22
+ <rect class="entry" x="605" y="135" width="175" height="90" rx="16"/><text class="label" x="692" y="169">Messaging</text><text class="role" x="692" y="194">chat + voice channels</text><text class="small" x="692" y="214">hosted by Graph OS</text>
23
+ <rect class="box" x="415" y="245" width="365" height="80" rx="16"/><text class="label" x="597.5" y="280">MCP / REST / A2A clients</text><text class="role" x="597.5" y="305">external agents and applications</text>
24
+ <rect class="gateway" x="825" y="135" width="450" height="170" rx="22"/><text class="label" x="1050" y="198">Graph OS</text><text class="role" x="1050" y="230">governed runtime gateway</text><text class="role" x="1050" y="255">and composition host</text>
25
+ <rect class="core" x="825" y="335" width="450" height="100" rx="18"/><text class="label" x="1050" y="376">Agent Utilities</text><text class="role" x="1050" y="405">agent control plane</text>
26
+ <rect class="core" x="825" y="485" width="450" height="125" rx="18"/><text class="label" x="1050" y="528">Epistemic Graph</text><text class="role" x="1050" y="558">durable multimodal knowledge, evidence,</text><text class="role" x="1050" y="582">provenance, and reasoning engine</text>
27
+ <rect class="box" x="35" y="520" width="220" height="90" rx="16"/><text class="label" x="145" y="557">Source systems</text><text class="role" x="145" y="583">governed external data</text>
28
+ <rect class="box" x="445" y="520" width="260" height="90" rx="16"/><text class="label" x="575" y="557">Agent Connector SDK</text><text class="role" x="575" y="583">typed source integration</text>
29
+ </g>
30
+ <g class="connections">
31
+ <path class="bus" d="M120 90V100H692"/>
32
+ <path class="arrow" d="M120 100V135"/><path class="arrow" d="M310 100V135"/><path class="arrow" d="M500 100V135"/><path class="arrow" d="M692 100V135"/>
33
+ <path class="arrow" d="M780 180H825"/><path class="arrow" d="M780 285H825"/>
34
+ <path class="arrow" d="M1050 305V335"/><path class="arrow" d="M1050 435V485"/>
35
+ <path class="arrow" d="M255 565H445"/><path class="arrow" d="M705 565H825"/>
36
+ </g>
37
+ </svg>