opencandle 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/README.md +43 -23
  2. package/dist/cli-main.d.ts +1 -0
  3. package/dist/cli-main.js +200 -0
  4. package/dist/cli-main.js.map +1 -0
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.js +14 -194
  7. package/dist/cli.js.map +1 -1
  8. package/dist/config.d.ts +10 -0
  9. package/dist/config.js +13 -0
  10. package/dist/config.js.map +1 -1
  11. package/dist/doctor/cli-command.d.ts +1 -0
  12. package/dist/doctor/cli-command.js +69 -0
  13. package/dist/doctor/cli-command.js.map +1 -0
  14. package/dist/doctor/render.d.ts +2 -0
  15. package/dist/doctor/render.js +32 -0
  16. package/dist/doctor/render.js.map +1 -0
  17. package/dist/doctor/report.d.ts +63 -0
  18. package/dist/doctor/report.js +500 -0
  19. package/dist/doctor/report.js.map +1 -0
  20. package/dist/infra/index.d.ts +0 -1
  21. package/dist/infra/index.js +0 -1
  22. package/dist/infra/index.js.map +1 -1
  23. package/dist/infra/native-dependencies.d.ts +8 -0
  24. package/dist/infra/native-dependencies.js +49 -0
  25. package/dist/infra/native-dependencies.js.map +1 -1
  26. package/dist/infra/node-version.js +2 -5
  27. package/dist/infra/node-version.js.map +1 -1
  28. package/dist/monitor.d.ts +1 -1
  29. package/dist/monitor.js +2 -1
  30. package/dist/monitor.js.map +1 -1
  31. package/dist/onboarding/connect.d.ts +2 -2
  32. package/dist/onboarding/connect.js +10 -3
  33. package/dist/onboarding/connect.js.map +1 -1
  34. package/dist/onboarding/provider-status.d.ts +46 -0
  35. package/dist/onboarding/provider-status.js +256 -0
  36. package/dist/onboarding/provider-status.js.map +1 -0
  37. package/dist/onboarding/providers.d.ts +85 -8
  38. package/dist/onboarding/providers.js +87 -9
  39. package/dist/onboarding/providers.js.map +1 -1
  40. package/dist/onboarding/state.d.ts +1 -0
  41. package/dist/onboarding/state.js +5 -0
  42. package/dist/onboarding/state.js.map +1 -1
  43. package/dist/onboarding/tool-tags.d.ts +12 -1
  44. package/dist/onboarding/tool-tags.js +31 -1
  45. package/dist/onboarding/tool-tags.js.map +1 -1
  46. package/dist/onboarding/validation.d.ts +2 -2
  47. package/dist/onboarding/validation.js.map +1 -1
  48. package/dist/pi/opencandle-extension.js +91 -15
  49. package/dist/pi/opencandle-extension.js.map +1 -1
  50. package/dist/pi/session.d.ts +0 -1
  51. package/dist/pi/session.js +2 -1
  52. package/dist/pi/session.js.map +1 -1
  53. package/dist/pi/tool-adapter.d.ts +4 -1
  54. package/dist/pi/tool-adapter.js +5 -4
  55. package/dist/pi/tool-adapter.js.map +1 -1
  56. package/dist/prompts/context-builder.js +1 -1
  57. package/dist/prompts/policy-cards.js +9 -5
  58. package/dist/prompts/policy-cards.js.map +1 -1
  59. package/dist/prompts/workflow-prompts.js +10 -6
  60. package/dist/prompts/workflow-prompts.js.map +1 -1
  61. package/dist/providers/external-tool-command.d.ts +17 -0
  62. package/dist/providers/external-tool-command.js +114 -0
  63. package/dist/providers/external-tool-command.js.map +1 -0
  64. package/dist/providers/external-tool-error.d.ts +10 -0
  65. package/dist/providers/external-tool-error.js +21 -0
  66. package/dist/providers/external-tool-error.js.map +1 -0
  67. package/dist/providers/reddit-cli.d.ts +32 -0
  68. package/dist/providers/reddit-cli.js +172 -0
  69. package/dist/providers/reddit-cli.js.map +1 -0
  70. package/dist/providers/reddit.d.ts +1 -1
  71. package/dist/providers/reddit.js +7 -35
  72. package/dist/providers/reddit.js.map +1 -1
  73. package/dist/providers/twitter-cli.d.ts +36 -0
  74. package/dist/providers/twitter-cli.js +124 -0
  75. package/dist/providers/twitter-cli.js.map +1 -0
  76. package/dist/providers/twitter.d.ts +0 -8
  77. package/dist/providers/twitter.js +4 -54
  78. package/dist/providers/twitter.js.map +1 -1
  79. package/dist/providers/wrap-provider.js +30 -0
  80. package/dist/providers/wrap-provider.js.map +1 -1
  81. package/dist/providers/yahoo-finance.js +53 -32
  82. package/dist/providers/yahoo-finance.js.map +1 -1
  83. package/dist/routing/classify-intent.js +7 -3
  84. package/dist/routing/classify-intent.js.map +1 -1
  85. package/dist/routing/planning.d.ts +1 -1
  86. package/dist/routing/planning.js +9 -6
  87. package/dist/routing/planning.js.map +1 -1
  88. package/dist/routing/router.js +7 -3
  89. package/dist/routing/router.js.map +1 -1
  90. package/dist/runtime/answer-contracts.d.ts +1 -1
  91. package/dist/runtime/answer-contracts.js +12 -1
  92. package/dist/runtime/answer-contracts.js.map +1 -1
  93. package/dist/runtime/tool-defaults-wrapper.js +6 -2
  94. package/dist/runtime/tool-defaults-wrapper.js.map +1 -1
  95. package/dist/sentiment/index.d.ts +1 -0
  96. package/dist/sentiment/index.js +1 -0
  97. package/dist/sentiment/index.js.map +1 -1
  98. package/dist/sentiment/insights.d.ts +17 -0
  99. package/dist/sentiment/insights.js +206 -0
  100. package/dist/sentiment/insights.js.map +1 -0
  101. package/dist/sentiment/pipeline.js +13 -1
  102. package/dist/sentiment/pipeline.js.map +1 -1
  103. package/dist/sentiment/scorer.d.ts +2 -0
  104. package/dist/sentiment/scorer.js +10 -1
  105. package/dist/sentiment/scorer.js.map +1 -1
  106. package/dist/sentiment/types.d.ts +2 -0
  107. package/dist/sentiment/types.js.map +1 -1
  108. package/dist/system-prompt.js +3 -7
  109. package/dist/system-prompt.js.map +1 -1
  110. package/dist/tools/index.d.ts +5 -2
  111. package/dist/tools/index.js +8 -8
  112. package/dist/tools/index.js.map +1 -1
  113. package/dist/tools/sentiment/insight-format.d.ts +2 -0
  114. package/dist/tools/sentiment/insight-format.js +36 -0
  115. package/dist/tools/sentiment/insight-format.js.map +1 -0
  116. package/dist/tools/sentiment/query-match.d.ts +3 -0
  117. package/dist/tools/sentiment/query-match.js +113 -0
  118. package/dist/tools/sentiment/query-match.js.map +1 -0
  119. package/dist/tools/sentiment/reddit-sentiment.d.ts +12 -1
  120. package/dist/tools/sentiment/reddit-sentiment.js +263 -117
  121. package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
  122. package/dist/tools/sentiment/sentiment-summary.d.ts +9 -1
  123. package/dist/tools/sentiment/sentiment-summary.js +217 -201
  124. package/dist/tools/sentiment/sentiment-summary.js.map +1 -1
  125. package/dist/tools/sentiment/twitter-sentiment.d.ts +11 -1
  126. package/dist/tools/sentiment/twitter-sentiment.js +187 -64
  127. package/dist/tools/sentiment/twitter-sentiment.js.map +1 -1
  128. package/dist/tools/sentiment/web-sentiment.js +4 -0
  129. package/dist/tools/sentiment/web-sentiment.js.map +1 -1
  130. package/dist/types/sentiment.d.ts +52 -0
  131. package/gui/server/http-routes.ts +419 -0
  132. package/gui/server/invoke-tool.ts +17 -3
  133. package/gui/server/model-setup.ts +10 -3
  134. package/gui/server/projector.ts +6 -2
  135. package/gui/server/server.ts +30 -275
  136. package/gui/server/tool-metadata.ts +80 -16
  137. package/gui/server/ws-hub.ts +19 -0
  138. package/gui/web/dist/assets/CatalogOverlay-CCVKwBUB.js +1 -0
  139. package/gui/web/dist/assets/index-Dm4Aom2_.js +69 -0
  140. package/gui/web/dist/assets/{index-2KZtKBmu.css → index-UzZUg3dx.css} +1 -1
  141. package/gui/web/dist/index.html +2 -2
  142. package/package.json +17 -14
  143. package/src/cli-main.ts +233 -0
  144. package/src/cli.ts +14 -226
  145. package/src/config.ts +27 -0
  146. package/src/doctor/cli-command.ts +83 -0
  147. package/src/doctor/render.ts +37 -0
  148. package/src/doctor/report.ts +638 -0
  149. package/src/infra/index.ts +0 -1
  150. package/src/infra/native-dependencies.ts +67 -0
  151. package/src/infra/node-version.ts +2 -5
  152. package/src/monitor.ts +3 -1
  153. package/src/onboarding/connect.ts +20 -4
  154. package/src/onboarding/provider-status.ts +382 -0
  155. package/src/onboarding/providers.ts +148 -18
  156. package/src/onboarding/state.ts +9 -0
  157. package/src/onboarding/tool-tags.ts +45 -2
  158. package/src/onboarding/validation.ts +2 -2
  159. package/src/pi/opencandle-extension.ts +115 -17
  160. package/src/pi/session.ts +2 -1
  161. package/src/pi/tool-adapter.ts +14 -4
  162. package/src/prompts/context-builder.ts +1 -1
  163. package/src/prompts/policy-cards.ts +13 -5
  164. package/src/prompts/workflow-prompts.ts +13 -6
  165. package/src/providers/external-tool-command.ts +164 -0
  166. package/src/providers/external-tool-error.ts +20 -0
  167. package/src/providers/reddit-cli.ts +286 -0
  168. package/src/providers/reddit.ts +7 -63
  169. package/src/providers/twitter-cli.ts +202 -0
  170. package/src/providers/twitter.ts +4 -73
  171. package/src/providers/wrap-provider.ts +34 -0
  172. package/src/providers/yahoo-finance.ts +65 -32
  173. package/src/routing/classify-intent.ts +11 -6
  174. package/src/routing/planning.ts +16 -10
  175. package/src/routing/router.ts +11 -6
  176. package/src/runtime/answer-contracts.ts +23 -2
  177. package/src/runtime/tool-defaults-wrapper.ts +12 -2
  178. package/src/sentiment/index.ts +1 -0
  179. package/src/sentiment/insights.ts +269 -0
  180. package/src/sentiment/pipeline.ts +13 -1
  181. package/src/sentiment/scorer.ts +12 -1
  182. package/src/sentiment/types.ts +3 -0
  183. package/src/system-prompt.ts +3 -7
  184. package/src/tools/index.ts +9 -8
  185. package/src/tools/sentiment/insight-format.ts +50 -0
  186. package/src/tools/sentiment/query-match.ts +117 -0
  187. package/src/tools/sentiment/reddit-sentiment.ts +354 -141
  188. package/src/tools/sentiment/sentiment-summary.ts +283 -237
  189. package/src/tools/sentiment/twitter-sentiment.ts +262 -78
  190. package/src/tools/sentiment/web-sentiment.ts +4 -0
  191. package/src/types/sentiment.ts +59 -0
  192. package/dist/infra/browser.d.ts +0 -35
  193. package/dist/infra/browser.js +0 -105
  194. package/dist/infra/browser.js.map +0 -1
  195. package/dist/tools/interaction/twitter-login.d.ts +0 -8
  196. package/dist/tools/interaction/twitter-login.js +0 -87
  197. package/dist/tools/interaction/twitter-login.js.map +0 -1
  198. package/gui/web/dist/assets/CatalogOverlay-eJ2cBk33.js +0 -1
  199. package/gui/web/dist/assets/index-CveNgtDg.js +0 -69
  200. package/src/infra/browser.ts +0 -113
  201. package/src/tools/interaction/twitter-login.ts +0 -105
@@ -0,0 +1,500 @@
1
+ import { accessSync, constants, existsSync, readFileSync, statSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { getUnsupportedNodeVersionMessage } from "../infra/node-version.js";
6
+ import { getConfigPath, getOnboardingPath, getOpenCandleHomeDir, getStateDbPath, resolveOpenCandlePath, } from "../infra/opencandle-paths.js";
7
+ import { probeAllProviderStatuses, probeProviderStatus, } from "../onboarding/provider-status.js";
8
+ import { getProvider, isExternalToolProvider, listAllProviders, } from "../onboarding/providers.js";
9
+ export const DOCTOR_REPORT_SCHEMA_VERSION = 1;
10
+ const PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
11
+ const require = createRequire(import.meta.url);
12
+ export async function buildDoctorReport(options = {}) {
13
+ const now = options.now ?? new Date();
14
+ const cwd = options.cwd ?? process.cwd();
15
+ const home = getOpenCandleHomeDir();
16
+ const runtimeChecks = buildRuntimeChecks(cwd);
17
+ const stateChecks = buildStateChecks(home, options.agentDir);
18
+ const providerChecks = stateChecks.some((check) => check.id === "state.config" && check.status === "fail")
19
+ ? [providerChecksSkippedForInvalidConfig()]
20
+ : await buildProviderChecks(options);
21
+ const sections = [
22
+ section("runtime", "Runtime", runtimeChecks),
23
+ section("state", "Local state", stateChecks),
24
+ section("model", "Model", [buildModelCheck(options.modelSetup)]),
25
+ section("providers", "Providers", providerChecks),
26
+ ];
27
+ if (options.includeGui || options.gui) {
28
+ sections.push(section("gui", "GUI", await buildGuiChecks(options)));
29
+ }
30
+ const allChecks = sections.flatMap((candidate) => candidate.checks);
31
+ const status = deriveDoctorStatus(allChecks);
32
+ return {
33
+ schemaVersion: DOCTOR_REPORT_SCHEMA_VERSION,
34
+ generatedAt: now.toISOString(),
35
+ status,
36
+ summary: buildSummary(status, allChecks),
37
+ sections,
38
+ metadata: {
39
+ cwd,
40
+ agentDir: options.agentDir,
41
+ opencandleHome: home,
42
+ opencandleHomeSource: process.env.OPENCANDLE_HOME ? "env" : "default",
43
+ },
44
+ };
45
+ }
46
+ export function deriveDoctorStatus(checks) {
47
+ if (checks.some((candidate) => candidate.capability === "core" && candidate.status === "fail")) {
48
+ return "blocked";
49
+ }
50
+ if (checks.some((candidate) => candidate.status === "warn" ||
51
+ candidate.status === "unknown" ||
52
+ (candidate.capability === "optional" && candidate.status === "fail"))) {
53
+ return "degraded";
54
+ }
55
+ return "ready";
56
+ }
57
+ function section(id, label, checks) {
58
+ return {
59
+ id,
60
+ label,
61
+ status: deriveDoctorStatus(checks),
62
+ checks,
63
+ };
64
+ }
65
+ function buildRuntimeChecks(cwd) {
66
+ const packageJson = readPackageJson();
67
+ const nodeMessage = getUnsupportedNodeVersionMessage();
68
+ const sqliteLoads = canLoadBetterSqlite();
69
+ return [
70
+ {
71
+ id: "runtime.opencandle_version",
72
+ label: "OpenCandle version",
73
+ status: "pass",
74
+ capability: "core",
75
+ summary: packageJson.version ? `OpenCandle ${packageJson.version}` : "Version unavailable",
76
+ metadata: { version: packageJson.version ?? null },
77
+ },
78
+ {
79
+ id: "runtime.node",
80
+ label: "Node.js",
81
+ status: nodeMessage ? "fail" : "pass",
82
+ capability: "core",
83
+ summary: nodeMessage
84
+ ? `Unsupported Node ${process.versions.node}`
85
+ : `Node ${process.version}`,
86
+ remediation: nodeMessage ?? undefined,
87
+ metadata: { version: process.versions.node, supportedRange: packageJson.engines?.node },
88
+ },
89
+ {
90
+ id: "runtime.better_sqlite3",
91
+ label: "better-sqlite3",
92
+ status: sqliteLoads ? "pass" : "fail",
93
+ capability: "core",
94
+ summary: sqliteLoads ? "Native SQLite binding loads" : "Native SQLite binding failed to load",
95
+ remediation: sqliteLoads
96
+ ? undefined
97
+ : "Run `npm rebuild better-sqlite3` or reinstall dependencies under the active Node with `npm install`.",
98
+ },
99
+ {
100
+ id: "runtime.cwd",
101
+ label: "Working directory",
102
+ status: "pass",
103
+ capability: "core",
104
+ summary: cwd,
105
+ metadata: { cwd },
106
+ },
107
+ ];
108
+ }
109
+ function buildStateChecks(home, agentDir) {
110
+ return [
111
+ {
112
+ id: "state.opencandle_home",
113
+ label: "OpenCandle home",
114
+ status: directoryUsable(home) ? "pass" : existsSync(home) ? "warn" : "skip",
115
+ capability: "core",
116
+ summary: `${home} (${process.env.OPENCANDLE_HOME ? "environment override" : "default"})`,
117
+ remediation: existsSync(home)
118
+ ? "Ensure the OpenCandle home directory is readable and writable."
119
+ : "OpenCandle will create this directory when state is first written.",
120
+ metadata: { path: home, source: process.env.OPENCANDLE_HOME ? "env" : "default" },
121
+ },
122
+ piAgentDirCheck(agentDir),
123
+ configCheck(),
124
+ fileStateCheck("state.onboarding", "Onboarding state", getOnboardingPath()),
125
+ fileStateCheck("state.sqlite", "State database", getStateDbPath()),
126
+ fileStateCheck("state.sentiment", "Sentiment history store", resolveOpenCandlePath("sentinel.db")),
127
+ ];
128
+ }
129
+ function configCheck() {
130
+ const path = getConfigPath();
131
+ if (!existsSync(path)) {
132
+ return {
133
+ id: "state.config",
134
+ label: "Config file",
135
+ status: "skip",
136
+ capability: "core",
137
+ summary: "No config file yet",
138
+ remediation: "No action required. OpenCandle will create config.json when settings are saved.",
139
+ metadata: { path },
140
+ };
141
+ }
142
+ try {
143
+ JSON.parse(readFileSync(path, "utf-8"));
144
+ return {
145
+ id: "state.config",
146
+ label: "Config file",
147
+ status: "pass",
148
+ capability: "core",
149
+ summary: "config.json parses",
150
+ metadata: { path },
151
+ };
152
+ }
153
+ catch (error) {
154
+ return {
155
+ id: "state.config",
156
+ label: "Config file",
157
+ status: "fail",
158
+ capability: "core",
159
+ summary: "config.json is invalid JSON",
160
+ remediation: `Repair or remove ${path}. ${error instanceof Error ? error.message : String(error)}`,
161
+ metadata: { path },
162
+ };
163
+ }
164
+ }
165
+ function piAgentDirCheck(agentDir) {
166
+ if (!agentDir) {
167
+ return {
168
+ id: "state.pi_agent_dir",
169
+ label: "Pi agent directory",
170
+ status: "unknown",
171
+ capability: "core",
172
+ summary: "Pi agent directory was not checked",
173
+ remediation: "Run doctor from an initialized OpenCandle CLI or GUI session.",
174
+ };
175
+ }
176
+ return {
177
+ id: "state.pi_agent_dir",
178
+ label: "Pi agent directory",
179
+ status: directoryUsable(agentDir) ? "pass" : existsSync(agentDir) ? "warn" : "skip",
180
+ capability: "core",
181
+ summary: agentDir,
182
+ remediation: existsSync(agentDir)
183
+ ? "Ensure the Pi agent directory is readable and writable."
184
+ : "Pi will create this directory when model/auth state is first written.",
185
+ metadata: { path: agentDir },
186
+ };
187
+ }
188
+ function fileStateCheck(id, label, path) {
189
+ if (!existsSync(path)) {
190
+ return {
191
+ id,
192
+ label,
193
+ status: "skip",
194
+ capability: "core",
195
+ summary: "Not created yet",
196
+ remediation: "No action required for a new install.",
197
+ metadata: { path },
198
+ };
199
+ }
200
+ return {
201
+ id,
202
+ label,
203
+ status: canAccess(path) ? "pass" : "warn",
204
+ capability: "core",
205
+ summary: canAccess(path) ? "Readable and writable" : "Access may be limited",
206
+ remediation: canAccess(path) ? undefined : `Ensure ${path} is readable and writable.`,
207
+ metadata: { path },
208
+ };
209
+ }
210
+ function buildModelCheck(modelSetup) {
211
+ const state = modelSetup ?? { requirement: "unknown" };
212
+ if (state.requirement === "ready") {
213
+ return {
214
+ id: "model.readiness",
215
+ label: "Model readiness",
216
+ status: "pass",
217
+ capability: "core",
218
+ summary: state.currentModel ? `Ready with ${state.currentModel}` : "Model is ready",
219
+ metadata: { currentModel: state.currentModel ?? null },
220
+ };
221
+ }
222
+ if (state.requirement === "select_model") {
223
+ return {
224
+ id: "model.readiness",
225
+ label: "Model readiness",
226
+ status: "fail",
227
+ capability: "core",
228
+ summary: "Model credentials exist but no active model is selected",
229
+ remediation: "Run `/setup` in the CLI or choose an available model in the GUI model setup panel.",
230
+ metadata: { requirement: state.requirement, availableModels: state.availableModels ?? [] },
231
+ };
232
+ }
233
+ if (state.requirement === "connect_auth") {
234
+ return {
235
+ id: "model.readiness",
236
+ label: "Model readiness",
237
+ status: "fail",
238
+ capability: "core",
239
+ summary: "No usable model credentials are configured",
240
+ remediation: "Run `/setup` in the CLI or paste a model API key in the GUI model setup panel.",
241
+ metadata: { requirement: state.requirement },
242
+ };
243
+ }
244
+ return {
245
+ id: "model.readiness",
246
+ label: "Model readiness",
247
+ status: "unknown",
248
+ capability: "core",
249
+ summary: "Model readiness was not checked",
250
+ remediation: "Run the doctor command from an initialized OpenCandle session for model setup state.",
251
+ metadata: { requirement: "unknown" },
252
+ };
253
+ }
254
+ async function buildProviderChecks(options) {
255
+ const providers = listAllProviders();
256
+ const statuses = options.providerStatuses ??
257
+ (await probeAllProviderStatuses({
258
+ commandRunner: options.commandRunner,
259
+ fetchImpl: options.fetchImpl,
260
+ force: true,
261
+ respectSkipped: true,
262
+ }));
263
+ const checks = statuses.map((status) => providerStatusCheck(status));
264
+ for (const provider of providers.filter(isExternalToolProvider)) {
265
+ const installStatus = statuses.find((status) => status.providerId === provider.id && status.kind === "external-tool");
266
+ if (installStatus?.state === "skipped")
267
+ continue;
268
+ if (installStatus?.state !== "installed")
269
+ continue;
270
+ if (options.includeSessions) {
271
+ const status = await probeProviderStatus(provider.id, {
272
+ mode: "session",
273
+ force: true,
274
+ respectSkipped: true,
275
+ commandRunner: options.commandRunner,
276
+ });
277
+ checks.push(providerStatusCheck(status, "session"));
278
+ }
279
+ else {
280
+ checks.push(sessionNotCheckedCheck(provider));
281
+ }
282
+ }
283
+ return checks;
284
+ }
285
+ function providerChecksSkippedForInvalidConfig() {
286
+ return {
287
+ id: "providers.config_blocked",
288
+ label: "Provider checks",
289
+ status: "skip",
290
+ capability: "optional",
291
+ summary: "Skipped because config.json is invalid",
292
+ remediation: "Repair the config file, then rerun doctor to check provider readiness.",
293
+ };
294
+ }
295
+ function providerStatusCheck(status, modeOverride) {
296
+ const provider = getProvider(status.providerId);
297
+ const capability = provider.tier === "hard" ? "core" : "optional";
298
+ const metadata = {
299
+ providerId: status.providerId,
300
+ category: provider.category,
301
+ tier: provider.tier,
302
+ kind: status.kind,
303
+ state: status.state,
304
+ };
305
+ if (status.kind === "api-key") {
306
+ return {
307
+ id: `provider.${status.providerId}.credential`,
308
+ label: provider.displayName,
309
+ status: status.state === "configured" ? "pass" : "warn",
310
+ capability,
311
+ summary: status.state === "configured"
312
+ ? `Configured via ${status.credentialSource}`
313
+ : "Credential is missing",
314
+ remediation: status.state === "configured"
315
+ ? undefined
316
+ : `${provider.instructionsHint}. Run /connect ${provider.id}.`,
317
+ metadata: { ...metadata, credentialSource: status.credentialSource },
318
+ };
319
+ }
320
+ if (status.kind === "public-http") {
321
+ const ok = status.state === "reachable";
322
+ return {
323
+ id: `provider.${status.providerId}.reachability`,
324
+ label: provider.displayName,
325
+ status: ok ? "pass" : "fail",
326
+ capability,
327
+ summary: ok ? "Reachable" : `Not reachable (${status.state})`,
328
+ remediation: ok
329
+ ? undefined
330
+ : "Check network connectivity and retry. Core quote and market-data workflows depend on Yahoo Finance reachability.",
331
+ metadata: { ...metadata, statusCode: status.statusCode ?? null },
332
+ };
333
+ }
334
+ if (modeOverride === "session" || status.mode === "session") {
335
+ const ok = status.state === "session_ok";
336
+ return {
337
+ id: `provider.${status.providerId}.session`,
338
+ label: `${provider.displayName} browser session`,
339
+ status: ok ? "pass" : "warn",
340
+ capability: "optional",
341
+ summary: ok ? "Browser session is usable" : (status.message ?? `Session ${status.state}`),
342
+ remediation: ok ? undefined : sessionRemediation(status.providerId, status.installCmd),
343
+ metadata,
344
+ };
345
+ }
346
+ const installed = status.state === "installed";
347
+ return {
348
+ id: `provider.${status.providerId}.binary`,
349
+ label: `${provider.displayName} CLI`,
350
+ status: installed
351
+ ? "pass"
352
+ : status.state === "skipped"
353
+ ? "skip"
354
+ : status.state === "missing"
355
+ ? "warn"
356
+ : "unknown",
357
+ capability: "optional",
358
+ summary: installed ? "Installed" : (status.message ?? `CLI ${status.state}`),
359
+ remediation: installed
360
+ ? undefined
361
+ : status.state === "skipped"
362
+ ? `Run \`opencandle doctor --enable ${status.providerId}\` to re-enable this provider.`
363
+ : status.installCmd,
364
+ metadata,
365
+ };
366
+ }
367
+ function sessionNotCheckedCheck(provider) {
368
+ return {
369
+ id: `provider.${provider.id}.session`,
370
+ label: `${provider.displayName} browser session`,
371
+ status: "unknown",
372
+ capability: "optional",
373
+ summary: "Not checked",
374
+ remediation: "Run `opencandle doctor --sessions` to check browser-cookie session readiness.",
375
+ metadata: { providerId: provider.id, category: provider.category, tier: provider.tier },
376
+ };
377
+ }
378
+ async function buildGuiChecks(options) {
379
+ if (options.gui?.reachable !== undefined || options.gui?.role) {
380
+ const role = options.gui.role ?? "unknown";
381
+ const reachable = options.gui.reachable ?? true;
382
+ return [
383
+ {
384
+ id: "gui.server",
385
+ label: "GUI server",
386
+ status: reachable ? (role === "follower" ? "warn" : "pass") : "skip",
387
+ capability: "optional",
388
+ summary: reachable ? `GUI server is ${role}` : "GUI server is not running",
389
+ remediation: role === "follower"
390
+ ? "Open the writer GUI process to perform setup mutations."
391
+ : reachable
392
+ ? undefined
393
+ : "Run `opencandle gui` to start the browser workbench.",
394
+ metadata: { ...options.gui },
395
+ },
396
+ ];
397
+ }
398
+ const host = options.gui?.host ?? process.env.OPENCANDLE_GUI_HOST ?? "127.0.0.1";
399
+ const port = options.gui?.port ?? Number(process.env.OPENCANDLE_GUI_PORT ?? 14567);
400
+ const endpoint = options.gui?.healthEndpoint ?? `http://${host}:${port}/health`;
401
+ try {
402
+ const response = await (options.fetchImpl ?? fetch)(endpoint, {
403
+ signal: AbortSignal.timeout(1_500),
404
+ });
405
+ const body = await response.json().catch(() => null);
406
+ const role = isRecord(body) && typeof body.role === "string" ? body.role : "unknown";
407
+ const verified = response.ok &&
408
+ isRecord(body) &&
409
+ body.ok === true &&
410
+ (role === "writer" || role === "follower");
411
+ return [
412
+ {
413
+ id: "gui.server",
414
+ label: "GUI server",
415
+ status: verified ? (role === "follower" ? "warn" : "pass") : "warn",
416
+ capability: "optional",
417
+ summary: verified
418
+ ? `GUI server is ${role}`
419
+ : response.ok
420
+ ? "OpenCandle GUI health payload was not verified"
421
+ : `GUI health returned HTTP ${response.status}`,
422
+ remediation: verified && role === "follower"
423
+ ? "Open the writer GUI process to perform setup mutations."
424
+ : undefined,
425
+ metadata: { host, port, role, endpoint, statusCode: response.status },
426
+ },
427
+ ];
428
+ }
429
+ catch {
430
+ return [
431
+ {
432
+ id: "gui.server",
433
+ label: "GUI server",
434
+ status: "skip",
435
+ capability: "optional",
436
+ summary: "GUI server is not running",
437
+ remediation: "Run `opencandle gui` to start the browser workbench.",
438
+ metadata: { host, port, endpoint },
439
+ },
440
+ ];
441
+ }
442
+ }
443
+ function sessionRemediation(providerId, installCmd) {
444
+ if (providerId === "reddit")
445
+ return "Run `rdt login` and retry `opencandle doctor --sessions`.";
446
+ if (providerId === "twitter") {
447
+ return "Stay logged into x.com in a supported browser and retry `opencandle doctor --sessions`.";
448
+ }
449
+ return installCmd ?? "Install and authenticate the external tool.";
450
+ }
451
+ function buildSummary(status, checks) {
452
+ if (status === "ready")
453
+ return "OpenCandle core health is ready.";
454
+ const firstBlocking = checks.find((candidate) => candidate.capability === "core" && candidate.status === "fail");
455
+ if (firstBlocking)
456
+ return `OpenCandle is blocked: ${firstBlocking.summary}.`;
457
+ const issueCount = checks.filter((candidate) => ["warn", "fail", "unknown"].includes(candidate.status)).length;
458
+ return `OpenCandle is usable with ${issueCount} degraded or unchecked ${issueCount === 1 ? "capability" : "capabilities"}.`;
459
+ }
460
+ function readPackageJson() {
461
+ try {
462
+ return JSON.parse(readFileSync(resolve(PACKAGE_ROOT, "package.json"), "utf-8"));
463
+ }
464
+ catch {
465
+ return {};
466
+ }
467
+ }
468
+ function isRecord(value) {
469
+ return typeof value === "object" && value !== null;
470
+ }
471
+ function canLoadBetterSqlite() {
472
+ try {
473
+ const Database = require("better-sqlite3");
474
+ const db = new Database(":memory:");
475
+ db.close();
476
+ return true;
477
+ }
478
+ catch {
479
+ return false;
480
+ }
481
+ }
482
+ function directoryUsable(path) {
483
+ try {
484
+ return (statSync(path).isDirectory() &&
485
+ canAccess(path, constants.R_OK | constants.W_OK | constants.X_OK));
486
+ }
487
+ catch {
488
+ return false;
489
+ }
490
+ }
491
+ function canAccess(path, mode = constants.R_OK | constants.W_OK) {
492
+ try {
493
+ accessSync(path, mode);
494
+ return true;
495
+ }
496
+ catch {
497
+ return false;
498
+ }
499
+ }
500
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/doctor/report.ts"],"names":[],"mappings":"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"}
@@ -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";
@@ -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";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infra/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,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
+ {"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 +1,9 @@
1
1
  export declare function getNativeDependencyErrorMessage(error: unknown, dependencyName: string): string | null;
2
+ export declare function rebuildNativeDependency(dependencyName: string): Promise<void>;
3
+ export declare function ensureNativeDependency({ dependencyName, load, rebuild, log, }: {
4
+ dependencyName: string;
5
+ load: () => Promise<void>;
6
+ rebuild?: (dependencyName: string) => Promise<void>;
7
+ log?: (message: string) => void;
8
+ }): Promise<void>;
9
+ export declare function ensureOpenCandleNativeDependencies(): Promise<void>;
@@ -7,4 +7,53 @@ export function getNativeDependencyErrorMessage(error, dependencyName) {
7
7
  return (`${dependencyName} native binding was built for a different Node ABI than the active Node ${process.versions.node}. ` +
8
8
  `Run \`npm rebuild ${dependencyName}\` or reinstall dependencies under the active Node with \`npm install\`.`);
9
9
  }
10
+ export async function rebuildNativeDependency(dependencyName) {
11
+ const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm";
12
+ const { spawn } = await import("node:child_process");
13
+ await new Promise((resolve, reject) => {
14
+ const child = spawn(npmCommand, ["rebuild", dependencyName], {
15
+ stdio: "inherit",
16
+ });
17
+ child.on("error", reject);
18
+ child.on("exit", (code) => {
19
+ if (code === 0) {
20
+ resolve();
21
+ return;
22
+ }
23
+ reject(new Error(`npm rebuild ${dependencyName} failed with exit code ${code}.`));
24
+ });
25
+ });
26
+ }
27
+ export async function ensureNativeDependency({ dependencyName, load, rebuild = rebuildNativeDependency, log = console.error, }) {
28
+ try {
29
+ await load();
30
+ return;
31
+ }
32
+ catch (error) {
33
+ const message = getNativeDependencyErrorMessage(error, dependencyName);
34
+ if (!message)
35
+ throw error;
36
+ log(`${message}\nAttempting \`npm rebuild ${dependencyName}\` before continuing...`);
37
+ }
38
+ await rebuild(dependencyName);
39
+ try {
40
+ await load();
41
+ }
42
+ catch (error) {
43
+ const message = getNativeDependencyErrorMessage(error, dependencyName);
44
+ if (!message)
45
+ throw error;
46
+ throw new Error(`${message}\nAutomatic rebuild did not repair the native binding. Run \`npm install\` under Node ${process.versions.node} and retry.`);
47
+ }
48
+ }
49
+ export async function ensureOpenCandleNativeDependencies() {
50
+ await ensureNativeDependency({
51
+ dependencyName: "better-sqlite3",
52
+ async load() {
53
+ const { default: Database } = await import("better-sqlite3");
54
+ const db = new Database(":memory:");
55
+ db.close();
56
+ },
57
+ });
58
+ }
10
59
  //# sourceMappingURL=native-dependencies.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"native-dependencies.js","sourceRoot":"","sources":["../../src/infra/native-dependencies.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,+BAA+B,CAC7C,KAAc,EACd,cAAsB;IAEtB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IACE,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACxC,CAAC,OAAO,CAAC,QAAQ,CAAC,kDAAkD,CAAC,EACrE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,GAAG,cAAc,2EAA2E,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI;QACrH,qBAAqB,cAAc,0EAA0E,CAC9G,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"native-dependencies.js","sourceRoot":"","sources":["../../src/infra/native-dependencies.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,10 @@
1
- const SUPPORTED_NODE_RANGE = "20.19+, 22.12+, or 24.x-26.x";
1
+ const SUPPORTED_NODE_RANGE = "22.19+ or 24.x-26.x";
2
2
  function isSupportedNodeVersion(version) {
3
3
  const [majorRaw, minorRaw] = version.split(".");
4
4
  const major = Number(majorRaw);
5
5
  const minor = Number(minorRaw);
6
- if (major === 20)
7
- return minor >= 19;
8
6
  if (major === 22)
9
- return minor >= 12;
7
+ return minor >= 19;
10
8
  return major >= 24 && major < 27;
11
9
  }
12
10
  export function getUnsupportedNodeVersionMessage(version = process.versions.node) {
@@ -19,5 +17,4 @@ export function assertSupportedNodeVersion(version) {
19
17
  if (message)
20
18
  throw new Error(message);
21
19
  }
22
- assertSupportedNodeVersion();
23
20
  //# sourceMappingURL=node-version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-version.js","sourceRoot":"","sources":["../../src/infra/node-version.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,8BAA8B,CAAC;AAE5D,SAAS,sBAAsB,CAAC,OAAe;IAC7C,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE/B,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,KAAK,IAAI,EAAE,CAAC;IACrC,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,KAAK,IAAI,EAAE,CAAC;IACrC,OAAO,KAAK,IAAI,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,UAAkB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAEvC,IAAI,sBAAsB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjD,OAAO,4BAA4B,oBAAoB,qBAAqB,OAAO,cAAc,oBAAoB,qNAAqN,CAAC;AAC7U,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACzD,MAAM,OAAO,GAAG,gCAAgC,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,0BAA0B,EAAE,CAAC"}
1
+ {"version":3,"file":"node-version.js","sourceRoot":"","sources":["../../src/infra/node-version.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAEnD,SAAS,sBAAsB,CAAC,OAAe;IAC7C,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE/B,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,KAAK,IAAI,EAAE,CAAC;IACrC,OAAO,KAAK,IAAI,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,UAAkB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAEvC,IAAI,sBAAsB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjD,OAAO,4BAA4B,oBAAoB,qBAAqB,OAAO,cAAc,oBAAoB,qNAAqN,CAAC;AAC7U,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACzD,MAAM,OAAO,GAAG,gCAAgC,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC"}
package/dist/monitor.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import "./infra/node-version.js";
2
+ export {};