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,206 @@
|
|
|
1
|
+
+++
|
|
2
|
+
title = "Providers"
|
|
3
|
+
weight = 5
|
|
4
|
+
sort_by = "weight"
|
|
5
|
+
+++
|
|
6
|
+
|
|
7
|
+
# LLM Providers
|
|
8
|
+
|
|
9
|
+
Enact supports multiple LLM providers through the `enact-providers` crate.
|
|
10
|
+
|
|
11
|
+
## Supported Providers
|
|
12
|
+
|
|
13
|
+
| Provider | Status | Models |
|
|
14
|
+
|----------|--------|--------|
|
|
15
|
+
| Azure OpenAI | ✅ Implemented | GPT-4, GPT-4 Turbo, GPT-3.5 |
|
|
16
|
+
| OpenAI | ✅ Implemented | GPT-4, GPT-4 Turbo, GPT-3.5 |
|
|
17
|
+
| Anthropic | ✅ Implemented | Claude 3 Opus, Sonnet, Haiku |
|
|
18
|
+
| Google Gemini | ✅ Implemented | Gemini Pro, Gemini Ultra |
|
|
19
|
+
| OpenRouter | ✅ Implemented | Multiple models via API |
|
|
20
|
+
| Ollama | ✅ Implemented | Llama, Mistral, etc. (local) |
|
|
21
|
+
|
|
22
|
+
## Configuration
|
|
23
|
+
|
|
24
|
+
### Environment Variables
|
|
25
|
+
|
|
26
|
+
Create a `.env` file:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Azure OpenAI
|
|
30
|
+
AZURE_OPENAI_API_KEY=your-key
|
|
31
|
+
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com
|
|
32
|
+
AZURE_OPENAI_DEPLOYMENT=gpt-4
|
|
33
|
+
AZURE_OPENAI_API_VERSION=2024-02-01
|
|
34
|
+
|
|
35
|
+
# OpenAI
|
|
36
|
+
OPENAI_API_KEY=sk-...
|
|
37
|
+
OPENAI_ORG_ID=org-... # Optional
|
|
38
|
+
|
|
39
|
+
# Anthropic
|
|
40
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
41
|
+
|
|
42
|
+
# Google
|
|
43
|
+
GOOGLE_API_KEY=...
|
|
44
|
+
|
|
45
|
+
# OpenRouter
|
|
46
|
+
OPENROUTER_API_KEY=sk-or-...
|
|
47
|
+
|
|
48
|
+
# Ollama (local)
|
|
49
|
+
OLLAMA_ENDPOINT=http://localhost:11434
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Azure OpenAI
|
|
53
|
+
|
|
54
|
+
```rust
|
|
55
|
+
use enact_providers::azure::AzureOpenAiProvider;
|
|
56
|
+
use enact_config::Config;
|
|
57
|
+
|
|
58
|
+
let config = Config::load()?;
|
|
59
|
+
let provider = AzureOpenAiProvider::from_config(&config)?;
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Required environment variables:**
|
|
63
|
+
- `AZURE_OPENAI_API_KEY`
|
|
64
|
+
- `AZURE_OPENAI_ENDPOINT`
|
|
65
|
+
- `AZURE_OPENAI_DEPLOYMENT`
|
|
66
|
+
|
|
67
|
+
**Optional:**
|
|
68
|
+
- `AZURE_OPENAI_API_VERSION` (default: `2024-02-01`)
|
|
69
|
+
|
|
70
|
+
## OpenAI
|
|
71
|
+
|
|
72
|
+
```rust
|
|
73
|
+
use enact_providers::openai_compatible::OpenAiProvider;
|
|
74
|
+
|
|
75
|
+
let provider = OpenAiProvider::new(
|
|
76
|
+
"https://api.openai.com/v1",
|
|
77
|
+
std::env::var("OPENAI_API_KEY")?,
|
|
78
|
+
"gpt-4",
|
|
79
|
+
)?;
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Anthropic
|
|
83
|
+
|
|
84
|
+
```rust
|
|
85
|
+
use enact_providers::anthropic::AnthropicProvider;
|
|
86
|
+
|
|
87
|
+
let provider = AnthropicProvider::new(
|
|
88
|
+
std::env::var("ANTHROPIC_API_KEY")?,
|
|
89
|
+
"claude-3-opus-20240229",
|
|
90
|
+
)?;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Google Gemini
|
|
94
|
+
|
|
95
|
+
```rust
|
|
96
|
+
use enact_providers::gemini::GeminiProvider;
|
|
97
|
+
|
|
98
|
+
let provider = GeminiProvider::new(
|
|
99
|
+
std::env::var("GOOGLE_API_KEY")?,
|
|
100
|
+
"gemini-pro",
|
|
101
|
+
)?;
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## OpenRouter
|
|
105
|
+
|
|
106
|
+
Access multiple models through OpenRouter:
|
|
107
|
+
|
|
108
|
+
```rust
|
|
109
|
+
use enact_providers::openrouter::OpenRouterProvider;
|
|
110
|
+
|
|
111
|
+
let provider = OpenRouterProvider::new(
|
|
112
|
+
std::env::var("OPENROUTER_API_KEY")?,
|
|
113
|
+
"anthropic/claude-3-opus", // Or any supported model
|
|
114
|
+
)?;
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Ollama (Local)
|
|
118
|
+
|
|
119
|
+
Run models locally with Ollama:
|
|
120
|
+
|
|
121
|
+
```rust
|
|
122
|
+
use enact_providers::openai_compatible::OpenAiProvider;
|
|
123
|
+
|
|
124
|
+
// Ollama uses OpenAI-compatible API
|
|
125
|
+
let provider = OpenAiProvider::new(
|
|
126
|
+
"http://localhost:11434/v1",
|
|
127
|
+
"ollama", // No real key needed
|
|
128
|
+
"llama3",
|
|
129
|
+
)?;
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Setup Ollama:**
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# Install Ollama
|
|
136
|
+
curl -fsSL https://ollama.ai/install.sh | sh
|
|
137
|
+
|
|
138
|
+
# Pull a model
|
|
139
|
+
ollama pull llama3
|
|
140
|
+
|
|
141
|
+
# Start server (usually automatic)
|
|
142
|
+
ollama serve
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Provider Trait
|
|
146
|
+
|
|
147
|
+
All providers implement the `ModelProvider` trait:
|
|
148
|
+
|
|
149
|
+
```rust
|
|
150
|
+
#[async_trait]
|
|
151
|
+
pub trait ModelProvider: Send + Sync {
|
|
152
|
+
/// Generate a completion
|
|
153
|
+
async fn complete(&self, request: ChatRequest) -> Result<ChatResponse>;
|
|
154
|
+
|
|
155
|
+
/// Whether this provider requires network access
|
|
156
|
+
fn requires_network(&self) -> bool { true }
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## In YAML Agents
|
|
161
|
+
|
|
162
|
+
Specify the model in LLM nodes:
|
|
163
|
+
|
|
164
|
+
```yaml
|
|
165
|
+
nodes:
|
|
166
|
+
analyze:
|
|
167
|
+
type: llm
|
|
168
|
+
model: gpt-4 # Uses default provider for this model
|
|
169
|
+
system_prompt: "..."
|
|
170
|
+
|
|
171
|
+
summarize:
|
|
172
|
+
type: llm
|
|
173
|
+
model: claude-3-opus # Different model
|
|
174
|
+
system_prompt: "..."
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Air-Gapped Mode
|
|
178
|
+
|
|
179
|
+
For environments without internet access, use Ollama:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# Configure for air-gapped
|
|
183
|
+
export OLLAMA_ENDPOINT=http://localhost:11434
|
|
184
|
+
|
|
185
|
+
# All LLM calls use local Ollama
|
|
186
|
+
enact serve --air-gapped # 🚧 Future
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Adding a New Provider (🚧 Future)
|
|
190
|
+
|
|
191
|
+
```rust
|
|
192
|
+
use enact_providers::ModelProvider;
|
|
193
|
+
|
|
194
|
+
pub struct MyProvider { /* ... */ }
|
|
195
|
+
|
|
196
|
+
#[async_trait]
|
|
197
|
+
impl ModelProvider for MyProvider {
|
|
198
|
+
async fn complete(&self, request: ChatRequest) -> Result<ChatResponse> {
|
|
199
|
+
// Implementation
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
fn requires_network(&self) -> bool {
|
|
203
|
+
true
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
```
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
+++
|
|
2
|
+
title = "Roadmap"
|
|
3
|
+
weight = 9
|
|
4
|
+
sort_by = "weight"
|
|
5
|
+
+++
|
|
6
|
+
|
|
7
|
+
# Roadmap
|
|
8
|
+
|
|
9
|
+
Current status and planned features for Enact.
|
|
10
|
+
|
|
11
|
+
## Current Status
|
|
12
|
+
|
|
13
|
+
Enact is a **complete, working AI agent system** with 900+ tests passing. Skills and MCP are now implemented.
|
|
14
|
+
|
|
15
|
+
## ✅ Completed Features
|
|
16
|
+
|
|
17
|
+
### CLI Binary (enact)
|
|
18
|
+
|
|
19
|
+
| Feature | Status |
|
|
20
|
+
|---------|--------|
|
|
21
|
+
| `enact --help` | ✅ Complete |
|
|
22
|
+
| `enact doctor` | ✅ Complete (pretty table output) |
|
|
23
|
+
| `enact version` | ✅ Complete (0.0.1) |
|
|
24
|
+
| `enact run --input "..."` | ✅ Complete |
|
|
25
|
+
| `enact serve --http-port` | ✅ Complete |
|
|
26
|
+
|
|
27
|
+
### Runner Integration
|
|
28
|
+
|
|
29
|
+
| Feature | Status |
|
|
30
|
+
|---------|--------|
|
|
31
|
+
| DefaultAgentRunner | ✅ Complete |
|
|
32
|
+
| RunnerResponder (gateway integration) | ✅ Complete |
|
|
33
|
+
| Retry logic | ✅ Complete |
|
|
34
|
+
| Compaction | ✅ Complete |
|
|
35
|
+
| Checkpoints | ✅ Complete |
|
|
36
|
+
|
|
37
|
+
### Production-Ready Gateway
|
|
38
|
+
|
|
39
|
+
| Feature | Status |
|
|
40
|
+
|---------|--------|
|
|
41
|
+
| Health endpoint (`/health`) | ✅ Complete |
|
|
42
|
+
| WhatsApp webhook (challenge + message) | ✅ Complete |
|
|
43
|
+
| Rate limiting (sliding window) | ✅ Complete |
|
|
44
|
+
| Idempotency (dedupe duplicates) | ✅ Complete |
|
|
45
|
+
| Signature verification | ✅ Complete |
|
|
46
|
+
| Request limits (64KB) + timeout (30s) | ✅ Complete |
|
|
47
|
+
| All with tests passing | ✅ Complete |
|
|
48
|
+
|
|
49
|
+
### LLM Providers
|
|
50
|
+
|
|
51
|
+
| Provider | Status |
|
|
52
|
+
|----------|--------|
|
|
53
|
+
| OpenAI (via OpenAICompatible) | ✅ Complete |
|
|
54
|
+
| Azure OpenAI | ✅ Complete |
|
|
55
|
+
| Anthropic | ✅ Complete |
|
|
56
|
+
| Google Gemini | ✅ Complete |
|
|
57
|
+
| OpenRouter | ✅ Complete |
|
|
58
|
+
| Ollama (local) | ✅ Complete |
|
|
59
|
+
|
|
60
|
+
### Channels
|
|
61
|
+
|
|
62
|
+
| Channel | Status |
|
|
63
|
+
|---------|--------|
|
|
64
|
+
| WhatsApp (gateway integration) | ✅ Complete |
|
|
65
|
+
| Telegram | ✅ Complete |
|
|
66
|
+
| Teams | ✅ Complete |
|
|
67
|
+
|
|
68
|
+
### Core Components
|
|
69
|
+
|
|
70
|
+
| Component | Status |
|
|
71
|
+
|-----------|--------|
|
|
72
|
+
| YAML Agent Schema | ✅ Complete |
|
|
73
|
+
| GraphLoader | ✅ Complete |
|
|
74
|
+
| StateGraph | ✅ Complete |
|
|
75
|
+
| LlmCallable | ✅ Complete |
|
|
76
|
+
| Configuration (.env) | ✅ Complete |
|
|
77
|
+
|
|
78
|
+
### CI/CD Pipeline
|
|
79
|
+
|
|
80
|
+
| Feature | Status |
|
|
81
|
+
|---------|--------|
|
|
82
|
+
| Automated testing on push/PR | ✅ Complete |
|
|
83
|
+
| Format checking with `rustfmt` | ✅ Complete |
|
|
84
|
+
| Linting with `clippy` | ✅ Complete |
|
|
85
|
+
| Cross-platform builds (Linux, macOS, Windows) | ✅ Complete |
|
|
86
|
+
| Caching for faster builds | ✅ Complete |
|
|
87
|
+
|
|
88
|
+
### Skills System (crates/enact-skills)
|
|
89
|
+
|
|
90
|
+
| Feature | Status |
|
|
91
|
+
|---------|--------|
|
|
92
|
+
| TOML skill manifests (`SKILL.toml`) | ✅ Complete |
|
|
93
|
+
| Markdown skill format (`SKILL.md`) | ✅ Complete |
|
|
94
|
+
| Tool definitions (shell, http, script) | ✅ Complete |
|
|
95
|
+
| Open-skills repo integration | ✅ Complete |
|
|
96
|
+
| 15+ comprehensive tests | ✅ Complete |
|
|
97
|
+
| Load skills from workspace directory | ✅ Complete |
|
|
98
|
+
| Convert skills to prompts | ✅ Complete |
|
|
99
|
+
|
|
100
|
+
### MCP Client (crates/enact-mcp)
|
|
101
|
+
|
|
102
|
+
| Feature | Status |
|
|
103
|
+
|---------|--------|
|
|
104
|
+
| Stdio transport support | ✅ Complete |
|
|
105
|
+
| JSON-RPC protocol | ✅ Complete |
|
|
106
|
+
| Tool listing | ✅ Complete |
|
|
107
|
+
| Tool calling | ✅ Complete |
|
|
108
|
+
| Async/await support | ✅ Complete |
|
|
109
|
+
|
|
110
|
+
### gRPC API (Proto Definitions)
|
|
111
|
+
|
|
112
|
+
Proto definitions are in `proto/`:
|
|
113
|
+
|
|
114
|
+
| Service | Methods | Status |
|
|
115
|
+
|---------|---------|--------|
|
|
116
|
+
| RuntimeService | RunAgent, RunAgentStream, Resume, Cancel, Pause | ✅ Proto designed |
|
|
117
|
+
| ConfigService | GetSecret, SetSecret, GetConfig, SyncConfig | ✅ Proto designed |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 🚧 In Progress
|
|
122
|
+
|
|
123
|
+
Currently being implemented:
|
|
124
|
+
|
|
125
|
+
### Agent-to-Agent (A2A)
|
|
126
|
+
|
|
127
|
+
- [ ] Agent-to-agent communication protocol
|
|
128
|
+
- [ ] Agent discovery
|
|
129
|
+
- [ ] Orchestration patterns
|
|
130
|
+
- [ ] Shared state management
|
|
131
|
+
|
|
132
|
+
### Custom Webhooks
|
|
133
|
+
|
|
134
|
+
- [ ] Generic webhook endpoint
|
|
135
|
+
- [ ] Webhook authentication
|
|
136
|
+
- [ ] Payload transformation
|
|
137
|
+
- [ ] Event routing
|
|
138
|
+
|
|
139
|
+
### OAuth & Token Lifecycle
|
|
140
|
+
|
|
141
|
+
- [ ] OAuth 2.0 token management
|
|
142
|
+
- [ ] Automatic token refresh
|
|
143
|
+
- [ ] Secure token storage (keychain integration)
|
|
144
|
+
- [ ] Per-channel authentication
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Future Considerations
|
|
149
|
+
|
|
150
|
+
### Additional Channels
|
|
151
|
+
|
|
152
|
+
- [ ] Email integration
|
|
153
|
+
|
|
154
|
+
### Developer Experience
|
|
155
|
+
|
|
156
|
+
- [ ] `enact init` - Project scaffolding
|
|
157
|
+
- [ ] `enact validate` - YAML validation
|
|
158
|
+
- [ ] `enact console` - Interactive TUI
|
|
159
|
+
- [ ] `enact logs` - Execution logs
|
|
160
|
+
|
|
161
|
+
### Advanced Features
|
|
162
|
+
|
|
163
|
+
- [ ] Event sourcing
|
|
164
|
+
- [ ] Policy enforcement
|
|
165
|
+
- [ ] Multi-tenancy
|
|
166
|
+
- [ ] gRPC API (Rust implementation from proto)
|
|
167
|
+
- [ ] WebSocket streaming
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Ready to Use
|
|
172
|
+
|
|
173
|
+
You now have a complete, working AI agent system:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# Test the CLI
|
|
177
|
+
./target/release/enact doctor
|
|
178
|
+
|
|
179
|
+
# Run tests
|
|
180
|
+
cargo test --workspace
|
|
181
|
+
|
|
182
|
+
# Run an agent (with API key)
|
|
183
|
+
OPENAI_API_KEY="..." ./target/release/enact run --input "Hello!"
|
|
184
|
+
|
|
185
|
+
# Start gateway (with WhatsApp creds)
|
|
186
|
+
WHATSAPP_ACCESS_TOKEN="..." WHATSAPP_ENDPOINT_ID="..." WHATSAPP_VERIFY_TOKEN="..." \
|
|
187
|
+
./target/release/enact serve --http-port 8080
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Contributing
|
|
191
|
+
|
|
192
|
+
We welcome contributions. Current priorities:
|
|
193
|
+
|
|
194
|
+
1. **A2A (Agent-to-Agent)** - In progress
|
|
195
|
+
2. **Custom Webhooks** - In progress
|
|
196
|
+
3. **OAuth/Token lifecycle** - In progress
|
|
197
|
+
4. **Documentation improvements**
|
|
198
|
+
|
|
199
|
+
See the [Developer Guide](/developers/) for how to contribute.
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
+++
|
|
2
|
+
title = "Security"
|
|
3
|
+
weight = 10
|
|
4
|
+
+++
|
|
5
|
+
|
|
6
|
+
# Security System
|
|
7
|
+
|
|
8
|
+
The `enact-security` crate provides security policy, audit logging, and action validation for agents.
|
|
9
|
+
|
|
10
|
+
## Autonomy Levels
|
|
11
|
+
|
|
12
|
+
| Level | Description | Write Access |
|
|
13
|
+
|-------|-------------|--------------|
|
|
14
|
+
| `read_only` | No modifications allowed | No |
|
|
15
|
+
| `supervised` | Actions require approval | Conditional |
|
|
16
|
+
| `full` | All actions allowed within policy | Yes |
|
|
17
|
+
|
|
18
|
+
## Security Policy
|
|
19
|
+
|
|
20
|
+
```rust
|
|
21
|
+
use enact_security::{SecurityPolicy, PolicyConfig, AutonomyLevel};
|
|
22
|
+
|
|
23
|
+
let config = PolicyConfig {
|
|
24
|
+
autonomy: AutonomyLevel::Supervised,
|
|
25
|
+
max_actions_per_hour: 1000,
|
|
26
|
+
blocked_commands: vec!["rm -rf /".into(), "sudo".into()],
|
|
27
|
+
require_approval_for: vec!["rm".into(), "mv".into()],
|
|
28
|
+
..PolicyConfig::default()
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
let policy = SecurityPolicy::new(config, workspace_dir);
|
|
32
|
+
|
|
33
|
+
// Check if action is allowed
|
|
34
|
+
if policy.can_act() {
|
|
35
|
+
// Validate a command
|
|
36
|
+
let result = policy.validate_command("rm file.txt", approved);
|
|
37
|
+
if result.allowed {
|
|
38
|
+
// Execute command
|
|
39
|
+
} else if result.requires_approval {
|
|
40
|
+
// Request user approval
|
|
41
|
+
} else {
|
|
42
|
+
// Blocked by policy
|
|
43
|
+
println!("Denied: {:?}", result.reason);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Risk Levels
|
|
49
|
+
|
|
50
|
+
| Level | Examples |
|
|
51
|
+
|-------|----------|
|
|
52
|
+
| `Low` | `ls`, `cat`, `echo` |
|
|
53
|
+
| `Medium` | `rm`, `mv`, `cp`, `chmod` |
|
|
54
|
+
| `High` | `rm -r`, blocked patterns |
|
|
55
|
+
| `Critical` | `rm -rf /`, `sudo`, `mkfs` |
|
|
56
|
+
|
|
57
|
+
### Rate Limiting
|
|
58
|
+
|
|
59
|
+
```rust
|
|
60
|
+
// Check rate limit
|
|
61
|
+
if policy.is_rate_limited() {
|
|
62
|
+
return Err("Rate limit exceeded");
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Record action (returns false if limit hit)
|
|
66
|
+
if !policy.record_action() {
|
|
67
|
+
return Err("Action budget exhausted");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Check remaining actions
|
|
71
|
+
let remaining = policy.remaining_actions();
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Path Validation
|
|
75
|
+
|
|
76
|
+
```rust
|
|
77
|
+
// Validate file path access
|
|
78
|
+
let result = policy.validate_path("src/main.rs", write: true);
|
|
79
|
+
if !result.allowed {
|
|
80
|
+
println!("Path blocked: {:?}", result.reason);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Check if path is in workspace
|
|
84
|
+
if policy.is_path_in_workspace(&resolved_path) {
|
|
85
|
+
// Safe to access
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Audit Logging
|
|
90
|
+
|
|
91
|
+
All security-relevant events are logged for compliance and debugging:
|
|
92
|
+
|
|
93
|
+
```rust
|
|
94
|
+
use enact_security::{AuditLogger, AuditConfig, AuditEvent, AuditEventType};
|
|
95
|
+
|
|
96
|
+
let config = AuditConfig {
|
|
97
|
+
enabled: true,
|
|
98
|
+
log_path: "audit.log".into(),
|
|
99
|
+
max_size_mb: 100,
|
|
100
|
+
retain_days: 90,
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
let logger = AuditLogger::new(config, workspace_dir)?;
|
|
104
|
+
|
|
105
|
+
// Log a command execution
|
|
106
|
+
logger.log_command(
|
|
107
|
+
"telegram", // channel
|
|
108
|
+
"ls -la", // command
|
|
109
|
+
"low", // risk level
|
|
110
|
+
false, // approved
|
|
111
|
+
true, // allowed
|
|
112
|
+
true, // success
|
|
113
|
+
15, // duration_ms
|
|
114
|
+
)?;
|
|
115
|
+
|
|
116
|
+
// Log a tool invocation
|
|
117
|
+
logger.log_tool(
|
|
118
|
+
"cli", // channel
|
|
119
|
+
"file_write", // tool name
|
|
120
|
+
true, // allowed
|
|
121
|
+
true, // success
|
|
122
|
+
42, // duration_ms
|
|
123
|
+
None, // error
|
|
124
|
+
)?;
|
|
125
|
+
|
|
126
|
+
// Log a policy violation
|
|
127
|
+
logger.log_violation("telegram", "Attempted to access /etc/passwd")?;
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Event Types
|
|
131
|
+
|
|
132
|
+
| Type | Description |
|
|
133
|
+
|------|-------------|
|
|
134
|
+
| `CommandExecution` | Shell command executed |
|
|
135
|
+
| `FileAccess` | File read/write |
|
|
136
|
+
| `ConfigChange` | Configuration modified |
|
|
137
|
+
| `AuthSuccess` | Authentication succeeded |
|
|
138
|
+
| `AuthFailure` | Authentication failed |
|
|
139
|
+
| `PolicyViolation` | Security policy violated |
|
|
140
|
+
| `SecurityEvent` | General security event |
|
|
141
|
+
| `ToolInvocation` | Agent tool invoked |
|
|
142
|
+
| `AgentAction` | Agent performed action |
|
|
143
|
+
|
|
144
|
+
### Log Rotation
|
|
145
|
+
|
|
146
|
+
Audit logs are automatically rotated when they exceed `max_size_mb`:
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
audit.log <- current
|
|
150
|
+
audit.log.1.log <- previous
|
|
151
|
+
audit.log.2.log <- older
|
|
152
|
+
...
|
|
153
|
+
audit.log.9.log <- oldest kept
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Log Format
|
|
157
|
+
|
|
158
|
+
Each log entry is a JSON line:
|
|
159
|
+
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"timestamp": "2026-02-21T12:00:00Z",
|
|
163
|
+
"event_id": "550e8400-e29b-41d4-a716-446655440000",
|
|
164
|
+
"event_type": "command_execution",
|
|
165
|
+
"actor": {
|
|
166
|
+
"channel": "telegram",
|
|
167
|
+
"user_id": "123456",
|
|
168
|
+
"username": "@alice"
|
|
169
|
+
},
|
|
170
|
+
"action": {
|
|
171
|
+
"command": "ls -la",
|
|
172
|
+
"risk_level": "low",
|
|
173
|
+
"approved": false,
|
|
174
|
+
"allowed": true
|
|
175
|
+
},
|
|
176
|
+
"result": {
|
|
177
|
+
"success": true,
|
|
178
|
+
"exit_code": 0,
|
|
179
|
+
"duration_ms": 15
|
|
180
|
+
},
|
|
181
|
+
"security": {
|
|
182
|
+
"policy_violation": false,
|
|
183
|
+
"rate_limit_remaining": 999
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Configuration
|
|
189
|
+
|
|
190
|
+
```yaml
|
|
191
|
+
# In agent config
|
|
192
|
+
security:
|
|
193
|
+
autonomy: supervised # read_only, supervised, full
|
|
194
|
+
max_actions_per_hour: 1000
|
|
195
|
+
|
|
196
|
+
blocked_commands:
|
|
197
|
+
- "rm -rf /"
|
|
198
|
+
- "sudo"
|
|
199
|
+
- "chmod 777"
|
|
200
|
+
|
|
201
|
+
require_approval_for:
|
|
202
|
+
- rm
|
|
203
|
+
- mv
|
|
204
|
+
- chmod
|
|
205
|
+
|
|
206
|
+
audit:
|
|
207
|
+
enabled: true
|
|
208
|
+
log_path: audit.log
|
|
209
|
+
max_size_mb: 100
|
|
210
|
+
retain_days: 90
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Best Practices
|
|
214
|
+
|
|
215
|
+
1. **Start with `supervised` mode** - Review actions before enabling `full` autonomy
|
|
216
|
+
2. **Configure blocked_commands** - Block dangerous patterns specific to your environment
|
|
217
|
+
3. **Enable audit logging** - Keep logs for compliance and debugging
|
|
218
|
+
4. **Set appropriate rate limits** - Prevent runaway agents
|
|
219
|
+
5. **Use path sandboxing** - Restrict agents to workspace directories
|