@jagilber-org/index-server 1.28.5 → 1.28.9
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
CHANGED
|
@@ -51,6 +51,8 @@ index-server --dashboard
|
|
|
51
51
|
|
|
52
52
|
> **No-install alternative:** `npx -y @jagilber-org/index-server@latest --setup` works too (resolves from npmjs.org). Use it for a one-shot try; prefer `-g` for routine use. The GitHub Packages mirror requires authentication, so `npx` against `npm.pkg.github.com` needs a per-scope `.npmrc` plus a `GITHUB_TOKEN` with `read:packages`.
|
|
53
53
|
|
|
54
|
+
> **Upgrading or hitting "unsupported INDEX_SERVER key" / "Cannot find module" errors after install?** See [Upgrading and Uninstalling](docs/quickstart.md#upgrading-and-uninstalling) for the clean-uninstall steps that clear stale non-global installs.
|
|
55
|
+
|
|
54
56
|
#### Bootstrap HTTPS for the dashboard
|
|
55
57
|
|
|
56
58
|
Generate a self-signed TLS cert+key in one command:
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
|
-
<meta name="dashboard-build-version" content="1.28.
|
|
4
|
+
<meta name="dashboard-build-version" content="1.28.9-0009101e">
|
|
5
5
|
<meta charset="UTF-8">
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
7
|
<title>Index Server Admin</title>
|
|
8
|
-
<link rel="stylesheet" href="css/admin.css?v=1.28.
|
|
9
|
-
<script defer src="js/admin.utils.js?v=1.28.
|
|
10
|
-
<script defer src="js/admin.auth.js?v=1.28.
|
|
11
|
-
<script defer src="js/admin.overview.js?v=1.28.
|
|
12
|
-
<script defer src="js/admin.sessions.js?v=1.28.
|
|
13
|
-
<script defer src="js/admin.monitor.js?v=1.28.
|
|
14
|
-
<script defer src="js/admin.events.js?v=1.28.
|
|
15
|
-
<script defer src="js/admin.graph.js?v=1.28.
|
|
8
|
+
<link rel="stylesheet" href="css/admin.css?v=1.28.9-0009101e">
|
|
9
|
+
<script defer src="js/admin.utils.js?v=1.28.9-0009101e"></script>
|
|
10
|
+
<script defer src="js/admin.auth.js?v=1.28.9-0009101e"></script>
|
|
11
|
+
<script defer src="js/admin.overview.js?v=1.28.9-0009101e"></script>
|
|
12
|
+
<script defer src="js/admin.sessions.js?v=1.28.9-0009101e"></script>
|
|
13
|
+
<script defer src="js/admin.monitor.js?v=1.28.9-0009101e"></script>
|
|
14
|
+
<script defer src="js/admin.events.js?v=1.28.9-0009101e"></script>
|
|
15
|
+
<script defer src="js/admin.graph.js?v=1.28.9-0009101e"></script>
|
|
16
16
|
<script defer src="js/marked.umd.js"></script>
|
|
17
|
-
<script defer src="js/admin.instructions.js?v=1.28.
|
|
18
|
-
<script defer src="js/admin.logs.js?v=1.28.
|
|
19
|
-
<script defer src="js/admin.maintenance.js?v=1.28.
|
|
20
|
-
<script defer src="js/admin.config.js?v=1.28.
|
|
21
|
-
<script defer src="js/admin.performance.js?v=1.28.
|
|
22
|
-
<script defer src="js/admin.instances.js?v=1.28.
|
|
23
|
-
<script defer src="js/admin.embeddings.js?v=1.28.
|
|
24
|
-
<script defer src="js/admin.messaging.js?v=1.28.
|
|
25
|
-
<script defer src="js/admin.sqlite.js?v=1.28.
|
|
26
|
-
<script defer src="js/admin.boot.js?v=1.28.
|
|
27
|
-
<script defer src="js/admin.feedback.js?v=1.28.
|
|
17
|
+
<script defer src="js/admin.instructions.js?v=1.28.9-0009101e"></script>
|
|
18
|
+
<script defer src="js/admin.logs.js?v=1.28.9-0009101e"></script>
|
|
19
|
+
<script defer src="js/admin.maintenance.js?v=1.28.9-0009101e"></script>
|
|
20
|
+
<script defer src="js/admin.config.js?v=1.28.9-0009101e"></script>
|
|
21
|
+
<script defer src="js/admin.performance.js?v=1.28.9-0009101e"></script>
|
|
22
|
+
<script defer src="js/admin.instances.js?v=1.28.9-0009101e"></script>
|
|
23
|
+
<script defer src="js/admin.embeddings.js?v=1.28.9-0009101e"></script>
|
|
24
|
+
<script defer src="js/admin.messaging.js?v=1.28.9-0009101e"></script>
|
|
25
|
+
<script defer src="js/admin.sqlite.js?v=1.28.9-0009101e"></script>
|
|
26
|
+
<script defer src="js/admin.boot.js?v=1.28.9-0009101e"></script>
|
|
27
|
+
<script defer src="js/admin.feedback.js?v=1.28.9-0009101e"></script>
|
|
28
28
|
</head>
|
|
29
29
|
<body>
|
|
30
30
|
<div class="admin-container admin-root">
|
|
@@ -909,10 +909,10 @@
|
|
|
909
909
|
}
|
|
910
910
|
}
|
|
911
911
|
|
|
912
|
-
// Graph logic was extracted to js/admin.graph.js?v=1.28.
|
|
912
|
+
// Graph logic was extracted to js/admin.graph.js?v=1.28.9-0009101e
|
|
913
913
|
// Functions available globally: reloadGraphMermaid, initGraphScopeDefaults, copyMermaidSource, toggleGraphEdit, applyGraphEdit, cancelGraphEdit, refreshDrillCategories, loadDrillInstructions, clearSelections
|
|
914
914
|
|
|
915
|
-
<!-- overview functions moved to js/admin.overview.js?v=1.28.
|
|
915
|
+
<!-- overview functions moved to js/admin.overview.js?v=1.28.9-0009101e -->
|
|
916
916
|
|
|
917
917
|
// Lightweight overview-level maintenance display (optional)
|
|
918
918
|
// Intentionally minimal to avoid blocking overview rendering.
|
|
@@ -1097,7 +1097,7 @@
|
|
|
1097
1097
|
}
|
|
1098
1098
|
|
|
1099
1099
|
// --- Backup / Restore ---
|
|
1100
|
-
// Extracted to js/admin.maintenance.js?v=1.28.
|
|
1100
|
+
// Extracted to js/admin.maintenance.js?v=1.28.9-0009101e
|
|
1101
1101
|
|
|
1102
1102
|
async function performBackup() {
|
|
1103
1103
|
try {
|
|
@@ -1163,7 +1163,7 @@
|
|
|
1163
1163
|
}
|
|
1164
1164
|
|
|
1165
1165
|
async function loadConfiguration() {
|
|
1166
|
-
// Primary implementation in js/admin.config.js?v=1.28.
|
|
1166
|
+
// Primary implementation in js/admin.config.js?v=1.28.9-0009101e (loaded via defer).
|
|
1167
1167
|
// This inline fallback only fires if the external script failed to load.
|
|
1168
1168
|
if (window.__configExternalLoaded) return;
|
|
1169
1169
|
try {
|
|
@@ -1223,10 +1223,10 @@
|
|
|
1223
1223
|
return false;
|
|
1224
1224
|
}
|
|
1225
1225
|
|
|
1226
|
-
// Monitoring functions moved to js/admin.monitor.js?v=1.28.
|
|
1226
|
+
// Monitoring functions moved to js/admin.monitor.js?v=1.28.9-0009101e
|
|
1227
1227
|
|
|
1228
1228
|
// ===== Log Viewer =====
|
|
1229
|
-
// Extracted to js/admin.logs.js?v=1.28.
|
|
1229
|
+
// Extracted to js/admin.logs.js?v=1.28.9-0009101e
|
|
1230
1230
|
|
|
1231
1231
|
// ===== Instruction Management =====
|
|
1232
1232
|
let instructionEditing = null;
|
|
@@ -1723,7 +1723,7 @@
|
|
|
1723
1723
|
setInterval(fetchResourceTrends, 10000);
|
|
1724
1724
|
})();
|
|
1725
1725
|
|
|
1726
|
-
// Instruction management logic extracted to js/admin.instructions.js?v=1.28.
|
|
1726
|
+
// Instruction management logic extracted to js/admin.instructions.js?v=1.28.9-0009101e
|
|
1727
1727
|
// Functions exposed globally: loadInstructions, renderInstructionList, editInstruction, saveInstruction, deleteInstruction, etc.
|
|
1728
1728
|
|
|
1729
1729
|
function startAutoRefresh() {
|
|
@@ -231,8 +231,8 @@ function buildEnvCatalog(config, paths) {
|
|
|
231
231
|
{ key: 'INDEX_SERVER_MUTATION', desc: 'Enable write operations', active: true, value: config.mutation ? '1' : '0' },
|
|
232
232
|
{ key: 'INDEX_SERVER_ADMIN_API_KEY', desc: 'Dashboard admin API key', active: false, value: '' },
|
|
233
233
|
{ key: 'INDEX_SERVER_DASHBOARD_TLS', desc: 'Enable HTTPS dashboard', active: config.tls, value: config.tls ? '1' : '0' },
|
|
234
|
-
{ key: 'INDEX_SERVER_DASHBOARD_TLS_CERT', desc: 'Path to TLS certificate file', active:
|
|
235
|
-
{ key: 'INDEX_SERVER_DASHBOARD_TLS_KEY', desc: 'Path to TLS private key file', active:
|
|
234
|
+
{ key: 'INDEX_SERVER_DASHBOARD_TLS_CERT', desc: 'Path to TLS certificate file', active: config.tls, value: `${paths.certs}/server.crt` },
|
|
235
|
+
{ key: 'INDEX_SERVER_DASHBOARD_TLS_KEY', desc: 'Path to TLS private key file', active: config.tls, value: `${paths.certs}/server.key` },
|
|
236
236
|
{ key: 'INDEX_SERVER_DASHBOARD_TLS_CA', desc: 'Path to CA certificate', active: false, value: '' },
|
|
237
237
|
{ section: 'Semantic Search - embeddings' },
|
|
238
238
|
{ key: 'INDEX_SERVER_SEMANTIC_ENABLED', desc: 'Enable semantic search', active: isEnhanced, value: isEnhanced ? '1' : '0' },
|
|
@@ -77,8 +77,12 @@ function buildServerEntry(format, config, paths, envOverrides = {}) {
|
|
|
77
77
|
entry.cwd = (0, flagCatalog_1.toForwardSlashes)(launch.cwd);
|
|
78
78
|
if (format === 'vscode-global' && launch.command === 'node') {
|
|
79
79
|
const firstArg = launch.args[0] ?? '';
|
|
80
|
-
|
|
81
|
-
entry.
|
|
80
|
+
const baseCwd = launch.cwd ?? config.root;
|
|
81
|
+
entry.args = [path_1.default.isAbsolute(firstArg) ? (0, flagCatalog_1.toForwardSlashes)(firstArg) : (0, flagCatalog_1.toForwardSlashes)(path_1.default.resolve(baseCwd, firstArg))];
|
|
82
|
+
// Prefer the launch cwd (config.root for 'local' source — a stable user-scope
|
|
83
|
+
// directory). Fall back to package root only when the runtime hasn't been
|
|
84
|
+
// self-deployed under config.root (e.g. 'packaged' source straight out of npm-global).
|
|
85
|
+
entry.cwd = (0, flagCatalog_1.toForwardSlashes)(launch.cwd ?? path_1.default.resolve(__dirname, '..', '..', '..'));
|
|
82
86
|
}
|
|
83
87
|
return entry;
|
|
84
88
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jagilber-org/index-server",
|
|
3
|
-
"version": "1.28.
|
|
3
|
+
"version": "1.28.9",
|
|
4
4
|
"mcpName": "io.github.jagilber-org/index-server",
|
|
5
5
|
"description": "MCP instruction indexing server with search, CRUD, validation, and cross-repo knowledge promotion.",
|
|
6
6
|
"publishConfig": {
|
|
@@ -32,6 +32,18 @@ function writeTextFile(filePath, content) {
|
|
|
32
32
|
fs['write' + 'FileSync'](filePath, content, 'utf8');
|
|
33
33
|
}
|
|
34
34
|
const IS_WINDOWS = process.platform === 'win32';
|
|
35
|
+
|
|
36
|
+
// Default install root for non-repo installs. Lives under the user profile so
|
|
37
|
+
// neither admin/elevated rights nor a cluttered C:\ root are required, and the
|
|
38
|
+
// runtime self-deploys cleanly there (args + cwd resolve under this root).
|
|
39
|
+
function defaultUserRoot() {
|
|
40
|
+
if (IS_WINDOWS) {
|
|
41
|
+
const base = process.env.LOCALAPPDATA || process.env.APPDATA || process.env.USERPROFILE || process.cwd();
|
|
42
|
+
return path.join(base, 'index-server');
|
|
43
|
+
}
|
|
44
|
+
const home = process.env.HOME || process.cwd();
|
|
45
|
+
return path.join(home, '.local', 'share', 'index-server');
|
|
46
|
+
}
|
|
35
47
|
function parsePositiveTimeout(value, fallback) {
|
|
36
48
|
const parsed = Number(value);
|
|
37
49
|
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
@@ -147,6 +159,10 @@ function parseNonInteractiveArgs() {
|
|
|
147
159
|
|
|
148
160
|
const config = {
|
|
149
161
|
profile: 'default',
|
|
162
|
+
// Non-interactive default stays at ROOT (package install dir) so scripted
|
|
163
|
+
// / CI flows that pass no --root don't trigger deployRuntime. Callers who
|
|
164
|
+
// want a user-profile install pass --root explicitly. Interactive flow
|
|
165
|
+
// defaults to defaultUserRoot() instead.
|
|
150
166
|
root: ROOT,
|
|
151
167
|
port: 8787,
|
|
152
168
|
host: '127.0.0.1',
|
|
@@ -188,6 +204,8 @@ function parseNonInteractiveArgs() {
|
|
|
188
204
|
if (config.profile === 'experimental') {
|
|
189
205
|
config.logLevel = 'debug';
|
|
190
206
|
}
|
|
207
|
+
// When certs are generated, TLS must be active so mcp.json env wires cert paths.
|
|
208
|
+
if (config.generateCerts) config.tls = true;
|
|
191
209
|
|
|
192
210
|
return config;
|
|
193
211
|
}
|
|
@@ -214,7 +232,7 @@ async function runInteractiveWizard() {
|
|
|
214
232
|
});
|
|
215
233
|
|
|
216
234
|
// Step 2: Root directory
|
|
217
|
-
const defaultRoot =
|
|
235
|
+
const defaultRoot = defaultUserRoot();
|
|
218
236
|
const root = path.resolve(await input({
|
|
219
237
|
message: 'Base directory (all data paths resolve under this root)',
|
|
220
238
|
default: defaultRoot,
|
|
@@ -294,7 +312,9 @@ async function runInteractiveWizard() {
|
|
|
294
312
|
default: 'repo',
|
|
295
313
|
});
|
|
296
314
|
|
|
297
|
-
|
|
315
|
+
// When certs are generated TLS must be enabled so mcp.json env wires up cert paths.
|
|
316
|
+
const tls = generateCerts || profile === 'enhanced' || profile === 'experimental';
|
|
317
|
+
return { profile, root, serverName, port, host, tls, mutation, logLevel, generateCerts, targets, scope, write: true, preview: true, deploy: true };
|
|
298
318
|
}
|
|
299
319
|
|
|
300
320
|
// --------------------------------------------------------------------------
|
|
@@ -628,6 +648,12 @@ Non-interactive mode:
|
|
|
628
648
|
console.log(`\n✅ .env written to: ${envPath}`);
|
|
629
649
|
}
|
|
630
650
|
|
|
651
|
+
// ── Deploy runtime BEFORE config generation ─────────────────────────
|
|
652
|
+
// resolveServerLaunch picks 'local' source (cwd = config.root) only when
|
|
653
|
+
// <config.root>/dist/server/index-server.js exists. Deploy first so configs
|
|
654
|
+
// are emitted with stable user-data-root paths instead of npm-global paths.
|
|
655
|
+
await deployRuntime(config);
|
|
656
|
+
|
|
631
657
|
// ── Multi-target config generation ──────────────────────────────────
|
|
632
658
|
const configTargets = resolveConfigPaths(config);
|
|
633
659
|
|
|
@@ -636,6 +662,23 @@ Non-interactive mode:
|
|
|
636
662
|
previewConfigs(configTargets, config);
|
|
637
663
|
}
|
|
638
664
|
|
|
665
|
+
// ── Generate TLS certs BEFORE writing configs so cert paths exist
|
|
666
|
+
// and the user sees a consistent flow (certs → config wired to them).
|
|
667
|
+
if (config.generateCerts) {
|
|
668
|
+
console.log('\n🔐 Generating TLS certificates...');
|
|
669
|
+
try {
|
|
670
|
+
const certDir = path.join(config.root, 'certs');
|
|
671
|
+
execFileSync(
|
|
672
|
+
process.execPath,
|
|
673
|
+
[path.join(ROOT, 'scripts', 'build', 'generate-certs.mjs'), '--hostname', 'localhost', '--output', certDir],
|
|
674
|
+
{ stdio: 'inherit' }
|
|
675
|
+
);
|
|
676
|
+
} catch {
|
|
677
|
+
console.error('❌ Certificate generation failed. Run manually:');
|
|
678
|
+
console.error(` node scripts/build/generate-certs.mjs --output "${path.join(config.root, 'certs')}"`);
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
|
|
639
682
|
// Write to real files or sidecar
|
|
640
683
|
if (config.write) {
|
|
641
684
|
console.log('📁 Writing configuration files...\n');
|
|
@@ -668,25 +711,6 @@ Non-interactive mode:
|
|
|
668
711
|
}
|
|
669
712
|
}
|
|
670
713
|
|
|
671
|
-
// ── Deploy runtime if target root differs from package root ─────────
|
|
672
|
-
await deployRuntime(config);
|
|
673
|
-
|
|
674
|
-
// ── Generate TLS certs ──────────────────────────────────────────────
|
|
675
|
-
if (config.generateCerts) {
|
|
676
|
-
console.log('\n🔐 Generating TLS certificates...');
|
|
677
|
-
try {
|
|
678
|
-
const certDir = path.join(config.root, 'certs');
|
|
679
|
-
execFileSync(
|
|
680
|
-
process.execPath,
|
|
681
|
-
[path.join(ROOT, 'scripts', 'build', 'generate-certs.mjs'), '--hostname', 'localhost', '--output', certDir],
|
|
682
|
-
{ stdio: 'inherit' }
|
|
683
|
-
);
|
|
684
|
-
} catch {
|
|
685
|
-
console.error('❌ Certificate generation failed. Run manually:');
|
|
686
|
-
console.error(` node scripts/build/generate-certs.mjs --output "${path.join(config.root, 'certs')}"`);
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
|
|
690
714
|
// ── Next steps ──────────────────────────────────────────────────────
|
|
691
715
|
const proto = (config.profile === 'enhanced' || config.profile === 'experimental') ? 'https' : 'http';
|
|
692
716
|
const launch = resolveServerLaunch(config);
|
|
@@ -724,6 +748,13 @@ Non-interactive mode:
|
|
|
724
748
|
console.log(` ${proto}://localhost:${config.port}\n`);
|
|
725
749
|
step++;
|
|
726
750
|
|
|
751
|
+
if (config.tls && config.generateCerts) {
|
|
752
|
+
console.log(` ${step}. TLS certificates wired into your MCP config:`);
|
|
753
|
+
console.log(` INDEX_SERVER_DASHBOARD_TLS_CERT = ${fwd(path.join(config.root, 'certs', 'server.crt'))}`);
|
|
754
|
+
console.log(` INDEX_SERVER_DASHBOARD_TLS_KEY = ${fwd(path.join(config.root, 'certs', 'server.key'))}\n`);
|
|
755
|
+
step++;
|
|
756
|
+
}
|
|
757
|
+
|
|
727
758
|
if (config.profile === 'enhanced' || config.profile === 'experimental') {
|
|
728
759
|
console.log(` ${step}. First-time semantic search:`);
|
|
729
760
|
console.log(' The MiniLM model (~90MB) will download on first query.');
|
package/server.json
CHANGED
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/jagilber-org/index-server",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "1.28.
|
|
9
|
+
"version": "1.28.9",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "@jagilber-org/index-server",
|
|
14
|
-
"version": "1.28.
|
|
14
|
+
"version": "1.28.9",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
}
|