@stage-labs/metro 0.1.0-beta.305 → 0.1.0-beta.307

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 (49) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/memory.js +2 -3
  3. package/dist/runtime-install.js +3 -11
  4. package/dist/voice.js +1 -1
  5. package/{runtime/marketplace/plugin/bin → hooks}/guard.mjs +9 -4
  6. package/{runtime/marketplace/plugin/bin → hooks}/session-start.mjs +2 -2
  7. package/package.json +4 -2
  8. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/home-fs.ts +2 -29
  9. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/provision.ts +2 -15
  10. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/user.ts +0 -1
  11. package/runtime/node_modules/@metro-labs/daemon/src/agent-user/view.ts +3 -3
  12. package/runtime/node_modules/@metro-labs/daemon/src/boot/boot.ts +15 -10
  13. package/runtime/node_modules/@metro-labs/daemon/src/claude/cli-files.ts +28 -0
  14. package/runtime/node_modules/@metro-labs/daemon/src/claude/hooks.ts +60 -0
  15. package/runtime/node_modules/@metro-labs/daemon/src/claude/plugin-cleanup.ts +121 -0
  16. package/runtime/node_modules/@metro-labs/daemon/src/claude/session.ts +1 -1
  17. package/runtime/node_modules/@metro-labs/daemon/src/claude/setup.ts +37 -30
  18. package/runtime/node_modules/@metro-labs/daemon/src/connectors/agent-key.ts +9 -12
  19. package/runtime/node_modules/@metro-labs/daemon/src/connectors/enroll-api.ts +1 -1
  20. package/runtime/node_modules/@metro-labs/daemon/src/connectors/leftovers.ts +59 -0
  21. package/runtime/node_modules/@metro-labs/daemon/src/mcp/index.ts +6 -0
  22. package/runtime/node_modules/@metro-labs/daemon/src/mcp/instructions.ts +4 -2
  23. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-gate.ts +2 -1
  24. package/runtime/node_modules/@metro-labs/daemon/src/mcp/policy-snapshot.ts +2 -2
  25. package/runtime/node_modules/@metro-labs/daemon/src/mcp/server-approvals.ts +1 -1
  26. package/runtime/node_modules/@metro-labs/daemon/src/mcp/session.ts +4 -0
  27. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-catalog.ts +20 -8
  28. package/runtime/node_modules/@metro-labs/daemon/src/mcp/tool-dispatch.ts +14 -8
  29. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/config.ts +0 -2
  30. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/connector-tools.ts +114 -0
  31. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/link.ts +12 -1
  32. package/runtime/node_modules/@metro-labs/daemon/src/mcp-server/rpc.ts +67 -0
  33. package/runtime/node_modules/@metro-labs/http/package.json +2 -1
  34. package/runtime/node_modules/@metro-labs/http/src/agent-signature.ts +5 -20
  35. package/runtime/node_modules/@metro-labs/http/src/mcp-server-protocol.ts +9 -4
  36. package/runtime/node_modules/@metro-labs/http/src/mcp-server-tools.ts +93 -0
  37. package/runtime/runtime.json +1 -1
  38. package/runtime/sdk-runner/runner.json +1 -1
  39. package/{runtime/marketplace/plugin → skills}/METRO.md +8 -3
  40. package/runtime/marketplace/.claude-plugin/marketplace.json +0 -12
  41. package/runtime/marketplace/plugin/.claude-plugin/plugin.json +0 -16
  42. package/runtime/marketplace/plugin/.mcp.json +0 -1
  43. package/runtime/marketplace/plugin/bin/metro-plugin.mjs +0 -24
  44. package/runtime/marketplace/plugin/hooks/hooks.json +0 -25
  45. package/runtime/node_modules/@metro-labs/daemon/src/claude/plugin-install.ts +0 -149
  46. package/runtime/node_modules/@metro-labs/daemon/src/connectors/plugin-sync.ts +0 -100
  47. /package/{runtime/marketplace/plugin/bin → hooks}/policy.mjs +0 -0
  48. /package/{runtime/marketplace/plugin → skills}/MEMORY.md +0 -0
  49. /package/{runtime/marketplace/plugin → skills}/STAGE.md +0 -0
@@ -1,100 +0,0 @@
1
- import { existsSync, readdirEntries, readFileSync } from '../agent-user/agent-fs.js';
2
- import { writeHomeInPlace } from '../agent-user/home-fs.js';
3
- import { agentMarketplaceDir, agentUser } from '../agent-user/user.js';
4
- import { join } from 'node:path';
5
- import { errMsg, log } from '@metro-labs/core/log';
6
- import { claudeDir } from '../claude/files.js';
7
- import { MCP_SERVER_KEY, mcpServerUrl } from '../mcp-server/config.js';
8
-
9
- const MARKER = join('bin', 'metro-plugin.mjs');
10
- const FILE = '.mcp.json';
11
- const MCP_HELPER = 'node "${CLAUDE_PLUGIN_ROOT}/bin/metro-plugin.mjs" mcp-headers';
12
-
13
- interface PluginServer {
14
- type: 'http';
15
- url: string;
16
- headersHelper: string;
17
- }
18
-
19
- const pluginServers = (url: string | null): Record<string, PluginServer> =>
20
- url === null ? {} : { [MCP_SERVER_KEY]: { type: 'http', url, headersHelper: MCP_HELPER } };
21
-
22
- const SEARCH_DEPTH = 5;
23
-
24
- function pluginRootsUnder(dir: string, depth: number, out: string[]): void {
25
- if (depth < 0 || out.length >= 8) return;
26
- let entries;
27
- try {
28
- entries = readdirEntries(dir);
29
- } catch {
30
- return;
31
- }
32
- if (entries.some((e) => e.name === 'bin' && e.isDirectory()) && existsSync(join(dir, MARKER))) {
33
- out.push(dir);
34
- return;
35
- }
36
- for (const entry of entries)
37
- if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules')
38
- pluginRootsUnder(join(dir, entry.name), depth - 1, out);
39
- }
40
-
41
- function stagedPluginDir(env: NodeJS.ProcessEnv = process.env): string | null {
42
- const store = env.METRO_RUNTIME_STORE?.trim() ?? '';
43
- if (store === '') return null;
44
- const user = agentUser();
45
- return join(user === null ? join(store, 'marketplace') : agentMarketplaceDir(user), 'plugin');
46
- }
47
-
48
- export function installedPluginFiles(dir = claudeDir(), staged = stagedPluginDir()): string[] {
49
- const roots: string[] = [];
50
- const root = join(dir, 'plugins');
51
- if (existsSync(root)) pluginRootsUnder(root, SEARCH_DEPTH, roots);
52
- if (staged !== null && existsSync(join(staged, MARKER)) && !roots.includes(staged)) roots.push(staged);
53
- return roots.map((found) => join(found, FILE));
54
- }
55
-
56
- const readOrNull = (path: string): string | null => {
57
- try {
58
- return readFileSync(path, 'utf8');
59
- } catch {
60
- return null;
61
- }
62
- };
63
-
64
- function writeIfChanged(path: string, text: string): boolean {
65
- if (readOrNull(path) === text) return false;
66
- writeHomeInPlace(path, text, 0o644);
67
- return true;
68
- }
69
-
70
- export interface PluginSyncOptions {
71
- dir?: string;
72
- staged?: string | null;
73
- url?: string | null;
74
- }
75
-
76
- function filesFor(opts: PluginSyncOptions): string[] {
77
- const staged = opts.staged === undefined ? stagedPluginDir() : opts.staged;
78
- return installedPluginFiles(opts.dir ?? claudeDir(), staged);
79
- }
80
-
81
- export function syncPluginServers(opts: PluginSyncOptions = {}): number {
82
- const files = filesFor(opts);
83
- if (files.length === 0) return 0;
84
- const servers = pluginServers(opts.url === undefined ? mcpServerUrl() : opts.url);
85
- const text = `${JSON.stringify(servers, null, 2)}\n`;
86
- let written = 0;
87
- for (const file of files) {
88
- try {
89
- if (writeIfChanged(file, text)) written += 1;
90
- } catch (err) {
91
- log.warn({ file, err: errMsg(err) }, 'plugin: could not write the MCP servers');
92
- }
93
- }
94
- if (written > 0)
95
- log.info(
96
- { files: written, servers: Object.keys(servers) },
97
- 'plugin: MCP servers written; run /reload-plugins --force to pick them up in a running session',
98
- );
99
- return written;
100
- }
File without changes