opencandle 0.1.0 → 0.2.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 (179) hide show
  1. package/README.md +13 -4
  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 +155 -7
  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 +4 -0
  11. package/dist/config.js +2 -0
  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 +30 -0
  17. package/dist/infra/cache.js +40 -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 +1 -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/pi/opencandle-extension.d.ts +5 -1
  39. package/dist/pi/opencandle-extension.js +45 -142
  40. package/dist/pi/opencandle-extension.js.map +1 -1
  41. package/dist/pi/session.d.ts +2 -0
  42. package/dist/pi/session.js +1 -1
  43. package/dist/pi/session.js.map +1 -1
  44. package/dist/prompts/context-builder.d.ts +26 -0
  45. package/dist/prompts/context-builder.js +126 -0
  46. package/dist/prompts/context-builder.js.map +1 -0
  47. package/dist/prompts/sections.d.ts +13 -0
  48. package/dist/prompts/sections.js +35 -0
  49. package/dist/prompts/sections.js.map +1 -0
  50. package/dist/providers/alpha-vantage.d.ts +3 -0
  51. package/dist/providers/alpha-vantage.js +184 -76
  52. package/dist/providers/alpha-vantage.js.map +1 -1
  53. package/dist/providers/coingecko.js +53 -37
  54. package/dist/providers/coingecko.js.map +1 -1
  55. package/dist/providers/fear-greed.js +23 -15
  56. package/dist/providers/fear-greed.js.map +1 -1
  57. package/dist/providers/fred.js +35 -27
  58. package/dist/providers/fred.js.map +1 -1
  59. package/dist/providers/reddit.js +44 -36
  60. package/dist/providers/reddit.js.map +1 -1
  61. package/dist/providers/twitter.d.ts +20 -0
  62. package/dist/providers/twitter.js +143 -0
  63. package/dist/providers/twitter.js.map +1 -0
  64. package/dist/providers/with-fallback.d.ts +15 -0
  65. package/dist/providers/with-fallback.js +32 -0
  66. package/dist/providers/with-fallback.js.map +1 -0
  67. package/dist/providers/wrap-provider.d.ts +13 -0
  68. package/dist/providers/wrap-provider.js +43 -0
  69. package/dist/providers/wrap-provider.js.map +1 -0
  70. package/dist/providers/yahoo-finance.js +77 -57
  71. package/dist/providers/yahoo-finance.js.map +1 -1
  72. package/dist/runtime/evidence.d.ts +35 -0
  73. package/dist/runtime/evidence.js +29 -0
  74. package/dist/runtime/evidence.js.map +1 -0
  75. package/dist/runtime/index.d.ts +16 -0
  76. package/dist/runtime/index.js +10 -0
  77. package/dist/runtime/index.js.map +1 -0
  78. package/dist/runtime/prompt-step.d.ts +41 -0
  79. package/dist/runtime/prompt-step.js +42 -0
  80. package/dist/runtime/prompt-step.js.map +1 -0
  81. package/dist/runtime/provider-ids.d.ts +14 -0
  82. package/dist/runtime/provider-ids.js +14 -0
  83. package/dist/runtime/provider-ids.js.map +1 -0
  84. package/dist/runtime/provider-tracker.d.ts +20 -0
  85. package/dist/runtime/provider-tracker.js +36 -0
  86. package/dist/runtime/provider-tracker.js.map +1 -0
  87. package/dist/runtime/run-context.d.ts +11 -0
  88. package/dist/runtime/run-context.js +14 -0
  89. package/dist/runtime/run-context.js.map +1 -0
  90. package/dist/runtime/session-coordinator.d.ts +48 -0
  91. package/dist/runtime/session-coordinator.js +171 -0
  92. package/dist/runtime/session-coordinator.js.map +1 -0
  93. package/dist/runtime/validation.d.ts +44 -0
  94. package/dist/runtime/validation.js +157 -0
  95. package/dist/runtime/validation.js.map +1 -0
  96. package/dist/runtime/workflow-events.d.ts +21 -0
  97. package/dist/runtime/workflow-events.js +31 -0
  98. package/dist/runtime/workflow-events.js.map +1 -0
  99. package/dist/runtime/workflow-runner.d.ts +36 -0
  100. package/dist/runtime/workflow-runner.js +129 -0
  101. package/dist/runtime/workflow-runner.js.map +1 -0
  102. package/dist/runtime/workflow-types.d.ts +60 -0
  103. package/dist/runtime/workflow-types.js +32 -0
  104. package/dist/runtime/workflow-types.js.map +1 -0
  105. package/dist/system-prompt.js +52 -2
  106. package/dist/system-prompt.js.map +1 -1
  107. package/dist/tool-kit.d.ts +9 -5
  108. package/dist/tool-kit.js +29 -6
  109. package/dist/tool-kit.js.map +1 -1
  110. package/dist/tools/fundamentals/company-overview.js +13 -2
  111. package/dist/tools/fundamentals/company-overview.js.map +1 -1
  112. package/dist/tools/fundamentals/comps.js +15 -7
  113. package/dist/tools/fundamentals/comps.js.map +1 -1
  114. package/dist/tools/fundamentals/dcf.js +23 -5
  115. package/dist/tools/fundamentals/dcf.js.map +1 -1
  116. package/dist/tools/fundamentals/earnings.js +9 -1
  117. package/dist/tools/fundamentals/earnings.js.map +1 -1
  118. package/dist/tools/fundamentals/financials.js +9 -1
  119. package/dist/tools/fundamentals/financials.js.map +1 -1
  120. package/dist/tools/fundamentals/sec-filings.js +9 -1
  121. package/dist/tools/fundamentals/sec-filings.js.map +1 -1
  122. package/dist/tools/index.js +2 -0
  123. package/dist/tools/index.js.map +1 -1
  124. package/dist/tools/interaction/ask-user.d.ts +3 -0
  125. package/dist/tools/interaction/ask-user.js +87 -0
  126. package/dist/tools/interaction/ask-user.js.map +1 -0
  127. package/dist/tools/interaction/twitter-login.d.ts +8 -0
  128. package/dist/tools/interaction/twitter-login.js +77 -0
  129. package/dist/tools/interaction/twitter-login.js.map +1 -0
  130. package/dist/tools/macro/fear-greed.js +9 -1
  131. package/dist/tools/macro/fear-greed.js.map +1 -1
  132. package/dist/tools/macro/fred-data.js +13 -2
  133. package/dist/tools/macro/fred-data.js.map +1 -1
  134. package/dist/tools/market/crypto-history.js +9 -1
  135. package/dist/tools/market/crypto-history.js.map +1 -1
  136. package/dist/tools/market/crypto-price.js +9 -1
  137. package/dist/tools/market/crypto-price.js.map +1 -1
  138. package/dist/tools/market/stock-history.js +28 -1
  139. package/dist/tools/market/stock-history.js.map +1 -1
  140. package/dist/tools/market/stock-quote.js +29 -4
  141. package/dist/tools/market/stock-quote.js.map +1 -1
  142. package/dist/tools/options/option-chain.js +9 -1
  143. package/dist/tools/options/option-chain.js.map +1 -1
  144. package/dist/tools/portfolio/correlation.js +15 -3
  145. package/dist/tools/portfolio/correlation.js.map +1 -1
  146. package/dist/tools/portfolio/predictions.js +6 -5
  147. package/dist/tools/portfolio/predictions.js.map +1 -1
  148. package/dist/tools/portfolio/risk-analysis.js +9 -1
  149. package/dist/tools/portfolio/risk-analysis.js.map +1 -1
  150. package/dist/tools/portfolio/tracker.js +6 -3
  151. package/dist/tools/portfolio/tracker.js.map +1 -1
  152. package/dist/tools/portfolio/watchlist.js +6 -1
  153. package/dist/tools/portfolio/watchlist.js.map +1 -1
  154. package/dist/tools/sentiment/news-sentiment.js +8 -10
  155. package/dist/tools/sentiment/news-sentiment.js.map +1 -1
  156. package/dist/tools/sentiment/reddit-sentiment.js +9 -1
  157. package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
  158. package/dist/tools/sentiment/twitter-sentiment.d.ts +9 -0
  159. package/dist/tools/sentiment/twitter-sentiment.js +58 -0
  160. package/dist/tools/sentiment/twitter-sentiment.js.map +1 -0
  161. package/dist/tools/technical/backtest.js +9 -1
  162. package/dist/tools/technical/backtest.js.map +1 -1
  163. package/dist/tools/technical/indicators.js +9 -1
  164. package/dist/tools/technical/indicators.js.map +1 -1
  165. package/dist/types/index.d.ts +15 -0
  166. package/dist/types/sentiment.d.ts +20 -0
  167. package/dist/workflows/compare-assets.d.ts +3 -0
  168. package/dist/workflows/compare-assets.js +21 -5
  169. package/dist/workflows/compare-assets.js.map +1 -1
  170. package/dist/workflows/index.d.ts +3 -3
  171. package/dist/workflows/index.js +3 -3
  172. package/dist/workflows/index.js.map +1 -1
  173. package/dist/workflows/options-screener.d.ts +3 -0
  174. package/dist/workflows/options-screener.js +24 -7
  175. package/dist/workflows/options-screener.js.map +1 -1
  176. package/dist/workflows/portfolio-builder.d.ts +3 -0
  177. package/dist/workflows/portfolio-builder.js +30 -9
  178. package/dist/workflows/portfolio-builder.js.map +1 -1
  179. package/package.json +9 -5
@@ -0,0 +1,35 @@
1
+ /** Source of a value flowing through the runtime. */
2
+ export type ProvenanceSource = "user" | "preference" | "default" | "fetched" | "computed" | "unavailable" | "stale_cache";
3
+ /** Tracks where a value came from, when, and with what confidence. */
4
+ export interface Provenance {
5
+ source: ProvenanceSource;
6
+ timestamp?: string;
7
+ provider?: string;
8
+ confidence?: number;
9
+ reason?: string;
10
+ }
11
+ /** A labeled data point with its provenance. */
12
+ export interface EvidenceRecord {
13
+ label: string;
14
+ value: unknown;
15
+ provenance: Provenance;
16
+ }
17
+ /** Successful provider result. */
18
+ export interface ProviderResultOk<T> {
19
+ status: "ok";
20
+ data: T;
21
+ timestamp: string;
22
+ stale?: boolean;
23
+ }
24
+ /** Failed/unavailable provider result. */
25
+ export interface ProviderResultUnavailable {
26
+ status: "unavailable";
27
+ reason: string;
28
+ provider: string;
29
+ }
30
+ /** Union of provider outcomes — every provider call returns one of these. */
31
+ export type ProviderResult<T> = ProviderResultOk<T> | ProviderResultUnavailable;
32
+ /** Type guard for successful provider results. */
33
+ export declare function isProviderOk<T>(result: ProviderResult<T>): result is ProviderResultOk<T>;
34
+ /** Convert a ProviderResult into an EvidenceRecord. */
35
+ export declare function toEvidenceRecord<T>(label: string, result: ProviderResult<T>, providerId?: string): EvidenceRecord;
@@ -0,0 +1,29 @@
1
+ /** Type guard for successful provider results. */
2
+ export function isProviderOk(result) {
3
+ return result.status === "ok";
4
+ }
5
+ /** Convert a ProviderResult into an EvidenceRecord. */
6
+ export function toEvidenceRecord(label, result, providerId) {
7
+ if (isProviderOk(result)) {
8
+ return {
9
+ label,
10
+ value: result.data,
11
+ provenance: {
12
+ source: result.stale ? "stale_cache" : "fetched",
13
+ timestamp: result.timestamp,
14
+ provider: providerId,
15
+ confidence: result.stale ? 0.5 : undefined,
16
+ },
17
+ };
18
+ }
19
+ return {
20
+ label,
21
+ value: null,
22
+ provenance: {
23
+ source: "unavailable",
24
+ reason: result.reason,
25
+ provider: result.provider,
26
+ },
27
+ };
28
+ }
29
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/runtime/evidence.ts"],"names":[],"mappings":"AA4CA,kDAAkD;AAClD,MAAM,UAAU,YAAY,CAAI,MAAyB;IACvD,OAAO,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;AAChC,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,MAAyB,EACzB,UAAmB;IAEnB,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,KAAK;YACL,KAAK,EAAE,MAAM,CAAC,IAAI;YAClB,UAAU,EAAE;gBACV,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;gBAChD,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE,UAAU;gBACpB,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;aAC3C;SACF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK;QACL,KAAK,EAAE,IAAI;QACX,UAAU,EAAE;YACV,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type { Provenance, ProvenanceSource, EvidenceRecord, ProviderResult, ProviderResultOk, ProviderResultUnavailable, } from "./evidence.js";
2
+ export { isProviderOk, toEvidenceRecord } from "./evidence.js";
3
+ export type { StepStatus, RunStatus, WorkflowStep, StepOutput, AnalystSignal, AnalystOutput, WorkflowRun, } from "./workflow-types.js";
4
+ export { isValidStepTransition, transitionStepStatus, createWorkflowRun, } from "./workflow-types.js";
5
+ export type { ValidationEntry, ValidationResult, ValidatorConfig, } from "./validation.js";
6
+ export { emptyValidationResult, checkTimestamps, checkOptionsExpiries, checkRequiredFields, checkNumberMatch, RuntimeValidator, DEFAULT_MARKET_SENSITIVE_LABELS, } from "./validation.js";
7
+ export type { WorkflowEventType, WorkflowEvent } from "./workflow-events.js";
8
+ export { WorkflowEventLogger } from "./workflow-events.js";
9
+ export { ProviderTracker } from "./provider-tracker.js";
10
+ export type { ProviderId } from "./provider-ids.js";
11
+ export { PROVIDER_ID } from "./provider-ids.js";
12
+ export { setRunContext, clearRunContext, getProviderTracker } from "./run-context.js";
13
+ export type { StepExecutor, StepExecutionContext, WorkflowRunnerOptions } from "./workflow-runner.js";
14
+ export { WorkflowRunner } from "./workflow-runner.js";
15
+ export type { PromptStep, WorkflowDefinition } from "./prompt-step.js";
16
+ export { promptStep, promptStepOutput, toStepDefinitions, toWorkflowPlan } from "./prompt-step.js";
@@ -0,0 +1,10 @@
1
+ export { isProviderOk, toEvidenceRecord } from "./evidence.js";
2
+ export { isValidStepTransition, transitionStepStatus, createWorkflowRun, } from "./workflow-types.js";
3
+ export { emptyValidationResult, checkTimestamps, checkOptionsExpiries, checkRequiredFields, checkNumberMatch, RuntimeValidator, DEFAULT_MARKET_SENSITIVE_LABELS, } from "./validation.js";
4
+ export { WorkflowEventLogger } from "./workflow-events.js";
5
+ export { ProviderTracker } from "./provider-tracker.js";
6
+ export { PROVIDER_ID } from "./provider-ids.js";
7
+ export { setRunContext, clearRunContext, getProviderTracker } from "./run-context.js";
8
+ export { WorkflowRunner } from "./workflow-runner.js";
9
+ export { promptStep, promptStepOutput, toStepDefinitions, toWorkflowPlan } from "./prompt-step.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAW/D,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { WorkflowStep, StepOutput } from "./workflow-types.js";
2
+ /**
3
+ * A workflow step definition that carries its prompt text.
4
+ * In Pi's model, each step is a prompt sent to the LLM.
5
+ */
6
+ export interface PromptStep extends Omit<WorkflowStep, "status"> {
7
+ prompt: string;
8
+ }
9
+ /**
10
+ * A complete workflow definition: typed step metadata + prompt text for each step.
11
+ * Replaces the old WorkflowPlan { initialPrompt, followUps }.
12
+ */
13
+ export interface WorkflowDefinition {
14
+ workflowType: string;
15
+ steps: PromptStep[];
16
+ }
17
+ /**
18
+ * Create a prompt-based step definition.
19
+ */
20
+ export declare function promptStep(stepType: string, description: string, prompt: string, options?: {
21
+ skippable?: boolean;
22
+ requiredInputs?: string[];
23
+ expectedOutputs?: string[];
24
+ }): PromptStep;
25
+ /**
26
+ * Create a StepOutput for a prompt-based step (no structured evidence yet).
27
+ * Evidence will be captured separately via tool call hooks.
28
+ */
29
+ export declare function promptStepOutput(stepIndex: number, stepType: string): StepOutput;
30
+ /**
31
+ * Extract just the WorkflowStep metadata from PromptStep definitions
32
+ * (dropping the prompt field) for passing to WorkflowRunner.
33
+ */
34
+ export declare function toStepDefinitions(steps: PromptStep[]): Omit<WorkflowStep, "status">[];
35
+ /**
36
+ * Convert a WorkflowDefinition to the old WorkflowPlan format for backward compatibility.
37
+ */
38
+ export declare function toWorkflowPlan(definition: WorkflowDefinition): {
39
+ initialPrompt: string;
40
+ followUps: string[];
41
+ };
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Create a prompt-based step definition.
3
+ */
4
+ export function promptStep(stepType, description, prompt, options = {}) {
5
+ return {
6
+ stepType,
7
+ description,
8
+ prompt,
9
+ skippable: options.skippable ?? false,
10
+ requiredInputs: options.requiredInputs ?? [],
11
+ expectedOutputs: options.expectedOutputs ?? [],
12
+ };
13
+ }
14
+ /**
15
+ * Create a StepOutput for a prompt-based step (no structured evidence yet).
16
+ * Evidence will be captured separately via tool call hooks.
17
+ */
18
+ export function promptStepOutput(stepIndex, stepType) {
19
+ return {
20
+ stepIndex,
21
+ stepType,
22
+ evidence: [],
23
+ };
24
+ }
25
+ /**
26
+ * Extract just the WorkflowStep metadata from PromptStep definitions
27
+ * (dropping the prompt field) for passing to WorkflowRunner.
28
+ */
29
+ export function toStepDefinitions(steps) {
30
+ return steps.map(({ prompt: _prompt, ...step }) => step);
31
+ }
32
+ /**
33
+ * Convert a WorkflowDefinition to the old WorkflowPlan format for backward compatibility.
34
+ */
35
+ export function toWorkflowPlan(definition) {
36
+ const [first, ...rest] = definition.steps;
37
+ return {
38
+ initialPrompt: first?.prompt ?? "",
39
+ followUps: rest.map((s) => s.prompt),
40
+ };
41
+ }
42
+ //# sourceMappingURL=prompt-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-step.js","sourceRoot":"","sources":["../../src/runtime/prompt-step.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,QAAgB,EAChB,WAAmB,EACnB,MAAc,EACd,UAII,EAAE;IAEN,OAAO;QACL,QAAQ;QACR,WAAW;QACX,MAAM;QACN,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK;QACrC,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;QAC5C,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,EAAE;KAC/C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,QAAgB;IAClE,OAAO;QACL,SAAS;QACT,QAAQ;QACR,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAmB;IACnD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAA8B;IAI3D,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;IAC1C,OAAO;QACL,aAAa,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE;QAClC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;KACrC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Canonical provider IDs. These match the keys used in
3
+ * src/infra/rate-limiter.ts for providers that have rate limits.
4
+ */
5
+ export declare const PROVIDER_ID: {
6
+ readonly YAHOO: "yahoo";
7
+ readonly ALPHA_VANTAGE: "alphavantage";
8
+ readonly COINGECKO: "coingecko";
9
+ readonly FRED: "fred";
10
+ readonly SEC_EDGAR: "sec-edgar";
11
+ readonly REDDIT: "reddit";
12
+ readonly FEAR_GREED: "feargreed";
13
+ };
14
+ export type ProviderId = (typeof PROVIDER_ID)[keyof typeof PROVIDER_ID];
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Canonical provider IDs. These match the keys used in
3
+ * src/infra/rate-limiter.ts for providers that have rate limits.
4
+ */
5
+ export const PROVIDER_ID = {
6
+ YAHOO: "yahoo",
7
+ ALPHA_VANTAGE: "alphavantage",
8
+ COINGECKO: "coingecko",
9
+ FRED: "fred",
10
+ SEC_EDGAR: "sec-edgar",
11
+ REDDIT: "reddit",
12
+ FEAR_GREED: "feargreed",
13
+ };
14
+ //# sourceMappingURL=provider-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-ids.js","sourceRoot":"","sources":["../../src/runtime/provider-ids.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK,EAAE,OAAO;IACd,aAAa,EAAE,cAAc;IAC7B,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,WAAW;CACf,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ProviderResult } from "./evidence.js";
2
+ /**
3
+ * Tracks provider failures within a workflow run and short-circuits
4
+ * calls to providers that have exceeded the failure threshold.
5
+ */
6
+ export declare class ProviderTracker {
7
+ private readonly maxFailures;
8
+ private readonly failures;
9
+ constructor(maxFailures?: number);
10
+ /** Record a failure for a provider. */
11
+ recordFailure(provider: string): void;
12
+ /** Check whether a provider's circuit is open (too many failures). */
13
+ isCircuitOpen(provider: string): boolean;
14
+ /** Get a short-circuit unavailable result for a provider. */
15
+ shortCircuit<T>(provider: string): ProviderResult<T>;
16
+ /** Reset failure count for a provider. */
17
+ reset(provider: string): void;
18
+ /** Reset all tracked failures. */
19
+ resetAll(): void;
20
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Tracks provider failures within a workflow run and short-circuits
3
+ * calls to providers that have exceeded the failure threshold.
4
+ */
5
+ export class ProviderTracker {
6
+ maxFailures;
7
+ failures = new Map();
8
+ constructor(maxFailures = 2) {
9
+ this.maxFailures = maxFailures;
10
+ }
11
+ /** Record a failure for a provider. */
12
+ recordFailure(provider) {
13
+ this.failures.set(provider, (this.failures.get(provider) ?? 0) + 1);
14
+ }
15
+ /** Check whether a provider's circuit is open (too many failures). */
16
+ isCircuitOpen(provider) {
17
+ return (this.failures.get(provider) ?? 0) >= this.maxFailures;
18
+ }
19
+ /** Get a short-circuit unavailable result for a provider. */
20
+ shortCircuit(provider) {
21
+ return {
22
+ status: "unavailable",
23
+ reason: "provider_circuit_open",
24
+ provider,
25
+ };
26
+ }
27
+ /** Reset failure count for a provider. */
28
+ reset(provider) {
29
+ this.failures.delete(provider);
30
+ }
31
+ /** Reset all tracked failures. */
32
+ resetAll() {
33
+ this.failures.clear();
34
+ }
35
+ }
36
+ //# sourceMappingURL=provider-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-tracker.js","sourceRoot":"","sources":["../../src/runtime/provider-tracker.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,eAAe;IAGG;IAFZ,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEtD,YAA6B,cAAsB,CAAC;QAAvB,gBAAW,GAAX,WAAW,CAAY;IAAG,CAAC;IAExD,uCAAuC;IACvC,aAAa,CAAC,QAAgB;QAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,sEAAsE;IACtE,aAAa,CAAC,QAAgB;QAC5B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC;IAChE,CAAC;IAED,6DAA6D;IAC7D,YAAY,CAAI,QAAgB;QAC9B,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,uBAAuB;YAC/B,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,KAAK,CAAC,QAAgB;QACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,kCAAkC;IAClC,QAAQ;QACN,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -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,48 @@
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
+ forceFinancePrompt?: boolean;
33
+ }): Promise<"ready" | "shutdown" | "cancelled">;
34
+ /** Extract and persist user preferences from natural language. */
35
+ extractAndStorePreferences(text: string): void;
36
+ /** Record a workflow run in storage. */
37
+ recordWorkflowRun(workflowType: string, entities: object, resolved: object, defaultsUsed: unknown[]): void;
38
+ /** Build system prompt using composable sections. */
39
+ buildSystemPrompt(basePrompt: string, workflowType?: string): string;
40
+ /**
41
+ * Execute a workflow definition through the WorkflowRunner,
42
+ * sending prompts via Pi with settlement-based sequencing.
43
+ */
44
+ executeWorkflow(pi: ExtensionAPI, definition: WorkflowDefinition, ctx: QueueContext): void;
45
+ /** Cancel any active workflow. */
46
+ cancelActiveWorkflow(): void;
47
+ }
48
+ 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[];