@roj-ai/sandbox-runtime 0.1.36 → 0.2.2
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/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/server.d.ts +2 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +35 -31
- package/dist/server.js.map +1 -1
- package/dist/user-config-loader.d.ts.map +1 -1
- package/dist/user-config-loader.js +3 -2
- package/dist/user-config-loader.js.map +1 -1
- package/package.json +6 -4
- package/src/main.ts +1 -1
- package/src/server.ts +35 -34
- package/src/user-config-loader.ts +3 -2
package/dist/main.js
CHANGED
|
@@ -57,7 +57,7 @@ async function main() {
|
|
|
57
57
|
console.error(error instanceof Error ? error.message : String(error));
|
|
58
58
|
process.exit(1);
|
|
59
59
|
}
|
|
60
|
-
await startServer(
|
|
60
|
+
await startServer(userConfig);
|
|
61
61
|
}
|
|
62
62
|
main().catch((error) => {
|
|
63
63
|
console.error('Fatal error:', error);
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD,KAAK,UAAU,mBAAmB,CAAC,SAAiB;IACnD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAChE,IAAI,CAAC;QACJ,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAA;QAC3C,OAAM;IACP,CAAC;IAAC,MAAM,CAAC;QACR,iDAAiD;IAClD,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACjD,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAA;IACjE,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAErD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,SAAS,CAAC,CAAA;IAC3D,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACnD,MAAM,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;IAC7C,OAAO,CAAC,GAAG,CAAC,4BAA4B,QAAQ,MAAM,aAAa,EAAE,CAAC,CAAA;AACvE,CAAC;AAED,KAAK,UAAU,IAAI;IAClB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,eAAe,CAAA;IACrD,MAAM,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAA;IAC7D,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAE7C,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAEpC,IAAI,UAAsD,CAAA;IAC1D,IAAI,CAAC;QACJ,UAAU,GAAG,MAAM,cAAc,CAAC,kBAAkB,CAAC,CAAA;QACrD,OAAO,CAAC,GAAG,CAAC,uBAAuB,kBAAkB,EAAE,CAAC,CAAA;QACxD,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,mCAAmC,kBAAkB,GAAG,CAAC,CAAA;QACvE,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,MAAM,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -4,9 +4,8 @@
|
|
|
4
4
|
* Handles: config loading, bootstrap, transport, session manager,
|
|
5
5
|
* HTTP app, Bun.serve, session loading, and shutdown.
|
|
6
6
|
*/
|
|
7
|
-
import type { Config, LLMMiddleware, Logger,
|
|
8
|
-
export interface StartServerOptions {
|
|
9
|
-
presets: Preset[];
|
|
7
|
+
import type { Config, LLMMiddleware, Logger, SessionDefaults } from '@roj-ai/sdk';
|
|
8
|
+
export interface StartServerOptions extends SessionDefaults {
|
|
10
9
|
config?: Partial<Config>;
|
|
11
10
|
/** Global LLM middleware applied to all presets (prepended before preset-level middleware) */
|
|
12
11
|
llmMiddleware?: LLMMiddleware[];
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAa,MAAM,aAAa,CAAA;AAa5F,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACxB,8FAA8F;IAC9F,aAAa,CAAC,EAAE,aAAa,EAAE,CAAA;IAC/B,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACvC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACjF;AAED,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB;AAMD,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAuFpF"}
|
package/dist/server.js
CHANGED
|
@@ -8,7 +8,7 @@ import { bootstrap, createSystemFromServices, loadConfig, validateConfig } from
|
|
|
8
8
|
import { createApp } from '@roj-ai/sdk/transport/http/app';
|
|
9
9
|
import { createAgentTransport, ServerAdapter } from '@roj-ai/sdk/transport/adapter';
|
|
10
10
|
import { bunWebSocketFactory, createBunWebSocketHandlers } from '@roj-ai/transport/bun';
|
|
11
|
-
import { createBunPlatform } from '@roj-ai/sdk/bun-platform';
|
|
11
|
+
import { createBunPlatform, createServerLifecycle, runServerStartup, shutdownFromSignal } from '@roj-ai/sdk/bun-platform';
|
|
12
12
|
import { SANDBOX_RUNTIME_NAME, SANDBOX_RUNTIME_VERSION } from './info.js';
|
|
13
13
|
// ============================================================================
|
|
14
14
|
// startServer
|
|
@@ -29,7 +29,8 @@ export async function startServer(options) {
|
|
|
29
29
|
llmMiddleware: [...options.llmMiddleware, ...(p.llmMiddleware ?? [])],
|
|
30
30
|
}))
|
|
31
31
|
: options.presets;
|
|
32
|
-
|
|
32
|
+
// Forwarded whole: bootstrap folds the SessionDefaults, so nothing is dropped here.
|
|
33
|
+
const services = bootstrap(config, { ...options, presets }, createBunPlatform());
|
|
33
34
|
const { logger } = services;
|
|
34
35
|
// Reap service processes left behind by a previous agent, before any session can load
|
|
35
36
|
// and start its own. At boot this agent owns nothing, so every survivor is an orphan.
|
|
@@ -50,41 +51,44 @@ export async function startServer(options) {
|
|
|
50
51
|
agentToken: config.agentToken,
|
|
51
52
|
});
|
|
52
53
|
const server = startBunServer(config, app, transport);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
54
|
+
let transportStopPromise;
|
|
55
|
+
let transportStopErrorReported = false;
|
|
56
|
+
const stopTransportOnce = async () => {
|
|
57
|
+
transportStopPromise ??= Promise.resolve().then(() => transport.stop());
|
|
58
|
+
try {
|
|
59
|
+
await transportStopPromise;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (transportStopErrorReported)
|
|
63
|
+
return;
|
|
64
|
+
transportStopErrorReported = true;
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const lifecycle = createServerLifecycle({
|
|
69
|
+
stopIngress: () => server.stop(true),
|
|
70
|
+
cleanupSteps: [
|
|
71
|
+
...options.onShutdown ? [options.onShutdown] : [],
|
|
72
|
+
() => sessionManager.shutdown(),
|
|
73
|
+
stopTransportOnce,
|
|
74
|
+
],
|
|
75
|
+
runSignalShutdown: shutdown => {
|
|
76
|
+
void shutdownFromSignal(shutdown);
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
// Load persisted sessions after HTTP server is up (health checks pass during loading).
|
|
80
|
+
await runServerStartup(lifecycle, [
|
|
81
|
+
{ run: () => sessionManager.loadAllSessions() },
|
|
82
|
+
// A pending connection is canceled before the remaining ordered cleanup.
|
|
83
|
+
{ run: () => transport.start(), cancel: stopTransportOnce },
|
|
84
|
+
]);
|
|
66
85
|
logger.info('Agent server started', {
|
|
67
86
|
host: config.host,
|
|
68
87
|
port: config.port,
|
|
69
88
|
persistence: config.persistence,
|
|
70
89
|
mode: isWorkerMode ? 'worker' : 'standalone',
|
|
71
90
|
});
|
|
72
|
-
|
|
73
|
-
logger.info('Shutting down...');
|
|
74
|
-
if (options.onShutdown) {
|
|
75
|
-
await options.onShutdown();
|
|
76
|
-
}
|
|
77
|
-
await sessionManager.shutdown();
|
|
78
|
-
await transport.stop();
|
|
79
|
-
server.stop();
|
|
80
|
-
};
|
|
81
|
-
process.on('SIGINT', () => {
|
|
82
|
-
void shutdown().then(() => process.exit(0));
|
|
83
|
-
});
|
|
84
|
-
process.on('SIGTERM', () => {
|
|
85
|
-
void shutdown().then(() => process.exit(0));
|
|
86
|
-
});
|
|
87
|
-
return { config, logger, shutdown };
|
|
91
|
+
return { config, logger, shutdown: lifecycle.shutdown };
|
|
88
92
|
}
|
|
89
93
|
// ============================================================================
|
|
90
94
|
// Internal helpers
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC7F,OAAO,EAAe,SAAS,EAAE,MAAM,gCAAgC,CAAA;AACvE,OAAO,EAAE,oBAAoB,EAAwB,aAAa,EAAE,MAAM,+BAA+B,CAAA;AACzG,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AAEvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-config-loader.d.ts","sourceRoot":"","sources":["../src/user-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAU,SAAS,EAAE,MAAM,aAAa,CAAA;AAKpD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"user-config-loader.d.ts","sourceRoot":"","sources":["../src/user-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAU,SAAS,EAAE,MAAM,aAAa,CAAA;AAKpD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA+D3E"}
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* Uses dynamic `import()` — this is why it lives in the runtime package
|
|
5
5
|
* rather than in `@roj-ai/sdk` (which stays pure and platform-agnostic).
|
|
6
6
|
*/
|
|
7
|
-
import { validatePreset } from '@roj-ai/sdk';
|
|
7
|
+
import { parseExtraBinds, validatePreset } from '@roj-ai/sdk';
|
|
8
8
|
import { existsSync } from 'node:fs';
|
|
9
|
-
import { resolve } from 'node:path';
|
|
9
|
+
import { dirname, resolve } from 'node:path';
|
|
10
10
|
/**
|
|
11
11
|
* Load user configuration from a TypeScript file.
|
|
12
12
|
*
|
|
@@ -61,6 +61,7 @@ export async function loadUserConfig(configPath) {
|
|
|
61
61
|
presets,
|
|
62
62
|
sandboxed: typedConfig.sandboxed,
|
|
63
63
|
snapshotter: typedConfig.snapshotter,
|
|
64
|
+
extraBinds: parseExtraBinds(typedConfig.extraBinds, dirname(absolutePath), absolutePath),
|
|
64
65
|
};
|
|
65
66
|
}
|
|
66
67
|
//# sourceMappingURL=user-config-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-config-loader.js","sourceRoot":"","sources":["../src/user-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"user-config-loader.js","sourceRoot":"","sources":["../src/user-config-loader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roj-ai/sandbox-runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -25,7 +25,9 @@
|
|
|
25
25
|
},
|
|
26
26
|
"files": [
|
|
27
27
|
"src",
|
|
28
|
-
"dist"
|
|
28
|
+
"dist",
|
|
29
|
+
"!src/**/*.test.ts",
|
|
30
|
+
"!src/__tests__"
|
|
29
31
|
],
|
|
30
32
|
"publishConfig": {
|
|
31
33
|
"access": "public"
|
|
@@ -46,8 +48,8 @@
|
|
|
46
48
|
"type-check": "tsc --noEmit"
|
|
47
49
|
},
|
|
48
50
|
"dependencies": {
|
|
49
|
-
"@roj-ai/sdk": "^0.
|
|
50
|
-
"@roj-ai/transport": "^0.
|
|
51
|
+
"@roj-ai/sdk": "^0.2.2",
|
|
52
|
+
"@roj-ai/transport": "^0.2.2",
|
|
51
53
|
"hono": "4.13.1"
|
|
52
54
|
},
|
|
53
55
|
"devDependencies": {
|
package/src/main.ts
CHANGED
package/src/server.ts
CHANGED
|
@@ -5,21 +5,20 @@
|
|
|
5
5
|
* HTTP app, Bun.serve, session loading, and shutdown.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type { Config, LLMMiddleware, Logger,
|
|
8
|
+
import type { Config, LLMMiddleware, Logger, SessionDefaults, SessionId } from '@roj-ai/sdk'
|
|
9
9
|
import { bootstrap, createSystemFromServices, loadConfig, validateConfig } from '@roj-ai/sdk'
|
|
10
10
|
import { type AppEnv, createApp } from '@roj-ai/sdk/transport/http/app'
|
|
11
11
|
import { createAgentTransport, type IAgentTransport, ServerAdapter } from '@roj-ai/sdk/transport/adapter'
|
|
12
12
|
import { bunWebSocketFactory, createBunWebSocketHandlers } from '@roj-ai/transport/bun'
|
|
13
13
|
import type { Hono } from 'hono'
|
|
14
|
-
import { createBunPlatform } from '@roj-ai/sdk/bun-platform'
|
|
14
|
+
import { createBunPlatform, createServerLifecycle, runServerStartup, shutdownFromSignal } from '@roj-ai/sdk/bun-platform'
|
|
15
15
|
import { SANDBOX_RUNTIME_NAME, SANDBOX_RUNTIME_VERSION } from './info.js'
|
|
16
16
|
|
|
17
17
|
// ============================================================================
|
|
18
18
|
// Public types
|
|
19
19
|
// ============================================================================
|
|
20
20
|
|
|
21
|
-
export interface StartServerOptions {
|
|
22
|
-
presets: Preset[]
|
|
21
|
+
export interface StartServerOptions extends SessionDefaults {
|
|
23
22
|
config?: Partial<Config>
|
|
24
23
|
/** Global LLM middleware applied to all presets (prepended before preset-level middleware) */
|
|
25
24
|
llmMiddleware?: LLMMiddleware[]
|
|
@@ -56,7 +55,8 @@ export async function startServer(options: StartServerOptions): Promise<ServerHa
|
|
|
56
55
|
}))
|
|
57
56
|
: options.presets
|
|
58
57
|
|
|
59
|
-
|
|
58
|
+
// Forwarded whole: bootstrap folds the SessionDefaults, so nothing is dropped here.
|
|
59
|
+
const services = bootstrap(config, { ...options, presets }, createBunPlatform())
|
|
60
60
|
const { logger } = services
|
|
61
61
|
|
|
62
62
|
// Reap service processes left behind by a previous agent, before any session can load
|
|
@@ -83,19 +83,37 @@ export async function startServer(options: StartServerOptions): Promise<ServerHa
|
|
|
83
83
|
})
|
|
84
84
|
|
|
85
85
|
const server = startBunServer(config, app, transport)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
86
|
+
let transportStopPromise: Promise<void> | undefined
|
|
87
|
+
let transportStopErrorReported = false
|
|
88
|
+
const stopTransportOnce = async () => {
|
|
89
|
+
transportStopPromise ??= Promise.resolve().then(() => transport.stop())
|
|
90
|
+
try {
|
|
91
|
+
await transportStopPromise
|
|
92
|
+
} catch (error) {
|
|
93
|
+
if (transportStopErrorReported) return
|
|
94
|
+
transportStopErrorReported = true
|
|
95
|
+
throw error
|
|
96
|
+
}
|
|
92
97
|
}
|
|
93
98
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
const lifecycle = createServerLifecycle({
|
|
100
|
+
stopIngress: () => server.stop(true),
|
|
101
|
+
cleanupSteps: [
|
|
102
|
+
...options.onShutdown ? [options.onShutdown] : [],
|
|
103
|
+
() => sessionManager.shutdown(),
|
|
104
|
+
stopTransportOnce,
|
|
105
|
+
],
|
|
106
|
+
runSignalShutdown: shutdown => {
|
|
107
|
+
void shutdownFromSignal(shutdown)
|
|
108
|
+
},
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
// Load persisted sessions after HTTP server is up (health checks pass during loading).
|
|
112
|
+
await runServerStartup(lifecycle, [
|
|
113
|
+
{ run: () => sessionManager.loadAllSessions() },
|
|
114
|
+
// A pending connection is canceled before the remaining ordered cleanup.
|
|
115
|
+
{ run: () => transport.start(), cancel: stopTransportOnce },
|
|
116
|
+
])
|
|
99
117
|
|
|
100
118
|
logger.info('Agent server started', {
|
|
101
119
|
host: config.host,
|
|
@@ -104,24 +122,7 @@ export async function startServer(options: StartServerOptions): Promise<ServerHa
|
|
|
104
122
|
mode: isWorkerMode ? 'worker' : 'standalone',
|
|
105
123
|
})
|
|
106
124
|
|
|
107
|
-
|
|
108
|
-
logger.info('Shutting down...')
|
|
109
|
-
if (options.onShutdown) {
|
|
110
|
-
await options.onShutdown()
|
|
111
|
-
}
|
|
112
|
-
await sessionManager.shutdown()
|
|
113
|
-
await transport.stop()
|
|
114
|
-
server.stop()
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
process.on('SIGINT', () => {
|
|
118
|
-
void shutdown().then(() => process.exit(0))
|
|
119
|
-
})
|
|
120
|
-
process.on('SIGTERM', () => {
|
|
121
|
-
void shutdown().then(() => process.exit(0))
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
return { config, logger, shutdown }
|
|
125
|
+
return { config, logger, shutdown: lifecycle.shutdown }
|
|
125
126
|
}
|
|
126
127
|
|
|
127
128
|
// ============================================================================
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import type { Preset, RojConfig } from '@roj-ai/sdk'
|
|
9
|
-
import { validatePreset } from '@roj-ai/sdk'
|
|
9
|
+
import { parseExtraBinds, validatePreset } from '@roj-ai/sdk'
|
|
10
10
|
import { existsSync } from 'node:fs'
|
|
11
|
-
import { resolve } from 'node:path'
|
|
11
|
+
import { dirname, resolve } from 'node:path'
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Load user configuration from a TypeScript file.
|
|
@@ -78,5 +78,6 @@ export async function loadUserConfig(configPath: string): Promise<RojConfig> {
|
|
|
78
78
|
presets,
|
|
79
79
|
sandboxed: typedConfig.sandboxed as boolean | undefined,
|
|
80
80
|
snapshotter: typedConfig.snapshotter as RojConfig['snapshotter'],
|
|
81
|
+
extraBinds: parseExtraBinds(typedConfig.extraBinds, dirname(absolutePath), absolutePath),
|
|
81
82
|
}
|
|
82
83
|
}
|