opencandle 0.2.0 → 0.4.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/README.md +110 -87
- package/assets/logo.svg +187 -0
- package/dist/analysts/orchestrator.js +1 -2
- package/dist/analysts/orchestrator.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +38 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +34 -5
- package/dist/config.js +29 -8
- package/dist/config.js.map +1 -1
- package/dist/infra/browser.d.ts +10 -0
- package/dist/infra/browser.js +1 -0
- package/dist/infra/browser.js.map +1 -1
- package/dist/infra/cache.d.ts +4 -0
- package/dist/infra/cache.js +4 -0
- package/dist/infra/cache.js.map +1 -1
- package/dist/infra/native-dependencies.d.ts +1 -0
- package/dist/infra/native-dependencies.js +10 -0
- package/dist/infra/native-dependencies.js.map +1 -0
- package/dist/infra/node-version.d.ts +2 -0
- package/dist/infra/node-version.js +23 -0
- package/dist/infra/node-version.js.map +1 -0
- package/dist/infra/rate-limiter.js +6 -0
- package/dist/infra/rate-limiter.js.map +1 -1
- package/dist/memory/index.d.ts +2 -0
- package/dist/memory/index.js +1 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/sqlite.js +42 -4
- package/dist/memory/sqlite.js.map +1 -1
- package/dist/memory/storage.d.ts +6 -0
- package/dist/memory/storage.js +3 -3
- package/dist/memory/storage.js.map +1 -1
- package/dist/memory/tool-defaults.d.ts +8 -0
- package/dist/memory/tool-defaults.js +59 -0
- package/dist/memory/tool-defaults.js.map +1 -0
- package/dist/onboarding/connect.d.ts +35 -0
- package/dist/onboarding/connect.js +118 -0
- package/dist/onboarding/connect.js.map +1 -0
- package/dist/onboarding/credential-interceptor.d.ts +44 -0
- package/dist/onboarding/credential-interceptor.js +72 -0
- package/dist/onboarding/credential-interceptor.js.map +1 -0
- package/dist/onboarding/degradation-accumulator.d.ts +21 -0
- package/dist/onboarding/degradation-accumulator.js +55 -0
- package/dist/onboarding/degradation-accumulator.js.map +1 -0
- package/dist/onboarding/prompt-user.d.ts +23 -0
- package/dist/onboarding/prompt-user.js +61 -0
- package/dist/onboarding/prompt-user.js.map +1 -0
- package/dist/onboarding/providers.d.ts +116 -0
- package/dist/onboarding/providers.js +239 -0
- package/dist/onboarding/providers.js.map +1 -0
- package/dist/onboarding/state.d.ts +31 -2
- package/dist/onboarding/state.js +141 -13
- package/dist/onboarding/state.js.map +1 -1
- package/dist/onboarding/tool-helpers.d.ts +34 -0
- package/dist/onboarding/tool-helpers.js +80 -0
- package/dist/onboarding/tool-helpers.js.map +1 -0
- package/dist/onboarding/tool-tags.d.ts +37 -0
- package/dist/onboarding/tool-tags.js +149 -0
- package/dist/onboarding/tool-tags.js.map +1 -0
- package/dist/onboarding/validation.d.ts +19 -0
- package/dist/onboarding/validation.js +117 -0
- package/dist/onboarding/validation.js.map +1 -0
- package/dist/pi/opencandle-extension.d.ts +7 -1
- package/dist/pi/opencandle-extension.js +488 -13
- package/dist/pi/opencandle-extension.js.map +1 -1
- package/dist/pi/session-storage.d.ts +2 -0
- package/dist/pi/session-storage.js +5 -0
- package/dist/pi/session-storage.js.map +1 -0
- package/dist/pi/session.d.ts +4 -1
- package/dist/pi/session.js +25 -3
- package/dist/pi/session.js.map +1 -1
- package/dist/pi/setup.d.ts +1 -2
- package/dist/pi/setup.js +67 -120
- package/dist/pi/setup.js.map +1 -1
- package/dist/pi/tool-adapter.d.ts +2 -2
- package/dist/pi/tool-adapter.js +14 -1
- package/dist/pi/tool-adapter.js.map +1 -1
- package/dist/prompts/context-builder.d.ts +22 -0
- package/dist/prompts/context-builder.js +47 -11
- package/dist/prompts/context-builder.js.map +1 -1
- package/dist/prompts/disclaimer.d.ts +6 -0
- package/dist/prompts/disclaimer.js +9 -0
- package/dist/prompts/disclaimer.js.map +1 -0
- package/dist/prompts/workflow-prompts.d.ts +8 -0
- package/dist/prompts/workflow-prompts.js +39 -5
- package/dist/prompts/workflow-prompts.js.map +1 -1
- package/dist/providers/alpha-vantage.js +20 -1
- package/dist/providers/alpha-vantage.js.map +1 -1
- package/dist/providers/exa-search.d.ts +39 -0
- package/dist/providers/exa-search.js +276 -0
- package/dist/providers/exa-search.js.map +1 -0
- package/dist/providers/finnhub.d.ts +17 -0
- package/dist/providers/finnhub.js +94 -0
- package/dist/providers/finnhub.js.map +1 -0
- package/dist/providers/fred.js +13 -1
- package/dist/providers/fred.js.map +1 -1
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.js +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/provider-credential-error.d.ts +8 -0
- package/dist/providers/provider-credential-error.js +22 -0
- package/dist/providers/provider-credential-error.js.map +1 -0
- package/dist/providers/reddit.d.ts +8 -0
- package/dist/providers/reddit.js +36 -9
- package/dist/providers/reddit.js.map +1 -1
- package/dist/providers/twitter.js +2 -8
- package/dist/providers/twitter.js.map +1 -1
- package/dist/providers/web-search.d.ts +17 -0
- package/dist/providers/web-search.js +224 -0
- package/dist/providers/web-search.js.map +1 -0
- package/dist/providers/wrap-provider.d.ts +7 -0
- package/dist/providers/wrap-provider.js +15 -0
- package/dist/providers/wrap-provider.js.map +1 -1
- package/dist/providers/yahoo-finance.js +70 -33
- package/dist/providers/yahoo-finance.js.map +1 -1
- package/dist/routing/classify-intent.js +22 -0
- package/dist/routing/classify-intent.js.map +1 -1
- package/dist/routing/defaults.js +1 -1
- package/dist/routing/defaults.js.map +1 -1
- package/dist/routing/index.d.ts +4 -0
- package/dist/routing/index.js +3 -0
- package/dist/routing/index.js.map +1 -1
- package/dist/routing/router-llm-client.d.ts +11 -0
- package/dist/routing/router-llm-client.js +42 -0
- package/dist/routing/router-llm-client.js.map +1 -0
- package/dist/routing/router-prompt.d.ts +2 -0
- package/dist/routing/router-prompt.js +138 -0
- package/dist/routing/router-prompt.js.map +1 -0
- package/dist/routing/router-types.d.ts +62 -0
- package/dist/routing/router-types.js +2 -0
- package/dist/routing/router-types.js.map +1 -0
- package/dist/routing/router.d.ts +10 -0
- package/dist/routing/router.js +194 -0
- package/dist/routing/router.js.map +1 -0
- package/dist/runtime/session-coordinator.d.ts +63 -4
- package/dist/runtime/session-coordinator.js +155 -4
- package/dist/runtime/session-coordinator.js.map +1 -1
- package/dist/runtime/tool-defaults-wrapper.d.ts +3 -0
- package/dist/runtime/tool-defaults-wrapper.js +25 -0
- package/dist/runtime/tool-defaults-wrapper.js.map +1 -0
- package/dist/sentiment/adapters/finnhub.d.ts +7 -0
- package/dist/sentiment/adapters/finnhub.js +39 -0
- package/dist/sentiment/adapters/finnhub.js.map +1 -0
- package/dist/sentiment/adapters/reddit.d.ts +11 -0
- package/dist/sentiment/adapters/reddit.js +54 -0
- package/dist/sentiment/adapters/reddit.js.map +1 -0
- package/dist/sentiment/adapters/twitter.d.ts +9 -0
- package/dist/sentiment/adapters/twitter.js +32 -0
- package/dist/sentiment/adapters/twitter.js.map +1 -0
- package/dist/sentiment/adapters/web.d.ts +9 -0
- package/dist/sentiment/adapters/web.js +40 -0
- package/dist/sentiment/adapters/web.js.map +1 -0
- package/dist/sentiment/index.d.ts +16 -0
- package/dist/sentiment/index.js +44 -0
- package/dist/sentiment/index.js.map +1 -0
- package/dist/sentiment/keywords.d.ts +2 -0
- package/dist/sentiment/keywords.js +9 -0
- package/dist/sentiment/keywords.js.map +1 -0
- package/dist/sentiment/pipeline.d.ts +9 -0
- package/dist/sentiment/pipeline.js +57 -0
- package/dist/sentiment/pipeline.js.map +1 -0
- package/dist/sentiment/scorer.d.ts +9 -0
- package/dist/sentiment/scorer.js +64 -0
- package/dist/sentiment/scorer.js.map +1 -0
- package/dist/sentiment/store.d.ts +24 -0
- package/dist/sentiment/store.js +182 -0
- package/dist/sentiment/store.js.map +1 -0
- package/dist/sentiment/trends.d.ts +13 -0
- package/dist/sentiment/trends.js +73 -0
- package/dist/sentiment/trends.js.map +1 -0
- package/dist/sentiment/types.d.ts +66 -0
- package/dist/sentiment/types.js +54 -0
- package/dist/sentiment/types.js.map +1 -0
- package/dist/system-prompt.js +29 -13
- package/dist/system-prompt.js.map +1 -1
- package/dist/tool-kit.d.ts +4 -4
- package/dist/tools/fundamentals/company-overview.d.ts +4 -2
- package/dist/tools/fundamentals/company-overview.js +27 -27
- package/dist/tools/fundamentals/company-overview.js.map +1 -1
- package/dist/tools/fundamentals/comps.d.ts +1 -1
- package/dist/tools/fundamentals/comps.js +45 -45
- package/dist/tools/fundamentals/comps.js.map +1 -1
- package/dist/tools/fundamentals/dcf.d.ts +1 -1
- package/dist/tools/fundamentals/dcf.js +82 -82
- package/dist/tools/fundamentals/dcf.js.map +1 -1
- package/dist/tools/fundamentals/earnings.d.ts +4 -2
- package/dist/tools/fundamentals/earnings.js +25 -25
- package/dist/tools/fundamentals/earnings.js.map +1 -1
- package/dist/tools/fundamentals/financials.d.ts +4 -2
- package/dist/tools/fundamentals/financials.js +23 -23
- package/dist/tools/fundamentals/financials.js.map +1 -1
- package/dist/tools/fundamentals/sec-filings.d.ts +1 -1
- package/dist/tools/index.d.ts +28 -1
- package/dist/tools/index.js +35 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/interaction/ask-user.d.ts +1 -1
- package/dist/tools/interaction/ask-user.js +28 -64
- package/dist/tools/interaction/ask-user.js.map +1 -1
- package/dist/tools/interaction/twitter-login.d.ts +1 -1
- package/dist/tools/macro/fear-greed.d.ts +1 -1
- package/dist/tools/macro/fred-data.d.ts +4 -2
- package/dist/tools/macro/fred-data.js +26 -26
- package/dist/tools/macro/fred-data.js.map +1 -1
- package/dist/tools/market/crypto-history.d.ts +1 -1
- package/dist/tools/market/crypto-price.d.ts +1 -1
- package/dist/tools/market/search-ticker.d.ts +1 -1
- package/dist/tools/market/stock-history.d.ts +1 -1
- package/dist/tools/market/stock-quote.d.ts +1 -1
- package/dist/tools/options/option-chain.d.ts +1 -1
- package/dist/tools/options/option-chain.js +4 -1
- package/dist/tools/options/option-chain.js.map +1 -1
- package/dist/tools/portfolio/correlation.d.ts +1 -1
- package/dist/tools/portfolio/predictions.d.ts +1 -1
- package/dist/tools/portfolio/risk-analysis.d.ts +1 -1
- package/dist/tools/portfolio/tracker.d.ts +1 -1
- package/dist/tools/portfolio/watchlist.d.ts +1 -1
- package/dist/tools/sentiment/reddit-sentiment.d.ts +4 -2
- package/dist/tools/sentiment/reddit-sentiment.js +107 -22
- package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
- package/dist/tools/sentiment/sentiment-summary.d.ts +7 -0
- package/dist/tools/sentiment/sentiment-summary.js +230 -0
- package/dist/tools/sentiment/sentiment-summary.js.map +1 -0
- package/dist/tools/sentiment/sentiment-trend.d.ts +22 -0
- package/dist/tools/sentiment/sentiment-trend.js +39 -0
- package/dist/tools/sentiment/sentiment-trend.js.map +1 -0
- package/dist/tools/sentiment/twitter-sentiment.d.ts +1 -1
- package/dist/tools/sentiment/twitter-sentiment.js +17 -0
- package/dist/tools/sentiment/twitter-sentiment.js.map +1 -1
- package/dist/tools/sentiment/web-search.d.ts +11 -0
- package/dist/tools/sentiment/web-search.js +115 -0
- package/dist/tools/sentiment/web-search.js.map +1 -0
- package/dist/tools/sentiment/web-sentiment.d.ts +8 -0
- package/dist/tools/sentiment/web-sentiment.js +66 -0
- package/dist/tools/sentiment/web-sentiment.js.map +1 -0
- package/dist/tools/technical/backtest.d.ts +1 -1
- package/dist/tools/technical/indicators.d.ts +1 -1
- package/dist/tools/technical/indicators.js +7 -1
- package/dist/tools/technical/indicators.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/sentiment.d.ts +21 -0
- package/dist/workflows/options-screener.js +7 -2
- package/dist/workflows/options-screener.js.map +1 -1
- package/dist/workflows/portfolio-builder.js +3 -3
- package/dist/workflows/portfolio-builder.js.map +1 -1
- package/gui/server/background-quotes.ts +31 -0
- package/gui/server/chat-event-adapter.ts +142 -0
- package/gui/server/invoke-tool.ts +89 -0
- package/gui/server/live-chat-event-adapter.ts +181 -0
- package/gui/server/model-setup.ts +100 -0
- package/gui/server/package.json +5 -0
- package/gui/server/projector.ts +212 -0
- package/gui/server/server.ts +592 -0
- package/gui/server/session-actions.ts +31 -0
- package/gui/server/tool-metadata.ts +88 -0
- package/gui/server/websocket.ts +128 -0
- package/gui/server/writer-lock.ts +118 -0
- package/gui/shared/chat-events.ts +118 -0
- package/gui/shared/event-reducer.ts +186 -0
- package/gui/web/dist/assets/CatalogOverlay-D1ImSJTe.js +1 -0
- package/gui/web/dist/assets/index-DBrWq43L.css +1 -0
- package/gui/web/dist/assets/index-RflHaj0y.js +67 -0
- package/gui/web/dist/assets/logo-CWpt6Y2a.svg +187 -0
- package/gui/web/dist/index.html +17 -0
- package/package.json +62 -20
- package/src/analysts/contracts.ts +189 -0
- package/src/analysts/orchestrator.ts +300 -0
- package/src/cli.ts +205 -0
- package/src/config.ts +161 -0
- package/src/index.ts +5 -0
- package/src/infra/browser.ts +111 -0
- package/src/infra/cache.ts +103 -0
- package/src/infra/http-client.ts +68 -0
- package/src/infra/index.ts +18 -0
- package/src/infra/native-dependencies.ts +12 -0
- package/src/infra/node-version.ts +24 -0
- package/src/infra/open-url.ts +28 -0
- package/src/infra/opencandle-paths.ts +64 -0
- package/src/infra/rate-limiter.ts +64 -0
- package/src/memory/index.ts +10 -0
- package/src/memory/manager.ts +159 -0
- package/src/memory/preference-extractor.ts +106 -0
- package/src/memory/retrieval.ts +70 -0
- package/src/memory/sqlite.ts +172 -0
- package/src/memory/storage.ts +204 -0
- package/src/memory/tool-defaults.ts +87 -0
- package/src/memory/types.ts +67 -0
- package/src/onboarding/connect.ts +184 -0
- package/src/onboarding/credential-interceptor.ts +134 -0
- package/src/onboarding/degradation-accumulator.ts +79 -0
- package/src/onboarding/prompt-user.ts +85 -0
- package/src/onboarding/providers.ts +315 -0
- package/src/onboarding/state.ts +218 -0
- package/src/onboarding/tool-helpers.ts +111 -0
- package/src/onboarding/tool-tags.ts +201 -0
- package/src/onboarding/validation.ts +158 -0
- package/src/pi/opencandle-extension.ts +724 -0
- package/src/pi/session-storage.ts +5 -0
- package/src/pi/session.ts +81 -0
- package/src/pi/setup.ts +371 -0
- package/src/pi/tool-adapter.ts +36 -0
- package/src/prompts/context-builder.ts +204 -0
- package/src/prompts/disclaimer.ts +9 -0
- package/src/prompts/sections.ts +46 -0
- package/src/prompts/workflow-prompts.ts +279 -0
- package/src/providers/alpha-vantage.ts +292 -0
- package/src/providers/coingecko.ts +96 -0
- package/src/providers/exa-search.ts +373 -0
- package/src/providers/fear-greed.ts +45 -0
- package/src/providers/finnhub.ts +124 -0
- package/src/providers/fred.ts +83 -0
- package/src/providers/index.ts +9 -0
- package/src/providers/provider-credential-error.ts +23 -0
- package/src/providers/reddit.ts +151 -0
- package/src/providers/sec-edgar.ts +96 -0
- package/src/providers/twitter.ts +173 -0
- package/src/providers/web-search.ts +293 -0
- package/src/providers/with-fallback.ts +41 -0
- package/src/providers/wrap-provider.ts +64 -0
- package/src/providers/yahoo-finance.ts +367 -0
- package/src/routing/classify-intent.ts +194 -0
- package/src/routing/defaults.ts +29 -0
- package/src/routing/entity-extractor.ts +140 -0
- package/src/routing/index.ts +26 -0
- package/src/routing/router-llm-client.ts +51 -0
- package/src/routing/router-prompt.ts +159 -0
- package/src/routing/router-types.ts +66 -0
- package/src/routing/router.ts +213 -0
- package/src/routing/slot-resolver.ts +152 -0
- package/src/routing/types.ts +63 -0
- package/src/runtime/evidence.ts +77 -0
- package/src/runtime/index.ts +55 -0
- package/src/runtime/prompt-step.ts +75 -0
- package/src/runtime/provider-ids.ts +15 -0
- package/src/runtime/provider-tracker.ts +40 -0
- package/src/runtime/run-context.ts +22 -0
- package/src/runtime/session-coordinator.ts +406 -0
- package/src/runtime/tool-defaults-wrapper.ts +35 -0
- package/src/runtime/validation.ts +214 -0
- package/src/runtime/workflow-events.ts +75 -0
- package/src/runtime/workflow-runner.ts +188 -0
- package/src/runtime/workflow-types.ts +102 -0
- package/src/sentiment/adapters/finnhub.ts +44 -0
- package/src/sentiment/adapters/reddit.ts +65 -0
- package/src/sentiment/adapters/twitter.ts +36 -0
- package/src/sentiment/adapters/web.ts +44 -0
- package/src/sentiment/index.ts +58 -0
- package/src/sentiment/keywords.ts +9 -0
- package/src/sentiment/pipeline.ts +68 -0
- package/src/sentiment/scorer.ts +78 -0
- package/src/sentiment/store.ts +260 -0
- package/src/sentiment/trends.ts +90 -0
- package/src/sentiment/types.ts +108 -0
- package/src/system-prompt.ts +115 -0
- package/src/tool-kit.ts +68 -0
- package/src/tools/AGENTS.md +36 -0
- package/src/tools/fundamentals/company-overview.ts +54 -0
- package/src/tools/fundamentals/comps.ts +156 -0
- package/src/tools/fundamentals/dcf.ts +267 -0
- package/src/tools/fundamentals/earnings.ts +47 -0
- package/src/tools/fundamentals/financials.ts +54 -0
- package/src/tools/fundamentals/sec-filings.ts +61 -0
- package/src/tools/index.ts +88 -0
- package/src/tools/interaction/ask-user.ts +81 -0
- package/src/tools/interaction/twitter-login.ts +93 -0
- package/src/tools/macro/fear-greed.ts +41 -0
- package/src/tools/macro/fred-data.ts +54 -0
- package/src/tools/market/crypto-history.ts +51 -0
- package/src/tools/market/crypto-price.ts +53 -0
- package/src/tools/market/search-ticker.ts +53 -0
- package/src/tools/market/stock-history.ts +79 -0
- package/src/tools/market/stock-quote.ts +64 -0
- package/src/tools/options/greeks.ts +82 -0
- package/src/tools/options/option-chain.ts +91 -0
- package/src/tools/portfolio/correlation.ts +162 -0
- package/src/tools/portfolio/predictions.ts +253 -0
- package/src/tools/portfolio/risk-analysis.ts +134 -0
- package/src/tools/portfolio/tracker.ts +147 -0
- package/src/tools/portfolio/watchlist.ts +153 -0
- package/src/tools/sentiment/reddit-sentiment.ts +164 -0
- package/src/tools/sentiment/sentiment-summary.ts +256 -0
- package/src/tools/sentiment/sentiment-trend.ts +58 -0
- package/src/tools/sentiment/twitter-sentiment.ts +96 -0
- package/src/tools/sentiment/web-search.ts +150 -0
- package/src/tools/sentiment/web-sentiment.ts +76 -0
- package/src/tools/technical/backtest.ts +246 -0
- package/src/tools/technical/indicators.ts +258 -0
- package/src/types/fundamentals.ts +46 -0
- package/src/types/index.ts +20 -0
- package/src/types/macro.ts +27 -0
- package/src/types/market.ts +43 -0
- package/src/types/options.ts +35 -0
- package/src/types/portfolio.ts +41 -0
- package/src/types/sentiment.ts +70 -0
- package/src/workflows/compare-assets.ts +39 -0
- package/src/workflows/index.ts +4 -0
- package/src/workflows/options-screener.ts +49 -0
- package/src/workflows/portfolio-builder.ts +52 -0
- package/src/workflows/types.ts +4 -0
- package/dist/tools/sentiment/news-sentiment.d.ts +0 -7
- package/dist/tools/sentiment/news-sentiment.js +0 -55
- package/dist/tools/sentiment/news-sentiment.js.map +0 -1
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { extractEntities } from "./entity-extractor.js";
|
|
2
|
+
import { buildRouterPrompt } from "./router-prompt.js";
|
|
3
|
+
const VALID_ROUTES = ["workflow", "fallback"];
|
|
4
|
+
const VALID_WORKFLOWS = [
|
|
5
|
+
"portfolio_builder",
|
|
6
|
+
"options_screener",
|
|
7
|
+
"compare_assets",
|
|
8
|
+
"single_asset_analysis",
|
|
9
|
+
"watchlist_or_tracking",
|
|
10
|
+
"general_finance_qa",
|
|
11
|
+
];
|
|
12
|
+
const VALID_SOURCES = new Set(["user", "preference", "default"]);
|
|
13
|
+
const VALID_CONFIDENCE = new Set(["high", "medium", "low"]);
|
|
14
|
+
/**
|
|
15
|
+
* Run the LLM router against the given input context. Retries once on
|
|
16
|
+
* validation failure with a corrective message. Falls back to a minimal
|
|
17
|
+
* `route: "fallback"` output on persistent failure.
|
|
18
|
+
*
|
|
19
|
+
* The LLM client is injected so unit tests can supply deterministic responses.
|
|
20
|
+
*/
|
|
21
|
+
export async function route(input, client) {
|
|
22
|
+
const prompt = buildRouterPrompt(input);
|
|
23
|
+
let firstError;
|
|
24
|
+
try {
|
|
25
|
+
const raw = await client.complete(prompt);
|
|
26
|
+
return validateRouterOutput(raw);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
firstError = err instanceof Error ? err.message : String(err);
|
|
30
|
+
}
|
|
31
|
+
// Retry once with error feedback.
|
|
32
|
+
try {
|
|
33
|
+
const retryPrompt = `${prompt}\n\n(Your previous response failed validation: ${firstError}. Return a valid JSON object conforming to RouterOutput. Nothing else.)`;
|
|
34
|
+
const raw = await client.complete(retryPrompt);
|
|
35
|
+
return validateRouterOutput(raw);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Persistent failure — return a minimal fallback with regex-extracted symbols.
|
|
39
|
+
return minimalFallback(input.text);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function validateRouterOutput(raw) {
|
|
43
|
+
const parsed = parseJsonPayload(raw);
|
|
44
|
+
if (!parsed || typeof parsed !== "object") {
|
|
45
|
+
throw new Error("router output was not a JSON object");
|
|
46
|
+
}
|
|
47
|
+
const obj = parsed;
|
|
48
|
+
const route = obj.route;
|
|
49
|
+
if (typeof route !== "string" || !VALID_ROUTES.includes(route)) {
|
|
50
|
+
throw new Error(`invalid route: ${JSON.stringify(route)}`);
|
|
51
|
+
}
|
|
52
|
+
let workflow;
|
|
53
|
+
if (route === "workflow") {
|
|
54
|
+
if (typeof obj.workflow !== "string" || !VALID_WORKFLOWS.includes(obj.workflow)) {
|
|
55
|
+
throw new Error(`workflow route requires a valid workflow; got ${JSON.stringify(obj.workflow)}`);
|
|
56
|
+
}
|
|
57
|
+
workflow = obj.workflow;
|
|
58
|
+
}
|
|
59
|
+
const entities = validateEntities(obj.entities);
|
|
60
|
+
const slots = validateSlots(obj.slots);
|
|
61
|
+
const preference_updates = validatePreferenceUpdates(obj.preference_updates);
|
|
62
|
+
const missing_required = validateStringArray(obj.missing_required, "missing_required");
|
|
63
|
+
const reasoning = typeof obj.reasoning === "string" ? obj.reasoning : "";
|
|
64
|
+
return {
|
|
65
|
+
route: route,
|
|
66
|
+
workflow,
|
|
67
|
+
entities,
|
|
68
|
+
slots,
|
|
69
|
+
preference_updates,
|
|
70
|
+
missing_required,
|
|
71
|
+
reasoning,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function parseJsonPayload(raw) {
|
|
75
|
+
const trimmed = raw.trim();
|
|
76
|
+
// Tolerate ```json ... ``` fences even though the prompt forbids them.
|
|
77
|
+
const stripped = trimmed
|
|
78
|
+
.replace(/^```(?:json)?\s*/i, "")
|
|
79
|
+
.replace(/\s*```$/i, "")
|
|
80
|
+
.trim();
|
|
81
|
+
try {
|
|
82
|
+
return JSON.parse(stripped);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
86
|
+
throw new Error(`router output was not valid JSON: ${msg}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function validateEntities(raw) {
|
|
90
|
+
if (!raw || typeof raw !== "object") {
|
|
91
|
+
throw new Error("entities must be an object");
|
|
92
|
+
}
|
|
93
|
+
const e = raw;
|
|
94
|
+
const symbols = validateStringArray(e.symbols, "entities.symbols").map((s) => s.toUpperCase());
|
|
95
|
+
const out = { symbols };
|
|
96
|
+
if (typeof e.budget === "number")
|
|
97
|
+
out.budget = e.budget;
|
|
98
|
+
if (typeof e.maxPremium === "number")
|
|
99
|
+
out.maxPremium = e.maxPremium;
|
|
100
|
+
if (typeof e.timeHorizon === "string")
|
|
101
|
+
out.timeHorizon = e.timeHorizon;
|
|
102
|
+
if (typeof e.riskProfile === "string")
|
|
103
|
+
out.riskProfile = e.riskProfile;
|
|
104
|
+
if (e.direction === "bullish" || e.direction === "bearish")
|
|
105
|
+
out.direction = e.direction;
|
|
106
|
+
if (typeof e.dteHint === "string")
|
|
107
|
+
out.dteHint = e.dteHint;
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
function validateSlots(raw) {
|
|
111
|
+
if (raw === undefined || raw === null)
|
|
112
|
+
return {};
|
|
113
|
+
if (typeof raw !== "object") {
|
|
114
|
+
throw new Error("slots must be an object");
|
|
115
|
+
}
|
|
116
|
+
const out = {};
|
|
117
|
+
for (const [key, val] of Object.entries(raw)) {
|
|
118
|
+
if (!val || typeof val !== "object") {
|
|
119
|
+
throw new Error(`slot ${key} must be an object`);
|
|
120
|
+
}
|
|
121
|
+
const s = val;
|
|
122
|
+
if (!VALID_SOURCES.has(s.source)) {
|
|
123
|
+
throw new Error(`slot ${key} has invalid source: ${JSON.stringify(s.source)}`);
|
|
124
|
+
}
|
|
125
|
+
if (!VALID_CONFIDENCE.has(s.confidence)) {
|
|
126
|
+
throw new Error(`slot ${key} has invalid confidence: ${JSON.stringify(s.confidence)}`);
|
|
127
|
+
}
|
|
128
|
+
out[key] = {
|
|
129
|
+
value: s.value,
|
|
130
|
+
source: s.source,
|
|
131
|
+
confidence: s.confidence,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return out;
|
|
135
|
+
}
|
|
136
|
+
function validatePreferenceUpdates(raw) {
|
|
137
|
+
if (raw === undefined || raw === null)
|
|
138
|
+
return [];
|
|
139
|
+
if (!Array.isArray(raw)) {
|
|
140
|
+
throw new Error("preference_updates must be an array");
|
|
141
|
+
}
|
|
142
|
+
return raw.map((item, idx) => {
|
|
143
|
+
if (!item || typeof item !== "object") {
|
|
144
|
+
throw new Error(`preference_updates[${idx}] must be an object`);
|
|
145
|
+
}
|
|
146
|
+
const p = item;
|
|
147
|
+
if (typeof p.key !== "string" || p.key.length === 0) {
|
|
148
|
+
throw new Error(`preference_updates[${idx}].key must be a non-empty string`);
|
|
149
|
+
}
|
|
150
|
+
if (typeof p.value !== "string") {
|
|
151
|
+
throw new Error(`preference_updates[${idx}].value must be a string`);
|
|
152
|
+
}
|
|
153
|
+
if (!VALID_CONFIDENCE.has(p.confidence)) {
|
|
154
|
+
throw new Error(`preference_updates[${idx}].confidence is invalid`);
|
|
155
|
+
}
|
|
156
|
+
// Router-emitted preferences are always inferred — absent is accepted
|
|
157
|
+
// (normalized), but any explicit non-"inferred" value is an invariant
|
|
158
|
+
// violation the caller should see rather than silently lose.
|
|
159
|
+
if (p.source !== undefined && p.source !== "inferred") {
|
|
160
|
+
throw new Error(`preference_updates[${idx}].source must be "inferred" (got ${JSON.stringify(p.source)})`);
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
key: p.key,
|
|
164
|
+
value: p.value,
|
|
165
|
+
confidence: p.confidence,
|
|
166
|
+
source: "inferred",
|
|
167
|
+
};
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
function validateStringArray(raw, field) {
|
|
171
|
+
if (raw === undefined || raw === null)
|
|
172
|
+
return [];
|
|
173
|
+
if (!Array.isArray(raw)) {
|
|
174
|
+
throw new Error(`${field} must be an array`);
|
|
175
|
+
}
|
|
176
|
+
return raw.map((item, idx) => {
|
|
177
|
+
if (typeof item !== "string") {
|
|
178
|
+
throw new Error(`${field}[${idx}] must be a string`);
|
|
179
|
+
}
|
|
180
|
+
return item;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
function minimalFallback(text) {
|
|
184
|
+
const entities = extractEntities(text);
|
|
185
|
+
return {
|
|
186
|
+
route: "fallback",
|
|
187
|
+
entities: { symbols: entities.symbols },
|
|
188
|
+
slots: {},
|
|
189
|
+
preference_updates: [],
|
|
190
|
+
missing_required: [],
|
|
191
|
+
reasoning: "router validation failed; emitted minimal fallback",
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/routing/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@
|
|
1
|
+
import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
import { MemoryStorage } from "../memory/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Alias for the session-manager handle extensions receive via
|
|
5
|
+
* `ExtensionContext`. `ReadonlySessionManager` is defined inside pi-coding-
|
|
6
|
+
* agent but is not re-exported from the package's `.` entry, so we derive
|
|
7
|
+
* the shape we need from the public `ExtensionContext` type.
|
|
8
|
+
*/
|
|
9
|
+
type ReadonlySessionManager = ExtensionContext["sessionManager"];
|
|
3
10
|
import { WorkflowRunner } from "./workflow-runner.js";
|
|
11
|
+
import { type FallbackContext } from "../prompts/context-builder.js";
|
|
4
12
|
import type { WorkflowDefinition } from "./prompt-step.js";
|
|
5
13
|
type QueueContext = ExtensionCommandContext | {
|
|
6
14
|
isIdle(): boolean;
|
|
@@ -29,14 +37,65 @@ export declare class SessionCoordinator {
|
|
|
29
37
|
/** Run setup flow. */
|
|
30
38
|
runSetup(pi: ExtensionAPI, ctx: ExtensionContext | ExtensionCommandContext, options: {
|
|
31
39
|
mode: "startup" | "manual";
|
|
32
|
-
forceFinancePrompt?: boolean;
|
|
33
40
|
}): Promise<"ready" | "shutdown" | "cancelled">;
|
|
34
41
|
/** Extract and persist user preferences from natural language. */
|
|
35
42
|
extractAndStorePreferences(text: string): void;
|
|
36
43
|
/** Record a workflow run in storage. */
|
|
37
|
-
recordWorkflowRun(workflowType: string, entities: object, resolved: object, defaultsUsed: unknown[]): void;
|
|
44
|
+
recordWorkflowRun(workflowType: string, entities: object, resolved: object, defaultsUsed: unknown[], turnType?: "workflow" | "fallback"): void;
|
|
45
|
+
/**
|
|
46
|
+
* Extract the last `max` user/assistant turns from the session branch as
|
|
47
|
+
* `{role, text}` pairs, oldest→newest. Walks `sessionManager.getBranch()`
|
|
48
|
+
* (root→leaf order) and filters per the intent-routing spec:
|
|
49
|
+
*
|
|
50
|
+
* - Keep only `type === "message"` entries whose `message.role` is
|
|
51
|
+
* `"user"` or `"assistant"`. Compaction, branch_summary, custom, label,
|
|
52
|
+
* thinking_level_change, model_change, and session_info entries are
|
|
53
|
+
* skipped. Tool-result messages (`role === "toolResult"`) are skipped.
|
|
54
|
+
* - Extract concatenated text-block content. User `content` may be a
|
|
55
|
+
* plain string; assistant `content` is always an array of blocks, from
|
|
56
|
+
* which only `type === "text"` blocks contribute.
|
|
57
|
+
* - Drop entries whose resulting text is empty or whitespace-only
|
|
58
|
+
* (handles aborted assistant turns and tool-only assistant turns).
|
|
59
|
+
* - Slice to the last `max` qualifying entries.
|
|
60
|
+
*
|
|
61
|
+
* Privacy note: conversational text in priorTurns is NOT filtered by
|
|
62
|
+
* `NEVER_TRUST_FROM_MEMORY` (which governs structured memory keys). A
|
|
63
|
+
* future `/forget` command is the designated scrubbing primitive — see
|
|
64
|
+
* `openspec/changes/router-context-and-observability/` for the follow-up.
|
|
65
|
+
*/
|
|
66
|
+
buildPriorTurns(sessionManager: ReadonlySessionManager, max?: number): Array<{
|
|
67
|
+
role: "user" | "assistant";
|
|
68
|
+
text: string;
|
|
69
|
+
}>;
|
|
70
|
+
/**
|
|
71
|
+
* Expose prior turns + recent runs + profile snapshot for the router
|
|
72
|
+
* input context. Fixed-window per design.md §7 (last 5 turns, 3 runs).
|
|
73
|
+
* `priorTurns` is derived from the session branch at call time; see
|
|
74
|
+
* `buildPriorTurns` for the filter rules.
|
|
75
|
+
*/
|
|
76
|
+
buildRouterContextBase(sessionManager: ReadonlySessionManager): {
|
|
77
|
+
profileSnapshot: Record<string, unknown>;
|
|
78
|
+
recentWorkflowRuns: Array<{
|
|
79
|
+
workflowType: string;
|
|
80
|
+
turnType: string;
|
|
81
|
+
resolvedSlots?: Record<string, unknown>;
|
|
82
|
+
createdAt: string;
|
|
83
|
+
}>;
|
|
84
|
+
priorTurns: Array<{
|
|
85
|
+
role: "user" | "assistant";
|
|
86
|
+
text: string;
|
|
87
|
+
}>;
|
|
88
|
+
};
|
|
38
89
|
/** Build system prompt using composable sections. */
|
|
39
|
-
buildSystemPrompt(basePrompt: string, workflowType?: string): string;
|
|
90
|
+
buildSystemPrompt(basePrompt: string, workflowType?: string, fallbackContext?: FallbackContext): string;
|
|
91
|
+
/**
|
|
92
|
+
* Stash a pending fallback context so the very next `before_agent_start`
|
|
93
|
+
* hook can slot it into the system prompt. Cleared after consumption so
|
|
94
|
+
* subsequent turns do not inherit stale fallback directives.
|
|
95
|
+
*/
|
|
96
|
+
private pendingFallbackContext;
|
|
97
|
+
setPendingFallbackContext(ctx: FallbackContext | null): void;
|
|
98
|
+
consumePendingFallbackContext(): FallbackContext | null;
|
|
40
99
|
/**
|
|
41
100
|
* Execute a workflow definition through the WorkflowRunner,
|
|
42
101
|
* sending prompts via Pi with settlement-based sequencing.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { initDefaultDatabase, MemoryStorage } from "../memory/index.js";
|
|
1
|
+
import { getAllDefaults, initDefaultDatabase, MemoryStorage } from "../memory/index.js";
|
|
2
2
|
import { MemoryManager } from "../memory/manager.js";
|
|
3
3
|
import { extractPreferences } from "../memory/preference-extractor.js";
|
|
4
4
|
import { runOpenCandleSetup } from "../pi/setup.js";
|
|
@@ -11,6 +11,19 @@ import { getAddonToolDescriptions } from "../tool-kit.js";
|
|
|
11
11
|
import { toStepDefinitions, promptStepOutput } from "./prompt-step.js";
|
|
12
12
|
const PROMPT_SETTLE_POLL_MS = 25;
|
|
13
13
|
const IMMEDIATE_IDLE_GRACE_MS = 100;
|
|
14
|
+
function parseMaybeJson(raw) {
|
|
15
|
+
if (typeof raw !== "string" || raw.length === 0)
|
|
16
|
+
return undefined;
|
|
17
|
+
try {
|
|
18
|
+
const parsed = JSON.parse(raw);
|
|
19
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
20
|
+
? parsed
|
|
21
|
+
: undefined;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
14
27
|
function hasPendingMessages(ctx) {
|
|
15
28
|
return ctx.hasPendingMessages?.() ?? false;
|
|
16
29
|
}
|
|
@@ -92,17 +105,105 @@ export class SessionCoordinator {
|
|
|
92
105
|
}
|
|
93
106
|
}
|
|
94
107
|
/** Record a workflow run in storage. */
|
|
95
|
-
recordWorkflowRun(workflowType, entities, resolved, defaultsUsed) {
|
|
108
|
+
recordWorkflowRun(workflowType, entities, resolved, defaultsUsed, turnType = "workflow") {
|
|
96
109
|
this.storage?.insertWorkflowRun({
|
|
97
110
|
sessionId: this.sessionId,
|
|
98
111
|
workflowType,
|
|
99
112
|
inputSlotsJson: JSON.stringify(entities),
|
|
100
113
|
resolvedSlotsJson: JSON.stringify(resolved),
|
|
101
114
|
defaultsUsedJson: JSON.stringify(defaultsUsed),
|
|
115
|
+
turnType,
|
|
102
116
|
});
|
|
103
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Extract the last `max` user/assistant turns from the session branch as
|
|
120
|
+
* `{role, text}` pairs, oldest→newest. Walks `sessionManager.getBranch()`
|
|
121
|
+
* (root→leaf order) and filters per the intent-routing spec:
|
|
122
|
+
*
|
|
123
|
+
* - Keep only `type === "message"` entries whose `message.role` is
|
|
124
|
+
* `"user"` or `"assistant"`. Compaction, branch_summary, custom, label,
|
|
125
|
+
* thinking_level_change, model_change, and session_info entries are
|
|
126
|
+
* skipped. Tool-result messages (`role === "toolResult"`) are skipped.
|
|
127
|
+
* - Extract concatenated text-block content. User `content` may be a
|
|
128
|
+
* plain string; assistant `content` is always an array of blocks, from
|
|
129
|
+
* which only `type === "text"` blocks contribute.
|
|
130
|
+
* - Drop entries whose resulting text is empty or whitespace-only
|
|
131
|
+
* (handles aborted assistant turns and tool-only assistant turns).
|
|
132
|
+
* - Slice to the last `max` qualifying entries.
|
|
133
|
+
*
|
|
134
|
+
* Privacy note: conversational text in priorTurns is NOT filtered by
|
|
135
|
+
* `NEVER_TRUST_FROM_MEMORY` (which governs structured memory keys). A
|
|
136
|
+
* future `/forget` command is the designated scrubbing primitive — see
|
|
137
|
+
* `openspec/changes/router-context-and-observability/` for the follow-up.
|
|
138
|
+
*/
|
|
139
|
+
buildPriorTurns(sessionManager, max = 5) {
|
|
140
|
+
const branch = sessionManager.getBranch();
|
|
141
|
+
const turns = [];
|
|
142
|
+
for (const entry of branch) {
|
|
143
|
+
if (entry.type !== "message")
|
|
144
|
+
continue;
|
|
145
|
+
const msg = entry.message;
|
|
146
|
+
if (!msg || typeof msg !== "object")
|
|
147
|
+
continue;
|
|
148
|
+
const role = msg.role;
|
|
149
|
+
if (role !== "user" && role !== "assistant")
|
|
150
|
+
continue;
|
|
151
|
+
const rawContent = msg.content;
|
|
152
|
+
let text = "";
|
|
153
|
+
if (typeof rawContent === "string") {
|
|
154
|
+
text = rawContent;
|
|
155
|
+
}
|
|
156
|
+
else if (Array.isArray(rawContent)) {
|
|
157
|
+
for (const block of rawContent) {
|
|
158
|
+
if (block &&
|
|
159
|
+
typeof block === "object" &&
|
|
160
|
+
block.type === "text" &&
|
|
161
|
+
typeof block.text === "string") {
|
|
162
|
+
text += block.text;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (text.trim().length === 0)
|
|
167
|
+
continue;
|
|
168
|
+
turns.push({ role, text });
|
|
169
|
+
}
|
|
170
|
+
return turns.slice(-max);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Expose prior turns + recent runs + profile snapshot for the router
|
|
174
|
+
* input context. Fixed-window per design.md §7 (last 5 turns, 3 runs).
|
|
175
|
+
* `priorTurns` is derived from the session branch at call time; see
|
|
176
|
+
* `buildPriorTurns` for the filter rules.
|
|
177
|
+
*/
|
|
178
|
+
buildRouterContextBase(sessionManager) {
|
|
179
|
+
const priorTurns = this.buildPriorTurns(sessionManager);
|
|
180
|
+
if (!this.storage) {
|
|
181
|
+
return { profileSnapshot: {}, recentWorkflowRuns: [], priorTurns };
|
|
182
|
+
}
|
|
183
|
+
const prefs = this.storage.getPreferencesByNamespace("global");
|
|
184
|
+
const profileSnapshot = {};
|
|
185
|
+
for (const p of prefs) {
|
|
186
|
+
const key = String(p.key);
|
|
187
|
+
const rawValue = p.value_json;
|
|
188
|
+
if (typeof rawValue === "string") {
|
|
189
|
+
try {
|
|
190
|
+
profileSnapshot[key] = JSON.parse(rawValue);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
profileSnapshot[key] = rawValue;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const runs = this.storage.getRecentWorkflowRuns(3).map((r) => ({
|
|
198
|
+
workflowType: String(r.workflow_type ?? ""),
|
|
199
|
+
turnType: String(r.turn_type ?? "workflow"),
|
|
200
|
+
resolvedSlots: parseMaybeJson(r.resolved_slots_json),
|
|
201
|
+
createdAt: String(r.created_at ?? ""),
|
|
202
|
+
}));
|
|
203
|
+
return { profileSnapshot, recentWorkflowRuns: runs, priorTurns };
|
|
204
|
+
}
|
|
104
205
|
/** Build system prompt using composable sections. */
|
|
105
|
-
buildSystemPrompt(basePrompt, workflowType) {
|
|
206
|
+
buildSystemPrompt(basePrompt, workflowType, fallbackContext) {
|
|
106
207
|
const builder = new PromptContextBuilder();
|
|
107
208
|
const addonTools = getAddonToolDescriptions();
|
|
108
209
|
const addonDescriptions = addonTools.length > 0
|
|
@@ -115,8 +216,27 @@ export class SessionCoordinator {
|
|
|
115
216
|
workflowType,
|
|
116
217
|
memoryContext: memoryContext || undefined,
|
|
117
218
|
addonToolDescriptions: addonDescriptions,
|
|
219
|
+
fallbackContext,
|
|
118
220
|
});
|
|
119
|
-
|
|
221
|
+
const toolDefaults = formatToolDefaultsForPrompt();
|
|
222
|
+
const defaultsSection = toolDefaults.length > 0
|
|
223
|
+
? `\n\n## User Tool Defaults\n${toolDefaults.join("\n")}`
|
|
224
|
+
: "";
|
|
225
|
+
return `${basePrompt}\n\n${builder.build()}${defaultsSection}`;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Stash a pending fallback context so the very next `before_agent_start`
|
|
229
|
+
* hook can slot it into the system prompt. Cleared after consumption so
|
|
230
|
+
* subsequent turns do not inherit stale fallback directives.
|
|
231
|
+
*/
|
|
232
|
+
pendingFallbackContext = null;
|
|
233
|
+
setPendingFallbackContext(ctx) {
|
|
234
|
+
this.pendingFallbackContext = ctx;
|
|
235
|
+
}
|
|
236
|
+
consumePendingFallbackContext() {
|
|
237
|
+
const ctx = this.pendingFallbackContext;
|
|
238
|
+
this.pendingFallbackContext = null;
|
|
239
|
+
return ctx;
|
|
120
240
|
}
|
|
121
241
|
/**
|
|
122
242
|
* Execute a workflow definition through the WorkflowRunner,
|
|
@@ -168,4 +288,35 @@ export class SessionCoordinator {
|
|
|
168
288
|
this.runner?.cancel();
|
|
169
289
|
}
|
|
170
290
|
}
|
|
291
|
+
function formatToolDefaultsForPrompt() {
|
|
292
|
+
try {
|
|
293
|
+
return [...getAllDefaults()]
|
|
294
|
+
.filter(([, defaults]) => Object.keys(defaults).some((key) => key !== "__enabled"))
|
|
295
|
+
.map(([toolName, defaults]) => {
|
|
296
|
+
const pairs = flattenDefaults(defaults)
|
|
297
|
+
.filter(([key]) => key !== "__enabled")
|
|
298
|
+
.map(([key, value]) => `${key}: ${String(value)}`);
|
|
299
|
+
return `- User has set defaults for \`${toolName}\` (${pairs.join(", ")}). You may override when the user's request requires it.`;
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
return [];
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
function flattenDefaults(defaults, prefix = "") {
|
|
307
|
+
const out = [];
|
|
308
|
+
for (const [key, value] of Object.entries(defaults)) {
|
|
309
|
+
const path = prefix ? `${prefix}.${key}` : key;
|
|
310
|
+
if (isPlainObject(value)) {
|
|
311
|
+
out.push(...flattenDefaults(value, path));
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
out.push([path, value]);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return out;
|
|
318
|
+
}
|
|
319
|
+
function isPlainObject(value) {
|
|
320
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
321
|
+
}
|
|
171
322
|
//# sourceMappingURL=session-coordinator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-coordinator.js","sourceRoot":"","sources":["../../src/runtime/session-coordinator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-coordinator.js","sourceRoot":"","sources":["../../src/runtime/session-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { AgentTool } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { TSchema } from "@sinclair/typebox";
|
|
3
|
+
export declare function wrapWithDefaults<TParams extends TSchema, TDetails>(tool: AgentTool<TParams, TDetails>, defaults: Record<string, unknown>): AgentTool<TParams, TDetails>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function wrapWithDefaults(tool, defaults) {
|
|
2
|
+
return {
|
|
3
|
+
...tool,
|
|
4
|
+
execute: async (toolCallId, params, signal, onUpdate) => {
|
|
5
|
+
const merged = mergeDefaults(defaults, params);
|
|
6
|
+
return tool.execute(toolCallId, merged, signal, onUpdate);
|
|
7
|
+
},
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function mergeDefaults(defaults, args) {
|
|
11
|
+
if (Object.keys(defaults).length === 0)
|
|
12
|
+
return args;
|
|
13
|
+
const out = { ...defaults };
|
|
14
|
+
for (const [key, value] of Object.entries(args)) {
|
|
15
|
+
const base = out[key];
|
|
16
|
+
out[key] = isPlainObject(base) && isPlainObject(value)
|
|
17
|
+
? mergeDefaults(base, value)
|
|
18
|
+
: value;
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
function isPlainObject(value) {
|
|
23
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=tool-defaults-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-defaults-wrapper.js","sourceRoot":"","sources":["../../src/runtime/tool-defaults-wrapper.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,gBAAgB,CAC9B,IAAkC,EAClC,QAAiC;IAEjC,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;YACtD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAiC,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAuB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7E,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,QAAiC,EACjC,IAA6B;IAE7B,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpD,MAAM,GAAG,GAA4B,EAAE,GAAG,QAAQ,EAAE,CAAC;IACrD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC;YACpD,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC;YAC5B,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SentinelRecord } from "../types.js";
|
|
2
|
+
import type { FinnhubArticle } from "../../providers/finnhub.js";
|
|
3
|
+
export declare class FinnhubAdapter {
|
|
4
|
+
readonly source: "finnhub";
|
|
5
|
+
mapToRecords(articles: FinnhubArticle[], query: string): SentinelRecord[];
|
|
6
|
+
}
|
|
7
|
+
export declare function extractTickersFromQuery(query: string): string[];
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { extractEntities } from "../../routing/entity-extractor.js";
|
|
3
|
+
const MAX_TICKERS = 3;
|
|
4
|
+
export class FinnhubAdapter {
|
|
5
|
+
source = "finnhub";
|
|
6
|
+
mapToRecords(articles, query) {
|
|
7
|
+
const fetchedAt = new Date().toISOString();
|
|
8
|
+
return articles.map((article) => ({
|
|
9
|
+
id: randomUUID(),
|
|
10
|
+
source: this.source,
|
|
11
|
+
sourceId: String(article.id),
|
|
12
|
+
query,
|
|
13
|
+
title: article.headline,
|
|
14
|
+
text: article.summary,
|
|
15
|
+
author: article.source,
|
|
16
|
+
url: article.url,
|
|
17
|
+
publishedAt: new Date(article.datetime * 1000).toISOString(),
|
|
18
|
+
fetchedAt,
|
|
19
|
+
engagement: {
|
|
20
|
+
score: 0,
|
|
21
|
+
replies: null,
|
|
22
|
+
shares: null,
|
|
23
|
+
views: null,
|
|
24
|
+
},
|
|
25
|
+
sentiment: {
|
|
26
|
+
score: 0,
|
|
27
|
+
confidence: 0,
|
|
28
|
+
method: "keyword",
|
|
29
|
+
tickers: article.related ? article.related.split(",").map((t) => t.trim()).filter(Boolean) : [],
|
|
30
|
+
},
|
|
31
|
+
metadata: { category: article.category },
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function extractTickersFromQuery(query) {
|
|
36
|
+
const entities = extractEntities(query);
|
|
37
|
+
return entities.symbols.slice(0, MAX_TICKERS);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=finnhub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finnhub.js","sourceRoot":"","sources":["../../../src/sentiment/adapters/finnhub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,MAAM,OAAO,cAAc;IAChB,MAAM,GAAG,SAAkB,CAAC;IAErC,YAAY,CAAC,QAA0B,EAAE,KAAa;QACpD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAChC,EAAE,EAAE,UAAU,EAAE;YAChB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,KAAK;YACL,KAAK,EAAE,OAAO,CAAC,QAAQ;YACvB,IAAI,EAAE,OAAO,CAAC,OAAO;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,WAAW,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;YAC5D,SAAS;YACT,UAAU,EAAE;gBACV,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,IAAI;aACZ;YACD,SAAS,EAAE;gBACT,KAAK,EAAE,CAAC;gBACR,UAAU,EAAE,CAAC;gBACb,MAAM,EAAE,SAAkB;gBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;aAChG;YACD,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;SACzC,CAAC,CAAC,CAAC;IACN,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SentinelRecord, SentimentAdapter } from "../types.js";
|
|
2
|
+
import type { RedditSentimentResult } from "../../types/sentiment.js";
|
|
3
|
+
import type { RedditComment } from "../../providers/reddit.js";
|
|
4
|
+
export declare class RedditAdapter implements SentimentAdapter {
|
|
5
|
+
readonly source: "reddit";
|
|
6
|
+
mapPostsToRecords(result: RedditSentimentResult, query: string): SentinelRecord[];
|
|
7
|
+
mapCommentsToRecords(comments: RedditComment[], parentId: string, subreddit: string, query: string): SentinelRecord[];
|
|
8
|
+
fetch(_query: string, _options?: {
|
|
9
|
+
hours?: number;
|
|
10
|
+
}): Promise<SentinelRecord[]>;
|
|
11
|
+
}
|