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,535 @@
|
|
|
1
|
+
//! Prompt Calibrator
|
|
2
|
+
//!
|
|
3
|
+
//! Constructs calibrated prompts for spawned callables by:
|
|
4
|
+
//! - Selecting relevant context segments based on priority
|
|
5
|
+
//! - Applying token budgets for the target model
|
|
6
|
+
//! - Formatting context for optimal model consumption
|
|
7
|
+
//!
|
|
8
|
+
//! @see packages/enact-schemas/src/context.schemas.ts
|
|
9
|
+
|
|
10
|
+
use crate::budget::ContextBudget;
|
|
11
|
+
use crate::segment::{ContextPriority, ContextSegment, ContextSegmentType};
|
|
12
|
+
use crate::token_counter::TokenCounter;
|
|
13
|
+
use crate::window::ContextWindow;
|
|
14
|
+
use chrono::{DateTime, Utc};
|
|
15
|
+
use enact_core::kernel::ExecutionId;
|
|
16
|
+
use serde::{Deserialize, Serialize};
|
|
17
|
+
use std::collections::HashMap;
|
|
18
|
+
use std::sync::atomic::{AtomicU64, Ordering};
|
|
19
|
+
|
|
20
|
+
/// Global sequence counter for segments
|
|
21
|
+
static SEGMENT_SEQUENCE: AtomicU64 = AtomicU64::new(1000);
|
|
22
|
+
|
|
23
|
+
fn next_sequence() -> u64 {
|
|
24
|
+
SEGMENT_SEQUENCE.fetch_add(1, Ordering::SeqCst)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/// Prompt calibration configuration
|
|
28
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
29
|
+
#[serde(rename_all = "camelCase")]
|
|
30
|
+
pub struct CalibrationConfig {
|
|
31
|
+
/// Maximum tokens for the calibrated prompt
|
|
32
|
+
pub max_tokens: usize,
|
|
33
|
+
|
|
34
|
+
/// Minimum tokens to reserve for response
|
|
35
|
+
pub response_reserve: usize,
|
|
36
|
+
|
|
37
|
+
/// Priority threshold - only include segments at or above this priority
|
|
38
|
+
pub min_priority: ContextPriority,
|
|
39
|
+
|
|
40
|
+
/// Whether to include system context
|
|
41
|
+
pub include_system: bool,
|
|
42
|
+
|
|
43
|
+
/// Whether to include conversation history
|
|
44
|
+
pub include_history: bool,
|
|
45
|
+
|
|
46
|
+
/// Maximum history messages to include
|
|
47
|
+
pub max_history_messages: usize,
|
|
48
|
+
|
|
49
|
+
/// Whether to include working memory
|
|
50
|
+
pub include_working_memory: bool,
|
|
51
|
+
|
|
52
|
+
/// Whether to include RAG context
|
|
53
|
+
pub include_rag: bool,
|
|
54
|
+
|
|
55
|
+
/// Maximum RAG chunks to include
|
|
56
|
+
pub max_rag_chunks: usize,
|
|
57
|
+
|
|
58
|
+
/// Custom segment filters by type
|
|
59
|
+
#[serde(skip_serializing_if = "Option::is_none")]
|
|
60
|
+
pub segment_filters: Option<HashMap<String, bool>>,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
impl Default for CalibrationConfig {
|
|
64
|
+
fn default() -> Self {
|
|
65
|
+
Self {
|
|
66
|
+
max_tokens: 8000,
|
|
67
|
+
response_reserve: 2000,
|
|
68
|
+
min_priority: ContextPriority::Low,
|
|
69
|
+
include_system: true,
|
|
70
|
+
include_history: true,
|
|
71
|
+
max_history_messages: 20,
|
|
72
|
+
include_working_memory: true,
|
|
73
|
+
include_rag: true,
|
|
74
|
+
max_rag_chunks: 5,
|
|
75
|
+
segment_filters: None,
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
impl CalibrationConfig {
|
|
81
|
+
/// Create a minimal config for quick tasks
|
|
82
|
+
pub fn minimal() -> Self {
|
|
83
|
+
Self {
|
|
84
|
+
max_tokens: 4000,
|
|
85
|
+
response_reserve: 1000,
|
|
86
|
+
min_priority: ContextPriority::High,
|
|
87
|
+
include_system: true,
|
|
88
|
+
include_history: false,
|
|
89
|
+
max_history_messages: 0,
|
|
90
|
+
include_working_memory: false,
|
|
91
|
+
include_rag: false,
|
|
92
|
+
max_rag_chunks: 0,
|
|
93
|
+
segment_filters: None,
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/// Create a full context config for complex tasks
|
|
98
|
+
pub fn full_context() -> Self {
|
|
99
|
+
Self {
|
|
100
|
+
max_tokens: 32000,
|
|
101
|
+
response_reserve: 4000,
|
|
102
|
+
min_priority: ContextPriority::Low,
|
|
103
|
+
include_system: true,
|
|
104
|
+
include_history: true,
|
|
105
|
+
max_history_messages: 50,
|
|
106
|
+
include_working_memory: true,
|
|
107
|
+
include_rag: true,
|
|
108
|
+
max_rag_chunks: 10,
|
|
109
|
+
segment_filters: None,
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/// Available tokens after response reserve
|
|
114
|
+
pub fn available_tokens(&self) -> usize {
|
|
115
|
+
self.max_tokens.saturating_sub(self.response_reserve)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/// Result of prompt calibration
|
|
120
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
121
|
+
#[serde(rename_all = "camelCase")]
|
|
122
|
+
pub struct CalibratedPrompt {
|
|
123
|
+
/// Execution ID this prompt was calibrated for
|
|
124
|
+
pub execution_id: ExecutionId,
|
|
125
|
+
|
|
126
|
+
/// The calibrated segments in order
|
|
127
|
+
pub segments: Vec<ContextSegment>,
|
|
128
|
+
|
|
129
|
+
/// Total tokens used
|
|
130
|
+
pub total_tokens: usize,
|
|
131
|
+
|
|
132
|
+
/// Tokens available for response
|
|
133
|
+
pub response_tokens: usize,
|
|
134
|
+
|
|
135
|
+
/// Segments that were excluded due to budget
|
|
136
|
+
pub excluded_count: usize,
|
|
137
|
+
|
|
138
|
+
/// Calibration timestamp
|
|
139
|
+
pub calibrated_at: DateTime<Utc>,
|
|
140
|
+
|
|
141
|
+
/// Configuration used
|
|
142
|
+
pub config: CalibrationConfig,
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
impl CalibratedPrompt {
|
|
146
|
+
/// Get the formatted prompt as a string
|
|
147
|
+
pub fn as_text(&self) -> String {
|
|
148
|
+
self.segments
|
|
149
|
+
.iter()
|
|
150
|
+
.map(|s| s.content.clone())
|
|
151
|
+
.collect::<Vec<_>>()
|
|
152
|
+
.join("\n\n")
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// Get segments by type
|
|
156
|
+
pub fn segments_by_type(&self, segment_type: ContextSegmentType) -> Vec<&ContextSegment> {
|
|
157
|
+
self.segments
|
|
158
|
+
.iter()
|
|
159
|
+
.filter(|s| s.segment_type == segment_type)
|
|
160
|
+
.collect()
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/// Check if prompt has system context
|
|
164
|
+
pub fn has_system(&self) -> bool {
|
|
165
|
+
self.segments
|
|
166
|
+
.iter()
|
|
167
|
+
.any(|s| s.segment_type == ContextSegmentType::System)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/// Check if prompt has history
|
|
171
|
+
pub fn has_history(&self) -> bool {
|
|
172
|
+
self.segments
|
|
173
|
+
.iter()
|
|
174
|
+
.any(|s| s.segment_type == ContextSegmentType::History)
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/// Prompt Calibrator - constructs calibrated prompts for spawned callables
|
|
179
|
+
pub struct PromptCalibrator {
|
|
180
|
+
token_counter: TokenCounter,
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
impl PromptCalibrator {
|
|
184
|
+
/// Create a new calibrator
|
|
185
|
+
pub fn new() -> Self {
|
|
186
|
+
Self {
|
|
187
|
+
token_counter: TokenCounter::default(),
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/// Calibrate a prompt from a context window
|
|
192
|
+
pub fn calibrate(
|
|
193
|
+
&self,
|
|
194
|
+
window: &ContextWindow,
|
|
195
|
+
config: &CalibrationConfig,
|
|
196
|
+
) -> CalibratedPrompt {
|
|
197
|
+
let execution_id = window.budget().execution_id.clone();
|
|
198
|
+
let available = config.available_tokens();
|
|
199
|
+
|
|
200
|
+
// Get all segments sorted by priority (highest first)
|
|
201
|
+
let mut segments = window.segments().to_vec();
|
|
202
|
+
segments.sort_by(|a, b| b.priority.cmp(&a.priority));
|
|
203
|
+
|
|
204
|
+
// Filter and select segments within budget
|
|
205
|
+
let mut selected: Vec<ContextSegment> = Vec::new();
|
|
206
|
+
let mut total_tokens = 0;
|
|
207
|
+
let mut excluded_count = 0;
|
|
208
|
+
let mut history_count = 0;
|
|
209
|
+
let mut rag_count = 0;
|
|
210
|
+
|
|
211
|
+
for segment in segments {
|
|
212
|
+
// Check priority threshold
|
|
213
|
+
if segment.priority < config.min_priority {
|
|
214
|
+
excluded_count += 1;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Apply type-specific filters
|
|
219
|
+
match segment.segment_type {
|
|
220
|
+
ContextSegmentType::System if !config.include_system => {
|
|
221
|
+
excluded_count += 1;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
ContextSegmentType::History if !config.include_history => {
|
|
225
|
+
excluded_count += 1;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
ContextSegmentType::History if history_count >= config.max_history_messages => {
|
|
229
|
+
excluded_count += 1;
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
ContextSegmentType::WorkingMemory if !config.include_working_memory => {
|
|
233
|
+
excluded_count += 1;
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
ContextSegmentType::RagContext if !config.include_rag => {
|
|
237
|
+
excluded_count += 1;
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
ContextSegmentType::RagContext if rag_count >= config.max_rag_chunks => {
|
|
241
|
+
excluded_count += 1;
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
_ => {}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Check if segment fits in budget
|
|
248
|
+
let segment_tokens = segment.token_count;
|
|
249
|
+
if total_tokens + segment_tokens > available {
|
|
250
|
+
excluded_count += 1;
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Include segment
|
|
255
|
+
total_tokens += segment_tokens;
|
|
256
|
+
if segment.segment_type == ContextSegmentType::History {
|
|
257
|
+
history_count += 1;
|
|
258
|
+
}
|
|
259
|
+
if segment.segment_type == ContextSegmentType::RagContext {
|
|
260
|
+
rag_count += 1;
|
|
261
|
+
}
|
|
262
|
+
selected.push(segment);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Re-sort by natural order (system first, then by sequence)
|
|
266
|
+
selected.sort_by(|a, b| {
|
|
267
|
+
// System always first
|
|
268
|
+
if a.segment_type == ContextSegmentType::System
|
|
269
|
+
&& b.segment_type != ContextSegmentType::System
|
|
270
|
+
{
|
|
271
|
+
return std::cmp::Ordering::Less;
|
|
272
|
+
}
|
|
273
|
+
if b.segment_type == ContextSegmentType::System
|
|
274
|
+
&& a.segment_type != ContextSegmentType::System
|
|
275
|
+
{
|
|
276
|
+
return std::cmp::Ordering::Greater;
|
|
277
|
+
}
|
|
278
|
+
// Then by sequence
|
|
279
|
+
a.sequence.cmp(&b.sequence)
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
CalibratedPrompt {
|
|
283
|
+
execution_id,
|
|
284
|
+
segments: selected,
|
|
285
|
+
total_tokens,
|
|
286
|
+
response_tokens: config.max_tokens.saturating_sub(total_tokens),
|
|
287
|
+
excluded_count,
|
|
288
|
+
calibrated_at: Utc::now(),
|
|
289
|
+
config: config.clone(),
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/// Calibrate from raw segments (without a full window)
|
|
294
|
+
pub fn calibrate_segments(
|
|
295
|
+
&self,
|
|
296
|
+
execution_id: ExecutionId,
|
|
297
|
+
segments: Vec<ContextSegment>,
|
|
298
|
+
config: &CalibrationConfig,
|
|
299
|
+
) -> CalibratedPrompt {
|
|
300
|
+
// Create a temporary budget and window
|
|
301
|
+
let budget = ContextBudget::new(execution_id.clone(), config.max_tokens, config.response_reserve);
|
|
302
|
+
let mut window = ContextWindow::new(budget).expect("valid budget");
|
|
303
|
+
|
|
304
|
+
for segment in segments {
|
|
305
|
+
let _ = window.add_segment(segment);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
self.calibrate(&window, config)
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/// Create a child prompt from parent context
|
|
312
|
+
///
|
|
313
|
+
/// This is used when spawning child callables to provide them with
|
|
314
|
+
/// relevant context from the parent execution.
|
|
315
|
+
pub fn calibrate_for_child(
|
|
316
|
+
&self,
|
|
317
|
+
parent_window: &ContextWindow,
|
|
318
|
+
child_execution_id: ExecutionId,
|
|
319
|
+
task_description: &str,
|
|
320
|
+
config: &CalibrationConfig,
|
|
321
|
+
) -> CalibratedPrompt {
|
|
322
|
+
let available = config.available_tokens();
|
|
323
|
+
|
|
324
|
+
// Start with essential context for the child
|
|
325
|
+
let mut selected: Vec<ContextSegment> = Vec::new();
|
|
326
|
+
let mut total_tokens = 0;
|
|
327
|
+
|
|
328
|
+
// Add task description as system context
|
|
329
|
+
let task_content = format!(
|
|
330
|
+
"You are executing a sub-task. Task: {}\n\nParent context follows:",
|
|
331
|
+
task_description
|
|
332
|
+
);
|
|
333
|
+
let task_tokens = self.token_counter.count(&task_content);
|
|
334
|
+
if task_tokens <= available {
|
|
335
|
+
let task_segment = ContextSegment::system(task_content, task_tokens);
|
|
336
|
+
total_tokens += task_tokens;
|
|
337
|
+
selected.push(task_segment);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Get parent segments sorted by priority
|
|
341
|
+
let mut parent_segments = parent_window.segments().to_vec();
|
|
342
|
+
parent_segments.sort_by(|a, b| b.priority.cmp(&a.priority));
|
|
343
|
+
|
|
344
|
+
let mut excluded_count = 0;
|
|
345
|
+
|
|
346
|
+
// Add relevant parent context
|
|
347
|
+
for segment in parent_segments {
|
|
348
|
+
// Skip low priority for child contexts
|
|
349
|
+
if segment.priority < ContextPriority::Medium {
|
|
350
|
+
excluded_count += 1;
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Check budget
|
|
355
|
+
let segment_tokens = segment.token_count;
|
|
356
|
+
if total_tokens + segment_tokens > available {
|
|
357
|
+
excluded_count += 1;
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
total_tokens += segment_tokens;
|
|
362
|
+
selected.push(segment);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Sort for natural reading order
|
|
366
|
+
selected.sort_by(|a, b| {
|
|
367
|
+
if a.segment_type == ContextSegmentType::System
|
|
368
|
+
&& b.segment_type != ContextSegmentType::System
|
|
369
|
+
{
|
|
370
|
+
return std::cmp::Ordering::Less;
|
|
371
|
+
}
|
|
372
|
+
if b.segment_type == ContextSegmentType::System
|
|
373
|
+
&& a.segment_type != ContextSegmentType::System
|
|
374
|
+
{
|
|
375
|
+
return std::cmp::Ordering::Greater;
|
|
376
|
+
}
|
|
377
|
+
a.sequence.cmp(&b.sequence)
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
CalibratedPrompt {
|
|
381
|
+
execution_id: child_execution_id,
|
|
382
|
+
segments: selected,
|
|
383
|
+
total_tokens,
|
|
384
|
+
response_tokens: config.max_tokens.saturating_sub(total_tokens),
|
|
385
|
+
excluded_count,
|
|
386
|
+
calibrated_at: Utc::now(),
|
|
387
|
+
config: config.clone(),
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
impl Default for PromptCalibrator {
|
|
393
|
+
fn default() -> Self {
|
|
394
|
+
Self::new()
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
#[cfg(test)]
|
|
399
|
+
mod tests {
|
|
400
|
+
use super::*;
|
|
401
|
+
|
|
402
|
+
fn test_execution_id() -> ExecutionId {
|
|
403
|
+
ExecutionId::new()
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
#[test]
|
|
407
|
+
fn test_calibration_config_defaults() {
|
|
408
|
+
let config = CalibrationConfig::default();
|
|
409
|
+
assert_eq!(config.max_tokens, 8000);
|
|
410
|
+
assert_eq!(config.response_reserve, 2000);
|
|
411
|
+
assert_eq!(config.available_tokens(), 6000);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
#[test]
|
|
415
|
+
fn test_calibration_config_minimal() {
|
|
416
|
+
let config = CalibrationConfig::minimal();
|
|
417
|
+
assert!(!config.include_history);
|
|
418
|
+
assert!(!config.include_working_memory);
|
|
419
|
+
assert_eq!(config.min_priority, ContextPriority::High);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
#[test]
|
|
423
|
+
fn test_calibrate_empty_window() {
|
|
424
|
+
let calibrator = PromptCalibrator::new();
|
|
425
|
+
let budget = ContextBudget::preset_default(test_execution_id());
|
|
426
|
+
let window = ContextWindow::new(budget).unwrap();
|
|
427
|
+
let config = CalibrationConfig::default();
|
|
428
|
+
|
|
429
|
+
let result = calibrator.calibrate(&window, &config);
|
|
430
|
+
assert_eq!(result.segments.len(), 0);
|
|
431
|
+
assert_eq!(result.total_tokens, 0);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
#[test]
|
|
435
|
+
fn test_calibrate_with_segments() {
|
|
436
|
+
let calibrator = PromptCalibrator::new();
|
|
437
|
+
let budget = ContextBudget::preset_default(test_execution_id());
|
|
438
|
+
let mut window = ContextWindow::new(budget).unwrap();
|
|
439
|
+
|
|
440
|
+
window
|
|
441
|
+
.add_segment(ContextSegment::system("You are a helpful assistant.", 10))
|
|
442
|
+
.unwrap();
|
|
443
|
+
window
|
|
444
|
+
.add_segment(ContextSegment::user_input("Hello!", 5, 1))
|
|
445
|
+
.unwrap();
|
|
446
|
+
|
|
447
|
+
let config = CalibrationConfig::default();
|
|
448
|
+
let result = calibrator.calibrate(&window, &config);
|
|
449
|
+
|
|
450
|
+
assert_eq!(result.segments.len(), 2);
|
|
451
|
+
assert!(result.total_tokens > 0);
|
|
452
|
+
assert!(result.has_system());
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
#[test]
|
|
456
|
+
fn test_calibrate_respects_priority() {
|
|
457
|
+
let calibrator = PromptCalibrator::new();
|
|
458
|
+
let budget = ContextBudget::preset_default(test_execution_id());
|
|
459
|
+
let mut window = ContextWindow::new(budget).unwrap();
|
|
460
|
+
|
|
461
|
+
window
|
|
462
|
+
.add_segment(ContextSegment::system("System prompt", 10))
|
|
463
|
+
.unwrap();
|
|
464
|
+
window
|
|
465
|
+
.add_segment(
|
|
466
|
+
ContextSegment::new(
|
|
467
|
+
ContextSegmentType::History,
|
|
468
|
+
"Low priority history".to_string(),
|
|
469
|
+
20,
|
|
470
|
+
1,
|
|
471
|
+
)
|
|
472
|
+
.with_priority(ContextPriority::Low),
|
|
473
|
+
)
|
|
474
|
+
.unwrap();
|
|
475
|
+
|
|
476
|
+
// With high priority threshold, should exclude low priority
|
|
477
|
+
let config = CalibrationConfig {
|
|
478
|
+
min_priority: ContextPriority::High,
|
|
479
|
+
..Default::default()
|
|
480
|
+
};
|
|
481
|
+
let result = calibrator.calibrate(&window, &config);
|
|
482
|
+
|
|
483
|
+
// Only system (critical priority) should be included
|
|
484
|
+
assert_eq!(result.segments.len(), 1);
|
|
485
|
+
assert!(result.has_system());
|
|
486
|
+
assert!(!result.has_history());
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
#[test]
|
|
490
|
+
fn test_calibrate_for_child() {
|
|
491
|
+
let calibrator = PromptCalibrator::new();
|
|
492
|
+
let parent_budget = ContextBudget::preset_default(test_execution_id());
|
|
493
|
+
let mut parent_window = ContextWindow::new(parent_budget).unwrap();
|
|
494
|
+
|
|
495
|
+
parent_window
|
|
496
|
+
.add_segment(ContextSegment::system("Parent system prompt", 15))
|
|
497
|
+
.unwrap();
|
|
498
|
+
parent_window
|
|
499
|
+
.add_segment(ContextSegment::user_input("Parent user input", 10, 1))
|
|
500
|
+
.unwrap();
|
|
501
|
+
|
|
502
|
+
let child_id = ExecutionId::new();
|
|
503
|
+
let config = CalibrationConfig::default();
|
|
504
|
+
let result =
|
|
505
|
+
calibrator.calibrate_for_child(&parent_window, child_id, "Analyze data", &config);
|
|
506
|
+
|
|
507
|
+
// Should have task description and parent context
|
|
508
|
+
assert!(result.total_tokens > 0);
|
|
509
|
+
assert!(result
|
|
510
|
+
.segments
|
|
511
|
+
.iter()
|
|
512
|
+
.any(|s| s.content.contains("sub-task")));
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
#[test]
|
|
516
|
+
fn test_calibrated_prompt_as_text() {
|
|
517
|
+
let calibrator = PromptCalibrator::new();
|
|
518
|
+
let budget = ContextBudget::preset_default(test_execution_id());
|
|
519
|
+
let mut window = ContextWindow::new(budget).unwrap();
|
|
520
|
+
|
|
521
|
+
window
|
|
522
|
+
.add_segment(ContextSegment::system("System", 5))
|
|
523
|
+
.unwrap();
|
|
524
|
+
window
|
|
525
|
+
.add_segment(ContextSegment::user_input("User", 5, 1))
|
|
526
|
+
.unwrap();
|
|
527
|
+
|
|
528
|
+
let config = CalibrationConfig::default();
|
|
529
|
+
let result = calibrator.calibrate(&window, &config);
|
|
530
|
+
|
|
531
|
+
let text = result.as_text();
|
|
532
|
+
assert!(text.contains("System"));
|
|
533
|
+
assert!(text.contains("User"));
|
|
534
|
+
}
|
|
535
|
+
}
|