@bjorntech/key-ferry 0.1.7 → 0.1.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 +80 -14
- package/SECURITY.md +20 -0
- package/dist/broker-registry.d.ts +30 -0
- package/dist/broker-registry.d.ts.map +1 -0
- package/dist/broker-registry.js +347 -0
- package/dist/broker-registry.js.map +1 -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 +7 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +90 -169
- 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 +27 -2
- 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} +18 -17
- package/package.json +4 -1
- /package/examples/{.env.schema → single-project/.env.schema} +0 -0
|
@@ -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"}
|