@pcircle/memesh 4.7.3 → 4.8.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +3 -1
- package/README.de.md +42 -16
- package/README.md +46 -19
- package/README.zh-TW.md +42 -17
- package/dashboard/dist/index.html +1 -1
- package/dist/core/agent-message-storage.d.ts +76 -0
- package/dist/core/agent-message-storage.d.ts.map +1 -0
- package/dist/core/agent-message-storage.js +359 -0
- package/dist/core/agent-message-storage.js.map +1 -0
- package/dist/core/agent-messaging.d.ts +224 -0
- package/dist/core/agent-messaging.d.ts.map +1 -0
- package/dist/core/agent-messaging.js +881 -0
- package/dist/core/agent-messaging.js.map +1 -0
- package/dist/core/agent-router.d.ts +194 -0
- package/dist/core/agent-router.d.ts.map +1 -0
- package/dist/core/agent-router.js +1138 -0
- package/dist/core/agent-router.js.map +1 -0
- package/dist/core/briefing.d.ts.map +1 -1
- package/dist/core/briefing.js +8 -1
- package/dist/core/briefing.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/doctor.d.ts +19 -0
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js +176 -2
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/dreamer.d.ts +8 -5
- package/dist/core/dreamer.d.ts.map +1 -1
- package/dist/core/dreamer.js +88 -3
- package/dist/core/dreamer.js.map +1 -1
- package/dist/core/product-improvements.d.ts +61 -0
- package/dist/core/product-improvements.d.ts.map +1 -0
- package/dist/core/product-improvements.js +216 -0
- package/dist/core/product-improvements.js.map +1 -0
- package/dist/core/repo-state.d.ts +11 -0
- package/dist/core/repo-state.d.ts.map +1 -0
- package/dist/core/repo-state.js +70 -0
- package/dist/core/repo-state.js.map +1 -0
- package/dist/core/schema-export.d.ts.map +1 -1
- package/dist/core/schema-export.js +70 -0
- package/dist/core/schema-export.js.map +1 -1
- package/dist/core/task-state.d.ts.map +1 -1
- package/dist/core/task-state.js +3 -3
- package/dist/core/task-state.js.map +1 -1
- package/dist/core/updater.d.ts +2 -0
- package/dist/core/updater.d.ts.map +1 -1
- package/dist/core/updater.js +11 -5
- package/dist/core/updater.js.map +1 -1
- package/dist/core/work-topology.d.ts.map +1 -1
- package/dist/core/work-topology.js +1 -0
- package/dist/core/work-topology.js.map +1 -1
- package/dist/host-adapters/acp-client.d.ts +147 -0
- package/dist/host-adapters/acp-client.d.ts.map +1 -0
- package/dist/host-adapters/acp-client.js +793 -0
- package/dist/host-adapters/acp-client.js.map +1 -0
- package/dist/host-adapters/claude-channel.d.ts +75 -0
- package/dist/host-adapters/claude-channel.d.ts.map +1 -0
- package/dist/host-adapters/claude-channel.js +255 -0
- package/dist/host-adapters/claude-channel.js.map +1 -0
- package/dist/host-adapters/codex-app-server.d.ts +83 -0
- package/dist/host-adapters/codex-app-server.d.ts.map +1 -0
- package/dist/host-adapters/codex-app-server.js +360 -0
- package/dist/host-adapters/codex-app-server.js.map +1 -0
- package/dist/host-adapters/codex-cli-queue.d.ts +17 -0
- package/dist/host-adapters/codex-cli-queue.d.ts.map +1 -0
- package/dist/host-adapters/codex-cli-queue.js +85 -0
- package/dist/host-adapters/codex-cli-queue.js.map +1 -0
- package/dist/host-runtime/acp.d.ts +57 -0
- package/dist/host-runtime/acp.d.ts.map +1 -0
- package/dist/host-runtime/acp.js +330 -0
- package/dist/host-runtime/acp.js.map +1 -0
- package/dist/host-runtime/claude.d.ts +41 -0
- package/dist/host-runtime/claude.d.ts.map +1 -0
- package/dist/host-runtime/claude.js +213 -0
- package/dist/host-runtime/claude.js.map +1 -0
- package/dist/host-runtime/codex-session.d.ts +24 -0
- package/dist/host-runtime/codex-session.d.ts.map +1 -0
- package/dist/host-runtime/codex-session.js +98 -0
- package/dist/host-runtime/codex-session.js.map +1 -0
- package/dist/host-runtime/codex.d.ts +33 -0
- package/dist/host-runtime/codex.d.ts.map +1 -0
- package/dist/host-runtime/codex.js +215 -0
- package/dist/host-runtime/codex.js.map +1 -0
- package/dist/host-runtime/config.d.ts +9 -0
- package/dist/host-runtime/config.d.ts.map +1 -0
- package/dist/host-runtime/config.js +91 -0
- package/dist/host-runtime/config.js.map +1 -0
- package/dist/host-runtime/router-client.d.ts +38 -0
- package/dist/host-runtime/router-client.d.ts.map +1 -0
- package/dist/host-runtime/router-client.js +463 -0
- package/dist/host-runtime/router-client.js.map +1 -0
- package/dist/host-runtime/router.d.ts +3 -0
- package/dist/host-runtime/router.d.ts.map +1 -0
- package/dist/host-runtime/router.js +43 -0
- package/dist/host-runtime/router.js.map +1 -0
- package/dist/mcp/server.js +2 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills-manifest.json +22 -17
- package/dist/storage/conflicts.d.ts.map +1 -1
- package/dist/storage/conflicts.js +8 -1
- package/dist/storage/conflicts.js.map +1 -1
- package/dist/storage/schema.d.ts +1 -1
- package/dist/storage/schema.d.ts.map +1 -1
- package/dist/storage/schema.js +255 -0
- package/dist/storage/schema.js.map +1 -1
- package/dist/transports/agent-messaging.d.ts +11 -0
- package/dist/transports/agent-messaging.d.ts.map +1 -0
- package/dist/transports/agent-messaging.js +273 -0
- package/dist/transports/agent-messaging.js.map +1 -0
- package/dist/transports/cli/cli.d.ts +1 -1
- package/dist/transports/cli/cli.d.ts.map +1 -1
- package/dist/transports/cli/cli.js +376 -12
- package/dist/transports/cli/cli.js.map +1 -1
- package/dist/transports/http/server.d.ts.map +1 -1
- package/dist/transports/http/server.js +31 -2
- package/dist/transports/http/server.js.map +1 -1
- package/dist/transports/mcp/handlers.d.ts +152 -1
- package/dist/transports/mcp/handlers.d.ts.map +1 -1
- package/dist/transports/mcp/handlers.js +108 -3
- package/dist/transports/mcp/handlers.js.map +1 -1
- package/dist/transports/schemas.d.ts +106 -1
- package/dist/transports/schemas.d.ts.map +1 -1
- package/dist/transports/schemas.js +86 -0
- package/dist/transports/schemas.js.map +1 -1
- package/docs/platforms/README.md +167 -0
- package/docs/platforms/agent-messaging.md +290 -0
- package/hooks/hooks.json +11 -0
- package/llms-install.md +101 -25
- package/package.json +14 -5
- package/scripts/hooks/_generated/repo-state.js +77 -0
- package/scripts/hooks/_generated/schema.js +255 -0
- package/scripts/hooks/_generated/task-state.js +3 -3
- package/scripts/hooks/_generated/work-topology.js +1 -0
- package/scripts/hooks/_shared.js +77 -97
- package/scripts/hooks/auto-update-runner.mjs +243 -0
- package/scripts/hooks/session-start.js +12 -2
- package/scripts/hooks/session-summary.js +7 -6
- package/skills/memesh/SKILL.md +40 -1
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { getMemeshDirFromDbPath } from '../core/paths.js';
|
|
6
|
+
import { readHostConfigFile, readTokenFile, requiredString } from './config.js';
|
|
7
|
+
import { connectRouterHost } from './router-client.js';
|
|
8
|
+
const MAX_HOOK_INPUT_BYTES = 64 * 1024;
|
|
9
|
+
const CODEX_THREAD_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
10
|
+
export async function startCodexSessionCompanion(config, hookInput, environment, dependencies = {}) {
|
|
11
|
+
if (hookInput.hook_event_name !== undefined && hookInput.hook_event_name !== 'SessionStart')
|
|
12
|
+
return null;
|
|
13
|
+
if (hookInput.source === 'compact')
|
|
14
|
+
return null;
|
|
15
|
+
const threadId = environment.CODEX_THREAD_ID;
|
|
16
|
+
if (!threadId || !CODEX_THREAD_ID.test(threadId))
|
|
17
|
+
return null;
|
|
18
|
+
if (hookInput.session_id !== undefined && hookInput.session_id !== threadId)
|
|
19
|
+
return null;
|
|
20
|
+
const realpath = dependencies.realpath ?? fs.realpathSync;
|
|
21
|
+
const workspace = realpath(requiredAbsolutePath(config.workspace, 'workspace'));
|
|
22
|
+
const cwd = realpath(requiredAbsolutePath(hookInput.cwd, 'cwd'));
|
|
23
|
+
if (workspace !== cwd)
|
|
24
|
+
return null;
|
|
25
|
+
return (dependencies.connect ?? connectRouterHost)({
|
|
26
|
+
socket_path: requiredString(config.router_socket, 'router_socket'),
|
|
27
|
+
auth_token: readTokenFile(config.token_file),
|
|
28
|
+
identity: {
|
|
29
|
+
project: requiredString(config.project, 'project'),
|
|
30
|
+
principal_id: requiredString(config.principal_id, 'principal_id'),
|
|
31
|
+
session_instance_id: threadId,
|
|
32
|
+
adapter_kind: 'codex-cli-queue',
|
|
33
|
+
},
|
|
34
|
+
async deliver() {
|
|
35
|
+
throw new Error('Codex CLI queue delivery must remain metadata-only inside the router.');
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function requiredAbsolutePath(value, field) {
|
|
40
|
+
const result = requiredString(value, field);
|
|
41
|
+
if (!path.isAbsolute(result))
|
|
42
|
+
throw new Error(`${field} must be an absolute path.`);
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
async function readHookInput() {
|
|
46
|
+
let input = '';
|
|
47
|
+
process.stdin.setEncoding('utf8');
|
|
48
|
+
for await (const chunk of process.stdin) {
|
|
49
|
+
input += chunk;
|
|
50
|
+
if (Buffer.byteLength(input, 'utf8') > MAX_HOOK_INPUT_BYTES) {
|
|
51
|
+
throw new Error('Codex SessionStart hook input exceeds the byte limit.');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const value = JSON.parse(input);
|
|
55
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
56
|
+
throw new Error('Codex SessionStart hook input must be an object.');
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
async function main() {
|
|
61
|
+
const configPath = path.join(getMemeshDirFromDbPath(), 'hosts', 'codex-session.json');
|
|
62
|
+
if (!fs.existsSync(configPath))
|
|
63
|
+
return;
|
|
64
|
+
const input = await readHookInput();
|
|
65
|
+
const connection = await startCodexSessionCompanion(readHostConfigFile(configPath), input, { CODEX_THREAD_ID: process.env.CODEX_THREAD_ID });
|
|
66
|
+
if (!connection)
|
|
67
|
+
return;
|
|
68
|
+
let closing = false;
|
|
69
|
+
const close = () => {
|
|
70
|
+
if (closing)
|
|
71
|
+
return;
|
|
72
|
+
closing = true;
|
|
73
|
+
void connection.close().finally(() => process.exit(0));
|
|
74
|
+
};
|
|
75
|
+
process.once('SIGINT', close);
|
|
76
|
+
process.once('SIGTERM', close);
|
|
77
|
+
}
|
|
78
|
+
function isMainModule() {
|
|
79
|
+
const entrypoint = process.argv[1];
|
|
80
|
+
if (!entrypoint)
|
|
81
|
+
return false;
|
|
82
|
+
try {
|
|
83
|
+
return fs.realpathSync(entrypoint) === fs.realpathSync(fileURLToPath(import.meta.url));
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (isMainModule()) {
|
|
90
|
+
try {
|
|
91
|
+
await main();
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
process.stderr.write('memesh-host-codex-session: session registration failed.\n');
|
|
95
|
+
process.exitCode = 1;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=codex-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-session.js","sourceRoot":"","sources":["../../src/host-runtime/codex-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { type ChildProcess, type SpawnOptions } from 'node:child_process';
|
|
3
|
+
import { createCodexAppServerAdapter, type CodexAppServerAdapterOptions, type CodexAppServerThread, type StartCodexAppServerThreadInput } from '../host-adapters/codex-app-server.js';
|
|
4
|
+
import { connectRouterHost } from './router-client.js';
|
|
5
|
+
type SpawnManagedCodex = (command: string, args: string[], options: SpawnOptions) => ChildProcess;
|
|
6
|
+
type StartManagedThread = (input: StartCodexAppServerThreadInput, options?: CodexAppServerAdapterOptions) => Promise<CodexAppServerThread>;
|
|
7
|
+
export interface ManagedCodexHostConfig extends Record<string, unknown> {
|
|
8
|
+
router_socket: unknown;
|
|
9
|
+
token_file: unknown;
|
|
10
|
+
project: unknown;
|
|
11
|
+
principal_id: unknown;
|
|
12
|
+
session_instance_id?: unknown;
|
|
13
|
+
control_socket: unknown;
|
|
14
|
+
workspace: unknown;
|
|
15
|
+
codex_command?: unknown;
|
|
16
|
+
startup_timeout_ms?: unknown;
|
|
17
|
+
}
|
|
18
|
+
export interface ManagedCodexHost {
|
|
19
|
+
readonly thread_id: string;
|
|
20
|
+
readonly session_instance_id: string;
|
|
21
|
+
readonly process: ChildProcess;
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export interface ManagedCodexHostDependencies {
|
|
25
|
+
spawn?: SpawnManagedCodex;
|
|
26
|
+
start_thread?: StartManagedThread;
|
|
27
|
+
create_adapter?: typeof createCodexAppServerAdapter;
|
|
28
|
+
connect_router_host?: typeof connectRouterHost;
|
|
29
|
+
wait?: (milliseconds: number) => Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
export declare function startManagedCodexHost(config: ManagedCodexHostConfig, dependencies?: ManagedCodexHostDependencies): Promise<ManagedCodexHost>;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/host-runtime/codex.ts"],"names":[],"mappings":";AAEA,OAAO,EAAS,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKjF,OAAO,EAGL,2BAA2B,EAE3B,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACpC,MAAM,sCAAsC,CAAC;AAO9C,OAAO,EAAE,iBAAiB,EAA6B,MAAM,oBAAoB,CAAC;AAKlF,KAAK,iBAAiB,GAAG,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,YAAY,KAClB,YAAY,CAAC;AAElB,KAAK,kBAAkB,GAAG,CACxB,KAAK,EAAE,8BAA8B,EACrC,OAAO,CAAC,EAAE,4BAA4B,KACnC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAEnC,MAAM,WAAW,sBAAuB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrE,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IAEtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,cAAc,CAAC,EAAE,OAAO,2BAA2B,CAAC;IACpD,mBAAmB,CAAC,EAAE,OAAO,iBAAiB,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAmBD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,sBAAsB,EAC9B,YAAY,GAAE,4BAAiC,GAC9C,OAAO,CAAC,gBAAgB,CAAC,CAuF3B"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { CodexAppServerDisconnectedError, CodexAppServerTimeoutError, createCodexAppServerAdapter, startCodexAppServerThread, } from '../host-adapters/codex-app-server.js';
|
|
8
|
+
import { assertSecureLocalHostRuntimeSupported, readHostConfig, readTokenFile, requiredString, } from './config.js';
|
|
9
|
+
import { connectRouterHost } from './router-client.js';
|
|
10
|
+
const DEFAULT_STARTUP_TIMEOUT_MS = 15_000;
|
|
11
|
+
const STARTUP_RETRY_MS = 50;
|
|
12
|
+
export async function startManagedCodexHost(config, dependencies = {}) {
|
|
13
|
+
assertSecureLocalHostRuntimeSupported();
|
|
14
|
+
const normalized = normalizeConfig(config);
|
|
15
|
+
assertUnusedPrivateSocketPath(normalized.controlSocket);
|
|
16
|
+
const spawnManagedCodex = dependencies.spawn ?? spawn;
|
|
17
|
+
const startThread = dependencies.start_thread ?? startCodexAppServerThread;
|
|
18
|
+
const createAdapter = dependencies.create_adapter ?? createCodexAppServerAdapter;
|
|
19
|
+
const connectHost = dependencies.connect_router_host ?? connectRouterHost;
|
|
20
|
+
const wait = dependencies.wait ?? delay;
|
|
21
|
+
const child = spawnManagedCodex(normalized.codexCommand, [
|
|
22
|
+
'app-server',
|
|
23
|
+
'--listen',
|
|
24
|
+
`unix://${normalized.controlSocket}`,
|
|
25
|
+
], {
|
|
26
|
+
shell: false,
|
|
27
|
+
stdio: 'ignore',
|
|
28
|
+
windowsHide: true,
|
|
29
|
+
});
|
|
30
|
+
let routerConnection;
|
|
31
|
+
let closeTask;
|
|
32
|
+
const close = () => {
|
|
33
|
+
closeTask ??= (async () => {
|
|
34
|
+
await routerConnection?.close();
|
|
35
|
+
if (isChildRunning(child))
|
|
36
|
+
child.kill('SIGTERM');
|
|
37
|
+
})();
|
|
38
|
+
return closeTask;
|
|
39
|
+
};
|
|
40
|
+
const onChildEnded = () => { void close(); };
|
|
41
|
+
child.once('exit', onChildEnded);
|
|
42
|
+
child.once('error', onChildEnded);
|
|
43
|
+
try {
|
|
44
|
+
const thread = await waitForManagedThread({
|
|
45
|
+
child,
|
|
46
|
+
controlSocket: normalized.controlSocket,
|
|
47
|
+
workspace: normalized.workspace,
|
|
48
|
+
timeoutMs: normalized.startupTimeoutMs,
|
|
49
|
+
startThread,
|
|
50
|
+
wait,
|
|
51
|
+
});
|
|
52
|
+
assertPrivateControlSocket(normalized.controlSocket);
|
|
53
|
+
const adapter = createAdapter();
|
|
54
|
+
routerConnection = await connectHost({
|
|
55
|
+
socket_path: normalized.routerSocket,
|
|
56
|
+
auth_token: readTokenFile(normalized.tokenFile),
|
|
57
|
+
identity: {
|
|
58
|
+
project: normalized.project,
|
|
59
|
+
principal_id: normalized.principalId,
|
|
60
|
+
session_instance_id: normalized.sessionInstanceId,
|
|
61
|
+
adapter_kind: 'codex-app-server',
|
|
62
|
+
},
|
|
63
|
+
async deliver(delivery) {
|
|
64
|
+
const receipt = await adapter.queue({
|
|
65
|
+
control_socket_path: normalized.controlSocket,
|
|
66
|
+
thread_id: thread.thread_id,
|
|
67
|
+
routing: {
|
|
68
|
+
project: delivery.envelope.project,
|
|
69
|
+
sender: delivery.envelope.sender,
|
|
70
|
+
recipient: delivery.envelope.recipient,
|
|
71
|
+
message_id: delivery.envelope.message_id,
|
|
72
|
+
delivery_id: delivery.delivery_id,
|
|
73
|
+
correlation_id: delivery.envelope.correlation_id,
|
|
74
|
+
},
|
|
75
|
+
envelope: delivery.envelope,
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
host: receipt.host,
|
|
79
|
+
status: receipt.status,
|
|
80
|
+
thread_id: receipt.thread_id,
|
|
81
|
+
client_user_message_id: receipt.client_user_message_id,
|
|
82
|
+
queued_submission_id: receipt.queued_submission_id,
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
thread_id: thread.thread_id,
|
|
88
|
+
session_instance_id: normalized.sessionInstanceId,
|
|
89
|
+
process: child,
|
|
90
|
+
close,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
await close();
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function waitForManagedThread(input) {
|
|
99
|
+
const deadline = Date.now() + input.timeoutMs;
|
|
100
|
+
let lastError;
|
|
101
|
+
for (;;) {
|
|
102
|
+
if (!isChildRunning(input.child)) {
|
|
103
|
+
throw new Error('Managed Codex app-server exited before creating a thread.');
|
|
104
|
+
}
|
|
105
|
+
const remaining = deadline - Date.now();
|
|
106
|
+
if (remaining <= 0) {
|
|
107
|
+
throw lastError ?? new Error('Managed Codex app-server did not become ready before the startup timeout.');
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
return await input.startThread({
|
|
111
|
+
control_socket_path: input.controlSocket,
|
|
112
|
+
workspace: input.workspace,
|
|
113
|
+
timeout_ms: Math.min(remaining, 1_000),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
if (!isReadinessTransportError(error))
|
|
118
|
+
throw error;
|
|
119
|
+
lastError = error;
|
|
120
|
+
await input.wait(Math.min(STARTUP_RETRY_MS, Math.max(1, deadline - Date.now())));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function isReadinessTransportError(error) {
|
|
125
|
+
return error instanceof CodexAppServerDisconnectedError || error instanceof CodexAppServerTimeoutError;
|
|
126
|
+
}
|
|
127
|
+
function normalizeConfig(config) {
|
|
128
|
+
const controlSocket = requiredAbsolutePath(config.control_socket, 'control_socket');
|
|
129
|
+
const workspace = fs.realpathSync(requiredAbsolutePath(config.workspace, 'workspace'));
|
|
130
|
+
if (!fs.statSync(workspace).isDirectory())
|
|
131
|
+
throw new Error('workspace must be an existing directory.');
|
|
132
|
+
return {
|
|
133
|
+
routerSocket: requiredString(config.router_socket, 'router_socket'),
|
|
134
|
+
tokenFile: config.token_file,
|
|
135
|
+
project: requiredString(config.project, 'project'),
|
|
136
|
+
principalId: requiredString(config.principal_id, 'principal_id'),
|
|
137
|
+
sessionInstanceId: config.session_instance_id === undefined
|
|
138
|
+
? randomUUID()
|
|
139
|
+
: requiredString(config.session_instance_id, 'session_instance_id'),
|
|
140
|
+
controlSocket,
|
|
141
|
+
workspace,
|
|
142
|
+
codexCommand: requiredString(config.codex_command ?? 'codex', 'codex_command'),
|
|
143
|
+
startupTimeoutMs: boundedStartupTimeout(config.startup_timeout_ms ?? DEFAULT_STARTUP_TIMEOUT_MS),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function requiredAbsolutePath(value, field) {
|
|
147
|
+
const resolved = requiredString(value, field);
|
|
148
|
+
if (!path.isAbsolute(resolved))
|
|
149
|
+
throw new Error(`${field} must be an absolute path.`);
|
|
150
|
+
return resolved;
|
|
151
|
+
}
|
|
152
|
+
function boundedStartupTimeout(value) {
|
|
153
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value < 100 || value > 60_000) {
|
|
154
|
+
throw new Error('startup_timeout_ms must be an integer between 100 and 60000.');
|
|
155
|
+
}
|
|
156
|
+
return value;
|
|
157
|
+
}
|
|
158
|
+
function assertUnusedPrivateSocketPath(socketPath) {
|
|
159
|
+
const parent = fs.lstatSync(path.dirname(socketPath));
|
|
160
|
+
assertOwnerPrivate(parent, 'control socket parent directory');
|
|
161
|
+
if (parent.isSymbolicLink() || !parent.isDirectory()) {
|
|
162
|
+
throw new Error('The control socket parent must be a real owner-private directory.');
|
|
163
|
+
}
|
|
164
|
+
if (fs.lstatSync(socketPath, { throwIfNoEntry: false })) {
|
|
165
|
+
throw new Error('The managed control socket path must not already exist.');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function assertPrivateControlSocket(socketPath) {
|
|
169
|
+
const socket = fs.lstatSync(socketPath);
|
|
170
|
+
if (!socket.isSocket())
|
|
171
|
+
throw new Error('The managed control socket must be a Unix socket.');
|
|
172
|
+
assertOwnerPrivate(socket, 'managed control socket');
|
|
173
|
+
}
|
|
174
|
+
function assertOwnerPrivate(stat, label) {
|
|
175
|
+
if ((stat.mode & 0o077) !== 0)
|
|
176
|
+
throw new Error(`The ${label} must be owner-private.`);
|
|
177
|
+
if (typeof process.getuid === 'function' && stat.uid !== process.getuid()) {
|
|
178
|
+
throw new Error(`The ${label} must be owned by the current user.`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function isChildRunning(child) {
|
|
182
|
+
return child.exitCode === null && child.signalCode === null;
|
|
183
|
+
}
|
|
184
|
+
function delay(milliseconds) {
|
|
185
|
+
return new Promise(resolve => setTimeout(resolve, milliseconds));
|
|
186
|
+
}
|
|
187
|
+
async function runManagedCodexHost() {
|
|
188
|
+
const host = await startManagedCodexHost(readHostConfig());
|
|
189
|
+
let shuttingDown = false;
|
|
190
|
+
const shutdown = () => {
|
|
191
|
+
if (shuttingDown)
|
|
192
|
+
return;
|
|
193
|
+
shuttingDown = true;
|
|
194
|
+
void host.close().finally(() => process.exit(0));
|
|
195
|
+
};
|
|
196
|
+
process.once('SIGINT', shutdown);
|
|
197
|
+
process.once('SIGTERM', shutdown);
|
|
198
|
+
host.process.once('exit', () => {
|
|
199
|
+
if (!shuttingDown)
|
|
200
|
+
process.exitCode = 1;
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
const entryPath = process.argv[1];
|
|
204
|
+
if (entryPath && isExecutedModule(entryPath, import.meta.url)) {
|
|
205
|
+
await runManagedCodexHost();
|
|
206
|
+
}
|
|
207
|
+
function isExecutedModule(entryPath, moduleUrl) {
|
|
208
|
+
try {
|
|
209
|
+
return fs.realpathSync(entryPath) === fs.realpathSync(fileURLToPath(moduleUrl));
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/host-runtime/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const SECURE_LOCAL_HOST_RUNTIME_UNSUPPORTED = "The secure local host runtime is not supported on Windows.";
|
|
2
|
+
export declare function assertSecureLocalHostRuntimeSupported(): void;
|
|
3
|
+
export declare function readHostConfig<T extends Record<string, unknown>>(): T;
|
|
4
|
+
export declare function readHostConfigFile<T extends Record<string, unknown>>(configuredPath: string): T;
|
|
5
|
+
export declare function readTokenFile(tokenFile: unknown): string;
|
|
6
|
+
export declare function ensureRouterTokenFile(tokenFile: string): string;
|
|
7
|
+
export declare function requiredString(value: unknown, field: string): string;
|
|
8
|
+
export declare function optionalStringArray(value: unknown, field: string): string[];
|
|
9
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/host-runtime/config.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,qCAAqC,+DACY,CAAC;AAE/D,wBAAgB,qCAAqC,IAAI,IAAI,CAI5D;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAKrE;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,CAAC,CAQ/F;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAOxD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ/D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAI3E"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
const MAX_HOST_CONFIG_FILE_BYTES = 64 * 1024;
|
|
4
|
+
const MAX_ROUTER_TOKEN_FILE_BYTES = 8 * 1024;
|
|
5
|
+
export const SECURE_LOCAL_HOST_RUNTIME_UNSUPPORTED = 'The secure local host runtime is not supported on Windows.';
|
|
6
|
+
export function assertSecureLocalHostRuntimeSupported() {
|
|
7
|
+
if (process.platform === 'win32') {
|
|
8
|
+
throw new Error(SECURE_LOCAL_HOST_RUNTIME_UNSUPPORTED);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function readHostConfig() {
|
|
12
|
+
const flag = process.argv.indexOf('--config');
|
|
13
|
+
const configuredPath = flag >= 0 ? process.argv[flag + 1] : process.env.MEMESH_HOST_CONFIG;
|
|
14
|
+
if (!configuredPath)
|
|
15
|
+
throw new Error('A host config file is required via --config or MEMESH_HOST_CONFIG.');
|
|
16
|
+
return readHostConfigFile(configuredPath);
|
|
17
|
+
}
|
|
18
|
+
export function readHostConfigFile(configuredPath) {
|
|
19
|
+
const value = JSON.parse(readOwnerPrivateFile(configuredPath, 'host config', MAX_HOST_CONFIG_FILE_BYTES));
|
|
20
|
+
if (!isRecord(value))
|
|
21
|
+
throw new Error('The host config must contain one JSON object.');
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
export function readTokenFile(tokenFile) {
|
|
25
|
+
const file = requiredString(tokenFile, 'token_file');
|
|
26
|
+
return requiredString(readOwnerPrivateFile(file, 'router token file', MAX_ROUTER_TOKEN_FILE_BYTES).trim(), 'router token');
|
|
27
|
+
}
|
|
28
|
+
export function ensureRouterTokenFile(tokenFile) {
|
|
29
|
+
assertSecureLocalHostRuntimeSupported();
|
|
30
|
+
try {
|
|
31
|
+
fs.writeFileSync(tokenFile, `${randomBytes(32).toString('hex')}\n`, { mode: 0o600, flag: 'wx' });
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (error.code !== 'EEXIST')
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
return readTokenFile(tokenFile);
|
|
38
|
+
}
|
|
39
|
+
export function requiredString(value, field) {
|
|
40
|
+
if (typeof value !== 'string' || value.length === 0 || Buffer.byteLength(value) > 4096) {
|
|
41
|
+
throw new Error(`${field} must be a bounded non-empty string.`);
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
export function optionalStringArray(value, field) {
|
|
46
|
+
if (value === undefined)
|
|
47
|
+
return [];
|
|
48
|
+
if (!Array.isArray(value))
|
|
49
|
+
throw new Error(`${field} must be an array.`);
|
|
50
|
+
return value.map((item, index) => requiredString(item, `${field}[${index}]`));
|
|
51
|
+
}
|
|
52
|
+
function readOwnerPrivateFile(file, label, maxBytes) {
|
|
53
|
+
assertSecureLocalHostRuntimeSupported();
|
|
54
|
+
if (typeof fs.constants.O_NOFOLLOW !== 'number') {
|
|
55
|
+
throw new Error(`This platform cannot safely reject a symlink ${label}.`);
|
|
56
|
+
}
|
|
57
|
+
const descriptor = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK);
|
|
58
|
+
try {
|
|
59
|
+
const stat = fs.fstatSync(descriptor);
|
|
60
|
+
if (!stat.isFile())
|
|
61
|
+
throw new Error(`The ${label} must be an owner-private regular file.`);
|
|
62
|
+
assertOwnerPrivate(stat, label);
|
|
63
|
+
if (stat.size > maxBytes)
|
|
64
|
+
throw new Error(`The ${label} exceeds its ${maxBytes}-byte limit.`);
|
|
65
|
+
const content = Buffer.allocUnsafe(maxBytes + 1);
|
|
66
|
+
let bytesRead = 0;
|
|
67
|
+
while (bytesRead < content.length) {
|
|
68
|
+
const chunkBytes = fs.readSync(descriptor, content, bytesRead, content.length - bytesRead, null);
|
|
69
|
+
if (chunkBytes === 0)
|
|
70
|
+
break;
|
|
71
|
+
bytesRead += chunkBytes;
|
|
72
|
+
}
|
|
73
|
+
if (bytesRead > maxBytes)
|
|
74
|
+
throw new Error(`The ${label} exceeds its ${maxBytes}-byte limit.`);
|
|
75
|
+
return content.subarray(0, bytesRead).toString('utf8');
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
fs.closeSync(descriptor);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function assertOwnerPrivate(stat, label) {
|
|
82
|
+
if ((stat.mode & 0o077) !== 0)
|
|
83
|
+
throw new Error(`The ${label} must be owner-private.`);
|
|
84
|
+
if (typeof process.getuid === 'function' && stat.uid !== process.getuid()) {
|
|
85
|
+
throw new Error(`The ${label} must be owned by the current user.`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function isRecord(value) {
|
|
89
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/host-runtime/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AgentJsonObject, AgentMessagePayload } from '../core/agent-messaging.js';
|
|
2
|
+
export interface RouterHostIdentity {
|
|
3
|
+
project: string;
|
|
4
|
+
principal_id: string;
|
|
5
|
+
session_instance_id: string;
|
|
6
|
+
adapter_kind: string;
|
|
7
|
+
}
|
|
8
|
+
export interface RouterDelivery {
|
|
9
|
+
attempt_id: string;
|
|
10
|
+
delivery_id: string;
|
|
11
|
+
connection_id: string;
|
|
12
|
+
generation: number;
|
|
13
|
+
hops: number;
|
|
14
|
+
envelope: AgentMessagePayload;
|
|
15
|
+
}
|
|
16
|
+
export interface RouterHostConnection {
|
|
17
|
+
readonly connection_id: string;
|
|
18
|
+
readonly generation: number;
|
|
19
|
+
close(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export interface RouterClientResilienceOptions {
|
|
22
|
+
initial_retry_ms?: number;
|
|
23
|
+
max_retry_ms?: number;
|
|
24
|
+
retry_jitter?: number;
|
|
25
|
+
initial_attempts?: number;
|
|
26
|
+
registration_timeout_ms?: number;
|
|
27
|
+
start_router?: () => void | Promise<void>;
|
|
28
|
+
random?: () => number;
|
|
29
|
+
}
|
|
30
|
+
export interface ConnectRouterHostInput {
|
|
31
|
+
socket_path: string;
|
|
32
|
+
auth_token: string;
|
|
33
|
+
identity: RouterHostIdentity;
|
|
34
|
+
deliver(delivery: RouterDelivery): Promise<AgentJsonObject>;
|
|
35
|
+
resilience?: RouterClientResilienceOptions;
|
|
36
|
+
}
|
|
37
|
+
export declare function connectRouterHost(input: ConnectRouterHostInput): Promise<RouterHostConnection>;
|
|
38
|
+
//# sourceMappingURL=router-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router-client.d.ts","sourceRoot":"","sources":["../../src/host-runtime/router-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAWvF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,mBAAmB,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,6BAA6B;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,YAAY,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5D,UAAU,CAAC,EAAE,6BAA6B,CAAC;CAC5C;AA8UD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAKpG"}
|