codesift-mcp 0.12.0 → 0.14.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 +44 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +49 -3
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +25 -2
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/hooks/pre-tool-use.d.ts +1 -0
- package/dist/cli/hooks/pre-tool-use.d.ts.map +1 -1
- package/dist/cli/hooks/pre-tool-use.js +11 -2
- package/dist/cli/hooks/pre-tool-use.js.map +1 -1
- package/dist/cli/owner-only-file.d.ts +51 -0
- package/dist/cli/owner-only-file.d.ts.map +1 -0
- package/dist/cli/owner-only-file.js +121 -0
- package/dist/cli/owner-only-file.js.map +1 -0
- package/dist/cli/service.d.ts +17 -1
- package/dist/cli/service.d.ts.map +1 -1
- package/dist/cli/service.js +28 -12
- package/dist/cli/service.js.map +1 -1
- package/dist/cli/setup/codex.d.ts.map +1 -1
- package/dist/cli/setup/codex.js +14 -7
- package/dist/cli/setup/codex.js.map +1 -1
- package/dist/cli/setup/fs.d.ts +12 -0
- package/dist/cli/setup/fs.d.ts.map +1 -1
- package/dist/cli/setup/fs.js +17 -2
- package/dist/cli/setup/fs.js.map +1 -1
- package/dist/cli/setup/mcp.d.ts +14 -1
- package/dist/cli/setup/mcp.d.ts.map +1 -1
- package/dist/cli/setup/mcp.js +55 -5
- package/dist/cli/setup/mcp.js.map +1 -1
- package/dist/cli/setup/types.d.ts +19 -0
- package/dist/cli/setup/types.d.ts.map +1 -1
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +21 -0
- package/dist/config.js.map +1 -1
- package/dist/formatters-core.d.ts +7 -0
- package/dist/formatters-core.d.ts.map +1 -1
- package/dist/formatters-core.js +14 -3
- package/dist/formatters-core.js.map +1 -1
- package/dist/parser/extractors/hono-inline-analyzer.js +2 -2
- package/dist/parser/extractors/hono-inline-analyzer.js.map +1 -1
- package/dist/register-tool-groups/core/search.d.ts.map +1 -1
- package/dist/register-tool-groups/core/search.js +14 -0
- package/dist/register-tool-groups/core/search.js.map +1 -1
- package/dist/register-tool-groups/core/symbols.d.ts.map +1 -1
- package/dist/register-tool-groups/core/symbols.js +50 -5
- package/dist/register-tool-groups/core/symbols.js.map +1 -1
- package/dist/register-tools/runtime.d.ts +15 -6
- package/dist/register-tools/runtime.d.ts.map +1 -1
- package/dist/register-tools/runtime.js +30 -12
- package/dist/register-tools/runtime.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +96 -11
- package/dist/server.js.map +1 -1
- package/dist/storage/_shared.d.ts +21 -0
- package/dist/storage/_shared.d.ts.map +1 -1
- package/dist/storage/_shared.js +36 -0
- package/dist/storage/_shared.js.map +1 -1
- package/dist/storage/embedding-store.d.ts +12 -1
- package/dist/storage/embedding-store.d.ts.map +1 -1
- package/dist/storage/embedding-store.js +42 -2
- package/dist/storage/embedding-store.js.map +1 -1
- package/dist/storage/index-footprint.d.ts +12 -0
- package/dist/storage/index-footprint.d.ts.map +1 -0
- package/dist/storage/index-footprint.js +41 -0
- package/dist/storage/index-footprint.js.map +1 -0
- package/dist/storage/index-store.d.ts +61 -3
- package/dist/storage/index-store.d.ts.map +1 -1
- package/dist/storage/index-store.js +409 -13
- package/dist/storage/index-store.js.map +1 -1
- package/dist/storage/registry.d.ts.map +1 -1
- package/dist/storage/registry.js +64 -1
- package/dist/storage/registry.js.map +1 -1
- package/dist/storage/shared-embedding-cache.d.ts +29 -0
- package/dist/storage/shared-embedding-cache.d.ts.map +1 -0
- package/dist/storage/shared-embedding-cache.js +120 -0
- package/dist/storage/shared-embedding-cache.js.map +1 -0
- package/dist/storage/sqlite/accessors.d.ts +34 -0
- package/dist/storage/sqlite/accessors.d.ts.map +1 -0
- package/dist/storage/sqlite/accessors.js +178 -0
- package/dist/storage/sqlite/accessors.js.map +1 -0
- package/dist/storage/sqlite/connection.d.ts +43 -0
- package/dist/storage/sqlite/connection.d.ts.map +1 -0
- package/dist/storage/sqlite/connection.js +241 -0
- package/dist/storage/sqlite/connection.js.map +1 -0
- package/dist/storage/sqlite/errors.d.ts +38 -0
- package/dist/storage/sqlite/errors.d.ts.map +1 -0
- package/dist/storage/sqlite/errors.js +150 -0
- package/dist/storage/sqlite/errors.js.map +1 -0
- package/dist/storage/sqlite/index-io.d.ts +49 -0
- package/dist/storage/sqlite/index-io.d.ts.map +1 -0
- package/dist/storage/sqlite/index-io.js +268 -0
- package/dist/storage/sqlite/index-io.js.map +1 -0
- package/dist/storage/sqlite/meta.d.ts +41 -0
- package/dist/storage/sqlite/meta.d.ts.map +1 -0
- package/dist/storage/sqlite/meta.js +28 -0
- package/dist/storage/sqlite/meta.js.map +1 -0
- package/dist/storage/sqlite/rows.d.ts +64 -0
- package/dist/storage/sqlite/rows.d.ts.map +1 -0
- package/dist/storage/sqlite/rows.js +186 -0
- package/dist/storage/sqlite/rows.js.map +1 -0
- package/dist/storage/sqlite/runtime.d.ts +6 -0
- package/dist/storage/sqlite/runtime.d.ts.map +1 -0
- package/dist/storage/sqlite/runtime.js +31 -0
- package/dist/storage/sqlite/runtime.js.map +1 -0
- package/dist/storage/sqlite/schema.d.ts +34 -0
- package/dist/storage/sqlite/schema.d.ts.map +1 -0
- package/dist/storage/sqlite/schema.js +98 -0
- package/dist/storage/sqlite/schema.js.map +1 -0
- package/dist/storage/sqlite-index-store.d.ts +49 -0
- package/dist/storage/sqlite-index-store.d.ts.map +1 -0
- package/dist/storage/sqlite-index-store.js +48 -0
- package/dist/storage/sqlite-index-store.js.map +1 -0
- package/dist/storage/telemetry/config.d.ts.map +1 -1
- package/dist/storage/telemetry/config.js +14 -3
- package/dist/storage/telemetry/config.js.map +1 -1
- package/dist/storage/telemetry/payload.d.ts.map +1 -1
- package/dist/storage/telemetry/payload.js +4 -1
- package/dist/storage/telemetry/payload.js.map +1 -1
- package/dist/storage/telemetry/retro-aggregator.d.ts +27 -0
- package/dist/storage/telemetry/retro-aggregator.d.ts.map +1 -0
- package/dist/storage/telemetry/retro-aggregator.js +179 -0
- package/dist/storage/telemetry/retro-aggregator.js.map +1 -0
- package/dist/storage/telemetry/sanitizer.d.ts +30 -0
- package/dist/storage/telemetry/sanitizer.d.ts.map +1 -1
- package/dist/storage/telemetry/sanitizer.js +23 -0
- package/dist/storage/telemetry/sanitizer.js.map +1 -1
- package/dist/storage/telemetry/uploader.d.ts.map +1 -1
- package/dist/storage/telemetry/uploader.js +6 -0
- package/dist/storage/telemetry/uploader.js.map +1 -1
- package/dist/storage/workspace-resolver.js +1 -1
- package/dist/storage/workspace-resolver.js.map +1 -1
- package/dist/tools/index-tools/file-indexer.js +19 -19
- package/dist/tools/index-tools/file-indexer.js.map +1 -1
- package/dist/tools/index-tools/folder-indexer.d.ts.map +1 -1
- package/dist/tools/index-tools/folder-indexer.js +4 -1
- package/dist/tools/index-tools/folder-indexer.js.map +1 -1
- package/dist/tools/index-tools/parse.d.ts.map +1 -1
- package/dist/tools/index-tools/parse.js +4 -1
- package/dist/tools/index-tools/parse.js.map +1 -1
- package/dist/tools/index-tools/registry.d.ts +16 -0
- package/dist/tools/index-tools/registry.d.ts.map +1 -1
- package/dist/tools/index-tools/registry.js +95 -1
- package/dist/tools/index-tools/registry.js.map +1 -1
- package/dist/tools/index-tools.d.ts +2 -2
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +2 -2
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/plan-turn/stale-index.d.ts +32 -0
- package/dist/tools/plan-turn/stale-index.d.ts.map +1 -1
- package/dist/tools/plan-turn/stale-index.js +42 -5
- package/dist/tools/plan-turn/stale-index.js.map +1 -1
- package/dist/tools/search-tools/types.d.ts +20 -0
- package/dist/tools/search-tools/types.d.ts.map +1 -1
- package/dist/tools/search-tools/zero-hit.d.ts.map +1 -1
- package/dist/tools/search-tools/zero-hit.js +0 -0
- package/dist/tools/search-tools/zero-hit.js.map +1 -1
- package/dist/tools/status-tools.d.ts +20 -0
- package/dist/tools/status-tools.d.ts.map +1 -1
- package/dist/tools/status-tools.js +69 -18
- package/dist/tools/status-tools.js.map +1 -1
- package/dist/tools/symbol-tools.d.ts +95 -1
- package/dist/tools/symbol-tools.d.ts.map +1 -1
- package/dist/tools/symbol-tools.js +182 -26
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/tools/workspace-scope-helper.d.ts.map +1 -1
- package/dist/tools/workspace-scope-helper.js +8 -1
- package/dist/tools/workspace-scope-helper.js.map +1 -1
- package/dist/tools/workspace-tools.d.ts.map +1 -1
- package/dist/tools/workspace-tools.js +9 -1
- package/dist/tools/workspace-tools.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/git-head.d.ts +12 -0
- package/dist/utils/git-head.d.ts.map +1 -1
- package/dist/utils/git-head.js +25 -0
- package/dist/utils/git-head.js.map +1 -1
- package/dist/utils/loopback.d.ts +23 -0
- package/dist/utils/loopback.d.ts.map +1 -0
- package/dist/utils/loopback.js +71 -0
- package/dist/utils/loopback.js.map +1 -0
- package/package.json +6 -4
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { existsSync, chmodSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { chmod, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
/**
|
|
4
|
+
* Writing a file that may embed a CodeSift daemon bearer token, restricted to
|
|
5
|
+
* its owner — and failing loudly when that cannot be done.
|
|
6
|
+
*
|
|
7
|
+
* The shared-daemon feature exists for shared hosts, so a config left at the
|
|
8
|
+
* default umask (commonly 0644) hands every other local account a credential
|
|
9
|
+
* that grants read access to every repository that daemon has indexed.
|
|
10
|
+
*
|
|
11
|
+
* Two things make this harder than passing `mode` to writeFile:
|
|
12
|
+
*
|
|
13
|
+
* - open(2) applies `mode` only when it CREATES the file. A config written by
|
|
14
|
+
* an older version keeps its 0644 until something chmods it, so the rewrite
|
|
15
|
+
* path needs an explicit chmod — and it has to happen BEFORE the new token is
|
|
16
|
+
* written, not after, or the secret sits on disk readable by everyone for the
|
|
17
|
+
* length of the write.
|
|
18
|
+
* - A failed chmod used to be swallowed whole (`.catch(() => {})`) under the
|
|
19
|
+
* comment "a filesystem without POSIX modes must not fail the setup". That
|
|
20
|
+
* comment describes one errno; the catch covered every errno, so "I could not
|
|
21
|
+
* restrict this file" was indistinguishable from success. Observed while
|
|
22
|
+
* installing the daemon on burst-i9: the systemd unit holding
|
|
23
|
+
* CODESIFT_HTTP_TOKEN was left at -rw-r--r--, readable by the CI user, and
|
|
24
|
+
* the install reported OK.
|
|
25
|
+
*
|
|
26
|
+
* So the rule is narrow rather than best-effort: tolerate the errnos that mean
|
|
27
|
+
* this filesystem has no permission bits at all, and for anything else look at
|
|
28
|
+
* what the mode actually IS. Already owner-only means the chmod was redundant
|
|
29
|
+
* and its failure harmless; anything group- or world-accessible is a real
|
|
30
|
+
* exposure of a real credential, and setup must say so instead of returning.
|
|
31
|
+
*/
|
|
32
|
+
/** Owner read/write only. */
|
|
33
|
+
export const OWNER_ONLY_MODE = 0o600;
|
|
34
|
+
/**
|
|
35
|
+
* chmod(2) errnos that mean the filesystem does not implement permission bits
|
|
36
|
+
* (FAT/exFAT mounts, some network and container filesystems). On such a
|
|
37
|
+
* filesystem no mode is enforceable, so there is nothing to warn about.
|
|
38
|
+
*/
|
|
39
|
+
const NO_MODE_SUPPORT = new Set(["ENOSYS", "ENOTSUP", "EOPNOTSUPP"]);
|
|
40
|
+
/**
|
|
41
|
+
* Whether a chmod failure can be ignored.
|
|
42
|
+
*
|
|
43
|
+
* `mode` is the file's ACTUAL mode afterwards, or null when it could not be
|
|
44
|
+
* read — an unreadable mode is treated as unsafe, since the alternative is
|
|
45
|
+
* assuming the best about a credential file.
|
|
46
|
+
*/
|
|
47
|
+
export function chmodFailureIsTolerable(code, mode) {
|
|
48
|
+
if (NO_MODE_SUPPORT.has(code))
|
|
49
|
+
return true;
|
|
50
|
+
return mode !== null && (mode & 0o077) === 0;
|
|
51
|
+
}
|
|
52
|
+
function exposureError(path, code, mode) {
|
|
53
|
+
const actual = mode === null ? "unknown" : "0" + (mode & 0o777).toString(8);
|
|
54
|
+
return new Error(`Could not restrict ${path} to its owner (chmod: ${code}; mode is ${actual}). `
|
|
55
|
+
+ "This file can carry a CodeSift daemon token, which grants read access to every "
|
|
56
|
+
+ "repository that daemon has indexed, so leaving it readable by other accounts on "
|
|
57
|
+
+ `this machine is not something setup can report as success. Run \`chmod 600 ${path}\` `
|
|
58
|
+
+ "(or fix its ownership) and try again.");
|
|
59
|
+
}
|
|
60
|
+
function errnoOf(err) {
|
|
61
|
+
return err?.code ?? "unknown";
|
|
62
|
+
}
|
|
63
|
+
/** Restrict an existing path; no-op when it does not exist yet. */
|
|
64
|
+
async function restrict(path) {
|
|
65
|
+
if (!existsSync(path))
|
|
66
|
+
return;
|
|
67
|
+
try {
|
|
68
|
+
await chmod(path, OWNER_ONLY_MODE);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
let mode = null;
|
|
72
|
+
try {
|
|
73
|
+
mode = (await stat(path)).mode & 0o777;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Unreadable mode — handled as unsafe below.
|
|
77
|
+
}
|
|
78
|
+
const code = errnoOf(err);
|
|
79
|
+
if (!chmodFailureIsTolerable(code, mode))
|
|
80
|
+
throw exposureError(path, code, mode);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function restrictSync(path) {
|
|
84
|
+
if (!existsSync(path))
|
|
85
|
+
return;
|
|
86
|
+
try {
|
|
87
|
+
chmodSync(path, OWNER_ONLY_MODE);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
let mode = null;
|
|
91
|
+
try {
|
|
92
|
+
mode = statSync(path).mode & 0o777;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Unreadable mode — handled as unsafe below.
|
|
96
|
+
}
|
|
97
|
+
const code = errnoOf(err);
|
|
98
|
+
if (!chmodFailureIsTolerable(code, mode))
|
|
99
|
+
throw exposureError(path, code, mode);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Write `content` to `path` so that only its owner can read it.
|
|
104
|
+
*
|
|
105
|
+
* Throws rather than writing a token to a file it could not secure. The
|
|
106
|
+
* pre-write restrict is what keeps that promise for a file that already exists:
|
|
107
|
+
* by the time the new content lands, the mode is already correct or we never
|
|
108
|
+
* got here.
|
|
109
|
+
*/
|
|
110
|
+
export async function writeOwnerOnlyFile(path, content) {
|
|
111
|
+
await restrict(path);
|
|
112
|
+
await writeFile(path, content, { encoding: "utf-8", mode: OWNER_ONLY_MODE });
|
|
113
|
+
await restrict(path);
|
|
114
|
+
}
|
|
115
|
+
/** Synchronous twin, for install paths that are sync end to end. */
|
|
116
|
+
export function writeOwnerOnlyFileSync(path, content) {
|
|
117
|
+
restrictSync(path);
|
|
118
|
+
writeFileSync(path, content, { encoding: "utf-8", mode: OWNER_ONLY_MODE });
|
|
119
|
+
restrictSync(path);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=owner-only-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-only-file.js","sourceRoot":"","sources":["../../src/cli/owner-only-file.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/service.d.ts
CHANGED
|
@@ -30,6 +30,18 @@ export interface ServicePlan {
|
|
|
30
30
|
label: string;
|
|
31
31
|
port: number;
|
|
32
32
|
host: string;
|
|
33
|
+
/** Bearer token required for a routable bind; absent for loopback. */
|
|
34
|
+
token?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Extra CODESIFT_* variables baked into the unit.
|
|
37
|
+
*
|
|
38
|
+
* launchd and systemd give a service almost no environment, so anything the
|
|
39
|
+
* daemon needs has to be written into the unit. The embedding provider is the
|
|
40
|
+
* case that forced this: without it the daemon silently falls back to the
|
|
41
|
+
* bundled ONNX runtime and burns the host's CPU, which is exactly what a
|
|
42
|
+
* shared daemon is supposed to stop.
|
|
43
|
+
*/
|
|
44
|
+
env?: Record<string, string>;
|
|
33
45
|
/** Absolute path to the node binary that will run the daemon. */
|
|
34
46
|
execPath: string;
|
|
35
47
|
/** Absolute path to the codesift CLI entry point. */
|
|
@@ -50,12 +62,14 @@ export declare function escapeXml(value: string): string;
|
|
|
50
62
|
* user's entire source tree — and their indexed conversation history — to
|
|
51
63
|
* anything that can reach the port. There is no authentication by default.
|
|
52
64
|
*/
|
|
53
|
-
export
|
|
65
|
+
export { isLoopbackHost } from "../utils/loopback.js";
|
|
54
66
|
/** Resolve the CLI entry point for the currently running codesift install. */
|
|
55
67
|
export declare function resolveCliPath(): string;
|
|
56
68
|
export declare function buildServicePlan(opts: {
|
|
57
69
|
port?: number;
|
|
58
70
|
host?: string;
|
|
71
|
+
token?: string;
|
|
72
|
+
env?: Record<string, string>;
|
|
59
73
|
dataDir: string;
|
|
60
74
|
execPath?: string;
|
|
61
75
|
cliPath?: string;
|
|
@@ -95,6 +109,8 @@ export declare function installService(opts: {
|
|
|
95
109
|
port?: number;
|
|
96
110
|
host?: string;
|
|
97
111
|
dataDir: string;
|
|
112
|
+
token?: string;
|
|
113
|
+
env?: Record<string, string>;
|
|
98
114
|
force?: boolean;
|
|
99
115
|
os?: NodeJS.Platform;
|
|
100
116
|
home?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/cli/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/cli/service.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/service.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { mkdirSync,
|
|
1
|
+
import { mkdirSync, readFileSync, existsSync, unlinkSync } from "node:fs";
|
|
2
2
|
import { homedir, platform } from "node:os";
|
|
3
3
|
import { join, dirname } from "node:path";
|
|
4
|
+
import { isLoopbackHost } from "../utils/loopback.js";
|
|
5
|
+
import { writeOwnerOnlyFileSync } from "./owner-only-file.js";
|
|
4
6
|
import { fileURLToPath } from "node:url";
|
|
5
7
|
import { execFileSync } from "node:child_process";
|
|
6
8
|
/**
|
|
@@ -55,10 +57,7 @@ export function escapeXml(value) {
|
|
|
55
57
|
* user's entire source tree — and their indexed conversation history — to
|
|
56
58
|
* anything that can reach the port. There is no authentication by default.
|
|
57
59
|
*/
|
|
58
|
-
export
|
|
59
|
-
const h = host.trim().toLowerCase().replace(/^\[|\]$/g, "");
|
|
60
|
-
return h === "127.0.0.1" || h === "localhost" || h === "::1";
|
|
61
|
-
}
|
|
60
|
+
export { isLoopbackHost } from "../utils/loopback.js";
|
|
62
61
|
/** Resolve the CLI entry point for the currently running codesift install. */
|
|
63
62
|
export function resolveCliPath() {
|
|
64
63
|
// dist/cli/service.js -> dist/cli.js
|
|
@@ -77,6 +76,8 @@ export function buildServicePlan(opts) {
|
|
|
77
76
|
label: SERVICE_LABEL,
|
|
78
77
|
port,
|
|
79
78
|
host,
|
|
79
|
+
...(opts.token ? { token: opts.token } : {}),
|
|
80
|
+
...(opts.env ? { env: opts.env } : {}),
|
|
80
81
|
execPath: opts.execPath ?? process.execPath,
|
|
81
82
|
cliPath: opts.cliPath ?? resolveCliPath(),
|
|
82
83
|
unitPath,
|
|
@@ -126,7 +127,11 @@ ${argLines}
|
|
|
126
127
|
<key>PATH</key>
|
|
127
128
|
<string>${escapeXml(SERVICE_PATH_ENTRIES.join(":"))}</string>
|
|
128
129
|
<key>CODESIFT_DATA_DIR</key>
|
|
129
|
-
<string>${escapeXml(plan.dataDir)}</string
|
|
130
|
+
<string>${escapeXml(plan.dataDir)}</string>${Object.entries(plan.env ?? {})
|
|
131
|
+
.map(([k, v]) => `\n <key>${escapeXml(k)}</key>\n <string>${escapeXml(v)}</string>`)
|
|
132
|
+
.join("")}${plan.token ? `
|
|
133
|
+
<key>CODESIFT_HTTP_TOKEN</key>
|
|
134
|
+
<string>${escapeXml(plan.token)}</string>` : ""}
|
|
130
135
|
</dict>
|
|
131
136
|
<key>StandardOutPath</key>
|
|
132
137
|
<string>${escapeXml(plan.stdoutLog)}</string>
|
|
@@ -152,7 +157,9 @@ ExecStart=${exec}
|
|
|
152
157
|
Restart=always
|
|
153
158
|
RestartSec=10
|
|
154
159
|
Environment=PATH=${SERVICE_PATH_ENTRIES.join(":")}
|
|
155
|
-
Environment=CODESIFT_DATA_DIR=${plan.dataDir}
|
|
160
|
+
Environment=CODESIFT_DATA_DIR=${plan.dataDir}${Object.entries(plan.env ?? {})
|
|
161
|
+
.map(([k, v]) => `\nEnvironment=${k}=${v}`)
|
|
162
|
+
.join("")}${plan.token ? `\nEnvironment=CODESIFT_HTTP_TOKEN=${plan.token}` : ""}
|
|
156
163
|
StandardOutput=append:${plan.stdoutLog}
|
|
157
164
|
StandardError=append:${plan.stderrLog}
|
|
158
165
|
|
|
@@ -199,10 +206,14 @@ export function installService(opts) {
|
|
|
199
206
|
};
|
|
200
207
|
}
|
|
201
208
|
const plan = buildServicePlan({ ...opts, ...(opts.os ? { os: opts.os } : {}) });
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
209
|
+
// Same rule as the server itself: a routable bind is allowed only with a
|
|
210
|
+
// token, because the token is what turns "publishes every indexed repository"
|
|
211
|
+
// into "serves authenticated callers". Serving several machines from one host
|
|
212
|
+
// is the point of stateless serving; doing it unauthenticated is not.
|
|
213
|
+
if (!isLoopbackHost(plan.host) && !opts.token) {
|
|
214
|
+
throw new Error(`refusing to install a service bound to ${plan.host} without a token: the daemon serves `
|
|
215
|
+
+ `every indexed repository, so an unauthenticated non-loopback bind publishes your `
|
|
216
|
+
+ `source tree. Pass --token (stored in the unit's environment) or use 127.0.0.1.`);
|
|
206
217
|
}
|
|
207
218
|
if (existsSync(plan.unitPath) && opts.force !== true) {
|
|
208
219
|
return {
|
|
@@ -215,7 +226,12 @@ export function installService(opts) {
|
|
|
215
226
|
}
|
|
216
227
|
mkdirSync(dirname(plan.unitPath), { recursive: true });
|
|
217
228
|
mkdirSync(join(plan.dataDir, "logs"), { recursive: true });
|
|
218
|
-
|
|
229
|
+
// 0600: the rendered unit embeds CODESIFT_HTTP_TOKEN, and a service file is
|
|
230
|
+
// world-readable by default — on the shared host this feature exists for, that
|
|
231
|
+
// hands the daemon credential to every other local account. Raises instead of
|
|
232
|
+
// installing a unit whose permissions it could not set; this is the exact file
|
|
233
|
+
// that was found at -rw-r--r-- on burst-i9.
|
|
234
|
+
writeOwnerOnlyFileSync(plan.unitPath, renderUnit(plan, os));
|
|
219
235
|
let activated = false;
|
|
220
236
|
let note;
|
|
221
237
|
if (os === "darwin") {
|
package/dist/cli/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/cli/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/cli/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/codex.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK5D,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAUtC;AAED,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA8BvC;
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/codex.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK5D,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAUtC;AAED,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA8BvC;AA4HD,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA+B7E;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAerD"}
|
package/dist/cli/setup/codex.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { readFile
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
import { ensureDir, writeJsonFile } from "./fs.js";
|
|
6
|
-
import { daemonHttpUrl, resolveMcpServerEntry } from "./mcp.js";
|
|
5
|
+
import { ensureDir, writeJsonFile, writeSecretFile } from "./fs.js";
|
|
6
|
+
import { daemonHttpUrl, resolveMcpServerEntry, assertTokenTransportIsSafe } from "./mcp.js";
|
|
7
7
|
import { hasCodesiftHook, loadHooksSection } from "./hooks.js";
|
|
8
8
|
export function stripCodesiftToolApprovalOverrides(content) {
|
|
9
9
|
const expression = /\[mcp_servers\.codesift\.tools\.[^\]]+\][\t ]*\r?\napproval_mode[\t ]*=[\t ]*"[^"]*"[\t ]*\r?\n?/g;
|
|
@@ -73,7 +73,14 @@ function jsonString(value) {
|
|
|
73
73
|
}
|
|
74
74
|
function getCodexServerEntryLines(options) {
|
|
75
75
|
if (options?.http) {
|
|
76
|
-
|
|
76
|
+
// Same guard as the JSON path: a token on a plaintext non-loopback URL is refused.
|
|
77
|
+
assertTokenTransportIsSafe(options);
|
|
78
|
+
const lines = ["url = " + jsonString(daemonHttpUrl(options.port, options.cwd, options.host, options.scheme))];
|
|
79
|
+
if (options.token) {
|
|
80
|
+
lines.push("[mcp_servers.codesift.http_headers]");
|
|
81
|
+
lines.push("Authorization = " + jsonString(`Bearer ${options.token}`));
|
|
82
|
+
}
|
|
83
|
+
return lines.join("\n");
|
|
77
84
|
}
|
|
78
85
|
const entry = resolveMcpServerEntry();
|
|
79
86
|
return ("command = " +
|
|
@@ -140,7 +147,7 @@ export async function setupCodex(options) {
|
|
|
140
147
|
const configPath = join(configDir, "config.toml");
|
|
141
148
|
await ensureDir(configDir);
|
|
142
149
|
if (!existsSync(configPath)) {
|
|
143
|
-
await
|
|
150
|
+
await writeSecretFile(configPath, getCodexTomlBlock(options).trimStart());
|
|
144
151
|
return { platform: "codex", config_path: configPath, status: "created" };
|
|
145
152
|
}
|
|
146
153
|
const original = await readFile(configPath, "utf-8");
|
|
@@ -154,12 +161,12 @@ export async function setupCodex(options) {
|
|
|
154
161
|
: {};
|
|
155
162
|
if (content.includes("[mcp_servers.codesift]")) {
|
|
156
163
|
if (removed > 0 || normalized.changed || normalizedEntry.changed || required.changed) {
|
|
157
|
-
await
|
|
164
|
+
await writeSecretFile(configPath, content);
|
|
158
165
|
return { platform: "codex", config_path: configPath, status: "updated", ...noteFields };
|
|
159
166
|
}
|
|
160
167
|
return { platform: "codex", config_path: configPath, status: "already_configured" };
|
|
161
168
|
}
|
|
162
|
-
await
|
|
169
|
+
await writeSecretFile(configPath, content.trimEnd() + "\n" + getCodexTomlBlock(options));
|
|
163
170
|
return { platform: "codex", config_path: configPath, status: "updated", ...noteFields };
|
|
164
171
|
}
|
|
165
172
|
export async function setupCodexHooks() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli/setup/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli/setup/codex.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/setup/fs.d.ts
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
export declare function ensureDir(dir: string): Promise<void>;
|
|
2
2
|
export declare function readJsonFile(path: string): Promise<Record<string, unknown>>;
|
|
3
|
+
/**
|
|
4
|
+
* Owner-only. These files can carry a daemon bearer token, and the whole point of the
|
|
5
|
+
* shared-daemon feature is that the host is shared — so the default umask (commonly 0644,
|
|
6
|
+
* group- and world-readable) hands every other local account a credential that grants
|
|
7
|
+
* read access to every indexed repository on that daemon.
|
|
8
|
+
*
|
|
9
|
+
* The mode is enforced by `owner-only-file.ts`, which also decides what to do when it
|
|
10
|
+
* cannot be enforced — see the header there for why that is not best-effort.
|
|
11
|
+
*/
|
|
12
|
+
export declare const SECRET_FILE_MODE = 384;
|
|
13
|
+
/** Write a text config that may embed a bearer token, owner-readable only. */
|
|
14
|
+
export declare function writeSecretFile(path: string, content: string): Promise<void>;
|
|
3
15
|
export declare function writeJsonFile(path: string, data: Record<string, unknown>): Promise<void>;
|
|
4
16
|
export declare function resolvePackageFile(relativePath: string): string;
|
|
5
17
|
export declare function sha256(content: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/fs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/fs.ts"],"names":[],"mappings":"AAOA,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAgBjF;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,MAAkB,CAAC;AAEhD,8EAA8E;AAC9E,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElF;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9F;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAS/D;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9C"}
|
package/dist/cli/setup/fs.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
|
-
import { mkdir, readFile
|
|
3
|
+
import { mkdir, readFile } from "node:fs/promises";
|
|
4
4
|
import { dirname, join } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { OWNER_ONLY_MODE, writeOwnerOnlyFile } from "../owner-only-file.js";
|
|
6
7
|
export async function ensureDir(dir) {
|
|
7
8
|
if (!existsSync(dir)) {
|
|
8
9
|
await mkdir(dir, { recursive: true });
|
|
@@ -25,8 +26,22 @@ export async function readJsonFile(path) {
|
|
|
25
26
|
}
|
|
26
27
|
return parsed;
|
|
27
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Owner-only. These files can carry a daemon bearer token, and the whole point of the
|
|
31
|
+
* shared-daemon feature is that the host is shared — so the default umask (commonly 0644,
|
|
32
|
+
* group- and world-readable) hands every other local account a credential that grants
|
|
33
|
+
* read access to every indexed repository on that daemon.
|
|
34
|
+
*
|
|
35
|
+
* The mode is enforced by `owner-only-file.ts`, which also decides what to do when it
|
|
36
|
+
* cannot be enforced — see the header there for why that is not best-effort.
|
|
37
|
+
*/
|
|
38
|
+
export const SECRET_FILE_MODE = OWNER_ONLY_MODE;
|
|
39
|
+
/** Write a text config that may embed a bearer token, owner-readable only. */
|
|
40
|
+
export async function writeSecretFile(path, content) {
|
|
41
|
+
await writeOwnerOnlyFile(path, content);
|
|
42
|
+
}
|
|
28
43
|
export async function writeJsonFile(path, data) {
|
|
29
|
-
await
|
|
44
|
+
await writeOwnerOnlyFile(path, JSON.stringify(data, null, 2) + "\n");
|
|
30
45
|
}
|
|
31
46
|
export function resolvePackageFile(relativePath) {
|
|
32
47
|
const thisDir = dirname(fileURLToPath(import.meta.url));
|
package/dist/cli/setup/fs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/cli/setup/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/cli/setup/fs.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/setup/mcp.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { SetupOptions, SetupResult } from "./types.js";
|
|
2
|
+
export { isLoopbackHost } from "../../utils/loopback.js";
|
|
2
3
|
export interface JsonPlatformConfig {
|
|
3
4
|
configDirName: string;
|
|
4
5
|
configFileName: string;
|
|
@@ -30,7 +31,19 @@ export declare function resolveMcpServerEntry(): {
|
|
|
30
31
|
* an HTTP entry is inherently PER-PROJECT — one shared URL cannot describe two
|
|
31
32
|
* projects.
|
|
32
33
|
*/
|
|
33
|
-
export declare function daemonHttpUrl(port?: number, cwd?: string): string;
|
|
34
|
+
export declare function daemonHttpUrl(port?: number, cwd?: string, host?: string, scheme?: "http" | "https"): string;
|
|
35
|
+
/**
|
|
36
|
+
* Refuse to write a reusable bearer token onto a plaintext URL that leaves the machine.
|
|
37
|
+
*
|
|
38
|
+
* Requiring a token does not make a routable plaintext endpoint safe: the token is static and
|
|
39
|
+
* replayable, and anything that captures it can call every tool — which exposes every indexed
|
|
40
|
+
* repository and conversation on the daemon. Loopback is exempt (nothing leaves the host).
|
|
41
|
+
*
|
|
42
|
+
* `insecureTransport` is the deliberate escape for the deployment this feature was built for: a
|
|
43
|
+
* tailnet or VPN where the transport is already encrypted below HTTP. It has to be stated, not
|
|
44
|
+
* assumed, because the code cannot tell a tailnet address from a public one.
|
|
45
|
+
*/
|
|
46
|
+
export declare function assertTokenTransportIsSafe(options: SetupOptions): void;
|
|
34
47
|
export declare function buildJsonServerEntry(options?: SetupOptions): Record<string, unknown>;
|
|
35
48
|
export declare function setupJsonPlatform(platform: string, config: JsonPlatformConfig, options?: SetupOptions): Promise<SetupResult>;
|
|
36
49
|
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/mcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/cli/setup/mcp.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGzD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAID,wBAAgB,qBAAqB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAoB3E;AAID;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,wBAAgB,aAAa,CAC3B,IAAI,CAAC,EAAE,MAAM,EACb,GAAG,CAAC,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GACxB,MAAM,CAmBR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAYtE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAapF;AAqDD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC,CAwBtB"}
|
package/dist/cli/setup/mcp.js
CHANGED
|
@@ -2,6 +2,8 @@ import { execSync } from "node:child_process";
|
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
+
import { isLoopbackHost, assertPlainHost } from "../../utils/loopback.js";
|
|
6
|
+
export { isLoopbackHost } from "../../utils/loopback.js";
|
|
5
7
|
import { ensureDir, readJsonFile, writeJsonFile } from "./fs.js";
|
|
6
8
|
const DEFAULT_DAEMON_PORT = 7077;
|
|
7
9
|
export function resolveMcpServerEntry() {
|
|
@@ -49,14 +51,62 @@ const MCP_SERVER_ENTRY = resolveMcpServerEntry();
|
|
|
49
51
|
* an HTTP entry is inherently PER-PROJECT — one shared URL cannot describe two
|
|
50
52
|
* projects.
|
|
51
53
|
*/
|
|
52
|
-
export function daemonHttpUrl(port, cwd) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
export function daemonHttpUrl(port, cwd, host, scheme) {
|
|
55
|
+
// Host is a parameter, not a constant. It was hardcoded to 127.0.0.1, which
|
|
56
|
+
// silently made `setup --http` a local-only feature: a SHARED daemon — the
|
|
57
|
+
// entire reason stateless serving exists — could not be configured without
|
|
58
|
+
// hand-editing every client's JSON. Adding a machine to a shared instance has
|
|
59
|
+
// to be one command, or nobody will do it twice.
|
|
60
|
+
const rawHost = host ?? "127.0.0.1";
|
|
61
|
+
assertPlainHost(rawHost);
|
|
62
|
+
// Bracket IPv6 literals. Plain concatenation produced `http://::1:7077/mcp`,
|
|
63
|
+
// which is not a parseable authority — a tailnet IPv6 daemon could not be
|
|
64
|
+
// configured at all.
|
|
65
|
+
const authorityHost = rawHost.includes(":") && !rawHost.startsWith("[")
|
|
66
|
+
? `[${rawHost}]`
|
|
67
|
+
: rawHost;
|
|
68
|
+
const url = new URL(`${scheme ?? "http"}://${authorityHost}:${port ?? DEFAULT_DAEMON_PORT}/mcp`);
|
|
69
|
+
url.searchParams.set("cwd", cwd ?? process.cwd());
|
|
70
|
+
return url.toString();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Refuse to write a reusable bearer token onto a plaintext URL that leaves the machine.
|
|
74
|
+
*
|
|
75
|
+
* Requiring a token does not make a routable plaintext endpoint safe: the token is static and
|
|
76
|
+
* replayable, and anything that captures it can call every tool — which exposes every indexed
|
|
77
|
+
* repository and conversation on the daemon. Loopback is exempt (nothing leaves the host).
|
|
78
|
+
*
|
|
79
|
+
* `insecureTransport` is the deliberate escape for the deployment this feature was built for: a
|
|
80
|
+
* tailnet or VPN where the transport is already encrypted below HTTP. It has to be stated, not
|
|
81
|
+
* assumed, because the code cannot tell a tailnet address from a public one.
|
|
82
|
+
*/
|
|
83
|
+
export function assertTokenTransportIsSafe(options) {
|
|
84
|
+
const host = options.host ?? "127.0.0.1";
|
|
85
|
+
assertPlainHost(host);
|
|
86
|
+
if (!options.token)
|
|
87
|
+
return;
|
|
88
|
+
if (isLoopbackHost(host))
|
|
89
|
+
return;
|
|
90
|
+
if (options.scheme === "https")
|
|
91
|
+
return;
|
|
92
|
+
if (options.insecureTransport)
|
|
93
|
+
return;
|
|
94
|
+
throw new Error(`Refusing to write a bearer token for http://${host} — the token would travel in plaintext ` +
|
|
95
|
+
`and anyone who captures it can read every indexed repo on that daemon. Use --scheme https, ` +
|
|
96
|
+
`or pass --insecure-transport if the link is already encrypted (tailnet/VPN/SSH tunnel).`);
|
|
56
97
|
}
|
|
57
98
|
export function buildJsonServerEntry(options) {
|
|
58
99
|
if (options?.http) {
|
|
59
|
-
|
|
100
|
+
// A remote daemon requires a token (the server refuses a routable bind
|
|
101
|
+
// without one), so it travels with the URL in the client entry.
|
|
102
|
+
assertTokenTransportIsSafe(options);
|
|
103
|
+
const entry = {
|
|
104
|
+
type: "http",
|
|
105
|
+
url: daemonHttpUrl(options.port, options.cwd, options.host, options.scheme),
|
|
106
|
+
};
|
|
107
|
+
if (options.token)
|
|
108
|
+
entry["headers"] = { Authorization: `Bearer ${options.token}` };
|
|
109
|
+
return entry;
|
|
60
110
|
}
|
|
61
111
|
return { ...MCP_SERVER_ENTRY };
|
|
62
112
|
}
|