@amodalai/amodal 0.3.88 → 0.3.90
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/CHANGELOG.md +45 -0
- package/dist/src/commands/build.d.ts +23 -5
- package/dist/src/commands/build.d.ts.map +1 -1
- package/dist/src/commands/build.js +52 -33
- package/dist/src/commands/build.js.map +1 -1
- package/dist/src/commands/chat.d.ts +1 -1
- package/dist/src/commands/chat.js +5 -5
- package/dist/src/commands/chat.js.map +1 -1
- package/dist/src/commands/serve.d.ts +2 -11
- package/dist/src/commands/serve.d.ts.map +1 -1
- package/dist/src/commands/serve.js +44 -87
- package/dist/src/commands/serve.js.map +1 -1
- package/dist/src/shared/platform-client.d.ts +6 -19
- package/dist/src/shared/platform-client.d.ts.map +1 -1
- package/dist/src/shared/platform-client.js +4 -21
- package/dist/src/shared/platform-client.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/src/commands/build.test.ts +14 -9
- package/src/commands/build.ts +72 -32
- package/src/commands/chat.ts +5 -5
- package/src/commands/serve.ts +46 -93
- package/src/e2e-commands.test.ts +18 -17
- package/src/shared/platform-client.test.ts +0 -36
- package/src/shared/platform-client.ts +10 -34
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,50 @@
|
|
|
1
1
|
# @amodalai/amodal
|
|
2
2
|
|
|
3
|
+
## 0.3.90
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- e31c71f: **Hosted runtime now loads agents from disk like OSS does** — same code path, same bundle hydration, same driver discovery. The standalone deploy-snapshot abstraction is gone.
|
|
8
|
+
|
|
9
|
+
Removed:
|
|
10
|
+
- `@amodalai/core` exports `buildSnapshot`, `snapshotToBundle`, `loadSnapshotFromFile`, `serializeSnapshot`, `snapshotSizeBytes`, `parseSurfaceFromSnapshot`, and the entire `packages/core/src/snapshot/` module.
|
|
11
|
+
- `@amodalai/types` exports `DeploySnapshot`, `SnapshotConnection`, `SnapshotSkill`, `SnapshotAutomation`, `SnapshotKnowledge`, `SnapshotTool`, `SnapshotSubagent`, `SnapshotEval`, `BuildSnapshotOptions`.
|
|
12
|
+
- `@amodalai/runtime` exports `createSnapshotServer` / `SnapshotServerConfig`.
|
|
13
|
+
- `@amodalai/amodal` `getActiveSnapshot` / `uploadSnapshot` methods on `PlatformClient`. `SnapshotDeploymentMeta` renamed to `DeploymentMeta`.
|
|
14
|
+
|
|
15
|
+
Added / renamed:
|
|
16
|
+
- `@amodalai/types` `ToolBuildManifest` and `ToolBuildManifestEntry` (moved from `snapshot-types.ts` into `tool-types.ts`; renamed from `SnapshotBuildManifest` / `SnapshotToolManifestEntry`). These describe tool sandbox snapshots, which are a distinct concept from deploy snapshots and survive the deletion.
|
|
17
|
+
- `@amodalai/runtime` `createBundleServer` / `BundleServerConfig` — drop-in replacement for the old snapshot-server, loads from a repo directory (or extracted tarball) via `loadRepoFromDisk`.
|
|
18
|
+
- `@amodalai/types` `RepoLoadOptions.resolvedCredentials?: Record<string, string>` — pre-resolved credentials passed to every `ConnectionDriver.loadConnection()` call as `LoadConnectionOptions.credentials`, and stamped onto the returned `AgentBundle.resolvedCredentials`. Community drivers (SQL, GraphQL, etc.) can resolve `env:KEY` references in their spec.json against deploy-time secrets, not just `process.env`.
|
|
19
|
+
|
|
20
|
+
Changed CLI behavior:
|
|
21
|
+
- `amodal build` now writes `<output>/agent.tar.gz` (the bundle) and `<output>/manifest.json` (audit metadata: deployId, commitSha, branch, agentName, source, optional toolBuildManifest). Default output dir is `./build/` (was `resolved-config.json`).
|
|
22
|
+
- `amodal serve --config <path>` now accepts a bundle directory or a `.tar.gz` (auto-extracted). `--platform` mode dropped; equivalent flow is to download the tarball and pass `--config`.
|
|
23
|
+
- `amodal chat --config <path>` likewise accepts a bundle directory.
|
|
24
|
+
- Deployment-listing endpoints in `PlatformClient` (`listDeployments`, `rollback`, `promote`, `getStatus`) now hit `/api/deployments` (was `/api/snapshot-deployments`). Cloud-side rename to follow.
|
|
25
|
+
|
|
26
|
+
This is the OSS half of a coordinated change. Cloud-side (build-server, platform-api, hosted-runtime) follows: hosted-runtime fetches `repo.tar.gz` from R2 at boot and calls `loadRepoFromDisk`; `CHANNEL_CONFIG` env injection is dropped (channels are read from `bundle.channels`); the deployments table stops storing `snapshot` JSONB.
|
|
27
|
+
|
|
28
|
+
- Updated dependencies [e31c71f]
|
|
29
|
+
- @amodalai/types@0.3.90
|
|
30
|
+
- @amodalai/core@0.3.90
|
|
31
|
+
- @amodalai/runtime@0.3.90
|
|
32
|
+
- @amodalai/db@0.3.90
|
|
33
|
+
- @amodalai/runtime-app@0.3.90
|
|
34
|
+
- @amodalai/studio@0.3.90
|
|
35
|
+
|
|
36
|
+
## 0.3.89
|
|
37
|
+
|
|
38
|
+
### Patch Changes
|
|
39
|
+
|
|
40
|
+
- Updated dependencies [c50e07f]
|
|
41
|
+
- @amodalai/core@0.3.89
|
|
42
|
+
- @amodalai/runtime@0.3.89
|
|
43
|
+
- @amodalai/studio@0.3.89
|
|
44
|
+
- @amodalai/types@0.3.89
|
|
45
|
+
- @amodalai/runtime-app@0.3.89
|
|
46
|
+
- @amodalai/db@0.3.89
|
|
47
|
+
|
|
3
48
|
## 0.3.88
|
|
4
49
|
|
|
5
50
|
### Patch Changes
|
|
@@ -1,22 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
6
|
import type { CommandModule } from 'yargs';
|
|
7
|
+
import type { ToolBuildManifest } from '@amodalai/types';
|
|
7
8
|
export interface BuildOptions {
|
|
8
9
|
cwd?: string;
|
|
9
10
|
output?: string;
|
|
10
11
|
tools?: boolean;
|
|
11
12
|
}
|
|
12
13
|
/**
|
|
13
|
-
*
|
|
14
|
+
* Audit + handoff metadata `amodal build` emits alongside the bundle
|
|
15
|
+
* tarball. Captures who built it, from where, against which commit —
|
|
16
|
+
* the minimum a runtime / platform needs without re-parsing the bundle.
|
|
17
|
+
*/
|
|
18
|
+
export interface DeployManifest {
|
|
19
|
+
deployId: string;
|
|
20
|
+
createdAt: string;
|
|
21
|
+
createdBy: string;
|
|
22
|
+
source: 'cli' | 'github' | 'admin-ui';
|
|
23
|
+
commitSha?: string;
|
|
24
|
+
branch?: string;
|
|
25
|
+
message?: string;
|
|
26
|
+
agentName: string;
|
|
27
|
+
toolBuildManifest?: ToolBuildManifest;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build a deploy artifact (tarball + manifest) from the local repo.
|
|
14
31
|
*
|
|
15
32
|
* 1. Find repo root
|
|
16
33
|
* 2. Validate configuration
|
|
17
|
-
* 3. Load and resolve repo
|
|
18
|
-
* 4.
|
|
19
|
-
* 5.
|
|
34
|
+
* 3. Load and resolve repo (verifies it parses)
|
|
35
|
+
* 4. Optionally build tool sandbox snapshots
|
|
36
|
+
* 5. Pack the repo (including `node_modules`) into a tarball
|
|
37
|
+
* 6. Write a manifest describing the build
|
|
20
38
|
*/
|
|
21
39
|
export declare function runBuild(options?: BuildOptions): Promise<number>;
|
|
22
40
|
export declare const buildCommand: CommandModule;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/build.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/build.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,OAAO,CAAC;AAEzC,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAKvD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AA0BD;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8E1E;AAED,eAAO,MAAM,YAAY,EAAE,aAoB1B,CAAC"}
|
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
|
-
import { writeFileSync } from 'node:fs';
|
|
6
|
+
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
7
7
|
import { join, resolve } from 'node:path';
|
|
8
8
|
import { execSync } from 'node:child_process';
|
|
9
|
-
import {
|
|
9
|
+
import { randomUUID } from 'node:crypto';
|
|
10
|
+
import { loadRepo } from '@amodalai/core';
|
|
10
11
|
import { buildToolTemplates } from './build-tools.js';
|
|
11
12
|
import { findRepoRoot } from '../shared/repo-discovery.js';
|
|
12
13
|
import { runValidate } from './validate.js';
|
|
13
|
-
/**
|
|
14
|
-
* Get the current user from git config or fallback.
|
|
15
|
-
*/
|
|
16
14
|
function getCurrentUser() {
|
|
17
15
|
try {
|
|
18
16
|
return execSync('git config user.email', { encoding: 'utf-8' }).trim();
|
|
@@ -21,9 +19,6 @@ function getCurrentUser() {
|
|
|
21
19
|
return process.env['USER'] ?? 'unknown';
|
|
22
20
|
}
|
|
23
21
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Get the current git commit SHA, or undefined if not in a git repo.
|
|
26
|
-
*/
|
|
27
22
|
function getGitSha() {
|
|
28
23
|
try {
|
|
29
24
|
return execSync('git rev-parse HEAD', { encoding: 'utf-8' }).trim();
|
|
@@ -32,14 +27,23 @@ function getGitSha() {
|
|
|
32
27
|
return undefined;
|
|
33
28
|
}
|
|
34
29
|
}
|
|
30
|
+
function getGitBranch() {
|
|
31
|
+
try {
|
|
32
|
+
return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
35
38
|
/**
|
|
36
|
-
* Build a deploy
|
|
39
|
+
* Build a deploy artifact (tarball + manifest) from the local repo.
|
|
37
40
|
*
|
|
38
41
|
* 1. Find repo root
|
|
39
42
|
* 2. Validate configuration
|
|
40
|
-
* 3. Load and resolve repo
|
|
41
|
-
* 4.
|
|
42
|
-
* 5.
|
|
43
|
+
* 3. Load and resolve repo (verifies it parses)
|
|
44
|
+
* 4. Optionally build tool sandbox snapshots
|
|
45
|
+
* 5. Pack the repo (including `node_modules`) into a tarball
|
|
46
|
+
* 6. Write a manifest describing the build
|
|
43
47
|
*/
|
|
44
48
|
export async function runBuild(options = {}) {
|
|
45
49
|
let repoPath;
|
|
@@ -58,7 +62,7 @@ export async function runBuild(options = {}) {
|
|
|
58
62
|
process.stderr.write(`[build] Validation failed with ${errors} error(s). Fix errors before building.\n`);
|
|
59
63
|
return 1;
|
|
60
64
|
}
|
|
61
|
-
// Load repo
|
|
65
|
+
// Load repo to verify it parses cleanly
|
|
62
66
|
process.stderr.write('[build] Loading repo...\n');
|
|
63
67
|
let repo;
|
|
64
68
|
try {
|
|
@@ -70,41 +74,56 @@ export async function runBuild(options = {}) {
|
|
|
70
74
|
return 1;
|
|
71
75
|
}
|
|
72
76
|
// Build tool sandbox snapshots if requested
|
|
73
|
-
let
|
|
77
|
+
let toolBuildManifest;
|
|
74
78
|
if (options.tools && repo.tools.length > 0) {
|
|
75
79
|
process.stderr.write(`[build] Building ${repo.tools.length} tool sandbox(es)...\n`);
|
|
76
|
-
|
|
80
|
+
toolBuildManifest = await buildToolTemplates(repoPath, repo.tools);
|
|
77
81
|
}
|
|
78
82
|
else if (options.tools && repo.tools.length === 0) {
|
|
79
83
|
process.stderr.write('[build] No tools found in tools/ directory\n');
|
|
80
84
|
}
|
|
81
|
-
|
|
82
|
-
|
|
85
|
+
const outDir = options.output ? resolve(options.output) : join(repoPath, 'build');
|
|
86
|
+
mkdirSync(outDir, { recursive: true });
|
|
87
|
+
// Pack the repo into a tarball. Excludes things that don't belong in
|
|
88
|
+
// a deploy artifact: VCS dir, prior build output, environment files.
|
|
89
|
+
const tarballPath = join(outDir, 'agent.tar.gz');
|
|
90
|
+
process.stderr.write(`[build] Packing ${repoPath} → ${tarballPath}\n`);
|
|
91
|
+
try {
|
|
92
|
+
execSync(`tar -czf "${tarballPath}" ` +
|
|
93
|
+
`--exclude='.git' --exclude='build' --exclude='.env' --exclude='.env.local' ` +
|
|
94
|
+
`-C "${repoPath}" .`, { stdio: 'pipe' });
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
98
|
+
process.stderr.write(`[build] tar failed: ${msg}\n`);
|
|
99
|
+
return 1;
|
|
100
|
+
}
|
|
101
|
+
const manifest = {
|
|
102
|
+
deployId: randomUUID(),
|
|
103
|
+
createdAt: new Date().toISOString(),
|
|
83
104
|
createdBy: getCurrentUser(),
|
|
84
105
|
source: 'cli',
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
process.stderr.write(`[build]
|
|
96
|
-
process.stderr.write(`[build] Size: ${(size / 1024).toFixed(1)} KB\n`);
|
|
97
|
-
process.stderr.write(`[build] Connections: ${Object.keys(snapshot.connections).length}, Skills: ${snapshot.skills.length}, Automations: ${snapshot.automations.length}, Knowledge: ${snapshot.knowledge.length}, Tools: ${repo.tools.length}\n`);
|
|
106
|
+
agentName: repo.config.name,
|
|
107
|
+
...(getGitSha() ? { commitSha: getGitSha() } : {}),
|
|
108
|
+
...(getGitBranch() ? { branch: getGitBranch() } : {}),
|
|
109
|
+
...(toolBuildManifest ? { toolBuildManifest } : {}),
|
|
110
|
+
};
|
|
111
|
+
const manifestPath = join(outDir, 'manifest.json');
|
|
112
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
113
|
+
process.stderr.write(`[build] Wrote tarball ${tarballPath}\n`);
|
|
114
|
+
process.stderr.write(`[build] Wrote manifest ${manifestPath}\n`);
|
|
115
|
+
process.stderr.write(`[build] deployId=${manifest.deployId} commit=${manifest.commitSha ?? '(no git)'} branch=${manifest.branch ?? '-'}\n`);
|
|
116
|
+
process.stderr.write(`[build] Bundle: connections=${repo.connections.size + repo.externalConnections.size}, skills=${repo.skills.length}, automations=${repo.automations.length}, knowledge=${repo.knowledge.length}, tools=${repo.tools.length}\n`);
|
|
98
117
|
return 0;
|
|
99
118
|
}
|
|
100
119
|
export const buildCommand = {
|
|
101
120
|
command: 'build',
|
|
102
|
-
describe: '
|
|
121
|
+
describe: 'Pack a deploy artifact (tarball + manifest) from the local repo',
|
|
103
122
|
builder: (yargs) => yargs
|
|
104
123
|
.option('output', {
|
|
105
124
|
type: 'string',
|
|
106
125
|
alias: 'o',
|
|
107
|
-
describe: 'Output
|
|
126
|
+
describe: 'Output directory (default: ./build)',
|
|
108
127
|
})
|
|
109
128
|
.option('tools', {
|
|
110
129
|
type: 'boolean',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/build.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/build.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,aAAa,EAAE,SAAS,EAAC,MAAM,SAAS,CAAC;AACjD,OAAO,EAAC,IAAI,EAAE,OAAO,EAAC,MAAM,WAAW,CAAC;AACxC,OAAO,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAyB1C,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,uBAAuB,EAAE,EAAC,QAAQ,EAAE,OAAO,EAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,oBAAoB,EAAE,EAAC,QAAQ,EAAE,OAAO,EAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,iCAAiC,EAAE,EAAC,QAAQ,EAAE,OAAO,EAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,UAAwB,EAAE;IACvD,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,iBAAiB;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,QAAQ,OAAO,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAC,GAAG,EAAE,QAAQ,EAAC,CAAC,CAAC;IAClD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,MAAM,0CAA0C,CAAC,CAAC;QACzG,OAAO,CAAC,CAAC;IACX,CAAC;IAED,wCAAwC;IACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAC,SAAS,EAAE,QAAQ,EAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,4CAA4C;IAC5C,IAAI,iBAAgD,CAAC;IACrD,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,KAAK,CAAC,MAAM,wBAAwB,CAAC,CAAC;QACpF,iBAAiB,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClF,SAAS,CAAC,MAAM,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAErC,qEAAqE;IACrE,qEAAqE;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,QAAQ,MAAM,WAAW,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,QAAQ,CACN,aAAa,WAAW,IAAI;YAC5B,6EAA6E;YAC7E,OAAO,QAAQ,KAAK,EACpB,EAAC,KAAK,EAAE,MAAM,EAAC,CAChB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;QACrD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,QAAQ,GAAmB;QAC/B,QAAQ,EAAE,UAAU,EAAE;QACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,cAAc,EAAE;QAC3B,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;QAC3B,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAC,SAAS,EAAE,SAAS,EAAE,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,YAAY,EAAE,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAC,iBAAiB,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACnD,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,WAAW,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,YAAY,IAAI,CAAC,CAAC;IACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,QAAQ,CAAC,QAAQ,WAAW,QAAQ,CAAC,SAAS,IAAI,UAAU,WAAW,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC;IAC5I,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM,iBAAiB,IAAI,CAAC,WAAW,CAAC,MAAM,eAAe,IAAI,CAAC,SAAS,CAAC,MAAM,WAAW,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAErP,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,iEAAiE;IAC3E,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,QAAQ,EAAE;QAChB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,qCAAqC;KAChD,CAAC;SACD,MAAM,CAAC,OAAO,EAAE;QACf,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,kDAAkD;QAC5D,OAAO,EAAE,KAAK;KACf,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,uEAAuE;QACvE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAuB,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAwB,EAAC,CAAC,CAAC;QACzH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;CACF,CAAC"}
|
|
@@ -18,7 +18,7 @@ export interface ChatOptions {
|
|
|
18
18
|
*
|
|
19
19
|
* Three modes:
|
|
20
20
|
* --url <remote> → connect to an already-running server (no local boot)
|
|
21
|
-
* --config <
|
|
21
|
+
* --config <dir> → boot from an extracted bundle directory (offline replay)
|
|
22
22
|
* (default) → boot from the local repo
|
|
23
23
|
*/
|
|
24
24
|
export declare function runChat(options: ChatOptions): Promise<void>;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { createElement } from 'react';
|
|
7
7
|
import { render } from 'ink';
|
|
8
|
-
import { createLocalServer,
|
|
8
|
+
import { createLocalServer, createBundleServer } from '@amodalai/runtime';
|
|
9
9
|
import { findRepoRoot } from '../shared/repo-discovery.js';
|
|
10
10
|
import { runConnectionPreflight, printPreflightTable } from '../shared/connection-preflight.js';
|
|
11
11
|
import { ChatApp } from '../ui/ChatApp.js';
|
|
@@ -14,7 +14,7 @@ import { ChatApp } from '../ui/ChatApp.js';
|
|
|
14
14
|
*
|
|
15
15
|
* Three modes:
|
|
16
16
|
* --url <remote> → connect to an already-running server (no local boot)
|
|
17
|
-
* --config <
|
|
17
|
+
* --config <dir> → boot from an extracted bundle directory (offline replay)
|
|
18
18
|
* (default) → boot from the local repo
|
|
19
19
|
*/
|
|
20
20
|
export async function runChat(options) {
|
|
@@ -37,9 +37,9 @@ export async function runChat(options) {
|
|
|
37
37
|
let serverInstance;
|
|
38
38
|
let repoPath;
|
|
39
39
|
if (options.config) {
|
|
40
|
-
process.stderr.write(`[chat] Loading
|
|
41
|
-
serverInstance = await
|
|
42
|
-
|
|
40
|
+
process.stderr.write(`[chat] Loading bundle from ${options.config}\n`);
|
|
41
|
+
serverInstance = await createBundleServer({
|
|
42
|
+
bundlePath: options.config,
|
|
43
43
|
port,
|
|
44
44
|
host: '127.0.0.1',
|
|
45
45
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/commands/chat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAC,aAAa,EAAC,MAAM,OAAO,CAAC;AACpC,OAAO,EAAC,MAAM,EAAC,MAAM,KAAK,CAAC;AAE3B,OAAO,EAAC,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/commands/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
6
|
import type { CommandModule } from 'yargs';
|
|
7
|
-
import type { AgentBundle } from '@amodalai/core';
|
|
8
7
|
export interface ServeOptions {
|
|
9
8
|
config?: string;
|
|
10
|
-
platform?: boolean;
|
|
11
|
-
project?: string;
|
|
12
|
-
env?: string;
|
|
13
9
|
port?: number;
|
|
14
10
|
host?: string;
|
|
15
11
|
verbose?: number;
|
|
16
12
|
quiet?: boolean;
|
|
17
13
|
}
|
|
18
|
-
|
|
19
|
-
* Load an agent runtime from a snapshot (file or platform) and start the server.
|
|
20
|
-
*
|
|
21
|
-
* Returns the loaded repo, or exits with error.
|
|
22
|
-
*/
|
|
23
|
-
export declare function runServe(options: ServeOptions): Promise<AgentBundle | null>;
|
|
14
|
+
export declare function runServe(options: ServeOptions): Promise<boolean>;
|
|
24
15
|
export declare const serveCommand: CommandModule;
|
|
25
16
|
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,OAAO,CAAC;AAGzC,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAwBD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAiDtE;AAED,eAAO,MAAM,YAAY,EAAE,aA6C1B,CAAC"}
|
|
@@ -1,83 +1,60 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { execSync } from 'node:child_process';
|
|
7
|
+
import { mkdtempSync, statSync } from 'node:fs';
|
|
8
|
+
import { tmpdir } from 'node:os';
|
|
9
|
+
import { join, resolve } from 'node:path';
|
|
10
|
+
import { createBundleServer, initLogLevel, interceptConsole } from '@amodalai/runtime';
|
|
9
11
|
const DEFAULT_PORT = 3847;
|
|
10
12
|
/**
|
|
11
|
-
*
|
|
13
|
+
* Resolve the `--config` argument to a directory `createBundleServer`
|
|
14
|
+
* can load via `loadRepoFromDisk`. Accepts either a directory or a
|
|
15
|
+
* `.tar.gz` tarball produced by `amodal build` (extracted to a tempdir).
|
|
12
16
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
24
|
-
process.stderr.write(`[serve] Failed to load snapshot: ${msg}\n`);
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
17
|
+
function resolveBundlePath(configArg) {
|
|
18
|
+
const absolute = resolve(configArg);
|
|
19
|
+
const stat = statSync(absolute);
|
|
20
|
+
if (stat.isDirectory())
|
|
21
|
+
return absolute;
|
|
22
|
+
if (absolute.endsWith('.tar.gz') || absolute.endsWith('.tgz')) {
|
|
23
|
+
const dir = mkdtempSync(join(tmpdir(), 'amodal-serve-'));
|
|
24
|
+
process.stderr.write(`[serve] Extracting ${absolute} → ${dir}\n`);
|
|
25
|
+
execSync(`tar -xzf "${absolute}" -C "${dir}"`, { stdio: 'pipe' });
|
|
26
|
+
return dir;
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
process.stderr.write('[serve] Fetching active snapshot from platform...\n');
|
|
30
|
-
let client;
|
|
31
|
-
try {
|
|
32
|
-
client = await PlatformClient.create();
|
|
33
|
-
}
|
|
34
|
-
catch (err) {
|
|
35
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
36
|
-
process.stderr.write(`[serve] ${msg}\n`);
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
const environment = options.env ?? 'production';
|
|
40
|
-
try {
|
|
41
|
-
const snapshot = await client.getActiveSnapshot(environment);
|
|
42
|
-
const repo = snapshotToBundle(snapshot, `platform:${environment}`);
|
|
43
|
-
process.stderr.write(`[serve] Loaded ${snapshot.deployId} from ${environment}\n`);
|
|
44
|
-
return repo;
|
|
45
|
-
}
|
|
46
|
-
catch (err) {
|
|
47
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
48
|
-
process.stderr.write(`[serve] Failed to fetch snapshot: ${msg}\n`);
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
process.stderr.write('[serve] Specify --config <file> or --platform to load a snapshot.\n');
|
|
53
|
-
return null;
|
|
28
|
+
throw new Error(`Unsupported --config target: ${absolute} (expected a directory or .tar.gz tarball)`);
|
|
54
29
|
}
|
|
55
|
-
/**
|
|
56
|
-
* Load an agent runtime from a snapshot (file or platform) and start the server.
|
|
57
|
-
*
|
|
58
|
-
* Returns the loaded repo, or exits with error.
|
|
59
|
-
*/
|
|
60
30
|
export async function runServe(options) {
|
|
61
31
|
initLogLevel({ verbosity: options.verbose ?? 0, quiet: options.quiet ?? false });
|
|
62
32
|
interceptConsole();
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return
|
|
66
|
-
|
|
33
|
+
if (!options.config) {
|
|
34
|
+
process.stderr.write('[serve] --config <dir-or-tarball> is required.\n');
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
let bundlePath;
|
|
38
|
+
try {
|
|
39
|
+
bundlePath = resolveBundlePath(options.config);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
43
|
+
process.stderr.write(`[serve] ${msg}\n`);
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
67
46
|
const port = options.port ?? DEFAULT_PORT;
|
|
68
47
|
const host = options.host ?? '0.0.0.0';
|
|
69
|
-
process.stderr.write(`[serve] Starting server on ${host}:${port}...\n`);
|
|
48
|
+
process.stderr.write(`[serve] Starting bundle server from ${bundlePath} on ${host}:${port}...\n`);
|
|
70
49
|
try {
|
|
71
|
-
const server = await
|
|
72
|
-
|
|
50
|
+
const server = await createBundleServer({
|
|
51
|
+
bundlePath,
|
|
73
52
|
port,
|
|
74
53
|
host,
|
|
75
|
-
hotReload: false,
|
|
76
54
|
corsOrigin: '*',
|
|
77
55
|
});
|
|
78
56
|
await server.start();
|
|
79
|
-
process.stderr.write(`[serve]
|
|
80
|
-
// Graceful shutdown
|
|
57
|
+
process.stderr.write(`[serve] Serving at http://${host}:${port}\n`);
|
|
81
58
|
const shutdown = async (signal) => {
|
|
82
59
|
process.stderr.write(`\n[serve] Received ${signal}, shutting down...\n`);
|
|
83
60
|
await server.stop();
|
|
@@ -89,30 +66,18 @@ export async function runServe(options) {
|
|
|
89
66
|
catch (err) {
|
|
90
67
|
const msg = err instanceof Error ? err.message : String(err);
|
|
91
68
|
process.stderr.write(`[serve] Failed to start server: ${msg}\n`);
|
|
92
|
-
return
|
|
69
|
+
return false;
|
|
93
70
|
}
|
|
94
|
-
return
|
|
71
|
+
return true;
|
|
95
72
|
}
|
|
96
73
|
export const serveCommand = {
|
|
97
74
|
command: 'serve',
|
|
98
|
-
describe: '
|
|
75
|
+
describe: 'Serve an agent from a built bundle (directory or .tar.gz from `amodal build`)',
|
|
99
76
|
builder: (yargs) => yargs
|
|
100
77
|
.option('config', {
|
|
101
78
|
type: 'string',
|
|
102
|
-
describe: 'Path to
|
|
103
|
-
|
|
104
|
-
.option('platform', {
|
|
105
|
-
type: 'boolean',
|
|
106
|
-
describe: 'Fetch active snapshot from platform',
|
|
107
|
-
default: false,
|
|
108
|
-
})
|
|
109
|
-
.option('project', {
|
|
110
|
-
type: 'string',
|
|
111
|
-
describe: 'Platform project name',
|
|
112
|
-
})
|
|
113
|
-
.option('env', {
|
|
114
|
-
type: 'string',
|
|
115
|
-
describe: 'Platform environment (default: production)',
|
|
79
|
+
describe: 'Path to a bundle directory or .tar.gz tarball',
|
|
80
|
+
demandOption: true,
|
|
116
81
|
})
|
|
117
82
|
.option('port', {
|
|
118
83
|
type: 'number',
|
|
@@ -135,16 +100,10 @@ export const serveCommand = {
|
|
|
135
100
|
default: false,
|
|
136
101
|
}),
|
|
137
102
|
handler: async (argv) => {
|
|
138
|
-
const
|
|
103
|
+
const ok = await runServe({
|
|
139
104
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
140
105
|
config: argv['config'],
|
|
141
106
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
142
|
-
platform: argv['platform'],
|
|
143
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
144
|
-
project: argv['project'],
|
|
145
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
146
|
-
env: argv['env'],
|
|
147
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
148
107
|
port: argv['port'],
|
|
149
108
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
150
109
|
host: argv['host'],
|
|
@@ -153,10 +112,8 @@ export const serveCommand = {
|
|
|
153
112
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
154
113
|
quiet: argv['quiet'],
|
|
155
114
|
});
|
|
156
|
-
if (!
|
|
115
|
+
if (!ok)
|
|
157
116
|
process.exit(1);
|
|
158
|
-
}
|
|
159
|
-
// Server is running — process stays alive until SIGTERM/SIGINT
|
|
160
117
|
},
|
|
161
118
|
};
|
|
162
119
|
//# sourceMappingURL=serve.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/serve.ts"],"names":[],"mappings":"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"}
|