opencandle 0.6.0 → 0.8.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 (201) hide show
  1. package/README.md +43 -23
  2. package/dist/cli-main.d.ts +1 -0
  3. package/dist/cli-main.js +200 -0
  4. package/dist/cli-main.js.map +1 -0
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.js +14 -194
  7. package/dist/cli.js.map +1 -1
  8. package/dist/config.d.ts +10 -0
  9. package/dist/config.js +13 -0
  10. package/dist/config.js.map +1 -1
  11. package/dist/doctor/cli-command.d.ts +1 -0
  12. package/dist/doctor/cli-command.js +69 -0
  13. package/dist/doctor/cli-command.js.map +1 -0
  14. package/dist/doctor/render.d.ts +2 -0
  15. package/dist/doctor/render.js +32 -0
  16. package/dist/doctor/render.js.map +1 -0
  17. package/dist/doctor/report.d.ts +63 -0
  18. package/dist/doctor/report.js +500 -0
  19. package/dist/doctor/report.js.map +1 -0
  20. package/dist/infra/index.d.ts +0 -1
  21. package/dist/infra/index.js +0 -1
  22. package/dist/infra/index.js.map +1 -1
  23. package/dist/infra/native-dependencies.d.ts +8 -0
  24. package/dist/infra/native-dependencies.js +49 -0
  25. package/dist/infra/native-dependencies.js.map +1 -1
  26. package/dist/infra/node-version.js +2 -5
  27. package/dist/infra/node-version.js.map +1 -1
  28. package/dist/monitor.d.ts +1 -1
  29. package/dist/monitor.js +2 -1
  30. package/dist/monitor.js.map +1 -1
  31. package/dist/onboarding/connect.d.ts +2 -2
  32. package/dist/onboarding/connect.js +10 -3
  33. package/dist/onboarding/connect.js.map +1 -1
  34. package/dist/onboarding/provider-status.d.ts +46 -0
  35. package/dist/onboarding/provider-status.js +256 -0
  36. package/dist/onboarding/provider-status.js.map +1 -0
  37. package/dist/onboarding/providers.d.ts +85 -8
  38. package/dist/onboarding/providers.js +87 -9
  39. package/dist/onboarding/providers.js.map +1 -1
  40. package/dist/onboarding/state.d.ts +1 -0
  41. package/dist/onboarding/state.js +5 -0
  42. package/dist/onboarding/state.js.map +1 -1
  43. package/dist/onboarding/tool-tags.d.ts +12 -1
  44. package/dist/onboarding/tool-tags.js +31 -1
  45. package/dist/onboarding/tool-tags.js.map +1 -1
  46. package/dist/onboarding/validation.d.ts +2 -2
  47. package/dist/onboarding/validation.js.map +1 -1
  48. package/dist/pi/opencandle-extension.js +91 -15
  49. package/dist/pi/opencandle-extension.js.map +1 -1
  50. package/dist/pi/session.d.ts +0 -1
  51. package/dist/pi/session.js +2 -1
  52. package/dist/pi/session.js.map +1 -1
  53. package/dist/pi/tool-adapter.d.ts +4 -1
  54. package/dist/pi/tool-adapter.js +5 -4
  55. package/dist/pi/tool-adapter.js.map +1 -1
  56. package/dist/prompts/context-builder.js +1 -1
  57. package/dist/prompts/policy-cards.js +9 -5
  58. package/dist/prompts/policy-cards.js.map +1 -1
  59. package/dist/prompts/workflow-prompts.js +10 -6
  60. package/dist/prompts/workflow-prompts.js.map +1 -1
  61. package/dist/providers/external-tool-command.d.ts +17 -0
  62. package/dist/providers/external-tool-command.js +114 -0
  63. package/dist/providers/external-tool-command.js.map +1 -0
  64. package/dist/providers/external-tool-error.d.ts +10 -0
  65. package/dist/providers/external-tool-error.js +21 -0
  66. package/dist/providers/external-tool-error.js.map +1 -0
  67. package/dist/providers/reddit-cli.d.ts +32 -0
  68. package/dist/providers/reddit-cli.js +172 -0
  69. package/dist/providers/reddit-cli.js.map +1 -0
  70. package/dist/providers/reddit.d.ts +1 -1
  71. package/dist/providers/reddit.js +7 -35
  72. package/dist/providers/reddit.js.map +1 -1
  73. package/dist/providers/twitter-cli.d.ts +36 -0
  74. package/dist/providers/twitter-cli.js +124 -0
  75. package/dist/providers/twitter-cli.js.map +1 -0
  76. package/dist/providers/twitter.d.ts +0 -8
  77. package/dist/providers/twitter.js +4 -54
  78. package/dist/providers/twitter.js.map +1 -1
  79. package/dist/providers/wrap-provider.js +30 -0
  80. package/dist/providers/wrap-provider.js.map +1 -1
  81. package/dist/providers/yahoo-finance.js +53 -32
  82. package/dist/providers/yahoo-finance.js.map +1 -1
  83. package/dist/routing/classify-intent.js +7 -3
  84. package/dist/routing/classify-intent.js.map +1 -1
  85. package/dist/routing/planning.d.ts +1 -1
  86. package/dist/routing/planning.js +9 -6
  87. package/dist/routing/planning.js.map +1 -1
  88. package/dist/routing/router.js +7 -3
  89. package/dist/routing/router.js.map +1 -1
  90. package/dist/runtime/answer-contracts.d.ts +1 -1
  91. package/dist/runtime/answer-contracts.js +12 -1
  92. package/dist/runtime/answer-contracts.js.map +1 -1
  93. package/dist/runtime/tool-defaults-wrapper.js +6 -2
  94. package/dist/runtime/tool-defaults-wrapper.js.map +1 -1
  95. package/dist/sentiment/index.d.ts +1 -0
  96. package/dist/sentiment/index.js +1 -0
  97. package/dist/sentiment/index.js.map +1 -1
  98. package/dist/sentiment/insights.d.ts +17 -0
  99. package/dist/sentiment/insights.js +206 -0
  100. package/dist/sentiment/insights.js.map +1 -0
  101. package/dist/sentiment/pipeline.js +13 -1
  102. package/dist/sentiment/pipeline.js.map +1 -1
  103. package/dist/sentiment/scorer.d.ts +2 -0
  104. package/dist/sentiment/scorer.js +10 -1
  105. package/dist/sentiment/scorer.js.map +1 -1
  106. package/dist/sentiment/types.d.ts +2 -0
  107. package/dist/sentiment/types.js.map +1 -1
  108. package/dist/system-prompt.js +3 -7
  109. package/dist/system-prompt.js.map +1 -1
  110. package/dist/tools/index.d.ts +5 -2
  111. package/dist/tools/index.js +8 -8
  112. package/dist/tools/index.js.map +1 -1
  113. package/dist/tools/sentiment/insight-format.d.ts +2 -0
  114. package/dist/tools/sentiment/insight-format.js +36 -0
  115. package/dist/tools/sentiment/insight-format.js.map +1 -0
  116. package/dist/tools/sentiment/query-match.d.ts +3 -0
  117. package/dist/tools/sentiment/query-match.js +113 -0
  118. package/dist/tools/sentiment/query-match.js.map +1 -0
  119. package/dist/tools/sentiment/reddit-sentiment.d.ts +12 -1
  120. package/dist/tools/sentiment/reddit-sentiment.js +263 -117
  121. package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
  122. package/dist/tools/sentiment/sentiment-summary.d.ts +9 -1
  123. package/dist/tools/sentiment/sentiment-summary.js +217 -201
  124. package/dist/tools/sentiment/sentiment-summary.js.map +1 -1
  125. package/dist/tools/sentiment/twitter-sentiment.d.ts +11 -1
  126. package/dist/tools/sentiment/twitter-sentiment.js +187 -64
  127. package/dist/tools/sentiment/twitter-sentiment.js.map +1 -1
  128. package/dist/tools/sentiment/web-sentiment.js +4 -0
  129. package/dist/tools/sentiment/web-sentiment.js.map +1 -1
  130. package/dist/types/sentiment.d.ts +52 -0
  131. package/gui/server/http-routes.ts +419 -0
  132. package/gui/server/invoke-tool.ts +17 -3
  133. package/gui/server/model-setup.ts +10 -3
  134. package/gui/server/projector.ts +6 -2
  135. package/gui/server/server.ts +30 -275
  136. package/gui/server/tool-metadata.ts +80 -16
  137. package/gui/server/ws-hub.ts +19 -0
  138. package/gui/web/dist/assets/CatalogOverlay-CCVKwBUB.js +1 -0
  139. package/gui/web/dist/assets/index-Dm4Aom2_.js +69 -0
  140. package/gui/web/dist/assets/{index-2KZtKBmu.css → index-UzZUg3dx.css} +1 -1
  141. package/gui/web/dist/index.html +2 -2
  142. package/package.json +17 -14
  143. package/src/cli-main.ts +233 -0
  144. package/src/cli.ts +14 -226
  145. package/src/config.ts +27 -0
  146. package/src/doctor/cli-command.ts +83 -0
  147. package/src/doctor/render.ts +37 -0
  148. package/src/doctor/report.ts +638 -0
  149. package/src/infra/index.ts +0 -1
  150. package/src/infra/native-dependencies.ts +67 -0
  151. package/src/infra/node-version.ts +2 -5
  152. package/src/monitor.ts +3 -1
  153. package/src/onboarding/connect.ts +20 -4
  154. package/src/onboarding/provider-status.ts +382 -0
  155. package/src/onboarding/providers.ts +148 -18
  156. package/src/onboarding/state.ts +9 -0
  157. package/src/onboarding/tool-tags.ts +45 -2
  158. package/src/onboarding/validation.ts +2 -2
  159. package/src/pi/opencandle-extension.ts +115 -17
  160. package/src/pi/session.ts +2 -1
  161. package/src/pi/tool-adapter.ts +14 -4
  162. package/src/prompts/context-builder.ts +1 -1
  163. package/src/prompts/policy-cards.ts +13 -5
  164. package/src/prompts/workflow-prompts.ts +13 -6
  165. package/src/providers/external-tool-command.ts +164 -0
  166. package/src/providers/external-tool-error.ts +20 -0
  167. package/src/providers/reddit-cli.ts +286 -0
  168. package/src/providers/reddit.ts +7 -63
  169. package/src/providers/twitter-cli.ts +202 -0
  170. package/src/providers/twitter.ts +4 -73
  171. package/src/providers/wrap-provider.ts +34 -0
  172. package/src/providers/yahoo-finance.ts +65 -32
  173. package/src/routing/classify-intent.ts +11 -6
  174. package/src/routing/planning.ts +16 -10
  175. package/src/routing/router.ts +11 -6
  176. package/src/runtime/answer-contracts.ts +23 -2
  177. package/src/runtime/tool-defaults-wrapper.ts +12 -2
  178. package/src/sentiment/index.ts +1 -0
  179. package/src/sentiment/insights.ts +269 -0
  180. package/src/sentiment/pipeline.ts +13 -1
  181. package/src/sentiment/scorer.ts +12 -1
  182. package/src/sentiment/types.ts +3 -0
  183. package/src/system-prompt.ts +3 -7
  184. package/src/tools/index.ts +9 -8
  185. package/src/tools/sentiment/insight-format.ts +50 -0
  186. package/src/tools/sentiment/query-match.ts +117 -0
  187. package/src/tools/sentiment/reddit-sentiment.ts +354 -141
  188. package/src/tools/sentiment/sentiment-summary.ts +283 -237
  189. package/src/tools/sentiment/twitter-sentiment.ts +262 -78
  190. package/src/tools/sentiment/web-sentiment.ts +4 -0
  191. package/src/types/sentiment.ts +59 -0
  192. package/dist/infra/browser.d.ts +0 -35
  193. package/dist/infra/browser.js +0 -105
  194. package/dist/infra/browser.js.map +0 -1
  195. package/dist/tools/interaction/twitter-login.d.ts +0 -8
  196. package/dist/tools/interaction/twitter-login.js +0 -87
  197. package/dist/tools/interaction/twitter-login.js.map +0 -1
  198. package/gui/web/dist/assets/CatalogOverlay-eJ2cBk33.js +0 -1
  199. package/gui/web/dist/assets/index-CveNgtDg.js +0 -69
  200. package/src/infra/browser.ts +0 -113
  201. package/src/tools/interaction/twitter-login.ts +0 -105
package/dist/monitor.js CHANGED
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import "./infra/node-version.js";
3
2
  import { parseArgs } from "node:util";
4
3
  import { loadEnv } from "./config.js";
4
+ import { assertSupportedNodeVersion } from "./infra/node-version.js";
5
5
  import { runLocalAutomationHeartbeat } from "./market-state/local-automation-service.js";
6
6
  import { MarketStateService } from "./market-state/service.js";
7
7
  import { initDefaultDatabase } from "./memory/sqlite.js";
8
+ assertSupportedNodeVersion();
8
9
  const DEFAULT_MONITOR_INTERVAL_MS = 60_000;
9
10
  const MIN_MONITOR_INTERVAL_MS = 5_000;
10
11
  const MONITOR_OWNER_ID = `monitor:${process.pid}`;
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
2
- import { type ProviderId } from "./providers.js";
2
+ import { type ApiKeyProviderId, type ProviderId } from "./providers.js";
3
3
  export type ConnectResult = {
4
4
  status: "connected";
5
5
  } | {
@@ -22,7 +22,7 @@ export type ConnectResult = {
22
22
  * provider-setup form. Validation is the caller's responsibility — both
23
23
  * call sites run `validateCredential` before invoking this helper.
24
24
  */
25
- export declare function persistProviderCredential(providerId: ProviderId, key: string): void;
25
+ export declare function persistProviderCredential(providerId: ApiKeyProviderId, key: string): void;
26
26
  /**
27
27
  * Run the connect flow for a single provider.
28
28
  *
@@ -18,7 +18,7 @@
18
18
  // call will surface any lingering issue via the credential-required tag.
19
19
  import { loadConfig, loadFileConfig, saveFileConfig, } from "../config.js";
20
20
  import { openInBrowser } from "../infra/open-url.js";
21
- import { getCredentialSource, getProvider } from "./providers.js";
21
+ import { getCredentialSource, getProvider, isApiKeyProvider, } from "./providers.js";
22
22
  import { loadOnboardingState, markProviderCompleted, saveOnboardingState } from "./state.js";
23
23
  import { validateCredential } from "./validation.js";
24
24
  function writeNested(obj, path, value) {
@@ -48,6 +48,9 @@ function writeNested(obj, path, value) {
48
48
  */
49
49
  export function persistProviderCredential(providerId, key) {
50
50
  const descriptor = getProvider(providerId);
51
+ if (!isApiKeyProvider(descriptor)) {
52
+ throw new Error(`Provider ${providerId} does not accept API keys`);
53
+ }
51
54
  const existing = loadFileConfig();
52
55
  const updated = writeNested(existing, descriptor.configPath, key);
53
56
  saveFileConfig(updated);
@@ -66,6 +69,10 @@ export function persistProviderCredential(providerId, key) {
66
69
  */
67
70
  export async function runProviderConnect(ctx, providerId) {
68
71
  const descriptor = getProvider(providerId);
72
+ if (!isApiKeyProvider(descriptor)) {
73
+ ctx.ui.notify(`${descriptor.displayName} is not configured with an API key. Run opencandle doctor for setup status.`, "warning");
74
+ return { status: "cancelled" };
75
+ }
69
76
  // Env-precedence check.
70
77
  if (getCredentialSource(providerId) === "env") {
71
78
  ctx.ui.notify(`${descriptor.displayName} is currently set via the ${descriptor.envVar} environment variable. ` +
@@ -92,7 +99,7 @@ export async function runProviderConnect(ctx, providerId) {
92
99
  // short-circuit here without writing anything; transient failures warn
93
100
  // but proceed to persist so users don't get stuck on a provider outage.
94
101
  ctx.ui.notify(`Verifying your ${descriptor.displayName} key...`, "info");
95
- const validation = await validateCredential(providerId, trimmed);
102
+ const validation = await validateCredential(descriptor.id, trimmed);
96
103
  if (validation.status === "invalid") {
97
104
  const statusHint = validation.httpStatus !== undefined ? ` (HTTP ${validation.httpStatus})` : "";
98
105
  const messageHint = validation.message ? ` — ${validation.message}` : "";
@@ -109,7 +116,7 @@ export async function runProviderConnect(ctx, providerId) {
109
116
  `Saving it anyway — the next request will surface any issue.`, "warning");
110
117
  // Fall through to persist.
111
118
  }
112
- persistProviderCredential(providerId, trimmed);
119
+ persistProviderCredential(descriptor.id, trimmed);
113
120
  ctx.ui.notify(`${descriptor.displayName} connected. Your key has been saved.`, "info");
114
121
  return { status: "connected" };
115
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/onboarding/connect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/onboarding/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type ExternalToolCommandResult } from "../providers/external-tool-command.js";
2
+ import type { ProviderId } from "./providers.js";
3
+ export type CommandResult = ExternalToolCommandResult;
4
+ export type CommandRunner = (command: string, args: readonly string[], options?: {
5
+ timeoutMs: number;
6
+ }) => Promise<CommandResult>;
7
+ interface ProviderStatusBase {
8
+ readonly providerId: ProviderId;
9
+ readonly kind: "api-key" | "external-tool" | "public-http";
10
+ readonly state: string;
11
+ readonly checkedAt: string;
12
+ readonly cacheHit: boolean;
13
+ readonly message?: string;
14
+ }
15
+ export interface ApiKeyProviderStatus extends ProviderStatusBase {
16
+ readonly kind: "api-key";
17
+ readonly state: "configured" | "missing";
18
+ readonly credentialSource: "env" | "file" | "absent";
19
+ }
20
+ export interface ExternalToolProviderStatus extends ProviderStatusBase {
21
+ readonly kind: "external-tool";
22
+ readonly mode: "install" | "session";
23
+ readonly state: "installed" | "missing" | "session_ok" | "session_missing" | "session_stale" | "skipped" | "error";
24
+ readonly installCmd?: string;
25
+ }
26
+ export interface PublicHttpProviderStatus extends ProviderStatusBase {
27
+ readonly kind: "public-http";
28
+ readonly state: "reachable" | "unreachable" | "error";
29
+ readonly statusCode?: number;
30
+ }
31
+ export type ProviderStatus = ApiKeyProviderStatus | ExternalToolProviderStatus | PublicHttpProviderStatus;
32
+ export interface ProbeProviderStatusOptions {
33
+ readonly mode?: "install" | "session";
34
+ readonly force?: boolean;
35
+ readonly respectSkipped?: boolean;
36
+ readonly commandRunner?: CommandRunner;
37
+ readonly fetchImpl?: typeof fetch;
38
+ readonly now?: Date;
39
+ }
40
+ export declare function clearProviderStatusCache(): void;
41
+ export declare function probeProviderStatus(providerId: ProviderId, options?: ProbeProviderStatusOptions): Promise<ProviderStatus>;
42
+ export declare function probeAllProviderStatuses(options?: Omit<ProbeProviderStatusOptions, "mode">): Promise<ProviderStatus[]>;
43
+ export declare function formatProviderStatus(status: ProviderStatus): string;
44
+ export declare function redactSensitiveOutput(input: string): string;
45
+ export declare const runCommand: CommandRunner;
46
+ export {};
@@ -0,0 +1,256 @@
1
+ import { runExternalToolCommand, } from "../providers/external-tool-command.js";
2
+ import { getCredentialSource, getProvider, isApiKeyProvider, isExternalToolProvider, isPublicHttpProvider, } from "./providers.js";
3
+ import { loadOnboardingState } from "./state.js";
4
+ const STATUS_TTL_MS = 60_000;
5
+ const COMMAND_TIMEOUT_MS = 5_000;
6
+ const PUBLIC_HTTP_TIMEOUT_MS = 3_000;
7
+ const MAX_OUTPUT_CHARS = 32_000;
8
+ const statusCache = new Map();
9
+ export function clearProviderStatusCache() {
10
+ statusCache.clear();
11
+ }
12
+ export async function probeProviderStatus(providerId, options = {}) {
13
+ const provider = getProvider(providerId);
14
+ const mode = isExternalToolProvider(provider) ? (options.mode ?? "install") : "default";
15
+ const cacheKey = `${providerId}:${mode}`;
16
+ const now = options.now ?? new Date();
17
+ const skippedByPreference = isExternalToolProvider(provider) &&
18
+ loadOnboardingState().providers[providerId]?.status === "never_ask";
19
+ if (skippedByPreference && (!options.force || options.respectSkipped)) {
20
+ return {
21
+ providerId,
22
+ kind: "external-tool",
23
+ mode: mode,
24
+ state: "skipped",
25
+ installCmd: provider.installCmd,
26
+ message: `Skipped by user preference; run opencandle doctor --enable ${providerId} to re-enable.`,
27
+ checkedAt: now.toISOString(),
28
+ cacheHit: false,
29
+ };
30
+ }
31
+ if (!options.force) {
32
+ const cached = statusCache.get(cacheKey);
33
+ if (cached && cached.expiresAt > now.getTime()) {
34
+ return { ...cached.status, cacheHit: true };
35
+ }
36
+ }
37
+ let status;
38
+ if (isApiKeyProvider(provider)) {
39
+ const source = getCredentialSource(provider.id);
40
+ status = {
41
+ providerId,
42
+ kind: "api-key",
43
+ state: source === "absent" ? "missing" : "configured",
44
+ credentialSource: source,
45
+ checkedAt: now.toISOString(),
46
+ cacheHit: false,
47
+ };
48
+ }
49
+ else if (isExternalToolProvider(provider)) {
50
+ status = await probeExternalTool(providerId, mode, {
51
+ now,
52
+ commandRunner: options.commandRunner ?? runCommand,
53
+ });
54
+ }
55
+ else if (isPublicHttpProvider(provider)) {
56
+ status = await probePublicHttp(providerId, {
57
+ now,
58
+ fetchImpl: options.fetchImpl ?? fetch,
59
+ });
60
+ }
61
+ else {
62
+ const exhaustive = provider;
63
+ throw new Error(`Unsupported provider kind: ${JSON.stringify(exhaustive)}`);
64
+ }
65
+ statusCache.set(cacheKey, { status, expiresAt: now.getTime() + STATUS_TTL_MS });
66
+ return status;
67
+ }
68
+ export async function probeAllProviderStatuses(options = {}) {
69
+ const { listAllProviders } = await import("./providers.js");
70
+ const statuses = [];
71
+ for (const provider of listAllProviders()) {
72
+ statuses.push(await probeProviderStatus(provider.id, options));
73
+ }
74
+ return statuses;
75
+ }
76
+ export function formatProviderStatus(status) {
77
+ const provider = getProvider(status.providerId);
78
+ if (status.kind === "api-key") {
79
+ return `${provider.displayName}: ${status.state} (${status.credentialSource})`;
80
+ }
81
+ if (status.kind === "external-tool") {
82
+ const suffix = status.message ? ` - ${status.message}` : "";
83
+ return `${provider.displayName}: ${status.state} (${status.mode})${suffix}`;
84
+ }
85
+ const http = status.statusCode === undefined ? "" : ` HTTP ${status.statusCode}`;
86
+ const suffix = status.message ? ` - ${status.message}` : "";
87
+ return `${provider.displayName}: ${status.state}${http}${suffix}`;
88
+ }
89
+ async function probeExternalTool(providerId, mode, options) {
90
+ const provider = getProvider(providerId);
91
+ if (!isExternalToolProvider(provider)) {
92
+ throw new Error(`Provider ${providerId} is not an external tool`);
93
+ }
94
+ const args = mode === "install"
95
+ ? ["--version"]
96
+ : (provider.sessionProbeArgs ?? ["feed", "--max", "1", "--json"]);
97
+ try {
98
+ const result = await options.commandRunner(provider.binary, args, {
99
+ timeoutMs: COMMAND_TIMEOUT_MS,
100
+ });
101
+ const output = redactSensitiveOutput(`${result.stderr}\n${result.stdout}`.trim());
102
+ if (mode === "install") {
103
+ return {
104
+ providerId,
105
+ kind: "external-tool",
106
+ mode,
107
+ state: result.code === 0 ? "installed" : "error",
108
+ installCmd: provider.installCmd,
109
+ message: result.code === 0 ? undefined : output,
110
+ checkedAt: options.now.toISOString(),
111
+ cacheHit: false,
112
+ };
113
+ }
114
+ if (result.code === 0) {
115
+ const parsed = parseCliEnvelope(result.stdout, provider.binary);
116
+ const session = classifySessionEnvelope(providerId, parsed);
117
+ return {
118
+ providerId,
119
+ kind: "external-tool",
120
+ mode,
121
+ state: session.state,
122
+ installCmd: provider.installCmd,
123
+ message: session.message,
124
+ checkedAt: options.now.toISOString(),
125
+ cacheHit: false,
126
+ };
127
+ }
128
+ return {
129
+ providerId,
130
+ kind: "external-tool",
131
+ mode,
132
+ state: classifySessionFailure(output),
133
+ installCmd: provider.installCmd,
134
+ message: output,
135
+ checkedAt: options.now.toISOString(),
136
+ cacheHit: false,
137
+ };
138
+ }
139
+ catch (err) {
140
+ const nodeError = err;
141
+ if (nodeError.code === "ENOENT") {
142
+ return {
143
+ providerId,
144
+ kind: "external-tool",
145
+ mode,
146
+ state: "missing",
147
+ installCmd: provider.installCmd,
148
+ checkedAt: options.now.toISOString(),
149
+ cacheHit: false,
150
+ };
151
+ }
152
+ return {
153
+ providerId,
154
+ kind: "external-tool",
155
+ mode,
156
+ state: "error",
157
+ installCmd: provider.installCmd,
158
+ message: redactSensitiveOutput(err instanceof Error ? err.message : String(err)),
159
+ checkedAt: options.now.toISOString(),
160
+ cacheHit: false,
161
+ };
162
+ }
163
+ }
164
+ async function probePublicHttp(providerId, options) {
165
+ const provider = getProvider(providerId);
166
+ if (!isPublicHttpProvider(provider)) {
167
+ throw new Error(`Provider ${providerId} is not a public HTTP provider`);
168
+ }
169
+ try {
170
+ const response = await options.fetchImpl(provider.probeUrl, {
171
+ method: "GET",
172
+ signal: AbortSignal.timeout(PUBLIC_HTTP_TIMEOUT_MS),
173
+ });
174
+ return {
175
+ providerId,
176
+ kind: "public-http",
177
+ state: response.ok ? "reachable" : "unreachable",
178
+ statusCode: response.status,
179
+ checkedAt: options.now.toISOString(),
180
+ cacheHit: false,
181
+ };
182
+ }
183
+ catch (err) {
184
+ return {
185
+ providerId,
186
+ kind: "public-http",
187
+ state: "error",
188
+ message: err instanceof Error ? err.message : String(err),
189
+ checkedAt: options.now.toISOString(),
190
+ cacheHit: false,
191
+ };
192
+ }
193
+ }
194
+ function parseCliEnvelope(stdout, binary) {
195
+ try {
196
+ const parsed = JSON.parse(stdout);
197
+ return {
198
+ ok: parsed.ok === true,
199
+ data: parsed.data,
200
+ message: typeof parsed.error?.message === "string"
201
+ ? redactSensitiveOutput(parsed.error.message)
202
+ : undefined,
203
+ };
204
+ }
205
+ catch {
206
+ return { ok: false, message: `${binary} returned non-JSON output` };
207
+ }
208
+ }
209
+ function classifySessionEnvelope(providerId, parsed) {
210
+ if (!parsed.ok) {
211
+ return {
212
+ state: classifySessionFailure(parsed.message),
213
+ message: parsed.message,
214
+ };
215
+ }
216
+ if (providerId === "reddit" && isRecord(parsed.data) && parsed.data.authenticated === false) {
217
+ return {
218
+ state: "session_missing",
219
+ message: "Reddit is not authenticated. Run rdt login.",
220
+ };
221
+ }
222
+ return { state: "session_ok" };
223
+ }
224
+ function isRecord(value) {
225
+ return typeof value === "object" && value !== null;
226
+ }
227
+ function classifySessionFailure(message) {
228
+ const lower = (message ?? "").toLowerCase();
229
+ if (lower.includes("no twitter cookies") ||
230
+ lower.includes("no reddit cookies") ||
231
+ lower.includes("not authenticated") ||
232
+ lower.includes("no cookies")) {
233
+ return "session_missing";
234
+ }
235
+ if (lower.includes("401") || lower.includes("unauthorized") || lower.includes("expired")) {
236
+ return "session_stale";
237
+ }
238
+ return "error";
239
+ }
240
+ export function redactSensitiveOutput(input) {
241
+ const xCookieNames = "auth_token|ct0|twid|kdt|guest_id|guest_id_ads|guest_id_marketing|personalization_id";
242
+ const genericSecretName = "[a-z0-9_]*(?:session|token)[a-z0-9_]*|[a-z0-9_]+cookie[a-z0-9_]*|[a-z0-9_]*cookie[a-z0-9_]+";
243
+ return input
244
+ .slice(0, MAX_OUTPUT_CHARS)
245
+ .replace(/\b(cookie|set-cookie)\s*:\s*[^\r\n]+/gi, "$1: [redacted]")
246
+ .replace(new RegExp(`\\b(${xCookieNames})\\b\\s*[:=]\\s*[^;\\s,)]+`, "gi"), "$1=[redacted]")
247
+ .replace(new RegExp(`\\b(${xCookieNames})=([^;\\s,)]+)`, "gi"), "$1=[redacted]")
248
+ .replace(new RegExp(`\\b(${genericSecretName})\\b\\s*[:=]\\s*[^;\\s,)]+`, "gi"), "$1=[redacted]")
249
+ .replace(new RegExp(`\\b(${genericSecretName})=([^;\\s,)]+)`, "gi"), "$1=[redacted]")
250
+ .replace(/(?:~|\/Users\/[^/\s]+|\/home\/[^/\s]+)?\/\.config\/rdt-cli\/credential\.json/g, "[redacted-credential-path]");
251
+ }
252
+ export const runCommand = (command, args, options) => runExternalToolCommand(command, args, {
253
+ timeoutMs: options?.timeoutMs ?? COMMAND_TIMEOUT_MS,
254
+ maxOutputChars: MAX_OUTPUT_CHARS,
255
+ });
256
+ //# sourceMappingURL=provider-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-status.js","sourceRoot":"","sources":["../../src/onboarding/provider-status.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,12 @@
1
- export type ProviderId = "alpha_vantage" | "fred" | "finnhub" | "brave" | "exa";
2
- export type ProviderCategory = "fundamentals" | "macro" | "news" | "web_search";
1
+ export type ApiKeyProviderId = "alpha_vantage" | "fred" | "finnhub" | "brave" | "exa";
2
+ export type ExternalToolProviderId = "twitter" | "reddit";
3
+ export type PublicHttpProviderId = "yahoo";
4
+ export type ProviderId = ApiKeyProviderId | ExternalToolProviderId | PublicHttpProviderId;
5
+ export type ProviderCategory = "fundamentals" | "macro" | "news" | "web_search" | "sentiment" | "market";
3
6
  export type ProviderTier = "hard" | "soft";
4
- export interface ProviderDescriptor {
7
+ interface BaseProviderDescriptor {
5
8
  readonly id: ProviderId;
9
+ readonly kind: "api-key" | "external-tool" | "public-http";
6
10
  readonly displayName: string;
7
11
  readonly category: ProviderCategory;
8
12
  /**
@@ -15,11 +19,6 @@ export interface ProviderDescriptor {
15
19
  readonly tier: ProviderTier;
16
20
  /** Lowercase friendly aliases accepted by `/connect` in addition to the id. */
17
21
  readonly aliases: readonly string[];
18
- readonly signupUrl: string;
19
- readonly freeTier: boolean;
20
- readonly envVar: string;
21
- /** Nested key path into `OpenCandleFileConfig` where the key is persisted. */
22
- readonly configPath: readonly string[];
23
22
  readonly unlocks: readonly string[];
24
23
  /**
25
24
  * Human copy describing the degraded experience when missing, or `null`
@@ -29,8 +28,33 @@ export interface ProviderDescriptor {
29
28
  readonly snoozeDurationDays: number;
30
29
  readonly instructionsHint: string;
31
30
  }
31
+ export interface ApiKeyProviderDescriptor extends BaseProviderDescriptor {
32
+ readonly id: ApiKeyProviderId;
33
+ readonly kind: "api-key";
34
+ readonly signupUrl: string;
35
+ readonly freeTier: boolean;
36
+ readonly envVar: string;
37
+ /** Nested key path into `OpenCandleFileConfig` where the key is persisted. */
38
+ readonly configPath: readonly string[];
39
+ }
40
+ export interface ExternalToolProviderDescriptor extends BaseProviderDescriptor {
41
+ readonly id: ExternalToolProviderId;
42
+ readonly kind: "external-tool";
43
+ readonly binary: string;
44
+ readonly installCmd: string;
45
+ readonly sessionSource: "browser-cookies";
46
+ readonly supportedBrowsers?: readonly string[];
47
+ readonly sessionProbeArgs?: readonly string[];
48
+ }
49
+ export interface PublicHttpProviderDescriptor extends BaseProviderDescriptor {
50
+ readonly id: PublicHttpProviderId;
51
+ readonly kind: "public-http";
52
+ readonly probeUrl: string;
53
+ }
54
+ export type ProviderDescriptor = ApiKeyProviderDescriptor | ExternalToolProviderDescriptor | PublicHttpProviderDescriptor;
32
55
  export declare const PROVIDERS: readonly [{
33
56
  readonly id: "alpha_vantage";
57
+ readonly kind: "api-key";
34
58
  readonly displayName: "Alpha Vantage";
35
59
  readonly category: "fundamentals";
36
60
  readonly tier: "hard";
@@ -45,6 +69,7 @@ export declare const PROVIDERS: readonly [{
45
69
  readonly instructionsHint: "Free, about 30 seconds, signup opens in your browser";
46
70
  }, {
47
71
  readonly id: "fred";
72
+ readonly kind: "api-key";
48
73
  readonly displayName: "FRED";
49
74
  readonly category: "macro";
50
75
  readonly tier: "hard";
@@ -59,6 +84,7 @@ export declare const PROVIDERS: readonly [{
59
84
  readonly instructionsHint: "Free, about 30 seconds, requires a St. Louis Fed account";
60
85
  }, {
61
86
  readonly id: "finnhub";
87
+ readonly kind: "api-key";
62
88
  readonly displayName: "Finnhub";
63
89
  readonly category: "news";
64
90
  readonly tier: "soft";
@@ -73,6 +99,7 @@ export declare const PROVIDERS: readonly [{
73
99
  readonly instructionsHint: "Free, about 30 seconds, signup opens in your browser";
74
100
  }, {
75
101
  readonly id: "brave";
102
+ readonly kind: "api-key";
76
103
  readonly displayName: "Brave Search";
77
104
  readonly category: "web_search";
78
105
  readonly tier: "soft";
@@ -87,6 +114,7 @@ export declare const PROVIDERS: readonly [{
87
114
  readonly instructionsHint: "Free tier available, signup opens in your browser";
88
115
  }, {
89
116
  readonly id: "exa";
117
+ readonly kind: "api-key";
90
118
  readonly displayName: "Exa";
91
119
  readonly category: "web_search";
92
120
  readonly tier: "soft";
@@ -99,8 +127,56 @@ export declare const PROVIDERS: readonly [{
99
127
  readonly fallbackDescription: "Exa search continues to work via the keyless Exa MCP endpoint, which has lower rate limits but similar quality";
100
128
  readonly snoozeDurationDays: 7;
101
129
  readonly instructionsHint: "Paid with free tier, signup opens in your browser";
130
+ }, {
131
+ readonly id: "yahoo";
132
+ readonly kind: "public-http";
133
+ readonly displayName: "Yahoo Finance";
134
+ readonly category: "market";
135
+ readonly tier: "hard";
136
+ readonly aliases: readonly ["yahoo", "yahoo-finance", "market-data", "options"];
137
+ readonly probeUrl: "https://query1.finance.yahoo.com/v8/finance/chart/SPY?interval=1d&range=1d";
138
+ readonly unlocks: readonly ["quotes", "historical prices", "option chains", "market data"];
139
+ readonly fallbackDescription: null;
140
+ readonly snoozeDurationDays: 7;
141
+ readonly instructionsHint: "No account needed; OpenCandle checks public Yahoo Finance reachability";
142
+ }, {
143
+ readonly id: "twitter";
144
+ readonly kind: "external-tool";
145
+ readonly displayName: "X / Twitter";
146
+ readonly category: "sentiment";
147
+ readonly tier: "soft";
148
+ readonly aliases: readonly ["twitter", "x", "x-sentiment", "twitter-sentiment"];
149
+ readonly binary: "twitter";
150
+ readonly installCmd: "uv tool install twitter-cli";
151
+ readonly sessionSource: "browser-cookies";
152
+ readonly sessionProbeArgs: readonly ["feed", "--max", "1", "--json"];
153
+ readonly supportedBrowsers: readonly ["Chrome", "Arc", "Edge", "Firefox", "Brave"];
154
+ readonly unlocks: readonly ["X/Twitter sentiment", "recent ticker mentions", "social engagement context"];
155
+ readonly fallbackDescription: "Sentiment summaries continue with Reddit, web search, and news when X is unavailable";
156
+ readonly snoozeDurationDays: 7;
157
+ readonly instructionsHint: "Install twitter-cli and stay logged into x.com in a supported browser";
158
+ }, {
159
+ readonly id: "reddit";
160
+ readonly kind: "external-tool";
161
+ readonly displayName: "Reddit";
162
+ readonly category: "sentiment";
163
+ readonly tier: "soft";
164
+ readonly aliases: readonly ["reddit", "reddit-sentiment", "subreddit"];
165
+ readonly binary: "rdt";
166
+ readonly installCmd: "uv tool install rdt-cli";
167
+ readonly sessionSource: "browser-cookies";
168
+ readonly supportedBrowsers: readonly ["Chrome", "Arc", "Edge", "Firefox", "Brave"];
169
+ readonly sessionProbeArgs: readonly ["status", "--json"];
170
+ readonly unlocks: readonly ["Reddit sentiment", "ticker discussion context", "retail investor discussion"];
171
+ readonly fallbackDescription: "Sentiment summaries continue with X/Twitter, web search, and news when Reddit is unavailable";
172
+ readonly snoozeDurationDays: 7;
173
+ readonly instructionsHint: "Install rdt-cli and stay logged into reddit.com in a supported browser";
102
174
  }];
103
175
  export declare function listAllProviders(): readonly ProviderDescriptor[];
176
+ export declare function isApiKeyProvider(provider: ProviderDescriptor): provider is ApiKeyProviderDescriptor;
177
+ export declare function isExternalToolProvider(provider: ProviderDescriptor): provider is ExternalToolProviderDescriptor;
178
+ export declare function isPublicHttpProvider(provider: ProviderDescriptor): provider is PublicHttpProviderDescriptor;
179
+ export declare function listApiKeyProviders(): readonly ApiKeyProviderDescriptor[];
104
180
  export declare function getProvider(id: ProviderId): ProviderDescriptor;
105
181
  export declare function getProvidersByCategory(category: ProviderCategory): readonly ProviderDescriptor[];
106
182
  export declare function getProvidersByTier(tier: ProviderTier): readonly ProviderDescriptor[];
@@ -114,3 +190,4 @@ export declare function getCredential(id: ProviderId): {
114
190
  value?: undefined;
115
191
  };
116
192
  export declare function resolveProviderFromArgument(arg: string): ProviderDescriptor | readonly ProviderDescriptor[] | undefined;
193
+ export {};