* feat: add audit log for feature usage tracking
Add full auditability for all mutating and core API operations across
HTTP, MCP, and system (worker) transports. Audit entries record raw
request/response as JSONB, timing (started_at/ended_at), action, and
transport type.
Backend:
- New audit_log table with JSONB columns for expandability without
future migrations (merge migration of 3 existing heads)
- AuditLogger with fire-and-forget writes via asyncio.create_task
- @audited decorator on 28 HTTP route handlers
- MCP tool audit wrapping for 16 auditable tools
- Worker task execution wrapped with audit_context
- List endpoint with action, transport, date range filters + pagination
- Stats endpoint with per-day counts for charting
- Configurable retention sweep (concurrent-safe DELETE)
Config (env-only, static):
- HINDSIGHT_API_AUDIT_LOG_ENABLED (default: false)
- HINDSIGHT_API_AUDIT_LOG_ACTIONS (comma-separated allowlist, empty=all)
- HINDSIGHT_API_AUDIT_LOG_RETENTION_DAYS (default: -1, keep forever)
Control Plane:
- New "Audit Logs" tab on bank configuration page
- Line chart showing request volume (today/7d/30d) with action filter
- Filterable table with action, transport, date range filters
- Paginated list with detail dialog showing raw request/response JSON
Tests:
- 13 tests covering list, filters, pagination, stats, disabled mode,
action allowlist, and ordering
* fix: split 3-way merge migration into two 2-way merges
Alembic doesn't support 3-parent merge migrations. Split into a no-op
merge of 2 heads (b1c2d3e4f5g6) followed by the audit_log table
migration merging the third head.
* fix: correct merge migration to merge actual 2 heads
The original analysis incorrectly identified 3 heads. There were only 2
(a3b4c5d6e7f8 and c8e5f2a3b4d1). Remove the unnecessary intermediate
merge migration and fix the audit_log migration to merge these 2 heads.
* fix: use 'heads' instead of 'head' in migration runner
Alembic's upgrade('head') fails when multiple heads exist (e.g. from
namespace package overlaps between hindsight-api and hindsight-api-slim).
Using 'heads' (plural) handles this gracefully by upgrading all branches.
* chore: regenerate OpenAPI spec with audit log endpoints
* chore: regenerate TypeScript client and docs skill OpenAPI spec
Python and Go clients still need regeneration (requires Docker).
* chore: regenerate all client SDKs (Python, Go, TypeScript)
Adds generated audit log API clients for Python (audit_api.py),
Go (api_audit.go), and TypeScript client type updates.
113 lines
5.4 KiB
Text
113 lines
5.4 KiB
Text
hindsight_client_api/__init__.py
|
|
hindsight_client_api/api/__init__.py
|
|
hindsight_client_api/api/audit_api.py
|
|
hindsight_client_api/api/banks_api.py
|
|
hindsight_client_api/api/directives_api.py
|
|
hindsight_client_api/api/documents_api.py
|
|
hindsight_client_api/api/entities_api.py
|
|
hindsight_client_api/api/files_api.py
|
|
hindsight_client_api/api/memory_api.py
|
|
hindsight_client_api/api/mental_models_api.py
|
|
hindsight_client_api/api/monitoring_api.py
|
|
hindsight_client_api/api/operations_api.py
|
|
hindsight_client_api/api/webhooks_api.py
|
|
hindsight_client_api/api_client.py
|
|
hindsight_client_api/api_response.py
|
|
hindsight_client_api/configuration.py
|
|
hindsight_client_api/exceptions.py
|
|
hindsight_client_api/models/__init__.py
|
|
hindsight_client_api/models/add_background_request.py
|
|
hindsight_client_api/models/async_operation_submit_response.py
|
|
hindsight_client_api/models/background_response.py
|
|
hindsight_client_api/models/bank_config_response.py
|
|
hindsight_client_api/models/bank_config_update.py
|
|
hindsight_client_api/models/bank_list_item.py
|
|
hindsight_client_api/models/bank_list_response.py
|
|
hindsight_client_api/models/bank_profile_response.py
|
|
hindsight_client_api/models/bank_stats_response.py
|
|
hindsight_client_api/models/budget.py
|
|
hindsight_client_api/models/cancel_operation_response.py
|
|
hindsight_client_api/models/child_operation_status.py
|
|
hindsight_client_api/models/chunk_data.py
|
|
hindsight_client_api/models/chunk_include_options.py
|
|
hindsight_client_api/models/chunk_response.py
|
|
hindsight_client_api/models/clear_memory_observations_response.py
|
|
hindsight_client_api/models/consolidation_response.py
|
|
hindsight_client_api/models/create_bank_request.py
|
|
hindsight_client_api/models/create_directive_request.py
|
|
hindsight_client_api/models/create_mental_model_request.py
|
|
hindsight_client_api/models/create_mental_model_response.py
|
|
hindsight_client_api/models/create_webhook_request.py
|
|
hindsight_client_api/models/delete_document_response.py
|
|
hindsight_client_api/models/delete_response.py
|
|
hindsight_client_api/models/directive_list_response.py
|
|
hindsight_client_api/models/directive_response.py
|
|
hindsight_client_api/models/disposition_traits.py
|
|
hindsight_client_api/models/document_response.py
|
|
hindsight_client_api/models/entity_detail_response.py
|
|
hindsight_client_api/models/entity_include_options.py
|
|
hindsight_client_api/models/entity_input.py
|
|
hindsight_client_api/models/entity_list_item.py
|
|
hindsight_client_api/models/entity_list_response.py
|
|
hindsight_client_api/models/entity_observation_response.py
|
|
hindsight_client_api/models/entity_state_response.py
|
|
hindsight_client_api/models/features_info.py
|
|
hindsight_client_api/models/file_retain_response.py
|
|
hindsight_client_api/models/graph_data_response.py
|
|
hindsight_client_api/models/http_validation_error.py
|
|
hindsight_client_api/models/include_options.py
|
|
hindsight_client_api/models/list_documents_response.py
|
|
hindsight_client_api/models/list_memory_units_response.py
|
|
hindsight_client_api/models/list_tags_response.py
|
|
hindsight_client_api/models/memory_item.py
|
|
hindsight_client_api/models/mental_model_list_response.py
|
|
hindsight_client_api/models/mental_model_response.py
|
|
hindsight_client_api/models/mental_model_trigger.py
|
|
hindsight_client_api/models/model_not.py
|
|
hindsight_client_api/models/observation_scopes.py
|
|
hindsight_client_api/models/operation_response.py
|
|
hindsight_client_api/models/operation_status_response.py
|
|
hindsight_client_api/models/operations_list_response.py
|
|
hindsight_client_api/models/recall_request.py
|
|
hindsight_client_api/models/recall_request_tag_groups_inner.py
|
|
hindsight_client_api/models/recall_response.py
|
|
hindsight_client_api/models/recall_result.py
|
|
hindsight_client_api/models/recover_consolidation_response.py
|
|
hindsight_client_api/models/reflect_based_on.py
|
|
hindsight_client_api/models/reflect_directive.py
|
|
hindsight_client_api/models/reflect_fact.py
|
|
hindsight_client_api/models/reflect_include_options.py
|
|
hindsight_client_api/models/reflect_llm_call.py
|
|
hindsight_client_api/models/reflect_mental_model.py
|
|
hindsight_client_api/models/reflect_request.py
|
|
hindsight_client_api/models/reflect_response.py
|
|
hindsight_client_api/models/reflect_tool_call.py
|
|
hindsight_client_api/models/reflect_trace.py
|
|
hindsight_client_api/models/retain_request.py
|
|
hindsight_client_api/models/retain_response.py
|
|
hindsight_client_api/models/retry_operation_response.py
|
|
hindsight_client_api/models/source_facts_include_options.py
|
|
hindsight_client_api/models/tag_group_and.py
|
|
hindsight_client_api/models/tag_group_leaf.py
|
|
hindsight_client_api/models/tag_group_not.py
|
|
hindsight_client_api/models/tag_group_or.py
|
|
hindsight_client_api/models/tag_item.py
|
|
hindsight_client_api/models/timestamp.py
|
|
hindsight_client_api/models/token_usage.py
|
|
hindsight_client_api/models/tool_calls_include_options.py
|
|
hindsight_client_api/models/update_directive_request.py
|
|
hindsight_client_api/models/update_disposition_request.py
|
|
hindsight_client_api/models/update_document_request.py
|
|
hindsight_client_api/models/update_document_response.py
|
|
hindsight_client_api/models/update_mental_model_request.py
|
|
hindsight_client_api/models/update_webhook_request.py
|
|
hindsight_client_api/models/validation_error.py
|
|
hindsight_client_api/models/validation_error_loc_inner.py
|
|
hindsight_client_api/models/version_response.py
|
|
hindsight_client_api/models/webhook_delivery_list_response.py
|
|
hindsight_client_api/models/webhook_delivery_response.py
|
|
hindsight_client_api/models/webhook_http_config.py
|
|
hindsight_client_api/models/webhook_list_response.py
|
|
hindsight_client_api/models/webhook_response.py
|
|
hindsight_client_api/rest.py
|
|
hindsight_client_api_README.md
|