@squadrules/mcp 5.4.2 → 5.5.1
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/dist/.tsbuildinfo +1 -1
- package/dist/cli/api-client.d.ts +3 -1
- package/dist/cli/api-client.d.ts.map +1 -1
- package/dist/cli/api-client.js +7 -16
- package/dist/cli/api-client.js.map +1 -1
- package/dist/cli/backend/action-backend.d.ts +99 -0
- package/dist/cli/backend/action-backend.d.ts.map +1 -0
- package/dist/cli/backend/action-backend.js +2 -0
- package/dist/cli/backend/action-backend.js.map +1 -0
- package/dist/cli/backend/http-backend.d.ts +31 -0
- package/dist/cli/backend/http-backend.d.ts.map +1 -0
- package/dist/cli/backend/http-backend.js +38 -0
- package/dist/cli/backend/http-backend.js.map +1 -0
- package/dist/cli/backend/local-backend.d.ts +37 -0
- package/dist/cli/backend/local-backend.d.ts.map +1 -0
- package/dist/cli/backend/local-backend.js +166 -0
- package/dist/cli/backend/local-backend.js.map +1 -0
- package/dist/cli/backend/resolve-backend.d.ts +29 -0
- package/dist/cli/backend/resolve-backend.d.ts.map +1 -0
- package/dist/cli/backend/resolve-backend.js +37 -0
- package/dist/cli/backend/resolve-backend.js.map +1 -0
- package/dist/cli/client-factory.d.ts +6 -7
- package/dist/cli/client-factory.d.ts.map +1 -1
- package/dist/cli/client-factory.js +8 -42
- package/dist/cli/client-factory.js.map +1 -1
- package/dist/cli/commands/{search.d.ts → activate.d.ts} +2 -2
- package/dist/cli/commands/activate.d.ts.map +1 -0
- package/dist/cli/commands/activate.js +31 -0
- package/dist/cli/commands/activate.js.map +1 -0
- package/dist/cli/commands/cli-train.d.ts +5 -1
- package/dist/cli/commands/cli-train.d.ts.map +1 -1
- package/dist/cli/commands/cli-train.js +40 -139
- package/dist/cli/commands/cli-train.js.map +1 -1
- package/dist/cli/commands/delete.d.ts +1 -1
- package/dist/cli/commands/delete.d.ts.map +1 -1
- package/dist/cli/commands/delete.js +11 -6
- package/dist/cli/commands/delete.js.map +1 -1
- package/dist/cli/commands/export.d.ts +12 -5
- package/dist/cli/commands/export.d.ts.map +1 -1
- package/dist/cli/commands/export.js +117 -55
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/{begin.d.ts → forward.d.ts} +2 -2
- package/dist/cli/commands/forward.d.ts.map +1 -0
- package/dist/cli/commands/forward.js +31 -0
- package/dist/cli/commands/forward.js.map +1 -0
- package/dist/cli/commands/login.d.ts +8 -2
- package/dist/cli/commands/login.d.ts.map +1 -1
- package/dist/cli/commands/login.js +53 -13
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logout.d.ts.map +1 -1
- package/dist/cli/commands/logout.js +3 -1
- package/dist/cli/commands/logout.js.map +1 -1
- package/dist/cli/commands/{attest.d.ts → reward.d.ts} +2 -2
- package/dist/cli/commands/reward.d.ts.map +1 -0
- package/dist/cli/commands/{attest.js → reward.js} +16 -17
- package/dist/cli/commands/reward.js.map +1 -0
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/serve.js +3 -0
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/spaces.d.ts +2 -2
- package/dist/cli/commands/spaces.d.ts.map +1 -1
- package/dist/cli/commands/spaces.js +12 -7
- package/dist/cli/commands/spaces.js.map +1 -1
- package/dist/cli/commands/token.d.ts.map +1 -1
- package/dist/cli/commands/token.js +7 -3
- package/dist/cli/commands/token.js.map +1 -1
- package/dist/cli/commands/tune.d.ts +6 -0
- package/dist/cli/commands/tune.d.ts.map +1 -0
- package/dist/cli/commands/{update.js → tune.js} +34 -24
- package/dist/cli/commands/tune.js.map +1 -0
- package/dist/cli/config.d.ts +4 -2
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +6 -3
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/fetch-error.d.ts +6 -0
- package/dist/cli/fetch-error.d.ts.map +1 -1
- package/dist/cli/fetch-error.js +18 -0
- package/dist/cli/fetch-error.js.map +1 -1
- package/dist/cli/format.d.ts +20 -0
- package/dist/cli/format.d.ts.map +1 -0
- package/dist/cli/format.js +18 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/local-target.d.ts +11 -0
- package/dist/cli/local-target.d.ts.map +1 -0
- package/dist/cli/local-target.js +14 -0
- package/dist/cli/local-target.js.map +1 -0
- package/dist/cli/log-sink-prelude.d.ts +2 -0
- package/dist/cli/log-sink-prelude.d.ts.map +1 -0
- package/dist/cli/log-sink-prelude.js +23 -0
- package/dist/cli/log-sink-prelude.js.map +1 -0
- package/dist/cli/output.d.ts +20 -3
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +14 -6
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +12 -7
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/render.d.ts +37 -0
- package/dist/cli/render.d.ts.map +1 -0
- package/dist/cli/render.js +179 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/cli/resolve-timeout.d.ts +16 -0
- package/dist/cli/resolve-timeout.d.ts.map +1 -0
- package/dist/cli/resolve-timeout.js +43 -0
- package/dist/cli/resolve-timeout.js.map +1 -0
- package/dist/cli/skill-zip-local-write.d.ts +6 -4
- package/dist/cli/skill-zip-local-write.d.ts.map +1 -1
- package/dist/cli/skill-zip-local-write.js +5 -3
- package/dist/cli/skill-zip-local-write.js.map +1 -1
- package/dist/cli/train-batch.d.ts +20 -0
- package/dist/cli/train-batch.d.ts.map +1 -0
- package/dist/cli/train-batch.js +168 -0
- package/dist/cli/train-batch.js.map +1 -0
- package/dist/embed-docs/mem/adapter-migration.md +1 -1
- package/dist/embed-docs/mem/bulk-insert-adapters-via-cli.md +1 -1
- package/dist/embed-docs/mem/challenge-type-guide.md +1 -1
- package/dist/embed-docs/mem/create-new-protocol.md +1 -1
- package/dist/embed-docs/mem/critic-loop-guide.md +1 -1
- package/dist/embed-docs/mem/critic-loop.md +1 -1
- package/dist/embed-docs/mem/phase-critic-guide.md +1 -1
- package/dist/embed-docs/mem/phase-critic.md +1 -1
- package/dist/embed-docs/mem/protocol-linking-guide.md +1 -1
- package/dist/embed-docs/mem/refine-search.md +1 -1
- package/dist/embed-docs/mem/skill-format-guide.md +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -70
- package/dist/index.js.map +1 -1
- package/dist/resources/embedded-mcp-resources.js +11 -11
- package/dist/runtime/boot-local-runtime.d.ts +37 -0
- package/dist/runtime/boot-local-runtime.d.ts.map +1 -0
- package/dist/runtime/boot-local-runtime.js +122 -0
- package/dist/runtime/boot-local-runtime.js.map +1 -0
- package/dist/services/embedding/lazy-probe.d.ts +7 -0
- package/dist/services/embedding/lazy-probe.d.ts.map +1 -0
- package/dist/services/embedding/lazy-probe.js +26 -0
- package/dist/services/embedding/lazy-probe.js.map +1 -0
- package/dist/ui/assets/{AccountPage-DlzuVTtp.js → AccountPage-DyTJwGMC.js} +1 -1
- package/dist/ui/assets/{index-C77BzNbG.js → index-CKityaQ1.js} +2 -2
- package/dist/ui/assets/index-Dq6apLxZ.css +2 -0
- package/dist/ui/index.html +2 -2
- package/dist/utils/log-core.d.ts +7 -0
- package/dist/utils/log-core.d.ts.map +1 -1
- package/dist/utils/log-core.js +14 -4
- package/dist/utils/log-core.js.map +1 -1
- package/dist/utils/tenant-context.d.ts +6 -0
- package/dist/utils/tenant-context.d.ts.map +1 -1
- package/dist/utils/tenant-context.js +6 -1
- package/dist/utils/tenant-context.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/commands/attest.d.ts.map +0 -1
- package/dist/cli/commands/attest.js.map +0 -1
- package/dist/cli/commands/begin.d.ts.map +0 -1
- package/dist/cli/commands/begin.js +0 -27
- package/dist/cli/commands/begin.js.map +0 -1
- package/dist/cli/commands/search.d.ts.map +0 -1
- package/dist/cli/commands/search.js +0 -25
- package/dist/cli/commands/search.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -6
- package/dist/cli/commands/update.d.ts.map +0 -1
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/format-next-call.d.ts +0 -2
- package/dist/cli/format-next-call.d.ts.map +0 -1
- package/dist/cli/format-next-call.js +0 -63
- package/dist/cli/format-next-call.js.map +0 -1
- package/dist/ui/assets/index-CSUUmfdT.css +0 -2
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directory-batch `train` support (extracted from cli-train.ts to keep that command file small).
|
|
3
|
+
*
|
|
4
|
+
* A directory batch is machine-facing: it never dumps adapter/content bytes to stdout, prints a
|
|
5
|
+
* compact per-item summary, and `--format json` emits a manifest of what was stored. Each `.md`
|
|
6
|
+
* file is trained as an adapter and any sibling artifacts are attached to it.
|
|
7
|
+
*/
|
|
8
|
+
import { closeSync, fstatSync, openSync, readdirSync, readFileSync } from 'fs';
|
|
9
|
+
import { join, relative, resolve } from 'path';
|
|
10
|
+
import { emitResult, writeError } from './output.js';
|
|
11
|
+
import { readMarkdownUploadFromFile } from './upload-guards.js';
|
|
12
|
+
import { inferArtifactMimeFromName } from '../tools/artifact-mime.js';
|
|
13
|
+
/** Directory batch skips `README.md` (human docs); single-file `train path/to/README.md` still works. */
|
|
14
|
+
function isReadmeMarkdownFileName(name) {
|
|
15
|
+
return /^readme\.md$/i.test(name);
|
|
16
|
+
}
|
|
17
|
+
function listSkillFiles(dir, recursive) {
|
|
18
|
+
const base = resolve(dir);
|
|
19
|
+
const out = [];
|
|
20
|
+
const processDir = (current) => {
|
|
21
|
+
const mdPaths = [];
|
|
22
|
+
const artifactEntries = [];
|
|
23
|
+
for (const ent of readdirSync(current, { withFileTypes: true })) {
|
|
24
|
+
if (ent.isDirectory()) {
|
|
25
|
+
if (recursive)
|
|
26
|
+
processDir(join(current, ent.name));
|
|
27
|
+
}
|
|
28
|
+
else if (ent.isFile()) {
|
|
29
|
+
const full = join(current, ent.name);
|
|
30
|
+
if (ent.name.endsWith('.md') && !isReadmeMarkdownFileName(ent.name)) {
|
|
31
|
+
mdPaths.push(full);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const mime = inferArtifactMimeFromName(ent.name);
|
|
35
|
+
if (mime)
|
|
36
|
+
artifactEntries.push({ absPath: full, name: ent.name, mime });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
for (const mdPath of mdPaths) {
|
|
41
|
+
out.push({ mdPath, artifacts: artifactEntries });
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
processDir(base);
|
|
45
|
+
return out.sort((a, b) => relative(base, a.mdPath).localeCompare(relative(base, b.mdPath)));
|
|
46
|
+
}
|
|
47
|
+
export function readUtf8RegularFile(absPath) {
|
|
48
|
+
const fd = openSync(absPath, 'r');
|
|
49
|
+
try {
|
|
50
|
+
if (!fstatSync(fd).isFile()) {
|
|
51
|
+
throw Object.assign(new Error('Path is not a regular file'), { code: 'ENOTREG' });
|
|
52
|
+
}
|
|
53
|
+
return readFileSync(fd, 'utf8');
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
closeSync(fd);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function renderBatchPretty(manifest) {
|
|
60
|
+
const lines = [
|
|
61
|
+
`train batch: ${manifest.root}`,
|
|
62
|
+
` ${manifest.ok} ok, ${manifest.failed} failed (of ${manifest.total})`
|
|
63
|
+
];
|
|
64
|
+
for (const row of manifest.results) {
|
|
65
|
+
if (row.ok) {
|
|
66
|
+
lines.push(` ok ${row.path}${row.adapter_uri ? ` → ${row.adapter_uri}` : ''}`);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
lines.push(` ERR ${row.path}: ${row.error ?? 'unknown error'}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return lines.join('\n');
|
|
73
|
+
}
|
|
74
|
+
function renderBatchText(manifest) {
|
|
75
|
+
return manifest.results
|
|
76
|
+
.map((row) => `${row.ok ? 'ok' : 'err'}\t${row.path}\t${row.ok ? row.adapter_uri ?? '' : row.error ?? ''}`)
|
|
77
|
+
.join('\n');
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Train every `.md` file under `abs` (recursively when `--recursive`), attaching sibling artifacts.
|
|
81
|
+
* Emits the batch manifest through the uniform output model. Artifact flags are single-file-only.
|
|
82
|
+
*/
|
|
83
|
+
export async function runTrainBatch(backend, abs, flags, trainOptions, format) {
|
|
84
|
+
if (typeof flags.adapter === 'string' ||
|
|
85
|
+
typeof flags.artifactName === 'string' ||
|
|
86
|
+
typeof flags.mime === 'string' ||
|
|
87
|
+
typeof flags.relativePath === 'string') {
|
|
88
|
+
writeError('Artifact flags (--adapter/--artifact-name/--mime/--relative-path) are only supported for single-file train');
|
|
89
|
+
process.exit(1);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const files = listSkillFiles(abs, Boolean(flags.recursive));
|
|
93
|
+
if (files.length === 0) {
|
|
94
|
+
writeError('No .md files found in directory');
|
|
95
|
+
process.exit(1);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const results = [];
|
|
99
|
+
for (const entry of files) {
|
|
100
|
+
const fp = entry.mdPath;
|
|
101
|
+
const rel = relative(abs, fp).replace(/\\/g, '/');
|
|
102
|
+
try {
|
|
103
|
+
const markdown = readMarkdownUploadFromFile(fp, 'train', Boolean(flags.allowSensitiveUpload));
|
|
104
|
+
const response = await backend.train(markdown, trainOptions);
|
|
105
|
+
const adapterUriValue = response.items[0]?.adapter_uri;
|
|
106
|
+
const resultEntry = {
|
|
107
|
+
path: rel,
|
|
108
|
+
ok: true,
|
|
109
|
+
status: response.status,
|
|
110
|
+
...(adapterUriValue ? { adapter_uri: adapterUriValue } : {}),
|
|
111
|
+
items: response.items
|
|
112
|
+
};
|
|
113
|
+
if (entry.artifacts.length > 0) {
|
|
114
|
+
const model = flags.model?.trim();
|
|
115
|
+
const adapterUri = resultEntry.adapter_uri;
|
|
116
|
+
const artifactResults = [];
|
|
117
|
+
for (const af of entry.artifacts) {
|
|
118
|
+
const afRel = relative(abs, af.absPath).replace(/\\/g, '/');
|
|
119
|
+
if (!model) {
|
|
120
|
+
writeError(`artifact_skipped: ${afRel} — add --model <id> to upload artifacts`);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (!adapterUri) {
|
|
124
|
+
writeError(`artifact_skipped: ${afRel} — adapter_uri missing (add slug to frontmatter or use --force)`);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
const content = readUtf8RegularFile(af.absPath);
|
|
129
|
+
const ar = await backend.trainJson({
|
|
130
|
+
llm_model_id: model,
|
|
131
|
+
content,
|
|
132
|
+
force_update: Boolean(flags.force),
|
|
133
|
+
mime: af.mime,
|
|
134
|
+
artifact_name: af.name,
|
|
135
|
+
adapter_uri: adapterUri,
|
|
136
|
+
relative_path: afRel,
|
|
137
|
+
...(trainOptions.space ? { space: trainOptions.space } : {})
|
|
138
|
+
});
|
|
139
|
+
artifactResults.push({ path: afRel, ok: true, status: ar.status, items: ar.items });
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
artifactResults.push({ path: afRel, ok: false, error: e instanceof Error ? e.message : String(e) });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (artifactResults.length > 0)
|
|
146
|
+
resultEntry.artifacts = artifactResults;
|
|
147
|
+
}
|
|
148
|
+
results.push(resultEntry);
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
results.push({
|
|
152
|
+
path: rel,
|
|
153
|
+
ok: false,
|
|
154
|
+
error: e instanceof Error ? e.message : String(e)
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const manifest = {
|
|
159
|
+
batch: true,
|
|
160
|
+
root: abs,
|
|
161
|
+
total: results.length,
|
|
162
|
+
ok: results.filter((r) => r.ok).length,
|
|
163
|
+
failed: results.filter((r) => !r.ok).length,
|
|
164
|
+
results
|
|
165
|
+
};
|
|
166
|
+
emitResult(format, manifest, { pretty: renderBatchPretty, text: renderBatchText });
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=train-batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"train-batch.js","sourceRoot":"","sources":["../../src/cli/train-batch.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,OAAO,sCAAsC,CAAC;AA8B9C;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiEzD"}
|
package/dist/index.js
CHANGED
|
@@ -5,19 +5,13 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { structuredLogger } from './utils/structured-logger.js';
|
|
7
7
|
import { installGlobalErrorHandlers } from './utils/global-error-handlers.js';
|
|
8
|
-
import { MemoryQdrantStore } from './services/memory/store.js';
|
|
9
8
|
import { startHttpTransport } from './http/http-server.js';
|
|
10
9
|
import { startStdioTransport } from './stdio/stdio-server.js';
|
|
11
|
-
import {
|
|
12
|
-
import { MEM_BOOT_FORCE_INJECT } from './config/mem-boot.js';
|
|
10
|
+
import { bootLocalRuntime } from './runtime/boot-local-runtime.js';
|
|
13
11
|
import { startMetricsServer } from './metrics-server.js';
|
|
14
|
-
import { SERVER_PORT, METRICS_PORT,
|
|
15
|
-
import { qdrantService } from './services/qdrant/index.js';
|
|
16
|
-
import { getEmbeddedRecordStore } from './services/vector-store/embedded-store-singleton.js';
|
|
12
|
+
import { SERVER_PORT, METRICS_PORT, SQUADRULES_LOCAL_ARTIFACT_DIRS, TRANSPORT_TYPE } from './config.js';
|
|
17
13
|
import { resolveLanceDbDir } from './services/vector-store/lancedb-connection.js';
|
|
18
14
|
import { composeStdioModeBanner } from './stdio/stdio-banner.js';
|
|
19
|
-
import { triggerQdrantSnapshot } from './services/qdrant/snapshots.js';
|
|
20
|
-
import { probeEmbeddingDimension } from './services/embedding/service.js';
|
|
21
15
|
import { installQdrantFetchCompatibility } from './services/qdrant/undici-compat.js';
|
|
22
16
|
import path from 'node:path';
|
|
23
17
|
import { pathToFileURL } from 'node:url';
|
|
@@ -35,32 +29,6 @@ function isDirectRun() {
|
|
|
35
29
|
return false;
|
|
36
30
|
}
|
|
37
31
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Wait for Qdrant to be available with retries
|
|
40
|
-
* Uses shorter intervals for faster detection when Qdrant becomes available quickly
|
|
41
|
-
*/
|
|
42
|
-
async function waitForQdrant(memoryStore, maxRetries = 30, intervalMs = 1000) {
|
|
43
|
-
structuredLogger.info('Waiting for Qdrant to be available...');
|
|
44
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
45
|
-
try {
|
|
46
|
-
const isHealthy = await memoryStore.checkHealth(5000); // 5 second timeout per check
|
|
47
|
-
if (isHealthy) {
|
|
48
|
-
structuredLogger.info(`Qdrant is available after ${attempt} attempt(s)`);
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
catch (err) {
|
|
53
|
-
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
54
|
-
structuredLogger.debug(`Qdrant health check error on attempt ${attempt}: ${errorMessage}`);
|
|
55
|
-
// Health check failed, will retry
|
|
56
|
-
}
|
|
57
|
-
if (attempt < maxRetries) {
|
|
58
|
-
structuredLogger.info(`Qdrant not ready yet (attempt ${attempt}/${maxRetries}), retrying in ${intervalMs}ms...`);
|
|
59
|
-
await new Promise(resolve => setTimeout(resolve, intervalMs));
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
throw new Error(`Qdrant did not become available after ${maxRetries} attempts (${maxRetries * intervalMs / 1000}s)`);
|
|
63
|
-
}
|
|
64
32
|
/**
|
|
65
33
|
* Install signal handlers for graceful shutdown.
|
|
66
34
|
* Without listeners Node terminates immediately on SIGTERM, but open handles
|
|
@@ -95,42 +63,10 @@ export async function runSquadrulesServer() {
|
|
|
95
63
|
if (TRANSPORT_TYPE === 'stdio') {
|
|
96
64
|
process.stderr.write(composeStdioModeBanner(resolveLanceDbDir()));
|
|
97
65
|
}
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
|
|
102
|
-
const memoryStore = isQdrantConfigured
|
|
103
|
-
? new MemoryQdrantStore()
|
|
104
|
-
: getEmbeddedRecordStore();
|
|
105
|
-
// Wait for Qdrant to be available before initializing (embedded store is
|
|
106
|
-
// local — no server to wait for).
|
|
107
|
-
if (isQdrantConfigured) {
|
|
108
|
-
await waitForQdrant(memoryStore);
|
|
109
|
-
}
|
|
110
|
-
const embeddingDim = await probeEmbeddingDimension();
|
|
111
|
-
structuredLogger.debug(`embedding dimension: ${embeddingDim}`);
|
|
112
|
-
structuredLogger.info(`vector store: ${isQdrantConfigured ? 'Qdrant' : 'LanceDB (embedded)'}`);
|
|
113
|
-
structuredLogger.info(`embedding: ${EMBEDDING_PROVIDER}`);
|
|
114
|
-
await memoryStore.init();
|
|
115
|
-
structuredLogger.debug('vector store: ready');
|
|
116
|
-
if (isQdrantConfigured && QDRANT_SNAPSHOT_ON_START) {
|
|
117
|
-
const snapshotResult = await triggerQdrantSnapshot(qdrantService, {
|
|
118
|
-
enabled: true,
|
|
119
|
-
directory: QDRANT_SNAPSHOT_DIR,
|
|
120
|
-
reason: 'startup'
|
|
121
|
-
});
|
|
122
|
-
if (!snapshotResult.success) {
|
|
123
|
-
structuredLogger.warn(`Startup snapshot failed: ${snapshotResult.message || 'unknown error'}`);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
structuredLogger.debug('startup snapshot: skipped (embedded store)');
|
|
128
|
-
}
|
|
129
|
-
// Inject mem resources from embedded-mcp-resources into the vector store at boot.
|
|
130
|
-
// Adapters already stored at (or newer than) their shipped version are reused, so a
|
|
131
|
-
// normal restart does no re-embedding; set MEM_BOOT_FORCE_INJECT=true to force a
|
|
132
|
-
// delete-then-retrain (structural-repair path for a corrupted/duplicated store).
|
|
133
|
-
await injectMemResourcesAtBoot(memoryStore, { force: MEM_BOOT_FORCE_INJECT });
|
|
66
|
+
// Shared boot: store selection, embedding probe, init, optional snapshot, and
|
|
67
|
+
// app-space seeding. The server runs every stage (defaults); the CLI local path
|
|
68
|
+
// dials the expensive stages down for fastboot. Same sequence, no drift.
|
|
69
|
+
const { memoryStore } = await bootLocalRuntime();
|
|
134
70
|
// Metrics HTTP server: only when the app serves HTTP (stdio mode avoids any HTTP listeners).
|
|
135
71
|
if (TRANSPORT_TYPE === 'http') {
|
|
136
72
|
startMetricsServer();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|