@multiplayer-app/agent 0.1.20 → 0.1.22
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 +14 -7
- package/dist/agent/definition.test.js +8 -3
- package/dist/agent/definition.test.js.map +1 -1
- package/dist/agent/profiles/coding.d.ts +1 -1
- package/dist/agent/profiles/coding.d.ts.map +1 -1
- package/dist/agent/profiles/coding.js +21 -4
- package/dist/agent/profiles/coding.js.map +1 -1
- package/dist/agent/profiles/index.js +1 -1
- package/dist/agent/profiles/index.js.map +1 -1
- package/dist/agent/profiles/research.d.ts.map +1 -1
- package/dist/agent/profiles/research.js +2 -2
- package/dist/agent/profiles/research.js.map +1 -1
- package/dist/agent/turn-history.d.ts.map +1 -1
- package/dist/agent/turn-history.js +7 -1
- package/dist/agent/turn-history.js.map +1 -1
- package/dist/agent/turn-runner.d.ts +8 -0
- package/dist/agent/turn-runner.d.ts.map +1 -1
- package/dist/agent/turn-runner.js +35 -10
- package/dist/agent/turn-runner.js.map +1 -1
- package/dist/app/app-host.d.ts +57 -0
- package/dist/app/app-host.d.ts.map +1 -0
- package/dist/app/app-host.js +252 -0
- package/dist/app/app-host.js.map +1 -0
- package/dist/app/app-host.test.d.ts +2 -0
- package/dist/app/app-host.test.d.ts.map +1 -0
- package/dist/app/app-host.test.js +639 -0
- package/dist/app/app-host.test.js.map +1 -0
- package/dist/app/build-log.d.ts +14 -0
- package/dist/app/build-log.d.ts.map +1 -0
- package/dist/app/build-log.js +173 -0
- package/dist/app/build-log.js.map +1 -0
- package/dist/app/build-log.test.d.ts +2 -0
- package/dist/app/build-log.test.d.ts.map +1 -0
- package/dist/app/build-log.test.js +255 -0
- package/dist/app/build-log.test.js.map +1 -0
- package/dist/app/config.d.ts +196 -0
- package/dist/app/config.d.ts.map +1 -0
- package/dist/app/config.js +362 -0
- package/dist/app/config.js.map +1 -0
- package/dist/app/config.test.d.ts +2 -0
- package/dist/app/config.test.d.ts.map +1 -0
- package/dist/app/config.test.js +224 -0
- package/dist/app/config.test.js.map +1 -0
- package/dist/app/detect.d.ts +68 -0
- package/dist/app/detect.d.ts.map +1 -0
- package/dist/app/detect.js +449 -0
- package/dist/app/detect.js.map +1 -0
- package/dist/app/detect.test.d.ts +2 -0
- package/dist/app/detect.test.d.ts.map +1 -0
- package/dist/app/detect.test.js +267 -0
- package/dist/app/detect.test.js.map +1 -0
- package/dist/app/env.d.ts +5 -0
- package/dist/app/env.d.ts.map +1 -0
- package/dist/app/env.js +22 -0
- package/dist/app/env.js.map +1 -0
- package/dist/app/functions-cli.d.ts +3 -0
- package/dist/app/functions-cli.d.ts.map +1 -0
- package/dist/app/functions-cli.js +27 -0
- package/dist/app/functions-cli.js.map +1 -0
- package/dist/app/functions-host.d.ts +15 -0
- package/dist/app/functions-host.d.ts.map +1 -0
- package/dist/app/functions-host.js +276 -0
- package/dist/app/functions-host.js.map +1 -0
- package/dist/app/functions-host.test.d.ts +2 -0
- package/dist/app/functions-host.test.d.ts.map +1 -0
- package/dist/app/functions-host.test.js +117 -0
- package/dist/app/functions-host.test.js.map +1 -0
- package/dist/app/functions-routes.d.ts +23 -0
- package/dist/app/functions-routes.d.ts.map +1 -0
- package/dist/app/functions-routes.js +85 -0
- package/dist/app/functions-routes.js.map +1 -0
- package/dist/app/functions-routes.test.d.ts +2 -0
- package/dist/app/functions-routes.test.d.ts.map +1 -0
- package/dist/app/functions-routes.test.js +40 -0
- package/dist/app/functions-routes.test.js.map +1 -0
- package/dist/app/manifest.d.ts +17 -0
- package/dist/app/manifest.d.ts.map +1 -0
- package/dist/app/manifest.js +64 -0
- package/dist/app/manifest.js.map +1 -0
- package/dist/app/manifest.test.d.ts +2 -0
- package/dist/app/manifest.test.d.ts.map +1 -0
- package/dist/app/manifest.test.js +173 -0
- package/dist/app/manifest.test.js.map +1 -0
- package/dist/app/release-artifacts.d.ts +43 -0
- package/dist/app/release-artifacts.d.ts.map +1 -0
- package/dist/app/release-artifacts.js +239 -0
- package/dist/app/release-artifacts.js.map +1 -0
- package/dist/app/release-artifacts.test.d.ts +2 -0
- package/dist/app/release-artifacts.test.d.ts.map +1 -0
- package/dist/app/release-artifacts.test.js +326 -0
- package/dist/app/release-artifacts.test.js.map +1 -0
- package/dist/app/route-pattern.d.ts +23 -0
- package/dist/app/route-pattern.d.ts.map +1 -0
- package/dist/app/route-pattern.js +339 -0
- package/dist/app/route-pattern.js.map +1 -0
- package/dist/app/route-pattern.test.d.ts +2 -0
- package/dist/app/route-pattern.test.d.ts.map +1 -0
- package/dist/app/route-pattern.test.js +187 -0
- package/dist/app/route-pattern.test.js.map +1 -0
- package/dist/app/rules.d.ts +61 -0
- package/dist/app/rules.d.ts.map +1 -0
- package/dist/app/rules.js +90 -0
- package/dist/app/rules.js.map +1 -0
- package/dist/app/rules.test.d.ts +2 -0
- package/dist/app/rules.test.d.ts.map +1 -0
- package/dist/app/rules.test.js +69 -0
- package/dist/app/rules.test.js.map +1 -0
- package/dist/app/runner.d.ts +109 -0
- package/dist/app/runner.d.ts.map +1 -0
- package/dist/app/runner.js +429 -0
- package/dist/app/runner.js.map +1 -0
- package/dist/app/site.d.ts +73 -0
- package/dist/app/site.d.ts.map +1 -0
- package/dist/app/site.js +161 -0
- package/dist/app/site.js.map +1 -0
- package/dist/app/site.test.d.ts +2 -0
- package/dist/app/site.test.d.ts.map +1 -0
- package/dist/app/site.test.js +291 -0
- package/dist/app/site.test.js.map +1 -0
- package/dist/app/static-server.d.ts +20 -0
- package/dist/app/static-server.d.ts.map +1 -0
- package/dist/app/static-server.js +145 -0
- package/dist/app/static-server.js.map +1 -0
- package/dist/persistence/conversation-store.d.ts +21 -0
- package/dist/persistence/conversation-store.d.ts.map +1 -0
- package/dist/persistence/conversation-store.js +59 -0
- package/dist/persistence/conversation-store.js.map +1 -0
- package/dist/persistence/conversation-store.test.d.ts +2 -0
- package/dist/persistence/conversation-store.test.d.ts.map +1 -0
- package/dist/persistence/conversation-store.test.js +98 -0
- package/dist/persistence/conversation-store.test.js.map +1 -0
- package/dist/persistence/git-sync.d.ts +14 -1
- package/dist/persistence/git-sync.d.ts.map +1 -1
- package/dist/persistence/git-sync.js +73 -17
- package/dist/persistence/git-sync.js.map +1 -1
- package/dist/persistence/git-sync.test.js +155 -6
- package/dist/persistence/git-sync.test.js.map +1 -1
- package/dist/persistence/snapshot-sync.d.ts +19 -2
- package/dist/persistence/snapshot-sync.d.ts.map +1 -1
- package/dist/persistence/snapshot-sync.js +194 -83
- package/dist/persistence/snapshot-sync.js.map +1 -1
- package/dist/persistence/snapshot-sync.test.js +145 -27
- package/dist/persistence/snapshot-sync.test.js.map +1 -1
- package/dist/persistence/workspace.d.ts +3 -0
- package/dist/persistence/workspace.d.ts.map +1 -1
- package/dist/persistence/workspace.js +1 -0
- package/dist/persistence/workspace.js.map +1 -1
- package/dist/research/extract-texts.d.ts.map +1 -1
- package/dist/research/extract-texts.js +6 -13
- package/dist/research/extract-texts.js.map +1 -1
- package/dist/research/filingramp/attachment-tools.d.ts.map +1 -1
- package/dist/research/filingramp/attachment-tools.js +7 -4
- package/dist/research/filingramp/attachment-tools.js.map +1 -1
- package/dist/research/filingramp/shared.d.ts.map +1 -1
- package/dist/research/filingramp/shared.js +5 -5
- package/dist/research/filingramp/shared.js.map +1 -1
- package/dist/runtime/app-mode.d.ts +10 -0
- package/dist/runtime/app-mode.d.ts.map +1 -0
- package/dist/runtime/app-mode.js +172 -0
- package/dist/runtime/app-mode.js.map +1 -0
- package/dist/runtime/app-mode.test.d.ts +2 -0
- package/dist/runtime/app-mode.test.d.ts.map +1 -0
- package/dist/runtime/app-mode.test.js +130 -0
- package/dist/runtime/app-mode.test.js.map +1 -0
- package/dist/runtime/app-rehearsal.d.ts +2 -0
- package/dist/runtime/app-rehearsal.d.ts.map +1 -0
- package/dist/runtime/app-rehearsal.js +56 -0
- package/dist/runtime/app-rehearsal.js.map +1 -0
- package/dist/runtime/build-mode.d.ts +18 -0
- package/dist/runtime/build-mode.d.ts.map +1 -0
- package/dist/runtime/build-mode.js +108 -0
- package/dist/runtime/build-mode.js.map +1 -0
- package/dist/runtime/build-mode.test.d.ts +2 -0
- package/dist/runtime/build-mode.test.d.ts.map +1 -0
- package/dist/runtime/build-mode.test.js +159 -0
- package/dist/runtime/build-mode.test.js.map +1 -0
- package/dist/runtime/cli.js +7 -2
- package/dist/runtime/cli.js.map +1 -1
- package/dist/runtime/config.d.ts +4 -0
- package/dist/runtime/config.d.ts.map +1 -1
- package/dist/runtime/config.js +13 -2
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/guest-server.d.ts +3 -0
- package/dist/runtime/guest-server.d.ts.map +1 -0
- package/dist/runtime/{lambda-microvm.js → guest-server.js} +49 -18
- package/dist/runtime/guest-server.js.map +1 -0
- package/dist/runtime/image-hooks.d.ts +5 -0
- package/dist/runtime/image-hooks.d.ts.map +1 -0
- package/dist/runtime/image-hooks.js +68 -0
- package/dist/runtime/image-hooks.js.map +1 -0
- package/dist/runtime/image-hooks.test.d.ts +2 -0
- package/dist/runtime/image-hooks.test.d.ts.map +1 -0
- package/dist/runtime/image-hooks.test.js +74 -0
- package/dist/runtime/image-hooks.test.js.map +1 -0
- package/dist/runtime/index.d.ts +8 -3
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +53 -35
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/listening-ports.d.ts +13 -0
- package/dist/runtime/listening-ports.d.ts.map +1 -0
- package/dist/runtime/listening-ports.js +78 -0
- package/dist/runtime/listening-ports.js.map +1 -0
- package/dist/runtime/listening-ports.test.d.ts +2 -0
- package/dist/runtime/listening-ports.test.d.ts.map +1 -0
- package/dist/runtime/listening-ports.test.js +39 -0
- package/dist/runtime/listening-ports.test.js.map +1 -0
- package/dist/runtime/preview-proxy.d.ts +56 -0
- package/dist/runtime/preview-proxy.d.ts.map +1 -0
- package/dist/runtime/preview-proxy.js +302 -0
- package/dist/runtime/preview-proxy.js.map +1 -0
- package/dist/runtime/preview-proxy.test.d.ts +2 -0
- package/dist/runtime/preview-proxy.test.d.ts.map +1 -0
- package/dist/runtime/preview-proxy.test.js +122 -0
- package/dist/runtime/preview-proxy.test.js.map +1 -0
- package/dist/runtime/session-mode.d.ts +3 -0
- package/dist/runtime/session-mode.d.ts.map +1 -0
- package/dist/runtime/session-mode.js +60 -0
- package/dist/runtime/session-mode.js.map +1 -0
- package/dist/runtime/workload.d.ts +44 -0
- package/dist/runtime/workload.d.ts.map +1 -0
- package/dist/runtime/workload.js +222 -0
- package/dist/runtime/workload.js.map +1 -0
- package/dist/runtime/workload.test.d.ts +2 -0
- package/dist/runtime/workload.test.d.ts.map +1 -0
- package/dist/runtime/workload.test.js +235 -0
- package/dist/runtime/workload.test.js.map +1 -0
- package/dist/session/conversation.d.ts +3 -2
- package/dist/session/conversation.d.ts.map +1 -1
- package/dist/session/conversation.js +11 -7
- package/dist/session/conversation.js.map +1 -1
- package/dist/session/conversation.test.js +2 -3
- package/dist/session/conversation.test.js.map +1 -1
- package/dist/session/runtime.d.ts +16 -3
- package/dist/session/runtime.d.ts.map +1 -1
- package/dist/session/runtime.js +80 -13
- package/dist/session/runtime.js.map +1 -1
- package/dist/session/runtime.test.js +18 -7
- package/dist/session/runtime.test.js.map +1 -1
- package/dist/session/tools.d.ts.map +1 -1
- package/dist/session/tools.js +3 -3
- package/dist/session/tools.js.map +1 -1
- package/dist/task/loop.d.ts.map +1 -1
- package/dist/task/loop.js +6 -4
- package/dist/task/loop.js.map +1 -1
- package/dist/tools/exec-tools.d.ts +12 -0
- package/dist/tools/exec-tools.d.ts.map +1 -1
- package/dist/tools/exec-tools.js +46 -3
- package/dist/tools/exec-tools.js.map +1 -1
- package/dist/tools/exec-tools.test.d.ts +2 -0
- package/dist/tools/exec-tools.test.d.ts.map +1 -0
- package/dist/tools/exec-tools.test.js +48 -0
- package/dist/tools/exec-tools.test.js.map +1 -0
- package/dist/tools/fs-tools.d.ts.map +1 -1
- package/dist/tools/fs-tools.js +5 -5
- package/dist/tools/fs-tools.js.map +1 -1
- package/dist/transport/link.d.ts.map +1 -1
- package/dist/transport/link.js +16 -5
- package/dist/transport/link.js.map +1 -1
- package/dist/transport/link.test.js +24 -0
- package/dist/transport/link.test.js.map +1 -1
- package/dist/transport/protocol.d.ts +215 -3
- package/dist/transport/protocol.d.ts.map +1 -1
- package/dist/transport/protocol.js +163 -7
- package/dist/transport/protocol.js.map +1 -1
- package/dist/transport/protocol.test.js +41 -0
- package/dist/transport/protocol.test.js.map +1 -1
- package/dist/workspace-sync/eligibility.d.ts +14 -0
- package/dist/workspace-sync/eligibility.d.ts.map +1 -0
- package/dist/workspace-sync/eligibility.js +53 -0
- package/dist/workspace-sync/eligibility.js.map +1 -0
- package/dist/workspace-sync/merge.d.ts +15 -0
- package/dist/workspace-sync/merge.d.ts.map +1 -0
- package/dist/workspace-sync/merge.js +66 -0
- package/dist/workspace-sync/merge.js.map +1 -0
- package/dist/workspace-sync/merge.test.d.ts +2 -0
- package/dist/workspace-sync/merge.test.d.ts.map +1 -0
- package/dist/workspace-sync/merge.test.js +28 -0
- package/dist/workspace-sync/merge.test.js.map +1 -0
- package/dist/workspace-sync/workspace-sync.d.ts +48 -0
- package/dist/workspace-sync/workspace-sync.d.ts.map +1 -0
- package/dist/workspace-sync/workspace-sync.js +308 -0
- package/dist/workspace-sync/workspace-sync.js.map +1 -0
- package/dist/workspace-sync/workspace-sync.test.d.ts +2 -0
- package/dist/workspace-sync/workspace-sync.test.d.ts.map +1 -0
- package/dist/workspace-sync/workspace-sync.test.js +111 -0
- package/dist/workspace-sync/workspace-sync.test.js.map +1 -0
- package/dist/workspace-sync/write-drafts.d.ts +24 -0
- package/dist/workspace-sync/write-drafts.d.ts.map +1 -0
- package/dist/workspace-sync/write-drafts.js +87 -0
- package/dist/workspace-sync/write-drafts.js.map +1 -0
- package/dist/workspace-sync/write-drafts.test.d.ts +2 -0
- package/dist/workspace-sync/write-drafts.test.d.ts.map +1 -0
- package/dist/workspace-sync/write-drafts.test.js +36 -0
- package/dist/workspace-sync/write-drafts.test.js.map +1 -0
- package/package.json +12 -2
- package/dist/runtime/lambda-microvm.d.ts +0 -3
- package/dist/runtime/lambda-microvm.d.ts.map +0 -1
- package/dist/runtime/lambda-microvm.js.map +0 -1
package/dist/runtime/config.js
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.loadConfigFromEnv = loadConfigFromEnv;
|
|
7
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
4
9
|
const protocol_1 = require("../transport/protocol");
|
|
10
|
+
/** Root's alone: the runtime's files, out of reach of everything it runs. */
|
|
11
|
+
const DEFAULT_STATE_DIR = '/var/lib/agent';
|
|
5
12
|
const DEFAULT_MODEL = 'anthropic/claude-sonnet-5.5';
|
|
6
13
|
const DEFAULT_WORKSPACE_DIR = '/workspace';
|
|
7
14
|
function decodeMcpConnections(raw) {
|
|
@@ -49,7 +56,7 @@ function filingRampFromEnv(env) {
|
|
|
49
56
|
industryData: env[protocol_1.AGENT_ENV.FILINGRAMP_INDUSTRY_DATA] === 'true',
|
|
50
57
|
};
|
|
51
58
|
}
|
|
52
|
-
function gitFromEnv(env, sessionId, workspaceDir) {
|
|
59
|
+
function gitFromEnv(env, sessionId, workspaceDir, stateDir) {
|
|
53
60
|
const serverUrl = env[protocol_1.AGENT_ENV.GIT_SERVER_URL];
|
|
54
61
|
const repository = env[protocol_1.AGENT_ENV.GIT_REPOSITORY];
|
|
55
62
|
const token = env[protocol_1.AGENT_ENV.ACCESS_TOKEN];
|
|
@@ -61,12 +68,14 @@ function gitFromEnv(env, sessionId, workspaceDir) {
|
|
|
61
68
|
serverUrl: serverUrl.replace(/\/+$/, ''),
|
|
62
69
|
repository,
|
|
63
70
|
dir: env[protocol_1.AGENT_ENV.GIT_REPOSITORY_DIR] || workspaceDir,
|
|
71
|
+
gitDir: node_path_1.default.join(stateDir, 'git'),
|
|
64
72
|
branch: env[protocol_1.AGENT_ENV.GIT_BRANCH] || `session/${sessionId}`,
|
|
65
73
|
token,
|
|
66
74
|
};
|
|
67
75
|
}
|
|
68
76
|
/** Reads the full run config from process.env — the guest's own contract, see AGENT_ENV in protocol.ts. */
|
|
69
77
|
function loadConfigFromEnv(env = process.env) {
|
|
78
|
+
var _a;
|
|
70
79
|
const sessionId = env[protocol_1.AGENT_ENV.SESSION_ID];
|
|
71
80
|
if (!sessionId)
|
|
72
81
|
throw new Error('SESSION_ID is required');
|
|
@@ -76,6 +85,7 @@ function loadConfigFromEnv(env = process.env) {
|
|
|
76
85
|
if (mode === 'task' && !task)
|
|
77
86
|
throw new Error('AGENT_TASK is required in task mode');
|
|
78
87
|
const workspaceDir = env[protocol_1.AGENT_ENV.AGENT_WORKSPACE_DIR] || DEFAULT_WORKSPACE_DIR;
|
|
88
|
+
const stateDir = env[protocol_1.AGENT_ENV.AGENT_STATE_DIR] || (((_a = process.getuid) === null || _a === void 0 ? void 0 : _a.call(process)) === 0 ? DEFAULT_STATE_DIR : node_path_1.default.join(node_os_1.default.tmpdir(), `agent-state-${sessionId}`));
|
|
79
89
|
const model = env[protocol_1.AGENT_ENV.AGENT_MODEL] || DEFAULT_MODEL;
|
|
80
90
|
const storageUrl = env[protocol_1.AGENT_ENV.SESSION_STORAGE_URL];
|
|
81
91
|
// The same ACCESS_TOKEN serves Git or storage, so only a storage URL without it is incomplete.
|
|
@@ -100,7 +110,8 @@ function loadConfigFromEnv(env = process.env) {
|
|
|
100
110
|
},
|
|
101
111
|
filingRamp: filingRampFromEnv(env),
|
|
102
112
|
researchScope: parseScope(env[protocol_1.AGENT_ENV.FILINGRAMP_RESEARCH_SCOPE_JSON]),
|
|
103
|
-
|
|
113
|
+
stateDir,
|
|
114
|
+
git: gitFromEnv(env, sessionId, workspaceDir, stateDir),
|
|
104
115
|
sessionStorage: storageUrl && storageToken ? { url: storageUrl, token: storageToken, dir: workspaceDir } : undefined,
|
|
105
116
|
};
|
|
106
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest-server.d.ts","sourceRoot":"","sources":["../../src/runtime/guest-server.ts"],"names":[],"mappings":""}
|
|
@@ -4,8 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
5
|
};
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
//
|
|
8
|
-
//
|
|
7
|
+
// The guest's main process, on every engine: it holds port 8080 and starts the agent. On Lambda
|
|
8
|
+
// MicroVM, AWS's platform calls the lifecycle hooks
|
|
9
|
+
// (/aws/lambda-microvms/runtime/v1/{run,resume,suspend,terminate}) on that port and expects a
|
|
9
10
|
// response before it considers the instance up (createMicrovmImages registers every image with
|
|
10
11
|
// hooks: { run/resume/suspend/terminate: 'ENABLED' } — libs/sandbox/src/microvm-images.ts —
|
|
11
12
|
// this isn't optional). Per-run config (env vars) arrives as the /run hook's runHookPayload,
|
|
@@ -13,20 +14,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13
14
|
//
|
|
14
15
|
// The hook server stays up for the whole life of the VM: `suspend` and `terminate` checkpoint
|
|
15
16
|
// the session (conversation + workspace to the git server), `resume` re-announces the agent.
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
// directly.
|
|
17
|
+
// Apps never get port 8080: it also serves the live preview (preview-proxy.ts), which forwards to
|
|
18
|
+
// the port an app actually listens on. Engines without a hook caller (Docker, Fargate) set
|
|
19
|
+
// SESSION_ID in the real env at boot, which starts the agent directly.
|
|
19
20
|
const child_process_1 = require("child_process");
|
|
20
21
|
const fs_1 = __importDefault(require("fs"));
|
|
21
22
|
const http_1 = __importDefault(require("http"));
|
|
23
|
+
const image_hooks_1 = require("./image-hooks");
|
|
22
24
|
const index_1 = require("./index");
|
|
23
25
|
const microvm_bootstrap_1 = require("./microvm-bootstrap");
|
|
26
|
+
const preview_proxy_1 = require("./preview-proxy");
|
|
24
27
|
const HOOK_PREFIX = '/aws/lambda-microvms/runtime/v1/';
|
|
25
|
-
const PORT = 8080;
|
|
26
28
|
let running;
|
|
27
29
|
let starting;
|
|
28
30
|
const bootstrap = new microvm_bootstrap_1.MicrovmBootstrap();
|
|
29
31
|
const DROPBEAR_HOST_KEY = '/etc/dropbear/dropbear_rsa_host_key';
|
|
32
|
+
const imageHook = (0, image_hooks_1.imageHooks)();
|
|
30
33
|
/**
|
|
31
34
|
* entrypoint.sh starts dropbear only when the keys are in the boot env (Docker, Fargate). A
|
|
32
35
|
* Lambda MicroVM boots while its image is built, before any session exists, so its keys arrive
|
|
@@ -50,7 +53,12 @@ function configured() {
|
|
|
50
53
|
catch (error) {
|
|
51
54
|
console.error('ssh setup failed:', error instanceof Error ? error.message : error);
|
|
52
55
|
}
|
|
53
|
-
|
|
56
|
+
if (hasSomethingToRun())
|
|
57
|
+
void start().catch(() => undefined);
|
|
58
|
+
}
|
|
59
|
+
/** A VM from an image with no run configuration, as AWS starts one to validate a new image: nothing to do. */
|
|
60
|
+
function hasSomethingToRun() {
|
|
61
|
+
return Boolean(process.env.SESSION_ID || process.env.AGENT_MODE);
|
|
54
62
|
}
|
|
55
63
|
function start() {
|
|
56
64
|
if (!starting) {
|
|
@@ -70,6 +78,10 @@ function start() {
|
|
|
70
78
|
async function onHook(hook, body) {
|
|
71
79
|
switch (hook) {
|
|
72
80
|
case 'run': {
|
|
81
|
+
// Anything in the VM can reach this port. Once the agent is starting, the only caller left
|
|
82
|
+
// is a workload, and this configures the VM (its SSH keys among it).
|
|
83
|
+
if (starting)
|
|
84
|
+
return;
|
|
73
85
|
let payload;
|
|
74
86
|
try {
|
|
75
87
|
const parsed = JSON.parse(body);
|
|
@@ -85,7 +97,8 @@ async function onHook(hook, body) {
|
|
|
85
97
|
}
|
|
86
98
|
case 'suspend':
|
|
87
99
|
case 'terminate':
|
|
88
|
-
|
|
100
|
+
if (hasSomethingToRun())
|
|
101
|
+
await (0, index_1.checkpointBeforeFreeze)(starting, hook);
|
|
89
102
|
return;
|
|
90
103
|
case 'resume':
|
|
91
104
|
// Memory and disk survived. The socket reconnects on its own, and the link re-announces
|
|
@@ -95,8 +108,11 @@ async function onHook(hook, body) {
|
|
|
95
108
|
return;
|
|
96
109
|
}
|
|
97
110
|
}
|
|
98
|
-
const server = http_1.default.createServer((req, res) => {
|
|
99
|
-
var _a, _b;
|
|
111
|
+
const server = http_1.default.createServer((0, preview_proxy_1.guardRequests)((req, res) => {
|
|
112
|
+
var _a, _b, _c, _d;
|
|
113
|
+
// First: a preview request belongs to the app whatever its path, never to the hooks below.
|
|
114
|
+
if ((0, preview_proxy_1.proxyPreviewRequest)(req, res))
|
|
115
|
+
return;
|
|
100
116
|
if (req.url === '/internal/bootstrap' && req.method === 'POST') {
|
|
101
117
|
if (!bootstrap.authorized(req.headers.authorization)) {
|
|
102
118
|
res.writeHead(401, { Connection: 'close' });
|
|
@@ -134,7 +150,13 @@ const server = http_1.default.createServer((req, res) => {
|
|
|
134
150
|
});
|
|
135
151
|
return;
|
|
136
152
|
}
|
|
137
|
-
|
|
153
|
+
const asked = ((_a = req.url) === null || _a === void 0 ? void 0 : _a.startsWith(HOOK_PREFIX)) ? imageHook[req.url.slice(HOOK_PREFIX.length)] : undefined;
|
|
154
|
+
if (asked) {
|
|
155
|
+
res.writeHead(asked(), { 'Content-Type': 'application/json' });
|
|
156
|
+
res.end('{}');
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (((_b = req.url) === null || _b === void 0 ? void 0 : _b.startsWith(HOOK_PREFIX)) && req.method === 'POST') {
|
|
138
160
|
const hook = req.url.slice(HOOK_PREFIX.length);
|
|
139
161
|
const chunks = [];
|
|
140
162
|
req.on('data', (chunk) => chunks.push(chunk));
|
|
@@ -157,13 +179,22 @@ const server = http_1.default.createServer((req, res) => {
|
|
|
157
179
|
});
|
|
158
180
|
return;
|
|
159
181
|
}
|
|
182
|
+
// A deployment (AGENT_MODE=app): everything else is its app's.
|
|
183
|
+
if ((0, preview_proxy_1.proxyAppRequest)(req, res))
|
|
184
|
+
return;
|
|
160
185
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
161
|
-
res.end(JSON.stringify({ status: 'ok', path: req.url, session: (
|
|
162
|
-
});
|
|
163
|
-
server.
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
186
|
+
res.end(JSON.stringify({ status: 'ok', path: req.url, session: (_d = (_c = running === null || running === void 0 ? void 0 : running.config) === null || _c === void 0 ? void 0 : _c.sessionId) !== null && _d !== void 0 ? _d : null }));
|
|
187
|
+
}));
|
|
188
|
+
server.on('upgrade', (0, preview_proxy_1.guardUpgrades)((req, socket, head) => {
|
|
189
|
+
if (!(0, preview_proxy_1.proxyPreviewUpgrade)(req, socket, head))
|
|
190
|
+
socket.destroy();
|
|
191
|
+
}));
|
|
192
|
+
server.listen(preview_proxy_1.GUEST_HTTP_PORT, () => {
|
|
193
|
+
console.log(`agent lifecycle hook server listening on ${preview_proxy_1.GUEST_HTTP_PORT}`);
|
|
194
|
+
// Ahead of the build's first /ready, and of a VM's first request on the engines that have no hooks.
|
|
195
|
+
imageHook.ready();
|
|
196
|
+
// Docker / Fargate: no lifecycle hook caller, so what's already in the env drives startup.
|
|
197
|
+
if (hasSomethingToRun())
|
|
167
198
|
setImmediate(() => void start().catch(() => undefined));
|
|
168
199
|
});
|
|
169
200
|
let shuttingDown = false;
|
|
@@ -183,4 +214,4 @@ for (const signal of ['SIGTERM', 'SIGINT']) {
|
|
|
183
214
|
});
|
|
184
215
|
});
|
|
185
216
|
}
|
|
186
|
-
//# sourceMappingURL=
|
|
217
|
+
//# sourceMappingURL=guest-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest-server.js","sourceRoot":"","sources":["../../src/runtime/guest-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type ImageHookStatus = 200 | 500 | 503;
|
|
2
|
+
/** Asking starts `work`, once. Then it's 503 until it's over, and how that went from there on. */
|
|
3
|
+
export declare function polledHook(work: () => Promise<void>): () => ImageHookStatus;
|
|
4
|
+
export declare function imageHooks(env?: NodeJS.ProcessEnv): Record<string, () => ImageHookStatus>;
|
|
5
|
+
//# sourceMappingURL=image-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-hooks.d.ts","sourceRoot":"","sources":["../../src/runtime/image-hooks.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,eAAe,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAE7C,kGAAkG;AAClG,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,eAAe,CAiB3E;AAQD,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,eAAe,CAAC,CAEtG"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.polledHook = polledHook;
|
|
37
|
+
exports.imageHooks = imageHooks;
|
|
38
|
+
// What a Lambda MicroVM image's build asks the guest. /ready: can this be snapshotted yet? The code a
|
|
39
|
+
// VM from this image runs loads first, so it's in the snapshot rather than read at every start.
|
|
40
|
+
// /validate, on a VM started from the result: does it work? They answer 503 until they know, as AWS
|
|
41
|
+
// asks, rather than hold the request open: past its timeout that ends the build.
|
|
42
|
+
const index_1 = require("./index");
|
|
43
|
+
/** Asking starts `work`, once. Then it's 503 until it's over, and how that went from there on. */
|
|
44
|
+
function polledHook(work) {
|
|
45
|
+
let status;
|
|
46
|
+
return () => {
|
|
47
|
+
if (!status) {
|
|
48
|
+
status = 503;
|
|
49
|
+
work().then(() => {
|
|
50
|
+
status = 200;
|
|
51
|
+
}, (error) => {
|
|
52
|
+
status = 500;
|
|
53
|
+
console.error('image hook failed:', error instanceof Error ? error.message : error);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return status;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async function validateImage(env) {
|
|
60
|
+
if (env.GUEST_IMAGE !== 'app')
|
|
61
|
+
return;
|
|
62
|
+
const { rehearseColdStart } = await Promise.resolve().then(() => __importStar(require('./app-rehearsal')));
|
|
63
|
+
await rehearseColdStart();
|
|
64
|
+
}
|
|
65
|
+
function imageHooks(env = process.env) {
|
|
66
|
+
return { ready: polledHook(() => (0, index_1.loadImageCode)(env)), validate: polledHook(() => validateImage(env)) };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=image-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-hooks.js","sourceRoot":"","sources":["../../src/runtime/image-hooks.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,gCAiBC;AAQD,gCAEC;AApCD,sGAAsG;AACtG,gGAAgG;AAChG,oGAAoG;AACpG,iFAAiF;AACjF,mCAAuC;AAIvC,kGAAkG;AAClG,SAAgB,UAAU,CAAC,IAAyB;IAClD,IAAI,MAAmC,CAAA;IACvC,OAAO,GAAG,EAAE;QACV,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,CAAA;YACZ,IAAI,EAAE,CAAC,IAAI,CACT,GAAG,EAAE;gBACH,MAAM,GAAG,GAAG,CAAA;YACd,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;gBACjB,MAAM,GAAG,GAAG,CAAA;gBACZ,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YACrF,CAAC,CACF,CAAA;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAsB;IACjD,IAAI,GAAG,CAAC,WAAW,KAAK,KAAK;QAAE,OAAM;IACrC,MAAM,EAAE,iBAAiB,EAAE,GAAG,wDAAa,iBAAiB,GAAC,CAAA;IAC7D,MAAM,iBAAiB,EAAE,CAAA;AAC3B,CAAC;AAED,SAAgB,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,IAAA,qBAAa,EAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,CAAA;AACxG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-hooks.test.d.ts","sourceRoot":"","sources":["../../src/runtime/image-hooks.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
7
|
+
const node_child_process_1 = require("node:child_process");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const node_test_1 = require("node:test");
|
|
10
|
+
const image_hooks_1 = require("./image-hooks");
|
|
11
|
+
const until = async (hook, status) => {
|
|
12
|
+
for (let tries = 0; tries < 2000 && hook() !== status; tries += 1)
|
|
13
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
14
|
+
strict_1.default.equal(hook(), status);
|
|
15
|
+
};
|
|
16
|
+
(0, node_test_1.describe)('a hook the image build polls', () => {
|
|
17
|
+
(0, node_test_1.it)('answers 503 while it works, rather than hold the request open, and runs once', async () => {
|
|
18
|
+
let runs = 0;
|
|
19
|
+
let finish;
|
|
20
|
+
const hook = (0, image_hooks_1.polledHook)(() => {
|
|
21
|
+
runs += 1;
|
|
22
|
+
return new Promise((resolve) => {
|
|
23
|
+
finish = resolve;
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
strict_1.default.equal(hook(), 503);
|
|
27
|
+
strict_1.default.equal(hook(), 503);
|
|
28
|
+
finish();
|
|
29
|
+
await until(hook, 200);
|
|
30
|
+
strict_1.default.equal(runs, 1);
|
|
31
|
+
});
|
|
32
|
+
(0, node_test_1.it)('fails the build when the work fails', async () => {
|
|
33
|
+
const hook = (0, image_hooks_1.polledHook)(() => Promise.reject(new Error('no tar')));
|
|
34
|
+
hook();
|
|
35
|
+
await until(hook, 500);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
(0, node_test_1.describe)('what an image loads ahead of its snapshot', () => {
|
|
39
|
+
const loaded = (script) => {
|
|
40
|
+
var _a;
|
|
41
|
+
return JSON.parse((0, node_child_process_1.execFileSync)(process.execPath, ['-e', `
|
|
42
|
+
const hooks = require(${JSON.stringify(node_path_1.default.join(__dirname, 'image-hooks.js'))}).imageHooks();
|
|
43
|
+
${script}
|
|
44
|
+
const wait = setInterval(() => {
|
|
45
|
+
if (hooks.ready() === 503) return
|
|
46
|
+
clearInterval(wait)
|
|
47
|
+
console.log(JSON.stringify(Object.keys(require.cache)))
|
|
48
|
+
}, 5)
|
|
49
|
+
`], { encoding: 'utf8', env: { PATH: process.env.PATH, NODE_PATH: (_a = process.env.NODE_PATH) !== null && _a !== void 0 ? _a : '', GUEST_IMAGE: script.includes('app') ? 'app' : '' } }))
|
|
50
|
+
.map((file) => node_path_1.default.relative(node_path_1.default.resolve(__dirname, '..'), file));
|
|
51
|
+
};
|
|
52
|
+
(0, node_test_1.it)('is an app\'s code in the app image, with no session agent in its memory', () => {
|
|
53
|
+
const files = loaded('// app');
|
|
54
|
+
strict_1.default.ok(files.includes(node_path_1.default.join('runtime', 'app-mode.js')));
|
|
55
|
+
strict_1.default.ok(!files.some((file) => file.startsWith(`session${node_path_1.default.sep}`) || file.includes('session-mode')), 'session code loaded');
|
|
56
|
+
strict_1.default.ok(!files.some((file) => file.includes('socket.io')), 'its link loaded');
|
|
57
|
+
});
|
|
58
|
+
(0, node_test_1.it)('is the session agent in the agent image', () => {
|
|
59
|
+
strict_1.default.ok(loaded('').includes(node_path_1.default.join('runtime', 'session-mode.js')));
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
(0, node_test_1.describe)('validating a new image', () => {
|
|
63
|
+
(0, node_test_1.it)('rehearses a real cold start of an app: an archive unpacked, a server started and asked', async () => {
|
|
64
|
+
const hook = (0, image_hooks_1.imageHooks)({ GUEST_IMAGE: 'app' }).validate;
|
|
65
|
+
strict_1.default.equal(hook(), 503);
|
|
66
|
+
await until(hook, 200);
|
|
67
|
+
});
|
|
68
|
+
(0, node_test_1.it)('has nothing to rehearse in the agent image', async () => {
|
|
69
|
+
const hook = (0, image_hooks_1.imageHooks)({}).validate;
|
|
70
|
+
hook();
|
|
71
|
+
await until(hook, 200);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=image-hooks.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-hooks.test.js","sourceRoot":"","sources":["../../src/runtime/image-hooks.test.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { SessionAgent } from '../session';
|
|
2
|
+
import type { AgentRuntimeConfig } from './config';
|
|
3
3
|
export interface RunningAgent {
|
|
4
|
-
|
|
4
|
+
/** Absent in app mode, which runs no agent. */
|
|
5
|
+
config?: AgentRuntimeConfig;
|
|
5
6
|
/** Present in session mode only. */
|
|
6
7
|
session?: SessionAgent;
|
|
8
|
+
/** App mode: a deployment, which stays up serving its app. */
|
|
9
|
+
app?: boolean;
|
|
7
10
|
close(): Promise<void>;
|
|
8
11
|
}
|
|
9
12
|
/** A lifecycle request can race startup; never acknowledge a freeze before restore finishes. */
|
|
10
13
|
export declare function checkpointBeforeFreeze(starting: Promise<RunningAgent> | undefined, reason: string): Promise<void>;
|
|
11
14
|
export declare function startAgent(env?: NodeJS.ProcessEnv): Promise<RunningAgent>;
|
|
15
|
+
/** Loads what this image runs ahead of any VM (GUEST_IMAGE, set by its Dockerfile), so that's in its snapshot. */
|
|
16
|
+
export declare function loadImageCode(env?: NodeJS.ProcessEnv): Promise<void>;
|
|
12
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAElD,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,oCAAoC;IACpC,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,gGAAgG;AAChG,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvH;AAED,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,YAAY,CAAC,CAgB5F;AAED,kHAAkH;AAClH,wBAAsB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF"}
|
package/dist/runtime/index.js
CHANGED
|
@@ -1,15 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.checkpointBeforeFreeze = checkpointBeforeFreeze;
|
|
4
37
|
exports.startAgent = startAgent;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
// session mode stays up and resolves with the running agent so lifecycle hooks can reach it.
|
|
8
|
-
const config_1 = require("./config");
|
|
9
|
-
const link_1 = require("../transport/link");
|
|
10
|
-
const loop_1 = require("../task/loop");
|
|
11
|
-
const reporter_1 = require("../transport/reporter");
|
|
12
|
-
const session_1 = require("../session");
|
|
38
|
+
exports.loadImageCode = loadImageCode;
|
|
39
|
+
const protocol_1 = require("../transport/protocol");
|
|
13
40
|
/** A lifecycle request can race startup; never acknowledge a freeze before restore finishes. */
|
|
14
41
|
async function checkpointBeforeFreeze(starting, reason) {
|
|
15
42
|
var _a;
|
|
@@ -19,34 +46,25 @@ async function checkpointBeforeFreeze(starting, reason) {
|
|
|
19
46
|
await ((_a = agent.session) === null || _a === void 0 ? void 0 : _a.checkpoint(reason));
|
|
20
47
|
}
|
|
21
48
|
async function startAgent(env = process.env) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
return {
|
|
31
|
-
config,
|
|
32
|
-
session,
|
|
33
|
-
async close() {
|
|
34
|
-
try {
|
|
35
|
-
await session.stop();
|
|
36
|
-
}
|
|
37
|
-
finally {
|
|
38
|
-
await link.close();
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
};
|
|
49
|
+
// A VM for a session's tools to write files and run commands in: nothing to start, only the guest
|
|
50
|
+
// to stay up.
|
|
51
|
+
if (env[protocol_1.AGENT_ENV.AGENT_MODE] === 'workspace')
|
|
52
|
+
return { app: true, close: async () => undefined };
|
|
53
|
+
if (env[protocol_1.AGENT_ENV.AGENT_MODE] === 'app') {
|
|
54
|
+
const { startDeployedApp } = await Promise.resolve().then(() => __importStar(require('./app-mode')));
|
|
55
|
+
const deployed = await startDeployedApp(env);
|
|
56
|
+
return { app: true, close: () => deployed.close() };
|
|
42
57
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
58
|
+
if (env[protocol_1.AGENT_ENV.AGENT_MODE] === 'build') {
|
|
59
|
+
const { startReleaseBuild } = await Promise.resolve().then(() => __importStar(require('./build-mode')));
|
|
60
|
+
const build = startReleaseBuild(env);
|
|
61
|
+
return { app: true, close: () => build.close() };
|
|
46
62
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
63
|
+
const { startSessionOrTask } = await Promise.resolve().then(() => __importStar(require('./session-mode')));
|
|
64
|
+
return startSessionOrTask(env);
|
|
65
|
+
}
|
|
66
|
+
/** Loads what this image runs ahead of any VM (GUEST_IMAGE, set by its Dockerfile), so that's in its snapshot. */
|
|
67
|
+
async function loadImageCode(env = process.env) {
|
|
68
|
+
await (env.GUEST_IMAGE === 'app' ? Promise.resolve().then(() => __importStar(require('./app-mode'))) : Promise.resolve().then(() => __importStar(require('./session-mode'))));
|
|
51
69
|
}
|
|
52
70
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,wDAIC;AAED,gCAgBC;AAGD,sCAEC;AAzCD,oDAAiD;AAajD,gGAAgG;AACzF,KAAK,UAAU,sBAAsB,CAAC,QAA2C,EAAE,MAAc;;IACtG,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;IAC1F,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAA;IAC5B,MAAM,CAAA,MAAA,KAAK,CAAC,OAAO,0CAAE,UAAU,CAAC,MAAM,CAAC,CAAA,CAAA;AACzC,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnE,kGAAkG;IAClG,cAAc;IACd,IAAI,GAAG,CAAC,oBAAS,CAAC,UAAU,CAAC,KAAK,WAAW;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,CAAA;IACjG,IAAI,GAAG,CAAC,oBAAS,CAAC,UAAU,CAAC,KAAK,KAAK,EAAE,CAAC;QACxC,MAAM,EAAE,gBAAgB,EAAE,GAAG,wDAAa,YAAY,GAAC,CAAA;QACvD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC5C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAA;IACrD,CAAC;IACD,IAAI,GAAG,CAAC,oBAAS,CAAC,UAAU,CAAC,KAAK,OAAO,EAAE,CAAC;QAC1C,MAAM,EAAE,iBAAiB,EAAE,GAAG,wDAAa,cAAc,GAAC,CAAA;QAC1D,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;QACpC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAA;IAClD,CAAC;IACD,MAAM,EAAE,kBAAkB,EAAE,GAAG,wDAAa,gBAAgB,GAAC,CAAA;IAC7D,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAA;AAChC,CAAC;AAED,kHAAkH;AAC3G,KAAK,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG;IACtE,MAAM,CAAC,GAAG,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC,mDAAQ,YAAY,IAAE,CAAC,mDAAQ,gBAAgB,GAAC,CAAC,CAAA;AACrF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Listening, loopback-reachable ports in one /proc/net/tcp{,6} table. */
|
|
2
|
+
export declare function parseListeningPorts(table: string): number[];
|
|
3
|
+
/** Every previewable port, ascending. Empty off Linux, where there is no /proc to read. */
|
|
4
|
+
export declare function listListeningPorts(tables?: readonly string[]): Promise<number[]>;
|
|
5
|
+
/**
|
|
6
|
+
* Calls `onChange` with the current ports once, then whenever they change. Returns the stop.
|
|
7
|
+
* Polled, not watched: /proc files emit no change events.
|
|
8
|
+
*/
|
|
9
|
+
export declare function watchListeningPorts(onChange: (ports: number[]) => void, options?: {
|
|
10
|
+
intervalMs?: number;
|
|
11
|
+
list?: () => Promise<number[]>;
|
|
12
|
+
}): () => void;
|
|
13
|
+
//# sourceMappingURL=listening-ports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listening-ports.d.ts","sourceRoot":"","sources":["../../src/runtime/listening-ports.ts"],"names":[],"mappings":"AAoBA,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAW3D;AAED,2FAA2F;AAC3F,wBAAsB,kBAAkB,CAAC,MAAM,GAAE,SAAS,MAAM,EAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOrG;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,EACnC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAAO,GACpE,MAAM,IAAI,CAmBZ"}
|