opencandle 0.6.0 → 0.7.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 +10 -3
- package/dist/cli.js +36 -0
- 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/infra/index.d.ts +0 -1
- package/dist/infra/index.js +0 -1
- package/dist/infra/index.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 +48 -0
- package/dist/onboarding/provider-status.js +285 -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/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 +1 -1
- package/dist/prompts/policy-cards.js.map +1 -1
- 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 +36 -0
- package/dist/providers/reddit-cli.js +201 -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 +40 -0
- package/dist/providers/twitter-cli.js +153 -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/planning.d.ts +1 -1
- package/dist/routing/planning.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/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 +18 -0
- package/gui/server/tool-metadata.ts +80 -16
- package/gui/server/ws-hub.ts +19 -0
- package/gui/web/dist/assets/CatalogOverlay-CgeY5Pkp.js +1 -0
- package/gui/web/dist/assets/index-C6W_2eAn.js +69 -0
- package/gui/web/dist/assets/{index-2KZtKBmu.css → index-hwbx24a5.css} +1 -1
- package/gui/web/dist/index.html +2 -2
- package/package.json +5 -6
- package/src/cli.ts +41 -0
- package/src/config.ts +27 -0
- package/src/infra/index.ts +0 -1
- package/src/onboarding/connect.ts +20 -4
- package/src/onboarding/provider-status.ts +410 -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/tool-adapter.ts +14 -4
- package/src/prompts/context-builder.ts +1 -1
- package/src/prompts/policy-cards.ts +1 -1
- package/src/providers/external-tool-error.ts +20 -0
- package/src/providers/reddit-cli.ts +317 -0
- package/src/providers/reddit.ts +7 -63
- package/src/providers/twitter-cli.ts +233 -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/planning.ts +1 -0
- 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/README.md
CHANGED
|
@@ -93,6 +93,13 @@ Useful slash commands:
|
|
|
93
93
|
/analyze AAPL
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
+
Provider diagnostics run from your shell:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
opencandle doctor
|
|
100
|
+
opencandle doctor --enable twitter
|
|
101
|
+
```
|
|
102
|
+
|
|
96
103
|
## Data Sources
|
|
97
104
|
|
|
98
105
|
| Area | Examples | Source |
|
|
@@ -102,11 +109,11 @@ Useful slash commands:
|
|
|
102
109
|
| Fundamentals | Overview, financials, earnings, DCF, comparable companies | Alpha Vantage |
|
|
103
110
|
| Macro | Rates, CPI, GDP, unemployment, crypto Fear & Greed | FRED, alternative.me |
|
|
104
111
|
| Technical | Indicators and strategy backtests | Local calculations over market history |
|
|
105
|
-
| Sentiment | Reddit, Twitter/X, Finnhub news, and web sentiment |
|
|
112
|
+
| Sentiment | Reddit, Twitter/X, Finnhub news, and web sentiment | `rdt-cli` and `twitter-cli` using your normal browser sessions, Finnhub, Exa, Brave, DuckDuckGo |
|
|
106
113
|
| Filings | SEC filing search | SEC EDGAR |
|
|
107
114
|
| Portfolio | Watchlists, holdings, prediction tracking, correlation, risk | Local state plus market data |
|
|
108
115
|
|
|
109
|
-
Yahoo Finance, CoinGecko,
|
|
116
|
+
Yahoo Finance, CoinGecko, SEC EDGAR, DuckDuckGo search, and the alternative.me crypto Fear & Greed index do not require OpenCandle provider keys. Reddit sentiment requires `rdt-cli` (`uv tool install rdt-cli`) plus an active Reddit session in your normal browser. Twitter/X sentiment requires `twitter-cli` (`uv tool install twitter-cli`) plus an active x.com session in your normal browser. Alpha Vantage, FRED, Brave, Exa, and Finnhub unlock deeper coverage when configured.
|
|
110
117
|
|
|
111
118
|
## Configuration
|
|
112
119
|
|
|
@@ -164,7 +171,7 @@ Project shape:
|
|
|
164
171
|
src/
|
|
165
172
|
|-- providers/ API clients
|
|
166
173
|
|-- tools/ Tool implementations by domain
|
|
167
|
-
|-- infra/ Cache, rate limiter, HTTP
|
|
174
|
+
|-- infra/ Cache, rate limiter, HTTP client, paths
|
|
168
175
|
|-- routing/ Request understanding, entity extraction, slot resolution
|
|
169
176
|
|-- workflows/ WorkflowDefinition builders
|
|
170
177
|
|-- runtime/ Session coordinator, workflow runner, runtime context
|
package/dist/cli.js
CHANGED
|
@@ -6,6 +6,9 @@ import { dirname, resolve } from "node:path";
|
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { AuthStorage, createAgentSessionRuntime, createAgentSessionServices, DefaultPackageManager, getAgentDir, InteractiveMode, initTheme, ModelRegistry, SettingsManager, } from "@earendil-works/pi-coding-agent";
|
|
8
8
|
import { loadEnv } from "./config.js";
|
|
9
|
+
import { formatProviderStatus, probeAllProviderStatuses } from "./onboarding/provider-status.js";
|
|
10
|
+
import { getProvider } from "./onboarding/providers.js";
|
|
11
|
+
import { clearProviderOnboardingEntry, loadOnboardingState, saveOnboardingState, } from "./onboarding/state.js";
|
|
9
12
|
import { createOpenCandleSession } from "./pi/session.js";
|
|
10
13
|
import { continueOpenCandleSession } from "./pi/session-storage.js";
|
|
11
14
|
const require = createRequire(import.meta.url);
|
|
@@ -138,6 +141,36 @@ async function handleMonitorCommand(args, cwd) {
|
|
|
138
141
|
process.exitCode = exitCode;
|
|
139
142
|
return true;
|
|
140
143
|
}
|
|
144
|
+
async function handleDoctorCommand(args) {
|
|
145
|
+
if (args[0] !== "doctor")
|
|
146
|
+
return false;
|
|
147
|
+
loadEnv();
|
|
148
|
+
const enableFlag = args.findIndex((arg) => arg === "--enable" || arg === "--reenable");
|
|
149
|
+
if (enableFlag >= 0) {
|
|
150
|
+
const providerId = args[enableFlag + 1];
|
|
151
|
+
if (!providerId) {
|
|
152
|
+
console.error("Usage: opencandle doctor --enable <provider>");
|
|
153
|
+
process.exitCode = 1;
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
getProvider(providerId);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
console.error(`Unknown provider: ${providerId}`);
|
|
161
|
+
process.exitCode = 1;
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
saveOnboardingState(clearProviderOnboardingEntry(loadOnboardingState(), providerId));
|
|
165
|
+
console.log(`Re-enabled ${providerId}.`);
|
|
166
|
+
}
|
|
167
|
+
const statuses = await probeAllProviderStatuses({ force: args.includes("--no-cache") });
|
|
168
|
+
console.log("OpenCandle provider status");
|
|
169
|
+
for (const status of statuses) {
|
|
170
|
+
console.log(` ${formatProviderStatus(status)}`);
|
|
171
|
+
}
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
141
174
|
async function main() {
|
|
142
175
|
const rawArgs = process.argv.slice(2);
|
|
143
176
|
const cwd = process.cwd();
|
|
@@ -148,6 +181,9 @@ async function main() {
|
|
|
148
181
|
if (await handleMonitorCommand(rawArgs, cwd)) {
|
|
149
182
|
return;
|
|
150
183
|
}
|
|
184
|
+
if (await handleDoctorCommand(rawArgs)) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
151
187
|
if (await handlePackageCommand(rawArgs, cwd, agentDir)) {
|
|
152
188
|
return;
|
|
153
189
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -4,6 +4,11 @@ export interface SentimentConfig {
|
|
|
4
4
|
defaultSubreddits: string[];
|
|
5
5
|
commentsPerPost: number;
|
|
6
6
|
divergenceThreshold: number;
|
|
7
|
+
minUsefulSampleSize?: number;
|
|
8
|
+
maxInsightDriversPerPolarity?: number;
|
|
9
|
+
maxRepresentativeItemsPerSource?: number;
|
|
10
|
+
maxAggregateRepresentativeItems?: number;
|
|
11
|
+
maxNotableClaims?: number;
|
|
7
12
|
}
|
|
8
13
|
export type RouterMode = "rules" | "llm";
|
|
9
14
|
export type ToolScopeMode = "observe" | "enforce";
|
|
@@ -62,6 +67,11 @@ export interface OpenCandleFileConfig {
|
|
|
62
67
|
defaultSubreddits?: string[];
|
|
63
68
|
commentsPerPost?: number;
|
|
64
69
|
divergenceThreshold?: number;
|
|
70
|
+
minUsefulSampleSize?: number;
|
|
71
|
+
maxInsightDriversPerPolarity?: number;
|
|
72
|
+
maxRepresentativeItemsPerSource?: number;
|
|
73
|
+
maxAggregateRepresentativeItems?: number;
|
|
74
|
+
maxNotableClaims?: number;
|
|
65
75
|
};
|
|
66
76
|
}
|
|
67
77
|
export declare function loadEnv(path?: string): void;
|
package/dist/config.js
CHANGED
|
@@ -28,6 +28,11 @@ const SENTIMENT_DEFAULTS = {
|
|
|
28
28
|
defaultSubreddits: ["wallstreetbets", "stocks", "investing", "options"],
|
|
29
29
|
commentsPerPost: 5,
|
|
30
30
|
divergenceThreshold: 0.4,
|
|
31
|
+
minUsefulSampleSize: 10,
|
|
32
|
+
maxInsightDriversPerPolarity: 3,
|
|
33
|
+
maxRepresentativeItemsPerSource: 5,
|
|
34
|
+
maxAggregateRepresentativeItems: 8,
|
|
35
|
+
maxNotableClaims: 5,
|
|
31
36
|
};
|
|
32
37
|
const PLANNING_TASK_FAMILIES = [
|
|
33
38
|
"single_asset_decision",
|
|
@@ -114,6 +119,14 @@ function resolveConfig(fileConfig) {
|
|
|
114
119
|
defaultSubreddits: fileSentiment?.defaultSubreddits ?? SENTIMENT_DEFAULTS.defaultSubreddits,
|
|
115
120
|
commentsPerPost: fileSentiment?.commentsPerPost ?? SENTIMENT_DEFAULTS.commentsPerPost,
|
|
116
121
|
divergenceThreshold: fileSentiment?.divergenceThreshold ?? SENTIMENT_DEFAULTS.divergenceThreshold,
|
|
122
|
+
minUsefulSampleSize: fileSentiment?.minUsefulSampleSize ?? SENTIMENT_DEFAULTS.minUsefulSampleSize,
|
|
123
|
+
maxInsightDriversPerPolarity: fileSentiment?.maxInsightDriversPerPolarity ??
|
|
124
|
+
SENTIMENT_DEFAULTS.maxInsightDriversPerPolarity,
|
|
125
|
+
maxRepresentativeItemsPerSource: fileSentiment?.maxRepresentativeItemsPerSource ??
|
|
126
|
+
SENTIMENT_DEFAULTS.maxRepresentativeItemsPerSource,
|
|
127
|
+
maxAggregateRepresentativeItems: fileSentiment?.maxAggregateRepresentativeItems ??
|
|
128
|
+
SENTIMENT_DEFAULTS.maxAggregateRepresentativeItems,
|
|
129
|
+
maxNotableClaims: fileSentiment?.maxNotableClaims ?? SENTIMENT_DEFAULTS.maxNotableClaims,
|
|
117
130
|
},
|
|
118
131
|
};
|
|
119
132
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/infra/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { StealthBrowser } from "./browser.js";
|
|
2
1
|
export { Cache, cache, TTL } from "./cache.js";
|
|
3
2
|
export { type HttpClientOptions, HttpError, httpGet } from "./http-client.js";
|
|
4
3
|
export { ensureOpenCandleHomeDir, ensureParentDir, getBrowserProfileDir, getConfigPath, getLogsDir, getOnboardingPath, getOpenCandleHomeDir, getStateDbPath, resolveOpenCandlePath, } from "./opencandle-paths.js";
|
package/dist/infra/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { StealthBrowser } from "./browser.js";
|
|
2
1
|
export { Cache, cache, TTL } from "./cache.js";
|
|
3
2
|
export { HttpError, httpGet } from "./http-client.js";
|
|
4
3
|
export { ensureOpenCandleHomeDir, ensureParentDir, getBrowserProfileDir, getConfigPath, getLogsDir, getOnboardingPath, getOpenCandleHomeDir, getStateDbPath, resolveOpenCandlePath, } from "./opencandle-paths.js";
|
package/dist/infra/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infra/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infra/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAA0B,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -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,48 @@
|
|
|
1
|
+
import type { ProviderId } from "./providers.js";
|
|
2
|
+
export interface CommandResult {
|
|
3
|
+
readonly code: number | null;
|
|
4
|
+
readonly stdout: string;
|
|
5
|
+
readonly stderr: string;
|
|
6
|
+
}
|
|
7
|
+
export type CommandRunner = (command: string, args: readonly string[], options?: {
|
|
8
|
+
timeoutMs: number;
|
|
9
|
+
}) => Promise<CommandResult>;
|
|
10
|
+
interface ProviderStatusBase {
|
|
11
|
+
readonly providerId: ProviderId;
|
|
12
|
+
readonly kind: "api-key" | "external-tool" | "public-http";
|
|
13
|
+
readonly state: string;
|
|
14
|
+
readonly checkedAt: string;
|
|
15
|
+
readonly cacheHit: boolean;
|
|
16
|
+
readonly message?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ApiKeyProviderStatus extends ProviderStatusBase {
|
|
19
|
+
readonly kind: "api-key";
|
|
20
|
+
readonly state: "configured" | "missing";
|
|
21
|
+
readonly credentialSource: "env" | "file" | "absent";
|
|
22
|
+
}
|
|
23
|
+
export interface ExternalToolProviderStatus extends ProviderStatusBase {
|
|
24
|
+
readonly kind: "external-tool";
|
|
25
|
+
readonly mode: "install" | "session";
|
|
26
|
+
readonly state: "installed" | "missing" | "session_ok" | "session_missing" | "session_stale" | "skipped" | "error";
|
|
27
|
+
readonly installCmd?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface PublicHttpProviderStatus extends ProviderStatusBase {
|
|
30
|
+
readonly kind: "public-http";
|
|
31
|
+
readonly state: "reachable" | "unreachable" | "error";
|
|
32
|
+
readonly statusCode?: number;
|
|
33
|
+
}
|
|
34
|
+
export type ProviderStatus = ApiKeyProviderStatus | ExternalToolProviderStatus | PublicHttpProviderStatus;
|
|
35
|
+
export interface ProbeProviderStatusOptions {
|
|
36
|
+
readonly mode?: "install" | "session";
|
|
37
|
+
readonly force?: boolean;
|
|
38
|
+
readonly commandRunner?: CommandRunner;
|
|
39
|
+
readonly fetchImpl?: typeof fetch;
|
|
40
|
+
readonly now?: Date;
|
|
41
|
+
}
|
|
42
|
+
export declare function clearProviderStatusCache(): void;
|
|
43
|
+
export declare function probeProviderStatus(providerId: ProviderId, options?: ProbeProviderStatusOptions): Promise<ProviderStatus>;
|
|
44
|
+
export declare function probeAllProviderStatuses(options?: Omit<ProbeProviderStatusOptions, "mode">): Promise<ProviderStatus[]>;
|
|
45
|
+
export declare function formatProviderStatus(status: ProviderStatus): string;
|
|
46
|
+
export declare function redactSensitiveOutput(input: string): string;
|
|
47
|
+
export declare const runCommand: CommandRunner;
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
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) {
|
|
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) => new Promise((resolve, reject) => {
|
|
253
|
+
const child = spawn(command, [...args], { stdio: ["ignore", "pipe", "pipe"] });
|
|
254
|
+
let stdout = "";
|
|
255
|
+
let stderr = "";
|
|
256
|
+
let settled = false;
|
|
257
|
+
const timeout = setTimeout(() => {
|
|
258
|
+
if (settled)
|
|
259
|
+
return;
|
|
260
|
+
settled = true;
|
|
261
|
+
child.kill("SIGTERM");
|
|
262
|
+
reject(new Error(`${command} timed out after ${options?.timeoutMs ?? COMMAND_TIMEOUT_MS}ms`));
|
|
263
|
+
}, options?.timeoutMs ?? COMMAND_TIMEOUT_MS);
|
|
264
|
+
child.stdout.on("data", (chunk) => {
|
|
265
|
+
stdout = (stdout + chunk.toString("utf8")).slice(0, MAX_OUTPUT_CHARS);
|
|
266
|
+
});
|
|
267
|
+
child.stderr.on("data", (chunk) => {
|
|
268
|
+
stderr = (stderr + chunk.toString("utf8")).slice(0, MAX_OUTPUT_CHARS);
|
|
269
|
+
});
|
|
270
|
+
child.on("error", (err) => {
|
|
271
|
+
if (settled)
|
|
272
|
+
return;
|
|
273
|
+
settled = true;
|
|
274
|
+
clearTimeout(timeout);
|
|
275
|
+
reject(err);
|
|
276
|
+
});
|
|
277
|
+
child.on("close", (code) => {
|
|
278
|
+
if (settled)
|
|
279
|
+
return;
|
|
280
|
+
settled = true;
|
|
281
|
+
clearTimeout(timeout);
|
|
282
|
+
resolve({ code, stdout, stderr });
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
//# sourceMappingURL=provider-status.js.map
|