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.
- immich_api-0.2.1/.bumpversion.cfg +12 -0
- immich_api-0.2.1/.config/spec-dashboard.json +4 -0
- immich_api-0.2.1/.github/workflows/pages.yml +25 -0
- immich_api-0.2.1/.github/workflows/pipeline.yml +27 -0
- immich_api-0.2.1/.github/workflows/scanners.yml +42 -0
- immich_api-0.2.1/.github/workflows/windows-ci.yml +78 -0
- immich_api-0.2.1/.pipeline-theme/provenance.json +32 -0
- immich_api-0.2.1/.pipeline-theme/scripts/sync_mkdocs_theme.py +207 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/README.md +23 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-connector-sdk-logo-v1.png +0 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-terminal-ui-logo-v1.png +0 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-utilities-logo-v1.png +0 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-webui-logo-v1.png +0 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/epistemic-graph-logo-v1.png +0 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/geniusbot-logo-v1.png +0 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/graph-os-logo-v1.png +0 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/favicon.svg +13 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/graph-mark.svg +13 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/runtime-architecture.mmd +26 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/runtime-architecture.svg +37 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/base.mkdocs.yml +105 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/extra.css +249 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/glossary.md +57 -0
- immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/overrides/main.html +57 -0
- immich_api-0.2.1/.pre-commit-config.yaml +87 -0
- immich_api-0.2.1/LICENSE +21 -0
- immich_api-0.2.1/MANIFEST.in +19 -0
- immich_api-0.2.1/PKG-INFO +242 -0
- immich_api-0.2.1/README.md +212 -0
- immich_api-0.2.1/docker/Dockerfile +30 -0
- immich_api-0.2.1/docker/debug.Dockerfile +31 -0
- immich_api-0.2.1/docker/mcp.compose.yml +35 -0
- immich_api-0.2.1/docker/starship.toml +70 -0
- immich_api-0.2.1/docs/agent-readiness.json +31 -0
- immich_api-0.2.1/docs/agent-readiness.schema.json +331 -0
- immich_api-0.2.1/docs/architecture.md +40 -0
- immich_api-0.2.1/docs/assets/brands/agent-connector-sdk-logo-v1.png +0 -0
- immich_api-0.2.1/docs/assets/brands/agent-terminal-ui-logo-v1.png +0 -0
- immich_api-0.2.1/docs/assets/brands/agent-utilities-logo-v1.png +0 -0
- immich_api-0.2.1/docs/assets/brands/agent-webui-logo-v1.png +0 -0
- immich_api-0.2.1/docs/assets/brands/epistemic-graph-logo-v1.png +0 -0
- immich_api-0.2.1/docs/assets/brands/geniusbot-logo-v1.png +0 -0
- immich_api-0.2.1/docs/assets/brands/graph-os-logo-v1.png +0 -0
- immich_api-0.2.1/docs/assets/favicon.svg +13 -0
- immich_api-0.2.1/docs/assets/graph-mark.svg +13 -0
- immich_api-0.2.1/docs/assets/runtime-architecture.mmd +26 -0
- immich_api-0.2.1/docs/assets/runtime-architecture.svg +37 -0
- immich_api-0.2.1/docs/capabilities/api.json +1 -0
- immich_api-0.2.1/docs/capabilities/mcp.json +1 -0
- immich_api-0.2.1/docs/concepts.md +21 -0
- immich_api-0.2.1/docs/deployment.md +130 -0
- immich_api-0.2.1/docs/glossary.md +57 -0
- immich_api-0.2.1/docs/immich-capabilities.md +110 -0
- immich_api-0.2.1/docs/index.md +33 -0
- immich_api-0.2.1/docs/installation.md +56 -0
- immich_api-0.2.1/docs/openapi-parity.md +200 -0
- immich_api-0.2.1/docs/overview.md +27 -0
- immich_api-0.2.1/docs/platform.md +22 -0
- immich_api-0.2.1/docs/spec-delivery.md +18 -0
- immich_api-0.2.1/docs/stylesheets/extra.css +249 -0
- immich_api-0.2.1/docs/usage.md +47 -0
- immich_api-0.2.1/immich_api/__init__.py +54 -0
- immich_api-0.2.1/immich_api/__main__.py +4 -0
- immich_api-0.2.1/immich_api/album_metadata.py +119 -0
- immich_api-0.2.1/immich_api/api/__init__.py +3 -0
- immich_api-0.2.1/immich_api/api/api_client_system.py +7 -0
- immich_api-0.2.1/immich_api/auth.py +94 -0
- immich_api-0.2.1/immich_api/connector_manifest.yml +212 -0
- immich_api-0.2.1/immich_api/connectors/__init__.py +0 -0
- immich_api-0.2.1/immich_api/connectors/mcp_source_presets.json +3 -0
- immich_api-0.2.1/immich_api/connectors/tool_schema_fingerprints.json +1 -0
- immich_api-0.2.1/immich_api/error_authority.py +248 -0
- immich_api-0.2.1/immich_api/error_rendering.py +105 -0
- immich_api-0.2.1/immich_api/immich_input_models.py +12 -0
- immich_api-0.2.1/immich_api/immich_response_models.py +15 -0
- immich_api-0.2.1/immich_api/kg_ingest.py +75 -0
- immich_api-0.2.1/immich_api/mcp/__init__.py +21 -0
- immich_api-0.2.1/immich_api/mcp/album_sample.py +38 -0
- immich_api-0.2.1/immich_api/mcp_config.json +3 -0
- immich_api-0.2.1/immich_api/mcp_server.py +50 -0
- immich_api-0.2.1/immich_api/ontology/__init__.py +6 -0
- immich_api-0.2.1/immich_api/ontology/immich.ttl +119 -0
- immich_api-0.2.1/immich_api/ontology/schema-provenance.json +483 -0
- immich_api-0.2.1/immich_api/ontology/shapes/immich.ttl +69 -0
- immich_api-0.2.1/immich_api/openapi_auth_scheme.py +77 -0
- immich_api-0.2.1/immich_api/openapi_contract.json +80122 -0
- immich_api-0.2.1/immich_api/openapi_execution.py +30 -0
- immich_api-0.2.1/immich_api/openapi_inventory.json +16154 -0
- immich_api-0.2.1/immich_api/openapi_request.py +119 -0
- immich_api-0.2.1/immich_api/openapi_response.py +76 -0
- immich_api-0.2.1/immich_api/openapi_runtime.py +203 -0
- immich_api-0.2.1/immich_api/parity/__init__.py +17 -0
- immich_api-0.2.1/immich_api/parity/check_openapi_parity.py +173 -0
- immich_api-0.2.1/immich_api/parity/openapi_discovery.py +95 -0
- immich_api-0.2.1/immich_api/parity/openapi_parity.py +239 -0
- immich_api-0.2.1/immich_api/parity/openapi_provider_evidence.py +143 -0
- immich_api-0.2.1/immich_api/parity/openapi_provider_overlay.py +239 -0
- immich_api-0.2.1/immich_api/parity/openapi_provider_responses.py +132 -0
- immich_api-0.2.1/immich_api/parity/openapi_schema.py +206 -0
- immich_api-0.2.1/immich_api/parity/openapi_schema_budget.py +104 -0
- immich_api-0.2.1/immich_api/parity/openapi_schema_inputs.py +89 -0
- immich_api-0.2.1/immich_api/parity/openapi_schema_types.py +163 -0
- immich_api-0.2.1/immich_api/parity/openapi_security.py +157 -0
- immich_api-0.2.1/immich_api/parity/openapi_source_parity.py +98 -0
- immich_api-0.2.1/immich_api/parity/openapi_transport_parity.py +169 -0
- immich_api-0.2.1/immich_api/parity/unicode_patterns.py +105 -0
- immich_api-0.2.1/immich_api/parity/unicode_properties.json +4719 -0
- immich_api-0.2.1/immich_api/prompts/__init__.py +0 -0
- immich_api-0.2.1/immich_api/prompts/immich_album_review.json +18 -0
- immich_api-0.2.1/immich_api/prompts/immich_asset_metadata.json +18 -0
- immich_api-0.2.1/immich_api/prompts/immich_person_record.json +18 -0
- immich_api-0.2.1/immich_api/prompts/immich_specialist.json +17 -0
- immich_api-0.2.1/immich_api/prompts/main_agent.json +24 -0
- immich_api-0.2.1/immich_api/skills/__init__.py +0 -0
- immich_api-0.2.1/immich_api/skills/immich-album-review/SKILL.md +17 -0
- immich_api-0.2.1/immich_api/skills/immich-asset-metadata/SKILL.md +17 -0
- immich_api-0.2.1/immich_api/skills/immich-health/SKILL.md +17 -0
- immich_api-0.2.1/immich_api/skills/immich-person-record/SKILL.md +17 -0
- immich_api-0.2.1/immich_api.egg-info/PKG-INFO +242 -0
- immich_api-0.2.1/immich_api.egg-info/SOURCES.txt +178 -0
- immich_api-0.2.1/immich_api.egg-info/dependency_links.txt +1 -0
- immich_api-0.2.1/immich_api.egg-info/entry_points.txt +17 -0
- immich_api-0.2.1/immich_api.egg-info/requires.txt +17 -0
- immich_api-0.2.1/immich_api.egg-info/top_level.txt +1 -0
- immich_api-0.2.1/mkdocs.yml +29 -0
- immich_api-0.2.1/pyproject.toml +104 -0
- immich_api-0.2.1/pytest.ini +11 -0
- immich_api-0.2.1/requirements.txt +3 -0
- immich_api-0.2.1/scripts/agent_readiness_tck.py +1138 -0
- immich_api-0.2.1/scripts/bootstrap.sh +61 -0
- immich_api-0.2.1/scripts/bootstrap_environment.py +235 -0
- immich_api-0.2.1/scripts/bootstrap_sources.py +129 -0
- immich_api-0.2.1/scripts/check_connector_contract.py +108 -0
- immich_api-0.2.1/scripts/check_import_safety.py +309 -0
- immich_api-0.2.1/scripts/check_workspace_source_drift.py +98 -0
- immich_api-0.2.1/scripts/generate_agent_readiness.py +1531 -0
- immich_api-0.2.1/scripts/generate_immich_content.py +284 -0
- immich_api-0.2.1/scripts/generate_tool_schemas.py +100 -0
- immich_api-0.2.1/scripts/generated_schema_clones.py +148 -0
- immich_api-0.2.1/scripts/measure_operation_parity.py +239 -0
- immich_api-0.2.1/scripts/reviewed_secret_history.py +121 -0
- immich_api-0.2.1/scripts/security_sanitizer.py +279 -0
- immich_api-0.2.1/scripts/select_python.py +85 -0
- immich_api-0.2.1/scripts/upstream_evidence.py +83 -0
- immich_api-0.2.1/scripts/verify_api_integration.py +78 -0
- immich_api-0.2.1/scripts/verify_generated_schemas.py +111 -0
- immich_api-0.2.1/scripts/workspace_sources.py +250 -0
- immich_api-0.2.1/setup.cfg +4 -0
- immich_api-0.2.1/specs/README.md +17 -0
- immich_api-0.2.1/specs/immich-api/plan.md +88 -0
- immich_api-0.2.1/specs/immich-api/requirements.md +15 -0
- immich_api-0.2.1/specs/immich-api/spec.md +32 -0
- immich_api-0.2.1/specs/immich-api/status.json +91 -0
- immich_api-0.2.1/specs/immich-api/tasks.md +13 -0
- immich_api-0.2.1/specs/immich-api/test-spec.md +32 -0
- immich_api-0.2.1/tests/__init__.py +0 -0
- immich_api-0.2.1/tests/conftest.py +7 -0
- immich_api-0.2.1/tests/fixtures/native-client-budget.json +10 -0
- immich_api-0.2.1/tests/fixtures/operation-cases.json +9742 -0
- immich_api-0.2.1/tests/operation_fixtures.py +157 -0
- immich_api-0.2.1/tests/parity_support.py +129 -0
- immich_api-0.2.1/tests/test_album_metadata.py +75 -0
- immich_api-0.2.1/tests/test_api_wrapper.py +204 -0
- immich_api-0.2.1/tests/test_auth.py +97 -0
- immich_api-0.2.1/tests/test_concept_parity.py +23 -0
- immich_api-0.2.1/tests/test_error_authority.py +68 -0
- immich_api-0.2.1/tests/test_fleet_name.py +50 -0
- immich_api-0.2.1/tests/test_generated_schema_policy.py +159 -0
- immich_api-0.2.1/tests/test_immich_content.py +149 -0
- immich_api-0.2.1/tests/test_immich_mcp_validation.py +14 -0
- immich_api-0.2.1/tests/test_init_dynamics.py +10 -0
- immich_api-0.2.1/tests/test_kg_ingest.py +134 -0
- immich_api-0.2.1/tests/test_oauth_redirect_response.py +138 -0
- immich_api-0.2.1/tests/test_openapi_auth_provider.py +149 -0
- immich_api-0.2.1/tests/test_operation_parity.py +399 -0
- immich_api-0.2.1/tests/test_reviewed_secret_history.py +91 -0
- immich_api-0.2.1/tests/test_session_auth_isolation.py +123 -0
- immich_api-0.2.1/tests/test_source_image.py +24 -0
- immich_api-0.2.1/tests/test_startup.py +9 -0
- 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,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.
|
|
Binary file
|
immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-terminal-ui-logo-v1.png
ADDED
|
Binary file
|
immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-utilities-logo-v1.png
ADDED
|
Binary file
|
|
Binary file
|
immich_api-0.2.1/.pipeline-theme/templates/mkdocs-theme/assets/brands/epistemic-graph-logo-v1.png
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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>
|