@onlyne/mcp-gateway 3.1.0 → 3.2.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 +25 -1
- package/dist/config.d.ts +69 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +210 -0
- package/dist/config.js.map +1 -0
- package/dist/cron.d.ts +23 -0
- package/dist/cron.d.ts.map +1 -0
- package/dist/cron.js +112 -0
- package/dist/cron.js.map +1 -0
- package/dist/exec.d.ts +33 -0
- package/dist/exec.d.ts.map +1 -0
- package/dist/exec.js +155 -0
- package/dist/exec.js.map +1 -0
- package/dist/gateway-text.d.ts +26 -0
- package/dist/gateway-text.d.ts.map +1 -0
- package/dist/gateway-text.js +47 -0
- package/dist/gateway-text.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +274 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/{src/main.ts → dist/main.js} +20 -32
- package/dist/main.js.map +1 -0
- package/dist/mounts.d.ts +151 -0
- package/dist/mounts.d.ts.map +1 -0
- package/dist/mounts.js +927 -0
- package/dist/mounts.js.map +1 -0
- package/package.json +17 -12
- package/src/config.ts +0 -182
- package/src/cron.ts +0 -122
- package/src/exec.ts +0 -163
- package/src/gateway-text.ts +0 -51
- package/src/index.ts +0 -214
- package/src/mounts.ts +0 -1043
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
-
import { createLogger, createNodeKey, startNodeHost
|
|
2
|
+
import { createLogger, createNodeKey, startNodeHost } from '@onlyne/node-host';
|
|
3
3
|
import { resolveLocale, setLocale } from '@onlyne/node-host/i18n';
|
|
4
4
|
import { dirname, join } from 'node:path';
|
|
5
5
|
import { loadConfig } from './config.js';
|
|
6
|
-
import { createMcpGateway
|
|
6
|
+
import { createMcpGateway } from './index.js';
|
|
7
7
|
import { t } from './gateway-text.js';
|
|
8
|
-
|
|
9
8
|
const path = process.argv[2];
|
|
10
9
|
if (path === undefined) {
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
console.error(t('cli.usage'));
|
|
11
|
+
process.exit(2);
|
|
13
12
|
}
|
|
14
|
-
|
|
15
13
|
const config = await loadConfig(path);
|
|
16
14
|
// The configured language wins over the environment for everything this process prints; the
|
|
17
15
|
// logger and the node host below are built after this point so their text follows it too.
|
|
@@ -20,46 +18,36 @@ setLocale(resolveLocale(config.language));
|
|
|
20
18
|
// beside the store; the ring alone would vanish with the process. `ONLYNE_NO_TUI=1` asks for
|
|
21
19
|
// the JSON log even on a terminal, so the operator keeps a machine-readable stream.
|
|
22
20
|
const forceJson = process.env.ONLYNE_NO_TUI === '1';
|
|
23
|
-
const { log, ring } = createLogger(
|
|
24
|
-
forceJson || !(process.stdin.isTTY && process.stdout.isTTY), 200, join(dirname(config.storage_path), 'gateway.log'),
|
|
25
|
-
);
|
|
21
|
+
const { log, ring } = createLogger(forceJson || !(process.stdin.isTTY && process.stdout.isTTY), 200, join(dirname(config.storage_path), 'gateway.log'));
|
|
26
22
|
// RFC 0017 §2: the CLI is always keyed, and a missing key is generated and saved under
|
|
27
23
|
// ~/.config/onlyne/keys/<node-id>/ instead of being a hand-written prerequisite.
|
|
28
24
|
const keys = await createNodeKey(config.node.id);
|
|
29
25
|
// The advertised endpoint must carry the port the process actually bound, which is only
|
|
30
26
|
// known after `Bun.serve` when the configuration asks for port 0.
|
|
31
|
-
let handler
|
|
32
|
-
new Response(t('startup.pending'), { status: 503 });
|
|
27
|
+
let handler = async () => new Response(t('startup.pending'), { status: 503 });
|
|
33
28
|
const server = Bun.serve({ hostname: config.server.bind, port: config.server.port, fetch: request => handler(request) });
|
|
34
29
|
config.server.port = server.port ?? config.server.port;
|
|
35
30
|
const endpoint = `http://${config.server.bind}:${config.server.port}/onlyne/v3`;
|
|
36
|
-
|
|
37
|
-
const gateway: McpGateway = await createMcpGateway(config, { keys, log });
|
|
31
|
+
const gateway = await createMcpGateway(config, { keys, log });
|
|
38
32
|
handler = request => gateway.node.fetch(request);
|
|
39
33
|
gateway.node.client.runMaintenance();
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
// the node host owns how they are drawn.
|
|
44
|
-
type NodeHostSurface = NodeHostOptions & { status?: () => Promise<string[]> };
|
|
45
|
-
const hostOptions: NodeHostSurface = {
|
|
46
|
-
node: gateway.node, endpoint, bind: config.server.bind, ring, log,
|
|
47
|
-
status: () => gateway.status(),
|
|
34
|
+
const hostOptions = {
|
|
35
|
+
node: gateway.node, endpoint, bind: config.server.bind, ring, log,
|
|
36
|
+
status: () => gateway.status(),
|
|
48
37
|
};
|
|
49
38
|
const host = await startNodeHost(hostOptions);
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
process.exit(0);
|
|
39
|
+
const shutdown = async () => {
|
|
40
|
+
await host.close();
|
|
41
|
+
await gateway.stop();
|
|
42
|
+
server.stop(true);
|
|
43
|
+
log('mcp.gateway.stopped', { node: config.node.id });
|
|
44
|
+
process.exit(0);
|
|
57
45
|
};
|
|
58
46
|
process.on('SIGINT', () => { void shutdown(); });
|
|
59
47
|
process.on('SIGTERM', () => { void shutdown(); });
|
|
60
|
-
|
|
61
48
|
log('mcp.gateway.listening', {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
49
|
+
node: config.node.id,
|
|
50
|
+
endpoint,
|
|
51
|
+
servers: config.servers.map(entry => entry.name),
|
|
65
52
|
});
|
|
53
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/mounts.d.ts
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { type Json, type Message, type NodeId, type Resource, type ResourceDriver, type SendOutcome, type Storage, type ThreadRef } from '@onlyne/lib';
|
|
2
|
+
import type { McpOutcome } from '@onlyne/mcp-core';
|
|
3
|
+
import type { MountsConfig } from './config.js';
|
|
4
|
+
/** The scheduler's resource ids carry this prefix, so one driver routes MCP servers and mounts apart. */
|
|
5
|
+
export declare const MOUNTS_RESOURCE_PREFIX = "mounts:";
|
|
6
|
+
export declare const MOUNT_OPERATIONS: readonly ["mount", "update", "list", "inspect", "runs", "cancel", "resume", "remove"];
|
|
7
|
+
export declare const mountsResourceId: (controller: NodeId) => string;
|
|
8
|
+
export type MountSchedule = {
|
|
9
|
+
kind: 'interval';
|
|
10
|
+
every_ms: number;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'cron';
|
|
13
|
+
expression: string;
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'once';
|
|
16
|
+
at: string;
|
|
17
|
+
};
|
|
18
|
+
export type MountAction = {
|
|
19
|
+
kind: 'command';
|
|
20
|
+
command: string;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'mcp';
|
|
23
|
+
server: string;
|
|
24
|
+
tool: string;
|
|
25
|
+
arguments?: Json;
|
|
26
|
+
};
|
|
27
|
+
export type MountTaskState = 'active' | 'cancelled' | 'completed' | 'removed';
|
|
28
|
+
export type MountRunState = 'running' | 'succeeded' | 'failed' | 'unknown' | 'cancelled' | 'interrupted' | 'skipped';
|
|
29
|
+
export type MountPushState = 'pending' | 'unknown' | 'accepted' | 'refused' | 'expired';
|
|
30
|
+
export interface MountError {
|
|
31
|
+
code: string;
|
|
32
|
+
message: string;
|
|
33
|
+
}
|
|
34
|
+
export interface MountPush {
|
|
35
|
+
message_id: string;
|
|
36
|
+
state: MountPushState;
|
|
37
|
+
attempts: number;
|
|
38
|
+
retry_until: string;
|
|
39
|
+
next_attempt_at?: string;
|
|
40
|
+
receipt?: {
|
|
41
|
+
thread: ThreadRef;
|
|
42
|
+
seq: string;
|
|
43
|
+
};
|
|
44
|
+
error?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface MountRunSummary {
|
|
47
|
+
id: string;
|
|
48
|
+
state: MountRunState;
|
|
49
|
+
started_at: string;
|
|
50
|
+
finished_at: string | null;
|
|
51
|
+
exit_code: number | null;
|
|
52
|
+
}
|
|
53
|
+
export interface MountChange {
|
|
54
|
+
at: string;
|
|
55
|
+
actor: NodeId;
|
|
56
|
+
action: 'mount' | 'update' | 'cancel' | 'resume' | 'remove';
|
|
57
|
+
title?: string;
|
|
58
|
+
schedule?: MountSchedule;
|
|
59
|
+
definition?: MountAction;
|
|
60
|
+
}
|
|
61
|
+
export interface MountTask {
|
|
62
|
+
id: string;
|
|
63
|
+
controller: NodeId;
|
|
64
|
+
state: MountTaskState;
|
|
65
|
+
title?: string;
|
|
66
|
+
schedule: MountSchedule;
|
|
67
|
+
action: MountAction;
|
|
68
|
+
next_run_at: string | null;
|
|
69
|
+
/** One thread per task: every run result lands there, so the controller reads a conversation. */
|
|
70
|
+
thread: ThreadRef;
|
|
71
|
+
created_at: string;
|
|
72
|
+
updated_at: string;
|
|
73
|
+
changes: MountChange[];
|
|
74
|
+
last_run: MountRunSummary | null;
|
|
75
|
+
}
|
|
76
|
+
export interface MountRun {
|
|
77
|
+
id: string;
|
|
78
|
+
task_id: string;
|
|
79
|
+
controller: NodeId;
|
|
80
|
+
/** The definition snapshot this run started with; a later update never rewrites it. */
|
|
81
|
+
action: MountAction;
|
|
82
|
+
thread: ThreadRef;
|
|
83
|
+
state: MountRunState;
|
|
84
|
+
started_at: string;
|
|
85
|
+
finished_at: string | null;
|
|
86
|
+
/** The process exit status; `null` for an MCP tool call and for a run that never produced one. */
|
|
87
|
+
exit_code: number | null;
|
|
88
|
+
output_summary: string;
|
|
89
|
+
output_bytes: number;
|
|
90
|
+
error: MountError | null;
|
|
91
|
+
/** Absent for a skipped occurrence: nothing ran, so there is nothing to push. */
|
|
92
|
+
push?: MountPush;
|
|
93
|
+
}
|
|
94
|
+
/** The host seams the scheduler needs; the gateway binds them to its node, tests bind their own. */
|
|
95
|
+
export interface MountTransport {
|
|
96
|
+
ensureThread(threadId: string, title: string): Promise<void>;
|
|
97
|
+
resolveTarget(node: NodeId): Promise<void>;
|
|
98
|
+
send(controller: NodeId, message: Message): Promise<SendOutcome>;
|
|
99
|
+
}
|
|
100
|
+
export interface MountConnection {
|
|
101
|
+
readonly tools: ReadonlyArray<{
|
|
102
|
+
name: string;
|
|
103
|
+
annotations?: {
|
|
104
|
+
readOnlyHint?: boolean;
|
|
105
|
+
};
|
|
106
|
+
}>;
|
|
107
|
+
/** Policy check, then one catalog refresh when the name is not yet pinned. */
|
|
108
|
+
resolveTool(name: string): Promise<{
|
|
109
|
+
name: string;
|
|
110
|
+
annotations?: {
|
|
111
|
+
readOnlyHint?: boolean;
|
|
112
|
+
};
|
|
113
|
+
}>;
|
|
114
|
+
call(name: string, arguments_: Json): Promise<McpOutcome>;
|
|
115
|
+
}
|
|
116
|
+
export interface MountServiceOptions {
|
|
117
|
+
owner: NodeId;
|
|
118
|
+
config: MountsConfig | undefined;
|
|
119
|
+
servers: ReadonlyArray<{
|
|
120
|
+
name: string;
|
|
121
|
+
controllers?: NodeId[];
|
|
122
|
+
}>;
|
|
123
|
+
storage: Storage;
|
|
124
|
+
connections: ReadonlyMap<string, MountConnection>;
|
|
125
|
+
transport: MountTransport;
|
|
126
|
+
log?(message: string, fields?: Record<string, unknown>): void;
|
|
127
|
+
now?(): number;
|
|
128
|
+
}
|
|
129
|
+
export interface MountService {
|
|
130
|
+
readonly driver: ResourceDriver;
|
|
131
|
+
/** Loads the store, repairs interrupted runs, and schedules the first pass. */
|
|
132
|
+
start(): Promise<void>;
|
|
133
|
+
/** Stops the timer, signals every child it started, and records the runs as interrupted. */
|
|
134
|
+
stop(): Promise<void>;
|
|
135
|
+
/** One scheduling pass: retry unfinished pushes, then start every due task. */
|
|
136
|
+
tick(): Promise<void>;
|
|
137
|
+
/** Display lines for the node host's TUI: global categories first, per-task detail last. */
|
|
138
|
+
status(): Promise<string[]>;
|
|
139
|
+
resources(): Array<{
|
|
140
|
+
controller: NodeId;
|
|
141
|
+
resource: Resource;
|
|
142
|
+
}>;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* The persistent scheduler: task records, the run ledger and the result-push queue all live in
|
|
146
|
+
* the node's store. A mount's definition is immutable for the run it started; a crash between
|
|
147
|
+
* start and finish is recorded as `interrupted`, never silently retried, so an external effect
|
|
148
|
+
* is never claimed to be exactly-once.
|
|
149
|
+
*/
|
|
150
|
+
export declare function createMountService(options: MountServiceOptions): MountService;
|
|
151
|
+
//# sourceMappingURL=mounts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mounts.d.ts","sourceRoot":"","sources":["../src/mounts.ts"],"names":[],"mappings":"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"}
|