opencandle 0.1.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 (228) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/analysts/orchestrator.d.ts +9 -0
  4. package/dist/analysts/orchestrator.js +100 -0
  5. package/dist/analysts/orchestrator.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +122 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/config.d.ts +24 -0
  10. package/dist/config.js +76 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/index.d.ts +5 -0
  13. package/dist/index.js +6 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/infra/browser.d.ts +27 -0
  16. package/dist/infra/browser.js +102 -0
  17. package/dist/infra/browser.js.map +1 -0
  18. package/dist/infra/cache.d.ts +18 -0
  19. package/dist/infra/cache.js +42 -0
  20. package/dist/infra/cache.js.map +1 -0
  21. package/dist/infra/http-client.d.ts +13 -0
  22. package/dist/infra/http-client.js +54 -0
  23. package/dist/infra/http-client.js.map +1 -0
  24. package/dist/infra/index.d.ts +5 -0
  25. package/dist/infra/index.js +6 -0
  26. package/dist/infra/index.js.map +1 -0
  27. package/dist/infra/open-url.d.ts +1 -0
  28. package/dist/infra/open-url.js +29 -0
  29. package/dist/infra/open-url.js.map +1 -0
  30. package/dist/infra/opencandle-paths.d.ts +11 -0
  31. package/dist/infra/opencandle-paths.js +48 -0
  32. package/dist/infra/opencandle-paths.js.map +1 -0
  33. package/dist/infra/rate-limiter.d.ts +7 -0
  34. package/dist/infra/rate-limiter.js +38 -0
  35. package/dist/infra/rate-limiter.js.map +1 -0
  36. package/dist/memory/index.d.ts +5 -0
  37. package/dist/memory/index.js +5 -0
  38. package/dist/memory/index.js.map +1 -0
  39. package/dist/memory/preference-extractor.d.ts +6 -0
  40. package/dist/memory/preference-extractor.js +88 -0
  41. package/dist/memory/preference-extractor.js.map +1 -0
  42. package/dist/memory/retrieval.d.ts +8 -0
  43. package/dist/memory/retrieval.js +61 -0
  44. package/dist/memory/retrieval.js.map +1 -0
  45. package/dist/memory/sqlite.d.ts +5 -0
  46. package/dist/memory/sqlite.js +95 -0
  47. package/dist/memory/sqlite.js.map +1 -0
  48. package/dist/memory/storage.d.ts +47 -0
  49. package/dist/memory/storage.js +124 -0
  50. package/dist/memory/storage.js.map +1 -0
  51. package/dist/onboarding/state.d.ts +8 -0
  52. package/dist/onboarding/state.js +31 -0
  53. package/dist/onboarding/state.js.map +1 -0
  54. package/dist/pi/opencandle-extension.d.ts +2 -0
  55. package/dist/pi/opencandle-extension.js +205 -0
  56. package/dist/pi/opencandle-extension.js.map +1 -0
  57. package/dist/pi/session.d.ts +10 -0
  58. package/dist/pi/session.js +28 -0
  59. package/dist/pi/session.js.map +1 -0
  60. package/dist/pi/setup.d.ts +10 -0
  61. package/dist/pi/setup.js +357 -0
  62. package/dist/pi/setup.js.map +1 -0
  63. package/dist/pi/tool-adapter.d.ts +5 -0
  64. package/dist/pi/tool-adapter.js +17 -0
  65. package/dist/pi/tool-adapter.js.map +1 -0
  66. package/dist/prompts/workflow-prompts.d.ts +9 -0
  67. package/dist/prompts/workflow-prompts.js +202 -0
  68. package/dist/prompts/workflow-prompts.js.map +1 -0
  69. package/dist/providers/alpha-vantage.d.ts +4 -0
  70. package/dist/providers/alpha-vantage.js +122 -0
  71. package/dist/providers/alpha-vantage.js.map +1 -0
  72. package/dist/providers/coingecko.d.ts +3 -0
  73. package/dist/providers/coingecko.js +53 -0
  74. package/dist/providers/coingecko.js.map +1 -0
  75. package/dist/providers/fear-greed.d.ts +2 -0
  76. package/dist/providers/fear-greed.js +26 -0
  77. package/dist/providers/fear-greed.js.map +1 -0
  78. package/dist/providers/fred.d.ts +2 -0
  79. package/dist/providers/fred.js +37 -0
  80. package/dist/providers/fred.js.map +1 -0
  81. package/dist/providers/index.d.ts +7 -0
  82. package/dist/providers/index.js +8 -0
  83. package/dist/providers/index.js.map +1 -0
  84. package/dist/providers/reddit.d.ts +9 -0
  85. package/dist/providers/reddit.js +69 -0
  86. package/dist/providers/reddit.js.map +1 -0
  87. package/dist/providers/sec-edgar.d.ts +9 -0
  88. package/dist/providers/sec-edgar.js +59 -0
  89. package/dist/providers/sec-edgar.js.map +1 -0
  90. package/dist/providers/yahoo-finance.d.ts +17 -0
  91. package/dist/providers/yahoo-finance.js +231 -0
  92. package/dist/providers/yahoo-finance.js.map +1 -0
  93. package/dist/routing/classify-intent.d.ts +2 -0
  94. package/dist/routing/classify-intent.js +147 -0
  95. package/dist/routing/classify-intent.js.map +1 -0
  96. package/dist/routing/defaults.d.ts +7 -0
  97. package/dist/routing/defaults.js +26 -0
  98. package/dist/routing/defaults.js.map +1 -0
  99. package/dist/routing/entity-extractor.d.ts +3 -0
  100. package/dist/routing/entity-extractor.js +130 -0
  101. package/dist/routing/entity-extractor.js.map +1 -0
  102. package/dist/routing/index.d.ts +5 -0
  103. package/dist/routing/index.js +5 -0
  104. package/dist/routing/index.js.map +1 -0
  105. package/dist/routing/slot-resolver.d.ts +15 -0
  106. package/dist/routing/slot-resolver.js +120 -0
  107. package/dist/routing/slot-resolver.js.map +1 -0
  108. package/dist/routing/types.d.ts +51 -0
  109. package/dist/routing/types.js +2 -0
  110. package/dist/routing/types.js.map +1 -0
  111. package/dist/system-prompt.d.ts +1 -0
  112. package/dist/system-prompt.js +49 -0
  113. package/dist/system-prompt.js.map +1 -0
  114. package/dist/tool-kit.d.ts +19 -0
  115. package/dist/tool-kit.js +20 -0
  116. package/dist/tool-kit.js.map +1 -0
  117. package/dist/tools/fundamentals/company-overview.d.ts +7 -0
  118. package/dist/tools/fundamentals/company-overview.js +40 -0
  119. package/dist/tools/fundamentals/company-overview.js.map +1 -0
  120. package/dist/tools/fundamentals/comps.d.ts +22 -0
  121. package/dist/tools/fundamentals/comps.js +110 -0
  122. package/dist/tools/fundamentals/comps.js.map +1 -0
  123. package/dist/tools/fundamentals/dcf.d.ts +46 -0
  124. package/dist/tools/fundamentals/dcf.js +184 -0
  125. package/dist/tools/fundamentals/dcf.js.map +1 -0
  126. package/dist/tools/fundamentals/earnings.d.ts +7 -0
  127. package/dist/tools/fundamentals/earnings.js +33 -0
  128. package/dist/tools/fundamentals/earnings.js.map +1 -0
  129. package/dist/tools/fundamentals/financials.d.ts +7 -0
  130. package/dist/tools/fundamentals/financials.js +37 -0
  131. package/dist/tools/fundamentals/financials.js.map +1 -0
  132. package/dist/tools/fundamentals/sec-filings.d.ts +8 -0
  133. package/dist/tools/fundamentals/sec-filings.js +40 -0
  134. package/dist/tools/fundamentals/sec-filings.js.map +1 -0
  135. package/dist/tools/index.d.ts +2 -0
  136. package/dist/tools/index.js +51 -0
  137. package/dist/tools/index.js.map +1 -0
  138. package/dist/tools/macro/fear-greed.d.ts +5 -0
  139. package/dist/tools/macro/fear-greed.js +26 -0
  140. package/dist/tools/macro/fear-greed.js.map +1 -0
  141. package/dist/tools/macro/fred-data.d.ts +8 -0
  142. package/dist/tools/macro/fred-data.js +34 -0
  143. package/dist/tools/macro/fred-data.js.map +1 -0
  144. package/dist/tools/market/crypto-history.d.ts +8 -0
  145. package/dist/tools/market/crypto-history.js +32 -0
  146. package/dist/tools/market/crypto-history.js.map +1 -0
  147. package/dist/tools/market/crypto-price.d.ts +7 -0
  148. package/dist/tools/market/crypto-price.js +42 -0
  149. package/dist/tools/market/crypto-price.js.map +1 -0
  150. package/dist/tools/market/search-ticker.d.ts +6 -0
  151. package/dist/tools/market/search-ticker.js +33 -0
  152. package/dist/tools/market/search-ticker.js.map +1 -0
  153. package/dist/tools/market/stock-history.d.ts +9 -0
  154. package/dist/tools/market/stock-history.js +35 -0
  155. package/dist/tools/market/stock-history.js.map +1 -0
  156. package/dist/tools/market/stock-quote.d.ts +7 -0
  157. package/dist/tools/market/stock-quote.js +32 -0
  158. package/dist/tools/market/stock-quote.js.map +1 -0
  159. package/dist/tools/options/greeks.d.ts +14 -0
  160. package/dist/tools/options/greeks.js +65 -0
  161. package/dist/tools/options/greeks.js.map +1 -0
  162. package/dist/tools/options/option-chain.d.ts +9 -0
  163. package/dist/tools/options/option-chain.js +61 -0
  164. package/dist/tools/options/option-chain.js.map +1 -0
  165. package/dist/tools/portfolio/correlation.d.ts +10 -0
  166. package/dist/tools/portfolio/correlation.js +122 -0
  167. package/dist/tools/portfolio/correlation.js.map +1 -0
  168. package/dist/tools/portfolio/predictions.d.ts +49 -0
  169. package/dist/tools/portfolio/predictions.js +171 -0
  170. package/dist/tools/portfolio/predictions.js.map +1 -0
  171. package/dist/tools/portfolio/risk-analysis.d.ts +12 -0
  172. package/dist/tools/portfolio/risk-analysis.js +113 -0
  173. package/dist/tools/portfolio/risk-analysis.js.map +1 -0
  174. package/dist/tools/portfolio/tracker.d.ts +10 -0
  175. package/dist/tools/portfolio/tracker.js +125 -0
  176. package/dist/tools/portfolio/tracker.js.map +1 -0
  177. package/dist/tools/portfolio/watchlist.d.ts +10 -0
  178. package/dist/tools/portfolio/watchlist.js +120 -0
  179. package/dist/tools/portfolio/watchlist.js.map +1 -0
  180. package/dist/tools/sentiment/news-sentiment.d.ts +7 -0
  181. package/dist/tools/sentiment/news-sentiment.js +57 -0
  182. package/dist/tools/sentiment/news-sentiment.js.map +1 -0
  183. package/dist/tools/sentiment/reddit-sentiment.d.ts +8 -0
  184. package/dist/tools/sentiment/reddit-sentiment.js +37 -0
  185. package/dist/tools/sentiment/reddit-sentiment.js.map +1 -0
  186. package/dist/tools/technical/backtest.d.ts +26 -0
  187. package/dist/tools/technical/backtest.js +190 -0
  188. package/dist/tools/technical/backtest.js.map +1 -0
  189. package/dist/tools/technical/indicators.d.ts +23 -0
  190. package/dist/tools/technical/indicators.js +212 -0
  191. package/dist/tools/technical/indicators.js.map +1 -0
  192. package/dist/types/fundamentals.d.ts +44 -0
  193. package/dist/types/fundamentals.js +2 -0
  194. package/dist/types/fundamentals.js.map +1 -0
  195. package/dist/types/index.d.ts +7 -0
  196. package/dist/types/index.js +2 -0
  197. package/dist/types/index.js.map +1 -0
  198. package/dist/types/macro.d.ts +24 -0
  199. package/dist/types/macro.js +14 -0
  200. package/dist/types/macro.js.map +1 -0
  201. package/dist/types/market.d.ts +41 -0
  202. package/dist/types/market.js +2 -0
  203. package/dist/types/market.js.map +1 -0
  204. package/dist/types/options.d.ts +33 -0
  205. package/dist/types/options.js +2 -0
  206. package/dist/types/options.js.map +1 -0
  207. package/dist/types/portfolio.d.ts +44 -0
  208. package/dist/types/portfolio.js +2 -0
  209. package/dist/types/portfolio.js.map +1 -0
  210. package/dist/types/sentiment.d.ts +24 -0
  211. package/dist/types/sentiment.js +2 -0
  212. package/dist/types/sentiment.js.map +1 -0
  213. package/dist/workflows/compare-assets.d.ts +3 -0
  214. package/dist/workflows/compare-assets.js +14 -0
  215. package/dist/workflows/compare-assets.js.map +1 -0
  216. package/dist/workflows/index.d.ts +4 -0
  217. package/dist/workflows/index.js +4 -0
  218. package/dist/workflows/index.js.map +1 -0
  219. package/dist/workflows/options-screener.d.ts +3 -0
  220. package/dist/workflows/options-screener.js +22 -0
  221. package/dist/workflows/options-screener.js.map +1 -0
  222. package/dist/workflows/portfolio-builder.d.ts +3 -0
  223. package/dist/workflows/portfolio-builder.js +26 -0
  224. package/dist/workflows/portfolio-builder.js.map +1 -0
  225. package/dist/workflows/types.d.ts +4 -0
  226. package/dist/workflows/types.js +2 -0
  227. package/dist/workflows/types.js.map +1 -0
  228. package/package.json +97 -0
@@ -0,0 +1,95 @@
1
+ import { mkdirSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import Database from "better-sqlite3";
4
+ import { getStateDbPath } from "../infra/opencandle-paths.js";
5
+ const CURRENT_SCHEMA_VERSION = 1;
6
+ const CURRENT_SCHEMA = `
7
+ CREATE TABLE IF NOT EXISTS schema_version (
8
+ version INTEGER NOT NULL
9
+ );
10
+
11
+ CREATE TABLE IF NOT EXISTS user_preferences (
12
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
13
+ namespace TEXT NOT NULL DEFAULT 'global',
14
+ key TEXT NOT NULL,
15
+ value_json TEXT NOT NULL,
16
+ confidence TEXT DEFAULT 'medium',
17
+ source TEXT DEFAULT 'explicit',
18
+ created_at TEXT NOT NULL,
19
+ updated_at TEXT NOT NULL,
20
+ UNIQUE(namespace, key)
21
+ );
22
+
23
+ CREATE TABLE IF NOT EXISTS workflow_runs (
24
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
25
+ session_id TEXT NOT NULL,
26
+ workflow_type TEXT NOT NULL,
27
+ input_slots_json TEXT,
28
+ resolved_slots_json TEXT,
29
+ defaults_used_json TEXT,
30
+ output_summary TEXT,
31
+ created_at TEXT NOT NULL
32
+ );
33
+
34
+ CREATE TABLE IF NOT EXISTS recommendations (
35
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
36
+ workflow_run_id INTEGER NOT NULL,
37
+ recommendation_type TEXT NOT NULL,
38
+ symbol TEXT,
39
+ payload_json TEXT,
40
+ created_at TEXT NOT NULL,
41
+ FOREIGN KEY (workflow_run_id) REFERENCES workflow_runs(id)
42
+ );
43
+ `;
44
+ export function initDatabase(path) {
45
+ if (path !== ":memory:") {
46
+ mkdirSync(dirname(path), { recursive: true });
47
+ }
48
+ const db = new Database(path);
49
+ db.pragma("journal_mode = WAL");
50
+ db.pragma("foreign_keys = ON");
51
+ ensureCurrentSchema(db);
52
+ return db;
53
+ }
54
+ export function initDefaultDatabase() {
55
+ return initDatabase(getStateDbPath());
56
+ }
57
+ function ensureCurrentSchema(db) {
58
+ const currentVersion = readSchemaVersion(db);
59
+ if (currentVersion !== CURRENT_SCHEMA_VERSION) {
60
+ resetSchema(db);
61
+ return;
62
+ }
63
+ db.exec(CURRENT_SCHEMA);
64
+ }
65
+ function readSchemaVersion(db) {
66
+ const table = db
67
+ .prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'schema_version'")
68
+ .get();
69
+ if (!table) {
70
+ return null;
71
+ }
72
+ const row = db.prepare("SELECT version FROM schema_version LIMIT 1").get();
73
+ return row?.version ?? null;
74
+ }
75
+ function resetSchema(db) {
76
+ db.exec(`
77
+ DROP TABLE IF EXISTS recommendations;
78
+ DROP TABLE IF EXISTS workflow_runs;
79
+ DROP TABLE IF EXISTS user_preferences;
80
+ DROP TABLE IF EXISTS schema_version;
81
+ `);
82
+ db.exec(CURRENT_SCHEMA);
83
+ db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(CURRENT_SCHEMA_VERSION);
84
+ }
85
+ export function getTableNames(db) {
86
+ const rows = db
87
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name")
88
+ .all();
89
+ return rows.map((r) => r.name);
90
+ }
91
+ export function getSchemaVersion(db) {
92
+ const row = db.prepare("SELECT version FROM schema_version LIMIT 1").get();
93
+ return row?.version ?? 0;
94
+ }
95
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/memory/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCtB,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAExB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAqB;IAChD,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,cAAc,KAAK,sBAAsB,EAAE,CAAC;QAC9C,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAqB;IAC9C,MAAM,KAAK,GAAG,EAAE;SACb,OAAO,CAAC,iFAAiF,CAAC;SAC1F,GAAG,EAAkC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAE3D,CAAC;IACd,OAAO,GAAG,EAAE,OAAO,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,SAAS,WAAW,CAAC,EAAqB;IACxC,EAAE,CAAC,IAAI,CAAC;;;;;GAKP,CAAC,CAAC;IACH,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxB,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,iEAAiE,CAAC;SAC1E,GAAG,EAA6B,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAqB;IACpD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAE3D,CAAC;IACd,OAAO,GAAG,EAAE,OAAO,IAAI,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type Database from "better-sqlite3";
2
+ interface PreferenceInput {
3
+ namespace?: string;
4
+ key: string;
5
+ valueJson: string;
6
+ confidence?: string;
7
+ source?: string;
8
+ }
9
+ export interface WorkflowPreferences {
10
+ riskProfile?: string;
11
+ timeHorizon?: string;
12
+ assetScope?: string;
13
+ positionCount?: number;
14
+ maxSinglePositionPct?: number;
15
+ dteTarget?: string;
16
+ objective?: string;
17
+ moneynessPreference?: string;
18
+ liquidityMinimum?: string;
19
+ }
20
+ interface WorkflowRunInput {
21
+ sessionId: string;
22
+ workflowType: string;
23
+ inputSlotsJson: string;
24
+ resolvedSlotsJson: string;
25
+ defaultsUsedJson: string;
26
+ outputSummary?: string;
27
+ }
28
+ interface RecommendationInput {
29
+ workflowRunId: number;
30
+ recommendationType: string;
31
+ symbol?: string;
32
+ payloadJson?: string;
33
+ }
34
+ export declare class MemoryStorage {
35
+ private readonly db;
36
+ constructor(db: Database.Database);
37
+ upsertPreference(input: PreferenceInput): void;
38
+ getPreference(namespace: string, key: string): Record<string, string | number | null> | null;
39
+ getPreferencesByNamespace(namespace: string): Array<Record<string, string | number | null>>;
40
+ getWorkflowPreferences(namespace?: string): WorkflowPreferences;
41
+ insertWorkflowRun(input: WorkflowRunInput): number;
42
+ getRecentWorkflowRuns(limit: number): Array<Record<string, string | number | null>>;
43
+ updateWorkflowRunOutputSummary(workflowRunId: number, outputSummary: string): void;
44
+ insertRecommendation(input: RecommendationInput): number;
45
+ getRecommendationsByRun(workflowRunId: number): Array<Record<string, string | number | null>>;
46
+ }
47
+ export {};
@@ -0,0 +1,124 @@
1
+ export class MemoryStorage {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ // --- Preferences ---
7
+ upsertPreference(input) {
8
+ const now = new Date().toISOString();
9
+ const ns = input.namespace ?? "global";
10
+ const confidence = input.confidence ?? "medium";
11
+ const source = input.source ?? "explicit";
12
+ this.db
13
+ .prepare(`INSERT INTO user_preferences (namespace, key, value_json, confidence, source, created_at, updated_at)
14
+ VALUES (?, ?, ?, ?, ?, ?, ?)
15
+ ON CONFLICT(namespace, key) DO UPDATE SET
16
+ value_json = excluded.value_json,
17
+ confidence = excluded.confidence,
18
+ source = excluded.source,
19
+ updated_at = excluded.updated_at`)
20
+ .run(ns, input.key, input.valueJson, confidence, source, now, now);
21
+ }
22
+ getPreference(namespace, key) {
23
+ return (this.db
24
+ .prepare("SELECT * FROM user_preferences WHERE namespace = ? AND key = ?")
25
+ .get(namespace, key) ?? null);
26
+ }
27
+ getPreferencesByNamespace(namespace) {
28
+ return this.db
29
+ .prepare("SELECT * FROM user_preferences WHERE namespace = ?")
30
+ .all(namespace);
31
+ }
32
+ getWorkflowPreferences(namespace = "global") {
33
+ const prefs = this.getPreferencesByNamespace(namespace);
34
+ const out = {};
35
+ for (const pref of prefs) {
36
+ const key = String(pref.key);
37
+ const raw = pref.value_json == null ? undefined : safeParseJson(String(pref.value_json));
38
+ switch (key) {
39
+ case "risk_profile":
40
+ if (typeof raw === "string")
41
+ out.riskProfile = raw;
42
+ break;
43
+ case "time_horizon":
44
+ if (typeof raw === "string")
45
+ out.timeHorizon = raw;
46
+ break;
47
+ case "asset_scope":
48
+ if (typeof raw === "string")
49
+ out.assetScope = raw;
50
+ break;
51
+ case "position_count":
52
+ if (typeof raw === "number")
53
+ out.positionCount = raw;
54
+ break;
55
+ case "max_single_position_pct":
56
+ if (typeof raw === "number")
57
+ out.maxSinglePositionPct = raw;
58
+ break;
59
+ case "dte_target":
60
+ if (typeof raw === "string")
61
+ out.dteTarget = raw;
62
+ break;
63
+ case "objective":
64
+ if (typeof raw === "string")
65
+ out.objective = raw;
66
+ break;
67
+ case "moneyness_preference":
68
+ if (typeof raw === "string")
69
+ out.moneynessPreference = raw;
70
+ break;
71
+ case "options_liquidity":
72
+ case "liquidity_minimum":
73
+ if (typeof raw === "string") {
74
+ out.liquidityMinimum =
75
+ raw === "high" ? "high_open_interest_and_tight_spread" : raw;
76
+ }
77
+ break;
78
+ }
79
+ }
80
+ return out;
81
+ }
82
+ // --- Workflow Runs ---
83
+ insertWorkflowRun(input) {
84
+ const now = new Date().toISOString();
85
+ const result = this.db
86
+ .prepare(`INSERT INTO workflow_runs (session_id, workflow_type, input_slots_json, resolved_slots_json, defaults_used_json, output_summary, created_at)
87
+ VALUES (?, ?, ?, ?, ?, ?, ?)`)
88
+ .run(input.sessionId, input.workflowType, input.inputSlotsJson, input.resolvedSlotsJson, input.defaultsUsedJson, input.outputSummary ?? null, now);
89
+ return Number(result.lastInsertRowid);
90
+ }
91
+ getRecentWorkflowRuns(limit) {
92
+ return this.db
93
+ .prepare("SELECT * FROM workflow_runs ORDER BY id DESC LIMIT ?")
94
+ .all(limit);
95
+ }
96
+ updateWorkflowRunOutputSummary(workflowRunId, outputSummary) {
97
+ this.db
98
+ .prepare("UPDATE workflow_runs SET output_summary = ? WHERE id = ?")
99
+ .run(outputSummary, workflowRunId);
100
+ }
101
+ // --- Recommendations ---
102
+ insertRecommendation(input) {
103
+ const now = new Date().toISOString();
104
+ const result = this.db
105
+ .prepare(`INSERT INTO recommendations (workflow_run_id, recommendation_type, symbol, payload_json, created_at)
106
+ VALUES (?, ?, ?, ?, ?)`)
107
+ .run(input.workflowRunId, input.recommendationType, input.symbol ?? null, input.payloadJson ?? null, now);
108
+ return Number(result.lastInsertRowid);
109
+ }
110
+ getRecommendationsByRun(workflowRunId) {
111
+ return this.db
112
+ .prepare("SELECT * FROM recommendations WHERE workflow_run_id = ? ORDER BY id")
113
+ .all(workflowRunId);
114
+ }
115
+ }
116
+ function safeParseJson(json) {
117
+ try {
118
+ return JSON.parse(json);
119
+ }
120
+ catch {
121
+ return json;
122
+ }
123
+ }
124
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/memory/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const ONBOARDING_VERSION = 1;
2
+ export interface OnboardingState {
3
+ version: number;
4
+ financeSetupStatus?: "dismissed" | "completed";
5
+ }
6
+ export declare function getDefaultOnboardingState(): OnboardingState;
7
+ export declare function loadOnboardingState(path?: string): OnboardingState;
8
+ export declare function saveOnboardingState(state: OnboardingState, path?: string): void;
@@ -0,0 +1,31 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { ensureParentDir, getOnboardingPath } from "../infra/opencandle-paths.js";
3
+ export const ONBOARDING_VERSION = 1;
4
+ export function getDefaultOnboardingState() {
5
+ return { version: ONBOARDING_VERSION };
6
+ }
7
+ export function loadOnboardingState(path = getOnboardingPath()) {
8
+ if (!existsSync(path)) {
9
+ return getDefaultOnboardingState();
10
+ }
11
+ try {
12
+ const parsed = JSON.parse(readFileSync(path, "utf-8"));
13
+ if (!parsed || typeof parsed !== "object") {
14
+ return getDefaultOnboardingState();
15
+ }
16
+ return {
17
+ version: typeof parsed.version === "number" ? parsed.version : ONBOARDING_VERSION,
18
+ financeSetupStatus: parsed.financeSetupStatus === "completed" || parsed.financeSetupStatus === "dismissed"
19
+ ? parsed.financeSetupStatus
20
+ : undefined,
21
+ };
22
+ }
23
+ catch {
24
+ return getDefaultOnboardingState();
25
+ }
26
+ }
27
+ export function saveOnboardingState(state, path = getOnboardingPath()) {
28
+ ensureParentDir(path);
29
+ writeFileSync(path, `${JSON.stringify(state, null, 2)}\n`, "utf-8");
30
+ }
31
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/onboarding/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAElF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAOpC,MAAM,UAAU,yBAAyB;IACvC,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAI,GAAG,iBAAiB,EAAE;IAC5D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,yBAAyB,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAoB,CAAC;QAC1E,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,yBAAyB,EAAE,CAAC;QACrC,CAAC;QACD,OAAO;YACL,OAAO,EAAE,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB;YACjF,kBAAkB,EAChB,MAAM,CAAC,kBAAkB,KAAK,WAAW,IAAI,MAAM,CAAC,kBAAkB,KAAK,WAAW;gBACpF,CAAC,CAAC,MAAM,CAAC,kBAAkB;gBAC3B,CAAC,CAAC,SAAS;SAChB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,yBAAyB,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAsB,EAAE,IAAI,GAAG,iBAAiB,EAAE;IACpF,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
2
+ export default function openCandleExtension(pi: ExtensionAPI): void;
@@ -0,0 +1,205 @@
1
+ import { buildSystemPrompt } from "../system-prompt.js";
2
+ import { getComprehensiveAnalysisPrompts, isAnalysisRequest, normalizeSymbol, } from "../analysts/orchestrator.js";
3
+ import { classifyIntent, resolveOptionsScreenerSlots, resolvePortfolioSlots } from "../routing/index.js";
4
+ import { buildCompareAssetsWorkflow, buildOptionsScreenerWorkflow, buildPortfolioWorkflow } from "../workflows/index.js";
5
+ import { getOpenCandleToolDefinitions } from "./tool-adapter.js";
6
+ import { getThirdPartyToolDescriptions } from "../tool-kit.js";
7
+ import { runOpenCandleSetup } from "./setup.js";
8
+ import { initDefaultDatabase, MemoryStorage, buildMemoryContext, extractPreferences } from "../memory/index.js";
9
+ const PROMPT_SETTLE_POLL_MS = 25;
10
+ const IMMEDIATE_IDLE_GRACE_MS = 100;
11
+ function hasPendingMessages(ctx) {
12
+ return ctx.hasPendingMessages?.() ?? false;
13
+ }
14
+ function isReadyForNextPrompt(ctx) {
15
+ return ctx.isIdle() && !hasPendingMessages(ctx);
16
+ }
17
+ function sleep(ms) {
18
+ return new Promise((resolve) => setTimeout(resolve, ms));
19
+ }
20
+ async function waitForPromptSettlement(ctx, isCurrentSequence) {
21
+ let sawBusyOrPending = !isReadyForNextPrompt(ctx);
22
+ const startedAt = Date.now();
23
+ while (isCurrentSequence()) {
24
+ const ready = isReadyForNextPrompt(ctx);
25
+ if (!ready) {
26
+ sawBusyOrPending = true;
27
+ }
28
+ if (sawBusyOrPending && ready) {
29
+ return true;
30
+ }
31
+ if (!sawBusyOrPending && ready && Date.now() - startedAt >= IMMEDIATE_IDLE_GRACE_MS) {
32
+ return true;
33
+ }
34
+ await sleep(PROMPT_SETTLE_POLL_MS);
35
+ }
36
+ return false;
37
+ }
38
+ function queuePromptSequence(pi, prompts, ctx, beginSequence, isCurrentSequence) {
39
+ if (prompts.length === 0)
40
+ return;
41
+ const [initialPrompt, ...followUps] = prompts;
42
+ const sequenceId = beginSequence();
43
+ const startedBusy = !isReadyForNextPrompt(ctx);
44
+ if (startedBusy) {
45
+ pi.sendUserMessage(initialPrompt, { deliverAs: "followUp" });
46
+ ctx.ui?.notify?.("Analysis queued as follow-up.", "info");
47
+ }
48
+ else {
49
+ pi.sendUserMessage(initialPrompt);
50
+ }
51
+ // Submit workflow prompts one turn at a time so a newer workflow can cancel
52
+ // the remaining prompts before they are handed to Pi's internal follow-up queue.
53
+ void (async () => {
54
+ for (const prompt of followUps) {
55
+ const settled = await waitForPromptSettlement(ctx, () => isCurrentSequence(sequenceId));
56
+ if (!settled || !isCurrentSequence(sequenceId)) {
57
+ return;
58
+ }
59
+ pi.sendUserMessage(prompt);
60
+ }
61
+ })();
62
+ }
63
+ function queueComprehensiveAnalysis(pi, symbol, ctx, beginSequence, isCurrentSequence) {
64
+ queuePromptSequence(pi, getComprehensiveAnalysisPrompts(symbol), ctx, beginSequence, isCurrentSequence);
65
+ }
66
+ function queueCompareWorkflow(pi, symbols, ctx, beginSequence, isCurrentSequence) {
67
+ const resolution = {
68
+ resolved: { symbols },
69
+ sources: { symbols: "user" },
70
+ defaultsUsed: [],
71
+ missingRequired: [],
72
+ };
73
+ const workflow = buildCompareAssetsWorkflow(resolution);
74
+ queuePromptSequence(pi, [workflow.initialPrompt, ...workflow.followUps], ctx, beginSequence, isCurrentSequence);
75
+ }
76
+ export default function openCandleExtension(pi) {
77
+ let activeSequenceId = 0;
78
+ let storage = null;
79
+ let sessionId = "unknown";
80
+ const beginSequence = () => {
81
+ activeSequenceId += 1;
82
+ return activeSequenceId;
83
+ };
84
+ const isCurrentSequence = (sequenceId) => sequenceId === activeSequenceId;
85
+ for (const tool of getOpenCandleToolDefinitions()) {
86
+ pi.registerTool(tool);
87
+ }
88
+ pi.registerCommand("analyze", {
89
+ description: "Run the multi-analyst OpenCandle workflow for a ticker symbol",
90
+ handler: async (args, ctx) => {
91
+ const symbol = normalizeSymbol(args);
92
+ if (!symbol) {
93
+ ctx.ui.notify("Usage: /analyze <ticker>", "warning");
94
+ return;
95
+ }
96
+ queueComprehensiveAnalysis(pi, symbol, ctx, beginSequence, isCurrentSequence);
97
+ },
98
+ });
99
+ pi.registerCommand("setup", {
100
+ description: "Run OpenCandle setup for your AI model and market data providers",
101
+ handler: async (_args, ctx) => {
102
+ const result = await runOpenCandleSetup(pi, ctx, { mode: "manual", forceFinancePrompt: true });
103
+ if (result === "ready") {
104
+ ctx.ui.notify("OpenCandle setup complete.", "info");
105
+ }
106
+ },
107
+ });
108
+ pi.on("session_start", async (_event, ctx) => {
109
+ const db = initDefaultDatabase();
110
+ storage = new MemoryStorage(db);
111
+ sessionId = ctx.sessionManager.getSessionId();
112
+ if (!ctx.hasUI)
113
+ return;
114
+ const result = await runOpenCandleSetup(pi, ctx, { mode: "startup" });
115
+ if (result === "shutdown") {
116
+ return;
117
+ }
118
+ ctx.ui.notify("OpenCandle finance mode. Try /analyze NVDA or ask for quotes, options, macro, or portfolio analysis.", "info");
119
+ });
120
+ pi.on("input", async (event, ctx) => {
121
+ if (event.source === "extension")
122
+ return;
123
+ // Extract and persist user preferences from natural language
124
+ if (storage) {
125
+ for (const pref of extractPreferences(event.text)) {
126
+ storage.upsertPreference({
127
+ key: pref.key,
128
+ valueJson: JSON.stringify(pref.value),
129
+ confidence: pref.confidence,
130
+ source: "inferred",
131
+ });
132
+ }
133
+ }
134
+ const workflowPrefs = storage?.getWorkflowPreferences("global") ?? {};
135
+ const analysis = isAnalysisRequest(event.text);
136
+ if (analysis.match && analysis.symbol) {
137
+ queueComprehensiveAnalysis(pi, analysis.symbol, ctx, beginSequence, isCurrentSequence);
138
+ return { action: "handled" };
139
+ }
140
+ const classification = classifyIntent(event.text);
141
+ if (classification.workflow === "portfolio_builder") {
142
+ const resolution = resolvePortfolioSlots(classification.entities, workflowPrefs);
143
+ const workflow = buildPortfolioWorkflow(resolution);
144
+ if (storage) {
145
+ storage.insertWorkflowRun({
146
+ sessionId,
147
+ workflowType: "portfolio_builder",
148
+ inputSlotsJson: JSON.stringify(classification.entities),
149
+ resolvedSlotsJson: JSON.stringify(resolution.resolved),
150
+ defaultsUsedJson: JSON.stringify(resolution.defaultsUsed),
151
+ });
152
+ }
153
+ pi.appendEntry("opencandle-workflow", { workflow: "portfolio_builder", entities: classification.entities, resolved: resolution.resolved });
154
+ queuePromptSequence(pi, [workflow.initialPrompt, ...workflow.followUps], ctx, beginSequence, isCurrentSequence);
155
+ return { action: "handled" };
156
+ }
157
+ if (classification.workflow === "options_screener") {
158
+ const resolution = resolveOptionsScreenerSlots(classification.entities, workflowPrefs);
159
+ if (resolution.missingRequired.length === 0) {
160
+ const workflow = buildOptionsScreenerWorkflow(resolution);
161
+ if (storage) {
162
+ storage.insertWorkflowRun({
163
+ sessionId,
164
+ workflowType: "options_screener",
165
+ inputSlotsJson: JSON.stringify(classification.entities),
166
+ resolvedSlotsJson: JSON.stringify(resolution.resolved),
167
+ defaultsUsedJson: JSON.stringify(resolution.defaultsUsed),
168
+ });
169
+ }
170
+ pi.appendEntry("opencandle-workflow", { workflow: "options_screener", entities: classification.entities, resolved: resolution.resolved });
171
+ queuePromptSequence(pi, [workflow.initialPrompt, ...workflow.followUps], ctx, beginSequence, isCurrentSequence);
172
+ return { action: "handled" };
173
+ }
174
+ }
175
+ if (classification.workflow === "compare_assets" && classification.entities.symbols.length >= 2) {
176
+ if (storage) {
177
+ storage.insertWorkflowRun({
178
+ sessionId,
179
+ workflowType: "compare_assets",
180
+ inputSlotsJson: JSON.stringify(classification.entities),
181
+ resolvedSlotsJson: JSON.stringify({ symbols: classification.entities.symbols }),
182
+ defaultsUsedJson: JSON.stringify([]),
183
+ });
184
+ }
185
+ pi.appendEntry("opencandle-workflow", { workflow: "compare_assets", symbols: classification.entities.symbols });
186
+ queueCompareWorkflow(pi, classification.entities.symbols, ctx, beginSequence, isCurrentSequence);
187
+ return { action: "handled" };
188
+ }
189
+ });
190
+ pi.on("before_agent_start", async (event) => {
191
+ const memoryContext = storage ? buildMemoryContext(storage) : "";
192
+ let thirdPartySection = "";
193
+ const thirdPartyTools = getThirdPartyToolDescriptions();
194
+ if (thirdPartyTools.length > 0) {
195
+ const lines = thirdPartyTools
196
+ .map((t) => `- ${t.name}: ${t.description}`)
197
+ .join("\n");
198
+ thirdPartySection = `\n\n## Third-Party Tools\nThe following community-contributed tools are also available:\n${lines}`;
199
+ }
200
+ return {
201
+ systemPrompt: `${event.systemPrompt}\n\n${buildSystemPrompt(memoryContext || undefined)}${thirdPartySection}`,
202
+ };
203
+ });
204
+ }
205
+ //# sourceMappingURL=opencandle-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencandle-extension.js","sourceRoot":"","sources":["../../src/pi/opencandle-extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type AuthStorage, type ModelRegistry, type CreateAgentSessionResult, type SettingsManager, type SessionManager } from "@mariozechner/pi-coding-agent";
2
+ export interface CreateOpenCandleSessionOptions {
3
+ cwd?: string;
4
+ authStorage?: AuthStorage;
5
+ modelRegistry?: ModelRegistry;
6
+ settingsManager?: SettingsManager;
7
+ sessionManager?: SessionManager;
8
+ useInlineExtension?: boolean;
9
+ }
10
+ export declare function createOpenCandleSession(options?: CreateOpenCandleSessionOptions): Promise<CreateAgentSessionResult>;
@@ -0,0 +1,28 @@
1
+ import { createAgentSession, DefaultResourceLoader, } from "@mariozechner/pi-coding-agent";
2
+ import { loadEnv } from "../config.js";
3
+ import openCandleExtension from "./opencandle-extension.js";
4
+ export async function createOpenCandleSession(options = {}) {
5
+ loadEnv();
6
+ const cwd = options.cwd ?? process.cwd();
7
+ const useInlineExtension = options.useInlineExtension ?? true;
8
+ const resourceLoader = useInlineExtension
9
+ ? new DefaultResourceLoader({
10
+ cwd,
11
+ settingsManager: options.settingsManager,
12
+ extensionFactories: [openCandleExtension],
13
+ })
14
+ : undefined;
15
+ if (resourceLoader) {
16
+ await resourceLoader.reload();
17
+ }
18
+ return createAgentSession({
19
+ cwd,
20
+ authStorage: options.authStorage,
21
+ modelRegistry: options.modelRegistry,
22
+ sessionManager: options.sessionManager,
23
+ settingsManager: options.settingsManager,
24
+ resourceLoader,
25
+ tools: [],
26
+ });
27
+ }
28
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/pi/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EAClB,qBAAqB,GAKtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,mBAAmB,MAAM,2BAA2B,CAAC;AAW5D,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAA0C,EAAE;IAE5C,OAAO,EAAE,CAAC;IAEV,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,IAAI,CAAC;IAC9D,MAAM,cAAc,GAAG,kBAAkB;QACvC,CAAC,CAAC,IAAI,qBAAqB,CAAC;YACxB,GAAG;YACH,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,kBAAkB,EAAE,CAAC,mBAAmB,CAAC;SAC1C,CAAC;QACJ,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,kBAAkB,CAAC;QACxB,GAAG;QACH,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,cAAc;QACd,KAAK,EAAE,EAAE;KACV,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type ExtensionAPI, type ExtensionContext } from "@mariozechner/pi-coding-agent";
2
+ type SetupMode = "startup" | "manual";
3
+ type SetupRequirement = "ready" | "select_model" | "connect_auth";
4
+ type SetupResult = "ready" | "shutdown" | "cancelled";
5
+ export declare function getLlmSetupRequirement(ctx: Pick<ExtensionContext, "model" | "modelRegistry">): SetupRequirement;
6
+ export declare function runOpenCandleSetup(api: ExtensionAPI, ctx: ExtensionContext, options?: {
7
+ mode: SetupMode;
8
+ forceFinancePrompt?: boolean;
9
+ }): Promise<SetupResult>;
10
+ export {};