@bjorntech/key-ferry 0.1.8 → 0.1.10
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 +79 -13
- package/SECURITY.md +20 -0
- package/dist/contracts.d.ts +23 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js.map +1 -1
- package/dist/options.d.ts +7 -0
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +28 -2
- package/dist/options.js.map +1 -1
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +53 -170
- package/dist/plugin.js.map +1 -1
- package/dist/project-config.d.ts +3 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +3 -0
- package/dist/project-config.js.map +1 -0
- package/dist/rpc.d.ts +141 -6
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +117 -35
- package/dist/rpc.js.map +1 -1
- package/dist/scoped-config.d.ts +35 -0
- package/dist/scoped-config.d.ts.map +1 -0
- package/dist/scoped-config.js +224 -0
- package/dist/scoped-config.js.map +1 -0
- package/dist/scoped-controller.d.ts +40 -0
- package/dist/scoped-controller.d.ts.map +1 -0
- package/dist/scoped-controller.js +468 -0
- package/dist/scoped-controller.js.map +1 -0
- package/dist/scopes/controller-helpers.d.ts +47 -0
- package/dist/scopes/controller-helpers.d.ts.map +1 -0
- package/dist/scopes/controller-helpers.js +268 -0
- package/dist/scopes/controller-helpers.js.map +1 -0
- package/dist/scopes/controller-types.d.ts +22 -0
- package/dist/scopes/controller-types.d.ts.map +1 -0
- package/dist/scopes/controller-types.js +2 -0
- package/dist/scopes/controller-types.js.map +1 -0
- package/dist/tui.d.ts +31 -33
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +111 -35
- package/dist/tui.js.map +1 -1
- package/docs/architecture.md +27 -1
- package/docs/troubleshooting.md +26 -1
- package/examples/README.md +47 -0
- package/examples/global/.env.schema +6 -0
- package/examples/global/opencode.json +31 -0
- package/examples/project/.env.schema +6 -0
- package/examples/project/.opencode/key-ferry.jsonc +10 -0
- package/examples/project/opencode.json +11 -0
- package/examples/{opencode.jsonc → single-project/opencode.json} +17 -16
- package/package.json +4 -1
- /package/examples/{.env.schema → single-project/.env.schema} +0 -0
package/dist/rpc.js
CHANGED
|
@@ -1,24 +1,51 @@
|
|
|
1
1
|
import { Rpc } from "@opencode/plugin/effect";
|
|
2
2
|
import { Schema } from "effect";
|
|
3
|
-
import { VarlockError } from "./contracts.js";
|
|
3
|
+
import { VarlockError, } from "./contracts.js";
|
|
4
4
|
const statusError = Schema.Struct({
|
|
5
5
|
code: Schema.String,
|
|
6
6
|
message: Schema.String,
|
|
7
7
|
retryable: Schema.Boolean,
|
|
8
8
|
});
|
|
9
|
+
const scopeId = Schema.Literals(["global", "project"]);
|
|
10
|
+
const managerPhase = Schema.Literals([
|
|
11
|
+
"stopped",
|
|
12
|
+
"starting",
|
|
13
|
+
"ready",
|
|
14
|
+
"degraded",
|
|
15
|
+
"failed",
|
|
16
|
+
"stopping",
|
|
17
|
+
]);
|
|
18
|
+
const diagnostic = Schema.Struct({
|
|
19
|
+
code: Schema.String,
|
|
20
|
+
server: Schema.String,
|
|
21
|
+
message: Schema.String,
|
|
22
|
+
});
|
|
23
|
+
const scopeStatus = Schema.Struct({
|
|
24
|
+
scope: scopeId,
|
|
25
|
+
projectDirectory: Schema.String,
|
|
26
|
+
phase: managerPhase,
|
|
27
|
+
generation: Schema.Number,
|
|
28
|
+
pid: Schema.optional(Schema.Number),
|
|
29
|
+
lastRefreshAt: Schema.optional(Schema.String),
|
|
30
|
+
error: Schema.optional(statusError),
|
|
31
|
+
diagnostics: Schema.optional(Schema.Array(diagnostic)),
|
|
32
|
+
activation: Schema.optional(Schema.Literals(["auto", "manual", "awaiting_activation"])),
|
|
33
|
+
});
|
|
9
34
|
export const SafeStatusSchema = Schema.Struct({
|
|
10
|
-
phase:
|
|
35
|
+
phase: managerPhase,
|
|
11
36
|
projectDirectory: Schema.String,
|
|
12
37
|
generation: Schema.Number,
|
|
13
38
|
pid: Schema.optional(Schema.Number),
|
|
14
39
|
endpoint: Schema.optional(Schema.String),
|
|
15
40
|
lastRefreshAt: Schema.optional(Schema.String),
|
|
16
41
|
error: Schema.optional(statusError),
|
|
17
|
-
diagnostics: Schema.optional(Schema.Array(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
42
|
+
diagnostics: Schema.optional(Schema.Array(diagnostic)),
|
|
43
|
+
scopes: Schema.optional(Schema.Array(scopeStatus)),
|
|
44
|
+
bindings: Schema.optional(Schema.Record(Schema.String, scopeId)),
|
|
45
|
+
});
|
|
46
|
+
const selector = Schema.Struct({
|
|
47
|
+
scope: Schema.optional(scopeId),
|
|
48
|
+
server: Schema.optional(Schema.NonEmptyString),
|
|
22
49
|
});
|
|
23
50
|
const Empty = Schema.Struct({});
|
|
24
51
|
const isVarlockErrorCode = (value) => value === "invalid_config" ||
|
|
@@ -33,20 +60,27 @@ export const KeyFerryRpc = Rpc.define({
|
|
|
33
60
|
id: "key-ferry",
|
|
34
61
|
methods: {
|
|
35
62
|
status: {
|
|
36
|
-
input:
|
|
63
|
+
input: selector,
|
|
37
64
|
output: SafeStatusSchema,
|
|
38
65
|
errors: {
|
|
39
66
|
unavailable: Schema.Struct({ code: Schema.String }),
|
|
40
67
|
},
|
|
41
68
|
},
|
|
42
69
|
refresh: {
|
|
43
|
-
input:
|
|
70
|
+
input: selector,
|
|
44
71
|
output: SafeStatusSchema,
|
|
45
72
|
errors: {
|
|
46
73
|
unavailable: Schema.Struct({ code: Schema.String }),
|
|
47
74
|
},
|
|
48
75
|
},
|
|
49
76
|
doctor: {
|
|
77
|
+
input: selector,
|
|
78
|
+
output: SafeStatusSchema,
|
|
79
|
+
errors: {
|
|
80
|
+
unavailable: Schema.Struct({ code: Schema.String }),
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
activateProject: {
|
|
50
84
|
input: Empty,
|
|
51
85
|
output: SafeStatusSchema,
|
|
52
86
|
errors: {
|
|
@@ -78,38 +112,86 @@ const publicMessage = (error) => {
|
|
|
78
112
|
};
|
|
79
113
|
/** Rebuild a safe status without trusting an adapter error message. */
|
|
80
114
|
export function sanitizeStatus(status) {
|
|
81
|
-
const errorCode = isVarlockErrorCode(status.error?.code) ? status.error.code : "unavailable";
|
|
82
115
|
return {
|
|
83
116
|
phase: status.phase,
|
|
84
117
|
projectDirectory: status.projectDirectory,
|
|
85
118
|
generation: status.generation,
|
|
86
|
-
...(status
|
|
87
|
-
...(status
|
|
88
|
-
...(status.lastRefreshAt === undefined ? {} : { lastRefreshAt: status.lastRefreshAt }),
|
|
89
|
-
...(status.error === undefined
|
|
90
|
-
? {}
|
|
91
|
-
: {
|
|
92
|
-
error: new VarlockError({
|
|
93
|
-
code: errorCode,
|
|
94
|
-
message: publicMessage(new VarlockError({
|
|
95
|
-
code: errorCode,
|
|
96
|
-
message: "",
|
|
97
|
-
retryable: status.error.retryable === true,
|
|
98
|
-
})),
|
|
99
|
-
retryable: status.error.retryable,
|
|
100
|
-
}),
|
|
101
|
-
}),
|
|
102
|
-
...(status.diagnostics === undefined
|
|
103
|
-
? {}
|
|
104
|
-
: {
|
|
105
|
-
diagnostics: status.diagnostics.map((item) => ({
|
|
106
|
-
code: item.code,
|
|
107
|
-
server: item.server,
|
|
108
|
-
message: item.message,
|
|
109
|
-
})),
|
|
110
|
-
}),
|
|
119
|
+
...sanitizeLegacyFields(status),
|
|
120
|
+
...sanitizeAggregateFields(status),
|
|
111
121
|
};
|
|
112
122
|
}
|
|
123
|
+
function optionalField(key, value) {
|
|
124
|
+
return value === undefined ? {} : { [key]: value };
|
|
125
|
+
}
|
|
126
|
+
function sanitizeLegacyFields(status) {
|
|
127
|
+
return {
|
|
128
|
+
...optionalField("pid", status.pid),
|
|
129
|
+
...optionalField("endpoint", status.endpoint),
|
|
130
|
+
...optionalField("lastRefreshAt", status.lastRefreshAt),
|
|
131
|
+
...optionalField("error", status.error === undefined ? undefined : sanitizeError(status.error)),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function sanitizeAggregateFields(status) {
|
|
135
|
+
return {
|
|
136
|
+
...optionalField("diagnostics", status.diagnostics?.map(sanitizeDiagnostic)),
|
|
137
|
+
...optionalField("scopes", status.scopes?.map(sanitizeScopeStatus)),
|
|
138
|
+
...optionalField("bindings", status.bindings === undefined ? undefined : sanitizeBindings(status.bindings)),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function sanitizeDiagnostic(item) {
|
|
142
|
+
const messages = {
|
|
143
|
+
remote_unavailable: "Remote server is unavailable",
|
|
144
|
+
remote_invalid_url: "Remote server URL is invalid",
|
|
145
|
+
remote_oauth_required: "set oauth:false for API-key relay mode, or remove this Varlock mapping to keep native OAuth",
|
|
146
|
+
remote_missing_placeholder: "Remote server mapping is incomplete",
|
|
147
|
+
remote_invalid_header: "Remote server header configuration is invalid",
|
|
148
|
+
remote_relay_failed: "Remote server relay failed",
|
|
149
|
+
project_root_unavailable: "Project root is unavailable",
|
|
150
|
+
project_config_escape: "Project configuration path is invalid",
|
|
151
|
+
project_config_unavailable: "Project configuration is unavailable",
|
|
152
|
+
project_config_too_large: "Project configuration is too large",
|
|
153
|
+
project_config_invalid: "Project configuration is invalid",
|
|
154
|
+
};
|
|
155
|
+
const message = Object.hasOwn(messages, item.code)
|
|
156
|
+
? messages[item.code]
|
|
157
|
+
: "Diagnostic information is unavailable";
|
|
158
|
+
return {
|
|
159
|
+
code: item.code,
|
|
160
|
+
server: item.server,
|
|
161
|
+
// Only messages produced by this adapter's known diagnostic codes cross
|
|
162
|
+
// the boundary. Provider text is intentionally never used as a fallback.
|
|
163
|
+
message,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function sanitizeScopeStatus(status) {
|
|
167
|
+
return {
|
|
168
|
+
scope: status.scope,
|
|
169
|
+
projectDirectory: status.projectDirectory,
|
|
170
|
+
phase: status.phase,
|
|
171
|
+
generation: status.generation,
|
|
172
|
+
...optionalField("pid", status.pid),
|
|
173
|
+
...optionalField("lastRefreshAt", status.lastRefreshAt),
|
|
174
|
+
...optionalField("error", status.error === undefined ? undefined : sanitizeError(status.error)),
|
|
175
|
+
...optionalField("diagnostics", status.diagnostics?.map(sanitizeDiagnostic)),
|
|
176
|
+
...optionalField("activation", status.activation),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function sanitizeError(error) {
|
|
180
|
+
const code = isVarlockErrorCode(error.code) ? error.code : "unavailable";
|
|
181
|
+
return new VarlockError({
|
|
182
|
+
code,
|
|
183
|
+
message: publicMessage(new VarlockError({ code, message: "", retryable: false })),
|
|
184
|
+
retryable: error.retryable === true,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
function sanitizeBindings(bindings) {
|
|
188
|
+
const result = {};
|
|
189
|
+
for (const [server, scope] of Object.entries(bindings)) {
|
|
190
|
+
if (server.length > 0 && (scope === "global" || scope === "project"))
|
|
191
|
+
result[server] = scope;
|
|
192
|
+
}
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
113
195
|
export function rpcError(error) {
|
|
114
196
|
return { code: error.code };
|
|
115
197
|
}
|
package/dist/rpc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ProjectDirectory } from "./contracts.js";
|
|
2
|
+
import { managerOptions, type ProjectConfigActivation, type ServerProtection, type ValidatedOptions } from "./options.js";
|
|
3
|
+
export interface ScopedConfigurationLocation {
|
|
4
|
+
readonly project: {
|
|
5
|
+
readonly directory: string;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export interface ScopedConfigurationFileSystem {
|
|
9
|
+
readonly readFile: (path: string) => Promise<string>;
|
|
10
|
+
readonly realpath?: (path: string) => Promise<string>;
|
|
11
|
+
}
|
|
12
|
+
export interface ScopedGroup {
|
|
13
|
+
readonly id: "global" | "project";
|
|
14
|
+
readonly sourceRoot: ProjectDirectory;
|
|
15
|
+
readonly options: ValidatedOptions;
|
|
16
|
+
readonly manager: ReturnType<typeof managerOptions>;
|
|
17
|
+
readonly environmentKeys: readonly string[];
|
|
18
|
+
readonly servers: Readonly<Record<string, ServerProtection>>;
|
|
19
|
+
}
|
|
20
|
+
export interface ScopedProjectError {
|
|
21
|
+
readonly code: string;
|
|
22
|
+
readonly server: string;
|
|
23
|
+
readonly message: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ScopedConfiguration {
|
|
26
|
+
readonly global: ScopedGroup;
|
|
27
|
+
readonly project?: ScopedGroup;
|
|
28
|
+
readonly activation: ProjectConfigActivation;
|
|
29
|
+
readonly bindings: Readonly<Record<string, "global" | "project">>;
|
|
30
|
+
readonly diagnostics: readonly ScopedProjectError[];
|
|
31
|
+
}
|
|
32
|
+
export declare const MAX_PROJECT_CONFIG_BYTES: number;
|
|
33
|
+
export declare const MAX_PROJECT_CONFIG_DEPTH = 64;
|
|
34
|
+
export declare function loadScopedConfiguration(globalRaw: unknown, location: ScopedConfigurationLocation, fs?: ScopedConfigurationFileSystem): Promise<ScopedConfiguration>;
|
|
35
|
+
//# sourceMappingURL=scoped-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-config.d.ts","sourceRoot":"","sources":["../src/scoped-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EACL,cAAc,EAEd,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD;AACD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACvD;AACD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,QAAQ,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;IACpD,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;CAC9D;AACD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AACD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACrD;AAED,eAAO,MAAM,wBAAwB,QAAa,CAAC;AACnD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AA6P3C,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,2BAA2B,EACrC,EAAE,GAAE,6BAAyC,GAC5C,OAAO,CAAC,mBAAmB,CAAC,CAkB9B"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { open, realpath } from "node:fs/promises";
|
|
2
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
3
|
+
import { createScanner, parse } from "jsonc-parser";
|
|
4
|
+
import { projectDirectory } from "./contracts.js";
|
|
5
|
+
import { managerOptions, parseOptions, } from "./options.js";
|
|
6
|
+
export const MAX_PROJECT_CONFIG_BYTES = 128 * 1024;
|
|
7
|
+
export const MAX_PROJECT_CONFIG_DEPTH = 64;
|
|
8
|
+
const defaultFs = {
|
|
9
|
+
readFile: async (path) => {
|
|
10
|
+
const handle = await open(path, "r");
|
|
11
|
+
try {
|
|
12
|
+
const stat = await handle.stat();
|
|
13
|
+
if (stat.size > MAX_PROJECT_CONFIG_BYTES)
|
|
14
|
+
throw new RangeError("project configuration is too large");
|
|
15
|
+
const buffer = Buffer.alloc(MAX_PROJECT_CONFIG_BYTES + 1);
|
|
16
|
+
const result = await handle.read(buffer, 0, buffer.length, 0);
|
|
17
|
+
if (result.bytesRead > MAX_PROJECT_CONFIG_BYTES)
|
|
18
|
+
throw new RangeError("project configuration is too large");
|
|
19
|
+
return buffer.subarray(0, result.bytesRead).toString("utf8");
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
await handle.close();
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
realpath,
|
|
26
|
+
};
|
|
27
|
+
const own = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
28
|
+
const safeMessage = (_error) => "project configuration is invalid";
|
|
29
|
+
const JSONC = { openBrace: 1, closeBrace: 2, openBracket: 3, closeBracket: 4, eof: 17 };
|
|
30
|
+
const isOpen = (token) => token === JSONC.openBrace || token === JSONC.openBracket;
|
|
31
|
+
const isClose = (token) => token === JSONC.closeBrace || token === JSONC.closeBracket;
|
|
32
|
+
function scanDepth(source) {
|
|
33
|
+
const scanner = createScanner(source, true);
|
|
34
|
+
let depth = 0;
|
|
35
|
+
for (let token = scanner.scan(); token !== JSONC.eof; token = scanner.scan()) {
|
|
36
|
+
if (isOpen(token)) {
|
|
37
|
+
depth++;
|
|
38
|
+
if (depth > MAX_PROJECT_CONFIG_DEPTH)
|
|
39
|
+
throw new RangeError("project configuration is too deeply nested");
|
|
40
|
+
}
|
|
41
|
+
else if (isClose(token)) {
|
|
42
|
+
depth--;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function nullPrototype(value, depth = 0) {
|
|
47
|
+
if (Array.isArray(value))
|
|
48
|
+
return value.map((item) => nullPrototype(item, depth + 1));
|
|
49
|
+
if (value === null || typeof value !== "object")
|
|
50
|
+
return value;
|
|
51
|
+
if (depth > MAX_PROJECT_CONFIG_DEPTH)
|
|
52
|
+
throw new RangeError("project configuration is too deeply nested");
|
|
53
|
+
const result = Object.create(null);
|
|
54
|
+
for (const [key, item] of Object.entries(value))
|
|
55
|
+
result[key] = nullPrototype(item, depth + 1);
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
function parseJsonc(source) {
|
|
59
|
+
scanDepth(source);
|
|
60
|
+
const errors = [];
|
|
61
|
+
const value = parse(source, errors, { allowTrailingComma: true, disallowComments: false });
|
|
62
|
+
if (errors.length > 0)
|
|
63
|
+
throw new SyntaxError("invalid project configuration");
|
|
64
|
+
return nullPrototype(value);
|
|
65
|
+
}
|
|
66
|
+
function group(id, root, options) {
|
|
67
|
+
const manager = managerOptions(options, root);
|
|
68
|
+
const environmentKeys = Array.isArray(manager.adapter?.environmentKeys)
|
|
69
|
+
? manager.adapter.environmentKeys
|
|
70
|
+
: [];
|
|
71
|
+
return {
|
|
72
|
+
id,
|
|
73
|
+
sourceRoot: projectDirectory(root),
|
|
74
|
+
options,
|
|
75
|
+
manager,
|
|
76
|
+
environmentKeys,
|
|
77
|
+
servers: options.adapter.servers,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const diagnostic = (code) => ({
|
|
81
|
+
code,
|
|
82
|
+
server: "project",
|
|
83
|
+
message: "project configuration is unavailable",
|
|
84
|
+
});
|
|
85
|
+
const result = (global, bindings, diagnostics = []) => ({ global, activation: "manual", bindings, diagnostics });
|
|
86
|
+
async function projectFile(root, file, fs) {
|
|
87
|
+
const filePath = resolve(root, file);
|
|
88
|
+
if (!inside(relative(root, filePath)))
|
|
89
|
+
return { error: diagnostic("project_config_escape") };
|
|
90
|
+
const canonicalError = await canonicalFile(root, filePath, fs);
|
|
91
|
+
return canonicalError ? { error: canonicalError } : readProjectFile(filePath, fs);
|
|
92
|
+
}
|
|
93
|
+
const inside = (path) => !path.startsWith("..") && !isAbsolute(path);
|
|
94
|
+
async function canonicalFile(root, filePath, fs) {
|
|
95
|
+
if (!fs.realpath)
|
|
96
|
+
return undefined;
|
|
97
|
+
try {
|
|
98
|
+
return inside(relative(root, await fs.realpath(filePath)))
|
|
99
|
+
? undefined
|
|
100
|
+
: diagnostic("project_config_escape");
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
return error.code === "ENOENT"
|
|
104
|
+
? undefined
|
|
105
|
+
: diagnostic("project_config_unavailable");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function readProjectFile(filePath, fs) {
|
|
109
|
+
try {
|
|
110
|
+
const source = await fs.readFile(filePath);
|
|
111
|
+
return Buffer.byteLength(source, "utf8") > MAX_PROJECT_CONFIG_BYTES
|
|
112
|
+
? { error: diagnostic("project_config_too_large") }
|
|
113
|
+
: { source };
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
return error.code === "ENOENT"
|
|
117
|
+
? {}
|
|
118
|
+
: { error: diagnostic("project_config_unavailable") };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function projectSettings(source) {
|
|
122
|
+
const raw = parseJsonc(source);
|
|
123
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw))
|
|
124
|
+
throw new TypeError("project config must be an object");
|
|
125
|
+
const config = raw;
|
|
126
|
+
if (config.enabled !== true)
|
|
127
|
+
return undefined;
|
|
128
|
+
validateProjectKeys(config);
|
|
129
|
+
validateActivation(config.activation);
|
|
130
|
+
validateOverrides(config.overrides);
|
|
131
|
+
return config;
|
|
132
|
+
}
|
|
133
|
+
function validateProjectKeys(config) {
|
|
134
|
+
const allowed = new Set(["enabled", "activation", "overrides", "servers", "projectDirectory"]);
|
|
135
|
+
if (Object.keys(config).some((key) => !allowed.has(key)))
|
|
136
|
+
throw new TypeError("unsupported project config key");
|
|
137
|
+
}
|
|
138
|
+
function validateActivation(value) {
|
|
139
|
+
if (value !== undefined && value !== "auto" && value !== "manual")
|
|
140
|
+
throw new TypeError("project activation is invalid");
|
|
141
|
+
}
|
|
142
|
+
function validateOverrides(value) {
|
|
143
|
+
if (value !== undefined &&
|
|
144
|
+
(!Array.isArray(value) || value.some((name) => typeof name !== "string")))
|
|
145
|
+
throw new TypeError("overrides must be an array of server names");
|
|
146
|
+
}
|
|
147
|
+
async function projectGroup(config, root, fs, global, bindings) {
|
|
148
|
+
const project = readProjectOptions(config, root);
|
|
149
|
+
const projectRoot = await resolveProjectRoot(project.projectDirectory ?? root, root, fs);
|
|
150
|
+
if (typeof projectRoot !== "string")
|
|
151
|
+
return projectRoot;
|
|
152
|
+
const overrides = (config.overrides ?? []);
|
|
153
|
+
const names = Object.keys(project.adapter.servers);
|
|
154
|
+
if (!validBindings(names, overrides, project, global))
|
|
155
|
+
return diagnostic("project_config_invalid");
|
|
156
|
+
const canonical = {
|
|
157
|
+
...project,
|
|
158
|
+
projectDirectory: projectDirectory(projectRoot),
|
|
159
|
+
manager: { ...project.manager, projectDirectory: projectDirectory(projectRoot) },
|
|
160
|
+
};
|
|
161
|
+
for (const name of names)
|
|
162
|
+
bindings[name] = "project";
|
|
163
|
+
return group("project", projectRoot, canonical);
|
|
164
|
+
}
|
|
165
|
+
function readProjectOptions(config, root) {
|
|
166
|
+
return parseOptions({ servers: config.servers ?? {}, projectDirectory: config.projectDirectory ?? "." }, root);
|
|
167
|
+
}
|
|
168
|
+
async function resolveProjectRoot(path, root, fs) {
|
|
169
|
+
try {
|
|
170
|
+
const canonical = fs.realpath ? await fs.realpath(path) : path;
|
|
171
|
+
return inside(relative(root, canonical)) ? canonical : diagnostic("project_config_escape");
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return diagnostic("project_root_unavailable");
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function validBindings(names, overrides, project, global) {
|
|
178
|
+
const collision = names.some((name) => own(global.servers, name) && !overrides.includes(name));
|
|
179
|
+
const invalidOverride = overrides.some((name) => !own(project.adapter.servers, name) || !own(global.servers, name));
|
|
180
|
+
return !collision && !invalidOverride;
|
|
181
|
+
}
|
|
182
|
+
async function loadProjectPlan(global, root, fs, bindings) {
|
|
183
|
+
const loaded = await projectFile(root, global.options.projectConfig.file, fs);
|
|
184
|
+
if (loaded.error)
|
|
185
|
+
return result(global, bindings, [loaded.error]);
|
|
186
|
+
if (loaded.source === undefined)
|
|
187
|
+
return result(global, bindings);
|
|
188
|
+
return sourcePlan(loaded.source, global, root, fs, bindings);
|
|
189
|
+
}
|
|
190
|
+
async function sourcePlan(source, global, root, fs, bindings) {
|
|
191
|
+
try {
|
|
192
|
+
const config = projectSettings(source);
|
|
193
|
+
if (!config)
|
|
194
|
+
return result(global, bindings);
|
|
195
|
+
const local = await projectGroup(config, root, fs, global, bindings);
|
|
196
|
+
if ("code" in local)
|
|
197
|
+
return result(global, bindings, [local]);
|
|
198
|
+
const activation = global.options.projectConfig.activation === "auto" && config.activation !== "manual"
|
|
199
|
+
? "auto"
|
|
200
|
+
: "manual";
|
|
201
|
+
return { global, project: local, activation, bindings, diagnostics: [] };
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
return result(global, bindings, [
|
|
205
|
+
{ code: "project_config_invalid", server: "project", message: safeMessage(error) },
|
|
206
|
+
]);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
export async function loadScopedConfiguration(globalRaw, location, fs = defaultFs) {
|
|
210
|
+
const global = parseOptions(globalRaw, location.project.directory);
|
|
211
|
+
const globalGroup = group("global", global.projectDirectory ?? location.project.directory, global);
|
|
212
|
+
const bindings = Object.fromEntries(Object.keys(globalGroup.servers).map((name) => [name, "global"]));
|
|
213
|
+
if (!global.enabled || !global.projectConfig.enabled)
|
|
214
|
+
return result(globalGroup, bindings);
|
|
215
|
+
let root;
|
|
216
|
+
try {
|
|
217
|
+
root = await (fs.realpath ?? realpath)(location.project.directory);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return result(globalGroup, bindings, [diagnostic("project_root_unavailable")]);
|
|
221
|
+
}
|
|
222
|
+
return loadProjectPlan(globalGroup, root, fs, bindings);
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=scoped-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-config.js","sourceRoot":"","sources":["../src/scoped-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Effect, Scope } from "effect";
|
|
2
|
+
import type { BrokerRegistry } from "./broker-registry.js";
|
|
3
|
+
import type { ProjectKeyFerryManagerFactory, SafeStatus, ScopeId } from "./contracts.js";
|
|
4
|
+
import { type McpEditor } from "./plugin.js";
|
|
5
|
+
import { type RemoteRelayFactory } from "./remote.js";
|
|
6
|
+
import type { ScopedConfiguration } from "./scoped-config.js";
|
|
7
|
+
import type { Runtime } from "./scopes/controller-types.js";
|
|
8
|
+
export interface ScopedControllerOptions {
|
|
9
|
+
readonly configuration: ScopedConfiguration;
|
|
10
|
+
readonly factory: ProjectKeyFerryManagerFactory;
|
|
11
|
+
readonly relayFactory?: RemoteRelayFactory;
|
|
12
|
+
readonly registry: BrokerRegistry;
|
|
13
|
+
readonly scope: Scope.Scope;
|
|
14
|
+
readonly reload: () => Effect.Effect<void>;
|
|
15
|
+
readonly editor: McpEditor;
|
|
16
|
+
readonly watchIntervalMs?: number;
|
|
17
|
+
readonly startEmptyGlobal?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/** Coordinates independent manager/relay lifecycles without merging scopes. */
|
|
20
|
+
export declare function makeScopedController(options: ScopedControllerOptions): {
|
|
21
|
+
start: Effect.Effect<void, never, never>;
|
|
22
|
+
capture: (nextEditor: McpEditor) => void;
|
|
23
|
+
apply: (editor: McpEditor) => void;
|
|
24
|
+
setEditor: (next: McpEditor) => void;
|
|
25
|
+
status: Effect.Effect<SafeStatus, never, never>;
|
|
26
|
+
statusSelected: (selector?: {
|
|
27
|
+
readonly scope?: ScopeId;
|
|
28
|
+
readonly server?: string;
|
|
29
|
+
}) => Effect.Effect<SafeStatus, never, never>;
|
|
30
|
+
operation: (kind: "refresh" | "doctor", selector?: {
|
|
31
|
+
readonly scope?: ScopeId;
|
|
32
|
+
readonly server?: string;
|
|
33
|
+
}) => Effect.Effect<SafeStatus, any, never>;
|
|
34
|
+
activateProject: Effect.Effect<SafeStatus, never, never>;
|
|
35
|
+
replaceProject: (next: ScopedConfiguration) => Effect.Effect<void, never, never>;
|
|
36
|
+
watch: (load: () => Promise<ScopedConfiguration>) => Effect.Effect<import("effect/Fiber").Fiber<void, never>, never, never>;
|
|
37
|
+
dispose: Effect.Effect<void, never, never>;
|
|
38
|
+
runtimes: Map<ScopeId, Runtime>;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=scoped-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped-controller.d.ts","sourceRoot":"","sources":["../src/scoped-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAQ,KAAK,EAAU,MAAM,QAAQ,CAAC;AACrD,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EACV,6BAA6B,EAE7B,UAAU,EACV,OAAO,EACR,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,mBAAmB,EAAe,MAAM,oBAAoB,CAAC;AAkB3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAkE5D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,6BAA6B,CAAC;IAChD,QAAQ,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,uBAAuB;;0BAYtC,SAAS;oBAyCf,SAAS;sBAgdP,SAAS;;gCApOC;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;sBAmHjF,SAAS,GAAG,QAAQ,aACf;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;;2BA4DrC,mBAAmB;kBAe5B,MAAM,OAAO,CAAC,mBAAmB,CAAC;;;EAuDxD"}
|