2026-04-05 18:33:52 -04:00
|
|
|
services:
|
|
|
|
|
atocore:
|
|
|
|
|
build:
|
|
|
|
|
context: ../../
|
|
|
|
|
dockerfile: Dockerfile
|
|
|
|
|
container_name: atocore
|
|
|
|
|
restart: unless-stopped
|
|
|
|
|
ports:
|
|
|
|
|
- "${ATOCORE_PORT:-8100}:8100"
|
|
|
|
|
env_file:
|
|
|
|
|
- .env
|
2026-04-08 20:25:32 -04:00
|
|
|
environment:
|
|
|
|
|
# Build provenance — set by deploy/dalidou/deploy.sh on each
|
|
|
|
|
# rebuild so /health can report exactly which commit is live.
|
|
|
|
|
# Defaults to 'unknown' for direct `docker compose up` runs that
|
|
|
|
|
# bypass deploy.sh; in that case the operator should run
|
|
|
|
|
# deploy.sh instead so the deployed SHA is recorded.
|
|
|
|
|
ATOCORE_BUILD_SHA: "${ATOCORE_BUILD_SHA:-unknown}"
|
|
|
|
|
ATOCORE_BUILD_TIME: "${ATOCORE_BUILD_TIME:-unknown}"
|
|
|
|
|
ATOCORE_BUILD_BRANCH: "${ATOCORE_BUILD_BRANCH:-unknown}"
|
2026-04-05 18:33:52 -04:00
|
|
|
volumes:
|
|
|
|
|
- ${ATOCORE_DB_DIR}:${ATOCORE_DB_DIR}
|
|
|
|
|
- ${ATOCORE_CHROMA_DIR}:${ATOCORE_CHROMA_DIR}
|
|
|
|
|
- ${ATOCORE_CACHE_DIR}:${ATOCORE_CACHE_DIR}
|
|
|
|
|
- ${ATOCORE_TMP_DIR}:${ATOCORE_TMP_DIR}
|
|
|
|
|
- ${ATOCORE_LOG_DIR}:${ATOCORE_LOG_DIR}
|
|
|
|
|
- ${ATOCORE_BACKUP_DIR}:${ATOCORE_BACKUP_DIR}
|
|
|
|
|
- ${ATOCORE_RUN_DIR}:${ATOCORE_RUN_DIR}
|
2026-04-06 09:52:19 -04:00
|
|
|
- ${ATOCORE_PROJECT_REGISTRY_DIR}:${ATOCORE_PROJECT_REGISTRY_DIR}
|
feat(assets): binary asset store + artifact entity + wiki evidence (Issue F)
Wires visual evidence into the knowledge graph. Images, PDFs, and CAD
exports can now be uploaded, deduped by SHA-256, thumbnailed, linked to
entities via EVIDENCED_BY, and rendered inline on wiki pages. Unblocks
AKC uploading voice-session screenshots alongside extracted entities.
- assets/ module: store_asset (hash dedup + MIME allowlist + 20 MB cap),
get_asset_binary, get_thumbnail (Pillow, on-disk cache under
.thumbnails/<size>/), list_orphan_assets, invalidate_asset
- models/database.py: new `assets` table + indexes
- engineering/service.py: `artifact` added to ENTITY_TYPES
- api/routes.py: POST /assets (multipart), GET /assets/{id},
/assets/{id}/thumbnail, /assets/{id}/meta, /admin/assets/orphans,
DELETE /assets/{id} (409 if still referenced),
GET /entities/{id}/evidence (EVIDENCED_BY artifacts with asset meta)
- main.py: all new paths aliased under /v1
- engineering/wiki.py: entity pages render EVIDENCED_BY → artifact as a
"Visual evidence" thumbnail strip; artifact pages render the full
image + caption + capture_context
- deploy/dalidou/docker-compose.yml: bind-mount ${ATOCORE_ASSETS_DIR}
- config.py: assets_dir + assets_max_upload_bytes settings
- requirements.txt + pyproject.toml: python-multipart, Pillow>=10.0.0
- tests/test_assets.py: 16 tests (dedup, cap, thumbnail cache, orphan
detection, invalidate gating, API upload/fetch, evidence, v1 aliases,
wiki rendering)
- DEV-LEDGER.md: session log + cleanup note + test_count 478 -> 494
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 21:46:52 -04:00
|
|
|
- ${ATOCORE_ASSETS_DIR}:${ATOCORE_ASSETS_DIR}
|
2026-04-05 18:33:52 -04:00
|
|
|
- ${ATOCORE_VAULT_SOURCE_DIR}:${ATOCORE_VAULT_SOURCE_DIR}:ro
|
|
|
|
|
- ${ATOCORE_DRIVE_SOURCE_DIR}:${ATOCORE_DRIVE_SOURCE_DIR}:ro
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8100/health"]
|
|
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 5
|
|
|
|
|
start_period: 20s
|