opencandle 0.4.0 → 0.5.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/LICENSE +1 -1
- package/README.md +106 -14
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +19 -3
- package/dist/config.js +61 -2
- package/dist/config.js.map +1 -1
- package/dist/infra/browser.d.ts +1 -3
- package/dist/infra/browser.js +1 -1
- package/dist/infra/browser.js.map +1 -1
- package/dist/infra/rate-limiter.d.ts +4 -0
- package/dist/infra/rate-limiter.js +5 -1
- package/dist/infra/rate-limiter.js.map +1 -1
- package/dist/memory/manager.d.ts +9 -0
- package/dist/memory/manager.js +28 -11
- package/dist/memory/manager.js.map +1 -1
- package/dist/memory/storage.d.ts +3 -2
- package/dist/memory/storage.js.map +1 -1
- package/dist/memory/types.js +4 -0
- package/dist/memory/types.js.map +1 -1
- package/dist/pi/opencandle-extension.js +230 -36
- package/dist/pi/opencandle-extension.js.map +1 -1
- package/dist/pi/setup.js +10 -0
- package/dist/pi/setup.js.map +1 -1
- package/dist/prompts/context-builder.d.ts +18 -3
- package/dist/prompts/context-builder.js +102 -16
- package/dist/prompts/context-builder.js.map +1 -1
- package/dist/prompts/disclaimer.js +1 -1
- package/dist/prompts/disclaimer.js.map +1 -1
- package/dist/prompts/policy-cards.d.ts +13 -0
- package/dist/prompts/policy-cards.js +197 -0
- package/dist/prompts/policy-cards.js.map +1 -0
- package/dist/prompts/sections.js +3 -3
- package/dist/prompts/sections.js.map +1 -1
- package/dist/prompts/workflow-prompts.js +170 -18
- package/dist/prompts/workflow-prompts.js.map +1 -1
- package/dist/providers/alpha-vantage.js +23 -1
- package/dist/providers/alpha-vantage.js.map +1 -1
- package/dist/providers/sec-edgar.d.ts +8 -1
- package/dist/providers/sec-edgar.js +172 -5
- package/dist/providers/sec-edgar.js.map +1 -1
- package/dist/providers/yahoo-finance.d.ts +2 -0
- package/dist/providers/yahoo-finance.js +134 -3
- package/dist/providers/yahoo-finance.js.map +1 -1
- package/dist/routing/classify-intent.d.ts +3 -0
- package/dist/routing/classify-intent.js +82 -3
- package/dist/routing/classify-intent.js.map +1 -1
- package/dist/routing/defaults.js +3 -3
- package/dist/routing/defaults.js.map +1 -1
- package/dist/routing/entity-extractor.d.ts +1 -0
- package/dist/routing/entity-extractor.js +158 -12
- package/dist/routing/entity-extractor.js.map +1 -1
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.js +4 -0
- package/dist/routing/index.js.map +1 -1
- package/dist/routing/legacy-rule-router.d.ts +9 -0
- package/dist/routing/legacy-rule-router.js +12 -0
- package/dist/routing/legacy-rule-router.js.map +1 -0
- package/dist/routing/planning.d.ts +54 -0
- package/dist/routing/planning.js +531 -0
- package/dist/routing/planning.js.map +1 -0
- package/dist/routing/route-manifest.d.ts +35 -0
- package/dist/routing/route-manifest.js +221 -0
- package/dist/routing/route-manifest.js.map +1 -0
- package/dist/routing/router-prompt.js +45 -42
- package/dist/routing/router-prompt.js.map +1 -1
- package/dist/routing/router-types.d.ts +9 -0
- package/dist/routing/router.d.ts +1 -0
- package/dist/routing/router.js +456 -12
- package/dist/routing/router.js.map +1 -1
- package/dist/routing/slot-resolver.js +46 -6
- package/dist/routing/slot-resolver.js.map +1 -1
- package/dist/routing/turn-context.d.ts +44 -0
- package/dist/routing/turn-context.js +45 -0
- package/dist/routing/turn-context.js.map +1 -0
- package/dist/routing/types.d.ts +13 -1
- package/dist/runtime/answer-contracts.d.ts +82 -0
- package/dist/runtime/answer-contracts.js +414 -0
- package/dist/runtime/answer-contracts.js.map +1 -0
- package/dist/runtime/artifact-contracts.d.ts +14 -0
- package/dist/runtime/artifact-contracts.js +57 -0
- package/dist/runtime/artifact-contracts.js.map +1 -0
- package/dist/runtime/planning-evidence.d.ts +99 -0
- package/dist/runtime/planning-evidence.js +445 -0
- package/dist/runtime/planning-evidence.js.map +1 -0
- package/dist/runtime/session-coordinator.d.ts +20 -2
- package/dist/runtime/session-coordinator.js +47 -14
- package/dist/runtime/session-coordinator.js.map +1 -1
- package/dist/system-prompt.js +4 -1
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/fundamentals/company-overview.js +1 -1
- package/dist/tools/fundamentals/company-overview.js.map +1 -1
- package/dist/tools/fundamentals/comps.js +1 -1
- package/dist/tools/fundamentals/comps.js.map +1 -1
- package/dist/tools/fundamentals/dcf.js +1 -1
- package/dist/tools/fundamentals/dcf.js.map +1 -1
- package/dist/tools/fundamentals/earnings.js +1 -1
- package/dist/tools/fundamentals/earnings.js.map +1 -1
- package/dist/tools/fundamentals/financials.js +1 -1
- package/dist/tools/fundamentals/financials.js.map +1 -1
- package/dist/tools/fundamentals/sec-filings.d.ts +1 -0
- package/dist/tools/fundamentals/sec-filings.js +19 -2
- package/dist/tools/fundamentals/sec-filings.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/macro/fear-greed.js +1 -1
- package/dist/tools/macro/fear-greed.js.map +1 -1
- package/dist/tools/macro/fred-data.js +29 -5
- package/dist/tools/macro/fred-data.js.map +1 -1
- package/dist/tools/market/crypto-history.js +18 -2
- package/dist/tools/market/crypto-history.js.map +1 -1
- package/dist/tools/market/crypto-price.js +1 -1
- package/dist/tools/market/crypto-price.js.map +1 -1
- package/dist/tools/market/search-ticker.js +1 -1
- package/dist/tools/market/search-ticker.js.map +1 -1
- package/dist/tools/market/stock-history.js +1 -1
- package/dist/tools/market/stock-history.js.map +1 -1
- package/dist/tools/market/stock-quote.js +1 -1
- package/dist/tools/market/stock-quote.js.map +1 -1
- package/dist/tools/options/greeks.js +0 -1
- package/dist/tools/options/greeks.js.map +1 -1
- package/dist/tools/options/option-chain.js +9 -4
- package/dist/tools/options/option-chain.js.map +1 -1
- package/dist/tools/portfolio/correlation.js +1 -1
- package/dist/tools/portfolio/correlation.js.map +1 -1
- package/dist/tools/portfolio/holdings-overlap.d.ts +8 -0
- package/dist/tools/portfolio/holdings-overlap.js +105 -0
- package/dist/tools/portfolio/holdings-overlap.js.map +1 -0
- package/dist/tools/portfolio/predictions.js +1 -1
- package/dist/tools/portfolio/predictions.js.map +1 -1
- package/dist/tools/portfolio/risk-analysis.js +1 -1
- package/dist/tools/portfolio/risk-analysis.js.map +1 -1
- package/dist/tools/portfolio/tracker.js +1 -1
- package/dist/tools/portfolio/tracker.js.map +1 -1
- package/dist/tools/portfolio/watchlist.js +12 -4
- package/dist/tools/portfolio/watchlist.js.map +1 -1
- package/dist/tools/sentiment/reddit-sentiment.js +1 -1
- package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
- package/dist/tools/sentiment/sentiment-summary.js +57 -2
- package/dist/tools/sentiment/sentiment-summary.js.map +1 -1
- package/dist/tools/sentiment/twitter-sentiment.js +1 -1
- package/dist/tools/sentiment/twitter-sentiment.js.map +1 -1
- package/dist/tools/sentiment/web-search.js +32 -3
- package/dist/tools/sentiment/web-search.js.map +1 -1
- package/dist/tools/sentiment/web-sentiment.js +1 -1
- package/dist/tools/sentiment/web-sentiment.js.map +1 -1
- package/dist/tools/technical/backtest.d.ts +2 -2
- package/dist/tools/technical/backtest.js +41 -27
- package/dist/tools/technical/backtest.js.map +1 -1
- package/dist/tools/technical/indicators.js +1 -3
- package/dist/tools/technical/indicators.js.map +1 -1
- package/dist/types/options.d.ts +10 -0
- package/dist/types/portfolio.d.ts +27 -0
- package/dist/workflows/compare-assets.js +38 -2
- package/dist/workflows/compare-assets.js.map +1 -1
- package/dist/workflows/options-screener.js +88 -7
- package/dist/workflows/options-screener.js.map +1 -1
- package/dist/workflows/portfolio-builder.js +7 -3
- package/dist/workflows/portfolio-builder.js.map +1 -1
- package/gui/server/ask-user-bridge.ts +82 -0
- package/gui/server/gui-session-manager.ts +5 -0
- package/gui/server/projector.ts +47 -5
- package/gui/server/prompt-observation.ts +61 -0
- package/gui/server/server.ts +119 -8
- package/gui/server/session-entry-wait.ts +81 -0
- package/gui/web/dist/assets/{CatalogOverlay-D1ImSJTe.js → CatalogOverlay-Bmp6Knu7.js} +1 -1
- package/gui/web/dist/assets/index-Bxt9QpLX.css +1 -0
- package/gui/web/dist/assets/index-CZ9DHZYy.js +67 -0
- package/gui/web/dist/index.html +2 -2
- package/package.json +18 -12
- package/src/cli.ts +2 -1
- package/src/config.ts +89 -5
- package/src/infra/browser.ts +1 -1
- package/src/infra/rate-limiter.ts +10 -1
- package/src/memory/manager.ts +43 -10
- package/src/memory/storage.ts +3 -2
- package/src/memory/types.ts +4 -0
- package/src/pi/opencandle-extension.ts +273 -42
- package/src/pi/setup.ts +10 -0
- package/src/prompts/context-builder.ts +128 -17
- package/src/prompts/disclaimer.ts +1 -1
- package/src/prompts/policy-cards.ts +220 -0
- package/src/prompts/sections.ts +3 -3
- package/src/prompts/workflow-prompts.ts +172 -18
- package/src/providers/alpha-vantage.ts +24 -1
- package/src/providers/sec-edgar.ts +220 -4
- package/src/providers/web-search.ts +1 -1
- package/src/providers/yahoo-finance.ts +171 -4
- package/src/routing/classify-intent.ts +94 -3
- package/src/routing/defaults.ts +3 -3
- package/src/routing/entity-extractor.ts +164 -13
- package/src/routing/index.ts +44 -0
- package/src/routing/legacy-rule-router.ts +13 -0
- package/src/routing/planning.ts +732 -0
- package/src/routing/route-manifest.ts +287 -0
- package/src/routing/router-prompt.ts +50 -46
- package/src/routing/router-types.ts +21 -0
- package/src/routing/router.ts +511 -12
- package/src/routing/slot-resolver.ts +44 -6
- package/src/routing/turn-context.ts +111 -0
- package/src/routing/types.ts +13 -1
- package/src/runtime/answer-contracts.ts +633 -0
- package/src/runtime/artifact-contracts.ts +76 -0
- package/src/runtime/planning-evidence.ts +591 -0
- package/src/runtime/session-coordinator.ts +78 -12
- package/src/system-prompt.ts +4 -1
- package/src/tools/fundamentals/company-overview.ts +1 -1
- package/src/tools/fundamentals/comps.ts +1 -1
- package/src/tools/fundamentals/dcf.ts +1 -1
- package/src/tools/fundamentals/earnings.ts +1 -1
- package/src/tools/fundamentals/financials.ts +1 -1
- package/src/tools/fundamentals/sec-filings.ts +25 -2
- package/src/tools/index.ts +3 -0
- package/src/tools/macro/fear-greed.ts +1 -1
- package/src/tools/macro/fred-data.ts +31 -5
- package/src/tools/market/crypto-history.ts +18 -2
- package/src/tools/market/crypto-price.ts +1 -1
- package/src/tools/market/search-ticker.ts +1 -1
- package/src/tools/market/stock-history.ts +1 -1
- package/src/tools/market/stock-quote.ts +1 -1
- package/src/tools/options/greeks.ts +0 -1
- package/src/tools/options/option-chain.ts +9 -4
- package/src/tools/portfolio/correlation.ts +1 -1
- package/src/tools/portfolio/holdings-overlap.ts +123 -0
- package/src/tools/portfolio/predictions.ts +1 -1
- package/src/tools/portfolio/risk-analysis.ts +1 -1
- package/src/tools/portfolio/tracker.ts +1 -1
- package/src/tools/portfolio/watchlist.ts +10 -4
- package/src/tools/sentiment/reddit-sentiment.ts +1 -1
- package/src/tools/sentiment/sentiment-summary.ts +62 -2
- package/src/tools/sentiment/twitter-sentiment.ts +1 -1
- package/src/tools/sentiment/web-search.ts +36 -3
- package/src/tools/sentiment/web-sentiment.ts +1 -1
- package/src/tools/technical/backtest.ts +50 -29
- package/src/tools/technical/indicators.ts +1 -3
- package/src/types/options.ts +17 -0
- package/src/types/portfolio.ts +32 -0
- package/src/workflows/compare-assets.ts +38 -2
- package/src/workflows/options-screener.ts +85 -7
- package/src/workflows/portfolio-builder.ts +7 -3
- package/dist/runtime/index.d.ts +0 -16
- package/dist/runtime/index.js +0 -10
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/provider-ids.d.ts +0 -14
- package/dist/runtime/provider-ids.js +0 -14
- package/dist/runtime/provider-ids.js.map +0 -1
- package/gui/web/dist/assets/index-DBrWq43L.css +0 -1
- package/gui/web/dist/assets/index-RflHaj0y.js +0 -67
- package/src/runtime/index.ts +0 -55
- package/src/runtime/provider-ids.ts +0 -15
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
import { parseToolTag } from "../onboarding/tool-tags.js";
|
|
2
|
+
export const EVIDENCE_PLAN_REGISTRY = {
|
|
3
|
+
market_status: {
|
|
4
|
+
id: "market_status",
|
|
5
|
+
taskFamilies: ["current_event_explanation", "macro_allocation_review"],
|
|
6
|
+
implemented: true,
|
|
7
|
+
requiredEvidence: ["market_status"],
|
|
8
|
+
optionalEvidence: ["tool_result"],
|
|
9
|
+
capabilityGapIds: ["market_calendar"],
|
|
10
|
+
},
|
|
11
|
+
ticker_disambiguation: {
|
|
12
|
+
id: "ticker_disambiguation",
|
|
13
|
+
taskFamilies: ["ticker_disambiguation"],
|
|
14
|
+
implemented: true,
|
|
15
|
+
requiredEvidence: ["ticker_disambiguation"],
|
|
16
|
+
optionalEvidence: ["tool_result"],
|
|
17
|
+
capabilityGapIds: ["earnings_event_risk"],
|
|
18
|
+
},
|
|
19
|
+
placeholder_single_asset_decision: placeholderPlan("placeholder_single_asset_decision", ["single_asset_decision"], []),
|
|
20
|
+
placeholder_asset_compare: placeholderPlan("placeholder_asset_compare", ["asset_compare"], ["etf_holdings_overlap"]),
|
|
21
|
+
placeholder_portfolio_build: placeholderPlan("placeholder_portfolio_build", ["portfolio_build"], []),
|
|
22
|
+
placeholder_portfolio_review: placeholderPlan("placeholder_portfolio_review", ["portfolio_review"], []),
|
|
23
|
+
placeholder_options_strategy: placeholderPlan("placeholder_options_strategy", ["options_strategy"], []),
|
|
24
|
+
placeholder_current_event_explanation: placeholderPlan("placeholder_current_event_explanation", ["current_event_explanation"], ["market_calendar"]),
|
|
25
|
+
placeholder_sentiment_snapshot: placeholderPlan("placeholder_sentiment_snapshot", ["sentiment_snapshot"], ["sentiment_sample_depth"]),
|
|
26
|
+
placeholder_filing_thesis_review: placeholderPlan("placeholder_filing_thesis_review", ["filing_thesis_review"], []),
|
|
27
|
+
placeholder_retail_finance_tradeoff: placeholderPlan("placeholder_retail_finance_tradeoff", ["retail_finance_tradeoff"], [
|
|
28
|
+
"brokerage_comparison",
|
|
29
|
+
"cash_yield_products",
|
|
30
|
+
"fund_tax_efficiency",
|
|
31
|
+
]),
|
|
32
|
+
placeholder_concept_explainer: placeholderPlan("placeholder_concept_explainer", ["concept_explainer"], []),
|
|
33
|
+
placeholder_backtest_review: placeholderPlan("placeholder_backtest_review", ["backtest_review"], []),
|
|
34
|
+
placeholder_stateful_tracking_update: placeholderPlan("placeholder_stateful_tracking_update", ["stateful_tracking_update"], []),
|
|
35
|
+
placeholder_general_fallback: placeholderPlan("placeholder_general_fallback", ["general_fallback"], []),
|
|
36
|
+
};
|
|
37
|
+
const KNOWN_US_MARKET_HOLIDAYS = {
|
|
38
|
+
"2026-01-01": "New Year's Day",
|
|
39
|
+
"2026-01-19": "Martin Luther King Jr. Day",
|
|
40
|
+
"2026-02-16": "Washington's Birthday",
|
|
41
|
+
"2026-04-03": "Good Friday",
|
|
42
|
+
"2026-05-25": "Memorial Day",
|
|
43
|
+
"2026-06-19": "Juneteenth",
|
|
44
|
+
"2026-07-03": "Independence Day observed",
|
|
45
|
+
"2026-09-07": "Labor Day",
|
|
46
|
+
"2026-11-26": "Thanksgiving Day",
|
|
47
|
+
"2026-12-25": "Christmas Day",
|
|
48
|
+
};
|
|
49
|
+
function placeholderPlan(id, taskFamilies, capabilityGapIds) {
|
|
50
|
+
return {
|
|
51
|
+
id,
|
|
52
|
+
taskFamilies,
|
|
53
|
+
implemented: false,
|
|
54
|
+
requiredEvidence: [],
|
|
55
|
+
optionalEvidence: ["tool_result"],
|
|
56
|
+
capabilityGapIds,
|
|
57
|
+
roadmapPlaceholder: "openspec/changes/prompt-to-policy-agent-planning/future-roadmap.md",
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function buildMarketStatusEvidence(input) {
|
|
61
|
+
const timezone = input.timezone ?? "America/New_York";
|
|
62
|
+
const now = input.now ?? new Date();
|
|
63
|
+
const local = localDateTimeParts(now, timezone);
|
|
64
|
+
const temporalReferences = temporalReferencesFor(input.text);
|
|
65
|
+
const holidayName = KNOWN_US_MARKET_HOLIDAYS[local.date];
|
|
66
|
+
const isWeekend = local.weekday === "Sat" || local.weekday === "Sun";
|
|
67
|
+
const isMarketHoliday = holidayName !== undefined;
|
|
68
|
+
const marketStatus = classifyMarketStatus(local, isWeekend, isMarketHoliday, temporalReferences);
|
|
69
|
+
const lastTradingDate = marketStatus === "open" ? local.date : lastTradingDay(local.date);
|
|
70
|
+
const gaps = [{
|
|
71
|
+
kind: "capability_gap",
|
|
72
|
+
capabilityGapId: "market_calendar",
|
|
73
|
+
reason: "V1 uses deterministic weekday and known-holiday grounding, not a live exchange-calendar provider.",
|
|
74
|
+
}];
|
|
75
|
+
return {
|
|
76
|
+
id: "market_status:deterministic",
|
|
77
|
+
evidenceType: "market_status",
|
|
78
|
+
source: { toolName: "deterministic_market_status" },
|
|
79
|
+
entityScope: { query: input.text },
|
|
80
|
+
observedAt: now.toISOString(),
|
|
81
|
+
providerStatus: "available",
|
|
82
|
+
normalizedFacts: {
|
|
83
|
+
timezone,
|
|
84
|
+
localDate: local.date,
|
|
85
|
+
localTime: local.time,
|
|
86
|
+
weekday: local.weekday,
|
|
87
|
+
temporalReferences,
|
|
88
|
+
isWeekend,
|
|
89
|
+
isMarketHoliday,
|
|
90
|
+
holidayName,
|
|
91
|
+
marketStatus,
|
|
92
|
+
lastTradingDay: lastTradingDate,
|
|
93
|
+
quoteAsOfCaveat: quoteAsOfCaveat(marketStatus),
|
|
94
|
+
},
|
|
95
|
+
rawTracePointer: input.traceId ? { traceId: input.traceId, toolName: "deterministic_market_status" } : undefined,
|
|
96
|
+
gaps,
|
|
97
|
+
caveats: ["Market status is deterministic V1 grounding and should be verified against an exchange calendar for edge cases."],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function buildTickerDisambiguationEvidence(input) {
|
|
101
|
+
const gaps = [{
|
|
102
|
+
kind: "capability_gap",
|
|
103
|
+
capabilityGapId: "earnings_event_risk",
|
|
104
|
+
reason: "Ticker disambiguation can preserve symbol-verification gaps, but V1 does not add richer earnings-event data.",
|
|
105
|
+
}];
|
|
106
|
+
return {
|
|
107
|
+
id: "ticker_disambiguation:selected_slice",
|
|
108
|
+
evidenceType: "ticker_disambiguation",
|
|
109
|
+
source: { toolName: "planning_ticker_disambiguation" },
|
|
110
|
+
entityScope: { symbols: [...(input.symbols ?? [])], query: input.text },
|
|
111
|
+
observedAt: new Date(0).toISOString(),
|
|
112
|
+
providerStatus: "available",
|
|
113
|
+
normalizedFacts: {
|
|
114
|
+
selectedMigrationSlice: "ticker_disambiguation",
|
|
115
|
+
requestedSymbols: [...(input.symbols ?? [])],
|
|
116
|
+
requiresSymbolVerification: true,
|
|
117
|
+
legacyBehaviorRemainsActive: true,
|
|
118
|
+
},
|
|
119
|
+
rawTracePointer: input.traceId ? { traceId: input.traceId, toolName: "planning_ticker_disambiguation" } : undefined,
|
|
120
|
+
gaps,
|
|
121
|
+
caveats: input.symbols?.length ? [] : ["No symbol was verified by this evidence plan; active tools remain responsible for lookup."],
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
export function buildPortfolioExposureMapEvidence(input) {
|
|
125
|
+
const sleeves = extractPortfolioSleeves(input.text);
|
|
126
|
+
const normalizedSleeves = new Set(sleeves.map((sleeve) => sleeve.normalizedSleeve));
|
|
127
|
+
const hasBroadIndex = normalizedSleeves.has("broad_us_index") || normalizedSleeves.has("broad_equity");
|
|
128
|
+
const hasSectorSleeve = sleeves.some((sleeve) => sleeve.normalizedSleeve.endsWith("_sector"));
|
|
129
|
+
const broadIndexOverlapCaveat = hasBroadIndex && hasSectorSleeve;
|
|
130
|
+
return {
|
|
131
|
+
id: "portfolio_exposure_map:deterministic",
|
|
132
|
+
evidenceType: "portfolio_exposure_map",
|
|
133
|
+
source: { toolName: "deterministic_portfolio_exposure_map" },
|
|
134
|
+
entityScope: { query: input.text },
|
|
135
|
+
observedAt: (input.now ?? new Date()).toISOString(),
|
|
136
|
+
providerStatus: "available",
|
|
137
|
+
normalizedFacts: {
|
|
138
|
+
directSleeves: sleeves,
|
|
139
|
+
directExposureTotalPercent: roundPercent(sleeves.reduce((sum, sleeve) => sum + sleeve.percent, 0)),
|
|
140
|
+
broadIndexOverlapCaveat,
|
|
141
|
+
exactHoldingsOverlapAvailable: false,
|
|
142
|
+
targetBandGuidanceNeeded: /\b(?:rebalance|target\s+bands?|drift|overweight|underweight|concentration|diversif)/i.test(input.text),
|
|
143
|
+
},
|
|
144
|
+
rawTracePointer: input.traceId ? {
|
|
145
|
+
traceId: input.traceId,
|
|
146
|
+
toolName: "deterministic_portfolio_exposure_map",
|
|
147
|
+
} : undefined,
|
|
148
|
+
gaps: [{
|
|
149
|
+
kind: "capability_gap",
|
|
150
|
+
capabilityGapId: "etf_holdings_overlap",
|
|
151
|
+
reason: "V1 records user-stated sleeves and overlap caveats but does not fetch exact ETF/index holdings or issuer weights.",
|
|
152
|
+
}],
|
|
153
|
+
caveats: [
|
|
154
|
+
"Exact ETF/index holdings overlap requires a provider-backed holdings source.",
|
|
155
|
+
...(broadIndexOverlapCaveat
|
|
156
|
+
? ["Broad index exposure may already include sector exposure; V1 does not estimate exact constituent weights."]
|
|
157
|
+
: []),
|
|
158
|
+
],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
export function captureEvidenceFromToolCall(toolCall, options = {}) {
|
|
162
|
+
const text = toolResultText(toolCall.result);
|
|
163
|
+
const providerGap = text ? normalizeProviderGapFromToolText(text) : undefined;
|
|
164
|
+
const providerStatus = providerGap?.providerStatus ?? (toolCall.isError ? "unavailable" : "available");
|
|
165
|
+
const gaps = providerGap ? [providerGapToEvidenceGap(providerGap)] : [];
|
|
166
|
+
if (toolCall.isError && !providerGap) {
|
|
167
|
+
gaps.push({
|
|
168
|
+
kind: "provider_status",
|
|
169
|
+
providerStatus: "unavailable",
|
|
170
|
+
reason: "Tool call returned an error.",
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
id: `tool_result:${toolCall.name}`,
|
|
175
|
+
evidenceType: providerGap ? "provider_gap" : "tool_result",
|
|
176
|
+
source: {
|
|
177
|
+
toolName: toolCall.name,
|
|
178
|
+
provider: providerGap?.provider,
|
|
179
|
+
},
|
|
180
|
+
entityScope: symbolsFromArgs(toolCall.args),
|
|
181
|
+
observedAt: new Date(0).toISOString(),
|
|
182
|
+
providerStatus,
|
|
183
|
+
normalizedFacts: {
|
|
184
|
+
toolName: toolCall.name,
|
|
185
|
+
args: { ...toolCall.args },
|
|
186
|
+
isError: toolCall.isError === true,
|
|
187
|
+
providerStatus,
|
|
188
|
+
},
|
|
189
|
+
rawTracePointer: {
|
|
190
|
+
...options,
|
|
191
|
+
toolName: toolCall.name,
|
|
192
|
+
},
|
|
193
|
+
gaps,
|
|
194
|
+
caveats: [],
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
export function normalizeProviderGapFromToolText(text) {
|
|
198
|
+
const parsed = parseToolTag(text);
|
|
199
|
+
if (!parsed || parsed.kind === "connected")
|
|
200
|
+
return undefined;
|
|
201
|
+
return {
|
|
202
|
+
providerStatus: providerStatusFromTag(parsed),
|
|
203
|
+
provider: parsed.provider,
|
|
204
|
+
reason: reasonFromTag(parsed),
|
|
205
|
+
remediation: remediationFromTag(parsed),
|
|
206
|
+
silenced: parsed.kind === "skipped" ? parsed.silenced : undefined,
|
|
207
|
+
rawTag: text,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
export function providerResultToPlanningEvidence(label, result, rawTracePointer) {
|
|
211
|
+
if (result.status === "ok") {
|
|
212
|
+
return {
|
|
213
|
+
id: `provider_result:${label}`,
|
|
214
|
+
evidenceType: "tool_result",
|
|
215
|
+
source: {},
|
|
216
|
+
entityScope: {},
|
|
217
|
+
observedAt: result.timestamp,
|
|
218
|
+
providerStatus: "available",
|
|
219
|
+
normalizedFacts: { label, data: result.data, stale: result.stale === true },
|
|
220
|
+
rawTracePointer,
|
|
221
|
+
gaps: [],
|
|
222
|
+
caveats: result.stale ? ["Provider result came from stale cache."] : [],
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
id: `provider_result:${label}`,
|
|
227
|
+
evidenceType: "provider_gap",
|
|
228
|
+
source: { provider: result.provider },
|
|
229
|
+
entityScope: {},
|
|
230
|
+
observedAt: new Date(0).toISOString(),
|
|
231
|
+
providerStatus: "unavailable",
|
|
232
|
+
normalizedFacts: { label },
|
|
233
|
+
rawTracePointer,
|
|
234
|
+
gaps: [{
|
|
235
|
+
kind: "provider_status",
|
|
236
|
+
providerStatus: "unavailable",
|
|
237
|
+
provider: result.provider,
|
|
238
|
+
reason: result.reason,
|
|
239
|
+
}],
|
|
240
|
+
caveats: [],
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function providerGapToEvidenceGap(gap) {
|
|
244
|
+
return {
|
|
245
|
+
kind: "provider_status",
|
|
246
|
+
providerStatus: gap.providerStatus,
|
|
247
|
+
provider: gap.provider,
|
|
248
|
+
reason: gap.reason,
|
|
249
|
+
remediation: gap.remediation,
|
|
250
|
+
silenced: gap.silenced,
|
|
251
|
+
rawTag: gap.rawTag,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function providerStatusFromTag(tag) {
|
|
255
|
+
if (tag.kind === "credential_required")
|
|
256
|
+
return "credential_required";
|
|
257
|
+
if (tag.kind === "soft_degraded")
|
|
258
|
+
return "soft_degraded";
|
|
259
|
+
return "skipped";
|
|
260
|
+
}
|
|
261
|
+
function reasonFromTag(tag) {
|
|
262
|
+
if (tag.kind === "credential_required") {
|
|
263
|
+
return tag.reason === "stale" ? "credential_stale" : "credential_missing";
|
|
264
|
+
}
|
|
265
|
+
if (tag.kind === "soft_degraded") {
|
|
266
|
+
return `soft_degraded_to_${tag.fallback}`;
|
|
267
|
+
}
|
|
268
|
+
return tag.reason;
|
|
269
|
+
}
|
|
270
|
+
function remediationFromTag(tag) {
|
|
271
|
+
if (tag.kind === "soft_degraded")
|
|
272
|
+
return tag.remediation;
|
|
273
|
+
if (tag.kind === "skipped")
|
|
274
|
+
return tag.remediation;
|
|
275
|
+
return "run /connect";
|
|
276
|
+
}
|
|
277
|
+
function toolResultText(result) {
|
|
278
|
+
if (typeof result === "string")
|
|
279
|
+
return result;
|
|
280
|
+
if (!isRecord(result))
|
|
281
|
+
return undefined;
|
|
282
|
+
const content = result.content;
|
|
283
|
+
if (typeof content === "string")
|
|
284
|
+
return content;
|
|
285
|
+
if (Array.isArray(content)) {
|
|
286
|
+
return content.map((item) => {
|
|
287
|
+
if (typeof item === "string")
|
|
288
|
+
return item;
|
|
289
|
+
if (isRecord(item) && typeof item.text === "string")
|
|
290
|
+
return item.text;
|
|
291
|
+
return "";
|
|
292
|
+
}).filter(Boolean).join("\n");
|
|
293
|
+
}
|
|
294
|
+
return undefined;
|
|
295
|
+
}
|
|
296
|
+
function symbolsFromArgs(args) {
|
|
297
|
+
const symbol = args.symbol;
|
|
298
|
+
const symbols = args.symbols;
|
|
299
|
+
if (typeof symbol === "string")
|
|
300
|
+
return { symbols: [symbol] };
|
|
301
|
+
if (Array.isArray(symbols) && symbols.every((item) => typeof item === "string")) {
|
|
302
|
+
return { symbols: [...symbols] };
|
|
303
|
+
}
|
|
304
|
+
return {};
|
|
305
|
+
}
|
|
306
|
+
function extractPortfolioSleeves(text) {
|
|
307
|
+
const matches = [];
|
|
308
|
+
const pattern = /(\d+(?:\.\d+)?)\s*%\s*(?:in|to|of|toward|towards|allocated\s+to)?\s*([^,;.\n?]+)/gi;
|
|
309
|
+
for (const match of text.matchAll(pattern)) {
|
|
310
|
+
const percent = Number(match[1]);
|
|
311
|
+
if (!Number.isFinite(percent))
|
|
312
|
+
continue;
|
|
313
|
+
const label = cleanSleeveLabel(match[2] ?? "");
|
|
314
|
+
if (!label)
|
|
315
|
+
continue;
|
|
316
|
+
matches.push({
|
|
317
|
+
label,
|
|
318
|
+
normalizedSleeve: normalizePortfolioSleeve(label),
|
|
319
|
+
percent: roundPercent(percent),
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
return matches;
|
|
323
|
+
}
|
|
324
|
+
function cleanSleeveLabel(label) {
|
|
325
|
+
return label
|
|
326
|
+
.replace(/^(?:and|plus|with)\s+/i, "")
|
|
327
|
+
.replace(/\b(?:should|can|could|would|do|does|rebalance|diversify|target|bands?).*$/i, "")
|
|
328
|
+
.trim();
|
|
329
|
+
}
|
|
330
|
+
function normalizePortfolioSleeve(label) {
|
|
331
|
+
const lower = label.toLowerCase();
|
|
332
|
+
if (/\b(?:s&p\s*500|sp\s*500|index|voo|spy|ivv)\b/.test(lower))
|
|
333
|
+
return "broad_us_index";
|
|
334
|
+
if (/\b(?:tech|technology|software|semis?|semiconductors?)\b/.test(lower))
|
|
335
|
+
return "technology_sector";
|
|
336
|
+
if (/\b(?:bond|bonds|fixed\s+income|treasur(?:y|ies))\b/.test(lower))
|
|
337
|
+
return "bonds";
|
|
338
|
+
if (/\b(?:cash|savings?|money\s*market|t[-\s]?bills?)\b/.test(lower))
|
|
339
|
+
return "cash";
|
|
340
|
+
if (/\b(?:international|ex[-\s]?us|foreign|global)\b/.test(lower))
|
|
341
|
+
return "international_equity";
|
|
342
|
+
if (/\b(?:stock|stocks|equity|equities)\b/.test(lower))
|
|
343
|
+
return "broad_equity";
|
|
344
|
+
return lower
|
|
345
|
+
.replace(/[^a-z0-9]+/g, "_")
|
|
346
|
+
.replace(/^_+|_+$/g, "")
|
|
347
|
+
.slice(0, 48) || "unknown_sleeve";
|
|
348
|
+
}
|
|
349
|
+
function roundPercent(value) {
|
|
350
|
+
return Math.round(value * 100) / 100;
|
|
351
|
+
}
|
|
352
|
+
function temporalReferencesFor(text) {
|
|
353
|
+
const lower = text.toLowerCase();
|
|
354
|
+
const refs = [];
|
|
355
|
+
if (/\btoday\b/.test(lower))
|
|
356
|
+
refs.push("today");
|
|
357
|
+
if (/\bright now\b/.test(lower))
|
|
358
|
+
refs.push("right_now");
|
|
359
|
+
if (/\bthis morning\b/.test(lower))
|
|
360
|
+
refs.push("this_morning");
|
|
361
|
+
if (/\bafter close\b|\bafter the close\b/.test(lower))
|
|
362
|
+
refs.push("after_close");
|
|
363
|
+
if (/\bmarket(?: is|'s)? closed\b|\bmarket-closed\b/.test(lower))
|
|
364
|
+
refs.push("market_closed");
|
|
365
|
+
if (/\bweekend\b/.test(lower))
|
|
366
|
+
refs.push("weekend");
|
|
367
|
+
if (/\bholiday\b/.test(lower))
|
|
368
|
+
refs.push("holiday");
|
|
369
|
+
return refs;
|
|
370
|
+
}
|
|
371
|
+
function classifyMarketStatus(local, isWeekend, isMarketHoliday, temporalReferences) {
|
|
372
|
+
if (isWeekend)
|
|
373
|
+
return "closed_weekend";
|
|
374
|
+
if (isMarketHoliday)
|
|
375
|
+
return "closed_holiday";
|
|
376
|
+
if (local.minutesSinceMidnight < 9 * 60 + 30)
|
|
377
|
+
return "pre_market";
|
|
378
|
+
if (local.minutesSinceMidnight < 16 * 60)
|
|
379
|
+
return "open";
|
|
380
|
+
if (temporalReferences.includes("after_close"))
|
|
381
|
+
return "after_close";
|
|
382
|
+
return "closed_after_hours";
|
|
383
|
+
}
|
|
384
|
+
function quoteAsOfCaveat(marketStatus) {
|
|
385
|
+
if (marketStatus === "open")
|
|
386
|
+
return "Quote evidence may be intraday or delayed depending on provider.";
|
|
387
|
+
if (marketStatus === "pre_market")
|
|
388
|
+
return "Quote evidence may reflect the previous regular session until premarket data is fetched.";
|
|
389
|
+
return "Quote evidence should distinguish the current calendar date from the most recent trading session.";
|
|
390
|
+
}
|
|
391
|
+
function localDateTimeParts(date, timezone) {
|
|
392
|
+
const formatter = new Intl.DateTimeFormat("en-US", {
|
|
393
|
+
timeZone: timezone,
|
|
394
|
+
year: "numeric",
|
|
395
|
+
month: "2-digit",
|
|
396
|
+
day: "2-digit",
|
|
397
|
+
hour: "2-digit",
|
|
398
|
+
minute: "2-digit",
|
|
399
|
+
hour12: false,
|
|
400
|
+
weekday: "short",
|
|
401
|
+
});
|
|
402
|
+
const parts = formatter.formatToParts(date).reduce((acc, part) => {
|
|
403
|
+
acc[part.type] = part.value;
|
|
404
|
+
return acc;
|
|
405
|
+
}, {});
|
|
406
|
+
const hour = Number(parts.hour);
|
|
407
|
+
const minute = Number(parts.minute);
|
|
408
|
+
return {
|
|
409
|
+
date: `${parts.year}-${parts.month}-${parts.day}`,
|
|
410
|
+
time: `${parts.hour}:${parts.minute}`,
|
|
411
|
+
weekday: parts.weekday ?? "",
|
|
412
|
+
minutesSinceMidnight: hour * 60 + minute,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
function lastTradingDay(localDate) {
|
|
416
|
+
let cursor = dateFromKey(localDate);
|
|
417
|
+
do {
|
|
418
|
+
cursor = addDays(cursor, -1);
|
|
419
|
+
} while (isWeekendOrKnownHoliday(dateKey(cursor)));
|
|
420
|
+
return dateKey(cursor);
|
|
421
|
+
}
|
|
422
|
+
function isWeekendOrKnownHoliday(key) {
|
|
423
|
+
const date = dateFromKey(key);
|
|
424
|
+
const day = date.getUTCDay();
|
|
425
|
+
return day === 0 || day === 6 || KNOWN_US_MARKET_HOLIDAYS[key] !== undefined;
|
|
426
|
+
}
|
|
427
|
+
function dateFromKey(key) {
|
|
428
|
+
const [year, month, day] = key.split("-").map(Number);
|
|
429
|
+
return new Date(Date.UTC(year, month - 1, day));
|
|
430
|
+
}
|
|
431
|
+
function addDays(date, days) {
|
|
432
|
+
const next = new Date(date);
|
|
433
|
+
next.setUTCDate(next.getUTCDate() + days);
|
|
434
|
+
return next;
|
|
435
|
+
}
|
|
436
|
+
function dateKey(date) {
|
|
437
|
+
const year = date.getUTCFullYear();
|
|
438
|
+
const month = String(date.getUTCMonth() + 1).padStart(2, "0");
|
|
439
|
+
const day = String(date.getUTCDate()).padStart(2, "0");
|
|
440
|
+
return `${year}-${month}-${day}`;
|
|
441
|
+
}
|
|
442
|
+
function isRecord(value) {
|
|
443
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=planning-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning-evidence.js","sourceRoot":"","sources":["../../src/runtime/planning-evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,10 @@ type ReadonlySessionManager = ExtensionContext["sessionManager"];
|
|
|
10
10
|
import { WorkflowRunner } from "./workflow-runner.js";
|
|
11
11
|
import { type FallbackContext } from "../prompts/context-builder.js";
|
|
12
12
|
import type { WorkflowDefinition } from "./prompt-step.js";
|
|
13
|
+
import type { ResolvedTurnContext } from "../routing/turn-context.js";
|
|
14
|
+
import type { RouterRouteKind } from "../routing/router-types.js";
|
|
15
|
+
import type { MemoryEntry } from "../memory/types.js";
|
|
16
|
+
import type { FilteredMemoryEntry } from "../memory/manager.js";
|
|
13
17
|
type QueueContext = ExtensionCommandContext | {
|
|
14
18
|
isIdle(): boolean;
|
|
15
19
|
hasPendingMessages?(): boolean;
|
|
@@ -41,7 +45,7 @@ export declare class SessionCoordinator {
|
|
|
41
45
|
/** Extract and persist user preferences from natural language. */
|
|
42
46
|
extractAndStorePreferences(text: string): void;
|
|
43
47
|
/** Record a workflow run in storage. */
|
|
44
|
-
recordWorkflowRun(workflowType: string, entities: object, resolved: object, defaultsUsed: unknown[], turnType?:
|
|
48
|
+
recordWorkflowRun(workflowType: string, entities: object, resolved: object, defaultsUsed: unknown[], turnType?: string): void;
|
|
45
49
|
/**
|
|
46
50
|
* Extract the last `max` user/assistant turns from the session branch as
|
|
47
51
|
* `{role, text}` pairs, oldest→newest. Walks `sessionManager.getBranch()`
|
|
@@ -86,21 +90,35 @@ export declare class SessionCoordinator {
|
|
|
86
90
|
text: string;
|
|
87
91
|
}>;
|
|
88
92
|
};
|
|
93
|
+
retrieveMemoryForRoute(routeKind: RouterRouteKind, workflowType?: string, overriddenSlots?: string[]): {
|
|
94
|
+
entries: MemoryEntry[];
|
|
95
|
+
filtered: FilteredMemoryEntry[];
|
|
96
|
+
};
|
|
89
97
|
/** Build system prompt using composable sections. */
|
|
90
|
-
buildSystemPrompt(basePrompt: string, workflowType?: string, fallbackContext?: FallbackContext): string;
|
|
98
|
+
buildSystemPrompt(basePrompt: string, workflowType?: string, fallbackContext?: FallbackContext, resolvedTurnContext?: ResolvedTurnContext): string;
|
|
91
99
|
/**
|
|
92
100
|
* Stash a pending fallback context so the very next `before_agent_start`
|
|
93
101
|
* hook can slot it into the system prompt. Cleared after consumption so
|
|
94
102
|
* subsequent turns do not inherit stale fallback directives.
|
|
95
103
|
*/
|
|
96
104
|
private pendingFallbackContext;
|
|
105
|
+
private pendingResolvedTurnContext;
|
|
97
106
|
setPendingFallbackContext(ctx: FallbackContext | null): void;
|
|
107
|
+
setPendingResolvedTurnContext(ctx: ResolvedTurnContext | null): void;
|
|
98
108
|
consumePendingFallbackContext(): FallbackContext | null;
|
|
109
|
+
consumePendingResolvedTurnContext(): ResolvedTurnContext | null;
|
|
99
110
|
/**
|
|
100
111
|
* Execute a workflow definition through the WorkflowRunner,
|
|
101
112
|
* sending prompts via Pi with settlement-based sequencing.
|
|
102
113
|
*/
|
|
103
114
|
executeWorkflow(pi: ExtensionAPI, definition: WorkflowDefinition, ctx: QueueContext): void;
|
|
115
|
+
/**
|
|
116
|
+
* Start workflow tracking for an input handler that will return a Pi
|
|
117
|
+
* transform result. The current prompt becomes the first workflow prompt;
|
|
118
|
+
* only later steps are sent through Pi.
|
|
119
|
+
*/
|
|
120
|
+
transformWorkflowInput(pi: ExtensionAPI, definition: WorkflowDefinition, ctx: QueueContext): string | undefined;
|
|
121
|
+
private startWorkflowRun;
|
|
104
122
|
/** Cancel any active workflow. */
|
|
105
123
|
cancelActiveWorkflow(): void;
|
|
106
124
|
}
|
|
@@ -33,7 +33,7 @@ function isReadyForNextPrompt(ctx) {
|
|
|
33
33
|
function sleep(ms) {
|
|
34
34
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
35
35
|
}
|
|
36
|
-
async function waitForPromptSettlement(ctx, isCurrentRun) {
|
|
36
|
+
async function waitForPromptSettlement(ctx, isCurrentRun, options = {}) {
|
|
37
37
|
let sawBusyOrPending = !isReadyForNextPrompt(ctx);
|
|
38
38
|
const startedAt = Date.now();
|
|
39
39
|
while (isCurrentRun()) {
|
|
@@ -44,7 +44,10 @@ async function waitForPromptSettlement(ctx, isCurrentRun) {
|
|
|
44
44
|
if (sawBusyOrPending && ready) {
|
|
45
45
|
return true;
|
|
46
46
|
}
|
|
47
|
-
if (!
|
|
47
|
+
if (!options.requireActivity &&
|
|
48
|
+
!sawBusyOrPending &&
|
|
49
|
+
ready &&
|
|
50
|
+
Date.now() - startedAt >= IMMEDIATE_IDLE_GRACE_MS) {
|
|
48
51
|
return true;
|
|
49
52
|
}
|
|
50
53
|
await sleep(PROMPT_SETTLE_POLL_MS);
|
|
@@ -202,21 +205,27 @@ export class SessionCoordinator {
|
|
|
202
205
|
}));
|
|
203
206
|
return { profileSnapshot, recentWorkflowRuns: runs, priorTurns };
|
|
204
207
|
}
|
|
208
|
+
retrieveMemoryForRoute(routeKind, workflowType, overriddenSlots) {
|
|
209
|
+
if (!this.memoryManager)
|
|
210
|
+
return { entries: [], filtered: [] };
|
|
211
|
+
return this.memoryManager.retrieveDetailed(workflowType ?? routeKind, overriddenSlots);
|
|
212
|
+
}
|
|
205
213
|
/** Build system prompt using composable sections. */
|
|
206
|
-
buildSystemPrompt(basePrompt, workflowType, fallbackContext) {
|
|
214
|
+
buildSystemPrompt(basePrompt, workflowType, fallbackContext, resolvedTurnContext) {
|
|
207
215
|
const builder = new PromptContextBuilder();
|
|
208
216
|
const addonTools = getAddonToolDescriptions();
|
|
209
217
|
const addonDescriptions = addonTools.length > 0
|
|
210
218
|
? addonTools.map((t) => `${t.name}: ${t.description}`)
|
|
211
219
|
: undefined;
|
|
212
220
|
const memoryContext = this.memoryManager
|
|
213
|
-
? this.memoryManager.buildContext(workflowType ?? "unclassified")
|
|
221
|
+
? this.memoryManager.buildContext(resolvedTurnContext?.workflow ?? workflowType ?? resolvedTurnContext?.routeKind ?? "unclassified")
|
|
214
222
|
: undefined;
|
|
215
223
|
builder.populateFromOptions({
|
|
216
224
|
workflowType,
|
|
217
225
|
memoryContext: memoryContext || undefined,
|
|
218
226
|
addonToolDescriptions: addonDescriptions,
|
|
219
227
|
fallbackContext,
|
|
228
|
+
resolvedTurnContext,
|
|
220
229
|
});
|
|
221
230
|
const toolDefaults = formatToolDefaultsForPrompt();
|
|
222
231
|
const defaultsSection = toolDefaults.length > 0
|
|
@@ -230,32 +239,56 @@ export class SessionCoordinator {
|
|
|
230
239
|
* subsequent turns do not inherit stale fallback directives.
|
|
231
240
|
*/
|
|
232
241
|
pendingFallbackContext = null;
|
|
242
|
+
pendingResolvedTurnContext = null;
|
|
233
243
|
setPendingFallbackContext(ctx) {
|
|
234
244
|
this.pendingFallbackContext = ctx;
|
|
235
245
|
}
|
|
246
|
+
setPendingResolvedTurnContext(ctx) {
|
|
247
|
+
this.pendingResolvedTurnContext = ctx;
|
|
248
|
+
}
|
|
236
249
|
consumePendingFallbackContext() {
|
|
237
250
|
const ctx = this.pendingFallbackContext;
|
|
238
251
|
this.pendingFallbackContext = null;
|
|
239
252
|
return ctx;
|
|
240
253
|
}
|
|
254
|
+
consumePendingResolvedTurnContext() {
|
|
255
|
+
const ctx = this.pendingResolvedTurnContext;
|
|
256
|
+
this.pendingResolvedTurnContext = null;
|
|
257
|
+
return ctx;
|
|
258
|
+
}
|
|
241
259
|
/**
|
|
242
260
|
* Execute a workflow definition through the WorkflowRunner,
|
|
243
261
|
* sending prompts via Pi with settlement-based sequencing.
|
|
244
262
|
*/
|
|
245
263
|
executeWorkflow(pi, definition, ctx) {
|
|
264
|
+
this.startWorkflowRun(pi, definition, ctx, "send");
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Start workflow tracking for an input handler that will return a Pi
|
|
268
|
+
* transform result. The current prompt becomes the first workflow prompt;
|
|
269
|
+
* only later steps are sent through Pi.
|
|
270
|
+
*/
|
|
271
|
+
transformWorkflowInput(pi, definition, ctx) {
|
|
272
|
+
if (definition.steps.length === 0)
|
|
273
|
+
return undefined;
|
|
274
|
+
this.startWorkflowRun(pi, definition, ctx, "transform");
|
|
275
|
+
return definition.steps[0].prompt;
|
|
276
|
+
}
|
|
277
|
+
startWorkflowRun(pi, definition, ctx, firstPromptMode) {
|
|
246
278
|
if (definition.steps.length === 0)
|
|
247
279
|
return;
|
|
248
280
|
const runner = this.runner;
|
|
249
281
|
const runRef = { active: true };
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
282
|
+
const [firstStep] = definition.steps;
|
|
283
|
+
if (firstPromptMode === "send") {
|
|
284
|
+
const startedBusy = !isReadyForNextPrompt(ctx);
|
|
285
|
+
if (startedBusy) {
|
|
286
|
+
pi.sendUserMessage(firstStep.prompt, { deliverAs: "followUp" });
|
|
287
|
+
ctx.ui?.notify?.("Analysis queued as follow-up.", "info");
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
pi.sendUserMessage(firstStep.prompt);
|
|
291
|
+
}
|
|
259
292
|
}
|
|
260
293
|
// Make the run's ProviderTracker accessible to tools during execution
|
|
261
294
|
setRunContext({ providerTracker: this.providerTracker });
|
|
@@ -272,7 +305,7 @@ export class SessionCoordinator {
|
|
|
272
305
|
}
|
|
273
306
|
else {
|
|
274
307
|
// For the first step, just wait for it to settle
|
|
275
|
-
const settled = await waitForPromptSettlement(ctx, () => runRef.active);
|
|
308
|
+
const settled = await waitForPromptSettlement(ctx, () => runRef.active, { requireActivity: firstPromptMode === "transform" });
|
|
276
309
|
if (!settled || !runRef.active) {
|
|
277
310
|
throw new Error("run_cancelled");
|
|
278
311
|
}
|