ciris-agent 1.7.7__py3-none-any.whl
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.
- ciris_adapters/README.md +113 -0
- ciris_adapters/__init__.py +30 -0
- ciris_adapters/ciris_covenant_metrics/README.md +144 -0
- ciris_adapters/ciris_covenant_metrics/__init__.py +36 -0
- ciris_adapters/ciris_covenant_metrics/adapter.py +249 -0
- ciris_adapters/ciris_covenant_metrics/manifest.json +152 -0
- ciris_adapters/ciris_covenant_metrics/services.py +403 -0
- ciris_adapters/ciris_hosted_tools/__init__.py +24 -0
- ciris_adapters/ciris_hosted_tools/adapter.py +169 -0
- ciris_adapters/ciris_hosted_tools/manifest.json +94 -0
- ciris_adapters/ciris_hosted_tools/services.py +744 -0
- ciris_adapters/external_data_sql/README.md +559 -0
- ciris_adapters/external_data_sql/__init__.py +43 -0
- ciris_adapters/external_data_sql/adapter.py +144 -0
- ciris_adapters/external_data_sql/configurable.py +315 -0
- ciris_adapters/external_data_sql/dialects/__init__.py +37 -0
- ciris_adapters/external_data_sql/dialects/base.py +133 -0
- ciris_adapters/external_data_sql/dialects/mysql.py +63 -0
- ciris_adapters/external_data_sql/dialects/postgresql.py +59 -0
- ciris_adapters/external_data_sql/dialects/sqlite.py +62 -0
- ciris_adapters/external_data_sql/example_config.json +88 -0
- ciris_adapters/external_data_sql/example_privacy_schema.yaml +127 -0
- ciris_adapters/external_data_sql/manifest.json +195 -0
- ciris_adapters/external_data_sql/privacy_schema_loader.py +189 -0
- ciris_adapters/external_data_sql/protocol.py +101 -0
- ciris_adapters/external_data_sql/schemas.py +146 -0
- ciris_adapters/external_data_sql/service.py +1547 -0
- ciris_adapters/external_data_sql/service_old.py +492 -0
- ciris_adapters/home_assistant/__init__.py +63 -0
- ciris_adapters/home_assistant/adapter.py +201 -0
- ciris_adapters/home_assistant/communication_service.py +347 -0
- ciris_adapters/home_assistant/configurable.py +667 -0
- ciris_adapters/home_assistant/manifest.json +203 -0
- ciris_adapters/home_assistant/schemas.py +129 -0
- ciris_adapters/home_assistant/service.py +751 -0
- ciris_adapters/home_assistant/tool_service.py +441 -0
- ciris_adapters/mcp_client/__init__.py +82 -0
- ciris_adapters/mcp_client/adapter.py +847 -0
- ciris_adapters/mcp_client/config.py +280 -0
- ciris_adapters/mcp_client/configurable.py +422 -0
- ciris_adapters/mcp_client/manifest.json +185 -0
- ciris_adapters/mcp_client/mcp_communication_service.py +393 -0
- ciris_adapters/mcp_client/mcp_tool_service.py +463 -0
- ciris_adapters/mcp_client/mcp_wise_service.py +394 -0
- ciris_adapters/mcp_client/schemas.py +149 -0
- ciris_adapters/mcp_client/security.py +592 -0
- ciris_adapters/mcp_common/__init__.py +44 -0
- ciris_adapters/mcp_common/manifest.json +25 -0
- ciris_adapters/mcp_common/protocol.py +315 -0
- ciris_adapters/mcp_common/schemas.py +225 -0
- ciris_adapters/mcp_server/__init__.py +47 -0
- ciris_adapters/mcp_server/adapter.py +581 -0
- ciris_adapters/mcp_server/config.py +260 -0
- ciris_adapters/mcp_server/configurable.py +393 -0
- ciris_adapters/mcp_server/handlers.py +663 -0
- ciris_adapters/mcp_server/manifest.json +211 -0
- ciris_adapters/mcp_server/security.py +500 -0
- ciris_adapters/mock_llm/README.md +117 -0
- ciris_adapters/mock_llm/__init__.py +21 -0
- ciris_adapters/mock_llm/adapter.py +131 -0
- ciris_adapters/mock_llm/configurable.py +237 -0
- ciris_adapters/mock_llm/manifest.json +106 -0
- ciris_adapters/mock_llm/protocol.py +37 -0
- ciris_adapters/mock_llm/responses.py +520 -0
- ciris_adapters/mock_llm/responses_action_selection.py +1041 -0
- ciris_adapters/mock_llm/responses_epistemic.py +17 -0
- ciris_adapters/mock_llm/responses_feedback.py +27 -0
- ciris_adapters/mock_llm/schemas.py +35 -0
- ciris_adapters/mock_llm/service.py +294 -0
- ciris_adapters/navigation/__init__.py +21 -0
- ciris_adapters/navigation/adapter.py +129 -0
- ciris_adapters/navigation/configurable.py +239 -0
- ciris_adapters/navigation/manifest.json +104 -0
- ciris_adapters/navigation/service.py +487 -0
- ciris_adapters/reddit/README.md +132 -0
- ciris_adapters/reddit/REDDIT_ADAPTER_ANALYSIS.md +715 -0
- ciris_adapters/reddit/REDDIT_ADAPTER_SUMMARY.txt +278 -0
- ciris_adapters/reddit/REDDIT_ANALYSIS_INDEX.md +307 -0
- ciris_adapters/reddit/REDDIT_PRODUCTION_READINESS_PLAN.md +518 -0
- ciris_adapters/reddit/__init__.py +15 -0
- ciris_adapters/reddit/adapter.py +189 -0
- ciris_adapters/reddit/configurable.py +274 -0
- ciris_adapters/reddit/error_handler.py +307 -0
- ciris_adapters/reddit/manifest.json +218 -0
- ciris_adapters/reddit/observer.py +532 -0
- ciris_adapters/reddit/protocol.py +34 -0
- ciris_adapters/reddit/schemas.py +433 -0
- ciris_adapters/reddit/service.py +1471 -0
- ciris_adapters/sample_adapter/README.md +474 -0
- ciris_adapters/sample_adapter/__init__.py +45 -0
- ciris_adapters/sample_adapter/adapter.py +208 -0
- ciris_adapters/sample_adapter/configurable.py +469 -0
- ciris_adapters/sample_adapter/manifest.json +247 -0
- ciris_adapters/sample_adapter/services.py +486 -0
- ciris_adapters/weather/__init__.py +16 -0
- ciris_adapters/weather/adapter.py +130 -0
- ciris_adapters/weather/configurable.py +240 -0
- ciris_adapters/weather/manifest.json +156 -0
- ciris_adapters/weather/service.py +600 -0
- ciris_agent-1.7.7.dist-info/METADATA +284 -0
- ciris_agent-1.7.7.dist-info/RECORD +986 -0
- ciris_agent-1.7.7.dist-info/WHEEL +5 -0
- ciris_agent-1.7.7.dist-info/entry_points.txt +15 -0
- ciris_agent-1.7.7.dist-info/licenses/LICENSE +205 -0
- ciris_agent-1.7.7.dist-info/licenses/NOTICE +82 -0
- ciris_agent-1.7.7.dist-info/top_level.txt +4 -0
- ciris_engine/__init__.py +15 -0
- ciris_engine/ciris_templates/ally.yaml +632 -0
- ciris_engine/ciris_templates/default.yaml +411 -0
- ciris_engine/ciris_templates/echo-core.yaml +629 -0
- ciris_engine/ciris_templates/echo-speculative.yaml +764 -0
- ciris_engine/ciris_templates/echo.yaml +647 -0
- ciris_engine/ciris_templates/sage.yaml +332 -0
- ciris_engine/ciris_templates/scout.yaml +338 -0
- ciris_engine/ciris_templates/test.yaml +168 -0
- ciris_engine/cli.py +42 -0
- ciris_engine/config/CIRIS_SERVICES.json +19 -0
- ciris_engine/config/MODEL_CAPABILITIES.json +419 -0
- ciris_engine/config/PRICING_DATA.json +179 -0
- ciris_engine/config/__init__.py +50 -0
- ciris_engine/config/ciris_services.py +113 -0
- ciris_engine/config/model_capabilities.py +388 -0
- ciris_engine/config/pricing_models.py +276 -0
- ciris_engine/constants.py +35 -0
- ciris_engine/data/__init__.py +1 -0
- ciris_engine/data/covenant_1.0b.txt +978 -0
- ciris_engine/gui_static/11steps.svg +107 -0
- ciris_engine/gui_static/2x-schematics.png +0 -0
- ciris_engine/gui_static/404/index.html +1 -0
- ciris_engine/gui_static/404.html +1 -0
- ciris_engine/gui_static/_next/static/0edhkwDxd5UccTsCmtaBi/_buildManifest.js +1 -0
- ciris_engine/gui_static/_next/static/0edhkwDxd5UccTsCmtaBi/_ssgManifest.js +1 -0
- ciris_engine/gui_static/_next/static/U-3xTQao7hc2wnAi-Uekm/_buildManifest.js +1 -0
- ciris_engine/gui_static/_next/static/U-3xTQao7hc2wnAi-Uekm/_ssgManifest.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/3297-60e86ba0f8a7b040.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/3835-2aad4b7f5f8e4643.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/4499-99a0bc47de0b8975.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/4534-af88cd4ba6e99bff.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/4541-84b455f9e0dc4cfe.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/4789-61412711484754bb.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/6539-c6398bc9d7018430.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/704-8e827b26cc8c2d32.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/704-fb45d630f3192c6f.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/8072-de4952a2e6d2b33f.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/8315-b91d03a3949db0af.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/8386-f93a83ccbd789bd9.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/87c73c54-781a7f35148d5433.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/8903-fefea3339a02d41b.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/9090-e66485adf8d9d990.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/_not-found/page-a67d9808462c23b1.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/api-keys/page-2d7ee1583bbbd02e.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/api-keys/page-6a3c2bae6fe92b7b.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/consent/page-2ed3a035136bc4e8.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/consent/page-b2f5c91844a32422.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/page-25b90f89af3ea58c.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/page-b65d16c94ecaf69c.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/privacy/page-675b6d05c8f9184f.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/privacy/page-cbee2e1c8ab52145.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/settings/page-0f44da06697cf9f0.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/account/settings/page-563420253577edbf.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/adapters/page-1854631018bc32be.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/agents/page-8353752c176a7c70.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/agents/page-f61a529f110a6040.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/api-demo/page-7f19b9d20d39be28.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/api-demo/page-d1063938f249b8bd.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/audit/page-321b6728b8fff0bb.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/audit/page-ebac35ca961a1277.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/billing/page-6f3dc3bd02924f8e.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/billing/page-fa4a469f814c821a.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/comms/page-0d4f734269addd8f.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/comms/page-79227d426050089c.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/config/page-018d21d683b6e5bc.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/config/page-2aa5a5363ca2a371.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/consent/page-198373205fd316e2.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/consent/page-f2ca39e7713b13f8.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/dashboard/page-1dd5a196f643c60d.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/dashboard/page-530a04d3abbb8cda.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/docs/page-3193b06d094ab654.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/docs/page-330e996dedb87aba.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/layout-0a70f5fc460298b1.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/layout-21f2f99dd5b336e9.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/login/page-33240e6c6034a49d.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/login/page-68ffab6d54a7fdcd.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/logs/page-8a6167aecc4a475c.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/memory/page-9ca8c5d0056de3ff.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/memory/page-e961226941c18f81.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/page-6fdb065a787a4974.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/page-89f87d431be6064a.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/runtime/page-2e728b9c43aa164d.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/runtime/page-c7dd033dc40a72f0.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/services/page-ae9f0bdf11d01a95.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/services/page-b10feb79ca5d75e5.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/sessions/page-13ebe7ef1c16ae11.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/sessions/page-e6c82b16d617f785.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/setup/page-0beb5f5b5a5c20fc.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/setup/page-2595e729eae30c0e.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/status-dashboard/page-1037c987aecc3653.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/status-dashboard/page-2ffd147f6d3162ff.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/system/page-2c5798d58cafcd91.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/system/page-505b1ba4eceb01c3.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-auth/page-b0cad31d5cb1b2fa.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-auth/page-f3ecd7a8012df230.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-login/page-f35117fdc4105801.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-login/page-fb583a7924114906.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-sdk/page-50f116fd76935563.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/test-sdk/page-c37d8aa5ba623a44.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/tools/page-429aec7a707777ef.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/tools/page-5f705aad60e0c04e.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/users/page-13476b8b0f3808cc.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/users/page-7e500d154ed5bba4.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/wa/page-cc4a9d8a5cb44d08.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/app/wa/page-ec3e429efbc79230.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/framework-9d29490f5ba089ba.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/main-1f554952e47a82c4.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/main-app-26fa8aed029082e5.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/main-app-97b0486ef6bcef25.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/pages/_app-6ce685456e616eb2.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/pages/_error-d4bce98d93fe21e7.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- ciris_engine/gui_static/_next/static/chunks/webpack-fcebd240b7f8477d.js +1 -0
- ciris_engine/gui_static/_next/static/css/16b94b1fe0cc6e37.css +3 -0
- ciris_engine/gui_static/_next/static/css/77a24ceaae86deff.css +3 -0
- ciris_engine/gui_static/_next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/747892c23ea88013-s.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/8d697b304b401681-s.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/9610d9e46709d722-s.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- ciris_engine/gui_static/_next/static/media/d8298875641ec7d4-s.p.woff2 +0 -0
- ciris_engine/gui_static/account/api-keys/index.html +1 -0
- ciris_engine/gui_static/account/api-keys/index.txt +27 -0
- ciris_engine/gui_static/account/consent/index.html +1 -0
- ciris_engine/gui_static/account/consent/index.txt +27 -0
- ciris_engine/gui_static/account/index.html +1 -0
- ciris_engine/gui_static/account/index.txt +27 -0
- ciris_engine/gui_static/account/privacy/index.html +1 -0
- ciris_engine/gui_static/account/privacy/index.txt +27 -0
- ciris_engine/gui_static/account/settings/index.html +1 -0
- ciris_engine/gui_static/account/settings/index.txt +27 -0
- ciris_engine/gui_static/adapters/index.html +1 -0
- ciris_engine/gui_static/adapters/index.txt +27 -0
- ciris_engine/gui_static/agents/index.html +1 -0
- ciris_engine/gui_static/agents/index.txt +27 -0
- ciris_engine/gui_static/andrew-roberts-euBRXcx57T4-unsplash.jpg +0 -0
- ciris_engine/gui_static/api-demo/index.html +1 -0
- ciris_engine/gui_static/api-demo/index.txt +27 -0
- ciris_engine/gui_static/audit/index.html +1 -0
- ciris_engine/gui_static/audit/index.txt +27 -0
- ciris_engine/gui_static/billing/index.html +1 -0
- ciris_engine/gui_static/billing/index.txt +27 -0
- ciris_engine/gui_static/blurryinfo.png +0 -0
- ciris_engine/gui_static/chip-vincent-PkQDwfl9Flc-unsplash.jpg +0 -0
- ciris_engine/gui_static/ciris-architecture.svg +338 -0
- ciris_engine/gui_static/comms/index.html +1 -0
- ciris_engine/gui_static/comms/index.txt +27 -0
- ciris_engine/gui_static/config/index.html +1 -0
- ciris_engine/gui_static/config/index.txt +27 -0
- ciris_engine/gui_static/consent/index.html +1 -0
- ciris_engine/gui_static/consent/index.txt +27 -0
- ciris_engine/gui_static/dashboard/index.html +1 -0
- ciris_engine/gui_static/dashboard/index.txt +27 -0
- ciris_engine/gui_static/docs/index.html +1 -0
- ciris_engine/gui_static/docs/index.txt +27 -0
- ciris_engine/gui_static/eric.png +0 -0
- ciris_engine/gui_static/file.svg +1 -0
- ciris_engine/gui_static/globe.svg +1 -0
- ciris_engine/gui_static/index.html +1 -0
- ciris_engine/gui_static/index.txt +27 -0
- ciris_engine/gui_static/infogfx-1@2x.png +0 -0
- ciris_engine/gui_static/infogfx-2.png +0 -0
- ciris_engine/gui_static/infogfx-dark-1.png +0 -0
- ciris_engine/gui_static/kelly-vohs-soSTXmIxTDU-unsplash.jpg +0 -0
- ciris_engine/gui_static/login/index.html +1 -0
- ciris_engine/gui_static/login/index.txt +27 -0
- ciris_engine/gui_static/logs/index.html +1 -0
- ciris_engine/gui_static/logs/index.txt +27 -0
- ciris_engine/gui_static/memory/index.html +1 -0
- ciris_engine/gui_static/memory/index.txt +27 -0
- ciris_engine/gui_static/nathan-farrish-ArcTfEoBgzs-unsplash.jpg +0 -0
- ciris_engine/gui_static/next.svg +1 -0
- ciris_engine/gui_static/overview.svg +512 -0
- ciris_engine/gui_static/overview1.svg +407 -0
- ciris_engine/gui_static/overview2.svg +370 -0
- ciris_engine/gui_static/pipeline-visualization.svg +278 -0
- ciris_engine/gui_static/privacy-policy.html +160 -0
- ciris_engine/gui_static/runtime/index.html +8 -0
- ciris_engine/gui_static/runtime/index.txt +27 -0
- ciris_engine/gui_static/services/index.html +1 -0
- ciris_engine/gui_static/services/index.txt +27 -0
- ciris_engine/gui_static/sessions/index.html +1 -0
- ciris_engine/gui_static/sessions/index.txt +27 -0
- ciris_engine/gui_static/setup/index.html +1 -0
- ciris_engine/gui_static/setup/index.txt +27 -0
- ciris_engine/gui_static/status-dashboard/index.html +1 -0
- ciris_engine/gui_static/status-dashboard/index.txt +27 -0
- ciris_engine/gui_static/system/index.html +1 -0
- ciris_engine/gui_static/system/index.txt +27 -0
- ciris_engine/gui_static/terms-of-service.html +174 -0
- ciris_engine/gui_static/test-auth/index.html +1 -0
- ciris_engine/gui_static/test-auth/index.txt +27 -0
- ciris_engine/gui_static/test-login/index.html +1 -0
- ciris_engine/gui_static/test-login/index.txt +27 -0
- ciris_engine/gui_static/test-sdk/index.html +1 -0
- ciris_engine/gui_static/test-sdk/index.txt +27 -0
- ciris_engine/gui_static/tools/index.html +1 -0
- ciris_engine/gui_static/tools/index.txt +27 -0
- ciris_engine/gui_static/users/index.html +1 -0
- ciris_engine/gui_static/users/index.txt +27 -0
- ciris_engine/gui_static/vercel.svg +1 -0
- ciris_engine/gui_static/videos/video1.mp4 +0 -0
- ciris_engine/gui_static/videos/video3.mp4 +0 -0
- ciris_engine/gui_static/wa/index.html +1 -0
- ciris_engine/gui_static/wa/index.txt +27 -0
- ciris_engine/gui_static/window.svg +1 -0
- ciris_engine/logic/__init__.py +8 -0
- ciris_engine/logic/adapters/__init__.py +74 -0
- ciris_engine/logic/adapters/api/__init__.py +5 -0
- ciris_engine/logic/adapters/api/adapter.py +1037 -0
- ciris_engine/logic/adapters/api/api_communication.py +370 -0
- ciris_engine/logic/adapters/api/api_document.py +330 -0
- ciris_engine/logic/adapters/api/api_observer.py +24 -0
- ciris_engine/logic/adapters/api/api_runtime_control.py +388 -0
- ciris_engine/logic/adapters/api/api_tools.py +299 -0
- ciris_engine/logic/adapters/api/api_vision.py +215 -0
- ciris_engine/logic/adapters/api/app.py +272 -0
- ciris_engine/logic/adapters/api/auth.py +159 -0
- ciris_engine/logic/adapters/api/config.py +101 -0
- ciris_engine/logic/adapters/api/constants.py +55 -0
- ciris_engine/logic/adapters/api/dependencies/__init__.py +1 -0
- ciris_engine/logic/adapters/api/dependencies/auth.py +260 -0
- ciris_engine/logic/adapters/api/endpoints/__init__.py +1 -0
- ciris_engine/logic/adapters/api/endpoints/emergency.py +86 -0
- ciris_engine/logic/adapters/api/middleware/__init__.py +1 -0
- ciris_engine/logic/adapters/api/middleware/rate_limiter.py +302 -0
- ciris_engine/logic/adapters/api/models.py +29 -0
- ciris_engine/logic/adapters/api/routes/__init__.py +52 -0
- ciris_engine/logic/adapters/api/routes/agent.py +1762 -0
- ciris_engine/logic/adapters/api/routes/audit.py +707 -0
- ciris_engine/logic/adapters/api/routes/auth.py +1745 -0
- ciris_engine/logic/adapters/api/routes/billing.py +895 -0
- ciris_engine/logic/adapters/api/routes/config.py +329 -0
- ciris_engine/logic/adapters/api/routes/connectors.py +534 -0
- ciris_engine/logic/adapters/api/routes/consent.py +637 -0
- ciris_engine/logic/adapters/api/routes/dsar.py +637 -0
- ciris_engine/logic/adapters/api/routes/dsar_multi_source.py +484 -0
- ciris_engine/logic/adapters/api/routes/emergency.py +302 -0
- ciris_engine/logic/adapters/api/routes/memory.py +733 -0
- ciris_engine/logic/adapters/api/routes/memory_filters.py +230 -0
- ciris_engine/logic/adapters/api/routes/memory_models.py +112 -0
- ciris_engine/logic/adapters/api/routes/memory_queries.py +236 -0
- ciris_engine/logic/adapters/api/routes/memory_query_helpers.py +394 -0
- ciris_engine/logic/adapters/api/routes/memory_visualization.py +359 -0
- ciris_engine/logic/adapters/api/routes/memory_visualization_helpers.py +110 -0
- ciris_engine/logic/adapters/api/routes/partnership.py +541 -0
- ciris_engine/logic/adapters/api/routes/setup.py +1374 -0
- ciris_engine/logic/adapters/api/routes/system.py +3049 -0
- ciris_engine/logic/adapters/api/routes/system_extensions.py +952 -0
- ciris_engine/logic/adapters/api/routes/telemetry.py +1987 -0
- ciris_engine/logic/adapters/api/routes/telemetry_converters.py +141 -0
- ciris_engine/logic/adapters/api/routes/telemetry_helpers.py +111 -0
- ciris_engine/logic/adapters/api/routes/telemetry_logs_reader.py +280 -0
- ciris_engine/logic/adapters/api/routes/telemetry_metrics.py +131 -0
- ciris_engine/logic/adapters/api/routes/telemetry_models.py +190 -0
- ciris_engine/logic/adapters/api/routes/telemetry_otlp.py +878 -0
- ciris_engine/logic/adapters/api/routes/telemetry_resource_helpers.py +191 -0
- ciris_engine/logic/adapters/api/routes/tickets.py +541 -0
- ciris_engine/logic/adapters/api/routes/tools.py +556 -0
- ciris_engine/logic/adapters/api/routes/transparency.py +281 -0
- ciris_engine/logic/adapters/api/routes/users.py +981 -0
- ciris_engine/logic/adapters/api/routes/verification.py +373 -0
- ciris_engine/logic/adapters/api/routes/wa.py +369 -0
- ciris_engine/logic/adapters/api/service_configuration.py +177 -0
- ciris_engine/logic/adapters/api/services/__init__.py +1 -0
- ciris_engine/logic/adapters/api/services/auth_service.py +1417 -0
- ciris_engine/logic/adapters/api/services/oauth_security.py +68 -0
- ciris_engine/logic/adapters/base.py +141 -0
- ciris_engine/logic/adapters/base_adapter.py +73 -0
- ciris_engine/logic/adapters/base_observer.py +1141 -0
- ciris_engine/logic/adapters/base_vision.py +312 -0
- ciris_engine/logic/adapters/cirisnode_client.py +307 -0
- ciris_engine/logic/adapters/cli/__init__.py +3 -0
- ciris_engine/logic/adapters/cli/adapter.py +207 -0
- ciris_engine/logic/adapters/cli/cli_adapter.py +902 -0
- ciris_engine/logic/adapters/cli/cli_observer.py +268 -0
- ciris_engine/logic/adapters/cli/cli_tools.py +427 -0
- ciris_engine/logic/adapters/cli/cli_wa_service.py +134 -0
- ciris_engine/logic/adapters/cli/config.py +73 -0
- ciris_engine/logic/adapters/discord/__init__.py +3 -0
- ciris_engine/logic/adapters/discord/adapter.py +783 -0
- ciris_engine/logic/adapters/discord/ciris_discord_client.py +159 -0
- ciris_engine/logic/adapters/discord/config.py +177 -0
- ciris_engine/logic/adapters/discord/constants.py +185 -0
- ciris_engine/logic/adapters/discord/discord-stubs.pyi +50 -0
- ciris_engine/logic/adapters/discord/discord_adapter.py +1584 -0
- ciris_engine/logic/adapters/discord/discord_audit.py +150 -0
- ciris_engine/logic/adapters/discord/discord_channel_manager.py +351 -0
- ciris_engine/logic/adapters/discord/discord_connection_manager.py +313 -0
- ciris_engine/logic/adapters/discord/discord_embed_formatter.py +369 -0
- ciris_engine/logic/adapters/discord/discord_error_classifier.py +302 -0
- ciris_engine/logic/adapters/discord/discord_error_handler.py +316 -0
- ciris_engine/logic/adapters/discord/discord_guidance_handler.py +460 -0
- ciris_engine/logic/adapters/discord/discord_message_handler.py +207 -0
- ciris_engine/logic/adapters/discord/discord_observer.py +670 -0
- ciris_engine/logic/adapters/discord/discord_rate_limiter.py +249 -0
- ciris_engine/logic/adapters/discord/discord_reaction_handler.py +278 -0
- ciris_engine/logic/adapters/discord/discord_tool_handler.py +465 -0
- ciris_engine/logic/adapters/discord/discord_tool_service.py +790 -0
- ciris_engine/logic/adapters/discord/discord_tools.py +90 -0
- ciris_engine/logic/adapters/discord/discord_vision_helper.py +148 -0
- ciris_engine/logic/adapters/discord/py.typed +0 -0
- ciris_engine/logic/adapters/document_parser.py +320 -0
- ciris_engine/logic/audit/__init__.py +10 -0
- ciris_engine/logic/audit/hash_chain.py +313 -0
- ciris_engine/logic/audit/signature_manager.py +352 -0
- ciris_engine/logic/audit/verifier.py +408 -0
- ciris_engine/logic/buses/__init__.py +21 -0
- ciris_engine/logic/buses/base_bus.py +178 -0
- ciris_engine/logic/buses/bus_manager.py +121 -0
- ciris_engine/logic/buses/communication_bus.py +387 -0
- ciris_engine/logic/buses/llm_bus.py +722 -0
- ciris_engine/logic/buses/memory_bus.py +577 -0
- ciris_engine/logic/buses/prohibitions.py +502 -0
- ciris_engine/logic/buses/runtime_control_bus.py +539 -0
- ciris_engine/logic/buses/tool_bus.py +482 -0
- ciris_engine/logic/buses/wise_bus.py +684 -0
- ciris_engine/logic/config/__init__.py +25 -0
- ciris_engine/logic/config/bootstrap.py +255 -0
- ciris_engine/logic/config/config_accessor.py +202 -0
- ciris_engine/logic/config/db_paths.py +194 -0
- ciris_engine/logic/config/env_utils.py +39 -0
- ciris_engine/logic/conscience/__init__.py +16 -0
- ciris_engine/logic/conscience/build_deferral_package.py +0 -0
- ciris_engine/logic/conscience/core.py +688 -0
- ciris_engine/logic/conscience/interface.py +33 -0
- ciris_engine/logic/conscience/registry.py +76 -0
- ciris_engine/logic/conscience/thought_depth_guardrail.py +231 -0
- ciris_engine/logic/conscience/updated_status_conscience.py +156 -0
- ciris_engine/logic/context/__init__.py +10 -0
- ciris_engine/logic/context/batch_context.py +550 -0
- ciris_engine/logic/context/builder.py +149 -0
- ciris_engine/logic/context/channel_resolution.py +136 -0
- ciris_engine/logic/context/secrets_snapshot.py +52 -0
- ciris_engine/logic/context/system_snapshot.py +116 -0
- ciris_engine/logic/context/system_snapshot_helpers.py +1651 -0
- ciris_engine/logic/covenant/__init__.py +33 -0
- ciris_engine/logic/covenant/executor.py +303 -0
- ciris_engine/logic/covenant/extractor.py +382 -0
- ciris_engine/logic/covenant/handler.py +241 -0
- ciris_engine/logic/covenant/verifier.py +383 -0
- ciris_engine/logic/dma/__init__.py +15 -0
- ciris_engine/logic/dma/action_selection/__init__.py +11 -0
- ciris_engine/logic/dma/action_selection/action_instruction_generator.py +444 -0
- ciris_engine/logic/dma/action_selection/context_builder.py +508 -0
- ciris_engine/logic/dma/action_selection/faculty_integration.py +193 -0
- ciris_engine/logic/dma/action_selection/special_cases.py +132 -0
- ciris_engine/logic/dma/action_selection_pdma.py +365 -0
- ciris_engine/logic/dma/base_dma.py +335 -0
- ciris_engine/logic/dma/csdma.py +239 -0
- ciris_engine/logic/dma/dma_executor.py +575 -0
- ciris_engine/logic/dma/dsdma_base.py +410 -0
- ciris_engine/logic/dma/exceptions.py +4 -0
- ciris_engine/logic/dma/factory.py +150 -0
- ciris_engine/logic/dma/pdma.py +120 -0
- ciris_engine/logic/dma/prompt_loader.py +189 -0
- ciris_engine/logic/dma/prompts/action_selection_pdma.yml +58 -0
- ciris_engine/logic/dma/prompts/csdma_common_sense.yml +28 -0
- ciris_engine/logic/dma/prompts/dsdma_base.yml +17 -0
- ciris_engine/logic/dma/prompts/pdma_ethical.yml +42 -0
- ciris_engine/logic/formatters/__init__.py +26 -0
- ciris_engine/logic/formatters/crisis_resources.py +80 -0
- ciris_engine/logic/formatters/escalation.py +21 -0
- ciris_engine/logic/formatters/identity.py +224 -0
- ciris_engine/logic/formatters/prompt_blocks.py +64 -0
- ciris_engine/logic/formatters/system_snapshot.py +193 -0
- ciris_engine/logic/formatters/user_profiles.py +108 -0
- ciris_engine/logic/handlers/__init__.py +1 -0
- ciris_engine/logic/handlers/control/__init__.py +1 -0
- ciris_engine/logic/handlers/control/defer_handler.py +195 -0
- ciris_engine/logic/handlers/control/ponder_handler.py +154 -0
- ciris_engine/logic/handlers/control/reject_handler.py +81 -0
- ciris_engine/logic/handlers/external/__init__.py +1 -0
- ciris_engine/logic/handlers/external/observe_handler.py +154 -0
- ciris_engine/logic/handlers/external/speak_handler.py +250 -0
- ciris_engine/logic/handlers/external/tool_handler.py +148 -0
- ciris_engine/logic/handlers/memory/__init__.py +1 -0
- ciris_engine/logic/handlers/memory/forget_handler.py +107 -0
- ciris_engine/logic/handlers/memory/memorize_handler.py +391 -0
- ciris_engine/logic/handlers/memory/recall_handler.py +213 -0
- ciris_engine/logic/handlers/terminal/__init__.py +1 -0
- ciris_engine/logic/handlers/terminal/task_complete_handler.py +299 -0
- ciris_engine/logic/infrastructure/__init__.py +1 -0
- ciris_engine/logic/infrastructure/handlers/__init__.py +8 -0
- ciris_engine/logic/infrastructure/handlers/action_dispatcher.py +382 -0
- ciris_engine/logic/infrastructure/handlers/base_handler.py +450 -0
- ciris_engine/logic/infrastructure/handlers/exceptions.py +2 -0
- ciris_engine/logic/infrastructure/handlers/handler_registry.py +59 -0
- ciris_engine/logic/infrastructure/handlers/helpers.py +55 -0
- ciris_engine/logic/infrastructure/step_streaming.py +149 -0
- ciris_engine/logic/infrastructure/sub_services/__init__.py +1 -0
- ciris_engine/logic/infrastructure/sub_services/identity_variance_monitor.py +1035 -0
- ciris_engine/logic/infrastructure/sub_services/pattern_analysis_loop.py +758 -0
- ciris_engine/logic/infrastructure/sub_services/wa_cli_bootstrap.py +229 -0
- ciris_engine/logic/infrastructure/sub_services/wa_cli_display.py +176 -0
- ciris_engine/logic/infrastructure/sub_services/wa_cli_oauth.py +404 -0
- ciris_engine/logic/infrastructure/sub_services/wa_cli_wizard.py +181 -0
- ciris_engine/logic/persistence/__init__.py +130 -0
- ciris_engine/logic/persistence/analytics.py +97 -0
- ciris_engine/logic/persistence/db/__init__.py +28 -0
- ciris_engine/logic/persistence/db/core.py +520 -0
- ciris_engine/logic/persistence/db/dialect.py +380 -0
- ciris_engine/logic/persistence/db/execution_helpers.py +216 -0
- ciris_engine/logic/persistence/db/migration_runner.py +191 -0
- ciris_engine/logic/persistence/db/operations.py +313 -0
- ciris_engine/logic/persistence/db/query_builder.py +232 -0
- ciris_engine/logic/persistence/db/retry.py +154 -0
- ciris_engine/logic/persistence/db/setup.py +18 -0
- ciris_engine/logic/persistence/migrations/postgres/001_initial_schema.sql +4 -0
- ciris_engine/logic/persistence/migrations/postgres/002_add_retry_status.sql +3 -0
- ciris_engine/logic/persistence/migrations/postgres/003_add_task_update_tracking.sql +8 -0
- ciris_engine/logic/persistence/migrations/postgres/004_add_occurrence_id.sql +54 -0
- ciris_engine/logic/persistence/migrations/postgres/005_add_consolidation_locks.sql +22 -0
- ciris_engine/logic/persistence/migrations/postgres/006_add_correlation_id_unique_index.sql +16 -0
- ciris_engine/logic/persistence/migrations/postgres/007_add_dsar_tickets.sql +39 -0
- ciris_engine/logic/persistence/migrations/postgres/008_rename_to_tickets_add_sop.sql +123 -0
- ciris_engine/logic/persistence/migrations/postgres/009_add_ticket_status_columns.sql +39 -0
- ciris_engine/logic/persistence/migrations/postgres/010_add_images_to_tasks.sql +5 -0
- ciris_engine/logic/persistence/migrations/sqlite/001_initial_schema.sql +357 -0
- ciris_engine/logic/persistence/migrations/sqlite/002_add_retry_status.sql +3 -0
- ciris_engine/logic/persistence/migrations/sqlite/003_add_task_update_tracking.sql +8 -0
- ciris_engine/logic/persistence/migrations/sqlite/004_add_occurrence_id.sql +45 -0
- ciris_engine/logic/persistence/migrations/sqlite/005_add_consolidation_locks.sql +22 -0
- ciris_engine/logic/persistence/migrations/sqlite/006_add_correlation_id_unique_index.sql +16 -0
- ciris_engine/logic/persistence/migrations/sqlite/007_add_dsar_tickets.sql +39 -0
- ciris_engine/logic/persistence/migrations/sqlite/008_rename_to_tickets_add_sop.sql +120 -0
- ciris_engine/logic/persistence/migrations/sqlite/009_add_ticket_status_columns.sql +129 -0
- ciris_engine/logic/persistence/migrations/sqlite/010_add_images_to_tasks.sql +17 -0
- ciris_engine/logic/persistence/models/__init__.py +141 -0
- ciris_engine/logic/persistence/models/correlations.py +881 -0
- ciris_engine/logic/persistence/models/deferral.py +68 -0
- ciris_engine/logic/persistence/models/dsar.py +286 -0
- ciris_engine/logic/persistence/models/graph.py +362 -0
- ciris_engine/logic/persistence/models/identity.py +264 -0
- ciris_engine/logic/persistence/models/queue_status.py +139 -0
- ciris_engine/logic/persistence/models/tasks.py +1043 -0
- ciris_engine/logic/persistence/models/thoughts.py +400 -0
- ciris_engine/logic/persistence/models/tickets.py +518 -0
- ciris_engine/logic/persistence/stores/__init__.py +13 -0
- ciris_engine/logic/persistence/stores/auth_helpers.py +117 -0
- ciris_engine/logic/persistence/stores/authentication_store.py +414 -0
- ciris_engine/logic/persistence/utils.py +212 -0
- ciris_engine/logic/processors/__init__.py +30 -0
- ciris_engine/logic/processors/core/__init__.py +1 -0
- ciris_engine/logic/processors/core/base_processor.py +280 -0
- ciris_engine/logic/processors/core/main_processor.py +1777 -0
- ciris_engine/logic/processors/core/step_decorators.py +1583 -0
- ciris_engine/logic/processors/core/thought_processor/__init__.py +20 -0
- ciris_engine/logic/processors/core/thought_processor/action_execution.py +49 -0
- ciris_engine/logic/processors/core/thought_processor/conscience_execution.py +382 -0
- ciris_engine/logic/processors/core/thought_processor/finalize_action.py +66 -0
- ciris_engine/logic/processors/core/thought_processor/gather_context.py +120 -0
- ciris_engine/logic/processors/core/thought_processor/main.py +920 -0
- ciris_engine/logic/processors/core/thought_processor/perform_aspdma.py +86 -0
- ciris_engine/logic/processors/core/thought_processor/perform_dmas.py +106 -0
- ciris_engine/logic/processors/core/thought_processor/recursive_processing.py +237 -0
- ciris_engine/logic/processors/core/thought_processor/round_complete.py +52 -0
- ciris_engine/logic/processors/core/thought_processor/start_round.py +64 -0
- ciris_engine/logic/processors/exceptions.py +59 -0
- ciris_engine/logic/processors/states/__init__.py +1 -0
- ciris_engine/logic/processors/states/dream_processor.py +1381 -0
- ciris_engine/logic/processors/states/play_processor.py +141 -0
- ciris_engine/logic/processors/states/shutdown_processor.py +623 -0
- ciris_engine/logic/processors/states/solitude_processor.py +305 -0
- ciris_engine/logic/processors/states/wakeup_processor.py +802 -0
- ciris_engine/logic/processors/states/work_processor.py +742 -0
- ciris_engine/logic/processors/support/__init__.py +1 -0
- ciris_engine/logic/processors/support/dma_orchestrator.py +336 -0
- ciris_engine/logic/processors/support/processing_queue.py +133 -0
- ciris_engine/logic/processors/support/shutdown_condition_evaluator.py +294 -0
- ciris_engine/logic/processors/support/state_manager.py +358 -0
- ciris_engine/logic/processors/support/task_manager.py +303 -0
- ciris_engine/logic/processors/support/thought_escalation.py +116 -0
- ciris_engine/logic/processors/support/thought_manager.py +328 -0
- ciris_engine/logic/processors/support/thought_manager_enhanced.py +105 -0
- ciris_engine/logic/registries/__init__.py +34 -0
- ciris_engine/logic/registries/base.py +653 -0
- ciris_engine/logic/registries/circuit_breaker.py +275 -0
- ciris_engine/logic/registries/typed_registries.py +184 -0
- ciris_engine/logic/runtime/__init__.py +7 -0
- ciris_engine/logic/runtime/adapter_loader.py +261 -0
- ciris_engine/logic/runtime/adapter_manager.py +1053 -0
- ciris_engine/logic/runtime/ciris_runtime.py +2342 -0
- ciris_engine/logic/runtime/ciris_runtime_helpers.py +923 -0
- ciris_engine/logic/runtime/component_builder.py +361 -0
- ciris_engine/logic/runtime/identity_manager.py +219 -0
- ciris_engine/logic/runtime/module_loader.py +207 -0
- ciris_engine/logic/runtime/prevent_sideeffects.py +30 -0
- ciris_engine/logic/runtime/runtime_interface.py +23 -0
- ciris_engine/logic/runtime/service_initializer.py +1623 -0
- ciris_engine/logic/secrets/__init__.py +30 -0
- ciris_engine/logic/secrets/encryption.py +175 -0
- ciris_engine/logic/secrets/filter.py +295 -0
- ciris_engine/logic/secrets/service.py +652 -0
- ciris_engine/logic/secrets/store.py +669 -0
- ciris_engine/logic/services/__init__.py +1 -0
- ciris_engine/logic/services/adaptation/__init__.py +3 -0
- ciris_engine/logic/services/base_graph_service.py +142 -0
- ciris_engine/logic/services/base_infrastructure_service.py +69 -0
- ciris_engine/logic/services/base_scheduled_service.py +136 -0
- ciris_engine/logic/services/base_service.py +247 -0
- ciris_engine/logic/services/governance/__init__.py +3 -0
- ciris_engine/logic/services/governance/adaptive_filter/__init__.py +14 -0
- ciris_engine/logic/services/governance/adaptive_filter/service.py +818 -0
- ciris_engine/logic/services/governance/consent/__init__.py +53 -0
- ciris_engine/logic/services/governance/consent/air.py +403 -0
- ciris_engine/logic/services/governance/consent/decay.py +324 -0
- ciris_engine/logic/services/governance/consent/dsar_automation.py +589 -0
- ciris_engine/logic/services/governance/consent/exceptions.py +106 -0
- ciris_engine/logic/services/governance/consent/metrics.py +270 -0
- ciris_engine/logic/services/governance/consent/partnership.py +533 -0
- ciris_engine/logic/services/governance/consent/service.py +1256 -0
- ciris_engine/logic/services/governance/dsar/__init__.py +29 -0
- ciris_engine/logic/services/governance/dsar/orchestrator.py +977 -0
- ciris_engine/logic/services/governance/dsar/schemas.py +141 -0
- ciris_engine/logic/services/governance/dsar/signature_service.py +283 -0
- ciris_engine/logic/services/governance/self_observation/__init__.py +20 -0
- ciris_engine/logic/services/governance/self_observation/service.py +1153 -0
- ciris_engine/logic/services/governance/visibility/__init__.py +17 -0
- ciris_engine/logic/services/governance/visibility/service.py +512 -0
- ciris_engine/logic/services/governance/wise_authority/__init__.py +15 -0
- ciris_engine/logic/services/governance/wise_authority/service.py +827 -0
- ciris_engine/logic/services/graph/__init__.py +5 -0
- ciris_engine/logic/services/graph/audit_service/__init__.py +5 -0
- ciris_engine/logic/services/graph/audit_service/service.py +1675 -0
- ciris_engine/logic/services/graph/base.py +208 -0
- ciris_engine/logic/services/graph/config_service/__init__.py +5 -0
- ciris_engine/logic/services/graph/config_service/service.py +372 -0
- ciris_engine/logic/services/graph/incident_service/__init__.py +5 -0
- ciris_engine/logic/services/graph/incident_service/service.py +803 -0
- ciris_engine/logic/services/graph/memory_service.py +1120 -0
- ciris_engine/logic/services/graph/telemetry_service/__init__.py +5 -0
- ciris_engine/logic/services/graph/telemetry_service/exceptions.py +104 -0
- ciris_engine/logic/services/graph/telemetry_service/helpers.py +1337 -0
- ciris_engine/logic/services/graph/telemetry_service/service.py +2429 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/__init__.py +17 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/aggregation_helpers.py +355 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/cleanup_helpers.py +438 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/compressor.py +260 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/__init__.py +27 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/audit.py +326 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/conversation.py +291 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/memory.py +197 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/metrics.py +251 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/task.py +257 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/consolidators/trace.py +363 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/data_converter.py +545 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/date_calculation_helpers.py +193 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/db_query_helpers.py +296 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/edge_helpers.py +92 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/edge_manager.py +896 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/extensive_helpers.py +322 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/period_manager.py +152 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/profound_helpers.py +277 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/query_manager.py +812 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/service.py +1692 -0
- ciris_engine/logic/services/graph/tsdb_consolidation/sql_builders.py +363 -0
- ciris_engine/logic/services/infrastructure/__init__.py +1 -0
- ciris_engine/logic/services/infrastructure/authentication/__init__.py +5 -0
- ciris_engine/logic/services/infrastructure/authentication/service.py +1634 -0
- ciris_engine/logic/services/infrastructure/database_maintenance/__init__.py +15 -0
- ciris_engine/logic/services/infrastructure/database_maintenance/service.py +764 -0
- ciris_engine/logic/services/infrastructure/resource_monitor/__init__.py +7 -0
- ciris_engine/logic/services/infrastructure/resource_monitor/ciris_billing_provider.py +755 -0
- ciris_engine/logic/services/infrastructure/resource_monitor/service.py +409 -0
- ciris_engine/logic/services/infrastructure/resource_monitor/simple_credit_provider.py +129 -0
- ciris_engine/logic/services/lifecycle/__init__.py +3 -0
- ciris_engine/logic/services/lifecycle/initialization/__init__.py +10 -0
- ciris_engine/logic/services/lifecycle/initialization/service.py +312 -0
- ciris_engine/logic/services/lifecycle/scheduler/__init__.py +5 -0
- ciris_engine/logic/services/lifecycle/scheduler/service.py +607 -0
- ciris_engine/logic/services/lifecycle/shutdown/__init__.py +9 -0
- ciris_engine/logic/services/lifecycle/shutdown/service.py +378 -0
- ciris_engine/logic/services/lifecycle/time/__init__.py +15 -0
- ciris_engine/logic/services/lifecycle/time/service.py +259 -0
- ciris_engine/logic/services/memory_service/__init__.py +8 -0
- ciris_engine/logic/services/mixins/__init__.py +13 -0
- ciris_engine/logic/services/mixins/example_usage.py +200 -0
- ciris_engine/logic/services/mixins/request_metrics.py +179 -0
- ciris_engine/logic/services/runtime/__init__.py +3 -0
- ciris_engine/logic/services/runtime/adapter_configuration/__init__.py +16 -0
- ciris_engine/logic/services/runtime/adapter_configuration/service.py +674 -0
- ciris_engine/logic/services/runtime/adapter_configuration/session.py +67 -0
- ciris_engine/logic/services/runtime/control_service/__init__.py +5 -0
- ciris_engine/logic/services/runtime/control_service/service.py +2269 -0
- ciris_engine/logic/services/runtime/llm_service/__init__.py +14 -0
- ciris_engine/logic/services/runtime/llm_service/pricing_calculator.py +279 -0
- ciris_engine/logic/services/runtime/llm_service/service.py +930 -0
- ciris_engine/logic/services/tools/__init__.py +5 -0
- ciris_engine/logic/services/tools/core_tool_service/__init__.py +8 -0
- ciris_engine/logic/services/tools/core_tool_service/service.py +852 -0
- ciris_engine/logic/setup/__init__.py +1 -0
- ciris_engine/logic/setup/first_run.py +250 -0
- ciris_engine/logic/setup/wizard.py +327 -0
- ciris_engine/logic/telemetry/__init__.py +46 -0
- ciris_engine/logic/telemetry/core.py +239 -0
- ciris_engine/logic/telemetry/hot_cold_config.py +133 -0
- ciris_engine/logic/telemetry/log_collector.py +190 -0
- ciris_engine/logic/telemetry/resource_monitor.py +7 -0
- ciris_engine/logic/telemetry/security.py +79 -0
- ciris_engine/logic/utils/__init__.py +18 -0
- ciris_engine/logic/utils/channel_utils.py +75 -0
- ciris_engine/logic/utils/consent/__init__.py +1 -0
- ciris_engine/logic/utils/consent/partnership_utils.py +172 -0
- ciris_engine/logic/utils/constants.py +92 -0
- ciris_engine/logic/utils/context_utils.py +145 -0
- ciris_engine/logic/utils/directory_setup.py +533 -0
- ciris_engine/logic/utils/graphql_context_provider.py +152 -0
- ciris_engine/logic/utils/identity_resolution.py +843 -0
- ciris_engine/logic/utils/incident_capture_handler.py +303 -0
- ciris_engine/logic/utils/initialization_manager.py +74 -0
- ciris_engine/logic/utils/jsondict_helpers.py +290 -0
- ciris_engine/logic/utils/log_sanitizer.py +97 -0
- ciris_engine/logic/utils/logging_config.py +151 -0
- ciris_engine/logic/utils/observability_decorators.py +544 -0
- ciris_engine/logic/utils/occurrence_utils.py +155 -0
- ciris_engine/logic/utils/path_resolution.py +281 -0
- ciris_engine/logic/utils/platform_detection.py +286 -0
- ciris_engine/logic/utils/privacy.py +266 -0
- ciris_engine/logic/utils/profile_loader.py +124 -0
- ciris_engine/logic/utils/profile_manager.py +16 -0
- ciris_engine/logic/utils/runtime_utils.py +69 -0
- ciris_engine/logic/utils/shutdown_manager.py +107 -0
- ciris_engine/logic/utils/task_formatters.py +60 -0
- ciris_engine/logic/utils/task_thought_factory.py +404 -0
- ciris_engine/logic/utils/thought_utils.py +54 -0
- ciris_engine/logic/utils/user_utils.py +70 -0
- ciris_engine/protocols/__init__.py +0 -0
- ciris_engine/protocols/adapters/__init__.py +35 -0
- ciris_engine/protocols/adapters/base.py +149 -0
- ciris_engine/protocols/adapters/configurable.py +265 -0
- ciris_engine/protocols/adapters/message.py +90 -0
- ciris_engine/protocols/audit/__init__.py +1 -0
- ciris_engine/protocols/buses/__init__.py +1 -0
- ciris_engine/protocols/config/__init__.py +1 -0
- ciris_engine/protocols/conscience/__init__.py +1 -0
- ciris_engine/protocols/consent.py +88 -0
- ciris_engine/protocols/context/__init__.py +1 -0
- ciris_engine/protocols/data/__init__.py +1 -0
- ciris_engine/protocols/dma/__init__.py +1 -0
- ciris_engine/protocols/dma/base.py +107 -0
- ciris_engine/protocols/faculties.py +34 -0
- ciris_engine/protocols/formatters/__init__.py +1 -0
- ciris_engine/protocols/handlers/__init__.py +1 -0
- ciris_engine/protocols/infrastructure/__init__.py +25 -0
- ciris_engine/protocols/infrastructure/base.py +377 -0
- ciris_engine/protocols/persistence/__init__.py +1 -0
- ciris_engine/protocols/pipeline_control.py +609 -0
- ciris_engine/protocols/processors/__init__.py +19 -0
- ciris_engine/protocols/processors/agent.py +299 -0
- ciris_engine/protocols/processors/base.py +130 -0
- ciris_engine/protocols/processors/orchestration.py +62 -0
- ciris_engine/protocols/registries/__init__.py +1 -0
- ciris_engine/protocols/runtime/__init__.py +1 -0
- ciris_engine/protocols/runtime/base.py +163 -0
- ciris_engine/protocols/secrets/__init__.py +1 -0
- ciris_engine/protocols/services/__init__.py +80 -0
- ciris_engine/protocols/services/adaptation/__init__.py +7 -0
- ciris_engine/protocols/services/adaptation/self_observation.py +265 -0
- ciris_engine/protocols/services/governance/__init__.py +20 -0
- ciris_engine/protocols/services/governance/communication.py +58 -0
- ciris_engine/protocols/services/governance/filter.py +56 -0
- ciris_engine/protocols/services/governance/visibility.py +32 -0
- ciris_engine/protocols/services/governance/wa_auth.py +192 -0
- ciris_engine/protocols/services/governance/wise_authority.py +75 -0
- ciris_engine/protocols/services/graph/__init__.py +19 -0
- ciris_engine/protocols/services/graph/audit.py +92 -0
- ciris_engine/protocols/services/graph/config.py +54 -0
- ciris_engine/protocols/services/graph/incident_management.py +103 -0
- ciris_engine/protocols/services/graph/memory.py +110 -0
- ciris_engine/protocols/services/graph/telemetry.py +51 -0
- ciris_engine/protocols/services/graph/tsdb_consolidation.py +87 -0
- ciris_engine/protocols/services/infrastructure/__init__.py +11 -0
- ciris_engine/protocols/services/infrastructure/authentication.py +159 -0
- ciris_engine/protocols/services/infrastructure/credit_gate.py +46 -0
- ciris_engine/protocols/services/infrastructure/database_maintenance.py +25 -0
- ciris_engine/protocols/services/infrastructure/resource_monitor.py +83 -0
- ciris_engine/protocols/services/lifecycle/__init__.py +13 -0
- ciris_engine/protocols/services/lifecycle/initialization.py +41 -0
- ciris_engine/protocols/services/lifecycle/scheduler.py +42 -0
- ciris_engine/protocols/services/lifecycle/shutdown.py +50 -0
- ciris_engine/protocols/services/lifecycle/time.py +31 -0
- ciris_engine/protocols/services/runtime/__init__.py +13 -0
- ciris_engine/protocols/services/runtime/llm.py +50 -0
- ciris_engine/protocols/services/runtime/runtime_control.py +193 -0
- ciris_engine/protocols/services/runtime/secrets.py +100 -0
- ciris_engine/protocols/services/runtime/tool.py +123 -0
- ciris_engine/protocols/telemetry/__init__.py +1 -0
- ciris_engine/protocols/utils/__init__.py +1 -0
- ciris_engine/schemas/__init__.py +112 -0
- ciris_engine/schemas/actions/__init__.py +37 -0
- ciris_engine/schemas/actions/parameters.py +137 -0
- ciris_engine/schemas/adapters/__init__.py +13 -0
- ciris_engine/schemas/adapters/cirisnode.py +135 -0
- ciris_engine/schemas/adapters/cli.py +97 -0
- ciris_engine/schemas/adapters/cli_tools.py +98 -0
- ciris_engine/schemas/adapters/discord.py +125 -0
- ciris_engine/schemas/adapters/graphql_core.py +144 -0
- ciris_engine/schemas/adapters/registration.py +47 -0
- ciris_engine/schemas/adapters/runtime_context.py +48 -0
- ciris_engine/schemas/adapters/tool_execution.py +45 -0
- ciris_engine/schemas/adapters/tools.py +96 -0
- ciris_engine/schemas/api/__init__.py +1 -0
- ciris_engine/schemas/api/agent.py +50 -0
- ciris_engine/schemas/api/audit.py +38 -0
- ciris_engine/schemas/api/auth.py +351 -0
- ciris_engine/schemas/api/config_security.py +242 -0
- ciris_engine/schemas/api/emergency.py +111 -0
- ciris_engine/schemas/api/responses.py +72 -0
- ciris_engine/schemas/api/runtime.py +26 -0
- ciris_engine/schemas/api/telemetry.py +109 -0
- ciris_engine/schemas/api/wa.py +90 -0
- ciris_engine/schemas/audit/__init__.py +13 -0
- ciris_engine/schemas/audit/core.py +139 -0
- ciris_engine/schemas/audit/hash_chain.py +58 -0
- ciris_engine/schemas/audit/verification.py +131 -0
- ciris_engine/schemas/buses/__init__.py +1 -0
- ciris_engine/schemas/config/__init__.py +41 -0
- ciris_engine/schemas/config/agent.py +279 -0
- ciris_engine/schemas/config/cognitive_state_behaviors.py +194 -0
- ciris_engine/schemas/config/default_dsar_sops.py +178 -0
- ciris_engine/schemas/config/essential.py +195 -0
- ciris_engine/schemas/config/tickets.py +86 -0
- ciris_engine/schemas/conscience/__init__.py +25 -0
- ciris_engine/schemas/conscience/context.py +34 -0
- ciris_engine/schemas/conscience/core.py +145 -0
- ciris_engine/schemas/conscience/results.py +24 -0
- ciris_engine/schemas/consent/__init__.py +5 -0
- ciris_engine/schemas/consent/core.py +404 -0
- ciris_engine/schemas/context/__init__.py +1 -0
- ciris_engine/schemas/covenant.py +382 -0
- ciris_engine/schemas/data/__init__.py +1 -0
- ciris_engine/schemas/dma/__init__.py +16 -0
- ciris_engine/schemas/dma/core.py +199 -0
- ciris_engine/schemas/dma/faculty.py +192 -0
- ciris_engine/schemas/dma/prompts.py +172 -0
- ciris_engine/schemas/dma/results.py +103 -0
- ciris_engine/schemas/formatters/__init__.py +1 -0
- ciris_engine/schemas/handlers/__init__.py +10 -0
- ciris_engine/schemas/handlers/context.py +119 -0
- ciris_engine/schemas/handlers/contexts.py +100 -0
- ciris_engine/schemas/handlers/core.py +167 -0
- ciris_engine/schemas/handlers/memory_schemas.py +67 -0
- ciris_engine/schemas/handlers/schemas.py +95 -0
- ciris_engine/schemas/identity.py +149 -0
- ciris_engine/schemas/infrastructure/__init__.py +1 -0
- ciris_engine/schemas/infrastructure/base.py +256 -0
- ciris_engine/schemas/infrastructure/behavioral_patterns.py +129 -0
- ciris_engine/schemas/infrastructure/feedback_loop.py +57 -0
- ciris_engine/schemas/infrastructure/identity_variance.py +141 -0
- ciris_engine/schemas/infrastructure/oauth.py +175 -0
- ciris_engine/schemas/infrastructure/wa_cli_wizard.py +54 -0
- ciris_engine/schemas/persistence/__init__.py +34 -0
- ciris_engine/schemas/persistence/core.py +140 -0
- ciris_engine/schemas/persistence/correlations.py +73 -0
- ciris_engine/schemas/persistence/postgres/__init__.py +1 -0
- ciris_engine/schemas/persistence/postgres/tables.py +280 -0
- ciris_engine/schemas/persistence/sqlite/__init__.py +1 -0
- ciris_engine/schemas/persistence/sqlite/tables.py +281 -0
- ciris_engine/schemas/platform.py +149 -0
- ciris_engine/schemas/processors/__init__.py +26 -0
- ciris_engine/schemas/processors/base.py +130 -0
- ciris_engine/schemas/processors/cognitive.py +77 -0
- ciris_engine/schemas/processors/context.py +35 -0
- ciris_engine/schemas/processors/core.py +152 -0
- ciris_engine/schemas/processors/dma.py +105 -0
- ciris_engine/schemas/processors/error.py +122 -0
- ciris_engine/schemas/processors/main.py +109 -0
- ciris_engine/schemas/processors/phase_results.py +21 -0
- ciris_engine/schemas/processors/results.py +99 -0
- ciris_engine/schemas/processors/solitude.py +79 -0
- ciris_engine/schemas/processors/state.py +202 -0
- ciris_engine/schemas/processors/state_example.py +177 -0
- ciris_engine/schemas/processors/states.py +21 -0
- ciris_engine/schemas/processors/status.py +34 -0
- ciris_engine/schemas/registries/__init__.py +1 -0
- ciris_engine/schemas/registries/base.py +66 -0
- ciris_engine/schemas/resources/__init__.py +15 -0
- ciris_engine/schemas/resources/crisis.py +315 -0
- ciris_engine/schemas/runtime/__init__.py +42 -0
- ciris_engine/schemas/runtime/adapter_management.py +186 -0
- ciris_engine/schemas/runtime/api.py +58 -0
- ciris_engine/schemas/runtime/audit.py +50 -0
- ciris_engine/schemas/runtime/bootstrap.py +33 -0
- ciris_engine/schemas/runtime/contexts.py +61 -0
- ciris_engine/schemas/runtime/core.py +161 -0
- ciris_engine/schemas/runtime/enums.py +167 -0
- ciris_engine/schemas/runtime/extended.py +232 -0
- ciris_engine/schemas/runtime/manifest.py +311 -0
- ciris_engine/schemas/runtime/memory.py +60 -0
- ciris_engine/schemas/runtime/messages.py +108 -0
- ciris_engine/schemas/runtime/models.py +156 -0
- ciris_engine/schemas/runtime/processing_context.py +43 -0
- ciris_engine/schemas/runtime/protocols_core.py +96 -0
- ciris_engine/schemas/runtime/resources.py +33 -0
- ciris_engine/schemas/runtime/system_context.py +417 -0
- ciris_engine/schemas/secrets/__init__.py +1 -0
- ciris_engine/schemas/secrets/core.py +267 -0
- ciris_engine/schemas/secrets/service.py +95 -0
- ciris_engine/schemas/services/__init__.py +33 -0
- ciris_engine/schemas/services/audit_summary_node.py +172 -0
- ciris_engine/schemas/services/authority/__init__.py +39 -0
- ciris_engine/schemas/services/authority/jwt.py +158 -0
- ciris_engine/schemas/services/authority/wa_updates.py +138 -0
- ciris_engine/schemas/services/authority/wise_authority.py +163 -0
- ciris_engine/schemas/services/authority_core.py +370 -0
- ciris_engine/schemas/services/capabilities.py +72 -0
- ciris_engine/schemas/services/community_core.py +95 -0
- ciris_engine/schemas/services/context.py +111 -0
- ciris_engine/schemas/services/conversation_summary_node.py +189 -0
- ciris_engine/schemas/services/core/__init__.py +153 -0
- ciris_engine/schemas/services/core/runtime.py +262 -0
- ciris_engine/schemas/services/core/runtime_config.py +117 -0
- ciris_engine/schemas/services/core/secrets.py +65 -0
- ciris_engine/schemas/services/correlation_node.py +179 -0
- ciris_engine/schemas/services/credit_gate.py +92 -0
- ciris_engine/schemas/services/discord_nodes.py +299 -0
- ciris_engine/schemas/services/feedback_core.py +131 -0
- ciris_engine/schemas/services/filters_core.py +270 -0
- ciris_engine/schemas/services/governance.py +26 -0
- ciris_engine/schemas/services/graph/__init__.py +26 -0
- ciris_engine/schemas/services/graph/attributes.py +254 -0
- ciris_engine/schemas/services/graph/audit.py +98 -0
- ciris_engine/schemas/services/graph/consolidation.py +338 -0
- ciris_engine/schemas/services/graph/edge_types.py +43 -0
- ciris_engine/schemas/services/graph/edges.py +88 -0
- ciris_engine/schemas/services/graph/incident.py +312 -0
- ciris_engine/schemas/services/graph/memory.py +84 -0
- ciris_engine/schemas/services/graph/node_data.py +174 -0
- ciris_engine/schemas/services/graph/query_results.py +82 -0
- ciris_engine/schemas/services/graph/telemetry.py +250 -0
- ciris_engine/schemas/services/graph/tsdb_consolidation.py +27 -0
- ciris_engine/schemas/services/graph/tsdb_models.py +107 -0
- ciris_engine/schemas/services/graph_core.py +196 -0
- ciris_engine/schemas/services/graph_typed_nodes.py +194 -0
- ciris_engine/schemas/services/infrastructure/__init__.py +1 -0
- ciris_engine/schemas/services/infrastructure/resource_monitor.py +20 -0
- ciris_engine/schemas/services/lifecycle/__init__.py +9 -0
- ciris_engine/schemas/services/lifecycle/initialization.py +33 -0
- ciris_engine/schemas/services/lifecycle/time.py +50 -0
- ciris_engine/schemas/services/llm.py +187 -0
- ciris_engine/schemas/services/metadata.py +43 -0
- ciris_engine/schemas/services/nodes.py +704 -0
- ciris_engine/schemas/services/operations.py +126 -0
- ciris_engine/schemas/services/requests.py +128 -0
- ciris_engine/schemas/services/resources_core.py +182 -0
- ciris_engine/schemas/services/runtime_control.py +1010 -0
- ciris_engine/schemas/services/shutdown.py +88 -0
- ciris_engine/schemas/services/special/__init__.py +0 -0
- ciris_engine/schemas/services/special/self_observation.py +396 -0
- ciris_engine/schemas/services/trace_summary_node.py +199 -0
- ciris_engine/schemas/services/visibility.py +98 -0
- ciris_engine/schemas/streaming/__init__.py +10 -0
- ciris_engine/schemas/streaming/reasoning_stream.py +95 -0
- ciris_engine/schemas/telemetry/__init__.py +0 -0
- ciris_engine/schemas/telemetry/collector.py +67 -0
- ciris_engine/schemas/telemetry/core.py +252 -0
- ciris_engine/schemas/telemetry/unified.py +59 -0
- ciris_engine/schemas/tools.py +72 -0
- ciris_engine/schemas/types.py +47 -0
- ciris_engine/schemas/utils/__init__.py +1 -0
- ciris_engine/schemas/utils/config_validator.py +54 -0
- ciris_engine/utils/__init__.py +1 -0
- ciris_engine/utils/serialization.py +35 -0
- ciris_sdk/__init__.py +124 -0
- ciris_sdk/auth_store.py +261 -0
- ciris_sdk/client.py +261 -0
- ciris_sdk/exceptions.py +73 -0
- ciris_sdk/model_types.py +258 -0
- ciris_sdk/models.py +354 -0
- ciris_sdk/pagination.py +214 -0
- ciris_sdk/rate_limiter.py +188 -0
- ciris_sdk/setup.py +17 -0
- ciris_sdk/telemetry_models.py +257 -0
- ciris_sdk/telemetry_responses.py +199 -0
- ciris_sdk/transport.py +177 -0
- ciris_sdk/websocket.py +400 -0
- main.py +766 -0
|
@@ -0,0 +1,715 @@
|
|
|
1
|
+
# Reddit Adapter Implementation Analysis
|
|
2
|
+
|
|
3
|
+
## Executive Summary
|
|
4
|
+
|
|
5
|
+
The CIRIS codebase contains a **complete, production-ready Reddit adapter** implementation as a modular service. The adapter provides full Reddit integration with tool, communication, and observation capabilities. The implementation uses **httpx for HTTP requests** instead of PRAW (Python Reddit API Wrapper), providing direct OAuth2 handling.
|
|
6
|
+
|
|
7
|
+
**Status**: IMPLEMENTED (1,188 lines of production code)
|
|
8
|
+
**Location**: `/home/emoore/CIRISAgent/ciris_adapters/reddit/`
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. Directory Structure
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
ciris_adapters/reddit/
|
|
16
|
+
├── __init__.py # Package exports
|
|
17
|
+
├── README.md # Complete documentation
|
|
18
|
+
├── manifest.json # Module declaration (JSON)
|
|
19
|
+
├── protocol.py # Service protocols
|
|
20
|
+
├── schemas.py # Pydantic type models
|
|
21
|
+
├── service.py # Tool + Communication services (1,188 lines)
|
|
22
|
+
└── observer.py # Passive observation implementation
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Size & Scope**:
|
|
26
|
+
- Total: ~1,900 lines of production Python code
|
|
27
|
+
- `service.py`: 1,188 lines (RedditAPIClient, RedditToolService, RedditCommunicationService)
|
|
28
|
+
- `observer.py`: 162 lines (RedditObserver for passive monitoring)
|
|
29
|
+
- `schemas.py`: 356 lines (15+ Pydantic models)
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. Reddit API Integration (NOT using PRAW)
|
|
34
|
+
|
|
35
|
+
### Implementation Approach
|
|
36
|
+
The adapter implements a **custom HTTP client** (`RedditAPIClient`) instead of using PRAW:
|
|
37
|
+
|
|
38
|
+
**Advantages of this approach:**
|
|
39
|
+
- Direct control over HTTP requests and rate limiting
|
|
40
|
+
- Lighter dependencies (only requires httpx)
|
|
41
|
+
- Type-safe request/response handling
|
|
42
|
+
- Custom OAuth token management
|
|
43
|
+
|
|
44
|
+
### Key Methods:
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
class RedditAPIClient:
|
|
48
|
+
_TOKEN_URL = "https://www.reddit.com/api/v1/access_token"
|
|
49
|
+
_API_BASE_URL = "https://oauth.reddit.com"
|
|
50
|
+
|
|
51
|
+
# OAuth Management
|
|
52
|
+
async def refresh_token(force: bool = False) -> bool
|
|
53
|
+
async def update_credentials(credentials: RedditCredentials) -> None
|
|
54
|
+
|
|
55
|
+
# Public Methods
|
|
56
|
+
async def fetch_user_context(request: RedditUserContextRequest)
|
|
57
|
+
async def submit_post(request: RedditSubmitPostRequest)
|
|
58
|
+
async def submit_comment(request: RedditSubmitCommentRequest)
|
|
59
|
+
async def remove_content(request: RedditRemoveContentRequest)
|
|
60
|
+
async def get_submission_summary(submission_id, ...)
|
|
61
|
+
async def fetch_subreddit_new(subreddit, limit)
|
|
62
|
+
async def fetch_subreddit_comments(subreddit, limit)
|
|
63
|
+
async def fetch_submission_comments(submission_id, limit)
|
|
64
|
+
async def fetch_user_activity(username, limit)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 3. Bot Identification Implementation
|
|
70
|
+
|
|
71
|
+
### User-Agent Configuration
|
|
72
|
+
|
|
73
|
+
**✅ Properly Identifies Bot:**
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
# Default User-Agent (Reddit API compliant)
|
|
77
|
+
_USER_AGENT_FALLBACK = "CIRIS-RedditAdapter/1.0 (+https://ciris.ai)"
|
|
78
|
+
|
|
79
|
+
# Configurable via environment
|
|
80
|
+
CIRIS_REDDIT_USER_AGENT env variable (defaults to above)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Configuration
|
|
84
|
+
Defined in `manifest.json`:
|
|
85
|
+
```json
|
|
86
|
+
"reddit_user_agent": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"env": "CIRIS_REDDIT_USER_AGENT",
|
|
89
|
+
"default": "CIRIS-RedditAdapter/1.0 (+https://ciris.ai)",
|
|
90
|
+
"description": "User-Agent header that complies with Reddit API rules"
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Transparency Mechanism
|
|
95
|
+
**Documentation in README.md explicitly states:**
|
|
96
|
+
- "Adheres to the CIRIS covenant"
|
|
97
|
+
- "Honors Reddit best practices (user agent, rate handling)"
|
|
98
|
+
- "Surfaces API failures with actionable error messages"
|
|
99
|
+
|
|
100
|
+
### Status: COMPLETE ✅
|
|
101
|
+
- Bot is clearly identified as CIRIS
|
|
102
|
+
- URL points to legitimately discoverable information
|
|
103
|
+
- Complies with Reddit's user-agent policy
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 4. Data Retention & Deletion Handling
|
|
108
|
+
|
|
109
|
+
### Status: MINIMAL ⚠️
|
|
110
|
+
|
|
111
|
+
**What EXISTS:**
|
|
112
|
+
- OAuth tokens are expired/cleaned on token refresh
|
|
113
|
+
- RedditObserver uses OrderedDict with `_CACHE_LIMIT = 500` to auto-evict old item IDs
|
|
114
|
+
- No explicit persistent data storage beyond what's in graph memory
|
|
115
|
+
|
|
116
|
+
**What's MISSING:**
|
|
117
|
+
1. **No explicit data deletion API** - Comments/posts created by bot cannot be auto-deleted
|
|
118
|
+
2. **No cache purging mechanism** - Observer cache persists indefinitely (though bounded)
|
|
119
|
+
3. **No retention policy documentation** - No specified data lifetime guidelines
|
|
120
|
+
4. **No audit-trail deletion hooks** - Audit service may retain Reddit content permanently
|
|
121
|
+
|
|
122
|
+
### Implementation Details (Cache Management):
|
|
123
|
+
```python
|
|
124
|
+
# From observer.py (line 106-112)
|
|
125
|
+
def _mark_seen(self, cache: "OrderedDict[str, None]", key: str) -> bool:
|
|
126
|
+
if key in cache:
|
|
127
|
+
return True
|
|
128
|
+
cache[key] = None
|
|
129
|
+
while len(cache) > _CACHE_LIMIT: # 500 item limit
|
|
130
|
+
cache.popitem(last=False)
|
|
131
|
+
return False
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Recommendation:
|
|
135
|
+
- Add `reddit_delete_content` tool method
|
|
136
|
+
- Document data retention policy in manifest
|
|
137
|
+
- Consider integrating with graph memory deletion service
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 5. Rate Limiting Implementation
|
|
142
|
+
|
|
143
|
+
### Status: IMPLEMENTED ✅
|
|
144
|
+
|
|
145
|
+
**Primary Rate Limiting (HTTP 429 handling):**
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
# From service.py (lines 179-182)
|
|
149
|
+
if response.status_code == 429:
|
|
150
|
+
retry_after = float(response.headers.get("Retry-After", "1"))
|
|
151
|
+
await asyncio.sleep(max(retry_after, 0))
|
|
152
|
+
response = await self._http_client.request(...)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Features:**
|
|
156
|
+
- Respects Reddit's `Retry-After` header
|
|
157
|
+
- Automatic retry after backoff
|
|
158
|
+
- Configurable timeout (httpx.Timeout settings: 10s connect, 20s read/write, 10s pool)
|
|
159
|
+
|
|
160
|
+
**Metrics Tracking:**
|
|
161
|
+
```python
|
|
162
|
+
self._request_count = 0 # Track all requests
|
|
163
|
+
self._error_count = 0 # Track errors
|
|
164
|
+
metrics["requests"] = float(self._request_count)
|
|
165
|
+
metrics["errors"] = float(self._error_count)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Additional Rate Limit Handling:
|
|
169
|
+
- **Token refresh lock**: Uses `asyncio.Lock()` to prevent concurrent token requests
|
|
170
|
+
- **Connection pooling**: httpx AsyncClient with configured pool timeout
|
|
171
|
+
- **Token buffer**: 60-second buffer before expiration to prevent mid-request expiration
|
|
172
|
+
|
|
173
|
+
### Status: COMPLETE ✅
|
|
174
|
+
Implements best practices for respecting Reddit API rate limits.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 6. OAuth2 Authentication
|
|
179
|
+
|
|
180
|
+
### Status: FULLY IMPLEMENTED ✅
|
|
181
|
+
|
|
182
|
+
### Authentication Flow
|
|
183
|
+
|
|
184
|
+
**Type**: Reddit OAuth2 Password Grant (User Account)
|
|
185
|
+
|
|
186
|
+
**Endpoints:**
|
|
187
|
+
- Token endpoint: `https://www.reddit.com/api/v1/access_token`
|
|
188
|
+
- API base: `https://oauth.reddit.com`
|
|
189
|
+
|
|
190
|
+
### Credential Management
|
|
191
|
+
|
|
192
|
+
**RedditCredentials Schema:**
|
|
193
|
+
```python
|
|
194
|
+
class RedditCredentials(BaseModel):
|
|
195
|
+
client_id: str # App client ID
|
|
196
|
+
client_secret: str # App secret
|
|
197
|
+
username: str # Bot account username
|
|
198
|
+
password: str # Bot account password
|
|
199
|
+
user_agent: str # User-Agent header
|
|
200
|
+
subreddit: str = "ciris" # Default subreddit
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**Token Refresh Mechanism:**
|
|
204
|
+
```python
|
|
205
|
+
async def refresh_token(force: bool = False) -> bool:
|
|
206
|
+
"""Ensure access token available, optionally forcing refresh"""
|
|
207
|
+
async with self._token_lock: # Thread-safe with asyncio.Lock()
|
|
208
|
+
if not force and self._token and not self._token.is_expired():
|
|
209
|
+
return True
|
|
210
|
+
|
|
211
|
+
auth = (client_id, client_secret)
|
|
212
|
+
data = {
|
|
213
|
+
"grant_type": "password",
|
|
214
|
+
"username": username,
|
|
215
|
+
"password": password,
|
|
216
|
+
}
|
|
217
|
+
# POST to token endpoint with Basic auth
|
|
218
|
+
response = await client.post(TOKEN_URL, data=data, auth=auth)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Token Storage:**
|
|
222
|
+
```python
|
|
223
|
+
class RedditToken(BaseModel):
|
|
224
|
+
access_token: str
|
|
225
|
+
expires_at: datetime
|
|
226
|
+
|
|
227
|
+
def is_expired(self, now=None, buffer_seconds: int = 60) -> bool:
|
|
228
|
+
"""Checks if expired or within 60-second refresh window"""
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Environment Variables:
|
|
232
|
+
```
|
|
233
|
+
CIRIS_REDDIT_CLIENT_ID # Required
|
|
234
|
+
CIRIS_REDDIT_CLIENT_SECRET # Required (HIGH sensitivity)
|
|
235
|
+
CIRIS_REDDIT_USERNAME # Required
|
|
236
|
+
CIRIS_REDDIT_PASSWORD # Required (HIGH sensitivity)
|
|
237
|
+
CIRIS_REDDIT_USER_AGENT # Optional (defaults to fallback)
|
|
238
|
+
CIRIS_REDDIT_SUBREDDIT # Optional (defaults to 'ciris')
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Security Notes:
|
|
242
|
+
- Credentials stored in RedditCredentials Pydantic model
|
|
243
|
+
- No credentials logged (defensive logging in place)
|
|
244
|
+
- Token refresh is synchronized with asyncio.Lock()
|
|
245
|
+
- 401 responses trigger automatic token refresh
|
|
246
|
+
|
|
247
|
+
### Status: PRODUCTION-READY ✅
|
|
248
|
+
OAuth2 implementation is complete, type-safe, and follows Reddit API best practices.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## 7. Content Moderation Logic
|
|
253
|
+
|
|
254
|
+
### Status: IMPLEMENTED ✅
|
|
255
|
+
|
|
256
|
+
**Available Moderation Tools:**
|
|
257
|
+
|
|
258
|
+
1. **`reddit_remove_content`** - Remove submissions or comments
|
|
259
|
+
```python
|
|
260
|
+
RedditRemoveContentRequest:
|
|
261
|
+
thing_fullname: str # t3_xxx or t1_xxx
|
|
262
|
+
spam: bool = False # Mark as spam vs just remove
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
2. **`reddit_submit_comment`** - Post comments with optional thread lock
|
|
266
|
+
```python
|
|
267
|
+
RedditSubmitCommentRequest:
|
|
268
|
+
parent_fullname: str # Parent thing ID
|
|
269
|
+
text: str # Comment body (Markdown)
|
|
270
|
+
lock_thread: bool = False # Lock submission after replying
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
3. **`reddit_submit_post`** - Create new submissions
|
|
274
|
+
```python
|
|
275
|
+
RedditSubmitPostRequest:
|
|
276
|
+
title: str
|
|
277
|
+
body: str # Markdown
|
|
278
|
+
flair_id: Optional[str] # Pre-configured flair
|
|
279
|
+
flair_text: Optional[str]
|
|
280
|
+
nsfw: bool = False
|
|
281
|
+
spoiler: bool = False
|
|
282
|
+
send_replies: bool = True
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
4. **`reddit_get_user_context`** - Get user info + history
|
|
286
|
+
```python
|
|
287
|
+
RedditUserContextRequest:
|
|
288
|
+
username: str
|
|
289
|
+
include_history: bool = True
|
|
290
|
+
history_limit: int = 5-25
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Anti-Spoofing & Safety
|
|
294
|
+
|
|
295
|
+
**From observer.py (lines 151-161):**
|
|
296
|
+
```python
|
|
297
|
+
async def _enhance_message(self, msg: RedditMessage) -> RedditMessage:
|
|
298
|
+
"""Apply Reddit-specific content hardening before processing."""
|
|
299
|
+
|
|
300
|
+
# Uses base observer's spoofing detection
|
|
301
|
+
cleaned = detect_and_replace_spoofed_markers(msg.content)
|
|
302
|
+
if cleaned != msg.content:
|
|
303
|
+
msg.content = cleaned
|
|
304
|
+
|
|
305
|
+
# Surfaces permalink for context reconstruction
|
|
306
|
+
if msg.permalink:
|
|
307
|
+
setattr(msg, "permalink_url", msg.permalink)
|
|
308
|
+
|
|
309
|
+
return msg
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### CIRIS Covenant Enforcement
|
|
313
|
+
|
|
314
|
+
**From README.md:**
|
|
315
|
+
> "Adheres to the CIRIS covenant: no medical, clinical, or political campaigning actions."
|
|
316
|
+
|
|
317
|
+
And from **manifest.json**:
|
|
318
|
+
```json
|
|
319
|
+
"prohibited": ["medical", "political_campaigning"],
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
This enforcement happens at the **WiseBus level** (checked in wise_bus.py) - not Reddit-specific.
|
|
323
|
+
|
|
324
|
+
### Status: COMPLETE ✅
|
|
325
|
+
Moderation tools are well-designed with type safety and integrated anti-spoofing.
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## 8. Transparency & Disclosure Mechanisms
|
|
330
|
+
|
|
331
|
+
### Status: IMPLEMENTED (Partial) ✅⚠️
|
|
332
|
+
|
|
333
|
+
**What EXISTS:**
|
|
334
|
+
|
|
335
|
+
1. **User-Agent Transparency**
|
|
336
|
+
- Clear identification: "CIRIS-RedditAdapter/1.0 (+https://ciris.ai)"
|
|
337
|
+
- Reddit policy compliant (includes contact URL)
|
|
338
|
+
|
|
339
|
+
2. **README Documentation**
|
|
340
|
+
- Comprehensive module documentation at `/ciris_adapters/reddit/README.md`
|
|
341
|
+
- Explains capabilities, configuration, and channel references
|
|
342
|
+
- Safety section: "Adheres to the CIRIS covenant"
|
|
343
|
+
|
|
344
|
+
3. **Manifest Declaration**
|
|
345
|
+
- `manifest.json` declares:
|
|
346
|
+
- All capabilities (7 tool capabilities + 2 communication)
|
|
347
|
+
- Safety domain: "community_outreach"
|
|
348
|
+
- Prohibited capabilities: "medical", "political_campaigning"
|
|
349
|
+
- Required configuration
|
|
350
|
+
|
|
351
|
+
4. **Service Metadata**
|
|
352
|
+
- Capabilities endpoint reports all actions
|
|
353
|
+
- Tool descriptions available via service introspection
|
|
354
|
+
|
|
355
|
+
**What's MISSING:**
|
|
356
|
+
|
|
357
|
+
1. **No explicit bot disclosure tool** - Cannot programmatically announce CIRIS identity
|
|
358
|
+
2. **No transparency report hooks** - No mechanism to log all actions for community audit
|
|
359
|
+
3. **No `/about` profile endpoint** - Reddit profile could link to documentation
|
|
360
|
+
4. **No consent/acknowledgment mechanism** - No way to confirm user awareness of bot presence
|
|
361
|
+
|
|
362
|
+
### Example of What's Possible But Not Implemented:
|
|
363
|
+
```python
|
|
364
|
+
# Not present in code, but could be added:
|
|
365
|
+
async def _tool_disclose_identity(self, ...) -> ToolExecutionResult:
|
|
366
|
+
"""Tool to announce CIRIS identity and purpose"""
|
|
367
|
+
message = """
|
|
368
|
+
I am CIRIS-RedditAdapter/1.0 (https://ciris.ai)
|
|
369
|
+
- I am an AI moderation bot operated by CIRIS
|
|
370
|
+
- My decisions are subject to human review
|
|
371
|
+
- Full audit trail: https://agents.ciris.ai/audit
|
|
372
|
+
- Questions? Contact: [contact info]
|
|
373
|
+
"""
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
### Recommendation:
|
|
377
|
+
- Consider adding `reddit_disclose_identity` tool for transparency
|
|
378
|
+
- Document bot profile in subreddit sidebar
|
|
379
|
+
- Add logging hook for all Reddit actions to community-visible audit trail
|
|
380
|
+
|
|
381
|
+
---
|
|
382
|
+
|
|
383
|
+
## 9. Reddit-Specific Configuration
|
|
384
|
+
|
|
385
|
+
### Status: COMPLETE ✅
|
|
386
|
+
|
|
387
|
+
**Configuration Management:**
|
|
388
|
+
|
|
389
|
+
1. **manifest.json Declaration:**
|
|
390
|
+
```json
|
|
391
|
+
{
|
|
392
|
+
"configuration": {
|
|
393
|
+
"reddit_client_id": {
|
|
394
|
+
"type": "string",
|
|
395
|
+
"env": "CIRIS_REDDIT_CLIENT_ID",
|
|
396
|
+
"description": "Reddit OAuth client identifier"
|
|
397
|
+
},
|
|
398
|
+
"reddit_client_secret": {
|
|
399
|
+
"type": "string",
|
|
400
|
+
"env": "CIRIS_REDDIT_CLIENT_SECRET",
|
|
401
|
+
"description": "Reddit OAuth client secret"
|
|
402
|
+
},
|
|
403
|
+
"reddit_username": {
|
|
404
|
+
"type": "string",
|
|
405
|
+
"env": "CIRIS_REDDIT_USERNAME",
|
|
406
|
+
"description": "Bot account username"
|
|
407
|
+
},
|
|
408
|
+
"reddit_password": {
|
|
409
|
+
"type": "string",
|
|
410
|
+
"env": "CIRIS_REDDIT_PASSWORD",
|
|
411
|
+
"sensitivity": "HIGH",
|
|
412
|
+
"description": "Bot account password"
|
|
413
|
+
},
|
|
414
|
+
"reddit_user_agent": {
|
|
415
|
+
"type": "string",
|
|
416
|
+
"env": "CIRIS_REDDIT_USER_AGENT",
|
|
417
|
+
"default": "CIRIS-RedditAdapter/1.0 (+https://ciris.ai)",
|
|
418
|
+
"description": "User-Agent header that complies with Reddit API rules"
|
|
419
|
+
},
|
|
420
|
+
"reddit_subreddit": {
|
|
421
|
+
"type": "string",
|
|
422
|
+
"env": "CIRIS_REDDIT_SUBREDDIT",
|
|
423
|
+
"default": "ciris",
|
|
424
|
+
"description": "Home subreddit for passive observation"
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
2. **Environment Variable Loading:**
|
|
431
|
+
```python
|
|
432
|
+
@classmethod
|
|
433
|
+
def from_env(cls) -> "RedditCredentials | None":
|
|
434
|
+
"""Create credentials from environment variables if available."""
|
|
435
|
+
env_mapping = {
|
|
436
|
+
"reddit_client_id": os.getenv("CIRIS_REDDIT_CLIENT_ID"),
|
|
437
|
+
"reddit_client_secret": os.getenv("CIRIS_REDDIT_CLIENT_SECRET"),
|
|
438
|
+
"reddit_username": os.getenv("CIRIS_REDDIT_USERNAME"),
|
|
439
|
+
"reddit_password": os.getenv("CIRIS_REDDIT_PASSWORD"),
|
|
440
|
+
"reddit_user_agent": os.getenv("CIRIS_REDDIT_USER_AGENT", "CIRIS-RedditAdapter/1.0 (+https://ciris.ai)"),
|
|
441
|
+
"reddit_subreddit": os.getenv("CIRIS_REDDIT_SUBREDDIT", "ciris"),
|
|
442
|
+
}
|
|
443
|
+
if all(value for value in env_mapping.values()):
|
|
444
|
+
return cls.model_validate(env_mapping)
|
|
445
|
+
return None
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
3. **Channel Reference Format:**
|
|
449
|
+
Reddit uses proprietary channel references matching the canonical format:
|
|
450
|
+
```
|
|
451
|
+
reddit:r/<subreddit> # Subreddit
|
|
452
|
+
reddit:r/<subreddit>:post/<submission_id> # Submission
|
|
453
|
+
reddit:r/<subreddit>:post/<submission_id>:comment/<comment_id> # Comment
|
|
454
|
+
reddit:u/<username> # User timeline
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
4. **WAKEUP Submission Discovery:**
|
|
458
|
+
During startup, RedditCommunicationService searches for a WAKEUP submission to use as default channel:
|
|
459
|
+
```python
|
|
460
|
+
async def _resolve_home_channel(self) -> None:
|
|
461
|
+
"""Resolve the WAKEUP submission used for default Reddit messaging."""
|
|
462
|
+
entries = await self._client.fetch_subreddit_new(subreddit, limit=25)
|
|
463
|
+
for entry in entries:
|
|
464
|
+
if "wakeup" in entry.title.lower() or "wakeup" in entry.body.lower():
|
|
465
|
+
self._home_channel = _build_channel_reference(subreddit, submission_id=entry.item_id)
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### Usage Examples:
|
|
469
|
+
|
|
470
|
+
**Command Line:**
|
|
471
|
+
```bash
|
|
472
|
+
python main.py --adapter reddit
|
|
473
|
+
python main.py --adapter api --adapter reddit # Multiple adapters
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
**Environment Variables (.env):**
|
|
477
|
+
```bash
|
|
478
|
+
CIRIS_REDDIT_CLIENT_ID=xxxxx
|
|
479
|
+
CIRIS_REDDIT_CLIENT_SECRET=yyyyy
|
|
480
|
+
CIRIS_REDDIT_USERNAME=ciris_bot_account
|
|
481
|
+
CIRIS_REDDIT_PASSWORD=bot_password
|
|
482
|
+
CIRIS_REDDIT_SUBREDDIT=mycommunity
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
---
|
|
486
|
+
|
|
487
|
+
## 10. Service Architecture
|
|
488
|
+
|
|
489
|
+
### Module Declaration (manifest.json)
|
|
490
|
+
|
|
491
|
+
```json
|
|
492
|
+
{
|
|
493
|
+
"services": [
|
|
494
|
+
{
|
|
495
|
+
"type": "TOOL",
|
|
496
|
+
"priority": "NORMAL",
|
|
497
|
+
"class": "reddit.service.RedditToolService",
|
|
498
|
+
"capabilities": [
|
|
499
|
+
"tool:reddit",
|
|
500
|
+
"tool:reddit:get_user_context",
|
|
501
|
+
"tool:reddit:submit_post",
|
|
502
|
+
"tool:reddit:submit_comment",
|
|
503
|
+
"tool:reddit:remove_content",
|
|
504
|
+
"tool:reddit:get_submission",
|
|
505
|
+
"tool:reddit:observe"
|
|
506
|
+
]
|
|
507
|
+
},
|
|
508
|
+
{
|
|
509
|
+
"type": "COMMUNICATION",
|
|
510
|
+
"priority": "LOW",
|
|
511
|
+
"class": "reddit.service.RedditCommunicationService",
|
|
512
|
+
"capabilities": [
|
|
513
|
+
"communication:send_message",
|
|
514
|
+
"communication:fetch_messages"
|
|
515
|
+
]
|
|
516
|
+
}
|
|
517
|
+
]
|
|
518
|
+
}
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
### Service Classes
|
|
522
|
+
|
|
523
|
+
**RedditToolService** (extends RedditServiceBase, RedditToolProtocol)
|
|
524
|
+
- 7 tool implementations
|
|
525
|
+
- Validation and error handling
|
|
526
|
+
- Metrics collection
|
|
527
|
+
- 6 request model validators
|
|
528
|
+
|
|
529
|
+
**RedditCommunicationService** (extends RedditServiceBase, RedditCommunicationProtocol)
|
|
530
|
+
- `send_message()` - Post comments
|
|
531
|
+
- `fetch_messages()` - Retrieve messages
|
|
532
|
+
- `get_home_channel_id()` - Default channel resolution
|
|
533
|
+
- Supports all channel types (subreddit, submission, comment, user)
|
|
534
|
+
|
|
535
|
+
**RedditObserver** (extends BaseObserver[RedditMessage])
|
|
536
|
+
- Passive polling every 15 seconds (configurable 5s minimum)
|
|
537
|
+
- Detects new submissions and comments
|
|
538
|
+
- Integrates with adaptive filtering
|
|
539
|
+
- Anti-spoofing content cleaning
|
|
540
|
+
|
|
541
|
+
---
|
|
542
|
+
|
|
543
|
+
## 11. What's MISSING
|
|
544
|
+
|
|
545
|
+
### Critical Gaps
|
|
546
|
+
|
|
547
|
+
1. **No Unit/Integration Tests**
|
|
548
|
+
- No test files in `/tests/` for Reddit adapter
|
|
549
|
+
- No fixture or mock Reddit API
|
|
550
|
+
|
|
551
|
+
2. **No PRAW Library** ⚠️
|
|
552
|
+
- Intentionally not using PRAW
|
|
553
|
+
- Custom implementation provides more control
|
|
554
|
+
- Acceptable for production use
|
|
555
|
+
|
|
556
|
+
3. **Limited Data Deletion Support**
|
|
557
|
+
- Can remove content via API
|
|
558
|
+
- No auto-deletion tool
|
|
559
|
+
- No deletion confirmation workflow
|
|
560
|
+
|
|
561
|
+
4. **No Explicit Content Filtering**
|
|
562
|
+
- Relies on parent system's adaptive filter
|
|
563
|
+
- No Reddit-specific filtering rules
|
|
564
|
+
|
|
565
|
+
5. **No Webhook Support**
|
|
566
|
+
- Polling-only observer (not webhook-based)
|
|
567
|
+
- Reddit doesn't support webhooks anyway
|
|
568
|
+
|
|
569
|
+
### Enhancement Opportunities
|
|
570
|
+
|
|
571
|
+
1. **Transparency Disclosure Tool**
|
|
572
|
+
```python
|
|
573
|
+
reddit_disclose_identity() -> ToolExecutionResult
|
|
574
|
+
# Post message announcing CIRIS presence
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
2. **Activity Auditing Tool**
|
|
578
|
+
```python
|
|
579
|
+
reddit_get_activity_log() -> List[AuditEvent]
|
|
580
|
+
# Return all actions taken by this bot
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
3. **Subreddit Rule Synchronization**
|
|
584
|
+
```python
|
|
585
|
+
reddit_sync_rules(rule_text: str) -> bool
|
|
586
|
+
# Sync moderation rules to subreddit about section
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
4. **User Report Handling**
|
|
590
|
+
```python
|
|
591
|
+
reddit_get_modqueue() -> List[ModQueueItem]
|
|
592
|
+
# Fetch reported content for review
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
5. **Test Suite**
|
|
596
|
+
```
|
|
597
|
+
tests/modular_services/test_reddit_adapter.py (400+ lines)
|
|
598
|
+
- Mocked httpx client
|
|
599
|
+
- OAuth flow testing
|
|
600
|
+
- Channel reference parsing
|
|
601
|
+
- Tool execution validation
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
---
|
|
605
|
+
|
|
606
|
+
## 12. Comparison with Discord Adapter
|
|
607
|
+
|
|
608
|
+
| Feature | Discord | Reddit |
|
|
609
|
+
|---------|---------|--------|
|
|
610
|
+
| **Tool Service** | ✅ DiscordToolService | ✅ RedditToolService |
|
|
611
|
+
| **Communication Service** | ✅ DiscordAdapter | ✅ RedditCommunicationService |
|
|
612
|
+
| **Observer** | ✅ DiscordObserver | ✅ RedditObserver |
|
|
613
|
+
| **Moderation Tools** | 13 tools (timeout, ban, kick, etc.) | 6 tools (post, comment, remove, etc.) |
|
|
614
|
+
| **User Management** | ✅ Full role/permission support | ⚠️ Limited (no mod actions) |
|
|
615
|
+
| **Rate Limiting** | Advanced (exponential backoff) | ✅ 429 handling |
|
|
616
|
+
| **Test Coverage** | 100+ test files | ⚠️ 0 test files |
|
|
617
|
+
| **Production Status** | ✅ Powering agents.ciris.ai | ✅ Ready but untested |
|
|
618
|
+
| **Documentation** | Extensive | Good (README + docstrings) |
|
|
619
|
+
|
|
620
|
+
---
|
|
621
|
+
|
|
622
|
+
## 13. Type Safety Analysis
|
|
623
|
+
|
|
624
|
+
### Pydantic Models (10 Request/Response types)
|
|
625
|
+
|
|
626
|
+
All type-safe, no `Dict[str, Any]` in schemas:
|
|
627
|
+
|
|
628
|
+
```python
|
|
629
|
+
RedditCredentials ✅ All fields required/typed
|
|
630
|
+
RedditToken ✅ datetime + expiration logic
|
|
631
|
+
RedditChannelReference ✅ Enum + nested validation
|
|
632
|
+
RedditUserContextRequest ✅ Typed fields with defaults
|
|
633
|
+
RedditSubmitPostRequest ✅ Full request schema
|
|
634
|
+
RedditSubmitCommentRequest ✅ Typed parameters
|
|
635
|
+
RedditRemoveContentRequest ✅ Minimal but typed
|
|
636
|
+
RedditGetSubmissionRequest ✅ Validation via model_validator
|
|
637
|
+
RedditUserContext ✅ Complex response type
|
|
638
|
+
RedditSubmissionSummary ✅ Full metadata response
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
### Service Implementation Quality
|
|
642
|
+
|
|
643
|
+
**✅ Type-Safe:**
|
|
644
|
+
- All public methods have type annotations
|
|
645
|
+
- Return types explicitly declared
|
|
646
|
+
- Tool parameters validated via Pydantic
|
|
647
|
+
|
|
648
|
+
**⚠️ JSON Handling:**
|
|
649
|
+
- Some `JSONDict` and `JSONValue` usage (necessary for API responses)
|
|
650
|
+
- Limited to parsing Reddit's JSON responses
|
|
651
|
+
- Not used in public-facing code
|
|
652
|
+
|
|
653
|
+
---
|
|
654
|
+
|
|
655
|
+
## 14. Summary Table
|
|
656
|
+
|
|
657
|
+
| Aspect | Status | Notes |
|
|
658
|
+
|--------|--------|-------|
|
|
659
|
+
| **Directory Structure** | ✅ Complete | Modular service at `/ciris_adapters/reddit/` |
|
|
660
|
+
| **Reddit API Integration** | ✅ Complete | Custom httpx-based client, no PRAW dependency |
|
|
661
|
+
| **Bot Identification** | ✅ Complete | User-Agent clearly identifies as CIRIS |
|
|
662
|
+
| **Data Retention** | ⚠️ Partial | Token expiration + cache limits, but no deletion API |
|
|
663
|
+
| **Rate Limiting** | ✅ Complete | 429 handling with Retry-After respect |
|
|
664
|
+
| **OAuth2 Authentication** | ✅ Complete | Password grant flow, token refresh with locking |
|
|
665
|
+
| **Content Moderation** | ✅ Complete | Remove, post, comment, lock thread tools |
|
|
666
|
+
| **Transparency/Disclosure** | ⚠️ Partial | Bot identified in user-agent, lacks disclosure tool |
|
|
667
|
+
| **Reddit Configuration** | ✅ Complete | 6 environment variables, flexible setup |
|
|
668
|
+
| **Service Architecture** | ✅ Complete | 2 services (tool + communication) + observer |
|
|
669
|
+
| **Test Coverage** | ❌ Missing | No dedicated test files |
|
|
670
|
+
| **Documentation** | ✅ Good | README + docstrings + manifest |
|
|
671
|
+
|
|
672
|
+
---
|
|
673
|
+
|
|
674
|
+
## 15. Production Readiness Assessment
|
|
675
|
+
|
|
676
|
+
### ✅ Ready for Production:
|
|
677
|
+
- Type-safe implementation (Pydantic models throughout)
|
|
678
|
+
- Proper OAuth2 handling with token refresh
|
|
679
|
+
- Rate limit compliance
|
|
680
|
+
- Error handling and logging
|
|
681
|
+
- Channel abstraction (works with multiple subreddits)
|
|
682
|
+
- Async/await implementation (non-blocking I/O)
|
|
683
|
+
|
|
684
|
+
### ⚠️ Recommended Before Production Deployment:
|
|
685
|
+
1. **Add comprehensive test suite** (currently 0 tests)
|
|
686
|
+
2. **Add data deletion API** for content removal workflows
|
|
687
|
+
3. **Add transparency disclosure tool** for community trust
|
|
688
|
+
4. **Document data retention policy** in README
|
|
689
|
+
5. **Add activity audit logging** integration
|
|
690
|
+
|
|
691
|
+
### 🚀 Deployment Status:
|
|
692
|
+
**PRODUCTION-READY with caveats**
|
|
693
|
+
- Functional and type-safe
|
|
694
|
+
- Currently untested (no test suite)
|
|
695
|
+
- Recommend adding tests before deploying to public subreddit
|
|
696
|
+
- All CIRIS covenant protections apply (medical/political filtering at WiseBus level)
|
|
697
|
+
|
|
698
|
+
---
|
|
699
|
+
|
|
700
|
+
## 16. Code Quality Metrics
|
|
701
|
+
|
|
702
|
+
```
|
|
703
|
+
Total Lines: ~1,900
|
|
704
|
+
Service Code: 1,188 lines (service.py)
|
|
705
|
+
Observer Code: 162 lines (observer.py)
|
|
706
|
+
Schema Code: 356 lines (schemas.py + protocol.py)
|
|
707
|
+
|
|
708
|
+
Cyclomatic Complexity: Low to Medium
|
|
709
|
+
- Mostly straightforward HTTP request/response handling
|
|
710
|
+
- Some complexity in channel reference parsing
|
|
711
|
+
|
|
712
|
+
Test Coverage: 0% (no tests exist)
|
|
713
|
+
Type Annotations: ~95% coverage (well-typed codebase)
|
|
714
|
+
Documentation: Good (README, docstrings, manifest)
|
|
715
|
+
```
|