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.
Files changed (251) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +106 -14
  3. package/dist/cli.js +2 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +19 -3
  6. package/dist/config.js +61 -2
  7. package/dist/config.js.map +1 -1
  8. package/dist/infra/browser.d.ts +1 -3
  9. package/dist/infra/browser.js +1 -1
  10. package/dist/infra/browser.js.map +1 -1
  11. package/dist/infra/rate-limiter.d.ts +4 -0
  12. package/dist/infra/rate-limiter.js +5 -1
  13. package/dist/infra/rate-limiter.js.map +1 -1
  14. package/dist/memory/manager.d.ts +9 -0
  15. package/dist/memory/manager.js +28 -11
  16. package/dist/memory/manager.js.map +1 -1
  17. package/dist/memory/storage.d.ts +3 -2
  18. package/dist/memory/storage.js.map +1 -1
  19. package/dist/memory/types.js +4 -0
  20. package/dist/memory/types.js.map +1 -1
  21. package/dist/pi/opencandle-extension.js +230 -36
  22. package/dist/pi/opencandle-extension.js.map +1 -1
  23. package/dist/pi/setup.js +10 -0
  24. package/dist/pi/setup.js.map +1 -1
  25. package/dist/prompts/context-builder.d.ts +18 -3
  26. package/dist/prompts/context-builder.js +102 -16
  27. package/dist/prompts/context-builder.js.map +1 -1
  28. package/dist/prompts/disclaimer.js +1 -1
  29. package/dist/prompts/disclaimer.js.map +1 -1
  30. package/dist/prompts/policy-cards.d.ts +13 -0
  31. package/dist/prompts/policy-cards.js +197 -0
  32. package/dist/prompts/policy-cards.js.map +1 -0
  33. package/dist/prompts/sections.js +3 -3
  34. package/dist/prompts/sections.js.map +1 -1
  35. package/dist/prompts/workflow-prompts.js +170 -18
  36. package/dist/prompts/workflow-prompts.js.map +1 -1
  37. package/dist/providers/alpha-vantage.js +23 -1
  38. package/dist/providers/alpha-vantage.js.map +1 -1
  39. package/dist/providers/sec-edgar.d.ts +8 -1
  40. package/dist/providers/sec-edgar.js +172 -5
  41. package/dist/providers/sec-edgar.js.map +1 -1
  42. package/dist/providers/yahoo-finance.d.ts +2 -0
  43. package/dist/providers/yahoo-finance.js +134 -3
  44. package/dist/providers/yahoo-finance.js.map +1 -1
  45. package/dist/routing/classify-intent.d.ts +3 -0
  46. package/dist/routing/classify-intent.js +82 -3
  47. package/dist/routing/classify-intent.js.map +1 -1
  48. package/dist/routing/defaults.js +3 -3
  49. package/dist/routing/defaults.js.map +1 -1
  50. package/dist/routing/entity-extractor.d.ts +1 -0
  51. package/dist/routing/entity-extractor.js +158 -12
  52. package/dist/routing/entity-extractor.js.map +1 -1
  53. package/dist/routing/index.d.ts +7 -1
  54. package/dist/routing/index.js +4 -0
  55. package/dist/routing/index.js.map +1 -1
  56. package/dist/routing/legacy-rule-router.d.ts +9 -0
  57. package/dist/routing/legacy-rule-router.js +12 -0
  58. package/dist/routing/legacy-rule-router.js.map +1 -0
  59. package/dist/routing/planning.d.ts +54 -0
  60. package/dist/routing/planning.js +531 -0
  61. package/dist/routing/planning.js.map +1 -0
  62. package/dist/routing/route-manifest.d.ts +35 -0
  63. package/dist/routing/route-manifest.js +221 -0
  64. package/dist/routing/route-manifest.js.map +1 -0
  65. package/dist/routing/router-prompt.js +45 -42
  66. package/dist/routing/router-prompt.js.map +1 -1
  67. package/dist/routing/router-types.d.ts +9 -0
  68. package/dist/routing/router.d.ts +1 -0
  69. package/dist/routing/router.js +456 -12
  70. package/dist/routing/router.js.map +1 -1
  71. package/dist/routing/slot-resolver.js +46 -6
  72. package/dist/routing/slot-resolver.js.map +1 -1
  73. package/dist/routing/turn-context.d.ts +44 -0
  74. package/dist/routing/turn-context.js +45 -0
  75. package/dist/routing/turn-context.js.map +1 -0
  76. package/dist/routing/types.d.ts +13 -1
  77. package/dist/runtime/answer-contracts.d.ts +82 -0
  78. package/dist/runtime/answer-contracts.js +414 -0
  79. package/dist/runtime/answer-contracts.js.map +1 -0
  80. package/dist/runtime/artifact-contracts.d.ts +14 -0
  81. package/dist/runtime/artifact-contracts.js +57 -0
  82. package/dist/runtime/artifact-contracts.js.map +1 -0
  83. package/dist/runtime/planning-evidence.d.ts +99 -0
  84. package/dist/runtime/planning-evidence.js +445 -0
  85. package/dist/runtime/planning-evidence.js.map +1 -0
  86. package/dist/runtime/session-coordinator.d.ts +20 -2
  87. package/dist/runtime/session-coordinator.js +47 -14
  88. package/dist/runtime/session-coordinator.js.map +1 -1
  89. package/dist/system-prompt.js +4 -1
  90. package/dist/system-prompt.js.map +1 -1
  91. package/dist/tools/fundamentals/company-overview.js +1 -1
  92. package/dist/tools/fundamentals/company-overview.js.map +1 -1
  93. package/dist/tools/fundamentals/comps.js +1 -1
  94. package/dist/tools/fundamentals/comps.js.map +1 -1
  95. package/dist/tools/fundamentals/dcf.js +1 -1
  96. package/dist/tools/fundamentals/dcf.js.map +1 -1
  97. package/dist/tools/fundamentals/earnings.js +1 -1
  98. package/dist/tools/fundamentals/earnings.js.map +1 -1
  99. package/dist/tools/fundamentals/financials.js +1 -1
  100. package/dist/tools/fundamentals/financials.js.map +1 -1
  101. package/dist/tools/fundamentals/sec-filings.d.ts +1 -0
  102. package/dist/tools/fundamentals/sec-filings.js +19 -2
  103. package/dist/tools/fundamentals/sec-filings.js.map +1 -1
  104. package/dist/tools/index.d.ts +1 -0
  105. package/dist/tools/index.js +3 -0
  106. package/dist/tools/index.js.map +1 -1
  107. package/dist/tools/macro/fear-greed.js +1 -1
  108. package/dist/tools/macro/fear-greed.js.map +1 -1
  109. package/dist/tools/macro/fred-data.js +29 -5
  110. package/dist/tools/macro/fred-data.js.map +1 -1
  111. package/dist/tools/market/crypto-history.js +18 -2
  112. package/dist/tools/market/crypto-history.js.map +1 -1
  113. package/dist/tools/market/crypto-price.js +1 -1
  114. package/dist/tools/market/crypto-price.js.map +1 -1
  115. package/dist/tools/market/search-ticker.js +1 -1
  116. package/dist/tools/market/search-ticker.js.map +1 -1
  117. package/dist/tools/market/stock-history.js +1 -1
  118. package/dist/tools/market/stock-history.js.map +1 -1
  119. package/dist/tools/market/stock-quote.js +1 -1
  120. package/dist/tools/market/stock-quote.js.map +1 -1
  121. package/dist/tools/options/greeks.js +0 -1
  122. package/dist/tools/options/greeks.js.map +1 -1
  123. package/dist/tools/options/option-chain.js +9 -4
  124. package/dist/tools/options/option-chain.js.map +1 -1
  125. package/dist/tools/portfolio/correlation.js +1 -1
  126. package/dist/tools/portfolio/correlation.js.map +1 -1
  127. package/dist/tools/portfolio/holdings-overlap.d.ts +8 -0
  128. package/dist/tools/portfolio/holdings-overlap.js +105 -0
  129. package/dist/tools/portfolio/holdings-overlap.js.map +1 -0
  130. package/dist/tools/portfolio/predictions.js +1 -1
  131. package/dist/tools/portfolio/predictions.js.map +1 -1
  132. package/dist/tools/portfolio/risk-analysis.js +1 -1
  133. package/dist/tools/portfolio/risk-analysis.js.map +1 -1
  134. package/dist/tools/portfolio/tracker.js +1 -1
  135. package/dist/tools/portfolio/tracker.js.map +1 -1
  136. package/dist/tools/portfolio/watchlist.js +12 -4
  137. package/dist/tools/portfolio/watchlist.js.map +1 -1
  138. package/dist/tools/sentiment/reddit-sentiment.js +1 -1
  139. package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
  140. package/dist/tools/sentiment/sentiment-summary.js +57 -2
  141. package/dist/tools/sentiment/sentiment-summary.js.map +1 -1
  142. package/dist/tools/sentiment/twitter-sentiment.js +1 -1
  143. package/dist/tools/sentiment/twitter-sentiment.js.map +1 -1
  144. package/dist/tools/sentiment/web-search.js +32 -3
  145. package/dist/tools/sentiment/web-search.js.map +1 -1
  146. package/dist/tools/sentiment/web-sentiment.js +1 -1
  147. package/dist/tools/sentiment/web-sentiment.js.map +1 -1
  148. package/dist/tools/technical/backtest.d.ts +2 -2
  149. package/dist/tools/technical/backtest.js +41 -27
  150. package/dist/tools/technical/backtest.js.map +1 -1
  151. package/dist/tools/technical/indicators.js +1 -3
  152. package/dist/tools/technical/indicators.js.map +1 -1
  153. package/dist/types/options.d.ts +10 -0
  154. package/dist/types/portfolio.d.ts +27 -0
  155. package/dist/workflows/compare-assets.js +38 -2
  156. package/dist/workflows/compare-assets.js.map +1 -1
  157. package/dist/workflows/options-screener.js +88 -7
  158. package/dist/workflows/options-screener.js.map +1 -1
  159. package/dist/workflows/portfolio-builder.js +7 -3
  160. package/dist/workflows/portfolio-builder.js.map +1 -1
  161. package/gui/server/ask-user-bridge.ts +82 -0
  162. package/gui/server/gui-session-manager.ts +5 -0
  163. package/gui/server/projector.ts +47 -5
  164. package/gui/server/prompt-observation.ts +61 -0
  165. package/gui/server/server.ts +119 -8
  166. package/gui/server/session-entry-wait.ts +81 -0
  167. package/gui/web/dist/assets/{CatalogOverlay-D1ImSJTe.js → CatalogOverlay-Bmp6Knu7.js} +1 -1
  168. package/gui/web/dist/assets/index-Bxt9QpLX.css +1 -0
  169. package/gui/web/dist/assets/index-CZ9DHZYy.js +67 -0
  170. package/gui/web/dist/index.html +2 -2
  171. package/package.json +18 -12
  172. package/src/cli.ts +2 -1
  173. package/src/config.ts +89 -5
  174. package/src/infra/browser.ts +1 -1
  175. package/src/infra/rate-limiter.ts +10 -1
  176. package/src/memory/manager.ts +43 -10
  177. package/src/memory/storage.ts +3 -2
  178. package/src/memory/types.ts +4 -0
  179. package/src/pi/opencandle-extension.ts +273 -42
  180. package/src/pi/setup.ts +10 -0
  181. package/src/prompts/context-builder.ts +128 -17
  182. package/src/prompts/disclaimer.ts +1 -1
  183. package/src/prompts/policy-cards.ts +220 -0
  184. package/src/prompts/sections.ts +3 -3
  185. package/src/prompts/workflow-prompts.ts +172 -18
  186. package/src/providers/alpha-vantage.ts +24 -1
  187. package/src/providers/sec-edgar.ts +220 -4
  188. package/src/providers/web-search.ts +1 -1
  189. package/src/providers/yahoo-finance.ts +171 -4
  190. package/src/routing/classify-intent.ts +94 -3
  191. package/src/routing/defaults.ts +3 -3
  192. package/src/routing/entity-extractor.ts +164 -13
  193. package/src/routing/index.ts +44 -0
  194. package/src/routing/legacy-rule-router.ts +13 -0
  195. package/src/routing/planning.ts +732 -0
  196. package/src/routing/route-manifest.ts +287 -0
  197. package/src/routing/router-prompt.ts +50 -46
  198. package/src/routing/router-types.ts +21 -0
  199. package/src/routing/router.ts +511 -12
  200. package/src/routing/slot-resolver.ts +44 -6
  201. package/src/routing/turn-context.ts +111 -0
  202. package/src/routing/types.ts +13 -1
  203. package/src/runtime/answer-contracts.ts +633 -0
  204. package/src/runtime/artifact-contracts.ts +76 -0
  205. package/src/runtime/planning-evidence.ts +591 -0
  206. package/src/runtime/session-coordinator.ts +78 -12
  207. package/src/system-prompt.ts +4 -1
  208. package/src/tools/fundamentals/company-overview.ts +1 -1
  209. package/src/tools/fundamentals/comps.ts +1 -1
  210. package/src/tools/fundamentals/dcf.ts +1 -1
  211. package/src/tools/fundamentals/earnings.ts +1 -1
  212. package/src/tools/fundamentals/financials.ts +1 -1
  213. package/src/tools/fundamentals/sec-filings.ts +25 -2
  214. package/src/tools/index.ts +3 -0
  215. package/src/tools/macro/fear-greed.ts +1 -1
  216. package/src/tools/macro/fred-data.ts +31 -5
  217. package/src/tools/market/crypto-history.ts +18 -2
  218. package/src/tools/market/crypto-price.ts +1 -1
  219. package/src/tools/market/search-ticker.ts +1 -1
  220. package/src/tools/market/stock-history.ts +1 -1
  221. package/src/tools/market/stock-quote.ts +1 -1
  222. package/src/tools/options/greeks.ts +0 -1
  223. package/src/tools/options/option-chain.ts +9 -4
  224. package/src/tools/portfolio/correlation.ts +1 -1
  225. package/src/tools/portfolio/holdings-overlap.ts +123 -0
  226. package/src/tools/portfolio/predictions.ts +1 -1
  227. package/src/tools/portfolio/risk-analysis.ts +1 -1
  228. package/src/tools/portfolio/tracker.ts +1 -1
  229. package/src/tools/portfolio/watchlist.ts +10 -4
  230. package/src/tools/sentiment/reddit-sentiment.ts +1 -1
  231. package/src/tools/sentiment/sentiment-summary.ts +62 -2
  232. package/src/tools/sentiment/twitter-sentiment.ts +1 -1
  233. package/src/tools/sentiment/web-search.ts +36 -3
  234. package/src/tools/sentiment/web-sentiment.ts +1 -1
  235. package/src/tools/technical/backtest.ts +50 -29
  236. package/src/tools/technical/indicators.ts +1 -3
  237. package/src/types/options.ts +17 -0
  238. package/src/types/portfolio.ts +32 -0
  239. package/src/workflows/compare-assets.ts +38 -2
  240. package/src/workflows/options-screener.ts +85 -7
  241. package/src/workflows/portfolio-builder.ts +7 -3
  242. package/dist/runtime/index.d.ts +0 -16
  243. package/dist/runtime/index.js +0 -10
  244. package/dist/runtime/index.js.map +0 -1
  245. package/dist/runtime/provider-ids.d.ts +0 -14
  246. package/dist/runtime/provider-ids.js +0 -14
  247. package/dist/runtime/provider-ids.js.map +0 -1
  248. package/gui/web/dist/assets/index-DBrWq43L.css +0 -1
  249. package/gui/web/dist/assets/index-RflHaj0y.js +0 -67
  250. package/src/runtime/index.ts +0 -55
  251. 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?: "workflow" | "fallback"): void;
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 (!sawBusyOrPending && ready && Date.now() - startedAt >= IMMEDIATE_IDLE_GRACE_MS) {
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
- // Send the first prompt immediately
251
- const [firstStep, ...restSteps] = definition.steps;
252
- const startedBusy = !isReadyForNextPrompt(ctx);
253
- if (startedBusy) {
254
- pi.sendUserMessage(firstStep.prompt, { deliverAs: "followUp" });
255
- ctx.ui?.notify?.("Analysis queued as follow-up.", "info");
256
- }
257
- else {
258
- pi.sendUserMessage(firstStep.prompt);
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
  }