enya-agent 0.1.0
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.
- package/.env.example +20 -0
- package/.github/workflows/ci.yml +70 -0
- package/.github/workflows/publish.yml +250 -0
- package/.gitmodules +3 -0
- package/Cargo.lock +3584 -0
- package/Cargo.toml +97 -0
- package/crates/enact/Cargo.toml +27 -0
- package/crates/enact/src/lib.rs +60 -0
- package/crates/enact-a2a/Cargo.toml +25 -0
- package/crates/enact-a2a/src/lib.rs +411 -0
- package/crates/enact-channels/Cargo.toml +64 -0
- package/crates/enact-channels/examples/README.md +80 -0
- package/crates/enact-channels/examples/channel_bot.rs +169 -0
- package/crates/enact-channels/examples/telegram-echo.rs +34 -0
- package/crates/enact-channels/examples/whatsapp-echo.rs +142 -0
- package/crates/enact-channels/src/config.rs +213 -0
- package/crates/enact-channels/src/lib.rs +25 -0
- package/crates/enact-channels/src/runtime.rs +237 -0
- package/crates/enact-channels/src/security/mod.rs +5 -0
- package/crates/enact-channels/src/security/pairing.rs +205 -0
- package/crates/enact-channels/src/teams.rs +601 -0
- package/crates/enact-channels/src/telegram.rs +2833 -0
- package/crates/enact-channels/src/traits.rs +200 -0
- package/crates/enact-channels/src/webhook.rs +262 -0
- package/crates/enact-channels/src/whatsapp.rs +310 -0
- package/crates/enact-cli/Cargo.toml +40 -0
- package/crates/enact-cli/src/commands/doctor.rs +62 -0
- package/crates/enact-cli/src/commands/mod.rs +3 -0
- package/crates/enact-cli/src/commands/run.rs +69 -0
- package/crates/enact-cli/src/commands/serve.rs +81 -0
- package/crates/enact-cli/src/config.rs +2 -0
- package/crates/enact-cli/src/main.rs +79 -0
- package/crates/enact-config/Cargo.toml +36 -0
- package/crates/enact-config/ENV_VAR_MAPPING.md +135 -0
- package/crates/enact-config/QUICK_REFERENCE.md +92 -0
- package/crates/enact-config/README.md +107 -0
- package/crates/enact-config/TESTING.md +161 -0
- package/crates/enact-config/examples/test-env-vars.rs +100 -0
- package/crates/enact-config/src/config.rs +399 -0
- package/crates/enact-config/src/encrypted_store.rs +211 -0
- package/crates/enact-config/src/lib.rs +298 -0
- package/crates/enact-config/src/secrets.rs +149 -0
- package/crates/enact-config/src/sync.rs +260 -0
- package/crates/enact-config/test-env-vars.sh +34 -0
- package/crates/enact-config/tests/README.md +99 -0
- package/crates/enact-config/tests/config_integration_test.rs +202 -0
- package/crates/enact-config/tests/security_test.rs +140 -0
- package/crates/enact-context/Cargo.toml +41 -0
- package/crates/enact-context/src/budget.rs +314 -0
- package/crates/enact-context/src/calibrator.rs +535 -0
- package/crates/enact-context/src/compactor.rs +392 -0
- package/crates/enact-context/src/condenser.rs +826 -0
- package/crates/enact-context/src/lib.rs +94 -0
- package/crates/enact-context/src/segment.rs +238 -0
- package/crates/enact-context/src/step_context.rs +645 -0
- package/crates/enact-context/src/token_counter.rs +148 -0
- package/crates/enact-context/src/window.rs +372 -0
- package/crates/enact-core/Cargo.toml +42 -0
- package/crates/enact-core/README.md +98 -0
- package/crates/enact-core/src/background/executor.rs +524 -0
- package/crates/enact-core/src/background/mod.rs +48 -0
- package/crates/enact-core/src/background/target_binding.rs +390 -0
- package/crates/enact-core/src/background/trigger.rs +511 -0
- package/crates/enact-core/src/callable/callable.rs +152 -0
- package/crates/enact-core/src/callable/composite.rs +817 -0
- package/crates/enact-core/src/callable/graph.rs +104 -0
- package/crates/enact-core/src/callable/llm.rs +211 -0
- package/crates/enact-core/src/callable/mod.rs +64 -0
- package/crates/enact-core/src/callable/registry.rs +206 -0
- package/crates/enact-core/src/context/execution_context.rs +757 -0
- package/crates/enact-core/src/context/invocation.rs +99 -0
- package/crates/enact-core/src/context/mod.rs +50 -0
- package/crates/enact-core/src/context/tenant.rs +175 -0
- package/crates/enact-core/src/context/trace.rs +127 -0
- package/crates/enact-core/src/flow/conditional.rs +293 -0
- package/crates/enact-core/src/flow/mod.rs +43 -0
- package/crates/enact-core/src/flow/parallel.rs +437 -0
- package/crates/enact-core/src/flow/repeat.rs +534 -0
- package/crates/enact-core/src/flow/sequential.rs +248 -0
- package/crates/enact-core/src/graph/checkpoint.rs +79 -0
- package/crates/enact-core/src/graph/checkpoint_store.rs +76 -0
- package/crates/enact-core/src/graph/compiled.rs +189 -0
- package/crates/enact-core/src/graph/edge.rs +59 -0
- package/crates/enact-core/src/graph/graph_schema.rs +218 -0
- package/crates/enact-core/src/graph/loader.rs +155 -0
- package/crates/enact-core/src/graph/mod.rs +18 -0
- package/crates/enact-core/src/graph/node/function.rs +49 -0
- package/crates/enact-core/src/graph/node/mod.rs +48 -0
- package/crates/enact-core/src/graph/schema.rs +62 -0
- package/crates/enact-core/src/inbox/message.rs +405 -0
- package/crates/enact-core/src/inbox/mod.rs +31 -0
- package/crates/enact-core/src/inbox/store.rs +355 -0
- package/crates/enact-core/src/kernel/artifact/filesystem.rs +546 -0
- package/crates/enact-core/src/kernel/artifact/metadata.rs +283 -0
- package/crates/enact-core/src/kernel/artifact/mod.rs +27 -0
- package/crates/enact-core/src/kernel/artifact/store.rs +427 -0
- package/crates/enact-core/src/kernel/enforcement.rs +1315 -0
- package/crates/enact-core/src/kernel/error.rs +1200 -0
- package/crates/enact-core/src/kernel/event.rs +1394 -0
- package/crates/enact-core/src/kernel/execution_model.rs +831 -0
- package/crates/enact-core/src/kernel/execution_state.rs +189 -0
- package/crates/enact-core/src/kernel/execution_strategy.rs +117 -0
- package/crates/enact-core/src/kernel/ids.rs +2086 -0
- package/crates/enact-core/src/kernel/interrupt.rs +125 -0
- package/crates/enact-core/src/kernel/kernel.rs +1283 -0
- package/crates/enact-core/src/kernel/mod.rs +205 -0
- package/crates/enact-core/src/kernel/persistence/event_store.rs +270 -0
- package/crates/enact-core/src/kernel/persistence/message_store.rs +908 -0
- package/crates/enact-core/src/kernel/persistence/mod.rs +102 -0
- package/crates/enact-core/src/kernel/persistence/state_store.rs +228 -0
- package/crates/enact-core/src/kernel/persistence/vector_store.rs +299 -0
- package/crates/enact-core/src/kernel/reducer.rs +808 -0
- package/crates/enact-core/src/kernel/replay.rs +153 -0
- package/crates/enact-core/src/lib.rs +413 -0
- package/crates/enact-core/src/memory/episodic.rs +0 -0
- package/crates/enact-core/src/memory/mod.rs +6 -0
- package/crates/enact-core/src/memory/semantic.rs +0 -0
- package/crates/enact-core/src/memory/trait.rs +0 -0
- package/crates/enact-core/src/memory/vector_db.rs +0 -0
- package/crates/enact-core/src/memory/working.rs +0 -0
- package/crates/enact-core/src/policy/execution_policy.rs +292 -0
- package/crates/enact-core/src/policy/filters.rs +458 -0
- package/crates/enact-core/src/policy/input_processor.rs +407 -0
- package/crates/enact-core/src/policy/long_running.rs +134 -0
- package/crates/enact-core/src/policy/mod.rs +193 -0
- package/crates/enact-core/src/policy/pii_input.rs +274 -0
- package/crates/enact-core/src/policy/tenant_policy.rs +453 -0
- package/crates/enact-core/src/policy/tool_policy.rs +407 -0
- package/crates/enact-core/src/providers/mod.rs +63 -0
- package/crates/enact-core/src/providers/trait.rs +292 -0
- package/crates/enact-core/src/runner/callbacks.rs +6 -0
- package/crates/enact-core/src/runner/execution_runner.rs +476 -0
- package/crates/enact-core/src/runner/loop.rs +117 -0
- package/crates/enact-core/src/runner/mod.rs +58 -0
- package/crates/enact-core/src/runner/protected_runner.rs +280 -0
- package/crates/enact-core/src/signal/inmemory.rs +231 -0
- package/crates/enact-core/src/signal/mod.rs +108 -0
- package/crates/enact-core/src/streaming/event_logger.rs +195 -0
- package/crates/enact-core/src/streaming/event_stream.rs +1423 -0
- package/crates/enact-core/src/streaming/mod.rs +108 -0
- package/crates/enact-core/src/streaming/pause_cancel.rs +0 -0
- package/crates/enact-core/src/streaming/protected_emitter.rs +173 -0
- package/crates/enact-core/src/streaming/protection/context.rs +136 -0
- package/crates/enact-core/src/streaming/protection/encryption.rs +289 -0
- package/crates/enact-core/src/streaming/protection/mod.rs +43 -0
- package/crates/enact-core/src/streaming/protection/pii_protection.rs +243 -0
- package/crates/enact-core/src/streaming/protection/processor.rs +166 -0
- package/crates/enact-core/src/streaming/sse.rs +0 -0
- package/crates/enact-core/src/telemetry/exporter.rs +0 -0
- package/crates/enact-core/src/telemetry/init.rs +0 -0
- package/crates/enact-core/src/telemetry/mod.rs +49 -0
- package/crates/enact-core/src/telemetry/spans.rs +245 -0
- package/crates/enact-core/src/tool/agent_tool.rs +177 -0
- package/crates/enact-core/src/tool/browser/mod.rs +0 -0
- package/crates/enact-core/src/tool/browser/webdriver.rs +0 -0
- package/crates/enact-core/src/tool/cost.rs +247 -0
- package/crates/enact-core/src/tool/discovery.rs +0 -0
- package/crates/enact-core/src/tool/dispatcher.rs +347 -0
- package/crates/enact-core/src/tool/filesystem.rs +231 -0
- package/crates/enact-core/src/tool/function.rs +99 -0
- package/crates/enact-core/src/tool/git.rs +162 -0
- package/crates/enact-core/src/tool/http.rs +214 -0
- package/crates/enact-core/src/tool/mcp/client.rs +0 -0
- package/crates/enact-core/src/tool/mcp/mod.rs +0 -0
- package/crates/enact-core/src/tool/mod.rs +51 -0
- package/crates/enact-core/src/tool/reasoning/debugging.rs +0 -0
- package/crates/enact-core/src/tool/reasoning/mcts.rs +0 -0
- package/crates/enact-core/src/tool/reasoning/mod.rs +0 -0
- package/crates/enact-core/src/tool/reasoning/sequential.rs +0 -0
- package/crates/enact-core/src/tool/sandbox/dagger.rs +0 -0
- package/crates/enact-core/src/tool/sandbox/mod.rs +0 -0
- package/crates/enact-core/src/tool/shell.rs +147 -0
- package/crates/enact-core/src/tool/trait.rs +33 -0
- package/crates/enact-core/src/tool/web_search.rs +277 -0
- package/crates/enact-core/src/util/config.rs +0 -0
- package/crates/enact-core/src/util/errors.rs +0 -0
- package/crates/enact-core/src/util/mod.rs +6 -0
- package/crates/enact-core/tests/airgapped_e2e_test.rs +291 -0
- package/crates/enact-core/tests/e2e_agentic_loop.rs +119 -0
- package/crates/enact-core/tests/e2e_test.rs +259 -0
- package/crates/enact-core/tests/graph_test.rs +130 -0
- package/crates/enact-core/tests/stream_event_id_validation.rs +435 -0
- package/crates/enact-cron/Cargo.toml +28 -0
- package/crates/enact-cron/src/lib.rs +44 -0
- package/crates/enact-cron/src/schedule.rs +156 -0
- package/crates/enact-cron/src/store.rs +589 -0
- package/crates/enact-cron/src/types.rs +148 -0
- package/crates/enact-gateway/Cargo.toml +31 -0
- package/crates/enact-gateway/README.md +30 -0
- package/crates/enact-gateway/examples/whatsapp-gateway-runner-mock.rs +59 -0
- package/crates/enact-gateway/examples/whatsapp-gateway.rs +42 -0
- package/crates/enact-gateway/src/lib.rs +582 -0
- package/crates/enact-mcp/Cargo.toml +24 -0
- package/crates/enact-mcp/src/lib.rs +178 -0
- package/crates/enact-memory/Cargo.toml +25 -0
- package/crates/enact-memory/src/backend.rs +20 -0
- package/crates/enact-memory/src/chunker.rs +230 -0
- package/crates/enact-memory/src/embeddings.rs +221 -0
- package/crates/enact-memory/src/lib.rs +67 -0
- package/crates/enact-memory/src/markdown.rs +127 -0
- package/crates/enact-memory/src/none.rs +61 -0
- package/crates/enact-memory/src/sqlite.rs +276 -0
- package/crates/enact-memory/src/traits.rs +65 -0
- package/crates/enact-memory/src/vector.rs +198 -0
- package/crates/enact-oauth/Cargo.toml +27 -0
- package/crates/enact-oauth/src/lib.rs +584 -0
- package/crates/enact-observability/Cargo.toml +22 -0
- package/crates/enact-observability/src/lib.rs +197 -0
- package/crates/enact-providers/Cargo.toml +33 -0
- package/crates/enact-providers/examples/hello-agent.rs +33 -0
- package/crates/enact-providers/src/anthropic.rs +182 -0
- package/crates/enact-providers/src/azure.rs +96 -0
- package/crates/enact-providers/src/bridge.rs +221 -0
- package/crates/enact-providers/src/gemini.rs +227 -0
- package/crates/enact-providers/src/http.rs +78 -0
- package/crates/enact-providers/src/lib.rs +53 -0
- package/crates/enact-providers/src/openai_compatible.rs +167 -0
- package/crates/enact-providers/src/openrouter.rs +33 -0
- package/crates/enact-runner/Cargo.toml +24 -0
- package/crates/enact-runner/README.md +76 -0
- package/crates/enact-runner/src/compaction.rs +225 -0
- package/crates/enact-runner/src/config.rs +118 -0
- package/crates/enact-runner/src/lib.rs +63 -0
- package/crates/enact-runner/src/loop_driver.rs +414 -0
- package/crates/enact-runner/src/parser.rs +421 -0
- package/crates/enact-runner/src/retry.rs +262 -0
- package/crates/enact-runner/tests/integration.rs +278 -0
- package/crates/enact-security/Cargo.toml +22 -0
- package/crates/enact-security/src/audit.rs +375 -0
- package/crates/enact-security/src/lib.rs +37 -0
- package/crates/enact-security/src/policy.rs +406 -0
- package/crates/enact-skills/Cargo.toml +25 -0
- package/crates/enact-skills/src/lib.rs +506 -0
- package/crates/enact-tools/Cargo.toml +22 -0
- package/crates/enact-tools/src/file_read.rs +166 -0
- package/crates/enact-tools/src/file_write.rs +216 -0
- package/crates/enact-tools/src/git_operations.rs +513 -0
- package/crates/enact-tools/src/http_request.rs +417 -0
- package/crates/enact-tools/src/lib.rs +104 -0
- package/crates/enact-tools/src/security.rs +227 -0
- package/crates/enact-tools/src/shell.rs +191 -0
- package/crates/enact-tools/src/traits.rs +159 -0
- package/docs/Makefile +74 -0
- package/docs/config.toml +62 -0
- package/docs/content/_index.md +174 -0
- package/docs/content/a2a/_index.md +431 -0
- package/docs/content/api/_index.md +323 -0
- package/docs/content/channels/_index.md +160 -0
- package/docs/content/channels/teams.md +205 -0
- package/docs/content/channels/telegram.md +182 -0
- package/docs/content/channels/webhook.md +423 -0
- package/docs/content/channels/whatsapp.md +240 -0
- package/docs/content/cli/_index.md +261 -0
- package/docs/content/concepts/_index.md +273 -0
- package/docs/content/configuration/_index.md +241 -0
- package/docs/content/cron/_index.md +248 -0
- package/docs/content/developers/_index.md +278 -0
- package/docs/content/getting-started/_index.md +180 -0
- package/docs/content/installation/_index.md +186 -0
- package/docs/content/installation/uninstall.md +101 -0
- package/docs/content/installation/updating.md +120 -0
- package/docs/content/mcp/_index.md +215 -0
- package/docs/content/memory/_index.md +163 -0
- package/docs/content/oauth/_index.md +515 -0
- package/docs/content/providers/_index.md +206 -0
- package/docs/content/roadmap/_index.md +199 -0
- package/docs/content/security/_index.md +219 -0
- package/docs/content/skills/_index.md +228 -0
- package/docs/content/tools/_index.md +485 -0
- package/docs/content/troubleshooting/_index.md +259 -0
- package/docs/content/yaml-schema/_index.md +294 -0
- package/docs/static/giallo-dark.css +91 -0
- package/docs/static/giallo-light.css +91 -0
- package/docs/themes/tanuki/.github/workflows/deploy.yml +44 -0
- package/docs/themes/tanuki/LICENSE +21 -0
- package/docs/themes/tanuki/README.md +166 -0
- package/docs/themes/tanuki/examples/blog/config.toml +58 -0
- package/docs/themes/tanuki/examples/blog/content/_index.md +4 -0
- package/docs/themes/tanuki/examples/blog/content/about.md +33 -0
- package/docs/themes/tanuki/examples/blog/content/blog/_index.md +7 -0
- package/docs/themes/tanuki/examples/blog/content/blog/api-design-best-practices.md +245 -0
- package/docs/themes/tanuki/examples/blog/content/blog/building-accessible-websites.md +147 -0
- package/docs/themes/tanuki/examples/blog/content/blog/css-grid-vs-flexbox.md +165 -0
- package/docs/themes/tanuki/examples/blog/content/blog/customizing-catppuccin-colors.md +137 -0
- package/docs/themes/tanuki/examples/blog/content/blog/dark-mode-best-practices.md +82 -0
- package/docs/themes/tanuki/examples/blog/content/blog/docker-essentials.md +301 -0
- package/docs/themes/tanuki/examples/blog/content/blog/getting-started-with-zola.md +129 -0
- package/docs/themes/tanuki/examples/blog/content/blog/git-workflow-for-content.md +112 -0
- package/docs/themes/tanuki/examples/blog/content/blog/introduction-to-webassembly.md +183 -0
- package/docs/themes/tanuki/examples/blog/content/blog/modern-javascript-features.md +234 -0
- package/docs/themes/tanuki/examples/blog/content/blog/testing-strategies.md +311 -0
- package/docs/themes/tanuki/examples/blog/content/blog/typography-for-developers.md +104 -0
- package/docs/themes/tanuki/examples/blog/content/blog/welcome-to-tanuki.md +67 -0
- package/docs/themes/tanuki/examples/blog/content/blog/why-static-sites.md +85 -0
- package/docs/themes/tanuki/examples/blog/content/projects.md +64 -0
- package/docs/themes/tanuki/examples/book/config.toml +17 -0
- package/docs/themes/tanuki/examples/book/content/_index.md +12 -0
- package/docs/themes/tanuki/examples/book/content/chapter-1.md +90 -0
- package/docs/themes/tanuki/examples/book/content/chapter-2.md +143 -0
- package/docs/themes/tanuki/examples/book/content/chapter-3.md +217 -0
- package/docs/themes/tanuki/examples/book/content/chapter-4.md +224 -0
- package/docs/themes/tanuki/examples/book/content/chapter-5.md +297 -0
- package/docs/themes/tanuki/examples/book/content/print.md +6 -0
- package/docs/themes/tanuki/examples/docs/config.toml +28 -0
- package/docs/themes/tanuki/examples/docs/content/_index.md +20 -0
- package/docs/themes/tanuki/examples/docs/content/components.md +156 -0
- package/docs/themes/tanuki/examples/docs/content/configuration.md +94 -0
- package/docs/themes/tanuki/examples/docs/content/customization.md +202 -0
- package/docs/themes/tanuki/examples/docs/content/deployment.md +204 -0
- package/docs/themes/tanuki/examples/docs/content/installation.md +59 -0
- package/docs/themes/tanuki/examples/docs/content/print.md +6 -0
- package/docs/themes/tanuki/examples/docs/static/img/tanuki-icon.avif +0 -0
- package/docs/themes/tanuki/examples/index.html +2104 -0
- package/docs/themes/tanuki/mise.toml +108 -0
- package/docs/themes/tanuki/sass/base/_catppuccin.scss +164 -0
- package/docs/themes/tanuki/sass/base/_fonts.scss +64 -0
- package/docs/themes/tanuki/sass/base/_reset.scss +152 -0
- package/docs/themes/tanuki/sass/base/_typography.scss +523 -0
- package/docs/themes/tanuki/sass/components/_buttons.scss +209 -0
- package/docs/themes/tanuki/sass/components/_code.scss +457 -0
- package/docs/themes/tanuki/sass/components/_landing.scss +633 -0
- package/docs/themes/tanuki/sass/components/_layout.scss +294 -0
- package/docs/themes/tanuki/sass/components/_navigation.scss +1200 -0
- package/docs/themes/tanuki/sass/components/_print.scss +237 -0
- package/docs/themes/tanuki/sass/components/_search.scss +224 -0
- package/docs/themes/tanuki/sass/components/_sidebar.scss +473 -0
- package/docs/themes/tanuki/sass/components/_theme-toggle.scss +186 -0
- package/docs/themes/tanuki/sass/modes/_blog.scss +366 -0
- package/docs/themes/tanuki/sass/modes/_product.scss +875 -0
- package/docs/themes/tanuki/sass/modes/_raskell.scss +1696 -0
- package/docs/themes/tanuki/sass/patterns/_buttons.scss +183 -0
- package/docs/themes/tanuki/sass/patterns/_cards.scss +144 -0
- package/docs/themes/tanuki/sass/patterns/_index.scss +9 -0
- package/docs/themes/tanuki/sass/patterns/_lists.scss +259 -0
- package/docs/themes/tanuki/sass/patterns/_sections.scss +243 -0
- package/docs/themes/tanuki/sass/style.scss +47 -0
- package/docs/themes/tanuki/sass/tokens/_colors.scss +139 -0
- package/docs/themes/tanuki/sass/tokens/_spacing.scss +100 -0
- package/docs/themes/tanuki/sass/tokens/_typography.scss +186 -0
- package/docs/themes/tanuki/screenshot.png +0 -0
- package/docs/themes/tanuki/sentinel.kdl +59 -0
- package/docs/themes/tanuki/static/elasticlunr.min.js +10 -0
- package/docs/themes/tanuki/static/fonts/GEIST-LICENSE.txt +92 -0
- package/docs/themes/tanuki/static/fonts/Geist-Variable.woff2 +0 -0
- package/docs/themes/tanuki/static/fonts/GeistMono-Variable.woff2 +0 -0
- package/docs/themes/tanuki/static/img/tanuki-icon.avif +0 -0
- package/docs/themes/tanuki/static/img/tanuki-icon.png +0 -0
- package/docs/themes/tanuki/static/js/anchors.js +18 -0
- package/docs/themes/tanuki/static/js/app.js +274 -0
- package/docs/themes/tanuki/static/js/code.js +394 -0
- package/docs/themes/tanuki/static/js/navigation.js +778 -0
- package/docs/themes/tanuki/static/js/scroll-to-top.js +33 -0
- package/docs/themes/tanuki/static/js/search-raskell.js +240 -0
- package/docs/themes/tanuki/static/js/search.js +215 -0
- package/docs/themes/tanuki/static/js/theme.js +169 -0
- package/docs/themes/tanuki/static/syntax-dark.css +151 -0
- package/docs/themes/tanuki/static/syntax-light.css +151 -0
- package/docs/themes/tanuki/static/wasm/sentinel_playground_wasm.js +486 -0
- package/docs/themes/tanuki/static/wasm/sentinel_playground_wasm_bg.wasm +0 -0
- package/docs/themes/tanuki/templates/404.html +52 -0
- package/docs/themes/tanuki/templates/base.html +428 -0
- package/docs/themes/tanuki/templates/blog.html +66 -0
- package/docs/themes/tanuki/templates/home.html +108 -0
- package/docs/themes/tanuki/templates/index.html +178 -0
- package/docs/themes/tanuki/templates/landing.html +168 -0
- package/docs/themes/tanuki/templates/macros/nav.html +128 -0
- package/docs/themes/tanuki/templates/macros/posts.html +101 -0
- package/docs/themes/tanuki/templates/macros/ui.html +159 -0
- package/docs/themes/tanuki/templates/page.html +135 -0
- package/docs/themes/tanuki/templates/partials/footer.html +38 -0
- package/docs/themes/tanuki/templates/partials/header.html +366 -0
- package/docs/themes/tanuki/templates/partials/nav-buttons.html +55 -0
- package/docs/themes/tanuki/templates/partials/nav-overlay.html +81 -0
- package/docs/themes/tanuki/templates/partials/page-toc-panel.html +43 -0
- package/docs/themes/tanuki/templates/partials/search.html +52 -0
- package/docs/themes/tanuki/templates/partials/sidebar.html +107 -0
- package/docs/themes/tanuki/templates/partials/theme-toggle.html +35 -0
- package/docs/themes/tanuki/templates/partials/toc-overlay.html +146 -0
- package/docs/themes/tanuki/templates/partials/version-picker.html +38 -0
- package/docs/themes/tanuki/templates/print.html +244 -0
- package/docs/themes/tanuki/templates/section.html +186 -0
- package/docs/themes/tanuki/templates/taxonomy_list.html +18 -0
- package/docs/themes/tanuki/templates/taxonomy_single.html +31 -0
- package/docs/themes/tanuki/theme.toml +58 -0
- package/examples/hello-agent.rs +55 -0
- package/package.json +36 -0
- package/proto/config.proto +60 -0
- package/proto/events.proto +0 -0
- package/proto/runtime.proto +215 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//! Streaming Protection Layer
|
|
2
|
+
//!
|
|
3
|
+
//! Output processors that run AFTER kernel execution, BEFORE storage/streaming.
|
|
4
|
+
//!
|
|
5
|
+
//! ## Architecture
|
|
6
|
+
//!
|
|
7
|
+
//! This module implements the protection layer from [17-GUARDRAILS-PROTECTION.md].
|
|
8
|
+
//! All observability data passes through this layer before storage or transmission.
|
|
9
|
+
//!
|
|
10
|
+
//! ```text
|
|
11
|
+
//! ExecutionKernel
|
|
12
|
+
//! │
|
|
13
|
+
//! ▼ (StreamEvent)
|
|
14
|
+
//! ┌─────────────────────────────────────┐
|
|
15
|
+
//! │ Protection Pipeline │
|
|
16
|
+
//! │ ┌───────────┐ ┌────────────────┐ │
|
|
17
|
+
//! │ │ PII │→ │ Encryption │ │
|
|
18
|
+
//! │ │ Protection│ │ (storage) │ │
|
|
19
|
+
//! │ └───────────┘ └────────────────┘ │
|
|
20
|
+
//! └─────────────────────────────────────┘
|
|
21
|
+
//! │ │
|
|
22
|
+
//! ▼ (masked) ▼ (encrypted)
|
|
23
|
+
//! SSE/GUI EventStore
|
|
24
|
+
//! ```
|
|
25
|
+
//!
|
|
26
|
+
//! ## Key Invariants
|
|
27
|
+
//!
|
|
28
|
+
//! - **No raw PII to frontend**: Kernel never emits raw PII to frontend-visible channels
|
|
29
|
+
//! - **Protection before storage**: All events pass through protection before storage
|
|
30
|
+
//! - **Streaming is read-only**: Processors transform payloads, don't mutate state
|
|
31
|
+
//!
|
|
32
|
+
//! @see docs/TECHNICAL/17-GUARDRAILS-PROTECTION.md
|
|
33
|
+
//! @see docs/TECHNICAL/25-STREAM-PROCESSORS.md
|
|
34
|
+
|
|
35
|
+
mod context;
|
|
36
|
+
mod encryption;
|
|
37
|
+
mod pii_protection;
|
|
38
|
+
mod processor;
|
|
39
|
+
|
|
40
|
+
pub use context::{DataDestination, ProtectionContext};
|
|
41
|
+
pub use encryption::EncryptionProcessor;
|
|
42
|
+
pub use pii_protection::PiiProtectionProcessor;
|
|
43
|
+
pub use processor::{OutputProcessor, ProcessedEvent, ProcessorPipeline};
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
//! PII Protection Processor
|
|
2
|
+
//!
|
|
3
|
+
//! Masks PII in stream events before storage or streaming to frontend.
|
|
4
|
+
//! Uses `enact-guardrails` for detection and redaction.
|
|
5
|
+
|
|
6
|
+
use super::context::{DataDestination, ProtectionContext};
|
|
7
|
+
use super::processor::{OutputProcessor, ProcessedEvent};
|
|
8
|
+
use crate::streaming::StreamEvent;
|
|
9
|
+
use async_trait::async_trait;
|
|
10
|
+
|
|
11
|
+
#[cfg(feature = "guardrails")]
|
|
12
|
+
use enact_guardrails::{PiiDetector, PiiRedactor};
|
|
13
|
+
|
|
14
|
+
/// PII Protection Processor
|
|
15
|
+
///
|
|
16
|
+
/// Detects and masks PII in event payloads based on destination:
|
|
17
|
+
/// - Stream (frontend): Always mask
|
|
18
|
+
/// - Storage: Mask + optionally encrypt (future)
|
|
19
|
+
/// - Log: Hash sensitive fields
|
|
20
|
+
/// - AuditExport: Mask for external, allow for internal
|
|
21
|
+
pub struct PiiProtectionProcessor {
|
|
22
|
+
#[cfg(feature = "guardrails")]
|
|
23
|
+
detector: PiiDetector,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
impl PiiProtectionProcessor {
|
|
27
|
+
/// Create a new PII protection processor
|
|
28
|
+
#[cfg(feature = "guardrails")]
|
|
29
|
+
pub fn new() -> Self {
|
|
30
|
+
Self {
|
|
31
|
+
detector: PiiDetector::new(),
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// Create a new PII protection processor (no-op when guardrails feature disabled)
|
|
36
|
+
#[cfg(not(feature = "guardrails"))]
|
|
37
|
+
pub fn new() -> Self {
|
|
38
|
+
Self {}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// Mask PII in a text field
|
|
42
|
+
#[cfg(feature = "guardrails")]
|
|
43
|
+
fn mask_text(&self, text: &str) -> (String, bool) {
|
|
44
|
+
let matches = self.detector.detect(text);
|
|
45
|
+
if matches.is_empty() {
|
|
46
|
+
(text.to_string(), false)
|
|
47
|
+
} else {
|
|
48
|
+
(PiiRedactor::redact_matches(text, &matches), true)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/// Mask PII in a text field (no-op when guardrails disabled)
|
|
53
|
+
#[cfg(not(feature = "guardrails"))]
|
|
54
|
+
fn mask_text(&self, text: &str) -> (String, bool) {
|
|
55
|
+
(text.to_string(), false)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/// Process a StreamEvent, masking any PII in text fields
|
|
59
|
+
fn mask_event(&self, event: StreamEvent, ctx: &ProtectionContext) -> ProcessedEvent {
|
|
60
|
+
// For internal audit exports, don't mask (they need full access)
|
|
61
|
+
if ctx.destination == DataDestination::AuditExport && ctx.is_internal_audit {
|
|
62
|
+
return ProcessedEvent::unchanged(event);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
match event {
|
|
66
|
+
StreamEvent::TextDelta { id, delta } => {
|
|
67
|
+
let (masked_delta, was_modified) = self.mask_text(&delta);
|
|
68
|
+
if was_modified {
|
|
69
|
+
ProcessedEvent::modified(StreamEvent::TextDelta {
|
|
70
|
+
id,
|
|
71
|
+
delta: masked_delta,
|
|
72
|
+
})
|
|
73
|
+
} else {
|
|
74
|
+
ProcessedEvent::unchanged(StreamEvent::TextDelta { id, delta })
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
StreamEvent::StepEnd {
|
|
78
|
+
execution_id,
|
|
79
|
+
step_id,
|
|
80
|
+
output,
|
|
81
|
+
duration_ms,
|
|
82
|
+
timestamp,
|
|
83
|
+
} => {
|
|
84
|
+
let (masked_output, was_modified) = match output {
|
|
85
|
+
Some(ref text) => {
|
|
86
|
+
let (masked, modified) = self.mask_text(text);
|
|
87
|
+
(Some(masked), modified)
|
|
88
|
+
}
|
|
89
|
+
None => (None, false),
|
|
90
|
+
};
|
|
91
|
+
if was_modified {
|
|
92
|
+
ProcessedEvent::modified(StreamEvent::StepEnd {
|
|
93
|
+
execution_id,
|
|
94
|
+
step_id,
|
|
95
|
+
output: masked_output,
|
|
96
|
+
duration_ms,
|
|
97
|
+
timestamp,
|
|
98
|
+
})
|
|
99
|
+
} else {
|
|
100
|
+
ProcessedEvent::unchanged(StreamEvent::StepEnd {
|
|
101
|
+
execution_id,
|
|
102
|
+
step_id,
|
|
103
|
+
output,
|
|
104
|
+
duration_ms,
|
|
105
|
+
timestamp,
|
|
106
|
+
})
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
StreamEvent::ExecutionEnd {
|
|
110
|
+
execution_id,
|
|
111
|
+
final_output,
|
|
112
|
+
duration_ms,
|
|
113
|
+
timestamp,
|
|
114
|
+
} => {
|
|
115
|
+
let (masked_output, was_modified) = match final_output {
|
|
116
|
+
Some(ref text) => {
|
|
117
|
+
let (masked, modified) = self.mask_text(text);
|
|
118
|
+
(Some(masked), modified)
|
|
119
|
+
}
|
|
120
|
+
None => (None, false),
|
|
121
|
+
};
|
|
122
|
+
if was_modified {
|
|
123
|
+
ProcessedEvent::modified(StreamEvent::ExecutionEnd {
|
|
124
|
+
execution_id,
|
|
125
|
+
final_output: masked_output,
|
|
126
|
+
duration_ms,
|
|
127
|
+
timestamp,
|
|
128
|
+
})
|
|
129
|
+
} else {
|
|
130
|
+
ProcessedEvent::unchanged(StreamEvent::ExecutionEnd {
|
|
131
|
+
execution_id,
|
|
132
|
+
final_output,
|
|
133
|
+
duration_ms,
|
|
134
|
+
timestamp,
|
|
135
|
+
})
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
StreamEvent::Error { error } => {
|
|
139
|
+
// Mask error messages - they might contain PII
|
|
140
|
+
let (masked_message, was_modified) = self.mask_text(&error.message);
|
|
141
|
+
if was_modified {
|
|
142
|
+
let mut masked_error = error.clone();
|
|
143
|
+
masked_error.message = masked_message;
|
|
144
|
+
ProcessedEvent::modified(StreamEvent::Error {
|
|
145
|
+
error: masked_error,
|
|
146
|
+
})
|
|
147
|
+
} else {
|
|
148
|
+
ProcessedEvent::unchanged(StreamEvent::Error { error })
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Events without text content pass through unchanged
|
|
152
|
+
_ => ProcessedEvent::unchanged(event),
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
impl Default for PiiProtectionProcessor {
|
|
158
|
+
fn default() -> Self {
|
|
159
|
+
Self::new()
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
#[async_trait]
|
|
164
|
+
impl OutputProcessor for PiiProtectionProcessor {
|
|
165
|
+
fn name(&self) -> &str {
|
|
166
|
+
"pii-protection"
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async fn process(
|
|
170
|
+
&self,
|
|
171
|
+
event: StreamEvent,
|
|
172
|
+
ctx: &ProtectionContext,
|
|
173
|
+
) -> anyhow::Result<ProcessedEvent> {
|
|
174
|
+
Ok(self.mask_event(event, ctx))
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
#[cfg(test)]
|
|
179
|
+
mod tests {
|
|
180
|
+
use super::*;
|
|
181
|
+
use crate::kernel::ExecutionId;
|
|
182
|
+
|
|
183
|
+
#[tokio::test]
|
|
184
|
+
async fn test_pii_protection_processor_name() {
|
|
185
|
+
let processor = PiiProtectionProcessor::new();
|
|
186
|
+
assert_eq!(processor.name(), "pii-protection");
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
#[cfg(feature = "guardrails")]
|
|
190
|
+
#[tokio::test]
|
|
191
|
+
async fn test_pii_protection_masks_email_in_text_delta() {
|
|
192
|
+
let processor = PiiProtectionProcessor::new();
|
|
193
|
+
let ctx = ProtectionContext::for_stream();
|
|
194
|
+
|
|
195
|
+
let event = StreamEvent::TextDelta {
|
|
196
|
+
id: "test".to_string(),
|
|
197
|
+
delta: "Contact me at user@example.com".to_string(),
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
let result = processor.process(event, &ctx).await.unwrap();
|
|
201
|
+
assert!(result.was_modified);
|
|
202
|
+
|
|
203
|
+
if let StreamEvent::TextDelta { delta, .. } = result.event {
|
|
204
|
+
assert!(delta.contains("us***@example.com"));
|
|
205
|
+
assert!(!delta.contains("user@example.com"));
|
|
206
|
+
} else {
|
|
207
|
+
panic!("Expected TextDelta event");
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
#[cfg(feature = "guardrails")]
|
|
212
|
+
#[tokio::test]
|
|
213
|
+
async fn test_pii_protection_skips_internal_audit() {
|
|
214
|
+
let processor = PiiProtectionProcessor::new();
|
|
215
|
+
let ctx = ProtectionContext::for_audit(true); // internal audit
|
|
216
|
+
|
|
217
|
+
let event = StreamEvent::TextDelta {
|
|
218
|
+
id: "test".to_string(),
|
|
219
|
+
delta: "Contact me at user@example.com".to_string(),
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
let result = processor.process(event, &ctx).await.unwrap();
|
|
223
|
+
// Internal audit should NOT mask
|
|
224
|
+
assert!(!result.was_modified);
|
|
225
|
+
|
|
226
|
+
if let StreamEvent::TextDelta { delta, .. } = result.event {
|
|
227
|
+
assert!(delta.contains("user@example.com")); // unmasked
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
#[tokio::test]
|
|
232
|
+
async fn test_pii_protection_unchanged_event() {
|
|
233
|
+
let processor = PiiProtectionProcessor::new();
|
|
234
|
+
let ctx = ProtectionContext::for_stream();
|
|
235
|
+
|
|
236
|
+
// Events without text content pass through unchanged
|
|
237
|
+
let exec_id = ExecutionId::new();
|
|
238
|
+
let event = StreamEvent::execution_start(&exec_id);
|
|
239
|
+
|
|
240
|
+
let result = processor.process(event, &ctx).await.unwrap();
|
|
241
|
+
assert!(!result.was_modified);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
//! Output Processor Trait
|
|
2
|
+
//!
|
|
3
|
+
//! Defines the trait for output processors that transform events before
|
|
4
|
+
//! storage or streaming.
|
|
5
|
+
|
|
6
|
+
use super::context::ProtectionContext;
|
|
7
|
+
use crate::streaming::StreamEvent;
|
|
8
|
+
use async_trait::async_trait;
|
|
9
|
+
use std::sync::Arc;
|
|
10
|
+
|
|
11
|
+
/// Result of processing an event
|
|
12
|
+
#[derive(Debug, Clone)]
|
|
13
|
+
pub struct ProcessedEvent {
|
|
14
|
+
/// The processed event (may be transformed)
|
|
15
|
+
pub event: StreamEvent,
|
|
16
|
+
|
|
17
|
+
/// Whether the event was modified
|
|
18
|
+
pub was_modified: bool,
|
|
19
|
+
|
|
20
|
+
/// Optional: encrypted payload for storage (if applicable)
|
|
21
|
+
pub encrypted_payload: Option<String>,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
impl ProcessedEvent {
|
|
25
|
+
/// Create a processed event that was not modified
|
|
26
|
+
pub fn unchanged(event: StreamEvent) -> Self {
|
|
27
|
+
Self {
|
|
28
|
+
event,
|
|
29
|
+
was_modified: false,
|
|
30
|
+
encrypted_payload: None,
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/// Create a processed event that was modified
|
|
35
|
+
pub fn modified(event: StreamEvent) -> Self {
|
|
36
|
+
Self {
|
|
37
|
+
event,
|
|
38
|
+
was_modified: true,
|
|
39
|
+
encrypted_payload: None,
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// Add an encrypted payload (for storage destination)
|
|
44
|
+
pub fn with_encrypted(mut self, encrypted: String) -> Self {
|
|
45
|
+
self.encrypted_payload = Some(encrypted);
|
|
46
|
+
self
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/// Output Processor trait
|
|
51
|
+
///
|
|
52
|
+
/// Processors run AFTER kernel execution, BEFORE storage/streaming.
|
|
53
|
+
/// They MUST NOT mutate execution state (streaming is read-only).
|
|
54
|
+
#[async_trait]
|
|
55
|
+
pub trait OutputProcessor: Send + Sync {
|
|
56
|
+
/// Processor name for logging/metrics
|
|
57
|
+
fn name(&self) -> &str;
|
|
58
|
+
|
|
59
|
+
/// Process an event before storage/streaming
|
|
60
|
+
///
|
|
61
|
+
/// # Arguments
|
|
62
|
+
/// * `event` - The event to process
|
|
63
|
+
/// * `ctx` - Protection context (destination, tenant, etc.)
|
|
64
|
+
///
|
|
65
|
+
/// # Returns
|
|
66
|
+
/// The processed event, potentially transformed
|
|
67
|
+
async fn process(
|
|
68
|
+
&self,
|
|
69
|
+
event: StreamEvent,
|
|
70
|
+
ctx: &ProtectionContext,
|
|
71
|
+
) -> anyhow::Result<ProcessedEvent>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/// Processor Pipeline - chains multiple processors
|
|
75
|
+
pub struct ProcessorPipeline {
|
|
76
|
+
processors: Vec<Arc<dyn OutputProcessor>>,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
impl ProcessorPipeline {
|
|
80
|
+
/// Create a new empty pipeline
|
|
81
|
+
pub fn new() -> Self {
|
|
82
|
+
Self { processors: vec![] }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/// Add a processor to the pipeline
|
|
86
|
+
pub fn add(mut self, processor: Arc<dyn OutputProcessor>) -> Self {
|
|
87
|
+
self.processors.push(processor);
|
|
88
|
+
self
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/// Run all processors in sequence
|
|
92
|
+
pub async fn process(
|
|
93
|
+
&self,
|
|
94
|
+
event: StreamEvent,
|
|
95
|
+
ctx: &ProtectionContext,
|
|
96
|
+
) -> anyhow::Result<ProcessedEvent> {
|
|
97
|
+
let mut current_event = event;
|
|
98
|
+
let mut any_modified = false;
|
|
99
|
+
let mut encrypted_payload = None;
|
|
100
|
+
|
|
101
|
+
for processor in &self.processors {
|
|
102
|
+
let result = processor.process(current_event, ctx).await?;
|
|
103
|
+
any_modified = any_modified || result.was_modified;
|
|
104
|
+
encrypted_payload = result.encrypted_payload.or(encrypted_payload);
|
|
105
|
+
current_event = result.event;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
Ok(ProcessedEvent {
|
|
109
|
+
event: current_event,
|
|
110
|
+
was_modified: any_modified,
|
|
111
|
+
encrypted_payload,
|
|
112
|
+
})
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/// Check if the pipeline is empty
|
|
116
|
+
pub fn is_empty(&self) -> bool {
|
|
117
|
+
self.processors.is_empty()
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/// Get the number of processors
|
|
121
|
+
pub fn len(&self) -> usize {
|
|
122
|
+
self.processors.len()
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
impl Default for ProcessorPipeline {
|
|
127
|
+
fn default() -> Self {
|
|
128
|
+
Self::new()
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
#[cfg(test)]
|
|
133
|
+
mod tests {
|
|
134
|
+
use super::*;
|
|
135
|
+
|
|
136
|
+
#[test]
|
|
137
|
+
fn test_processed_event_unchanged() {
|
|
138
|
+
let event = StreamEvent::text_start(None);
|
|
139
|
+
let processed = ProcessedEvent::unchanged(event);
|
|
140
|
+
assert!(!processed.was_modified);
|
|
141
|
+
assert!(processed.encrypted_payload.is_none());
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
#[test]
|
|
145
|
+
fn test_processed_event_modified() {
|
|
146
|
+
let event = StreamEvent::text_start(None);
|
|
147
|
+
let processed = ProcessedEvent::modified(event);
|
|
148
|
+
assert!(processed.was_modified);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
#[test]
|
|
152
|
+
fn test_processed_event_with_encrypted() {
|
|
153
|
+
let event = StreamEvent::text_start(None);
|
|
154
|
+
let processed =
|
|
155
|
+
ProcessedEvent::modified(event).with_encrypted("encrypted_data".to_string());
|
|
156
|
+
assert!(processed.encrypted_payload.is_some());
|
|
157
|
+
assert_eq!(processed.encrypted_payload.unwrap(), "encrypted_data");
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
#[test]
|
|
161
|
+
fn test_pipeline_new() {
|
|
162
|
+
let pipeline = ProcessorPipeline::new();
|
|
163
|
+
assert!(pipeline.is_empty());
|
|
164
|
+
assert_eq!(pipeline.len(), 0);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
//! Telemetry module - OpenTelemetry integration
|
|
2
|
+
//!
|
|
3
|
+
//! This module bridges core execution IDs and events into OpenTelemetry spans/traces.
|
|
4
|
+
//!
|
|
5
|
+
//! ## Important: Source of Truth
|
|
6
|
+
//!
|
|
7
|
+
//! IDs and Events are DEFINED in `kernel/` (source of truth).
|
|
8
|
+
//! This module bridges them into OpenTelemetry spans/traces.
|
|
9
|
+
//! No new domain types defined here.
|
|
10
|
+
//!
|
|
11
|
+
//! ## What This Module Provides
|
|
12
|
+
//!
|
|
13
|
+
//! - **Span attribute types**: ExecutionSpanAttributes, StepSpanAttributes, etc.
|
|
14
|
+
//! - **Span name generators**: execution_span_name, step_span_name, etc.
|
|
15
|
+
//! - **Trace context extraction**: extract_trace_context
|
|
16
|
+
//!
|
|
17
|
+
//! ## Architecture
|
|
18
|
+
//!
|
|
19
|
+
//! ```text
|
|
20
|
+
//! kernel/ (source of truth)
|
|
21
|
+
//! │
|
|
22
|
+
//! │ IDs and Events
|
|
23
|
+
//! ▼
|
|
24
|
+
//! ┌─────────────────────────────────────────────────────────┐
|
|
25
|
+
//! │ telemetry/ │
|
|
26
|
+
//! │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
|
|
27
|
+
//! │ │ spans │ │ exporter │ │ init │ │
|
|
28
|
+
//! │ │(attributes)│ │ (OTel) │ │ (setup) │ │
|
|
29
|
+
//! │ └────────────┘ └────────────┘ └────────────┘ │
|
|
30
|
+
//! └────────────────────────────┬────────────────────────────┘
|
|
31
|
+
//! │
|
|
32
|
+
//! ▼
|
|
33
|
+
//! OpenTelemetry Collector
|
|
34
|
+
//! ```
|
|
35
|
+
//!
|
|
36
|
+
//! @see docs/TECHNICAL/01-EXECUTION-TELEMETRY.md
|
|
37
|
+
|
|
38
|
+
mod exporter;
|
|
39
|
+
mod init;
|
|
40
|
+
mod spans;
|
|
41
|
+
|
|
42
|
+
pub use spans::{
|
|
43
|
+
// Span attribute types
|
|
44
|
+
ExecutionSpanAttributes, LlmSpanAttributes, StepSpanAttributes, ToolSpanAttributes,
|
|
45
|
+
// Span name generators
|
|
46
|
+
execution_span_name, llm_span_name, step_span_name, tool_span_name,
|
|
47
|
+
// Trace utilities
|
|
48
|
+
extract_trace_context,
|
|
49
|
+
};
|