@roj-ai/standalone-server 0.1.11 → 0.1.13
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/files-upload-route.d.ts +36 -0
- package/dist/files-upload-route.d.ts.map +1 -0
- package/dist/files-upload-route.js +50 -0
- package/dist/files-upload-route.js.map +1 -0
- package/dist/git-instance-fs.d.ts +60 -0
- package/dist/git-instance-fs.d.ts.map +1 -0
- package/dist/git-instance-fs.js +164 -0
- package/dist/git-instance-fs.js.map +1 -0
- package/dist/instance.d.ts +6 -0
- package/dist/instance.d.ts.map +1 -1
- package/dist/instance.js +5 -0
- package/dist/instance.js.map +1 -1
- package/dist/local-registry.d.ts +109 -0
- package/dist/local-registry.d.ts.map +1 -0
- package/dist/local-registry.js +252 -0
- package/dist/local-registry.js.map +1 -0
- package/dist/main.js +7 -1
- package/dist/main.js.map +1 -1
- package/dist/platform-api.d.ts +11 -1
- package/dist/platform-api.d.ts.map +1 -1
- package/dist/platform-api.js +176 -13
- package/dist/platform-api.js.map +1 -1
- package/dist/server.d.ts +7 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +31 -1
- package/dist/server.js.map +1 -1
- package/dist/session-file-route.d.ts +24 -0
- package/dist/session-file-route.d.ts.map +1 -0
- package/dist/session-file-route.js +72 -0
- package/dist/session-file-route.js.map +1 -0
- package/dist/signed-token.d.ts +25 -0
- package/dist/signed-token.d.ts.map +1 -0
- package/dist/signed-token.js +50 -0
- package/dist/signed-token.js.map +1 -0
- package/dist/user-config-loader.d.ts.map +1 -1
- package/dist/user-config-loader.js +37 -1
- package/dist/user-config-loader.js.map +1 -1
- package/package.json +5 -5
- package/src/files-upload-route.ts +64 -0
- package/src/git-instance-fs.ts +187 -0
- package/src/instance.ts +12 -1
- package/src/local-registry.ts +334 -0
- package/src/main.ts +7 -1
- package/src/platform-api.ts +251 -13
- package/src/server.ts +47 -2
- package/src/session-file-route.ts +99 -0
- package/src/signed-token.ts +68 -0
- package/src/user-config-loader.ts +41 -2
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* On-disk file + resource registry for the standalone server.
|
|
3
|
+
*
|
|
4
|
+
* Stands in for the platform's Contember-backed file/resource service. State
|
|
5
|
+
* lives in `{dataPath}/.roj-platform-state.json` (JSON manifest) plus
|
|
6
|
+
* `{dataPath}/.roj-platform-state/files/{fileId}` (raw bytes). Operations are
|
|
7
|
+
* append-only at the resource level (revisions accumulate), so re-running
|
|
8
|
+
* `roj-standalone` between sessions preserves uploads and revisions added
|
|
9
|
+
* during a previous run.
|
|
10
|
+
*
|
|
11
|
+
* Files are content-addressable by SHA-256 — re-uploading the same bytes
|
|
12
|
+
* returns the existing fileId with `deduped: true`, mirroring the platform's
|
|
13
|
+
* /files/upload contract used by `@roj-ai/client/platform.files.upload`.
|
|
14
|
+
*/
|
|
15
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
16
|
+
import { existsSync } from 'node:fs';
|
|
17
|
+
import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
18
|
+
import { basename, extname, join } from 'node:path';
|
|
19
|
+
export class LocalRegistry {
|
|
20
|
+
dataPath;
|
|
21
|
+
logger;
|
|
22
|
+
state = { files: {}, resources: {} };
|
|
23
|
+
statePath;
|
|
24
|
+
filesDir;
|
|
25
|
+
constructor(dataPath, logger) {
|
|
26
|
+
this.dataPath = dataPath;
|
|
27
|
+
this.logger = logger;
|
|
28
|
+
this.statePath = join(dataPath, '.roj-platform-state.json');
|
|
29
|
+
this.filesDir = join(dataPath, '.roj-platform-state', 'files');
|
|
30
|
+
}
|
|
31
|
+
async init() {
|
|
32
|
+
await mkdir(this.filesDir, { recursive: true });
|
|
33
|
+
if (existsSync(this.statePath)) {
|
|
34
|
+
try {
|
|
35
|
+
const raw = await readFile(this.statePath, 'utf8');
|
|
36
|
+
this.state = JSON.parse(raw);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
this.logger.warn('Local registry manifest is corrupt, starting fresh', {
|
|
40
|
+
err: err instanceof Error ? err.message : String(err),
|
|
41
|
+
});
|
|
42
|
+
this.state = { files: {}, resources: {} };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async uploadFile(args) {
|
|
47
|
+
// Phase 1 — preflight by hash. If we already have the bytes, return the
|
|
48
|
+
// existing fileId without needing the body.
|
|
49
|
+
if (args.contentHash) {
|
|
50
|
+
const existing = Object.values(this.state.files).find(f => f.contentHash === args.contentHash);
|
|
51
|
+
if (existing) {
|
|
52
|
+
return {
|
|
53
|
+
fileId: existing.id,
|
|
54
|
+
filename: existing.filename,
|
|
55
|
+
mimeType: existing.mimeType,
|
|
56
|
+
size: existing.size,
|
|
57
|
+
deduped: true,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (!args.buffer) {
|
|
61
|
+
return { error: 'file-required', contentHash: args.contentHash };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!args.buffer) {
|
|
65
|
+
throw new Error('uploadFile requires a buffer when contentHash is unknown');
|
|
66
|
+
}
|
|
67
|
+
const contentHash = args.contentHash ?? sha256Hex(args.buffer);
|
|
68
|
+
// Re-check after computing — the client may not have provided a hash but
|
|
69
|
+
// we still want dedupe.
|
|
70
|
+
const matched = Object.values(this.state.files).find(f => f.contentHash === contentHash);
|
|
71
|
+
if (matched) {
|
|
72
|
+
return {
|
|
73
|
+
fileId: matched.id,
|
|
74
|
+
filename: matched.filename,
|
|
75
|
+
mimeType: matched.mimeType,
|
|
76
|
+
size: matched.size,
|
|
77
|
+
deduped: true,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const id = randomUUID();
|
|
81
|
+
const meta = {
|
|
82
|
+
id,
|
|
83
|
+
filename: args.filename,
|
|
84
|
+
mimeType: args.mimeType,
|
|
85
|
+
size: args.buffer.length,
|
|
86
|
+
contentHash,
|
|
87
|
+
createdAt: new Date().toISOString(),
|
|
88
|
+
};
|
|
89
|
+
await writeFile(join(this.filesDir, id), args.buffer);
|
|
90
|
+
this.state.files[id] = meta;
|
|
91
|
+
await this.persist();
|
|
92
|
+
return { fileId: id, filename: meta.filename, mimeType: meta.mimeType, size: meta.size, deduped: false };
|
|
93
|
+
}
|
|
94
|
+
async readFileById(fileId) {
|
|
95
|
+
const meta = this.state.files[fileId];
|
|
96
|
+
if (!meta)
|
|
97
|
+
return null;
|
|
98
|
+
try {
|
|
99
|
+
const buffer = await readFile(join(this.filesDir, fileId));
|
|
100
|
+
return { meta, buffer };
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async createResource(args) {
|
|
107
|
+
if (!this.state.files[args.fileId]) {
|
|
108
|
+
throw new Error(`File not found: ${args.fileId}`);
|
|
109
|
+
}
|
|
110
|
+
const existing = this.findBySlug(args.slug);
|
|
111
|
+
if (existing) {
|
|
112
|
+
throw new Error(`Resource with slug already exists: ${args.slug}`);
|
|
113
|
+
}
|
|
114
|
+
const resourceId = randomUUID();
|
|
115
|
+
const revisionId = randomUUID();
|
|
116
|
+
const now = new Date().toISOString();
|
|
117
|
+
this.state.resources[resourceId] = {
|
|
118
|
+
id: resourceId,
|
|
119
|
+
slug: args.slug,
|
|
120
|
+
name: args.name ?? null,
|
|
121
|
+
description: args.description ?? null,
|
|
122
|
+
revisions: [{ id: revisionId, fileId: args.fileId, label: args.label ?? null, createdAt: now }],
|
|
123
|
+
createdAt: now,
|
|
124
|
+
};
|
|
125
|
+
await this.persist();
|
|
126
|
+
return { resourceId, revisionId };
|
|
127
|
+
}
|
|
128
|
+
async addRevision(args) {
|
|
129
|
+
const record = this.findResource(args);
|
|
130
|
+
if (!record) {
|
|
131
|
+
throw new Error('Resource not found');
|
|
132
|
+
}
|
|
133
|
+
if (!this.state.files[args.fileId]) {
|
|
134
|
+
throw new Error(`File not found: ${args.fileId}`);
|
|
135
|
+
}
|
|
136
|
+
const latest = record.revisions[record.revisions.length - 1];
|
|
137
|
+
const incomingLabel = args.label ?? null;
|
|
138
|
+
if (latest && latest.fileId === args.fileId && latest.label === incomingLabel) {
|
|
139
|
+
return { revisionId: latest.id, noop: true };
|
|
140
|
+
}
|
|
141
|
+
const revisionId = randomUUID();
|
|
142
|
+
record.revisions.push({
|
|
143
|
+
id: revisionId,
|
|
144
|
+
fileId: args.fileId,
|
|
145
|
+
label: incomingLabel,
|
|
146
|
+
createdAt: new Date().toISOString(),
|
|
147
|
+
});
|
|
148
|
+
await this.persist();
|
|
149
|
+
return { revisionId, noop: false };
|
|
150
|
+
}
|
|
151
|
+
getResource(args) {
|
|
152
|
+
const record = this.findResource(args);
|
|
153
|
+
return record ? toResourceOutput(record, this.state.files) : null;
|
|
154
|
+
}
|
|
155
|
+
listResources() {
|
|
156
|
+
return Object.values(this.state.resources).map(r => toResourceOutput(r, this.state.files));
|
|
157
|
+
}
|
|
158
|
+
async deleteResource(resourceId) {
|
|
159
|
+
if (!this.state.resources[resourceId])
|
|
160
|
+
return { ok: true };
|
|
161
|
+
delete this.state.resources[resourceId];
|
|
162
|
+
await this.persist();
|
|
163
|
+
return { ok: true };
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Idempotent: ensures every config-declared local resource exists in the
|
|
167
|
+
* registry. Skips slugs that already have a record (so previously uploaded
|
|
168
|
+
* revisions survive restarts).
|
|
169
|
+
*/
|
|
170
|
+
async bootstrapLocalResources(localResources) {
|
|
171
|
+
for (const lr of localResources) {
|
|
172
|
+
if (this.findBySlug(lr.slug)) {
|
|
173
|
+
this.logger.info('Local resource already in registry, skipping bootstrap', { slug: lr.slug });
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
const buffer = await readFile(lr.path);
|
|
177
|
+
const filename = basename(lr.path);
|
|
178
|
+
const mimeType = guessMimeType(filename);
|
|
179
|
+
const upload = await this.uploadFile({ buffer, filename, mimeType });
|
|
180
|
+
if ('error' in upload) {
|
|
181
|
+
throw new Error(`Bootstrap upload failed for ${lr.slug}: ${upload.error}`);
|
|
182
|
+
}
|
|
183
|
+
await this.createResource({
|
|
184
|
+
slug: lr.slug,
|
|
185
|
+
name: lr.name ?? lr.slug,
|
|
186
|
+
fileId: upload.fileId,
|
|
187
|
+
});
|
|
188
|
+
this.logger.info('Bootstrapped local resource', { slug: lr.slug, fileId: upload.fileId, size: upload.size });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async persist() {
|
|
192
|
+
const tmp = `${this.statePath}.tmp`;
|
|
193
|
+
await writeFile(tmp, JSON.stringify(this.state, null, 2), 'utf8');
|
|
194
|
+
await rename(tmp, this.statePath);
|
|
195
|
+
}
|
|
196
|
+
findResource(args) {
|
|
197
|
+
if (args.resourceId)
|
|
198
|
+
return this.state.resources[args.resourceId] ?? null;
|
|
199
|
+
if (args.resourceSlug)
|
|
200
|
+
return this.findBySlug(args.resourceSlug);
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
findBySlug(slug) {
|
|
204
|
+
for (const r of Object.values(this.state.resources)) {
|
|
205
|
+
if (r.slug === slug)
|
|
206
|
+
return r;
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
function toResourceOutput(record, files) {
|
|
212
|
+
const latest = record.revisions[record.revisions.length - 1];
|
|
213
|
+
const file = latest ? files[latest.fileId] : undefined;
|
|
214
|
+
return {
|
|
215
|
+
id: record.id,
|
|
216
|
+
slug: record.slug,
|
|
217
|
+
name: record.name,
|
|
218
|
+
description: record.description,
|
|
219
|
+
latestRevision: latest && file
|
|
220
|
+
? {
|
|
221
|
+
id: latest.id,
|
|
222
|
+
label: latest.label,
|
|
223
|
+
file: { id: file.id, filename: file.filename, mimeType: file.mimeType, size: file.size },
|
|
224
|
+
createdAt: latest.createdAt,
|
|
225
|
+
}
|
|
226
|
+
: null,
|
|
227
|
+
createdAt: record.createdAt,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function sha256Hex(buf) {
|
|
231
|
+
return createHash('sha256').update(buf).digest('hex');
|
|
232
|
+
}
|
|
233
|
+
function guessMimeType(filename) {
|
|
234
|
+
switch (extname(filename).toLowerCase()) {
|
|
235
|
+
case '.zip':
|
|
236
|
+
return 'application/zip';
|
|
237
|
+
case '.json':
|
|
238
|
+
return 'application/json';
|
|
239
|
+
default:
|
|
240
|
+
return 'application/octet-stream';
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Exported for tests / smoke scripts that want to nuke local state cleanly.
|
|
244
|
+
export async function clearLocalRegistry(dataPath) {
|
|
245
|
+
const statePath = join(dataPath, '.roj-platform-state.json');
|
|
246
|
+
const filesDir = join(dataPath, '.roj-platform-state');
|
|
247
|
+
if (existsSync(statePath))
|
|
248
|
+
await rm(statePath);
|
|
249
|
+
if (existsSync(filesDir))
|
|
250
|
+
await rm(filesDir, { recursive: true });
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=local-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-registry.js","sourceRoot":"","sources":["../src/local-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/main.js
CHANGED
|
@@ -17,13 +17,19 @@ async function main() {
|
|
|
17
17
|
userConfig = await loadUserConfig(absoluteConfigPath);
|
|
18
18
|
console.log(`Loaded config from: ${absoluteConfigPath}`);
|
|
19
19
|
console.log(` Presets: ${userConfig.presets.map(p => p.id).join(', ')}`);
|
|
20
|
+
if (userConfig.localResources?.length) {
|
|
21
|
+
console.log(` Local resources: ${userConfig.localResources.map(r => r.slug).join(', ')}`);
|
|
22
|
+
}
|
|
20
23
|
}
|
|
21
24
|
catch (error) {
|
|
22
25
|
console.error(`Failed to load config from ${absoluteConfigPath}:`);
|
|
23
26
|
console.error(error instanceof Error ? error.message : String(error));
|
|
24
27
|
process.exit(1);
|
|
25
28
|
}
|
|
26
|
-
await startStandaloneServer({
|
|
29
|
+
await startStandaloneServer({
|
|
30
|
+
presets: userConfig.presets,
|
|
31
|
+
localResources: userConfig.localResources,
|
|
32
|
+
});
|
|
27
33
|
}
|
|
28
34
|
main().catch((error) => {
|
|
29
35
|
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;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD,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;IAE7D,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,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAExD,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;IAE7D,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,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACzE,IAAI,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC3F,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,8BAA8B,kBAAkB,GAAG,CAAC,CAAA;QAClE,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,qBAAqB,CAAC;QAC3B,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,cAAc,EAAE,UAAU,CAAC,cAAc;KACzC,CAAC,CAAA;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACtB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAChB,CAAC,CAAC,CAAA"}
|
package/dist/platform-api.d.ts
CHANGED
|
@@ -13,13 +13,23 @@
|
|
|
13
13
|
* - sessions.publish — publishing requires the CF platform
|
|
14
14
|
* - instances.archive — no-op; shutdown the server instead
|
|
15
15
|
*/
|
|
16
|
-
import type { Logger, SessionManager } from '@roj-ai/sdk';
|
|
16
|
+
import type { Logger, Preset, SessionManager } from '@roj-ai/sdk';
|
|
17
17
|
import { Hono } from 'hono';
|
|
18
|
+
import type { GitInstanceFs } from './git-instance-fs.js';
|
|
18
19
|
import type { InstanceState } from './instance.js';
|
|
20
|
+
import type { LocalRegistry } from './local-registry.js';
|
|
19
21
|
interface Deps {
|
|
20
22
|
instance: InstanceState;
|
|
21
23
|
sessionManager: SessionManager;
|
|
22
24
|
logger: Logger;
|
|
25
|
+
presets: Preset[];
|
|
26
|
+
registry: LocalRegistry;
|
|
27
|
+
/** Per-instance bare repo + per-session worktree manager. */
|
|
28
|
+
gitFs: GitInstanceFs;
|
|
29
|
+
/** HMAC secret for signing download tokens (`sessionFiles.createDownloadUrl`). */
|
|
30
|
+
tokenSecret: string;
|
|
31
|
+
/** Externally-reachable base URL (e.g. `http://localhost:8765`) used when minting download URLs. */
|
|
32
|
+
publicBaseUrl: string;
|
|
23
33
|
}
|
|
24
34
|
export declare function createPlatformApi(deps: Deps): Hono;
|
|
25
35
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-api.d.ts","sourceRoot":"","sources":["../src/platform-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"platform-api.d.ts","sourceRoot":"","sources":["../src/platform-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAGjE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGxD,UAAU,IAAI;IACb,QAAQ,EAAE,aAAa,CAAA;IACvB,cAAc,EAAE,cAAc,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,aAAa,CAAA;IACvB,6DAA6D;IAC7D,KAAK,EAAE,aAAa,CAAA;IACpB,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAA;IACnB,oGAAoG;IACpG,aAAa,EAAE,MAAM,CAAA;CACrB;AAQD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAuBlD"}
|
package/dist/platform-api.js
CHANGED
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
* - sessions.publish — publishing requires the CF platform
|
|
14
14
|
* - instances.archive — no-op; shutdown the server instead
|
|
15
15
|
*/
|
|
16
|
+
import { SessionId } from '@roj-ai/sdk';
|
|
17
|
+
import { randomUUID } from 'node:crypto';
|
|
16
18
|
import { Hono } from 'hono';
|
|
19
|
+
import { signFileToken } from './signed-token.js';
|
|
17
20
|
export function createPlatformApi(deps) {
|
|
18
21
|
const app = new Hono();
|
|
19
22
|
app.post('/rpc', async (c) => {
|
|
@@ -48,11 +51,143 @@ async function dispatch(deps, method, input) {
|
|
|
48
51
|
return { ok: false, error: { type: 'handler_error', message } };
|
|
49
52
|
}
|
|
50
53
|
}
|
|
54
|
+
// Shared by `instances.create.autoCreateSession` and `sessions.create`. Creates
|
|
55
|
+
// a session via the SDK session manager, injects any matching local resources,
|
|
56
|
+
// then (if set) pushes `initialPrompt` as a user-chat message — order matters:
|
|
57
|
+
// resources must land in the workspace before the agent's first inference so
|
|
58
|
+
// the agent sees a non-empty workspace. Mirrors roj-platform's project-init
|
|
59
|
+
// (inject-resources → activatePendingSession with initialPrompt).
|
|
60
|
+
//
|
|
61
|
+
// SessionId is minted up-front (rather than letting the SDK generate one) so we
|
|
62
|
+
// can create the matching git worktree before the SDK initializes the session
|
|
63
|
+
// — the worktree path is then passed through as `workspaceDir`.
|
|
64
|
+
async function startSession(deps, input) {
|
|
65
|
+
const sessionId = randomUUID();
|
|
66
|
+
const workspaceDir = await deps.gitFs.addSessionWorktree(deps.instance.id, sessionId);
|
|
67
|
+
const created = await deps.sessionManager.callManagerMethod('sessions.create', {
|
|
68
|
+
presetId: input.presetId,
|
|
69
|
+
sessionId,
|
|
70
|
+
workspaceDir,
|
|
71
|
+
});
|
|
72
|
+
if (!created.ok) {
|
|
73
|
+
// Roll back the worktree we just created so a retry isn't blocked by an
|
|
74
|
+
// orphaned dir. Best-effort — failure here is logged inside removeSessionWorktree.
|
|
75
|
+
await deps.gitFs.removeSessionWorktree(deps.instance.id, sessionId);
|
|
76
|
+
throw new Error(created.error.message);
|
|
77
|
+
}
|
|
78
|
+
const resources = resolveSessionResources(deps, input.presetId, input.resourceIds);
|
|
79
|
+
for (const resource of resources) {
|
|
80
|
+
await injectRegistryResource(deps, sessionId, resource);
|
|
81
|
+
}
|
|
82
|
+
if (input.initialPrompt) {
|
|
83
|
+
const sent = await deps.sessionManager.callPluginMethod(SessionId(sessionId), 'user-chat.sendMessage', {
|
|
84
|
+
content: input.initialPrompt,
|
|
85
|
+
});
|
|
86
|
+
if (!sent.ok) {
|
|
87
|
+
deps.logger.warn('Failed to deliver initialPrompt', {
|
|
88
|
+
sessionId,
|
|
89
|
+
error: sent.error,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return { sessionId };
|
|
94
|
+
}
|
|
95
|
+
// Resolution mirrors roj-platform's project-init.ts:206:
|
|
96
|
+
// 1. explicit input.resourceIds — matched against the local registry by ID
|
|
97
|
+
// first, then by slug (since local-dev callers often pass slugs as ids).
|
|
98
|
+
// 2. fallback to preset.defaultResourceSlugs (looked up by slug).
|
|
99
|
+
function resolveSessionResources(deps, presetId, inputResourceIds) {
|
|
100
|
+
if (inputResourceIds && inputResourceIds.length > 0) {
|
|
101
|
+
const matched = [];
|
|
102
|
+
const unmatched = [];
|
|
103
|
+
for (const id of inputResourceIds) {
|
|
104
|
+
const resource = deps.registry.getResource({ resourceId: id }) ?? deps.registry.getResource({ resourceSlug: id });
|
|
105
|
+
const resolved = toResolvedResource(resource);
|
|
106
|
+
if (resolved)
|
|
107
|
+
matched.push(resolved);
|
|
108
|
+
else
|
|
109
|
+
unmatched.push(id);
|
|
110
|
+
}
|
|
111
|
+
if (unmatched.length > 0) {
|
|
112
|
+
deps.logger.warn('Some input resourceIds did not match the local registry; ignoring', {
|
|
113
|
+
unmatched,
|
|
114
|
+
availableSlugs: deps.registry.listResources().map(r => r.slug),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
if (matched.length > 0)
|
|
118
|
+
return matched;
|
|
119
|
+
}
|
|
120
|
+
const preset = deps.presets.find(p => p.id === presetId);
|
|
121
|
+
const slugs = preset?.defaultResourceSlugs ?? [];
|
|
122
|
+
const resolved = [];
|
|
123
|
+
const missing = [];
|
|
124
|
+
for (const slug of slugs) {
|
|
125
|
+
const r = toResolvedResource(deps.registry.getResource({ resourceSlug: slug }));
|
|
126
|
+
if (r)
|
|
127
|
+
resolved.push(r);
|
|
128
|
+
else
|
|
129
|
+
missing.push(slug);
|
|
130
|
+
}
|
|
131
|
+
if (missing.length > 0) {
|
|
132
|
+
deps.logger.warn("Preset declares defaultResourceSlugs not present in the local registry; those slots will be skipped", { presetId, missing, availableSlugs: deps.registry.listResources().map(r => r.slug) });
|
|
133
|
+
}
|
|
134
|
+
return resolved;
|
|
135
|
+
}
|
|
136
|
+
function toResolvedResource(resource) {
|
|
137
|
+
if (!resource || !resource.latestRevision)
|
|
138
|
+
return null;
|
|
139
|
+
const file = resource.latestRevision.file;
|
|
140
|
+
return {
|
|
141
|
+
resourceId: resource.id,
|
|
142
|
+
slug: resource.slug,
|
|
143
|
+
name: resource.name,
|
|
144
|
+
fileId: file.id,
|
|
145
|
+
filename: file.filename,
|
|
146
|
+
mimeType: file.mimeType,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
async function injectRegistryResource(deps, sessionId, resource) {
|
|
150
|
+
const file = await deps.registry.readFileById(resource.fileId);
|
|
151
|
+
if (!file) {
|
|
152
|
+
throw new Error(`Registry file not found for resource ${resource.slug} (fileId=${resource.fileId})`);
|
|
153
|
+
}
|
|
154
|
+
const result = await deps.sessionManager.callPluginMethod(SessionId(sessionId), 'resources.inject', {
|
|
155
|
+
sessionId,
|
|
156
|
+
filename: resource.filename,
|
|
157
|
+
mimeType: resource.mimeType,
|
|
158
|
+
size: file.buffer.length,
|
|
159
|
+
fileBuffer: file.buffer,
|
|
160
|
+
metadata: { slug: resource.slug, name: resource.name ?? resource.slug },
|
|
161
|
+
});
|
|
162
|
+
if (!result.ok) {
|
|
163
|
+
deps.logger.error('Registry resource injection failed', undefined, {
|
|
164
|
+
sessionId,
|
|
165
|
+
slug: resource.slug,
|
|
166
|
+
error: result.error,
|
|
167
|
+
});
|
|
168
|
+
throw new Error(`Failed to inject resource '${resource.slug}': ${result.error.message ?? result.error.type}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
51
171
|
const handlers = {
|
|
52
|
-
'instances.create': async (
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
172
|
+
'instances.create': async (deps, input) => {
|
|
173
|
+
if (input.metadata !== undefined) {
|
|
174
|
+
deps.instance.metadata = input.metadata;
|
|
175
|
+
}
|
|
176
|
+
let sessionId;
|
|
177
|
+
if (input.autoCreateSession?.presetId) {
|
|
178
|
+
const result = await startSession(deps, {
|
|
179
|
+
presetId: input.autoCreateSession.presetId,
|
|
180
|
+
initialPrompt: input.autoCreateSession.initialPrompt,
|
|
181
|
+
resourceIds: input.autoCreateSession.resourceIds,
|
|
182
|
+
});
|
|
183
|
+
sessionId = result.sessionId;
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
instanceId: deps.instance.id,
|
|
187
|
+
status: 'ready',
|
|
188
|
+
...(sessionId ? { sessionId } : {}),
|
|
189
|
+
};
|
|
190
|
+
},
|
|
56
191
|
'instances.list': async ({ instance }) => ({
|
|
57
192
|
instances: [instanceSummary(instance)],
|
|
58
193
|
total: 1,
|
|
@@ -75,14 +210,7 @@ const handlers = {
|
|
|
75
210
|
};
|
|
76
211
|
},
|
|
77
212
|
'instances.archive': async () => ({ ok: true }),
|
|
78
|
-
'sessions.create': async (
|
|
79
|
-
const result = await sessionManager.callManagerMethod('sessions.create', {
|
|
80
|
-
presetId: input.presetId,
|
|
81
|
-
});
|
|
82
|
-
if (!result.ok)
|
|
83
|
-
throw new Error(result.error.message);
|
|
84
|
-
return result.value;
|
|
85
|
-
},
|
|
213
|
+
'sessions.create': async (deps, input) => startSession(deps, input),
|
|
86
214
|
'sessions.list': async ({ sessionManager }) => {
|
|
87
215
|
const result = await sessionManager.callManagerMethod('sessions.list', {});
|
|
88
216
|
if (!result.ok)
|
|
@@ -90,6 +218,41 @@ const handlers = {
|
|
|
90
218
|
return result.value;
|
|
91
219
|
},
|
|
92
220
|
'tokens.create': async () => ({ token: '' }),
|
|
221
|
+
'resources.create': async (deps, input) => deps.registry.createResource(input),
|
|
222
|
+
'resources.addRevision': async (deps, input) => deps.registry.addRevision(input),
|
|
223
|
+
'resources.get': async (deps, input) => {
|
|
224
|
+
const resource = deps.registry.getResource(input);
|
|
225
|
+
if (!resource)
|
|
226
|
+
throw new Error('Resource not found');
|
|
227
|
+
return resource;
|
|
228
|
+
},
|
|
229
|
+
'resources.list': async (deps, _input) => ({
|
|
230
|
+
resources: deps.registry.listResources(),
|
|
231
|
+
}),
|
|
232
|
+
'resources.delete': async (deps, input) => deps.registry.deleteResource(input.resourceId),
|
|
233
|
+
'sessionFiles.createDownloadUrl': async (deps, input) => {
|
|
234
|
+
if (input.scope !== 'workspace' && input.scope !== 'session') {
|
|
235
|
+
throw new Error(`Invalid scope: ${input.scope}`);
|
|
236
|
+
}
|
|
237
|
+
if (!input.path || input.path.includes('..')) {
|
|
238
|
+
throw new Error('Path traversal not allowed');
|
|
239
|
+
}
|
|
240
|
+
const ttl = Math.min(Math.max(input.ttlSeconds ?? 300, 1), 3600);
|
|
241
|
+
const expiresAt = Date.now() + ttl * 1000;
|
|
242
|
+
const token = signFileToken(deps.tokenSecret, {
|
|
243
|
+
instanceId: input.instanceId,
|
|
244
|
+
sessionId: input.sessionId,
|
|
245
|
+
scope: input.scope,
|
|
246
|
+
path: input.path,
|
|
247
|
+
expiresAt,
|
|
248
|
+
});
|
|
249
|
+
const encodedPath = input.path
|
|
250
|
+
.split('/')
|
|
251
|
+
.map(seg => encodeURIComponent(seg))
|
|
252
|
+
.join('/');
|
|
253
|
+
const url = `${deps.publicBaseUrl}/api/v1/instances/${input.instanceId}/sessions/${input.sessionId}/files/${input.scope}/${encodedPath}?token=${encodeURIComponent(token)}`;
|
|
254
|
+
return { url, expiresAt: new Date(expiresAt).toISOString() };
|
|
255
|
+
},
|
|
93
256
|
};
|
|
94
257
|
function instanceSummary(instance) {
|
|
95
258
|
return {
|
|
@@ -100,7 +263,7 @@ function instanceSummary(instance) {
|
|
|
100
263
|
bundleSlug: 'standalone',
|
|
101
264
|
bundleRevisionId: '',
|
|
102
265
|
vcsType: 'none',
|
|
103
|
-
metadata:
|
|
266
|
+
metadata: instance.metadata,
|
|
104
267
|
createdAt: instance.createdAt,
|
|
105
268
|
};
|
|
106
269
|
}
|
package/dist/platform-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-api.js","sourceRoot":"","sources":["../src/platform-api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"platform-api.js","sourceRoot":"","sources":["../src/platform-api.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* POST /api/v1/instances/{id}/exchange — noop (no auth locally)
|
|
12
12
|
* GET /health — health check
|
|
13
13
|
*/
|
|
14
|
-
import type { Config, LLMMiddleware, Logger, Preset, SessionManager } from '@roj-ai/sdk';
|
|
14
|
+
import type { Config, LLMMiddleware, LocalResource, Logger, Preset, SessionManager } from '@roj-ai/sdk';
|
|
15
15
|
import { type InstanceState } from './instance.js';
|
|
16
16
|
export interface StartStandaloneOptions {
|
|
17
17
|
presets: Preset[];
|
|
@@ -19,6 +19,12 @@ export interface StartStandaloneOptions {
|
|
|
19
19
|
instanceId?: string;
|
|
20
20
|
instanceName?: string;
|
|
21
21
|
llmMiddleware?: LLMMiddleware[];
|
|
22
|
+
/**
|
|
23
|
+
* Local resource registry — files (typically ZIPs) on disk addressable by slug.
|
|
24
|
+
* Injected into new sessions via `resources.inject` whenever the preset's
|
|
25
|
+
* `defaultResourceSlugs` (or input.resourceIds) match a slug here.
|
|
26
|
+
*/
|
|
27
|
+
localResources?: LocalResource[];
|
|
22
28
|
onShutdown?: () => Promise<void> | void;
|
|
23
29
|
onBeforeStart?: (ctx: {
|
|
24
30
|
config: Config;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAa,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAa,cAAc,EAAE,MAAM,aAAa,CAAA;AAUlH,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAOlE,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,aAAa,EAAE,CAAA;IAC/B;;;;OAIG;IACH,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;IAChC,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,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,aAAa,CAAA;IACvB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAA;IACZ,0FAA0F;IAC1F,cAAc,EAAE,cAAc,CAAA;IAC9B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkJtG"}
|