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,248 @@
|
|
|
1
|
+
+++
|
|
2
|
+
title = "Cron/Scheduler"
|
|
3
|
+
weight = 11
|
|
4
|
+
+++
|
|
5
|
+
|
|
6
|
+
# Cron Scheduling System
|
|
7
|
+
|
|
8
|
+
The `enact-cron` crate provides job scheduling with SQLite persistence for running agents and commands on schedules.
|
|
9
|
+
|
|
10
|
+
## Job Types
|
|
11
|
+
|
|
12
|
+
| Type | Description |
|
|
13
|
+
|------|-------------|
|
|
14
|
+
| `Shell` | Execute shell commands |
|
|
15
|
+
| `Agent` | Run an agent with a prompt |
|
|
16
|
+
|
|
17
|
+
## Schedule Types
|
|
18
|
+
|
|
19
|
+
### Cron Expressions
|
|
20
|
+
|
|
21
|
+
Standard cron syntax (5, 6, or 7 fields):
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
# 5 fields: minute hour day month weekday
|
|
25
|
+
0 9 * * * # Every day at 9:00 AM
|
|
26
|
+
|
|
27
|
+
# 6 fields: second minute hour day month weekday
|
|
28
|
+
0 30 9 * * * # Every day at 9:30 AM
|
|
29
|
+
|
|
30
|
+
# 7 fields: second minute hour day month weekday year
|
|
31
|
+
0 0 12 * * 1 2026 # Mondays at noon in 2026
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
With timezone support:
|
|
35
|
+
|
|
36
|
+
```rust
|
|
37
|
+
Schedule::Cron {
|
|
38
|
+
expr: "0 9 * * *".into(),
|
|
39
|
+
tz: Some("America/Los_Angeles".into()),
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### One-Shot Execution
|
|
44
|
+
|
|
45
|
+
Run once at a specific time:
|
|
46
|
+
|
|
47
|
+
```rust
|
|
48
|
+
Schedule::At {
|
|
49
|
+
at: Utc.with_ymd_and_hms(2026, 3, 15, 14, 30, 0).unwrap(),
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Interval-Based
|
|
54
|
+
|
|
55
|
+
Run at fixed intervals:
|
|
56
|
+
|
|
57
|
+
```rust
|
|
58
|
+
Schedule::Every {
|
|
59
|
+
every_ms: 60_000, // Every minute
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Usage
|
|
64
|
+
|
|
65
|
+
### Creating Jobs
|
|
66
|
+
|
|
67
|
+
```rust
|
|
68
|
+
use enact_cron::{CronStore, Schedule};
|
|
69
|
+
|
|
70
|
+
let store = CronStore::new(workspace_dir, max_history, max_tasks)?;
|
|
71
|
+
|
|
72
|
+
// Simple shell job
|
|
73
|
+
let job = store.add_job("0 9 * * *", "echo good morning")?;
|
|
74
|
+
|
|
75
|
+
// Shell job with options
|
|
76
|
+
let job = store.add_shell_job(
|
|
77
|
+
Some("daily-backup".into()),
|
|
78
|
+
Schedule::Cron { expr: "0 2 * * *".into(), tz: None },
|
|
79
|
+
"backup.sh"
|
|
80
|
+
)?;
|
|
81
|
+
|
|
82
|
+
// Agent job
|
|
83
|
+
let job = store.add_agent_job(
|
|
84
|
+
Some("daily-summary".into()),
|
|
85
|
+
Schedule::Cron { expr: "0 18 * * *".into(), tz: Some("UTC".into()) },
|
|
86
|
+
"Summarize today's activities",
|
|
87
|
+
Some("claude-3-sonnet".into()),
|
|
88
|
+
SessionTarget::Isolated,
|
|
89
|
+
)?;
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Managing Jobs
|
|
93
|
+
|
|
94
|
+
```rust
|
|
95
|
+
// List all jobs
|
|
96
|
+
let jobs = store.list_jobs()?;
|
|
97
|
+
|
|
98
|
+
// Get a specific job
|
|
99
|
+
let job = store.get_job(&job_id)?;
|
|
100
|
+
|
|
101
|
+
// Get jobs that are due to run
|
|
102
|
+
let due = store.due_jobs(Utc::now())?;
|
|
103
|
+
|
|
104
|
+
// Update a job
|
|
105
|
+
store.update_job(&job_id, CronJobPatch {
|
|
106
|
+
enabled: Some(false),
|
|
107
|
+
..Default::default()
|
|
108
|
+
})?;
|
|
109
|
+
|
|
110
|
+
// Remove a job
|
|
111
|
+
store.remove_job(&job_id)?;
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Running Jobs
|
|
115
|
+
|
|
116
|
+
```rust
|
|
117
|
+
// After executing a job, update its status
|
|
118
|
+
store.reschedule_after_run(&job, success, &output)?;
|
|
119
|
+
|
|
120
|
+
// Record execution history
|
|
121
|
+
store.record_run(
|
|
122
|
+
&job_id,
|
|
123
|
+
started_at,
|
|
124
|
+
finished_at,
|
|
125
|
+
"success",
|
|
126
|
+
Some(&output),
|
|
127
|
+
)?;
|
|
128
|
+
|
|
129
|
+
// Get job history
|
|
130
|
+
let runs = store.list_runs(&job_id, 10)?;
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Job Configuration
|
|
134
|
+
|
|
135
|
+
### CronJob Fields
|
|
136
|
+
|
|
137
|
+
| Field | Type | Description |
|
|
138
|
+
|-------|------|-------------|
|
|
139
|
+
| `id` | String | Unique job identifier |
|
|
140
|
+
| `expression` | String | Original schedule expression |
|
|
141
|
+
| `schedule` | Schedule | Parsed schedule (Cron/At/Every) |
|
|
142
|
+
| `command` | String | Shell command (for shell jobs) |
|
|
143
|
+
| `prompt` | Option<String> | Agent prompt (for agent jobs) |
|
|
144
|
+
| `name` | Option<String> | Human-readable name |
|
|
145
|
+
| `job_type` | JobType | Shell or Agent |
|
|
146
|
+
| `session_target` | SessionTarget | Isolated or Main |
|
|
147
|
+
| `model` | Option<String> | LLM model for agent jobs |
|
|
148
|
+
| `enabled` | bool | Whether job is active |
|
|
149
|
+
| `delivery` | DeliveryConfig | Output delivery config |
|
|
150
|
+
| `delete_after_run` | bool | Auto-delete after execution |
|
|
151
|
+
| `created_at` | DateTime | Creation timestamp |
|
|
152
|
+
| `next_run` | DateTime | Next scheduled run |
|
|
153
|
+
| `last_run` | Option<DateTime> | Last execution time |
|
|
154
|
+
| `last_status` | Option<String> | Last execution status |
|
|
155
|
+
| `last_output` | Option<String> | Last execution output |
|
|
156
|
+
|
|
157
|
+
### Session Targets
|
|
158
|
+
|
|
159
|
+
| Target | Description |
|
|
160
|
+
|--------|-------------|
|
|
161
|
+
| `Isolated` | Run in a fresh, isolated session |
|
|
162
|
+
| `Main` | Run in the main conversation session |
|
|
163
|
+
|
|
164
|
+
### Delivery Config
|
|
165
|
+
|
|
166
|
+
Configure how job output is delivered:
|
|
167
|
+
|
|
168
|
+
```rust
|
|
169
|
+
DeliveryConfig {
|
|
170
|
+
mode: "telegram".into(), // none, telegram, webhook
|
|
171
|
+
channel: Some("@mychannel".into()),
|
|
172
|
+
to: Some("user_id".into()),
|
|
173
|
+
best_effort: true,
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Schedule Utilities
|
|
178
|
+
|
|
179
|
+
### Parse Delay Strings
|
|
180
|
+
|
|
181
|
+
```rust
|
|
182
|
+
use enact_cron::parse_delay;
|
|
183
|
+
|
|
184
|
+
let duration = parse_delay("5m")?; // 5 minutes
|
|
185
|
+
let duration = parse_delay("2h")?; // 2 hours
|
|
186
|
+
let duration = parse_delay("1d")?; // 1 day
|
|
187
|
+
let duration = parse_delay("30s")?; // 30 seconds
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Validate Schedules
|
|
191
|
+
|
|
192
|
+
```rust
|
|
193
|
+
use enact_cron::validate_schedule;
|
|
194
|
+
|
|
195
|
+
// Check if a schedule is valid
|
|
196
|
+
validate_schedule(&schedule, Utc::now())?;
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Calculate Next Run
|
|
200
|
+
|
|
201
|
+
```rust
|
|
202
|
+
use enact_cron::next_run_for_schedule;
|
|
203
|
+
|
|
204
|
+
let next = next_run_for_schedule(&schedule, Utc::now())?;
|
|
205
|
+
println!("Next run at: {}", next);
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Example: Daily Agent Summary
|
|
209
|
+
|
|
210
|
+
```rust
|
|
211
|
+
// Create a daily summary job
|
|
212
|
+
let job = store.add_agent_job(
|
|
213
|
+
Some("end-of-day-summary".into()),
|
|
214
|
+
Schedule::Cron {
|
|
215
|
+
expr: "0 18 * * 1-5".into(), // 6 PM weekdays
|
|
216
|
+
tz: Some("America/New_York".into()),
|
|
217
|
+
},
|
|
218
|
+
"Generate a summary of today's completed tasks and tomorrow's priorities",
|
|
219
|
+
Some("claude-3-sonnet".into()),
|
|
220
|
+
SessionTarget::Main,
|
|
221
|
+
)?;
|
|
222
|
+
|
|
223
|
+
// Configure delivery to Telegram
|
|
224
|
+
store.update_job(&job.id, CronJobPatch {
|
|
225
|
+
delivery: Some(DeliveryConfig {
|
|
226
|
+
mode: "telegram".into(),
|
|
227
|
+
channel: Some("@team-updates".into()),
|
|
228
|
+
to: None,
|
|
229
|
+
best_effort: true,
|
|
230
|
+
}),
|
|
231
|
+
..Default::default()
|
|
232
|
+
})?;
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Persistence
|
|
236
|
+
|
|
237
|
+
Jobs are stored in SQLite with automatic schema management:
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
workspace/
|
|
241
|
+
└── cron.db # Job definitions and history
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
The store handles:
|
|
245
|
+
- Automatic table creation
|
|
246
|
+
- Job serialization/deserialization
|
|
247
|
+
- History cleanup (configurable max entries)
|
|
248
|
+
- Concurrent access safety
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
+++
|
|
2
|
+
title = "Developers"
|
|
3
|
+
weight = 8
|
|
4
|
+
sort_by = "weight"
|
|
5
|
+
+++
|
|
6
|
+
|
|
7
|
+
# Developer Guide
|
|
8
|
+
|
|
9
|
+
Contributing to Enact and understanding its internals.
|
|
10
|
+
|
|
11
|
+
## Crate Architecture
|
|
12
|
+
|
|
13
|
+
| Crate | Purpose | Status |
|
|
14
|
+
|-------|---------|--------|
|
|
15
|
+
| `enact-cli` | CLI binary (doctor, run, serve, version) | ✅ Complete |
|
|
16
|
+
| `enact-runner` | Execution loop, retry, compaction | ✅ Complete |
|
|
17
|
+
| `enact-core` | Callable, LlmCallable, Graph system | ✅ Complete |
|
|
18
|
+
| `enact-providers` | LLM provider implementations | ✅ Complete |
|
|
19
|
+
| `enact-gateway` | HTTP server, webhooks, rate limiting | ✅ Complete |
|
|
20
|
+
| `enact-channels` | WhatsApp, Telegram, Teams | ✅ Complete |
|
|
21
|
+
| `enact-config` | Configuration management | ✅ Complete |
|
|
22
|
+
| `enact-skills` | Skills system (TOML/MD manifests) | ✅ Complete |
|
|
23
|
+
| `enact-mcp` | MCP client (stdio, JSON-RPC) | ✅ Complete |
|
|
24
|
+
| `enact-context` | Context management | ✅ Complete |
|
|
25
|
+
| `enact-memory` | Memory/state persistence | ✅ Complete |
|
|
26
|
+
|
|
27
|
+
### Dependency Graph
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
enact-cli
|
|
31
|
+
│
|
|
32
|
+
├── enact-runner
|
|
33
|
+
│ │
|
|
34
|
+
│ └── enact-core
|
|
35
|
+
│ │
|
|
36
|
+
│ ├── enact-providers
|
|
37
|
+
│ ├── enact-config
|
|
38
|
+
│ ├── enact-skills
|
|
39
|
+
│ └── enact-mcp
|
|
40
|
+
│
|
|
41
|
+
├── enact-gateway
|
|
42
|
+
│ │
|
|
43
|
+
│ ├── enact-channels
|
|
44
|
+
│ └── enact-runner
|
|
45
|
+
│
|
|
46
|
+
├── enact-skills
|
|
47
|
+
│ │
|
|
48
|
+
│ └── enact-core
|
|
49
|
+
│
|
|
50
|
+
├── enact-mcp
|
|
51
|
+
│ │
|
|
52
|
+
│ └── enact-core
|
|
53
|
+
│
|
|
54
|
+
└── enact-channels
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Building from Source
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
git clone https://github.com/your-org/enact-agent.git
|
|
61
|
+
cd enact-agent
|
|
62
|
+
|
|
63
|
+
# Build all crates
|
|
64
|
+
cargo build
|
|
65
|
+
|
|
66
|
+
# Build release
|
|
67
|
+
cargo build --release
|
|
68
|
+
|
|
69
|
+
# Run tests
|
|
70
|
+
cargo test
|
|
71
|
+
|
|
72
|
+
# Run specific crate tests
|
|
73
|
+
cargo test -p enact-gateway
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Key Components
|
|
77
|
+
|
|
78
|
+
### Callable (enact-core)
|
|
79
|
+
|
|
80
|
+
The core trait for processing:
|
|
81
|
+
|
|
82
|
+
```rust
|
|
83
|
+
#[async_trait]
|
|
84
|
+
pub trait Callable: Send + Sync {
|
|
85
|
+
fn name(&self) -> &str;
|
|
86
|
+
async fn run(&self, input: &str) -> anyhow::Result<String>;
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### LlmCallable (enact-core)
|
|
91
|
+
|
|
92
|
+
LLM-powered callable:
|
|
93
|
+
|
|
94
|
+
```rust
|
|
95
|
+
pub struct LlmCallable {
|
|
96
|
+
name: String,
|
|
97
|
+
system_prompt: String,
|
|
98
|
+
provider: Arc<dyn ModelProvider>,
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
impl LlmCallable {
|
|
102
|
+
pub fn with_provider(
|
|
103
|
+
name: impl Into<String>,
|
|
104
|
+
system_prompt: impl Into<String>,
|
|
105
|
+
provider: Arc<dyn ModelProvider>,
|
|
106
|
+
) -> Self;
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### DefaultAgentRunner (enact-runner)
|
|
111
|
+
|
|
112
|
+
Executes callables with production features:
|
|
113
|
+
|
|
114
|
+
```rust
|
|
115
|
+
pub struct DefaultAgentRunner {
|
|
116
|
+
// retry, compaction, checkpoints
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
impl DefaultAgentRunner {
|
|
120
|
+
pub fn default_new() -> Self;
|
|
121
|
+
pub async fn run(&mut self, callable: &dyn Callable, input: &str)
|
|
122
|
+
-> anyhow::Result<LoopOutcome>;
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Gateway (enact-gateway)
|
|
127
|
+
|
|
128
|
+
HTTP server with webhooks:
|
|
129
|
+
|
|
130
|
+
```rust
|
|
131
|
+
pub fn router(state: GatewayState) -> Router;
|
|
132
|
+
pub async fn serve(config: GatewayConfig, state: GatewayState) -> anyhow::Result<()>;
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Key types:
|
|
136
|
+
- `GatewayConfig` - Server configuration
|
|
137
|
+
- `GatewayState` - Shared state (channel, responder, rate limiter)
|
|
138
|
+
- `InboundResponder` - Message handler trait
|
|
139
|
+
- `RunnerResponder` - Routes to DefaultAgentRunner
|
|
140
|
+
- `EchoResponder` - Simple echo
|
|
141
|
+
|
|
142
|
+
### Providers (enact-providers)
|
|
143
|
+
|
|
144
|
+
```rust
|
|
145
|
+
pub struct OpenAICompatible {
|
|
146
|
+
base_url: String,
|
|
147
|
+
model: String,
|
|
148
|
+
api_key: Option<String>,
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Channels (enact-channels)
|
|
153
|
+
|
|
154
|
+
```rust
|
|
155
|
+
pub struct WhatsAppChannel {
|
|
156
|
+
access_token: String,
|
|
157
|
+
endpoint_id: String,
|
|
158
|
+
verify_token: String,
|
|
159
|
+
allowed_numbers: Vec<String>,
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Testing
|
|
164
|
+
|
|
165
|
+
### Unit Tests
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# All tests
|
|
169
|
+
cargo test
|
|
170
|
+
|
|
171
|
+
# Specific crate
|
|
172
|
+
cargo test -p enact-gateway
|
|
173
|
+
|
|
174
|
+
# With output
|
|
175
|
+
cargo test -- --nocapture
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Gateway Tests
|
|
179
|
+
|
|
180
|
+
The gateway has comprehensive tests:
|
|
181
|
+
|
|
182
|
+
```rust
|
|
183
|
+
#[tokio::test]
|
|
184
|
+
async fn health_route_returns_ok() { ... }
|
|
185
|
+
|
|
186
|
+
#[tokio::test]
|
|
187
|
+
async fn whatsapp_verify_route_returns_challenge() { ... }
|
|
188
|
+
|
|
189
|
+
#[tokio::test]
|
|
190
|
+
async fn whatsapp_webhook_rejects_invalid_signature() { ... }
|
|
191
|
+
|
|
192
|
+
#[tokio::test]
|
|
193
|
+
async fn webhook_duplicate_payload_is_ignored() { ... }
|
|
194
|
+
|
|
195
|
+
#[tokio::test]
|
|
196
|
+
async fn webhook_accepts_valid_signature() { ... }
|
|
197
|
+
|
|
198
|
+
#[tokio::test]
|
|
199
|
+
async fn runner_responder_returns_callable_output() { ... }
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Code Style
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
# Format
|
|
206
|
+
cargo fmt
|
|
207
|
+
|
|
208
|
+
# Lint
|
|
209
|
+
cargo clippy --all-targets
|
|
210
|
+
|
|
211
|
+
# Check all
|
|
212
|
+
cargo fmt --check && cargo clippy --all-targets -- -D warnings
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Project Structure
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
enact-agent/
|
|
219
|
+
├── Cargo.toml # Workspace definition
|
|
220
|
+
├── crates/
|
|
221
|
+
│ ├── enact-cli/ # CLI binary
|
|
222
|
+
│ ├── enact-runner/ # Execution runtime
|
|
223
|
+
│ ├── enact-core/ # Core types
|
|
224
|
+
│ ├── enact-providers/ # LLM providers
|
|
225
|
+
│ ├── enact-gateway/ # HTTP server
|
|
226
|
+
│ ├── enact-channels/ # Messaging channels
|
|
227
|
+
│ └── enact-config/ # Configuration
|
|
228
|
+
└── docs/ # This documentation (Zola)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Adding a Provider
|
|
232
|
+
|
|
233
|
+
1. Create module in `enact-providers/src/`
|
|
234
|
+
2. Implement `ModelProvider` trait
|
|
235
|
+
3. Export from `lib.rs`
|
|
236
|
+
|
|
237
|
+
```rust
|
|
238
|
+
pub struct MyProvider { ... }
|
|
239
|
+
|
|
240
|
+
#[async_trait]
|
|
241
|
+
impl ModelProvider for MyProvider {
|
|
242
|
+
async fn complete(&self, request: ChatRequest) -> Result<ChatResponse> {
|
|
243
|
+
// Implementation
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Adding a Channel
|
|
249
|
+
|
|
250
|
+
1. Create module in `enact-channels/src/`
|
|
251
|
+
2. Implement `Channel` trait
|
|
252
|
+
3. Add gateway integration in `enact-gateway/`
|
|
253
|
+
|
|
254
|
+
## Documentation
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
cd docs
|
|
258
|
+
|
|
259
|
+
# Development server
|
|
260
|
+
make serve # http://127.0.0.1:1111
|
|
261
|
+
|
|
262
|
+
# Build
|
|
263
|
+
make build
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## Pull Request Process
|
|
267
|
+
|
|
268
|
+
1. Fork the repository
|
|
269
|
+
2. Create feature branch
|
|
270
|
+
3. Write tests
|
|
271
|
+
4. Update docs
|
|
272
|
+
5. Run checks (`cargo fmt && cargo clippy && cargo test`)
|
|
273
|
+
6. Submit PR
|
|
274
|
+
|
|
275
|
+
## Current Priorities
|
|
276
|
+
|
|
277
|
+
1. **OAuth/Token lifecycle** (Phase 1)
|
|
278
|
+
2. **Multi-agent** (Phase 2)
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
+++
|
|
2
|
+
title = "Getting Started"
|
|
3
|
+
weight = 2
|
|
4
|
+
sort_by = "weight"
|
|
5
|
+
+++
|
|
6
|
+
|
|
7
|
+
# Getting Started
|
|
8
|
+
|
|
9
|
+
Get up and running with Enact in minutes.
|
|
10
|
+
|
|
11
|
+
## Prerequisites
|
|
12
|
+
|
|
13
|
+
- **Rust** 1.75 or later
|
|
14
|
+
- **API Key** for at least one LLM provider (OpenAI, Azure, etc.)
|
|
15
|
+
|
|
16
|
+
## Quick Start
|
|
17
|
+
|
|
18
|
+
### 1. Build from Source
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
git clone https://github.com/adl-tan-theta/enactai.git
|
|
22
|
+
cd enya/enact-agent
|
|
23
|
+
cargo build --release
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 2. Check System Status
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
./target/release/enact doctor
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
This shows:
|
|
33
|
+
|
|
34
|
+
- API key configuration status
|
|
35
|
+
- WhatsApp configuration status
|
|
36
|
+
- Current model settings
|
|
37
|
+
|
|
38
|
+
### 3. Run Your First Agent
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
OPENAI_API_KEY="sk-..." ./target/release/enact run --input "Hello!"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The agent will respond using the configured LLM provider.
|
|
45
|
+
|
|
46
|
+
### 4. Start the Gateway (Optional)
|
|
47
|
+
|
|
48
|
+
For WhatsApp integration:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
WHATSAPP_ACCESS_TOKEN="..." \
|
|
52
|
+
WHATSAPP_ENDPOINT_ID="..." \
|
|
53
|
+
WHATSAPP_VERIFY_TOKEN="..." \
|
|
54
|
+
OPENAI_API_KEY="..." \
|
|
55
|
+
./target/release/enact serve --http-port 8080
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Configuration
|
|
59
|
+
|
|
60
|
+
### Environment Variables
|
|
61
|
+
|
|
62
|
+
Create a `.env` file:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# LLM Provider (required)
|
|
66
|
+
OPENAI_API_KEY=sk-...
|
|
67
|
+
OPENAI_MODEL=gpt-4o-mini
|
|
68
|
+
|
|
69
|
+
# Or Azure OpenAI
|
|
70
|
+
AZURE_OPENAI_API_KEY=...
|
|
71
|
+
OPENAI_BASE_URL=https://your-resource.openai.azure.com
|
|
72
|
+
|
|
73
|
+
# WhatsApp (for gateway)
|
|
74
|
+
WHATSAPP_ACCESS_TOKEN=EAABc...
|
|
75
|
+
WHATSAPP_ENDPOINT_ID=123456789012345
|
|
76
|
+
WHATSAPP_VERIFY_TOKEN=my-secret-token
|
|
77
|
+
WHATSAPP_APP_SECRET=abc123 # Optional
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## CLI Commands
|
|
81
|
+
|
|
82
|
+
| Command | Description |
|
|
83
|
+
|---------|-------------|
|
|
84
|
+
| `enact doctor` | Check system status |
|
|
85
|
+
| `enact run --input "..."` | Run agent |
|
|
86
|
+
| `enact serve --http-port 8080` | Start gateway |
|
|
87
|
+
| `enact version` | Show version |
|
|
88
|
+
|
|
89
|
+
## Gateway Flow
|
|
90
|
+
|
|
91
|
+
When you run `enact serve`, messages flow through:
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
WhatsApp Message (webhook)
|
|
95
|
+
│
|
|
96
|
+
▼
|
|
97
|
+
WhatsAppChannel (parse)
|
|
98
|
+
│
|
|
99
|
+
▼
|
|
100
|
+
RunnerResponder
|
|
101
|
+
│
|
|
102
|
+
▼
|
|
103
|
+
DefaultAgentRunner (retry/compaction)
|
|
104
|
+
│
|
|
105
|
+
▼
|
|
106
|
+
Response sent back via WhatsApp
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Production Features
|
|
110
|
+
|
|
111
|
+
The gateway includes enterprise-ready features:
|
|
112
|
+
|
|
113
|
+
- **Rate limiting**: 120 requests/minute per client (sliding window)
|
|
114
|
+
- **Idempotency**: Duplicate messages ignored (5-minute TTL)
|
|
115
|
+
- **Signature verification**: Validates WhatsApp signatures
|
|
116
|
+
- **Request limits**: 64KB max body, 30s timeout
|
|
117
|
+
- **All with tests passing**
|
|
118
|
+
|
|
119
|
+
## Using as a Library
|
|
120
|
+
|
|
121
|
+
You can also use Enact as a Rust library:
|
|
122
|
+
|
|
123
|
+
```rust
|
|
124
|
+
use enact_core::callable::LlmCallable;
|
|
125
|
+
use enact_providers::OpenAICompatible;
|
|
126
|
+
use enact_runner::DefaultAgentRunner;
|
|
127
|
+
use std::sync::Arc;
|
|
128
|
+
|
|
129
|
+
#[tokio::main]
|
|
130
|
+
async fn main() -> anyhow::Result<()> {
|
|
131
|
+
let api_key = std::env::var("OPENAI_API_KEY")?;
|
|
132
|
+
|
|
133
|
+
let provider = Arc::new(OpenAICompatible::new(
|
|
134
|
+
"https://api.openai.com",
|
|
135
|
+
"gpt-4o-mini",
|
|
136
|
+
Some(api_key),
|
|
137
|
+
));
|
|
138
|
+
|
|
139
|
+
let callable = LlmCallable::with_provider(
|
|
140
|
+
"assistant",
|
|
141
|
+
"You are a helpful assistant.",
|
|
142
|
+
provider,
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
let mut runner = DefaultAgentRunner::default_new();
|
|
146
|
+
let outcome = runner.run(&callable, "Hello!").await?;
|
|
147
|
+
|
|
148
|
+
println!("{:?}", outcome);
|
|
149
|
+
Ok(())
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## YAML Agent Definitions
|
|
154
|
+
|
|
155
|
+
Define agents as YAML files (for future YAML-based execution):
|
|
156
|
+
|
|
157
|
+
```yaml
|
|
158
|
+
name: hello-agent
|
|
159
|
+
version: "1.0"
|
|
160
|
+
description: "A simple greeting agent"
|
|
161
|
+
|
|
162
|
+
nodes:
|
|
163
|
+
greet:
|
|
164
|
+
type: llm
|
|
165
|
+
system_prompt: "You are a friendly assistant. Greet the user warmly."
|
|
166
|
+
edges:
|
|
167
|
+
_default: END
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
See [YAML Schema](/yaml-schema/) for full documentation.
|
|
171
|
+
|
|
172
|
+
## Next Steps
|
|
173
|
+
|
|
174
|
+
- [CLI Reference](/cli/) — Full command documentation
|
|
175
|
+
- [Gateway API](/api/) — HTTP endpoint documentation
|
|
176
|
+
- [YAML Schema](/yaml-schema/) — Agent definition format
|
|
177
|
+
- [Channels](/channels/) — WhatsApp, Telegram, Teams setup
|
|
178
|
+
- [Providers](/providers/) — LLM provider configuration
|
|
179
|
+
- [Skills](/skills/) — Skills system (TOML/MD manifests)
|
|
180
|
+
- [MCP Client](/mcp/) — Model Context Protocol integration
|