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.
- package/README.md +43 -23
- package/dist/cli-main.d.ts +1 -0
- package/dist/cli-main.js +200 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +14 -194
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/doctor/cli-command.d.ts +1 -0
- package/dist/doctor/cli-command.js +69 -0
- package/dist/doctor/cli-command.js.map +1 -0
- package/dist/doctor/render.d.ts +2 -0
- package/dist/doctor/render.js +32 -0
- package/dist/doctor/render.js.map +1 -0
- package/dist/doctor/report.d.ts +63 -0
- package/dist/doctor/report.js +500 -0
- package/dist/doctor/report.js.map +1 -0
- package/dist/infra/index.d.ts +0 -1
- package/dist/infra/index.js +0 -1
- package/dist/infra/index.js.map +1 -1
- package/dist/infra/native-dependencies.d.ts +8 -0
- package/dist/infra/native-dependencies.js +49 -0
- package/dist/infra/native-dependencies.js.map +1 -1
- package/dist/infra/node-version.js +2 -5
- package/dist/infra/node-version.js.map +1 -1
- package/dist/monitor.d.ts +1 -1
- package/dist/monitor.js +2 -1
- package/dist/monitor.js.map +1 -1
- package/dist/onboarding/connect.d.ts +2 -2
- package/dist/onboarding/connect.js +10 -3
- package/dist/onboarding/connect.js.map +1 -1
- package/dist/onboarding/provider-status.d.ts +46 -0
- package/dist/onboarding/provider-status.js +256 -0
- package/dist/onboarding/provider-status.js.map +1 -0
- package/dist/onboarding/providers.d.ts +85 -8
- package/dist/onboarding/providers.js +87 -9
- package/dist/onboarding/providers.js.map +1 -1
- package/dist/onboarding/state.d.ts +1 -0
- package/dist/onboarding/state.js +5 -0
- package/dist/onboarding/state.js.map +1 -1
- package/dist/onboarding/tool-tags.d.ts +12 -1
- package/dist/onboarding/tool-tags.js +31 -1
- package/dist/onboarding/tool-tags.js.map +1 -1
- package/dist/onboarding/validation.d.ts +2 -2
- package/dist/onboarding/validation.js.map +1 -1
- package/dist/pi/opencandle-extension.js +91 -15
- package/dist/pi/opencandle-extension.js.map +1 -1
- package/dist/pi/session.d.ts +0 -1
- package/dist/pi/session.js +2 -1
- package/dist/pi/session.js.map +1 -1
- package/dist/pi/tool-adapter.d.ts +4 -1
- package/dist/pi/tool-adapter.js +5 -4
- package/dist/pi/tool-adapter.js.map +1 -1
- package/dist/prompts/context-builder.js +1 -1
- package/dist/prompts/policy-cards.js +9 -5
- package/dist/prompts/policy-cards.js.map +1 -1
- package/dist/prompts/workflow-prompts.js +10 -6
- package/dist/prompts/workflow-prompts.js.map +1 -1
- package/dist/providers/external-tool-command.d.ts +17 -0
- package/dist/providers/external-tool-command.js +114 -0
- package/dist/providers/external-tool-command.js.map +1 -0
- package/dist/providers/external-tool-error.d.ts +10 -0
- package/dist/providers/external-tool-error.js +21 -0
- package/dist/providers/external-tool-error.js.map +1 -0
- package/dist/providers/reddit-cli.d.ts +32 -0
- package/dist/providers/reddit-cli.js +172 -0
- package/dist/providers/reddit-cli.js.map +1 -0
- package/dist/providers/reddit.d.ts +1 -1
- package/dist/providers/reddit.js +7 -35
- package/dist/providers/reddit.js.map +1 -1
- package/dist/providers/twitter-cli.d.ts +36 -0
- package/dist/providers/twitter-cli.js +124 -0
- package/dist/providers/twitter-cli.js.map +1 -0
- package/dist/providers/twitter.d.ts +0 -8
- package/dist/providers/twitter.js +4 -54
- package/dist/providers/twitter.js.map +1 -1
- package/dist/providers/wrap-provider.js +30 -0
- package/dist/providers/wrap-provider.js.map +1 -1
- package/dist/providers/yahoo-finance.js +53 -32
- package/dist/providers/yahoo-finance.js.map +1 -1
- package/dist/routing/classify-intent.js +7 -3
- package/dist/routing/classify-intent.js.map +1 -1
- package/dist/routing/planning.d.ts +1 -1
- package/dist/routing/planning.js +9 -6
- package/dist/routing/planning.js.map +1 -1
- package/dist/routing/router.js +7 -3
- package/dist/routing/router.js.map +1 -1
- package/dist/runtime/answer-contracts.d.ts +1 -1
- package/dist/runtime/answer-contracts.js +12 -1
- package/dist/runtime/answer-contracts.js.map +1 -1
- package/dist/runtime/tool-defaults-wrapper.js +6 -2
- package/dist/runtime/tool-defaults-wrapper.js.map +1 -1
- package/dist/sentiment/index.d.ts +1 -0
- package/dist/sentiment/index.js +1 -0
- package/dist/sentiment/index.js.map +1 -1
- package/dist/sentiment/insights.d.ts +17 -0
- package/dist/sentiment/insights.js +206 -0
- package/dist/sentiment/insights.js.map +1 -0
- package/dist/sentiment/pipeline.js +13 -1
- package/dist/sentiment/pipeline.js.map +1 -1
- package/dist/sentiment/scorer.d.ts +2 -0
- package/dist/sentiment/scorer.js +10 -1
- package/dist/sentiment/scorer.js.map +1 -1
- package/dist/sentiment/types.d.ts +2 -0
- package/dist/sentiment/types.js.map +1 -1
- package/dist/system-prompt.js +3 -7
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/index.d.ts +5 -2
- package/dist/tools/index.js +8 -8
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/sentiment/insight-format.d.ts +2 -0
- package/dist/tools/sentiment/insight-format.js +36 -0
- package/dist/tools/sentiment/insight-format.js.map +1 -0
- package/dist/tools/sentiment/query-match.d.ts +3 -0
- package/dist/tools/sentiment/query-match.js +113 -0
- package/dist/tools/sentiment/query-match.js.map +1 -0
- package/dist/tools/sentiment/reddit-sentiment.d.ts +12 -1
- package/dist/tools/sentiment/reddit-sentiment.js +263 -117
- package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
- package/dist/tools/sentiment/sentiment-summary.d.ts +9 -1
- package/dist/tools/sentiment/sentiment-summary.js +217 -201
- package/dist/tools/sentiment/sentiment-summary.js.map +1 -1
- package/dist/tools/sentiment/twitter-sentiment.d.ts +11 -1
- package/dist/tools/sentiment/twitter-sentiment.js +187 -64
- package/dist/tools/sentiment/twitter-sentiment.js.map +1 -1
- package/dist/tools/sentiment/web-sentiment.js +4 -0
- package/dist/tools/sentiment/web-sentiment.js.map +1 -1
- package/dist/types/sentiment.d.ts +52 -0
- package/gui/server/http-routes.ts +419 -0
- package/gui/server/invoke-tool.ts +17 -3
- package/gui/server/model-setup.ts +10 -3
- package/gui/server/projector.ts +6 -2
- package/gui/server/server.ts +30 -275
- package/gui/server/tool-metadata.ts +80 -16
- package/gui/server/ws-hub.ts +19 -0
- package/gui/web/dist/assets/CatalogOverlay-CCVKwBUB.js +1 -0
- package/gui/web/dist/assets/index-Dm4Aom2_.js +69 -0
- package/gui/web/dist/assets/{index-2KZtKBmu.css → index-UzZUg3dx.css} +1 -1
- package/gui/web/dist/index.html +2 -2
- package/package.json +17 -14
- package/src/cli-main.ts +233 -0
- package/src/cli.ts +14 -226
- package/src/config.ts +27 -0
- package/src/doctor/cli-command.ts +83 -0
- package/src/doctor/render.ts +37 -0
- package/src/doctor/report.ts +638 -0
- package/src/infra/index.ts +0 -1
- package/src/infra/native-dependencies.ts +67 -0
- package/src/infra/node-version.ts +2 -5
- package/src/monitor.ts +3 -1
- package/src/onboarding/connect.ts +20 -4
- package/src/onboarding/provider-status.ts +382 -0
- package/src/onboarding/providers.ts +148 -18
- package/src/onboarding/state.ts +9 -0
- package/src/onboarding/tool-tags.ts +45 -2
- package/src/onboarding/validation.ts +2 -2
- package/src/pi/opencandle-extension.ts +115 -17
- package/src/pi/session.ts +2 -1
- package/src/pi/tool-adapter.ts +14 -4
- package/src/prompts/context-builder.ts +1 -1
- package/src/prompts/policy-cards.ts +13 -5
- package/src/prompts/workflow-prompts.ts +13 -6
- package/src/providers/external-tool-command.ts +164 -0
- package/src/providers/external-tool-error.ts +20 -0
- package/src/providers/reddit-cli.ts +286 -0
- package/src/providers/reddit.ts +7 -63
- package/src/providers/twitter-cli.ts +202 -0
- package/src/providers/twitter.ts +4 -73
- package/src/providers/wrap-provider.ts +34 -0
- package/src/providers/yahoo-finance.ts +65 -32
- package/src/routing/classify-intent.ts +11 -6
- package/src/routing/planning.ts +16 -10
- package/src/routing/router.ts +11 -6
- package/src/runtime/answer-contracts.ts +23 -2
- package/src/runtime/tool-defaults-wrapper.ts +12 -2
- package/src/sentiment/index.ts +1 -0
- package/src/sentiment/insights.ts +269 -0
- package/src/sentiment/pipeline.ts +13 -1
- package/src/sentiment/scorer.ts +12 -1
- package/src/sentiment/types.ts +3 -0
- package/src/system-prompt.ts +3 -7
- package/src/tools/index.ts +9 -8
- package/src/tools/sentiment/insight-format.ts +50 -0
- package/src/tools/sentiment/query-match.ts +117 -0
- package/src/tools/sentiment/reddit-sentiment.ts +354 -141
- package/src/tools/sentiment/sentiment-summary.ts +283 -237
- package/src/tools/sentiment/twitter-sentiment.ts +262 -78
- package/src/tools/sentiment/web-sentiment.ts +4 -0
- package/src/types/sentiment.ts +59 -0
- package/dist/infra/browser.d.ts +0 -35
- package/dist/infra/browser.js +0 -105
- package/dist/infra/browser.js.map +0 -1
- package/dist/tools/interaction/twitter-login.d.ts +0 -8
- package/dist/tools/interaction/twitter-login.js +0 -87
- package/dist/tools/interaction/twitter-login.js.map +0 -1
- package/gui/web/dist/assets/CatalogOverlay-eJ2cBk33.js +0 -1
- package/gui/web/dist/assets/index-CveNgtDg.js +0 -69
- package/src/infra/browser.ts +0 -113
- 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}`;
|
package/dist/monitor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":";AACA,OAAO,
|
|
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:
|
|
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(
|
|
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(
|
|
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":"AAAA,6EAA6E;AAC7E,uEAAuE;AACvE,4EAA4E;AAC5E,mEAAmE;AACnE,EAAE;AACF,0BAA0B;AAC1B,gFAAgF;AAChF,mDAAmD;AACnD,kDAAkD;AAClD,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,mEAAmE;AACnE,qEAAqE;AACrE,0EAA0E;AAC1E,0EAA0E;AAC1E,2EAA2E;AAC3E,yEAAyE;AAGzE,OAAO,EACL,UAAU,EACV,cAAc,EAEd,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,
|
|
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
|
|
2
|
-
export type
|
|
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
|
-
|
|
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 {};
|