@cogitator-ai/cli 0.5.20 → 0.6.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 +98 -40
- package/dist/commands/add.d.ts +11 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +79 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/assistant.d.ts.map +1 -1
- package/dist/commands/assistant.js +14 -12
- package/dist/commands/assistant.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +12 -10
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +17 -13
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/deploy.d.ts +35 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +134 -76
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts +14 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +84 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +52 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/eval.d.ts +12 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +90 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/init.d.ts +9 -51
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +87 -400
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +9 -6
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mcp.d.ts +18 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +155 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/models.d.ts.map +1 -1
- package/dist/commands/models.js +43 -15
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +16 -11
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +23 -23
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/status.d.ts +21 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +64 -39
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +26 -24
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/wizard.d.ts.map +1 -1
- package/dist/commands/wizard.js +5 -0
- package/dist/commands/wizard.js.map +1 -1
- package/dist/index.js +9 -42
- package/dist/index.js.map +1 -1
- package/dist/program.d.ts +4 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +61 -0
- package/dist/program.js.map +1 -0
- package/dist/utils/add.d.ts +81 -0
- package/dist/utils/add.d.ts.map +1 -0
- package/dist/utils/add.js +151 -0
- package/dist/utils/add.js.map +1 -0
- package/dist/utils/cli.d.ts +49 -0
- package/dist/utils/cli.d.ts.map +1 -0
- package/dist/utils/cli.js +106 -0
- package/dist/utils/cli.js.map +1 -0
- package/dist/utils/docs.d.ts +39 -0
- package/dist/utils/docs.d.ts.map +1 -0
- package/dist/utils/docs.js +198 -0
- package/dist/utils/docs.js.map +1 -0
- package/dist/utils/doctor.d.ts +41 -0
- package/dist/utils/doctor.d.ts.map +1 -0
- package/dist/utils/doctor.js +378 -0
- package/dist/utils/doctor.js.map +1 -0
- package/dist/utils/evals.d.ts +50 -0
- package/dist/utils/evals.d.ts.map +1 -0
- package/dist/utils/evals.js +78 -0
- package/dist/utils/evals.js.map +1 -0
- package/dist/utils/provider-models.d.ts +8 -2
- package/dist/utils/provider-models.d.ts.map +1 -1
- package/dist/utils/provider-models.js +32 -52
- package/dist/utils/provider-models.js.map +1 -1
- package/dist/utils/registry-worker.d.ts +2 -0
- package/dist/utils/registry-worker.d.ts.map +1 -0
- package/dist/utils/registry-worker.js +35 -0
- package/dist/utils/registry-worker.js.map +1 -0
- package/dist/utils/registry.d.ts +19 -0
- package/dist/utils/registry.d.ts.map +1 -0
- package/dist/utils/registry.js +58 -0
- package/dist/utils/registry.js.map +1 -0
- package/package.json +12 -8
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { dirname, join, normalize, sep } from 'node:path';
|
|
4
|
+
const CORE = '@cogitator-ai/core';
|
|
5
|
+
function packageRoot(entry) {
|
|
6
|
+
let dir = dirname(entry);
|
|
7
|
+
for (;;) {
|
|
8
|
+
const manifest = join(dir, 'package.json');
|
|
9
|
+
if (existsSync(manifest)) {
|
|
10
|
+
const parsed = JSON.parse(readFileSync(manifest, 'utf-8'));
|
|
11
|
+
if (typeof parsed === 'object' &&
|
|
12
|
+
parsed !== null &&
|
|
13
|
+
'name' in parsed &&
|
|
14
|
+
parsed.name === CORE) {
|
|
15
|
+
return dir;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const parent = dirname(dir);
|
|
19
|
+
if (parent === dir)
|
|
20
|
+
return undefined;
|
|
21
|
+
dir = parent;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The docs bundled with the @cogitator-ai/core a project installed, falling
|
|
26
|
+
* back to the one the CLI itself depends on.
|
|
27
|
+
*/
|
|
28
|
+
export function locateDocs(projectDir) {
|
|
29
|
+
for (const base of [join(projectDir, 'package.json'), import.meta.url]) {
|
|
30
|
+
let entry;
|
|
31
|
+
try {
|
|
32
|
+
entry = createRequire(base).resolve(CORE);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const root = packageRoot(entry);
|
|
38
|
+
if (!root || !existsSync(join(root, 'docs', 'index.md')))
|
|
39
|
+
continue;
|
|
40
|
+
const manifest = JSON.parse(readFileSync(join(root, 'package.json'), 'utf-8'));
|
|
41
|
+
return { dir: join(root, 'docs'), version: manifest.version };
|
|
42
|
+
}
|
|
43
|
+
throw new Error(`No bundled docs found: install ${CORE} in the project (they ship in node_modules/${CORE}/docs)`);
|
|
44
|
+
}
|
|
45
|
+
const SECTION = /^## (.+)$/;
|
|
46
|
+
const ENTRY = /^- \[(.+?)\]\(([^)]+\.md)\)(?::\s*(.*))?$/;
|
|
47
|
+
/** The catalog of pages, read from the `index.md` the docs ship with. */
|
|
48
|
+
export function loadDocsIndex(location) {
|
|
49
|
+
const entries = [];
|
|
50
|
+
let section = '';
|
|
51
|
+
for (const line of readFileSync(join(location.dir, 'index.md'), 'utf-8').split('\n')) {
|
|
52
|
+
const heading = SECTION.exec(line);
|
|
53
|
+
if (heading) {
|
|
54
|
+
section = heading[1];
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const entry = ENTRY.exec(line);
|
|
58
|
+
if (entry) {
|
|
59
|
+
entries.push({ title: entry[1], path: entry[2], description: entry[3] ?? '', section });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { ...location, entries };
|
|
63
|
+
}
|
|
64
|
+
/** Reads a page; `path#heading` returns only that part of the page. */
|
|
65
|
+
export function readDoc(index, reference) {
|
|
66
|
+
const [rawPath, anchor] = reference.split('#', 2);
|
|
67
|
+
const path = normalize(rawPath.replace(/^\/+/, '')).split(sep).join('/');
|
|
68
|
+
const known = path === 'index.md' || index.entries.some((entry) => entry.path === path);
|
|
69
|
+
if (!known) {
|
|
70
|
+
throw new Error(`There is no doc page ${rawPath}: search the docs, or read index.md for the list`);
|
|
71
|
+
}
|
|
72
|
+
const text = readFileSync(join(index.dir, path), 'utf-8');
|
|
73
|
+
return anchor ? (sectionOf(text, anchor) ?? text) : text;
|
|
74
|
+
}
|
|
75
|
+
/** The anchor GitHub and Fumadocs give a heading. */
|
|
76
|
+
export function slugOf(heading) {
|
|
77
|
+
return heading
|
|
78
|
+
.toLowerCase()
|
|
79
|
+
.replace(/[`*_~]/g, '')
|
|
80
|
+
.replace(/[^\p{L}\p{N}\s-]/gu, '')
|
|
81
|
+
.trim()
|
|
82
|
+
.replace(/\s+/g, '-');
|
|
83
|
+
}
|
|
84
|
+
function sectionOf(text, anchor) {
|
|
85
|
+
const lines = text.split('\n');
|
|
86
|
+
let inFence = false;
|
|
87
|
+
let start = -1;
|
|
88
|
+
let level = 0;
|
|
89
|
+
for (let i = 0; i < lines.length; i++) {
|
|
90
|
+
if (lines[i].startsWith('```'))
|
|
91
|
+
inFence = !inFence;
|
|
92
|
+
if (inFence)
|
|
93
|
+
continue;
|
|
94
|
+
const heading = /^(#{1,6})\s+(.+)$/.exec(lines[i]);
|
|
95
|
+
if (!heading)
|
|
96
|
+
continue;
|
|
97
|
+
if (start === -1 && slugOf(heading[2]) === anchor.toLowerCase()) {
|
|
98
|
+
start = i;
|
|
99
|
+
level = heading[1].length;
|
|
100
|
+
}
|
|
101
|
+
else if (start !== -1 && heading[1].length <= level) {
|
|
102
|
+
return lines.slice(start, i).join('\n').trimEnd();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return start === -1 ? undefined : lines.slice(start).join('\n').trimEnd();
|
|
106
|
+
}
|
|
107
|
+
function terms(query) {
|
|
108
|
+
return [...new Set(query.toLowerCase().match(/[\p{L}\p{N}_.-]{2,}/gu) ?? [])];
|
|
109
|
+
}
|
|
110
|
+
function occurrences(haystack, term) {
|
|
111
|
+
let count = 0;
|
|
112
|
+
for (let at = haystack.indexOf(term); at !== -1; at = haystack.indexOf(term, at + term.length)) {
|
|
113
|
+
count++;
|
|
114
|
+
}
|
|
115
|
+
return count;
|
|
116
|
+
}
|
|
117
|
+
function blocksOf(text) {
|
|
118
|
+
const blocks = [];
|
|
119
|
+
let heading;
|
|
120
|
+
let current = [];
|
|
121
|
+
const flush = () => {
|
|
122
|
+
const joined = current.join('\n').trim();
|
|
123
|
+
if (joined)
|
|
124
|
+
blocks.push({ heading, text: joined });
|
|
125
|
+
current = [];
|
|
126
|
+
};
|
|
127
|
+
for (const line of text.split('\n')) {
|
|
128
|
+
const match = /^#{2,6}\s+(.+)$/.exec(line);
|
|
129
|
+
if (match) {
|
|
130
|
+
flush();
|
|
131
|
+
heading = match[1].trim();
|
|
132
|
+
}
|
|
133
|
+
else if (line.trim() === '') {
|
|
134
|
+
flush();
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
current.push(line);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
flush();
|
|
141
|
+
return blocks;
|
|
142
|
+
}
|
|
143
|
+
function snippetOf(text, needles, width = 280) {
|
|
144
|
+
const flat = text.replace(/\s+/g, ' ').trim();
|
|
145
|
+
const lower = flat.toLowerCase();
|
|
146
|
+
const at = Math.min(...needles.map((needle) => lower.indexOf(needle)).filter((index) => index !== -1), flat.length);
|
|
147
|
+
const start = Math.max(0, Math.min(at - 60, flat.length - width));
|
|
148
|
+
const slice = flat.slice(start, start + width);
|
|
149
|
+
return `${start > 0 ? '...' : ''}${slice}${start + width < flat.length ? '...' : ''}`;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Pages that answer `query`, best first. Titles weigh most, then the page
|
|
153
|
+
* descriptions, headings and body text; every term has to appear somewhere on
|
|
154
|
+
* a page for it to count, so `approval tool` finds the approvals guide rather
|
|
155
|
+
* than every page that mentions tools.
|
|
156
|
+
*/
|
|
157
|
+
export function searchDocs(index, query, limit = 8) {
|
|
158
|
+
const needles = terms(query);
|
|
159
|
+
if (needles.length === 0)
|
|
160
|
+
return [];
|
|
161
|
+
const hits = [];
|
|
162
|
+
for (const entry of index.entries) {
|
|
163
|
+
const text = readFileSync(join(index.dir, entry.path), 'utf-8');
|
|
164
|
+
const lower = text.toLowerCase();
|
|
165
|
+
if (!needles.every((needle) => lower.includes(needle)))
|
|
166
|
+
continue;
|
|
167
|
+
const title = entry.title.toLowerCase();
|
|
168
|
+
const description = entry.description.toLowerCase();
|
|
169
|
+
let score = 0;
|
|
170
|
+
for (const needle of needles) {
|
|
171
|
+
score += (title.includes(needle) ? 12 : 0) + (description.includes(needle) ? 5 : 0);
|
|
172
|
+
score += Math.min(occurrences(lower, needle), 15);
|
|
173
|
+
}
|
|
174
|
+
const blocks = blocksOf(text);
|
|
175
|
+
let best;
|
|
176
|
+
let bestScore = 0;
|
|
177
|
+
for (const block of blocks) {
|
|
178
|
+
const blockLower = block.text.toLowerCase();
|
|
179
|
+
const headingLower = block.heading?.toLowerCase() ?? '';
|
|
180
|
+
const blockScore = needles.reduce((sum, needle) => sum +
|
|
181
|
+
Math.min(occurrences(blockLower, needle), 5) +
|
|
182
|
+
(headingLower.includes(needle) ? 4 : 0), 0);
|
|
183
|
+
if (blockScore > bestScore) {
|
|
184
|
+
best = block;
|
|
185
|
+
bestScore = blockScore;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
score += bestScore;
|
|
189
|
+
hits.push({
|
|
190
|
+
...entry,
|
|
191
|
+
...(best?.heading && { heading: best.heading }),
|
|
192
|
+
snippet: snippetOf(best?.text ?? entry.description, needles),
|
|
193
|
+
score,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return hits.sort((a, b) => b.score - a.score).slice(0, limit);
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/utils/docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type CheckStatus = 'pass' | 'warn' | 'fail';
|
|
2
|
+
export interface DoctorCheck {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
status: CheckStatus;
|
|
6
|
+
detail: string;
|
|
7
|
+
/** What to do about a warning or failure. */
|
|
8
|
+
fix?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface DoctorContext {
|
|
11
|
+
projectDir: string;
|
|
12
|
+
/** The environment as the project sees it, `.env` loaded. */
|
|
13
|
+
env: Record<string, string | undefined>;
|
|
14
|
+
nodeVersion: string;
|
|
15
|
+
/** Network and service probes; off in tests that only check the project files. */
|
|
16
|
+
probe: boolean;
|
|
17
|
+
fetch?: typeof fetch;
|
|
18
|
+
}
|
|
19
|
+
/** Fills `env` with the variables of the project's `.env` that it does not set already. */
|
|
20
|
+
export declare function loadProjectEnv(projectDir: string, env?: Record<string, string | undefined>): void;
|
|
21
|
+
/** Whether `version` (like `v22.23.1`) satisfies a `>=x.y.z` range, the only form engines use here. */
|
|
22
|
+
export declare function satisfiesMinimum(version: string, range: string): boolean;
|
|
23
|
+
/** Variables `.env.example` lists without a leading `#`: the ones the project requires. */
|
|
24
|
+
export declare function requiredVariables(projectDir: string): string[];
|
|
25
|
+
/**
|
|
26
|
+
* The version of `name` the project resolves, `undefined` when it is not
|
|
27
|
+
* installed. Plug'n'Play installs are read through Yarn's own API, others the
|
|
28
|
+
* way Node looks packages up: node_modules of the project and every directory
|
|
29
|
+
* above it, so hoisted packages of a monorepo count.
|
|
30
|
+
*/
|
|
31
|
+
export declare function installedVersion(projectDir: string, name: string): string | undefined;
|
|
32
|
+
/** Host and port of a service URL such as `redis://localhost:6379`, with the scheme's default port. */
|
|
33
|
+
export declare function endpointOf(url: string, defaultPort: number): {
|
|
34
|
+
host: string;
|
|
35
|
+
port: number;
|
|
36
|
+
} | undefined;
|
|
37
|
+
/** Whether a TCP connection to `host:port` opens within `timeoutMs`. */
|
|
38
|
+
export declare function canConnect(host: string, port: number, timeoutMs?: number): Promise<boolean>;
|
|
39
|
+
/** Everything `cogitator doctor` checks, in the order it shows them. */
|
|
40
|
+
export declare function runDoctor(context: DoctorContext): Promise<DoctorCheck[]>;
|
|
41
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/utils/doctor.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAmBD,2FAA2F;AAC3F,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,IAAI,CAMN;AAED,uGAAuG;AACvG,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUxE;AAED,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAO9D;AAwDD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAqBrF;AAmKD,uGAAuG;AACvG,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAU5C;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAWzF;AA+CD,wEAAwE;AACxE,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA0B9E"}
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { connect } from 'node:net';
|
|
4
|
+
import { dirname, join, resolve } from 'node:path';
|
|
5
|
+
import { findConfigFile, loadConfig, parseDotenv } from '@cogitator-ai/config';
|
|
6
|
+
import { checkApiKey, describeKeyCheck, PROVIDER_INFO } from 'create-cogitator-app';
|
|
7
|
+
import { listOllamaModels, resolveOllamaUrl } from './ollama.js';
|
|
8
|
+
function readJson(path) {
|
|
9
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
10
|
+
}
|
|
11
|
+
function readManifest(projectDir) {
|
|
12
|
+
const path = join(projectDir, 'package.json');
|
|
13
|
+
if (!existsSync(path))
|
|
14
|
+
return undefined;
|
|
15
|
+
const parsed = readJson(path);
|
|
16
|
+
return typeof parsed === 'object' && parsed !== null ? parsed : undefined;
|
|
17
|
+
}
|
|
18
|
+
/** Fills `env` with the variables of the project's `.env` that it does not set already. */
|
|
19
|
+
export function loadProjectEnv(projectDir, env = process.env) {
|
|
20
|
+
const file = join(projectDir, '.env');
|
|
21
|
+
if (!existsSync(file))
|
|
22
|
+
return;
|
|
23
|
+
for (const [key, value] of Object.entries(parseDotenv(readFileSync(file, 'utf-8')))) {
|
|
24
|
+
if (env[key] === undefined)
|
|
25
|
+
env[key] = value;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Whether `version` (like `v22.23.1`) satisfies a `>=x.y.z` range, the only form engines use here. */
|
|
29
|
+
export function satisfiesMinimum(version, range) {
|
|
30
|
+
const minimum = /^>=\s*(\d+)\.(\d+)\.(\d+)/.exec(range.trim());
|
|
31
|
+
const actual = /^v?(\d+)\.(\d+)\.(\d+)/.exec(version.trim());
|
|
32
|
+
if (!minimum || !actual)
|
|
33
|
+
return true;
|
|
34
|
+
for (let i = 1; i <= 3; i++) {
|
|
35
|
+
const a = Number(actual[i]);
|
|
36
|
+
const m = Number(minimum[i]);
|
|
37
|
+
if (a !== m)
|
|
38
|
+
return a > m;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
/** Variables `.env.example` lists without a leading `#`: the ones the project requires. */
|
|
43
|
+
export function requiredVariables(projectDir) {
|
|
44
|
+
const path = join(projectDir, '.env.example');
|
|
45
|
+
if (!existsSync(path))
|
|
46
|
+
return [];
|
|
47
|
+
return readFileSync(path, 'utf-8')
|
|
48
|
+
.split(/\r?\n/)
|
|
49
|
+
.map((line) => /^([A-Za-z_][A-Za-z0-9_]*)=/.exec(line.trim())?.[1])
|
|
50
|
+
.filter((name) => name !== undefined);
|
|
51
|
+
}
|
|
52
|
+
function nodeCheck(manifest, nodeVersion) {
|
|
53
|
+
const range = manifest?.engines?.node;
|
|
54
|
+
if (!range) {
|
|
55
|
+
return { id: 'node', label: 'Node.js', status: 'pass', detail: nodeVersion };
|
|
56
|
+
}
|
|
57
|
+
return satisfiesMinimum(nodeVersion, range)
|
|
58
|
+
? { id: 'node', label: 'Node.js', status: 'pass', detail: `${nodeVersion} (needs ${range})` }
|
|
59
|
+
: {
|
|
60
|
+
id: 'node',
|
|
61
|
+
label: 'Node.js',
|
|
62
|
+
status: 'fail',
|
|
63
|
+
detail: `${nodeVersion}, but the project needs ${range}`,
|
|
64
|
+
fix: 'install a newer Node.js, for example with nvm or fnm',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function isPnpApi(value) {
|
|
68
|
+
return (typeof value === 'object' &&
|
|
69
|
+
value !== null &&
|
|
70
|
+
'findPackageLocator' in value &&
|
|
71
|
+
typeof value.findPackageLocator === 'function' &&
|
|
72
|
+
'getPackageInformation' in value &&
|
|
73
|
+
typeof value.getPackageInformation === 'function');
|
|
74
|
+
}
|
|
75
|
+
/** The nearest `.pnp.cjs` at or above `directory`, which a Yarn Plug'n'Play install writes. */
|
|
76
|
+
function findPnpFile(directory) {
|
|
77
|
+
for (let current = resolve(directory);; current = dirname(current)) {
|
|
78
|
+
const candidate = join(current, '.pnp.cjs');
|
|
79
|
+
if (existsSync(candidate))
|
|
80
|
+
return candidate;
|
|
81
|
+
if (dirname(current) === current)
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function versionOf(manifestPath) {
|
|
86
|
+
const parsed = readJson(manifestPath);
|
|
87
|
+
return typeof parsed === 'object' &&
|
|
88
|
+
parsed !== null &&
|
|
89
|
+
'version' in parsed &&
|
|
90
|
+
typeof parsed.version === 'string'
|
|
91
|
+
? parsed.version
|
|
92
|
+
: '?';
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The version of `name` the project resolves, `undefined` when it is not
|
|
96
|
+
* installed. Plug'n'Play installs are read through Yarn's own API, others the
|
|
97
|
+
* way Node looks packages up: node_modules of the project and every directory
|
|
98
|
+
* above it, so hoisted packages of a monorepo count.
|
|
99
|
+
*/
|
|
100
|
+
export function installedVersion(projectDir, name) {
|
|
101
|
+
const pnpFile = findPnpFile(projectDir);
|
|
102
|
+
if (pnpFile) {
|
|
103
|
+
let api;
|
|
104
|
+
try {
|
|
105
|
+
api = createRequire(import.meta.url)(pnpFile);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
if (!isPnpApi(api))
|
|
111
|
+
return undefined;
|
|
112
|
+
const locator = api.findPackageLocator(`${resolve(projectDir)}/`);
|
|
113
|
+
const reference = locator && api.getPackageInformation(locator)?.packageDependencies.get(name);
|
|
114
|
+
if (!reference)
|
|
115
|
+
return undefined;
|
|
116
|
+
const resolved = Array.isArray(reference) ? reference[1] : reference;
|
|
117
|
+
return /npm:([^#]+)$/.exec(resolved)?.[1] ?? resolved;
|
|
118
|
+
}
|
|
119
|
+
for (let current = resolve(projectDir);; current = dirname(current)) {
|
|
120
|
+
const manifest = join(current, 'node_modules', name, 'package.json');
|
|
121
|
+
if (existsSync(manifest))
|
|
122
|
+
return versionOf(manifest);
|
|
123
|
+
if (dirname(current) === current)
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function packagesCheck(projectDir, manifest) {
|
|
128
|
+
const wanted = Object.keys({ ...manifest?.dependencies, ...manifest?.devDependencies }).filter((name) => name.startsWith('@cogitator-ai/'));
|
|
129
|
+
if (wanted.length === 0) {
|
|
130
|
+
return {
|
|
131
|
+
id: 'packages',
|
|
132
|
+
label: 'Cogitator packages',
|
|
133
|
+
status: 'warn',
|
|
134
|
+
detail: 'package.json depends on none',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const missing = [];
|
|
138
|
+
const installed = [];
|
|
139
|
+
for (const name of wanted) {
|
|
140
|
+
const version = installedVersion(projectDir, name);
|
|
141
|
+
if (version === undefined)
|
|
142
|
+
missing.push(name);
|
|
143
|
+
else
|
|
144
|
+
installed.push(`${name.slice('@cogitator-ai/'.length)}@${version}`);
|
|
145
|
+
}
|
|
146
|
+
return missing.length > 0
|
|
147
|
+
? {
|
|
148
|
+
id: 'packages',
|
|
149
|
+
label: 'Cogitator packages',
|
|
150
|
+
status: 'fail',
|
|
151
|
+
detail: `not installed: ${missing.join(', ')}`,
|
|
152
|
+
fix: 'install the dependencies (pnpm install, npm install, ...)',
|
|
153
|
+
}
|
|
154
|
+
: { id: 'packages', label: 'Cogitator packages', status: 'pass', detail: installed.join(', ') };
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Loads the project's `cogitator.yml` the way the project does. `${VAR}` in it
|
|
158
|
+
* reads `process.env`, so the command loads `.env` into it first.
|
|
159
|
+
*/
|
|
160
|
+
function configCheck(projectDir) {
|
|
161
|
+
const path = findConfigFile(projectDir);
|
|
162
|
+
if (!path) {
|
|
163
|
+
return {
|
|
164
|
+
check: {
|
|
165
|
+
id: 'config',
|
|
166
|
+
label: 'cogitator.yml',
|
|
167
|
+
status: 'warn',
|
|
168
|
+
detail: 'not found, the project configures Cogitator in code only',
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
const config = loadConfig({ configPath: path });
|
|
174
|
+
return {
|
|
175
|
+
check: {
|
|
176
|
+
id: 'config',
|
|
177
|
+
label: 'cogitator.yml',
|
|
178
|
+
status: 'pass',
|
|
179
|
+
detail: `model ${config.llm?.defaultModel ?? 'not set'}, memory ${config.memory?.adapter ?? 'none'}`,
|
|
180
|
+
},
|
|
181
|
+
config,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
return {
|
|
186
|
+
check: {
|
|
187
|
+
id: 'config',
|
|
188
|
+
label: 'cogitator.yml',
|
|
189
|
+
status: 'fail',
|
|
190
|
+
detail: error instanceof Error ? error.message.split('\n').slice(0, 4).join(' ') : String(error),
|
|
191
|
+
fix: 'fix the reported keys in cogitator.yml',
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function envCheck(projectDir, env) {
|
|
197
|
+
const required = requiredVariables(projectDir);
|
|
198
|
+
const missing = required.filter((name) => !env[name]?.trim());
|
|
199
|
+
if (required.length === 0) {
|
|
200
|
+
return { id: 'env', label: 'Environment', status: 'pass', detail: 'no variables required' };
|
|
201
|
+
}
|
|
202
|
+
return missing.length > 0
|
|
203
|
+
? {
|
|
204
|
+
id: 'env',
|
|
205
|
+
label: 'Environment',
|
|
206
|
+
status: 'fail',
|
|
207
|
+
detail: `missing ${missing.join(', ')}`,
|
|
208
|
+
fix: 'copy .env.example to .env and fill them in',
|
|
209
|
+
}
|
|
210
|
+
: { id: 'env', label: 'Environment', status: 'pass', detail: `${required.join(', ')} set` };
|
|
211
|
+
}
|
|
212
|
+
function providerOf(config) {
|
|
213
|
+
const model = config?.llm?.defaultModel;
|
|
214
|
+
return model?.includes('/') ? model.split('/')[0] : config?.llm?.defaultProvider;
|
|
215
|
+
}
|
|
216
|
+
async function modelCheck(config, env, fetcher) {
|
|
217
|
+
const provider = providerOf(config);
|
|
218
|
+
const model = config?.llm?.defaultModel;
|
|
219
|
+
if (!provider)
|
|
220
|
+
return undefined;
|
|
221
|
+
if (provider === 'ollama') {
|
|
222
|
+
const baseUrl = resolveOllamaUrl(env, config?.llm?.providers?.ollama?.baseUrl);
|
|
223
|
+
let models;
|
|
224
|
+
try {
|
|
225
|
+
models = await listOllamaModels(baseUrl, { apiKey: env.OLLAMA_API_KEY, timeoutMs: 3000 });
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return {
|
|
229
|
+
id: 'model',
|
|
230
|
+
label: 'Ollama',
|
|
231
|
+
status: 'fail',
|
|
232
|
+
detail: `not reachable at ${baseUrl}`,
|
|
233
|
+
fix: 'start Ollama (ollama serve) or docker compose up -d ollama',
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
const name = model?.slice('ollama/'.length);
|
|
237
|
+
const tagged = (n) => (n.includes(':') ? n : `${n}:latest`);
|
|
238
|
+
if (name && !models.some((m) => tagged(m.name) === tagged(name))) {
|
|
239
|
+
return {
|
|
240
|
+
id: 'model',
|
|
241
|
+
label: 'Ollama',
|
|
242
|
+
status: 'fail',
|
|
243
|
+
detail: `${name} is not pulled`,
|
|
244
|
+
fix: `ollama pull ${name}`,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
id: 'model',
|
|
249
|
+
label: 'Ollama',
|
|
250
|
+
status: 'pass',
|
|
251
|
+
detail: `${baseUrl}, ${name ?? 'no default model'} ready`,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
if (provider === 'openai' || provider === 'anthropic' || provider === 'google') {
|
|
255
|
+
const envKey = PROVIDER_INFO[provider].envKey ?? '';
|
|
256
|
+
const key = env[envKey] ?? (provider === 'google' ? env.GEMINI_API_KEY : undefined);
|
|
257
|
+
if (!key) {
|
|
258
|
+
return {
|
|
259
|
+
id: 'model',
|
|
260
|
+
label: PROVIDER_INFO[provider].label,
|
|
261
|
+
status: 'fail',
|
|
262
|
+
detail: `${envKey} is not set`,
|
|
263
|
+
fix: `set ${envKey} in .env`,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const result = await checkApiKey(provider, key, { fetch: fetcher });
|
|
267
|
+
const status = result.status === 'valid' ? 'pass' : result.status === 'invalid' ? 'fail' : 'warn';
|
|
268
|
+
return {
|
|
269
|
+
id: 'model',
|
|
270
|
+
label: PROVIDER_INFO[provider].label,
|
|
271
|
+
status,
|
|
272
|
+
detail: describeKeyCheck(envKey, result),
|
|
273
|
+
...(status === 'fail' && { fix: `create a new key at ${PROVIDER_INFO[provider].keyUrl}` }),
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
return undefined;
|
|
277
|
+
}
|
|
278
|
+
/** Host and port of a service URL such as `redis://localhost:6379`, with the scheme's default port. */
|
|
279
|
+
export function endpointOf(url, defaultPort) {
|
|
280
|
+
try {
|
|
281
|
+
const parsed = new URL(url);
|
|
282
|
+
return {
|
|
283
|
+
host: parsed.hostname.replace(/^\[|\]$/g, '') || 'localhost',
|
|
284
|
+
port: Number(parsed.port) || defaultPort,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
return undefined;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/** Whether a TCP connection to `host:port` opens within `timeoutMs`. */
|
|
292
|
+
export function canConnect(host, port, timeoutMs = 2000) {
|
|
293
|
+
return new Promise((resolve) => {
|
|
294
|
+
const socket = connect({ host, port });
|
|
295
|
+
const done = (ok) => {
|
|
296
|
+
socket.destroy();
|
|
297
|
+
resolve(ok);
|
|
298
|
+
};
|
|
299
|
+
socket.setTimeout(timeoutMs, () => done(false));
|
|
300
|
+
socket.once('connect', () => done(true));
|
|
301
|
+
socket.once('error', () => done(false));
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
async function memoryCheck(config) {
|
|
305
|
+
const memory = config?.memory;
|
|
306
|
+
if (!memory?.adapter || memory.adapter === 'memory' || memory.adapter === 'sqlite')
|
|
307
|
+
return undefined;
|
|
308
|
+
const target = memory.adapter === 'redis'
|
|
309
|
+
? {
|
|
310
|
+
url: memory.redis && 'url' in memory.redis ? memory.redis.url : undefined,
|
|
311
|
+
port: 6379,
|
|
312
|
+
service: 'redis',
|
|
313
|
+
}
|
|
314
|
+
: memory.adapter === 'postgres'
|
|
315
|
+
? { url: memory.postgres?.connectionString, port: 5432, service: 'postgres' }
|
|
316
|
+
: memory.adapter === 'mongodb'
|
|
317
|
+
? { url: memory.mongodb?.uri, port: 27017, service: 'mongodb' }
|
|
318
|
+
: undefined;
|
|
319
|
+
if (!target)
|
|
320
|
+
return undefined;
|
|
321
|
+
const endpoint = target.url
|
|
322
|
+
? endpointOf(target.url, target.port)
|
|
323
|
+
: { host: 'localhost', port: target.port };
|
|
324
|
+
if (!endpoint) {
|
|
325
|
+
return {
|
|
326
|
+
id: 'memory',
|
|
327
|
+
label: `Memory (${memory.adapter})`,
|
|
328
|
+
status: 'fail',
|
|
329
|
+
detail: 'the connection URL does not parse',
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
const ok = await canConnect(endpoint.host, endpoint.port);
|
|
333
|
+
return ok
|
|
334
|
+
? {
|
|
335
|
+
id: 'memory',
|
|
336
|
+
label: `Memory (${memory.adapter})`,
|
|
337
|
+
status: 'pass',
|
|
338
|
+
detail: `${endpoint.host}:${endpoint.port} answers`,
|
|
339
|
+
}
|
|
340
|
+
: {
|
|
341
|
+
id: 'memory',
|
|
342
|
+
label: `Memory (${memory.adapter})`,
|
|
343
|
+
status: 'fail',
|
|
344
|
+
detail: `nothing listens on ${endpoint.host}:${endpoint.port}`,
|
|
345
|
+
fix: `docker compose up -d ${target.service}`,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
/** Everything `cogitator doctor` checks, in the order it shows them. */
|
|
349
|
+
export async function runDoctor(context) {
|
|
350
|
+
const manifest = readManifest(context.projectDir);
|
|
351
|
+
const checks = [];
|
|
352
|
+
if (!manifest) {
|
|
353
|
+
return [
|
|
354
|
+
{
|
|
355
|
+
id: 'project',
|
|
356
|
+
label: 'Project',
|
|
357
|
+
status: 'fail',
|
|
358
|
+
detail: `no package.json in ${context.projectDir}`,
|
|
359
|
+
fix: 'run cogitator doctor in the project directory',
|
|
360
|
+
},
|
|
361
|
+
];
|
|
362
|
+
}
|
|
363
|
+
checks.push(nodeCheck(manifest, context.nodeVersion));
|
|
364
|
+
checks.push(packagesCheck(context.projectDir, manifest));
|
|
365
|
+
const { check, config } = configCheck(context.projectDir);
|
|
366
|
+
checks.push(check);
|
|
367
|
+
checks.push(envCheck(context.projectDir, context.env));
|
|
368
|
+
if (context.probe) {
|
|
369
|
+
const model = await modelCheck(config, context.env, context.fetch);
|
|
370
|
+
if (model)
|
|
371
|
+
checks.push(model);
|
|
372
|
+
const memory = await memoryCheck(config);
|
|
373
|
+
if (memory)
|
|
374
|
+
checks.push(memory);
|
|
375
|
+
}
|
|
376
|
+
return checks;
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/utils/doctor.ts"],"names":[],"mappings":"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"}
|