@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.
Files changed (56) hide show
  1. package/README.md +80 -14
  2. package/SECURITY.md +20 -0
  3. package/dist/broker-registry.d.ts +30 -0
  4. package/dist/broker-registry.d.ts.map +1 -0
  5. package/dist/broker-registry.js +347 -0
  6. package/dist/broker-registry.js.map +1 -0
  7. package/dist/contracts.d.ts +23 -0
  8. package/dist/contracts.d.ts.map +1 -1
  9. package/dist/contracts.js.map +1 -1
  10. package/dist/options.d.ts +7 -0
  11. package/dist/options.d.ts.map +1 -1
  12. package/dist/options.js +28 -2
  13. package/dist/options.js.map +1 -1
  14. package/dist/plugin.d.ts +7 -1
  15. package/dist/plugin.d.ts.map +1 -1
  16. package/dist/plugin.js +90 -169
  17. package/dist/plugin.js.map +1 -1
  18. package/dist/project-config.d.ts +3 -0
  19. package/dist/project-config.d.ts.map +1 -0
  20. package/dist/project-config.js +3 -0
  21. package/dist/project-config.js.map +1 -0
  22. package/dist/rpc.d.ts +141 -6
  23. package/dist/rpc.d.ts.map +1 -1
  24. package/dist/rpc.js +117 -35
  25. package/dist/rpc.js.map +1 -1
  26. package/dist/scoped-config.d.ts +35 -0
  27. package/dist/scoped-config.d.ts.map +1 -0
  28. package/dist/scoped-config.js +224 -0
  29. package/dist/scoped-config.js.map +1 -0
  30. package/dist/scoped-controller.d.ts +40 -0
  31. package/dist/scoped-controller.d.ts.map +1 -0
  32. package/dist/scoped-controller.js +468 -0
  33. package/dist/scoped-controller.js.map +1 -0
  34. package/dist/scopes/controller-helpers.d.ts +47 -0
  35. package/dist/scopes/controller-helpers.d.ts.map +1 -0
  36. package/dist/scopes/controller-helpers.js +268 -0
  37. package/dist/scopes/controller-helpers.js.map +1 -0
  38. package/dist/scopes/controller-types.d.ts +22 -0
  39. package/dist/scopes/controller-types.d.ts.map +1 -0
  40. package/dist/scopes/controller-types.js +2 -0
  41. package/dist/scopes/controller-types.js.map +1 -0
  42. package/dist/tui.d.ts +31 -33
  43. package/dist/tui.d.ts.map +1 -1
  44. package/dist/tui.js +111 -35
  45. package/dist/tui.js.map +1 -1
  46. package/docs/architecture.md +27 -1
  47. package/docs/troubleshooting.md +27 -2
  48. package/examples/README.md +47 -0
  49. package/examples/global/.env.schema +6 -0
  50. package/examples/global/opencode.json +31 -0
  51. package/examples/project/.env.schema +6 -0
  52. package/examples/project/.opencode/key-ferry.jsonc +10 -0
  53. package/examples/project/opencode.json +11 -0
  54. package/examples/{opencode.jsonc → single-project/opencode.json} +18 -17
  55. package/package.json +4 -1
  56. /package/examples/{.env.schema → single-project/.env.schema} +0 -0
@@ -0,0 +1,268 @@
1
+ import { applyProtection } from "../plugin.js";
2
+ export function filterGroupMappings(group, bindings) {
3
+ return Object.fromEntries(Object.entries(group.servers).filter(([name]) => bindings[name] === group.id));
4
+ }
5
+ /**
6
+ * Returns the semantic project inputs used by the configuration watcher.
7
+ *
8
+ * `sourceRoot` and the manager directory are resolved by scoped-config before
9
+ * this point. Including both prevents a project-root switch from reusing the
10
+ * Varlock process while keeping relative aliases and key ordering stable.
11
+ */
12
+ export function configurationFingerprint(value) {
13
+ return JSON.stringify(stableValue({
14
+ project: value.project === undefined
15
+ ? undefined
16
+ : {
17
+ servers: value.project.servers,
18
+ sourceRoot: value.project.sourceRoot,
19
+ managerProjectDirectory: value.project.manager.projectDirectory,
20
+ },
21
+ activation: value.activation,
22
+ bindings: value.bindings,
23
+ diagnostics: value.diagnostics,
24
+ }));
25
+ }
26
+ function stableValue(value) {
27
+ if (Array.isArray(value))
28
+ return value.map(stableValue);
29
+ if (value === null || typeof value !== "object")
30
+ return value;
31
+ return Object.fromEntries(Object.entries(value)
32
+ .sort(([left], [right]) => left.localeCompare(right))
33
+ .map(([key, item]) => [key, stableValue(item)]));
34
+ }
35
+ function optionalStatusFields(status) {
36
+ return {
37
+ ...(status.pid === undefined ? {} : { pid: status.pid }),
38
+ ...(status.lastRefreshAt === undefined ? {} : { lastRefreshAt: status.lastRefreshAt }),
39
+ ...(status.error === undefined ? {} : { error: status.error }),
40
+ };
41
+ }
42
+ export function groupStatus(runtime, activation) {
43
+ const status = runtime.status ?? {
44
+ phase: "starting",
45
+ projectDirectory: runtime.group.sourceRoot,
46
+ generation: 0,
47
+ };
48
+ const diagnostics = [
49
+ ...(status.diagnostics ?? []),
50
+ ...runtime.remote.diagnostics,
51
+ ];
52
+ return {
53
+ scope: runtime.id,
54
+ projectDirectory: status.projectDirectory,
55
+ phase: status.phase,
56
+ generation: status.generation,
57
+ ...optionalStatusFields(status),
58
+ ...(diagnostics.length === 0 ? {} : { diagnostics }),
59
+ ...(activation === undefined ? {} : { activation }),
60
+ };
61
+ }
62
+ export function emptyProtectionState() {
63
+ return { ready: false, environment: {} };
64
+ }
65
+ export function captureEditor(editor) {
66
+ const disabled = new Set();
67
+ const remote = new Map();
68
+ const environments = new Map();
69
+ for (const [name, value] of editor.list()) {
70
+ if (value.disabled === true)
71
+ disabled.add(name);
72
+ if (value.type === "local")
73
+ environments.set(name, { ...(value.environment ?? {}) });
74
+ if (value.type === "remote")
75
+ remote.set(name, remoteSnapshot(value));
76
+ }
77
+ return { disabled, remote, environments };
78
+ }
79
+ function remoteSnapshot(value) {
80
+ return {
81
+ type: "remote",
82
+ url: value.url,
83
+ ...(value.headers === undefined ? {} : { headers: { ...value.headers } }),
84
+ ...(value.oauth === undefined ? {} : { oauth: value.oauth }),
85
+ ...(value.disabled === undefined ? {} : { disabled: value.disabled }),
86
+ };
87
+ }
88
+ export function cleanManagedEnvironment(editor, managed, injected, pristine) {
89
+ for (const [name, keys] of managed)
90
+ editor.update(name, (config) => restoreManaged(config, keys, pristine, name));
91
+ for (const [name, values] of injected)
92
+ editor.update(name, (config) => restoreInjected(config, values, pristine, name));
93
+ }
94
+ function restoreManaged(config, keys, pristine, name) {
95
+ if (config.type !== "local")
96
+ return;
97
+ const environment = { ...(config.environment ?? {}) };
98
+ for (const state of keys.values())
99
+ for (const key of Object.keys(state.injected))
100
+ restoreManagedKey(environment, key, state, keys, pristine, name);
101
+ keys.clear();
102
+ config.environment = environment;
103
+ }
104
+ function restoreManagedKey(environment, key, state, _keys, pristine, name) {
105
+ if (environment[key] !== state.injected[key])
106
+ pristine.set(name, { ...(pristine.get(name) ?? {}), [key]: environment[key] });
107
+ else if (state.original[key] === undefined)
108
+ delete environment[key];
109
+ else
110
+ environment[key] = state.original[key];
111
+ }
112
+ function restoreInjected(config, values, pristine, name) {
113
+ if (config.type !== "local")
114
+ return;
115
+ const environment = { ...(config.environment ?? {}) };
116
+ for (const [key, value] of Object.entries(values))
117
+ restoreInjectedKey(environment, key, value, pristine.get(name)?.[key]);
118
+ config.environment = environment;
119
+ }
120
+ function restoreInjectedKey(environment, key, injected, original) {
121
+ if (environment[key] !== injected)
122
+ return;
123
+ if (original === undefined)
124
+ delete environment[key];
125
+ else
126
+ environment[key] = original;
127
+ }
128
+ export function runtimeEnvironment(editor, runtime, pristine, managed, injected) {
129
+ for (const [name, mapping] of Object.entries(runtime.mappings)) {
130
+ if (!eligibleEnvironmentMapping(mapping, runtime.state.ready))
131
+ continue;
132
+ const server = editor.get(name);
133
+ if (server?.type !== "local")
134
+ continue;
135
+ rememberEnvironment(name, mapping, runtime, pristine, managed, injected);
136
+ }
137
+ }
138
+ function eligibleEnvironmentMapping(mapping, ready) {
139
+ return ready && typeof mapping === "object" && !("remote" in mapping);
140
+ }
141
+ function rememberEnvironment(name, mapping, runtime, pristine, managed, injected) {
142
+ const values = environmentValues(mapping, runtime.state.environment, pristine.get(name));
143
+ if (Object.keys(values.injected).length === 0)
144
+ return;
145
+ managed.set(name, new Map([[runtime.id, values]]));
146
+ injected.set(name, values.injected);
147
+ }
148
+ function environmentValues(mapping, environment, originalEnvironment) {
149
+ const injected = {};
150
+ const original = {};
151
+ for (const output of Object.keys(mapping)) {
152
+ const value = environment[mapping[output]];
153
+ if (value === undefined)
154
+ continue;
155
+ injected[output] = value;
156
+ original[output] = originalEnvironment?.[output];
157
+ }
158
+ return { original, injected };
159
+ }
160
+ export function selectRuntime(runtimes, bindings, selector) {
161
+ if (!selector?.scope && !selector?.server)
162
+ return defaultRuntime(runtimes);
163
+ const scope = selector.scope ?? (selector.server === undefined ? undefined : bindings[selector.server]);
164
+ return validSelection(scope, selector?.server, bindings) ? runtimes.get(scope) : undefined;
165
+ }
166
+ function defaultRuntime(runtimes) {
167
+ return runtimes.get("global") ?? runtimes.get("project");
168
+ }
169
+ function validSelection(scope, server, bindings) {
170
+ return scope !== undefined && (server === undefined || bindings[server] === scope);
171
+ }
172
+ export function aggregatePhase(base, scopes) {
173
+ const active = scopes.filter((item) => item.activation !== "awaiting_activation");
174
+ const unstable = active.some((item) => item.phase === "failed" || item.phase === "starting");
175
+ if (unstable)
176
+ return active.some((item) => item.phase === "ready") ? "degraded" : base;
177
+ return active.every((item) => item.phase === "ready") ? "ready" : base;
178
+ }
179
+ export function projectFallback(configuration) {
180
+ if (!configuration.project)
181
+ return undefined;
182
+ return {
183
+ scope: "project",
184
+ projectDirectory: configuration.project.sourceRoot,
185
+ phase: "stopped",
186
+ generation: 0,
187
+ activation: configuration.activation === "auto" ? "auto" : "awaiting_activation",
188
+ diagnostics: configuration.diagnostics,
189
+ };
190
+ }
191
+ export function applyRuntimeProtection(editor, runtime, explicitlyDisabled) {
192
+ for (const name of Object.keys(runtime.mappings)) {
193
+ if (explicitlyDisabled.has(name))
194
+ continue;
195
+ editor.update(name, (config) => {
196
+ config.disabled = undefined;
197
+ });
198
+ }
199
+ applyProtection(editor, { ...runtime.group.options.adapter, servers: runtime.mappings }, {
200
+ ...runtime.state,
201
+ explicitlyDisabled,
202
+ remoteHandles: runtime.remote.handles,
203
+ });
204
+ }
205
+ export function disableProjectServers(editor, configuration, inactive) {
206
+ for (const [name] of Object.entries(configuration.project?.servers ?? {})) {
207
+ if (configuration.bindings[name] !== "project")
208
+ continue;
209
+ editor.update(name, (config) => {
210
+ config.disabled = true;
211
+ });
212
+ }
213
+ for (const name of inactive)
214
+ editor.update(name, (config) => {
215
+ config.disabled = true;
216
+ });
217
+ }
218
+ export function selectedStatus(runtime, configuration, selector) {
219
+ if (runtime) {
220
+ const scoped = groupStatus(runtime, runtime.id === "project" ? configuration.activation : "auto");
221
+ return {
222
+ phase: scoped.phase,
223
+ projectDirectory: scoped.projectDirectory,
224
+ generation: scoped.generation,
225
+ ...safeFields(scoped),
226
+ scopes: [scoped],
227
+ bindings: configuration.bindings,
228
+ };
229
+ }
230
+ return {
231
+ phase: "failed",
232
+ projectDirectory: configuration.global.sourceRoot,
233
+ generation: 0,
234
+ diagnostics: [
235
+ {
236
+ code: "server_unbound",
237
+ server: selector.server ?? "",
238
+ message: "server is not bound to an active scope",
239
+ },
240
+ ],
241
+ };
242
+ }
243
+ function safeFields(status) {
244
+ return {
245
+ ...(status.pid === undefined ? {} : { pid: status.pid }),
246
+ ...(status.lastRefreshAt === undefined ? {} : { lastRefreshAt: status.lastRefreshAt }),
247
+ ...(status.error === undefined ? {} : { error: status.error }),
248
+ ...(status.diagnostics === undefined ? {} : { diagnostics: status.diagnostics }),
249
+ };
250
+ }
251
+ export function statusBase(global, project, configuration) {
252
+ if (global?.status)
253
+ return global.status;
254
+ if (global)
255
+ return { phase: "starting", projectDirectory: global.group.sourceRoot, generation: 0 };
256
+ if (project)
257
+ return {
258
+ phase: project.phase,
259
+ projectDirectory: project.projectDirectory,
260
+ generation: project.generation,
261
+ ...(project.error === undefined ? {} : { error: project.error }),
262
+ };
263
+ return { phase: "stopped", projectDirectory: configuration.global.sourceRoot, generation: 0 };
264
+ }
265
+ export function statusScopes(global, project) {
266
+ return [...(global ? [groupStatus(global, "auto")] : []), ...(project ? [project] : [])];
267
+ }
268
+ //# sourceMappingURL=controller-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller-helpers.js","sourceRoot":"","sources":["../../src/scopes/controller-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Scope } from "effect";
2
+ import type { BrokerLease } from "../broker-registry.js";
3
+ import type { ScopeId, SafeStatus } from "../contracts.js";
4
+ import type { ServerProtection } from "../options.js";
5
+ import type { ProtectionState } from "../plugin.js";
6
+ import type { RemoteRelayCoordinator } from "../remote.js";
7
+ import type { ScopedGroup } from "../scoped-config.js";
8
+ export type Runtime = {
9
+ readonly id: ScopeId;
10
+ readonly group: ScopedGroup;
11
+ lease?: BrokerLease;
12
+ readonly remote: RemoteRelayCoordinator;
13
+ mappings: Readonly<Record<string, ServerProtection>>;
14
+ state: ProtectionState;
15
+ status?: SafeStatus;
16
+ observedGeneration: number;
17
+ active: boolean;
18
+ readonly scope: Scope.Closeable;
19
+ epoch: number;
20
+ transitioning: boolean;
21
+ };
22
+ //# sourceMappingURL=controller-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller-types.d.ts","sourceRoot":"","sources":["../../src/scopes/controller-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACrD,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=controller-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller-types.js","sourceRoot":"","sources":["../../src/scopes/controller-types.ts"],"names":[],"mappings":""}
package/dist/tui.d.ts CHANGED
@@ -2,6 +2,23 @@ import { Plugin } from "@opencode/plugin/tui";
2
2
  export interface SafeStatusView {
3
3
  readonly phase: string;
4
4
  readonly generation: number;
5
+ readonly activation?: "auto" | "manual" | "awaiting_activation";
6
+ readonly scopes?: readonly {
7
+ readonly scope: "global" | "project";
8
+ readonly phase: string;
9
+ readonly generation: number;
10
+ readonly activation?: "auto" | "manual" | "awaiting_activation";
11
+ readonly diagnostics?: readonly {
12
+ readonly server: string;
13
+ readonly code: string;
14
+ readonly message: string;
15
+ }[];
16
+ readonly error?: {
17
+ readonly code: string;
18
+ readonly message: string;
19
+ readonly retryable: boolean;
20
+ };
21
+ }[];
5
22
  readonly diagnostics?: readonly {
6
23
  readonly server: string;
7
24
  readonly code: string;
@@ -17,43 +34,24 @@ export interface TuiActions {
17
34
  readonly status: () => Promise<SafeStatusView>;
18
35
  readonly refresh: () => Promise<SafeStatusView>;
19
36
  readonly doctor: () => Promise<SafeStatusView>;
37
+ readonly activateProject?: () => Promise<SafeStatusView>;
38
+ readonly refreshProject?: () => Promise<SafeStatusView>;
39
+ readonly doctorProject?: () => Promise<SafeStatusView>;
20
40
  readonly show: (title: string, message: string, variant: "info" | "success" | "warning" | "error") => void;
21
41
  }
22
42
  export declare function formatStatus(status: SafeStatusView): string;
23
- export declare function createCommands(actions: TuiActions): readonly [{
24
- readonly id: "key-ferry.status";
25
- readonly title: "Key Ferry: Status";
26
- readonly description: "Show safe Key Ferry sidecar state";
27
- readonly group: "Varlock";
28
- readonly palette: true;
29
- readonly slash: {
30
- readonly name: "key-ferry-status";
31
- readonly aliases: string[];
32
- };
33
- readonly run: () => Promise<void>;
34
- }, {
35
- readonly id: "key-ferry.refresh";
36
- readonly title: "Key Ferry: Refresh";
37
- readonly description: "Refresh the protected project environment";
38
- readonly group: "Varlock";
39
- readonly palette: true;
40
- readonly slash: {
41
- readonly name: "key-ferry-refresh";
42
- readonly aliases: string[];
43
- };
44
- readonly run: () => Promise<void>;
45
- }, {
46
- readonly id: "key-ferry.doctor";
47
- readonly title: "Key Ferry: Doctor";
48
- readonly description: "Check Varlock readiness and protected connections";
49
- readonly group: "Varlock";
50
- readonly palette: true;
51
- readonly slash: {
52
- readonly name: "key-ferry-doctor";
53
- readonly aliases: string[];
43
+ export declare function createCommands(actions: TuiActions): {
44
+ id: string;
45
+ title: string;
46
+ description: string;
47
+ group: string;
48
+ palette: true;
49
+ slash: {
50
+ name: string;
51
+ aliases: string[];
54
52
  };
55
- readonly run: () => Promise<void>;
56
- }];
53
+ run: () => Promise<void>;
54
+ }[];
57
55
  declare const _default: Plugin.Definition;
58
56
  export default _default;
59
57
  //# sourceMappingURL=tui.d.ts.map
package/dist/tui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS;QAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,EAAE,CAAC;IACJ,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CACnG;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,CACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,KAC9C,IAAI,CAAC;CACX;AAuBD,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAO3D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU;;;;;;;;0BAuBe,MAAM,EAAE;;;;;;;;;;;0BASN,MAAM,EAAE;;;;;;;;;;;0BASV,MAAM,EAAE;;;GAIxE;;AAED,wBAwBG"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,qBAAqB,CAAC;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS;QACzB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;QACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,qBAAqB,CAAC;QAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS;YAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;YACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;SAC1B,EAAE,CAAC;QACJ,QAAQ,CAAC,KAAK,CAAC,EAAE;YACf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;YACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;SAC7B,CAAC;KACH,EAAE,CAAC;IACJ,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS;QAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,EAAE,CAAC;IACJ,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CACnG;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IACzD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IACxD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IACvD,QAAQ,CAAC,IAAI,EAAE,CACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,KAC9C,IAAI,CAAC;CACX;AAuBD,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAK3D;AA4JD,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU;;;;;;;;iBALU,MAAM,EAAE;;;IAOnE;;AAED,wBA2BG"}
package/dist/tui.js CHANGED
@@ -22,15 +22,102 @@ const errorMessage = (error) => {
22
22
  }
23
23
  };
24
24
  export function formatStatus(status) {
25
- const lines = status.error
25
+ const lines = formatOverview(status);
26
+ appendDiagnostics(lines, status.diagnostics);
27
+ for (const scope of status.scopes ?? [])
28
+ lines.push(...formatScope(scope));
29
+ return lines.join("\n");
30
+ }
31
+ function formatOverview(status) {
32
+ return status.error
26
33
  ? [`${status.error.message} (${status.error.code})`]
27
34
  : [`State: ${status.phase}`, `Generation: ${status.generation}`];
28
- for (const item of status.diagnostics ?? [])
29
- lines.push(`${item.server}: ${item.message} (${item.code})`);
30
- return lines.join("\n");
31
35
  }
32
- export function createCommands(actions) {
33
- const run = (title, operation, success) => async () => {
36
+ function appendDiagnostics(lines, diagnostics, prefix) {
37
+ for (const item of diagnostics ?? [])
38
+ lines.push(`${prefix ? `${prefix}/` : ""}${item.server}: ${item.message} (${item.code})`);
39
+ }
40
+ function formatScope(scope) {
41
+ const lines = [formatScopeHeader(scope)];
42
+ appendScopeError(lines, scope);
43
+ appendDiagnostics(lines, scope.diagnostics, scope.scope);
44
+ return lines;
45
+ }
46
+ function formatScopeHeader(scope) {
47
+ const activation = scope.activation ? `, ${scope.activation}` : "";
48
+ return `${scope.scope}: ${scope.phase} (generation ${scope.generation}${activation})`;
49
+ }
50
+ function appendScopeError(lines, scope) {
51
+ if (scope.error)
52
+ lines.push(`${scope.scope}: ${scope.error.message} (${scope.error.code})`);
53
+ }
54
+ const commandSpecs = [
55
+ {
56
+ id: "key-ferry.status",
57
+ title: "Key Ferry: Status",
58
+ description: "Show safe Key Ferry sidecar state",
59
+ slashName: "key-ferry-status",
60
+ alias: "vstatus",
61
+ toastTitle: "Varlock status",
62
+ success: "Status loaded",
63
+ operation: "status",
64
+ },
65
+ {
66
+ id: "key-ferry.refresh",
67
+ title: "Key Ferry: Refresh",
68
+ description: "Refresh the protected project environment",
69
+ slashName: "key-ferry-refresh",
70
+ alias: "vrefresh",
71
+ toastTitle: "Varlock refresh",
72
+ success: "Refresh completed",
73
+ operation: "refresh",
74
+ },
75
+ {
76
+ id: "key-ferry.doctor",
77
+ title: "Key Ferry: Doctor",
78
+ description: "Check Varlock readiness and protected connections",
79
+ slashName: "key-ferry-doctor",
80
+ alias: "vdoctor",
81
+ toastTitle: "Varlock doctor",
82
+ success: "Check completed",
83
+ operation: "doctor",
84
+ },
85
+ {
86
+ id: "key-ferry.project.activate",
87
+ title: "Key Ferry: Activate Project",
88
+ description: "Activate the protected project environment",
89
+ slashName: "key-ferry-project-activate",
90
+ alias: "vproject-activate",
91
+ toastTitle: "Varlock project activation",
92
+ success: "Project activation completed",
93
+ operation: "activateProject",
94
+ },
95
+ {
96
+ id: "key-ferry.project.refresh",
97
+ title: "Key Ferry: Refresh Project",
98
+ description: "Refresh the protected project environment",
99
+ slashName: "key-ferry-project-refresh",
100
+ alias: "vproject-refresh",
101
+ toastTitle: "Varlock project refresh",
102
+ success: "Project refresh completed",
103
+ operation: "refreshProject",
104
+ },
105
+ {
106
+ id: "key-ferry.project.doctor",
107
+ title: "Key Ferry: Doctor Project",
108
+ description: "Check project Varlock readiness",
109
+ slashName: "key-ferry-project-doctor",
110
+ alias: "vproject-doctor",
111
+ toastTitle: "Varlock project doctor",
112
+ success: "Project check completed",
113
+ operation: "doctorProject",
114
+ },
115
+ ];
116
+ const unavailable = async () => {
117
+ throw { code: "unavailable" };
118
+ };
119
+ function runCommand(actions, title, operation, success) {
120
+ return async () => {
34
121
  actions.show(title, "Working…", "info");
35
122
  try {
36
123
  const status = await operation();
@@ -40,35 +127,21 @@ export function createCommands(actions) {
40
127
  actions.show(title, errorMessage(error), "error");
41
128
  }
42
129
  };
43
- return [
44
- {
45
- id: "key-ferry.status",
46
- title: "Key Ferry: Status",
47
- description: "Show safe Key Ferry sidecar state",
48
- group: "Varlock",
49
- palette: true,
50
- slash: { name: "key-ferry-status", aliases: ["vstatus"] },
51
- run: run("Varlock status", actions.status, "Status loaded"),
52
- },
53
- {
54
- id: "key-ferry.refresh",
55
- title: "Key Ferry: Refresh",
56
- description: "Refresh the protected project environment",
57
- group: "Varlock",
58
- palette: true,
59
- slash: { name: "key-ferry-refresh", aliases: ["vrefresh"] },
60
- run: run("Varlock refresh", actions.refresh, "Refresh completed"),
61
- },
62
- {
63
- id: "key-ferry.doctor",
64
- title: "Key Ferry: Doctor",
65
- description: "Check Varlock readiness and protected connections",
66
- group: "Varlock",
67
- palette: true,
68
- slash: { name: "key-ferry-doctor", aliases: ["vdoctor"] },
69
- run: run("Varlock doctor", actions.doctor, "Check completed"),
70
- },
71
- ];
130
+ }
131
+ function createCommand(spec, actions) {
132
+ const operation = actions[spec.operation] ?? unavailable;
133
+ return {
134
+ id: spec.id,
135
+ title: spec.title,
136
+ description: spec.description,
137
+ group: "Varlock",
138
+ palette: true,
139
+ slash: { name: spec.slashName, aliases: [spec.alias] },
140
+ run: runCommand(actions, spec.toastTitle, operation, spec.success),
141
+ };
142
+ }
143
+ export function createCommands(actions) {
144
+ return commandSpecs.map((spec) => createCommand(spec, actions));
72
145
  }
73
146
  export default Plugin.define({
74
147
  id: "key-ferry.tui",
@@ -85,6 +158,9 @@ export default Plugin.define({
85
158
  status: () => rpc.status({}),
86
159
  refresh: () => rpc.refresh({}),
87
160
  doctor: () => rpc.doctor({}),
161
+ activateProject: () => rpc.activateProject({}),
162
+ refreshProject: () => rpc.refresh({ scope: "project" }),
163
+ doctorProject: () => rpc.doctor({ scope: "project" }),
88
164
  show,
89
165
  }),
90
166
  }));
package/dist/tui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
@@ -160,7 +160,8 @@ OpenCode host/TUI run.
160
160
  state transitions, fail-closed readiness, refresh, and acquire/release.
161
161
  4. `src/plugin.ts`: native V2 plugin layer, local/remote MCP transforms, RPC,
162
162
  relay lifecycle, and cleanup.
163
- 5. `src/rpc.ts`: secret-free status and refresh RPC definitions.
163
+ 5. `src/rpc.ts`: secret-free status, refresh, doctor, and activateProject RPC
164
+ definitions.
164
165
  6. `src/options.ts`: validation of explicit project-scoped configuration.
165
166
  7. `src/tui.ts`: optional status/refresh UX over the RPC shape.
166
167
  8. `src/remote.ts`: adapter-side remote relay contract, target/header
@@ -177,3 +178,28 @@ ambient environment variables.
177
178
  Cleanup is scope-owned and project-owned: it stops only the sidecar and relay
178
179
  resources acquired by this plugin instance. It does not perform a global
179
180
  Varlock shutdown and does not claim full sandbox isolation.
181
+
182
+ ## Global and project scopes
183
+
184
+ The plugin may be installed once in native global OpenCode configuration. Its
185
+ `projectConfig.enabled` option is `false` by default, preserving the original
186
+ single-project behavior. When enabled, the loader reads the optional
187
+ `.opencode/key-ferry.jsonc` from the canonical current project root. The global
188
+ and project scopes have independent Varlock roots, managers, mappings, and
189
+ keysets; project configuration never imports or unions global mappings.
190
+
191
+ Project `servers` use the same validated mapping shape as native plugin
192
+ options. Reusing a global server name requires listing it in `overrides`; other
193
+ name collisions fail closed. `projectDirectory`, when present in the project
194
+ file, must resolve within the canonical project root. The global activation
195
+ policy is a floor: global manual policy cannot be escalated by a project, and
196
+ project manual policy can restrict global auto activation. Manual activation is
197
+ an in-memory current-location action, not an enrollment store.
198
+
199
+ A registry deduplicates identical global managers across contexts while keeping
200
+ project managers local. Broker startup is readiness-gated: protected MCP
201
+ servers remain disabled while a group starts, and a failure in one group does
202
+ not stop a healthy group. File watching and configuration reload are local to
203
+ the project group. Status, refresh, and doctor do not activate inactive groups;
204
+ `activateProject` is the explicit one-time activation operation for a manual
205
+ project.