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,357 @@
1
+ import { LoginDialogComponent, } from "@mariozechner/pi-coding-agent";
2
+ import { getFinanceProviderReadiness, loadFileConfig, saveFileConfig, } from "../config.js";
3
+ import { openInBrowser } from "../infra/open-url.js";
4
+ import { ONBOARDING_VERSION, loadOnboardingState, saveOnboardingState } from "../onboarding/state.js";
5
+ const SETUP_STATUS_KEY = "opencandle-setup";
6
+ const ALPHA_VANTAGE_SIGNUP_URL = "https://www.alphavantage.co/support/#api-key";
7
+ const FRED_SIGNUP_URL = "https://fredaccount.stlouisfed.org/apikeys";
8
+ function renderSetupHeader(title, body) {
9
+ return (_tui, theme) => ({
10
+ render() {
11
+ return [
12
+ "",
13
+ theme.bold(theme.fg("accent", "OpenCandle Setup")),
14
+ theme.fg("muted", title),
15
+ "",
16
+ ...body.map((line) => theme.fg("dim", line)),
17
+ "",
18
+ ];
19
+ },
20
+ invalidate() { },
21
+ });
22
+ }
23
+ function setSetupChrome(ctx, title, body) {
24
+ ctx.ui.setHeader(renderSetupHeader(title, body));
25
+ ctx.ui.setStatus(SETUP_STATUS_KEY, title);
26
+ }
27
+ function clearSetupChrome(ctx) {
28
+ ctx.ui.setHeader(undefined);
29
+ ctx.ui.setStatus(SETUP_STATUS_KEY, undefined);
30
+ }
31
+ function sortModels(models, preferredProvider) {
32
+ return [...models].sort((a, b) => {
33
+ const aPreferred = preferredProvider && a.provider === preferredProvider ? -1 : 0;
34
+ const bPreferred = preferredProvider && b.provider === preferredProvider ? -1 : 0;
35
+ if (aPreferred !== bPreferred)
36
+ return aPreferred - bPreferred;
37
+ const byProvider = a.provider.localeCompare(b.provider);
38
+ return byProvider !== 0 ? byProvider : a.id.localeCompare(b.id);
39
+ });
40
+ }
41
+ function getAvailableModels(ctx, preferredProvider) {
42
+ ctx.modelRegistry.refresh();
43
+ return sortModels(ctx.modelRegistry.getAvailable(), preferredProvider);
44
+ }
45
+ export function getLlmSetupRequirement(ctx) {
46
+ if (ctx.model && ctx.modelRegistry.hasConfiguredAuth(ctx.model)) {
47
+ return "ready";
48
+ }
49
+ return ctx.modelRegistry.getAvailable().length > 0 ? "select_model" : "connect_auth";
50
+ }
51
+ async function selectProviderForApiKey(ctx) {
52
+ const choice = await ctx.ui.select("Connect an AI model", [
53
+ "Google Gemini API",
54
+ "OpenAI API",
55
+ "Anthropic API",
56
+ ]);
57
+ switch (choice) {
58
+ case "Google Gemini API":
59
+ return "google";
60
+ case "OpenAI API":
61
+ return "openai";
62
+ case "Anthropic API":
63
+ return "anthropic";
64
+ default:
65
+ return undefined;
66
+ }
67
+ }
68
+ async function selectProviderForLogin(ctx) {
69
+ const choice = await ctx.ui.select("Connect an AI model", [
70
+ "Google",
71
+ "OpenAI",
72
+ "Anthropic",
73
+ "Advanced setup",
74
+ ]);
75
+ switch (choice) {
76
+ case "Google":
77
+ return "google-gemini-cli";
78
+ case "OpenAI":
79
+ return "openai-codex";
80
+ case "Anthropic":
81
+ return "anthropic";
82
+ case "Advanced setup":
83
+ return "advanced";
84
+ default:
85
+ return undefined;
86
+ }
87
+ }
88
+ async function selectAdvancedOAuthProvider(ctx) {
89
+ const providers = ctx.modelRegistry.authStorage.getOAuthProviders();
90
+ if (providers.length === 0) {
91
+ ctx.ui.notify("No sign-in providers are available.", "warning");
92
+ return undefined;
93
+ }
94
+ const labels = providers.map((provider) => provider.name);
95
+ const choice = await ctx.ui.select("Choose a provider", labels);
96
+ return providers.find((provider) => provider.name === choice)?.id;
97
+ }
98
+ async function runLoginDialog(ctx, providerId) {
99
+ const provider = ctx.modelRegistry.authStorage.getOAuthProviders().find((item) => item.id === providerId);
100
+ const providerName = provider?.name ?? providerId;
101
+ const usesCallbackServer = provider?.usesCallbackServer ?? false;
102
+ const success = await ctx.ui.custom((tui, _theme, _keybindings, done) => {
103
+ let finished = false;
104
+ const finish = (value) => {
105
+ if (finished)
106
+ return;
107
+ finished = true;
108
+ done(value);
109
+ };
110
+ const dialog = new LoginDialogComponent(tui, providerId, (completed) => {
111
+ finish(completed);
112
+ });
113
+ let manualCodeResolve;
114
+ let manualCodeReject;
115
+ const manualCodePromise = new Promise((resolve, reject) => {
116
+ manualCodeResolve = resolve;
117
+ manualCodeReject = reject;
118
+ });
119
+ // Cast required: advanced providers return dynamic IDs outside the SDK's static union type
120
+ void ctx.modelRegistry.authStorage.login(providerId, {
121
+ onAuth: (info) => {
122
+ dialog.showAuth(info.url, info.instructions);
123
+ if (usesCallbackServer) {
124
+ void dialog
125
+ .showManualInput("Paste redirect URL below, or complete login in your browser:")
126
+ .then((value) => {
127
+ if (value && manualCodeResolve) {
128
+ manualCodeResolve(value);
129
+ manualCodeResolve = undefined;
130
+ }
131
+ })
132
+ .catch(() => {
133
+ if (manualCodeReject) {
134
+ manualCodeReject(new Error("Login cancelled"));
135
+ manualCodeReject = undefined;
136
+ }
137
+ });
138
+ }
139
+ else if (providerId === "github-copilot") {
140
+ dialog.showWaiting("Waiting for browser authentication...");
141
+ }
142
+ },
143
+ onPrompt: async (prompt) => dialog.showPrompt(prompt.message, prompt.placeholder),
144
+ onProgress: (message) => dialog.showProgress(message),
145
+ onManualCodeInput: () => manualCodePromise,
146
+ signal: dialog.signal,
147
+ })
148
+ .then(() => finish(true))
149
+ .catch((error) => {
150
+ const message = error instanceof Error ? error.message : String(error);
151
+ if (message !== "Login cancelled") {
152
+ ctx.ui.notify(`Failed to connect ${providerName}: ${message}`, "error");
153
+ }
154
+ finish(false);
155
+ });
156
+ return dialog;
157
+ });
158
+ if (success) {
159
+ ctx.modelRegistry.refresh();
160
+ ctx.ui.notify(`Connected ${providerName}.`, "info");
161
+ return true;
162
+ }
163
+ return false;
164
+ }
165
+ async function runApiKeySetup(ctx, provider) {
166
+ const key = await ctx.ui.input("Paste your API key", "sk-...");
167
+ const trimmed = key?.trim();
168
+ if (!trimmed) {
169
+ ctx.ui.notify("No API key entered.", "warning");
170
+ return false;
171
+ }
172
+ ctx.modelRegistry.authStorage.set(provider, { type: "api_key", key: trimmed });
173
+ ctx.modelRegistry.refresh();
174
+ ctx.ui.notify("API key saved.", "info");
175
+ return true;
176
+ }
177
+ async function selectModel(api, ctx, preferredProvider) {
178
+ const models = getAvailableModels(ctx, preferredProvider);
179
+ if (models.length === 0) {
180
+ ctx.ui.notify("No available models found yet. Connect a provider first.", "warning");
181
+ return false;
182
+ }
183
+ const labels = models.map((model) => `${model.provider}/${model.id}`);
184
+ const choice = await ctx.ui.select("Choose a model", labels);
185
+ if (!choice) {
186
+ return false;
187
+ }
188
+ const model = models.find((candidate) => `${candidate.provider}/${candidate.id}` === choice);
189
+ if (!model) {
190
+ return false;
191
+ }
192
+ const ok = await api.setModel(model);
193
+ if (!ok) {
194
+ ctx.ui.notify("Unable to activate the selected model.", "error");
195
+ return false;
196
+ }
197
+ ctx.ui.notify(`Model selected: ${model.provider}/${model.id}`, "info");
198
+ return true;
199
+ }
200
+ async function runLlmSetup(api, ctx, mode) {
201
+ while (true) {
202
+ const requirement = getLlmSetupRequirement(ctx);
203
+ if (requirement === "ready") {
204
+ return "ready";
205
+ }
206
+ if (requirement === "select_model") {
207
+ setSetupChrome(ctx, "Choose an AI model", [
208
+ "You already have at least one Pi-connected provider.",
209
+ "Pick the model OpenCandle should use for chat and analysis.",
210
+ ]);
211
+ const selected = await selectModel(api, ctx);
212
+ if (selected) {
213
+ return "ready";
214
+ }
215
+ const retry = await ctx.ui.select("Model setup", ["Try again", "Exit setup"]);
216
+ if (retry !== "Try again") {
217
+ if (mode === "startup") {
218
+ ctx.ui.notify("OpenCandle needs an AI model before chat can start.", "warning");
219
+ ctx.shutdown();
220
+ return "shutdown";
221
+ }
222
+ return "cancelled";
223
+ }
224
+ continue;
225
+ }
226
+ setSetupChrome(ctx, "Connect an AI model", [
227
+ "Welcome to OpenCandle.",
228
+ "Choose sign-in or paste an API key to enable chat and analysis.",
229
+ ]);
230
+ const choice = await ctx.ui.select("Welcome to OpenCandle", [
231
+ "Sign in",
232
+ "Paste API key",
233
+ "Exit setup",
234
+ ]);
235
+ if (choice !== "Sign in" && choice !== "Paste API key") {
236
+ if (mode === "startup") {
237
+ ctx.ui.notify("OpenCandle needs an AI model before chat can start.", "warning");
238
+ ctx.shutdown();
239
+ return "shutdown";
240
+ }
241
+ return "cancelled";
242
+ }
243
+ if (choice === "Sign in") {
244
+ const providerChoice = await selectProviderForLogin(ctx);
245
+ if (!providerChoice) {
246
+ continue;
247
+ }
248
+ const providerId = providerChoice === "advanced" ? await selectAdvancedOAuthProvider(ctx) : providerChoice;
249
+ if (!providerId) {
250
+ continue;
251
+ }
252
+ const loggedIn = await runLoginDialog(ctx, providerId);
253
+ if (!loggedIn) {
254
+ continue;
255
+ }
256
+ const selected = await selectModel(api, ctx, providerId);
257
+ if (selected) {
258
+ return "ready";
259
+ }
260
+ continue;
261
+ }
262
+ const provider = await selectProviderForApiKey(ctx);
263
+ if (!provider) {
264
+ continue;
265
+ }
266
+ const saved = await runApiKeySetup(ctx, provider);
267
+ if (!saved) {
268
+ continue;
269
+ }
270
+ const selected = await selectModel(api, ctx, provider);
271
+ if (selected) {
272
+ return "ready";
273
+ }
274
+ }
275
+ }
276
+ function hasFinanceKeys(readiness) {
277
+ return readiness.hasAlphaVantage && readiness.hasFred;
278
+ }
279
+ function upsertFinanceKey(config, provider, apiKey) {
280
+ return {
281
+ ...config,
282
+ providers: {
283
+ ...config.providers,
284
+ [provider]: {
285
+ ...(config.providers?.[provider] ?? {}),
286
+ apiKey,
287
+ },
288
+ },
289
+ };
290
+ }
291
+ async function runFinanceSetup(ctx, forcePrompt) {
292
+ const fileConfig = loadFileConfig();
293
+ const readiness = getFinanceProviderReadiness();
294
+ if (hasFinanceKeys(readiness)) {
295
+ saveOnboardingState({ version: ONBOARDING_VERSION, financeSetupStatus: "completed" });
296
+ return;
297
+ }
298
+ const onboardingState = loadOnboardingState();
299
+ if (!forcePrompt &&
300
+ (onboardingState.financeSetupStatus === "dismissed" ||
301
+ onboardingState.financeSetupStatus === "completed")) {
302
+ return;
303
+ }
304
+ setSetupChrome(ctx, "Connect market data providers", [
305
+ "Alpha Vantage unlocks fundamentals, earnings, and DCF.",
306
+ "FRED unlocks interest rates, inflation, and macro data.",
307
+ ]);
308
+ const choice = await ctx.ui.select("Connect market data providers (optional)", [
309
+ "Yes",
310
+ "Skip for now",
311
+ ]);
312
+ if (choice !== "Yes") {
313
+ saveOnboardingState({ version: ONBOARDING_VERSION, financeSetupStatus: "dismissed" });
314
+ return;
315
+ }
316
+ let nextConfig = fileConfig;
317
+ let nextReadiness = readiness;
318
+ if (!nextReadiness.hasAlphaVantage) {
319
+ await openInBrowser(ALPHA_VANTAGE_SIGNUP_URL).catch(() => { });
320
+ ctx.ui.notify("Opening Alpha Vantage signup in your browser...", "info");
321
+ const alphaKey = await ctx.ui.input("Alpha Vantage API key (optional)", "Enter key or leave blank");
322
+ const trimmed = alphaKey?.trim();
323
+ if (trimmed) {
324
+ nextConfig = upsertFinanceKey(nextConfig, "alphaVantage", trimmed);
325
+ nextReadiness = { ...nextReadiness, hasAlphaVantage: true };
326
+ }
327
+ }
328
+ if (!nextReadiness.hasFred) {
329
+ await openInBrowser(FRED_SIGNUP_URL).catch(() => { });
330
+ ctx.ui.notify("Opening FRED API key page in your browser...", "info");
331
+ const fredKey = await ctx.ui.input("FRED API key (optional)", "Enter key or leave blank");
332
+ const trimmed = fredKey?.trim();
333
+ if (trimmed) {
334
+ nextConfig = upsertFinanceKey(nextConfig, "fred", trimmed);
335
+ nextReadiness = { ...nextReadiness, hasFred: true };
336
+ }
337
+ }
338
+ if (nextConfig !== fileConfig) {
339
+ saveFileConfig(nextConfig);
340
+ }
341
+ const status = hasFinanceKeys(nextReadiness) ? "completed" : "dismissed";
342
+ saveOnboardingState({ version: ONBOARDING_VERSION, financeSetupStatus: status });
343
+ }
344
+ export async function runOpenCandleSetup(api, ctx, options = { mode: "startup" }) {
345
+ const initialRequirement = getLlmSetupRequirement(ctx);
346
+ if (initialRequirement !== "ready" || options.mode === "manual") {
347
+ const result = await runLlmSetup(api, ctx, options.mode);
348
+ if (result === "shutdown" || result === "cancelled") {
349
+ clearSetupChrome(ctx);
350
+ return result;
351
+ }
352
+ }
353
+ await runFinanceSetup(ctx, options.forceFinancePrompt ?? options.mode === "manual");
354
+ clearSetupChrome(ctx);
355
+ return "ready";
356
+ }
357
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/pi/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AgentTool } from "@mariozechner/pi-agent-core";
2
+ import type { ToolDefinition } from "@mariozechner/pi-coding-agent";
3
+ import type { TSchema } from "@sinclair/typebox";
4
+ export declare function agentToolToPiTool<TParams extends TSchema, TDetails>(tool: AgentTool<TParams, TDetails>): ToolDefinition<TParams, TDetails>;
5
+ export declare function getOpenCandleToolDefinitions(): ToolDefinition[];
@@ -0,0 +1,17 @@
1
+ import { getAllTools } from "../tools/index.js";
2
+ export function agentToolToPiTool(tool) {
3
+ return {
4
+ name: tool.name,
5
+ label: tool.label,
6
+ description: tool.description,
7
+ promptSnippet: `${tool.name}: ${tool.description}`,
8
+ parameters: tool.parameters,
9
+ execute: async (toolCallId, params, signal, onUpdate) => {
10
+ return tool.execute(toolCallId, params, signal, onUpdate);
11
+ },
12
+ };
13
+ }
14
+ export function getOpenCandleToolDefinitions() {
15
+ return getAllTools().map((tool) => agentToolToPiTool(tool));
16
+ }
17
+ //# sourceMappingURL=tool-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-adapter.js","sourceRoot":"","sources":["../../src/pi/tool-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,UAAU,iBAAiB,CAC/B,IAAkC;IAElC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE;QAClD,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;YACtD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC5D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { PortfolioSlots, OptionsScreenerSlots, CompareAssetsSlots, SlotResolution, SlotSource } from "../routing/types.js";
2
+ /**
3
+ * Build a deterministic assumption disclosure block from resolution.sources.
4
+ * This is the single authoritative provenance representation.
5
+ */
6
+ export declare function buildDisclosureBlock(slotValues: Record<string, unknown>, slotSources: Record<string, SlotSource | undefined>, workflowConstraints?: string[]): string;
7
+ export declare function buildPortfolioPrompt(resolution: SlotResolution<PortfolioSlots>): string;
8
+ export declare function buildOptionsScreenerPrompt(resolution: SlotResolution<OptionsScreenerSlots>): string;
9
+ export declare function buildCompareAssetsPrompt(resolution: SlotResolution<CompareAssetsSlots>): string;
@@ -0,0 +1,202 @@
1
+ import { parseDteTarget } from "../routing/defaults.js";
2
+ function tag(source) {
3
+ switch (source) {
4
+ case "default":
5
+ return " [DEFAULT]";
6
+ case "preference":
7
+ return " [SAVED PREFERENCE]";
8
+ case "user":
9
+ default:
10
+ return "";
11
+ }
12
+ }
13
+ function formatBudget(n) {
14
+ return `$${n.toLocaleString("en-US")}`;
15
+ }
16
+ function formatLocalDate(d) {
17
+ const year = d.getFullYear();
18
+ const month = String(d.getMonth() + 1).padStart(2, "0");
19
+ const day = String(d.getDate()).padStart(2, "0");
20
+ return `${year}-${month}-${day}`;
21
+ }
22
+ function todayStr() {
23
+ return formatLocalDate(new Date());
24
+ }
25
+ const DISPLAY_NAMES = {
26
+ budget: "budget",
27
+ riskProfile: "risk profile",
28
+ timeHorizon: "time horizon",
29
+ assetScope: "asset scope",
30
+ positionCount: "positions",
31
+ maxSinglePositionPct: "max single position",
32
+ symbol: "symbol",
33
+ direction: "direction",
34
+ dteTarget: "DTE target",
35
+ objective: "objective",
36
+ moneynessPreference: "moneyness",
37
+ liquidityMinimum: "liquidity",
38
+ symbols: "symbols",
39
+ };
40
+ /**
41
+ * Build a deterministic assumption disclosure block from resolution.sources.
42
+ * This is the single authoritative provenance representation.
43
+ */
44
+ export function buildDisclosureBlock(slotValues, slotSources, workflowConstraints) {
45
+ const userSpecified = [];
46
+ const fromPreferences = [];
47
+ const defaults = [];
48
+ for (const [key, source] of Object.entries(slotSources)) {
49
+ const val = slotValues[key];
50
+ const label = DISPLAY_NAMES[key] ?? key;
51
+ const display = `${label} (${val})`;
52
+ switch (source) {
53
+ case "user":
54
+ userSpecified.push(display);
55
+ break;
56
+ case "preference":
57
+ fromPreferences.push(display);
58
+ break;
59
+ case "default":
60
+ defaults.push(display);
61
+ break;
62
+ }
63
+ }
64
+ const lines = [];
65
+ lines.push("Assumptions (reproduce this block exactly — do not relabel sources):");
66
+ if (userSpecified.length > 0)
67
+ lines.push(` User-specified: ${userSpecified.join(", ")}`);
68
+ if (fromPreferences.length > 0)
69
+ lines.push(` From saved preferences: ${fromPreferences.join(", ")}`);
70
+ if (defaults.length > 0)
71
+ lines.push(` Defaults: ${defaults.join(", ")}`);
72
+ if (workflowConstraints && workflowConstraints.length > 0) {
73
+ lines.push(` Workflow constraints: ${workflowConstraints.join(", ")}`);
74
+ }
75
+ return lines.join("\n");
76
+ }
77
+ export function buildPortfolioPrompt(resolution) {
78
+ const { resolved: s, sources } = resolution;
79
+ const isEtfOnly = s.assetScope.toLowerCase().startsWith("etf");
80
+ const disclosureBlock = buildDisclosureBlock({
81
+ budget: formatBudget(s.budget),
82
+ riskProfile: s.riskProfile,
83
+ timeHorizon: s.timeHorizon,
84
+ positionCount: s.positionCount,
85
+ assetScope: s.assetScope,
86
+ maxSinglePositionPct: `${s.maxSinglePositionPct}%`,
87
+ }, sources);
88
+ const toolSteps = isEtfOnly
89
+ ? `1. Identify ${s.positionCount} diverse ETF candidates appropriate for a ${s.riskProfile} ${s.timeHorizon} portfolio.
90
+ 2. Use get_stock_quote for each candidate to get current prices.
91
+ 3. Use analyze_risk on each candidate for volatility, Sharpe, and max drawdown.
92
+ 4. Use analyze_correlation across all candidates to check diversification.`
93
+ : `1. Identify ${s.positionCount} diverse candidates appropriate for a ${s.riskProfile} ${s.timeHorizon} portfolio.
94
+ 2. Use get_stock_quote for each candidate to get current prices.
95
+ 3. Use get_company_overview for fundamentals on each candidate.
96
+ 4. Use analyze_risk on each candidate for volatility, Sharpe, and max drawdown.
97
+ 5. Use analyze_correlation across all candidates to check diversification.`;
98
+ return `Current date: ${todayStr()}
99
+
100
+ Build a draft portfolio under these parameters:
101
+ - Budget: ${formatBudget(s.budget)}
102
+ - Risk profile: ${s.riskProfile}${tag(sources.riskProfile)}
103
+ - Time horizon: ${s.timeHorizon}${tag(sources.timeHorizon)}
104
+ - Positions: ${s.positionCount}${tag(sources.positionCount)}
105
+ - Asset scope: ${s.assetScope}${tag(sources.assetScope)}
106
+ - Max single position: ${s.maxSinglePositionPct}%${tag(sources.maxSinglePositionPct)}
107
+
108
+ Steps:
109
+ ${toolSteps}
110
+
111
+ ${disclosureBlock}
112
+
113
+ Response format:
114
+ - Start with the assumptions block above exactly as written. Do not relabel source attribution anywhere else in your response.
115
+ - This is an educational sample allocation request. Build the draft portfolio and include the standard disclaimer instead of refusing.
116
+ - Present an allocation table: symbol, allocation %, dollar amount, and rationale for each position.
117
+ - Include a risk summary (portfolio volatility, diversification quality).
118
+ - Suggest what to change for more growth or more safety.
119
+ - Include the standard disclaimer.`;
120
+ }
121
+ export function buildOptionsScreenerPrompt(resolution) {
122
+ const { resolved: s, sources } = resolution;
123
+ const dateStr = todayStr();
124
+ const dteWindow = parseDteTarget(s.dteTarget);
125
+ let expirationSection = "";
126
+ if (dteWindow) {
127
+ const windowStart = new Date();
128
+ windowStart.setDate(windowStart.getDate() + dteWindow.minDays);
129
+ const windowEnd = new Date();
130
+ windowEnd.setDate(windowEnd.getDate() + dteWindow.maxDays);
131
+ expirationSection = `\nTarget expiration window: ${formatLocalDate(windowStart)} to ${formatLocalDate(windowEnd)}`;
132
+ }
133
+ const isBalanced = s.objective.includes("balanced");
134
+ const workflowConstraints = isBalanced
135
+ ? ["delta >= 0.20 (balanced objective)", "prefer ATM to slightly OTM"]
136
+ : [];
137
+ const rankingConstraints = isBalanced
138
+ ? `
139
+ Ranking constraints:
140
+ - Only include contracts with |delta| >= 0.20.
141
+ - Prefer ATM to slightly OTM before farther OTM.
142
+ - Do NOT rank ultra-cheap near-zero-delta contracts as "best."
143
+ `
144
+ : "";
145
+ const disclosureBlock = buildDisclosureBlock({
146
+ symbol: s.symbol,
147
+ direction: s.direction,
148
+ dteTarget: s.dteTarget,
149
+ objective: s.objective,
150
+ moneynessPreference: s.moneynessPreference,
151
+ liquidityMinimum: s.liquidityMinimum,
152
+ }, sources, workflowConstraints);
153
+ return `Current date: ${dateStr}
154
+ Do NOT invent or assume a different current date.${expirationSection}
155
+
156
+ Screen and rank options contracts for ${s.symbol}:
157
+ - Direction: ${s.direction}${tag(sources.direction)}
158
+ - DTE target: ${s.dteTarget}${tag(sources.dteTarget)}
159
+ - Objective: ${s.objective}${tag(sources.objective)}
160
+ - Moneyness: ${s.moneynessPreference}${tag(sources.moneynessPreference)}
161
+ - Liquidity: ${s.liquidityMinimum}${tag(sources.liquidityMinimum)}${s.budget ? `\n- Budget: ${formatBudget(s.budget)}` : ""}${s.maxPremium ? `\n- Max premium: ${formatBudget(s.maxPremium)}` : ""}
162
+
163
+ Steps:
164
+ 1. Use get_stock_quote for ${s.symbol} to get current price and recent movement.
165
+ 2. Use get_option_chain for ${s.symbol} to get the full chain with Greeks. If you filter by contract type, pass \`type: "call"\` or \`type: "put"\` in lowercase.
166
+ 3. Filter contracts matching: ${s.direction === "bullish" ? "calls" : "puts"}, DTE near ${s.dteTarget}, ${s.moneynessPreference} strikes.
167
+ 4. Rank by ${s.objective}: balance premium cost, delta exposure, and probability of profit.
168
+ 5. Filter for ${s.liquidityMinimum}: high open interest and tight bid-ask spread.
169
+ ${rankingConstraints}
170
+ ${disclosureBlock}
171
+
172
+ Response format:
173
+ - Start with the assumptions block above exactly as written. Do not relabel source attribution anywhere else in your response.
174
+ - Present top 3-5 ranked contracts in a table: strike, expiry, premium, delta, IV, OI, bid-ask spread.
175
+ - Explain why the top pick is ranked #1.
176
+ - Include risk caveats (max loss = premium, IV crush risk, time decay).`;
177
+ }
178
+ export function buildCompareAssetsPrompt(resolution) {
179
+ const symbols = resolution.resolved.symbols;
180
+ const symbolList = symbols.join(", ");
181
+ const disclosureBlock = buildDisclosureBlock({ symbols: symbolList }, resolution.sources);
182
+ return `Current date: ${todayStr()}
183
+
184
+ Compare these assets side by side: ${symbolList}
185
+
186
+ Steps:
187
+ 1. Use get_stock_quote for each of: ${symbolList}.
188
+ 2. Use compare_companies with symbols [${symbols.map((s) => `"${s}"`).join(", ")}] for peer metrics. If some fundamentals are unavailable, continue the comparison with the available symbols and mark missing metrics as unavailable.
189
+ 3. Use get_technical_indicators for each to compare momentum and trend.
190
+ 4. Use analyze_risk for each to compare risk metrics.
191
+ 5. Use analyze_correlation across [${symbolList}] to check diversification.
192
+
193
+ ${disclosureBlock}
194
+
195
+ Response format:
196
+ - Start with the assumptions block above exactly as written. Do not relabel source attribution anywhere else in your response.
197
+ - Present a comparison table with key metrics: price, P/E, revenue growth, profit margin, RSI, Sharpe, max drawdown.
198
+ - Highlight which asset is stronger on each metric.
199
+ - Provide a summary verdict: which is most attractive and why.
200
+ - Note any caveats (different sectors, market cap disparity, unavailable fundamentals, etc.).`;
201
+ }
202
+ //# sourceMappingURL=workflow-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-prompts.js","sourceRoot":"","sources":["../../src/prompts/workflow-prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CompanyOverview, EarningsData, FinancialStatement } from "../types/fundamentals.js";
2
+ export declare function getOverview(symbol: string, apiKey: string): Promise<CompanyOverview>;
3
+ export declare function getEarnings(symbol: string, apiKey: string): Promise<EarningsData>;
4
+ export declare function getFinancials(symbol: string, apiKey: string): Promise<FinancialStatement[]>;