opencandle 0.1.1 → 0.3.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 (278) hide show
  1. package/README.md +111 -79
  2. package/dist/analysts/contracts.d.ts +31 -0
  3. package/dist/analysts/contracts.js +158 -0
  4. package/dist/analysts/contracts.js.map +1 -0
  5. package/dist/analysts/orchestrator.d.ts +11 -2
  6. package/dist/analysts/orchestrator.js +156 -9
  7. package/dist/analysts/orchestrator.js.map +1 -1
  8. package/dist/cli.js +26 -10
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config.d.ts +29 -5
  11. package/dist/config.js +18 -8
  12. package/dist/config.js.map +1 -1
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/infra/cache.d.ts +34 -0
  17. package/dist/infra/cache.js +44 -3
  18. package/dist/infra/cache.js.map +1 -1
  19. package/dist/infra/index.d.ts +1 -1
  20. package/dist/infra/index.js +1 -1
  21. package/dist/infra/index.js.map +1 -1
  22. package/dist/infra/opencandle-paths.d.ts +1 -0
  23. package/dist/infra/opencandle-paths.js +3 -0
  24. package/dist/infra/opencandle-paths.js.map +1 -1
  25. package/dist/infra/rate-limiter.js +7 -0
  26. package/dist/infra/rate-limiter.js.map +1 -1
  27. package/dist/memory/index.d.ts +3 -0
  28. package/dist/memory/index.js +2 -0
  29. package/dist/memory/index.js.map +1 -1
  30. package/dist/memory/manager.d.ts +19 -0
  31. package/dist/memory/manager.js +132 -0
  32. package/dist/memory/manager.js.map +1 -0
  33. package/dist/memory/sqlite.js +12 -1
  34. package/dist/memory/sqlite.js.map +1 -1
  35. package/dist/memory/types.d.ts +21 -0
  36. package/dist/memory/types.js +47 -0
  37. package/dist/memory/types.js.map +1 -0
  38. package/dist/onboarding/connect.d.ts +23 -0
  39. package/dist/onboarding/connect.js +107 -0
  40. package/dist/onboarding/connect.js.map +1 -0
  41. package/dist/onboarding/credential-interceptor.d.ts +44 -0
  42. package/dist/onboarding/credential-interceptor.js +72 -0
  43. package/dist/onboarding/credential-interceptor.js.map +1 -0
  44. package/dist/onboarding/degradation-accumulator.d.ts +21 -0
  45. package/dist/onboarding/degradation-accumulator.js +55 -0
  46. package/dist/onboarding/degradation-accumulator.js.map +1 -0
  47. package/dist/onboarding/prompt-user.d.ts +23 -0
  48. package/dist/onboarding/prompt-user.js +61 -0
  49. package/dist/onboarding/prompt-user.js.map +1 -0
  50. package/dist/onboarding/providers.d.ts +109 -0
  51. package/dist/onboarding/providers.js +236 -0
  52. package/dist/onboarding/providers.js.map +1 -0
  53. package/dist/onboarding/state.d.ts +31 -2
  54. package/dist/onboarding/state.js +141 -13
  55. package/dist/onboarding/state.js.map +1 -1
  56. package/dist/onboarding/tool-helpers.d.ts +34 -0
  57. package/dist/onboarding/tool-helpers.js +80 -0
  58. package/dist/onboarding/tool-helpers.js.map +1 -0
  59. package/dist/onboarding/tool-tags.d.ts +37 -0
  60. package/dist/onboarding/tool-tags.js +149 -0
  61. package/dist/onboarding/tool-tags.js.map +1 -0
  62. package/dist/onboarding/validation.d.ts +19 -0
  63. package/dist/onboarding/validation.js +117 -0
  64. package/dist/onboarding/validation.js.map +1 -0
  65. package/dist/pi/opencandle-extension.d.ts +5 -1
  66. package/dist/pi/opencandle-extension.js +345 -143
  67. package/dist/pi/opencandle-extension.js.map +1 -1
  68. package/dist/pi/session.d.ts +2 -0
  69. package/dist/pi/session.js +1 -1
  70. package/dist/pi/session.js.map +1 -1
  71. package/dist/pi/setup.d.ts +0 -1
  72. package/dist/pi/setup.js +66 -119
  73. package/dist/pi/setup.js.map +1 -1
  74. package/dist/prompts/context-builder.d.ts +26 -0
  75. package/dist/prompts/context-builder.js +127 -0
  76. package/dist/prompts/context-builder.js.map +1 -0
  77. package/dist/prompts/sections.d.ts +13 -0
  78. package/dist/prompts/sections.js +35 -0
  79. package/dist/prompts/sections.js.map +1 -0
  80. package/dist/providers/alpha-vantage.d.ts +3 -0
  81. package/dist/providers/alpha-vantage.js +204 -77
  82. package/dist/providers/alpha-vantage.js.map +1 -1
  83. package/dist/providers/coingecko.js +53 -37
  84. package/dist/providers/coingecko.js.map +1 -1
  85. package/dist/providers/exa-search.d.ts +39 -0
  86. package/dist/providers/exa-search.js +276 -0
  87. package/dist/providers/exa-search.js.map +1 -0
  88. package/dist/providers/fear-greed.js +23 -15
  89. package/dist/providers/fear-greed.js.map +1 -1
  90. package/dist/providers/finnhub.d.ts +17 -0
  91. package/dist/providers/finnhub.js +94 -0
  92. package/dist/providers/finnhub.js.map +1 -0
  93. package/dist/providers/fred.js +48 -28
  94. package/dist/providers/fred.js.map +1 -1
  95. package/dist/providers/index.d.ts +2 -0
  96. package/dist/providers/index.js +1 -0
  97. package/dist/providers/index.js.map +1 -1
  98. package/dist/providers/provider-credential-error.d.ts +8 -0
  99. package/dist/providers/provider-credential-error.js +22 -0
  100. package/dist/providers/provider-credential-error.js.map +1 -0
  101. package/dist/providers/reddit.d.ts +8 -0
  102. package/dist/providers/reddit.js +78 -43
  103. package/dist/providers/reddit.js.map +1 -1
  104. package/dist/providers/twitter.d.ts +20 -0
  105. package/dist/providers/twitter.js +137 -0
  106. package/dist/providers/twitter.js.map +1 -0
  107. package/dist/providers/web-search.d.ts +17 -0
  108. package/dist/providers/web-search.js +224 -0
  109. package/dist/providers/web-search.js.map +1 -0
  110. package/dist/providers/with-fallback.d.ts +15 -0
  111. package/dist/providers/with-fallback.js +32 -0
  112. package/dist/providers/with-fallback.js.map +1 -0
  113. package/dist/providers/wrap-provider.d.ts +20 -0
  114. package/dist/providers/wrap-provider.js +58 -0
  115. package/dist/providers/wrap-provider.js.map +1 -0
  116. package/dist/providers/yahoo-finance.js +77 -57
  117. package/dist/providers/yahoo-finance.js.map +1 -1
  118. package/dist/routing/classify-intent.js +22 -0
  119. package/dist/routing/classify-intent.js.map +1 -1
  120. package/dist/runtime/evidence.d.ts +35 -0
  121. package/dist/runtime/evidence.js +29 -0
  122. package/dist/runtime/evidence.js.map +1 -0
  123. package/dist/runtime/index.d.ts +16 -0
  124. package/dist/runtime/index.js +10 -0
  125. package/dist/runtime/index.js.map +1 -0
  126. package/dist/runtime/prompt-step.d.ts +41 -0
  127. package/dist/runtime/prompt-step.js +42 -0
  128. package/dist/runtime/prompt-step.js.map +1 -0
  129. package/dist/runtime/provider-ids.d.ts +14 -0
  130. package/dist/runtime/provider-ids.js +14 -0
  131. package/dist/runtime/provider-ids.js.map +1 -0
  132. package/dist/runtime/provider-tracker.d.ts +20 -0
  133. package/dist/runtime/provider-tracker.js +36 -0
  134. package/dist/runtime/provider-tracker.js.map +1 -0
  135. package/dist/runtime/run-context.d.ts +11 -0
  136. package/dist/runtime/run-context.js +14 -0
  137. package/dist/runtime/run-context.js.map +1 -0
  138. package/dist/runtime/session-coordinator.d.ts +47 -0
  139. package/dist/runtime/session-coordinator.js +171 -0
  140. package/dist/runtime/session-coordinator.js.map +1 -0
  141. package/dist/runtime/validation.d.ts +44 -0
  142. package/dist/runtime/validation.js +157 -0
  143. package/dist/runtime/validation.js.map +1 -0
  144. package/dist/runtime/workflow-events.d.ts +21 -0
  145. package/dist/runtime/workflow-events.js +31 -0
  146. package/dist/runtime/workflow-events.js.map +1 -0
  147. package/dist/runtime/workflow-runner.d.ts +36 -0
  148. package/dist/runtime/workflow-runner.js +129 -0
  149. package/dist/runtime/workflow-runner.js.map +1 -0
  150. package/dist/runtime/workflow-types.d.ts +60 -0
  151. package/dist/runtime/workflow-types.js +32 -0
  152. package/dist/runtime/workflow-types.js.map +1 -0
  153. package/dist/sentiment/adapters/finnhub.d.ts +7 -0
  154. package/dist/sentiment/adapters/finnhub.js +39 -0
  155. package/dist/sentiment/adapters/finnhub.js.map +1 -0
  156. package/dist/sentiment/adapters/reddit.d.ts +11 -0
  157. package/dist/sentiment/adapters/reddit.js +54 -0
  158. package/dist/sentiment/adapters/reddit.js.map +1 -0
  159. package/dist/sentiment/adapters/twitter.d.ts +9 -0
  160. package/dist/sentiment/adapters/twitter.js +32 -0
  161. package/dist/sentiment/adapters/twitter.js.map +1 -0
  162. package/dist/sentiment/adapters/web.d.ts +9 -0
  163. package/dist/sentiment/adapters/web.js +40 -0
  164. package/dist/sentiment/adapters/web.js.map +1 -0
  165. package/dist/sentiment/index.d.ts +16 -0
  166. package/dist/sentiment/index.js +44 -0
  167. package/dist/sentiment/index.js.map +1 -0
  168. package/dist/sentiment/keywords.d.ts +2 -0
  169. package/dist/sentiment/keywords.js +9 -0
  170. package/dist/sentiment/keywords.js.map +1 -0
  171. package/dist/sentiment/pipeline.d.ts +9 -0
  172. package/dist/sentiment/pipeline.js +57 -0
  173. package/dist/sentiment/pipeline.js.map +1 -0
  174. package/dist/sentiment/scorer.d.ts +9 -0
  175. package/dist/sentiment/scorer.js +64 -0
  176. package/dist/sentiment/scorer.js.map +1 -0
  177. package/dist/sentiment/store.d.ts +24 -0
  178. package/dist/sentiment/store.js +177 -0
  179. package/dist/sentiment/store.js.map +1 -0
  180. package/dist/sentiment/trends.d.ts +13 -0
  181. package/dist/sentiment/trends.js +73 -0
  182. package/dist/sentiment/trends.js.map +1 -0
  183. package/dist/sentiment/types.d.ts +66 -0
  184. package/dist/sentiment/types.js +54 -0
  185. package/dist/sentiment/types.js.map +1 -0
  186. package/dist/system-prompt.js +60 -2
  187. package/dist/system-prompt.js.map +1 -1
  188. package/dist/tool-kit.d.ts +9 -5
  189. package/dist/tool-kit.js +29 -6
  190. package/dist/tool-kit.js.map +1 -1
  191. package/dist/tools/fundamentals/company-overview.d.ts +3 -1
  192. package/dist/tools/fundamentals/company-overview.js +28 -17
  193. package/dist/tools/fundamentals/company-overview.js.map +1 -1
  194. package/dist/tools/fundamentals/comps.js +47 -39
  195. package/dist/tools/fundamentals/comps.js.map +1 -1
  196. package/dist/tools/fundamentals/dcf.js +83 -65
  197. package/dist/tools/fundamentals/dcf.js.map +1 -1
  198. package/dist/tools/fundamentals/earnings.d.ts +3 -1
  199. package/dist/tools/fundamentals/earnings.js +26 -18
  200. package/dist/tools/fundamentals/earnings.js.map +1 -1
  201. package/dist/tools/fundamentals/financials.d.ts +3 -1
  202. package/dist/tools/fundamentals/financials.js +24 -16
  203. package/dist/tools/fundamentals/financials.js.map +1 -1
  204. package/dist/tools/fundamentals/sec-filings.js +9 -1
  205. package/dist/tools/fundamentals/sec-filings.js.map +1 -1
  206. package/dist/tools/index.js +10 -2
  207. package/dist/tools/index.js.map +1 -1
  208. package/dist/tools/interaction/ask-user.d.ts +3 -0
  209. package/dist/tools/interaction/ask-user.js +51 -0
  210. package/dist/tools/interaction/ask-user.js.map +1 -0
  211. package/dist/tools/interaction/twitter-login.d.ts +8 -0
  212. package/dist/tools/interaction/twitter-login.js +77 -0
  213. package/dist/tools/interaction/twitter-login.js.map +1 -0
  214. package/dist/tools/macro/fear-greed.js +9 -1
  215. package/dist/tools/macro/fear-greed.js.map +1 -1
  216. package/dist/tools/macro/fred-data.d.ts +3 -1
  217. package/dist/tools/macro/fred-data.js +27 -16
  218. package/dist/tools/macro/fred-data.js.map +1 -1
  219. package/dist/tools/market/crypto-history.js +9 -1
  220. package/dist/tools/market/crypto-history.js.map +1 -1
  221. package/dist/tools/market/crypto-price.js +9 -1
  222. package/dist/tools/market/crypto-price.js.map +1 -1
  223. package/dist/tools/market/stock-history.js +28 -1
  224. package/dist/tools/market/stock-history.js.map +1 -1
  225. package/dist/tools/market/stock-quote.js +29 -4
  226. package/dist/tools/market/stock-quote.js.map +1 -1
  227. package/dist/tools/options/option-chain.js +9 -1
  228. package/dist/tools/options/option-chain.js.map +1 -1
  229. package/dist/tools/portfolio/correlation.js +15 -3
  230. package/dist/tools/portfolio/correlation.js.map +1 -1
  231. package/dist/tools/portfolio/predictions.js +6 -5
  232. package/dist/tools/portfolio/predictions.js.map +1 -1
  233. package/dist/tools/portfolio/risk-analysis.js +9 -1
  234. package/dist/tools/portfolio/risk-analysis.js.map +1 -1
  235. package/dist/tools/portfolio/tracker.js +6 -3
  236. package/dist/tools/portfolio/tracker.js.map +1 -1
  237. package/dist/tools/portfolio/watchlist.js +6 -1
  238. package/dist/tools/portfolio/watchlist.js.map +1 -1
  239. package/dist/tools/sentiment/reddit-sentiment.d.ts +3 -1
  240. package/dist/tools/sentiment/reddit-sentiment.js +112 -19
  241. package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
  242. package/dist/tools/sentiment/sentiment-summary.d.ts +7 -0
  243. package/dist/tools/sentiment/sentiment-summary.js +230 -0
  244. package/dist/tools/sentiment/sentiment-summary.js.map +1 -0
  245. package/dist/tools/sentiment/sentiment-trend.d.ts +22 -0
  246. package/dist/tools/sentiment/sentiment-trend.js +39 -0
  247. package/dist/tools/sentiment/sentiment-trend.js.map +1 -0
  248. package/dist/tools/sentiment/twitter-sentiment.d.ts +9 -0
  249. package/dist/tools/sentiment/twitter-sentiment.js +75 -0
  250. package/dist/tools/sentiment/twitter-sentiment.js.map +1 -0
  251. package/dist/tools/sentiment/web-search.d.ts +11 -0
  252. package/dist/tools/sentiment/web-search.js +115 -0
  253. package/dist/tools/sentiment/web-search.js.map +1 -0
  254. package/dist/tools/sentiment/web-sentiment.d.ts +8 -0
  255. package/dist/tools/sentiment/web-sentiment.js +66 -0
  256. package/dist/tools/sentiment/web-sentiment.js.map +1 -0
  257. package/dist/tools/technical/backtest.js +9 -1
  258. package/dist/tools/technical/backtest.js.map +1 -1
  259. package/dist/tools/technical/indicators.js +9 -1
  260. package/dist/tools/technical/indicators.js.map +1 -1
  261. package/dist/types/index.d.ts +16 -1
  262. package/dist/types/sentiment.d.ts +41 -0
  263. package/dist/workflows/compare-assets.d.ts +3 -0
  264. package/dist/workflows/compare-assets.js +21 -5
  265. package/dist/workflows/compare-assets.js.map +1 -1
  266. package/dist/workflows/index.d.ts +3 -3
  267. package/dist/workflows/index.js +3 -3
  268. package/dist/workflows/index.js.map +1 -1
  269. package/dist/workflows/options-screener.d.ts +3 -0
  270. package/dist/workflows/options-screener.js +24 -7
  271. package/dist/workflows/options-screener.js.map +1 -1
  272. package/dist/workflows/portfolio-builder.d.ts +3 -0
  273. package/dist/workflows/portfolio-builder.js +30 -9
  274. package/dist/workflows/portfolio-builder.js.map +1 -1
  275. package/package.json +27 -7
  276. package/dist/tools/sentiment/news-sentiment.d.ts +0 -7
  277. package/dist/tools/sentiment/news-sentiment.js +0 -57
  278. package/dist/tools/sentiment/news-sentiment.js.map +0 -1
@@ -0,0 +1,11 @@
1
+ import type { ProviderTracker } from "./provider-tracker.js";
2
+ interface RunContext {
3
+ providerTracker: ProviderTracker;
4
+ }
5
+ /** Set the active run context. Called by SessionCoordinator at workflow start. */
6
+ export declare function setRunContext(ctx: RunContext): void;
7
+ /** Clear the active run context. Called when a workflow ends or is cancelled. */
8
+ export declare function clearRunContext(): void;
9
+ /** Get the current run's ProviderTracker, or undefined outside a workflow. */
10
+ export declare function getProviderTracker(): ProviderTracker | undefined;
11
+ export {};
@@ -0,0 +1,14 @@
1
+ let activeContext = null;
2
+ /** Set the active run context. Called by SessionCoordinator at workflow start. */
3
+ export function setRunContext(ctx) {
4
+ activeContext = ctx;
5
+ }
6
+ /** Clear the active run context. Called when a workflow ends or is cancelled. */
7
+ export function clearRunContext() {
8
+ activeContext = null;
9
+ }
10
+ /** Get the current run's ProviderTracker, or undefined outside a workflow. */
11
+ export function getProviderTracker() {
12
+ return activeContext?.providerTracker;
13
+ }
14
+ //# sourceMappingURL=run-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-context.js","sourceRoot":"","sources":["../../src/runtime/run-context.ts"],"names":[],"mappings":"AAMA,IAAI,aAAa,GAAsB,IAAI,CAAC;AAE5C,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,GAAe;IAC3C,aAAa,GAAG,GAAG,CAAC;AACtB,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,eAAe;IAC7B,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB;IAChC,OAAO,aAAa,EAAE,eAAe,CAAC;AACxC,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@mariozechner/pi-coding-agent";
2
+ import { MemoryStorage } from "../memory/index.js";
3
+ import { WorkflowRunner } from "./workflow-runner.js";
4
+ import type { WorkflowDefinition } from "./prompt-step.js";
5
+ type QueueContext = ExtensionCommandContext | {
6
+ isIdle(): boolean;
7
+ hasPendingMessages?(): boolean;
8
+ ui?: {
9
+ notify(message: string, level?: string): void;
10
+ };
11
+ };
12
+ /**
13
+ * Coordinates session lifecycle, memory, workflow execution,
14
+ * and prompt assembly. The extension delegates to this.
15
+ */
16
+ export declare class SessionCoordinator {
17
+ private db;
18
+ private storage;
19
+ private memoryManager;
20
+ private eventLogger;
21
+ private runner;
22
+ private providerTracker;
23
+ private sessionId;
24
+ constructor();
25
+ getStorage(): MemoryStorage | null;
26
+ getRunner(): WorkflowRunner;
27
+ /** Initialize session: database, memory, event logger, workflow runner. */
28
+ initSession(sessionId: string): void;
29
+ /** Run setup flow. */
30
+ runSetup(pi: ExtensionAPI, ctx: ExtensionContext | ExtensionCommandContext, options: {
31
+ mode: "startup" | "manual";
32
+ }): Promise<"ready" | "shutdown" | "cancelled">;
33
+ /** Extract and persist user preferences from natural language. */
34
+ extractAndStorePreferences(text: string): void;
35
+ /** Record a workflow run in storage. */
36
+ recordWorkflowRun(workflowType: string, entities: object, resolved: object, defaultsUsed: unknown[]): void;
37
+ /** Build system prompt using composable sections. */
38
+ buildSystemPrompt(basePrompt: string, workflowType?: string): string;
39
+ /**
40
+ * Execute a workflow definition through the WorkflowRunner,
41
+ * sending prompts via Pi with settlement-based sequencing.
42
+ */
43
+ executeWorkflow(pi: ExtensionAPI, definition: WorkflowDefinition, ctx: QueueContext): void;
44
+ /** Cancel any active workflow. */
45
+ cancelActiveWorkflow(): void;
46
+ }
47
+ export {};
@@ -0,0 +1,171 @@
1
+ import { initDefaultDatabase, MemoryStorage } from "../memory/index.js";
2
+ import { MemoryManager } from "../memory/manager.js";
3
+ import { extractPreferences } from "../memory/preference-extractor.js";
4
+ import { runOpenCandleSetup } from "../pi/setup.js";
5
+ import { WorkflowEventLogger } from "./workflow-events.js";
6
+ import { ProviderTracker } from "./provider-tracker.js";
7
+ import { WorkflowRunner } from "./workflow-runner.js";
8
+ import { setRunContext, clearRunContext } from "./run-context.js";
9
+ import { PromptContextBuilder } from "../prompts/context-builder.js";
10
+ import { getAddonToolDescriptions } from "../tool-kit.js";
11
+ import { toStepDefinitions, promptStepOutput } from "./prompt-step.js";
12
+ const PROMPT_SETTLE_POLL_MS = 25;
13
+ const IMMEDIATE_IDLE_GRACE_MS = 100;
14
+ function hasPendingMessages(ctx) {
15
+ return ctx.hasPendingMessages?.() ?? false;
16
+ }
17
+ function isReadyForNextPrompt(ctx) {
18
+ return ctx.isIdle() && !hasPendingMessages(ctx);
19
+ }
20
+ function sleep(ms) {
21
+ return new Promise((resolve) => setTimeout(resolve, ms));
22
+ }
23
+ async function waitForPromptSettlement(ctx, isCurrentRun) {
24
+ let sawBusyOrPending = !isReadyForNextPrompt(ctx);
25
+ const startedAt = Date.now();
26
+ while (isCurrentRun()) {
27
+ const ready = isReadyForNextPrompt(ctx);
28
+ if (!ready) {
29
+ sawBusyOrPending = true;
30
+ }
31
+ if (sawBusyOrPending && ready) {
32
+ return true;
33
+ }
34
+ if (!sawBusyOrPending && ready && Date.now() - startedAt >= IMMEDIATE_IDLE_GRACE_MS) {
35
+ return true;
36
+ }
37
+ await sleep(PROMPT_SETTLE_POLL_MS);
38
+ }
39
+ return false;
40
+ }
41
+ /**
42
+ * Coordinates session lifecycle, memory, workflow execution,
43
+ * and prompt assembly. The extension delegates to this.
44
+ */
45
+ export class SessionCoordinator {
46
+ db = null;
47
+ storage = null;
48
+ memoryManager = null;
49
+ eventLogger = null;
50
+ runner;
51
+ providerTracker;
52
+ sessionId = "unknown";
53
+ constructor() {
54
+ // Runner is always available — event logger is optional and added after session init
55
+ this.providerTracker = new ProviderTracker();
56
+ this.runner = new WorkflowRunner({ providerTracker: this.providerTracker });
57
+ }
58
+ getStorage() {
59
+ return this.storage;
60
+ }
61
+ getRunner() {
62
+ return this.runner;
63
+ }
64
+ /** Initialize session: database, memory, event logger, workflow runner. */
65
+ initSession(sessionId) {
66
+ this.db = initDefaultDatabase();
67
+ this.storage = new MemoryStorage(this.db);
68
+ this.memoryManager = new MemoryManager(this.storage);
69
+ this.eventLogger = new WorkflowEventLogger(this.db);
70
+ this.providerTracker = new ProviderTracker();
71
+ this.runner = new WorkflowRunner({
72
+ eventLogger: this.eventLogger,
73
+ providerTracker: this.providerTracker,
74
+ });
75
+ this.sessionId = sessionId;
76
+ }
77
+ /** Run setup flow. */
78
+ async runSetup(pi, ctx, options) {
79
+ return runOpenCandleSetup(pi, ctx, options);
80
+ }
81
+ /** Extract and persist user preferences from natural language. */
82
+ extractAndStorePreferences(text) {
83
+ if (!this.storage)
84
+ return;
85
+ for (const pref of extractPreferences(text)) {
86
+ this.storage.upsertPreference({
87
+ key: pref.key,
88
+ valueJson: JSON.stringify(pref.value),
89
+ confidence: pref.confidence,
90
+ source: "inferred",
91
+ });
92
+ }
93
+ }
94
+ /** Record a workflow run in storage. */
95
+ recordWorkflowRun(workflowType, entities, resolved, defaultsUsed) {
96
+ this.storage?.insertWorkflowRun({
97
+ sessionId: this.sessionId,
98
+ workflowType,
99
+ inputSlotsJson: JSON.stringify(entities),
100
+ resolvedSlotsJson: JSON.stringify(resolved),
101
+ defaultsUsedJson: JSON.stringify(defaultsUsed),
102
+ });
103
+ }
104
+ /** Build system prompt using composable sections. */
105
+ buildSystemPrompt(basePrompt, workflowType) {
106
+ const builder = new PromptContextBuilder();
107
+ const addonTools = getAddonToolDescriptions();
108
+ const addonDescriptions = addonTools.length > 0
109
+ ? addonTools.map((t) => `${t.name}: ${t.description}`)
110
+ : undefined;
111
+ const memoryContext = this.memoryManager
112
+ ? this.memoryManager.buildContext(workflowType ?? "unclassified")
113
+ : undefined;
114
+ builder.populateFromOptions({
115
+ workflowType,
116
+ memoryContext: memoryContext || undefined,
117
+ addonToolDescriptions: addonDescriptions,
118
+ });
119
+ return `${basePrompt}\n\n${builder.build()}`;
120
+ }
121
+ /**
122
+ * Execute a workflow definition through the WorkflowRunner,
123
+ * sending prompts via Pi with settlement-based sequencing.
124
+ */
125
+ executeWorkflow(pi, definition, ctx) {
126
+ if (definition.steps.length === 0)
127
+ return;
128
+ const runner = this.runner;
129
+ const runRef = { active: true };
130
+ // Send the first prompt immediately
131
+ const [firstStep, ...restSteps] = definition.steps;
132
+ const startedBusy = !isReadyForNextPrompt(ctx);
133
+ if (startedBusy) {
134
+ pi.sendUserMessage(firstStep.prompt, { deliverAs: "followUp" });
135
+ ctx.ui?.notify?.("Analysis queued as follow-up.", "info");
136
+ }
137
+ else {
138
+ pi.sendUserMessage(firstStep.prompt);
139
+ }
140
+ // Make the run's ProviderTracker accessible to tools during execution
141
+ setRunContext({ providerTracker: this.providerTracker });
142
+ // Start the runner in the background for state tracking
143
+ const stepDefs = toStepDefinitions(definition.steps);
144
+ void runner.start(definition.workflowType, stepDefs, async (step, stepIndex) => {
145
+ // First step was already sent above — just wait for settlement
146
+ if (stepIndex > 0) {
147
+ const settled = await waitForPromptSettlement(ctx, () => runRef.active);
148
+ if (!settled || !runRef.active) {
149
+ throw new Error("run_cancelled");
150
+ }
151
+ pi.sendUserMessage(definition.steps[stepIndex].prompt);
152
+ }
153
+ else {
154
+ // For the first step, just wait for it to settle
155
+ const settled = await waitForPromptSettlement(ctx, () => runRef.active);
156
+ if (!settled || !runRef.active) {
157
+ throw new Error("run_cancelled");
158
+ }
159
+ }
160
+ return promptStepOutput(stepIndex, step.stepType);
161
+ }).finally(() => {
162
+ clearRunContext();
163
+ });
164
+ }
165
+ /** Cancel any active workflow. */
166
+ cancelActiveWorkflow() {
167
+ clearRunContext();
168
+ this.runner?.cancel();
169
+ }
170
+ }
171
+ //# sourceMappingURL=session-coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-coordinator.js","sourceRoot":"","sources":["../../src/runtime/session-coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { EvidenceRecord } from "./evidence.js";
2
+ /** A single validation check result. */
3
+ export interface ValidationEntry {
4
+ message: string;
5
+ evidenceLabel?: string;
6
+ detail?: string;
7
+ }
8
+ /** Result of running all deterministic validation checks. */
9
+ export interface ValidationResult {
10
+ passes: ValidationEntry[];
11
+ failures: ValidationEntry[];
12
+ warnings: ValidationEntry[];
13
+ }
14
+ /** Create an empty validation result. */
15
+ export declare function emptyValidationResult(): ValidationResult;
16
+ /** Check that market-sensitive evidence records have timestamps. */
17
+ export declare function checkTimestamps(evidence: EvidenceRecord[], marketSensitiveLabels: Set<string>): ValidationEntry[];
18
+ /** Check that options expiry dates are in the future. */
19
+ export declare function checkOptionsExpiries(evidence: EvidenceRecord[], today: string): ValidationEntry[];
20
+ /** Check that all required fields have evidence records. */
21
+ export declare function checkRequiredFields(evidence: EvidenceRecord[], requiredLabels: string[]): ValidationEntry[];
22
+ /** Default market-sensitive labels. */
23
+ export declare const DEFAULT_MARKET_SENSITIVE_LABELS: Set<string>;
24
+ /** Configuration for the runtime validator. */
25
+ export interface ValidatorConfig {
26
+ marketSensitiveLabels?: Set<string>;
27
+ requiredFields?: string[];
28
+ toolResults?: Map<string, number>;
29
+ today?: string;
30
+ }
31
+ /**
32
+ * Orchestrates all deterministic validation checks on evidence records.
33
+ * Runs before LLM-based validation.
34
+ */
35
+ export declare class RuntimeValidator {
36
+ private readonly config;
37
+ constructor(config?: ValidatorConfig);
38
+ /** Run all validation checks and return a combined result. */
39
+ validate(evidence: EvidenceRecord[]): ValidationResult;
40
+ /** Format validation results as a summary string for the LLM validation prompt. */
41
+ formatForLLM(result: ValidationResult): string;
42
+ }
43
+ /** Check that evidence values match expected tool result values. */
44
+ export declare function checkNumberMatch(evidence: EvidenceRecord[], toolResults: Map<string, number>): ValidationEntry[];
@@ -0,0 +1,157 @@
1
+ /** Create an empty validation result. */
2
+ export function emptyValidationResult() {
3
+ return { passes: [], failures: [], warnings: [] };
4
+ }
5
+ /** Check that market-sensitive evidence records have timestamps. */
6
+ export function checkTimestamps(evidence, marketSensitiveLabels) {
7
+ const warnings = [];
8
+ for (const record of evidence) {
9
+ if (marketSensitiveLabels.has(record.label) &&
10
+ record.provenance.source === "fetched" &&
11
+ !record.provenance.timestamp) {
12
+ warnings.push({
13
+ message: `Market-sensitive value '${record.label}' has no timestamp`,
14
+ evidenceLabel: record.label,
15
+ });
16
+ }
17
+ }
18
+ return warnings;
19
+ }
20
+ /** Check that options expiry dates are in the future. */
21
+ export function checkOptionsExpiries(evidence, today) {
22
+ const failures = [];
23
+ for (const record of evidence) {
24
+ if (record.label.toLowerCase().includes("expir") &&
25
+ typeof record.value === "string" &&
26
+ record.value < today) {
27
+ failures.push({
28
+ message: `Options expiry ${record.value} is in the past`,
29
+ evidenceLabel: record.label,
30
+ detail: `Today is ${today}`,
31
+ });
32
+ }
33
+ }
34
+ return failures;
35
+ }
36
+ /** Check that all required fields have evidence records. */
37
+ export function checkRequiredFields(evidence, requiredLabels) {
38
+ const present = new Set(evidence.map((e) => e.label));
39
+ const failures = [];
40
+ for (const label of requiredLabels) {
41
+ if (!present.has(label)) {
42
+ failures.push({
43
+ message: `Required field '${label}' has no evidence record`,
44
+ evidenceLabel: label,
45
+ });
46
+ }
47
+ }
48
+ return failures;
49
+ }
50
+ /** Default market-sensitive labels. */
51
+ export const DEFAULT_MARKET_SENSITIVE_LABELS = new Set([
52
+ "Stock Price",
53
+ "Volume",
54
+ "Market Cap",
55
+ "52-Week High",
56
+ "52-Week Low",
57
+ "Bid",
58
+ "Ask",
59
+ "Day High",
60
+ "Day Low",
61
+ "Open",
62
+ "Previous Close",
63
+ "Crypto Price",
64
+ "Crypto Volume",
65
+ ]);
66
+ /**
67
+ * Orchestrates all deterministic validation checks on evidence records.
68
+ * Runs before LLM-based validation.
69
+ */
70
+ export class RuntimeValidator {
71
+ config;
72
+ constructor(config = {}) {
73
+ this.config = config;
74
+ }
75
+ /** Run all validation checks and return a combined result. */
76
+ validate(evidence) {
77
+ const result = emptyValidationResult();
78
+ // Timestamp checks
79
+ const timestampWarnings = checkTimestamps(evidence, this.config.marketSensitiveLabels ?? DEFAULT_MARKET_SENSITIVE_LABELS);
80
+ result.warnings.push(...timestampWarnings);
81
+ // Options expiry checks
82
+ const today = this.config.today ?? new Date().toISOString().slice(0, 10);
83
+ const expiryFailures = checkOptionsExpiries(evidence, today);
84
+ result.failures.push(...expiryFailures);
85
+ // Required field checks
86
+ if (this.config.requiredFields) {
87
+ const fieldFailures = checkRequiredFields(evidence, this.config.requiredFields);
88
+ result.failures.push(...fieldFailures);
89
+ }
90
+ // Number match checks
91
+ if (this.config.toolResults) {
92
+ const numberEntries = checkNumberMatch(evidence, this.config.toolResults);
93
+ for (const entry of numberEntries) {
94
+ if (entry.type === "pass") {
95
+ result.passes.push(entry);
96
+ }
97
+ else {
98
+ result.failures.push(entry);
99
+ }
100
+ }
101
+ }
102
+ return result;
103
+ }
104
+ /** Format validation results as a summary string for the LLM validation prompt. */
105
+ formatForLLM(result) {
106
+ const lines = ["## Deterministic Validation Results"];
107
+ if (result.failures.length > 0) {
108
+ lines.push(`\n### Failures (${result.failures.length})`);
109
+ for (const f of result.failures) {
110
+ lines.push(`- ${f.message}`);
111
+ }
112
+ }
113
+ if (result.warnings.length > 0) {
114
+ lines.push(`\n### Warnings (${result.warnings.length})`);
115
+ for (const w of result.warnings) {
116
+ lines.push(`- ${w.message}`);
117
+ }
118
+ }
119
+ if (result.passes.length > 0) {
120
+ lines.push(`\n### Verified (${result.passes.length})`);
121
+ for (const p of result.passes) {
122
+ lines.push(`- ${p.message}`);
123
+ }
124
+ }
125
+ if (result.failures.length === 0 && result.warnings.length === 0) {
126
+ lines.push("\nAll deterministic checks passed.");
127
+ }
128
+ return lines.join("\n");
129
+ }
130
+ }
131
+ /** Check that evidence values match expected tool result values. */
132
+ export function checkNumberMatch(evidence, toolResults) {
133
+ const results = [];
134
+ for (const record of evidence) {
135
+ if (typeof record.value !== "number")
136
+ continue;
137
+ const expected = toolResults.get(record.label);
138
+ if (expected === undefined)
139
+ continue;
140
+ if (record.value === expected) {
141
+ results.push({
142
+ type: "pass",
143
+ message: `${record.label}: ${record.value} matches tool result`,
144
+ evidenceLabel: record.label,
145
+ });
146
+ }
147
+ else {
148
+ results.push({
149
+ type: "failure",
150
+ message: `${record.label} mismatch: evidence says ${record.value}, tool returned ${expected}`,
151
+ evidenceLabel: record.label,
152
+ });
153
+ }
154
+ }
155
+ return results;
156
+ }
157
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/runtime/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type Database from "better-sqlite3";
2
+ /** All workflow event types. */
3
+ export type WorkflowEventType = "workflow_started" | "slot_resolved" | "clarification_asked" | "clarification_answered" | "step_started" | "step_completed" | "step_failed" | "step_skipped" | "tool_called" | "tool_failed" | "validation_passed" | "validation_failed" | "workflow_completed" | "workflow_cancelled";
4
+ /** A persisted workflow event row. */
5
+ export interface WorkflowEvent {
6
+ id: number;
7
+ runId: string;
8
+ stepIndex: number;
9
+ eventType: WorkflowEventType;
10
+ payloadJson: string | null;
11
+ timestamp: string;
12
+ }
13
+ /** Append-only workflow event logger backed by SQLite. */
14
+ export declare class WorkflowEventLogger {
15
+ private readonly db;
16
+ constructor(db: Database.Database);
17
+ /** Append a workflow event. */
18
+ log(runId: string, stepIndex: number, eventType: WorkflowEventType, payload?: Record<string, unknown>): void;
19
+ /** Query all events for a given run ID, ordered by timestamp. */
20
+ getEventsByRunId(runId: string): WorkflowEvent[];
21
+ }
@@ -0,0 +1,31 @@
1
+ /** Append-only workflow event logger backed by SQLite. */
2
+ export class WorkflowEventLogger {
3
+ db;
4
+ constructor(db) {
5
+ this.db = db;
6
+ }
7
+ /** Append a workflow event. */
8
+ log(runId, stepIndex, eventType, payload) {
9
+ const now = new Date().toISOString();
10
+ const payloadJson = payload ? JSON.stringify(payload) : null;
11
+ this.db
12
+ .prepare(`INSERT INTO workflow_events (run_id, step_index, event_type, payload_json, timestamp)
13
+ VALUES (?, ?, ?, ?, ?)`)
14
+ .run(runId, stepIndex, eventType, payloadJson, now);
15
+ }
16
+ /** Query all events for a given run ID, ordered by timestamp. */
17
+ getEventsByRunId(runId) {
18
+ const rows = this.db
19
+ .prepare("SELECT id, run_id, step_index, event_type, payload_json, timestamp FROM workflow_events WHERE run_id = ? ORDER BY id")
20
+ .all(runId);
21
+ return rows.map((r) => ({
22
+ id: r.id,
23
+ runId: r.run_id,
24
+ stepIndex: r.step_index,
25
+ eventType: r.event_type,
26
+ payloadJson: r.payload_json,
27
+ timestamp: r.timestamp,
28
+ }));
29
+ }
30
+ }
31
+ //# sourceMappingURL=workflow-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-events.js","sourceRoot":"","sources":["../../src/runtime/workflow-events.ts"],"names":[],"mappings":"AA6BA,0DAA0D;AAC1D,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAEtD,+BAA+B;IAC/B,GAAG,CACD,KAAa,EACb,SAAiB,EACjB,SAA4B,EAC5B,OAAiC;QAEjC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;gCACwB,CACzB;aACA,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,iEAAiE;IACjE,gBAAgB,CAAC,KAAa;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN,sHAAsH,CACvH;aACA,GAAG,CAAC,KAAK,CAOR,CAAC;QAEL,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,MAAM;YACf,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,SAAS,EAAE,CAAC,CAAC,UAA+B;YAC5C,WAAW,EAAE,CAAC,CAAC,YAAY;YAC3B,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ import type { WorkflowRun, StepOutput, WorkflowStep } from "./workflow-types.js";
2
+ import type { WorkflowEventLogger } from "./workflow-events.js";
3
+ import type { ProviderTracker } from "./provider-tracker.js";
4
+ import type { EvidenceRecord } from "./evidence.js";
5
+ /** Function that executes a single workflow step. */
6
+ export type StepExecutor = (step: WorkflowStep, stepIndex: number, priorEvidence: EvidenceRecord[], context: StepExecutionContext) => Promise<StepOutput>;
7
+ /** Context passed to step executors. */
8
+ export interface StepExecutionContext {
9
+ runId: string;
10
+ providerTracker: ProviderTracker;
11
+ }
12
+ /** Options for creating a WorkflowRunner. */
13
+ export interface WorkflowRunnerOptions {
14
+ eventLogger?: WorkflowEventLogger;
15
+ providerTracker?: ProviderTracker;
16
+ }
17
+ /**
18
+ * Typed workflow execution engine with run IDs, step definitions,
19
+ * state transitions, cancellation, and event logging.
20
+ */
21
+ export declare class WorkflowRunner {
22
+ private readonly eventLogger?;
23
+ private readonly providerTracker?;
24
+ private activeRun;
25
+ constructor(options?: WorkflowRunnerOptions);
26
+ /** Get the currently active run, if any. */
27
+ getActiveRun(): WorkflowRun | null;
28
+ /**
29
+ * Start a new workflow run. If a run is already active, it is cancelled first.
30
+ */
31
+ start(workflowType: string, stepDefinitions: Omit<WorkflowStep, "status">[], executor: StepExecutor): Promise<WorkflowRun>;
32
+ /** Cancel the active run. */
33
+ cancel(): void;
34
+ private executeSteps;
35
+ private logEvent;
36
+ }