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/README.md
CHANGED
|
@@ -8,19 +8,23 @@ npx opencandle gui
|
|
|
8
8
|
|
|
9
9
|
OpenCandle is an open source financial investigator: a terminal agent and local browser workbench for market research that starts from real provider data, shows source gaps, and keeps risk visible.
|
|
10
10
|
|
|
11
|
-
[
|
|
11
|
+
[](https://github.com/Kahtaf/OpenCandle/actions/workflows/ci.yml)
|
|
12
|
+
[](https://www.npmjs.com/package/opencandle)
|
|
13
|
+
[](https://github.com/Kahtaf/OpenCandle/blob/main/LICENSE)
|
|
14
|
+
|
|
15
|
+
[Docs](https://opencandle.app/docs/) | [First run](https://opencandle.app/docs/first-run.html) | [GUI quickstart](https://opencandle.app/docs/gui-quickstart.html) | [Data sources](https://opencandle.app/docs/data-sources.html) | [Build a tool](https://opencandle.app/docs/build-a-tool.html)
|
|
12
16
|
|
|
13
17
|
## See It Work
|
|
14
18
|
|
|
15
19
|
### Terminal UI
|
|
16
20
|
|
|
17
|
-
[](https://cdn.jsdelivr.net/gh/Kahtaf/OpenCandle@main/assets/opencandle-tui.mp4)
|
|
18
22
|
|
|
19
23
|
[Watch the terminal UI demo](https://cdn.jsdelivr.net/gh/Kahtaf/OpenCandle@main/assets/opencandle-tui.mp4) | [Download MP4](https://github.com/Kahtaf/OpenCandle/raw/refs/heads/main/assets/opencandle-tui.mp4)
|
|
20
24
|
|
|
21
25
|
### Local GUI
|
|
22
26
|
|
|
23
|
-
[](https://cdn.jsdelivr.net/gh/Kahtaf/OpenCandle@main/assets/opencandle-gui.mp4)
|
|
24
28
|
|
|
25
29
|
[Watch the local GUI demo](https://cdn.jsdelivr.net/gh/Kahtaf/OpenCandle@main/assets/opencandle-gui.mp4) | [Download MP4](https://github.com/Kahtaf/OpenCandle/raw/refs/heads/main/assets/opencandle-gui.mp4)
|
|
26
30
|
|
|
@@ -53,13 +57,13 @@ OpenCandle is read-only research software. It does not place trades, route order
|
|
|
53
57
|
|
|
54
58
|
## Quick Start
|
|
55
59
|
|
|
56
|
-
Requires Node.js
|
|
60
|
+
Requires Node.js `>=22.19.0 <27`.
|
|
57
61
|
|
|
58
62
|
```bash
|
|
59
63
|
npx opencandle
|
|
60
64
|
```
|
|
61
65
|
|
|
62
|
-
On first run, OpenCandle walks you through model setup.
|
|
66
|
+
On first run, OpenCandle walks you through model setup. In the terminal, you can use Pi sign-in when available or provide a model API key. In the GUI, use the API-key setup panel or complete terminal `/setup` first and refresh the browser. Data-provider keys are separate and optional.
|
|
63
67
|
|
|
64
68
|
Start the GUI instead:
|
|
65
69
|
|
|
@@ -69,7 +73,7 @@ npx opencandle gui
|
|
|
69
73
|
|
|
70
74
|
Then open `http://127.0.0.1:14567`.
|
|
71
75
|
|
|
72
|
-
For a five-minute path from install to a successful answer, see [
|
|
76
|
+
For a five-minute path from install to a successful answer, see [First Run](https://opencandle.app/docs/first-run.html).
|
|
73
77
|
|
|
74
78
|
## Example Prompts
|
|
75
79
|
|
|
@@ -93,6 +97,18 @@ Useful slash commands:
|
|
|
93
97
|
/analyze AAPL
|
|
94
98
|
```
|
|
95
99
|
|
|
100
|
+
Health diagnostics run from your shell:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
opencandle doctor
|
|
104
|
+
opencandle doctor --json
|
|
105
|
+
opencandle doctor --sessions
|
|
106
|
+
opencandle doctor --full
|
|
107
|
+
opencandle doctor --enable twitter
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The GUI also has a Diagnostics page at `/diagnostics` with the same health report, provider setup links, model setup actions, and an explicit browser-session check for Reddit and Twitter/X.
|
|
111
|
+
|
|
96
112
|
## Data Sources
|
|
97
113
|
|
|
98
114
|
| Area | Examples | Source |
|
|
@@ -102,11 +118,11 @@ Useful slash commands:
|
|
|
102
118
|
| Fundamentals | Overview, financials, earnings, DCF, comparable companies | Alpha Vantage |
|
|
103
119
|
| Macro | Rates, CPI, GDP, unemployment, crypto Fear & Greed | FRED, alternative.me |
|
|
104
120
|
| Technical | Indicators and strategy backtests | Local calculations over market history |
|
|
105
|
-
| Sentiment | Reddit, Twitter/X, Finnhub news, and web sentiment |
|
|
121
|
+
| Sentiment | Reddit, Twitter/X, Finnhub news, and web sentiment | `rdt-cli` and `twitter-cli` using your normal browser sessions, Finnhub, Exa, Brave, DuckDuckGo |
|
|
106
122
|
| Filings | SEC filing search | SEC EDGAR |
|
|
107
123
|
| Portfolio | Watchlists, holdings, prediction tracking, correlation, risk | Local state plus market data |
|
|
108
124
|
|
|
109
|
-
Yahoo Finance, CoinGecko,
|
|
125
|
+
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
126
|
|
|
111
127
|
## Configuration
|
|
112
128
|
|
|
@@ -127,7 +143,7 @@ Model access comes from Pi. Market data provider keys can be set in the environm
|
|
|
127
143
|
| `OPENCANDLE_GUI_PORT` | GUI port, default `14567` |
|
|
128
144
|
| `OPENCANDLE_NOTIFICATION_WEBHOOK_URL` | Optional local webhook target for alert/report notification delivery attempts |
|
|
129
145
|
|
|
130
|
-
Environment variables override `~/.opencandle/config.json`. See [
|
|
146
|
+
Environment variables override `~/.opencandle/config.json`. See [Configuration](https://opencandle.app/docs/configuration.html) for the full reference, including advanced routing and diagnostic switches.
|
|
131
147
|
|
|
132
148
|
## From Source
|
|
133
149
|
|
|
@@ -164,7 +180,7 @@ Project shape:
|
|
|
164
180
|
src/
|
|
165
181
|
|-- providers/ API clients
|
|
166
182
|
|-- tools/ Tool implementations by domain
|
|
167
|
-
|-- infra/ Cache, rate limiter, HTTP
|
|
183
|
+
|-- infra/ Cache, rate limiter, HTTP client, paths
|
|
168
184
|
|-- routing/ Request understanding, entity extraction, slot resolution
|
|
169
185
|
|-- workflows/ WorkflowDefinition builders
|
|
170
186
|
|-- runtime/ Session coordinator, workflow runner, runtime context
|
|
@@ -189,7 +205,7 @@ Package exports:
|
|
|
189
205
|
- `opencandle/tools`
|
|
190
206
|
- `opencandle/workflows`
|
|
191
207
|
|
|
192
|
-
If you want to add a new first-party tool or publish an add-on package, start with [
|
|
208
|
+
If you want to add a new first-party tool or publish an add-on package, start with [Build a Tool](https://opencandle.app/docs/build-a-tool.html).
|
|
193
209
|
|
|
194
210
|
## Development
|
|
195
211
|
|
|
@@ -213,7 +229,7 @@ Baseline check:
|
|
|
213
229
|
npm test
|
|
214
230
|
```
|
|
215
231
|
|
|
216
|
-
The e2e, provider, and eval commands can hit live APIs, live model providers, or local agent CLIs. Run them intentionally; see [
|
|
232
|
+
The e2e, provider, and eval commands can hit live APIs, live model providers, or local agent CLIs. Run them intentionally; see [Testing and Evals](https://opencandle.app/docs/testing-and-evals.html).
|
|
217
233
|
|
|
218
234
|
Repository rules that matter:
|
|
219
235
|
|
|
@@ -231,21 +247,25 @@ npx tsx tests/harness/cli.ts wait --ipc /tmp/opencandle-ipc
|
|
|
231
247
|
npx tsx tests/harness/cli.ts trace --ipc /tmp/opencandle-ipc
|
|
232
248
|
```
|
|
233
249
|
|
|
234
|
-
See [tests/harness/README.md](
|
|
250
|
+
See [tests/harness/README.md](https://github.com/Kahtaf/OpenCandle/blob/main/tests/harness/README.md) for the full flow.
|
|
235
251
|
|
|
236
252
|
## Documentation
|
|
237
253
|
|
|
238
|
-
- [Getting Started](
|
|
239
|
-
- [First Run](
|
|
240
|
-
- [TUI](
|
|
241
|
-
- [GUI Quickstart](
|
|
242
|
-
- [Investigation Recipes](
|
|
243
|
-
- [Data Sources](
|
|
244
|
-
- [Configuration](
|
|
245
|
-
- [System Architecture](
|
|
246
|
-
- [Testing and Evals](
|
|
247
|
-
- [Benchmarking](
|
|
254
|
+
- [Getting Started](https://opencandle.app/docs/getting-started.html)
|
|
255
|
+
- [First Run](https://opencandle.app/docs/first-run.html)
|
|
256
|
+
- [TUI](https://opencandle.app/docs/tui.html)
|
|
257
|
+
- [GUI Quickstart](https://opencandle.app/docs/gui-quickstart.html)
|
|
258
|
+
- [Investigation Recipes](https://opencandle.app/docs/investigation-recipes.html)
|
|
259
|
+
- [Data Sources](https://opencandle.app/docs/data-sources.html)
|
|
260
|
+
- [Configuration](https://opencandle.app/docs/configuration.html)
|
|
261
|
+
- [System Architecture](https://opencandle.app/docs/system-architecture.html)
|
|
262
|
+
- [Testing and Evals](https://opencandle.app/docs/testing-and-evals.html)
|
|
263
|
+
- [Benchmarking](https://opencandle.app/docs/benchmarking.html)
|
|
248
264
|
|
|
249
265
|
## License
|
|
250
266
|
|
|
251
267
|
MIT
|
|
268
|
+
|
|
269
|
+
## Contributing and Security
|
|
270
|
+
|
|
271
|
+
See [Contributing](https://opencandle.app/docs/contributing.html), [Security](https://opencandle.app/docs/security.html), and the [Code of Conduct](https://github.com/Kahtaf/OpenCandle/blob/main/CODE_OF_CONDUCT.md) before opening large changes or reporting sensitive issues. Redact API keys, account identifiers, holdings, and local state from public issues.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/cli-main.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { AuthStorage, createAgentSessionRuntime, createAgentSessionServices, DefaultPackageManager, getAgentDir, InteractiveMode, initTheme, ModelRegistry, SettingsManager, } from "@earendil-works/pi-coding-agent";
|
|
6
|
+
import { loadEnv } from "./config.js";
|
|
7
|
+
import { handleDoctorCommand } from "./doctor/cli-command.js";
|
|
8
|
+
import { createOpenCandleSession } from "./pi/session.js";
|
|
9
|
+
import { continueOpenCandleSession } from "./pi/session-storage.js";
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
12
|
+
async function handlePackageCommand(args, cwd, agentDir) {
|
|
13
|
+
const [command, ...rest] = args;
|
|
14
|
+
if (!command || !["install", "remove", "uninstall", "list", "update"].includes(command)) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const settingsManager = SettingsManager.create(cwd, agentDir);
|
|
18
|
+
const packageManager = new DefaultPackageManager({
|
|
19
|
+
cwd,
|
|
20
|
+
agentDir,
|
|
21
|
+
settingsManager,
|
|
22
|
+
});
|
|
23
|
+
packageManager.setProgressCallback((event) => {
|
|
24
|
+
if (event.type === "start" || event.type === "progress") {
|
|
25
|
+
process.stdout.write(`${event.message}\n`);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
const source = rest.find((a) => !a.startsWith("-"));
|
|
29
|
+
const local = rest.includes("-l") || rest.includes("--local");
|
|
30
|
+
switch (command === "uninstall" ? "remove" : command) {
|
|
31
|
+
case "install": {
|
|
32
|
+
if (!source) {
|
|
33
|
+
console.error("Usage: opencandle install <source> [-l]");
|
|
34
|
+
process.exitCode = 1;
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
await packageManager.install(source, { local });
|
|
38
|
+
packageManager.addSourceToSettings(source, { local });
|
|
39
|
+
console.log(`Installed ${source}`);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
case "remove": {
|
|
43
|
+
if (!source) {
|
|
44
|
+
console.error("Usage: opencandle remove <source> [-l]");
|
|
45
|
+
process.exitCode = 1;
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
await packageManager.remove(source, { local });
|
|
49
|
+
const removed = packageManager.removeSourceFromSettings(source, {
|
|
50
|
+
local,
|
|
51
|
+
});
|
|
52
|
+
if (!removed) {
|
|
53
|
+
console.error(`No matching package found for ${source}`);
|
|
54
|
+
process.exitCode = 1;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
console.log(`Removed ${source}`);
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
case "list": {
|
|
62
|
+
const globalPkgs = settingsManager.getGlobalSettings().packages ?? [];
|
|
63
|
+
const projectPkgs = settingsManager.getProjectSettings().packages ?? [];
|
|
64
|
+
if (globalPkgs.length === 0 && projectPkgs.length === 0) {
|
|
65
|
+
console.log("No packages installed.");
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
if (globalPkgs.length > 0) {
|
|
69
|
+
console.log("User packages:");
|
|
70
|
+
for (const pkg of globalPkgs) {
|
|
71
|
+
const s = typeof pkg === "string" ? pkg : pkg.source;
|
|
72
|
+
const path = packageManager.getInstalledPath(s, "user");
|
|
73
|
+
console.log(` ${s}${path ? `\n ${path}` : ""}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (projectPkgs.length > 0) {
|
|
77
|
+
console.log("Project packages:");
|
|
78
|
+
for (const pkg of projectPkgs) {
|
|
79
|
+
const s = typeof pkg === "string" ? pkg : pkg.source;
|
|
80
|
+
const path = packageManager.getInstalledPath(s, "project");
|
|
81
|
+
console.log(` ${s}${path ? `\n ${path}` : ""}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
case "update": {
|
|
87
|
+
await packageManager.update(source);
|
|
88
|
+
console.log(source ? `Updated ${source}` : "All packages updated.");
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
async function handleGuiCommand(args, cwd) {
|
|
95
|
+
if (args[0] !== "gui")
|
|
96
|
+
return false;
|
|
97
|
+
const tsxCli = require.resolve("tsx/cli");
|
|
98
|
+
const serverPath = resolve(packageRoot, "gui/server/server.ts");
|
|
99
|
+
const child = spawn(process.execPath, [tsxCli, serverPath, ...args.slice(1)], {
|
|
100
|
+
cwd,
|
|
101
|
+
env: process.env,
|
|
102
|
+
stdio: "inherit",
|
|
103
|
+
});
|
|
104
|
+
const exitCode = await new Promise((resolveExit) => {
|
|
105
|
+
child.on("close", (code, signal) => {
|
|
106
|
+
if (signal) {
|
|
107
|
+
resolveExit(1);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
resolveExit(code ?? 0);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
process.exitCode = exitCode;
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
async function handleMonitorCommand(args, cwd) {
|
|
118
|
+
if (args[0] !== "monitor")
|
|
119
|
+
return false;
|
|
120
|
+
const tsxCli = require.resolve("tsx/cli");
|
|
121
|
+
const monitorPath = resolve(packageRoot, "src/monitor.ts");
|
|
122
|
+
const child = spawn(process.execPath, [tsxCli, monitorPath, ...args.slice(1)], {
|
|
123
|
+
cwd,
|
|
124
|
+
env: process.env,
|
|
125
|
+
stdio: "inherit",
|
|
126
|
+
});
|
|
127
|
+
const exitCode = await new Promise((resolveExit) => {
|
|
128
|
+
child.on("close", (code, signal) => {
|
|
129
|
+
if (signal) {
|
|
130
|
+
resolveExit(1);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
resolveExit(code ?? 0);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
process.exitCode = exitCode;
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
async function main() {
|
|
141
|
+
const rawArgs = process.argv.slice(2);
|
|
142
|
+
const cwd = process.cwd();
|
|
143
|
+
const agentDir = getAgentDir();
|
|
144
|
+
loadEnv();
|
|
145
|
+
if (await handleGuiCommand(rawArgs, cwd)) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (await handleMonitorCommand(rawArgs, cwd)) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (await handleDoctorCommand(rawArgs, cwd, agentDir)) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (await handlePackageCommand(rawArgs, cwd, agentDir)) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// Default: start the OpenCandle interactive agent
|
|
158
|
+
const settingsManager = SettingsManager.create(cwd, agentDir);
|
|
159
|
+
const authStorage = AuthStorage.create();
|
|
160
|
+
const modelRegistry = ModelRegistry.create(authStorage);
|
|
161
|
+
const shouldSuppressFallbackMessage = modelRegistry.getAvailable().length === 0;
|
|
162
|
+
initTheme(settingsManager.getTheme(), true);
|
|
163
|
+
const sessionManager = continueOpenCandleSession(cwd);
|
|
164
|
+
const runtime = await createAgentSessionRuntime(async (opts) => {
|
|
165
|
+
const services = await createAgentSessionServices({
|
|
166
|
+
cwd: opts.cwd,
|
|
167
|
+
agentDir: opts.agentDir,
|
|
168
|
+
authStorage,
|
|
169
|
+
settingsManager,
|
|
170
|
+
modelRegistry,
|
|
171
|
+
});
|
|
172
|
+
const result = await createOpenCandleSession({
|
|
173
|
+
cwd: opts.cwd,
|
|
174
|
+
agentDir: opts.agentDir,
|
|
175
|
+
settingsManager,
|
|
176
|
+
authStorage,
|
|
177
|
+
modelRegistry,
|
|
178
|
+
sessionManager: opts.sessionManager,
|
|
179
|
+
bindExtensions: false,
|
|
180
|
+
});
|
|
181
|
+
return {
|
|
182
|
+
...result,
|
|
183
|
+
services,
|
|
184
|
+
diagnostics: services.diagnostics,
|
|
185
|
+
};
|
|
186
|
+
}, { cwd, agentDir, sessionManager });
|
|
187
|
+
try {
|
|
188
|
+
const interactiveMode = new InteractiveMode(runtime, {
|
|
189
|
+
modelFallbackMessage: shouldSuppressFallbackMessage
|
|
190
|
+
? undefined
|
|
191
|
+
: runtime.modelFallbackMessage,
|
|
192
|
+
});
|
|
193
|
+
await interactiveMode.run();
|
|
194
|
+
}
|
|
195
|
+
finally {
|
|
196
|
+
await runtime.dispose();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
await main();
|
|
200
|
+
//# sourceMappingURL=cli-main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-main.js","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
export {};
|
package/dist/cli.js
CHANGED
|
@@ -1,198 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import "./infra/
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
|
|
10
|
-
import { continueOpenCandleSession } from "./pi/session-storage.js";
|
|
11
|
-
const require = createRequire(import.meta.url);
|
|
12
|
-
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
13
|
-
async function handlePackageCommand(args, cwd, agentDir) {
|
|
14
|
-
const [command, ...rest] = args;
|
|
15
|
-
if (!command || !["install", "remove", "uninstall", "list", "update"].includes(command)) {
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
const settingsManager = SettingsManager.create(cwd, agentDir);
|
|
19
|
-
const packageManager = new DefaultPackageManager({
|
|
20
|
-
cwd,
|
|
21
|
-
agentDir,
|
|
22
|
-
settingsManager,
|
|
23
|
-
});
|
|
24
|
-
packageManager.setProgressCallback((event) => {
|
|
25
|
-
if (event.type === "start" || event.type === "progress") {
|
|
26
|
-
process.stdout.write(`${event.message}\n`);
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
const source = rest.find((a) => !a.startsWith("-"));
|
|
30
|
-
const local = rest.includes("-l") || rest.includes("--local");
|
|
31
|
-
switch (command === "uninstall" ? "remove" : command) {
|
|
32
|
-
case "install": {
|
|
33
|
-
if (!source) {
|
|
34
|
-
console.error("Usage: opencandle install <source> [-l]");
|
|
35
|
-
process.exitCode = 1;
|
|
36
|
-
return true;
|
|
37
|
-
}
|
|
38
|
-
await packageManager.install(source, { local });
|
|
39
|
-
packageManager.addSourceToSettings(source, { local });
|
|
40
|
-
console.log(`Installed ${source}`);
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
case "remove": {
|
|
44
|
-
if (!source) {
|
|
45
|
-
console.error("Usage: opencandle remove <source> [-l]");
|
|
46
|
-
process.exitCode = 1;
|
|
47
|
-
return true;
|
|
48
|
-
}
|
|
49
|
-
await packageManager.remove(source, { local });
|
|
50
|
-
const removed = packageManager.removeSourceFromSettings(source, {
|
|
51
|
-
local,
|
|
52
|
-
});
|
|
53
|
-
if (!removed) {
|
|
54
|
-
console.error(`No matching package found for ${source}`);
|
|
55
|
-
process.exitCode = 1;
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
console.log(`Removed ${source}`);
|
|
59
|
-
}
|
|
60
|
-
return true;
|
|
61
|
-
}
|
|
62
|
-
case "list": {
|
|
63
|
-
const globalPkgs = settingsManager.getGlobalSettings().packages ?? [];
|
|
64
|
-
const projectPkgs = settingsManager.getProjectSettings().packages ?? [];
|
|
65
|
-
if (globalPkgs.length === 0 && projectPkgs.length === 0) {
|
|
66
|
-
console.log("No packages installed.");
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
if (globalPkgs.length > 0) {
|
|
70
|
-
console.log("User packages:");
|
|
71
|
-
for (const pkg of globalPkgs) {
|
|
72
|
-
const s = typeof pkg === "string" ? pkg : pkg.source;
|
|
73
|
-
const path = packageManager.getInstalledPath(s, "user");
|
|
74
|
-
console.log(` ${s}${path ? `\n ${path}` : ""}`);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (projectPkgs.length > 0) {
|
|
78
|
-
console.log("Project packages:");
|
|
79
|
-
for (const pkg of projectPkgs) {
|
|
80
|
-
const s = typeof pkg === "string" ? pkg : pkg.source;
|
|
81
|
-
const path = packageManager.getInstalledPath(s, "project");
|
|
82
|
-
console.log(` ${s}${path ? `\n ${path}` : ""}`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
case "update": {
|
|
88
|
-
await packageManager.update(source);
|
|
89
|
-
console.log(source ? `Updated ${source}` : "All packages updated.");
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
async function handleGuiCommand(args, cwd) {
|
|
96
|
-
if (args[0] !== "gui")
|
|
97
|
-
return false;
|
|
98
|
-
const tsxCli = require.resolve("tsx/cli");
|
|
99
|
-
const serverPath = resolve(packageRoot, "gui/server/server.ts");
|
|
100
|
-
const child = spawn(process.execPath, [tsxCli, serverPath, ...args.slice(1)], {
|
|
101
|
-
cwd,
|
|
102
|
-
env: process.env,
|
|
103
|
-
stdio: "inherit",
|
|
104
|
-
});
|
|
105
|
-
const exitCode = await new Promise((resolveExit) => {
|
|
106
|
-
child.on("close", (code, signal) => {
|
|
107
|
-
if (signal) {
|
|
108
|
-
resolveExit(1);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
resolveExit(code ?? 0);
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
process.exitCode = exitCode;
|
|
116
|
-
return true;
|
|
117
|
-
}
|
|
118
|
-
async function handleMonitorCommand(args, cwd) {
|
|
119
|
-
if (args[0] !== "monitor")
|
|
120
|
-
return false;
|
|
121
|
-
const tsxCli = require.resolve("tsx/cli");
|
|
122
|
-
const monitorPath = resolve(packageRoot, "src/monitor.ts");
|
|
123
|
-
const child = spawn(process.execPath, [tsxCli, monitorPath, ...args.slice(1)], {
|
|
124
|
-
cwd,
|
|
125
|
-
env: process.env,
|
|
126
|
-
stdio: "inherit",
|
|
127
|
-
});
|
|
128
|
-
const exitCode = await new Promise((resolveExit) => {
|
|
129
|
-
child.on("close", (code, signal) => {
|
|
130
|
-
if (signal) {
|
|
131
|
-
resolveExit(1);
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
resolveExit(code ?? 0);
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
process.exitCode = exitCode;
|
|
139
|
-
return true;
|
|
140
|
-
}
|
|
141
|
-
async function main() {
|
|
142
|
-
const rawArgs = process.argv.slice(2);
|
|
143
|
-
const cwd = process.cwd();
|
|
144
|
-
const agentDir = getAgentDir();
|
|
145
|
-
if (await handleGuiCommand(rawArgs, cwd)) {
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
if (await handleMonitorCommand(rawArgs, cwd)) {
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
if (await handlePackageCommand(rawArgs, cwd, agentDir)) {
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
// Default: start the OpenCandle interactive agent
|
|
2
|
+
import { ensureOpenCandleNativeDependencies } from "./infra/native-dependencies.js";
|
|
3
|
+
import { assertSupportedNodeVersion } from "./infra/node-version.js";
|
|
4
|
+
if (process.argv[2] === "doctor") {
|
|
5
|
+
const [{ loadEnv }, { handleDoctorCommand }, { getAgentDir }] = await Promise.all([
|
|
6
|
+
import("./config.js"),
|
|
7
|
+
import("./doctor/cli-command.js"),
|
|
8
|
+
import("@earendil-works/pi-coding-agent"),
|
|
9
|
+
]);
|
|
155
10
|
loadEnv();
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
const runtime = await createAgentSessionRuntime(async (opts) => {
|
|
163
|
-
const services = await createAgentSessionServices({
|
|
164
|
-
cwd: opts.cwd,
|
|
165
|
-
agentDir: opts.agentDir,
|
|
166
|
-
authStorage,
|
|
167
|
-
settingsManager,
|
|
168
|
-
modelRegistry,
|
|
169
|
-
});
|
|
170
|
-
const result = await createOpenCandleSession({
|
|
171
|
-
cwd: opts.cwd,
|
|
172
|
-
agentDir: opts.agentDir,
|
|
173
|
-
settingsManager,
|
|
174
|
-
authStorage,
|
|
175
|
-
modelRegistry,
|
|
176
|
-
sessionManager: opts.sessionManager,
|
|
177
|
-
bindExtensions: false,
|
|
178
|
-
});
|
|
179
|
-
return {
|
|
180
|
-
...result,
|
|
181
|
-
services,
|
|
182
|
-
diagnostics: services.diagnostics,
|
|
183
|
-
};
|
|
184
|
-
}, { cwd, agentDir, sessionManager });
|
|
185
|
-
try {
|
|
186
|
-
const interactiveMode = new InteractiveMode(runtime, {
|
|
187
|
-
modelFallbackMessage: shouldSuppressFallbackMessage
|
|
188
|
-
? undefined
|
|
189
|
-
: runtime.modelFallbackMessage,
|
|
190
|
-
});
|
|
191
|
-
await interactiveMode.run();
|
|
192
|
-
}
|
|
193
|
-
finally {
|
|
194
|
-
await runtime.dispose();
|
|
195
|
-
}
|
|
11
|
+
await handleDoctorCommand(process.argv.slice(2), process.cwd(), getAgentDir());
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
assertSupportedNodeVersion();
|
|
15
|
+
await ensureOpenCandleNativeDependencies();
|
|
16
|
+
await import("./cli-main.js");
|
|
196
17
|
}
|
|
197
|
-
await main();
|
|
198
18
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,kCAAkC,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;IACjC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChF,MAAM,CAAC,aAAa,CAAC;QACrB,MAAM,CAAC,yBAAyB,CAAC;QACjC,MAAM,CAAC,iCAAiC,CAAC;KAC1C,CAAC,CAAC;IACH,OAAO,EAAE,CAAC;IACV,MAAM,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;AACjF,CAAC;KAAM,CAAC;IACN,0BAA0B,EAAE,CAAC;IAC7B,MAAM,kCAAkC,EAAE,CAAC;IAC3C,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;AAChC,CAAC"}
|
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;
|