@roj-ai/standalone-server 0.1.12 → 0.1.14

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.
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Per-instance git layout for the standalone server.
3
+ *
4
+ * Mirrors what `roj-platform` does inside an E2B sandbox: each instance owns
5
+ * a bare repo, each session owns a worktree branched from `main`. The SDK
6
+ * receives the worktree path as `workspaceDir` on `sessions.create` and treats
7
+ * it as an opaque directory — it doesn't know about git.
8
+ *
9
+ * {dataPath}/instances/{instanceId}/repo.git/ ← bare, branch `main`
10
+ * {dataPath}/instances/{instanceId}/sessions/{sid}/ ← worktree, branch `session/{sid}`
11
+ *
12
+ * Why a bare repo + worktrees instead of a plain dir per session:
13
+ * - Parallel sessions on one instance need independent commit history.
14
+ * - `git worktree` shares object storage, so the cost is mostly metadata.
15
+ * - Mental model matches platform — agent `git status` / `git log` behave
16
+ * identically against standalone and against E2B.
17
+ *
18
+ * Idempotent: `initInstance` skips if `repo.git` already exists,
19
+ * `addSessionWorktree` skips if the target worktree is already registered.
20
+ * That keeps `roj-standalone` restart-safe — bare repos and worktrees on disk
21
+ * persist across process restarts the same way `LocalRegistry` does.
22
+ *
23
+ * No auto-commit. Resources extracted via `resources.inject` land in the
24
+ * worktree as untracked files; whether to commit them is the agent's call,
25
+ * matching platform behavior.
26
+ */
27
+ import type { Logger } from '@roj-ai/sdk';
28
+ export declare class GitInstanceFs {
29
+ private readonly dataPath;
30
+ private readonly logger;
31
+ constructor(dataPath: string, logger: Logger);
32
+ instanceDir(instanceId: string): string;
33
+ repoDir(instanceId: string): string;
34
+ worktreeDir(instanceId: string, sessionId: string): string;
35
+ /**
36
+ * Idempotently initialize the bare repo for an instance with an empty
37
+ * initial commit on `main`. The commit exists so subsequent
38
+ * `git worktree add -b session/{sid}` calls have something to branch from.
39
+ */
40
+ initInstance(instanceId: string): Promise<void>;
41
+ /**
42
+ * Idempotently add a worktree for `sessionId` on branch `session/{sid}`,
43
+ * branching from `main`. Throws if the target dir exists but is not a valid
44
+ * worktree of this instance's bare repo (unrecoverable conflict).
45
+ */
46
+ addSessionWorktree(instanceId: string, sessionId: string): Promise<string>;
47
+ /**
48
+ * Remove a session's worktree (filesystem + bookkeeping). Silently no-ops
49
+ * if the worktree was never registered.
50
+ */
51
+ removeSessionWorktree(instanceId: string, sessionId: string): Promise<void>;
52
+ /**
53
+ * Tear down everything for an instance: every worktree, then the
54
+ * bare repo + on-disk dir. Safe to call when nothing exists.
55
+ */
56
+ removeInstance(instanceId: string): Promise<void>;
57
+ private isLinkedWorktree;
58
+ private git;
59
+ }
60
+ //# sourceMappingURL=git-instance-fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-instance-fs.d.ts","sourceRoot":"","sources":["../src/git-instance-fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAmBzC,qBAAa,aAAa;IAExB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;IAGhC,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAIvC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAInC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAI1D;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBrD;;;;OAIG;IACG,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBhF;;;OAGG;IACG,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBjF;;;OAGG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAOzC,gBAAgB;YAYhB,GAAG;CAiBjB"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Per-instance git layout for the standalone server.
3
+ *
4
+ * Mirrors what `roj-platform` does inside an E2B sandbox: each instance owns
5
+ * a bare repo, each session owns a worktree branched from `main`. The SDK
6
+ * receives the worktree path as `workspaceDir` on `sessions.create` and treats
7
+ * it as an opaque directory — it doesn't know about git.
8
+ *
9
+ * {dataPath}/instances/{instanceId}/repo.git/ ← bare, branch `main`
10
+ * {dataPath}/instances/{instanceId}/sessions/{sid}/ ← worktree, branch `session/{sid}`
11
+ *
12
+ * Why a bare repo + worktrees instead of a plain dir per session:
13
+ * - Parallel sessions on one instance need independent commit history.
14
+ * - `git worktree` shares object storage, so the cost is mostly metadata.
15
+ * - Mental model matches platform — agent `git status` / `git log` behave
16
+ * identically against standalone and against E2B.
17
+ *
18
+ * Idempotent: `initInstance` skips if `repo.git` already exists,
19
+ * `addSessionWorktree` skips if the target worktree is already registered.
20
+ * That keeps `roj-standalone` restart-safe — bare repos and worktrees on disk
21
+ * persist across process restarts the same way `LocalRegistry` does.
22
+ *
23
+ * No auto-commit. Resources extracted via `resources.inject` land in the
24
+ * worktree as untracked files; whether to commit them is the agent's call,
25
+ * matching platform behavior.
26
+ */
27
+ import { execFile } from 'node:child_process';
28
+ import { existsSync } from 'node:fs';
29
+ import { mkdir, rm } from 'node:fs/promises';
30
+ import { join } from 'node:path';
31
+ import { promisify } from 'node:util';
32
+ const execFileAsync = promisify(execFile);
33
+ // Used for the empty initial commit on `main`. Real commits the agent makes
34
+ // will pick up the host's git config; this just keeps `commit-tree` from
35
+ // failing on machines without `user.name`/`user.email` set.
36
+ const BOOTSTRAP_GIT_ENV = {
37
+ GIT_AUTHOR_NAME: 'roj-standalone',
38
+ GIT_AUTHOR_EMAIL: 'standalone@roj.local',
39
+ GIT_COMMITTER_NAME: 'roj-standalone',
40
+ GIT_COMMITTER_EMAIL: 'standalone@roj.local',
41
+ };
42
+ export class GitInstanceFs {
43
+ dataPath;
44
+ logger;
45
+ constructor(dataPath, logger) {
46
+ this.dataPath = dataPath;
47
+ this.logger = logger;
48
+ }
49
+ instanceDir(instanceId) {
50
+ return join(this.dataPath, 'instances', instanceId);
51
+ }
52
+ repoDir(instanceId) {
53
+ return join(this.instanceDir(instanceId), 'repo.git');
54
+ }
55
+ worktreeDir(instanceId, sessionId) {
56
+ return join(this.instanceDir(instanceId), 'sessions', sessionId);
57
+ }
58
+ /**
59
+ * Idempotently initialize the bare repo for an instance with an empty
60
+ * initial commit on `main`. The commit exists so subsequent
61
+ * `git worktree add -b session/{sid}` calls have something to branch from.
62
+ */
63
+ async initInstance(instanceId) {
64
+ const repoDir = this.repoDir(instanceId);
65
+ if (existsSync(repoDir)) {
66
+ this.logger.debug('Instance bare repo already exists, skipping init', { instanceId });
67
+ return;
68
+ }
69
+ await mkdir(this.instanceDir(instanceId), { recursive: true });
70
+ await this.git(['init', '--bare', repoDir]);
71
+ // `git init --bare` may default to `master` on older git; normalize so
72
+ // the worktree branch starts from a known parent ref.
73
+ await this.git(['symbolic-ref', 'HEAD', 'refs/heads/main'], { cwd: repoDir });
74
+ const tree = (await this.git(['mktree'], { cwd: repoDir, input: '' })).trim();
75
+ const commit = (await this.git(['commit-tree', tree, '-m', 'Initial commit'], { cwd: repoDir, env: BOOTSTRAP_GIT_ENV })).trim();
76
+ await this.git(['update-ref', 'refs/heads/main', commit], { cwd: repoDir });
77
+ this.logger.info('Initialized instance bare repo', { instanceId, repoDir });
78
+ }
79
+ /**
80
+ * Idempotently add a worktree for `sessionId` on branch `session/{sid}`,
81
+ * branching from `main`. Throws if the target dir exists but is not a valid
82
+ * worktree of this instance's bare repo (unrecoverable conflict).
83
+ */
84
+ async addSessionWorktree(instanceId, sessionId) {
85
+ const repoDir = this.repoDir(instanceId);
86
+ const worktreePath = this.worktreeDir(instanceId, sessionId);
87
+ if (!existsSync(repoDir)) {
88
+ throw new Error(`Cannot add session worktree: instance bare repo missing at ${repoDir}`);
89
+ }
90
+ if (existsSync(worktreePath)) {
91
+ if (await this.isLinkedWorktree(repoDir, worktreePath)) {
92
+ this.logger.debug('Session worktree already exists, skipping add', { instanceId, sessionId });
93
+ return worktreePath;
94
+ }
95
+ throw new Error(`Path exists but is not a registered worktree of ${repoDir}: ${worktreePath}`);
96
+ }
97
+ await mkdir(join(this.instanceDir(instanceId), 'sessions'), { recursive: true });
98
+ await this.git(['worktree', 'add', '-b', `session/${sessionId}`, worktreePath, 'main'], { cwd: repoDir });
99
+ this.logger.info('Added session worktree', { instanceId, sessionId, worktreePath });
100
+ return worktreePath;
101
+ }
102
+ /**
103
+ * Remove a session's worktree (filesystem + bookkeeping). Silently no-ops
104
+ * if the worktree was never registered.
105
+ */
106
+ async removeSessionWorktree(instanceId, sessionId) {
107
+ const repoDir = this.repoDir(instanceId);
108
+ const worktreePath = this.worktreeDir(instanceId, sessionId);
109
+ if (!existsSync(repoDir) || !existsSync(worktreePath))
110
+ return;
111
+ try {
112
+ await this.git(['worktree', 'remove', '--force', worktreePath], { cwd: repoDir });
113
+ }
114
+ catch (err) {
115
+ // worktree may already be detached; fall back to filesystem rm + prune.
116
+ this.logger.warn('git worktree remove failed, falling back to rm + prune', {
117
+ instanceId,
118
+ sessionId,
119
+ error: err instanceof Error ? err.message : String(err),
120
+ });
121
+ await rm(worktreePath, { recursive: true, force: true });
122
+ await this.git(['worktree', 'prune'], { cwd: repoDir }).catch(() => { });
123
+ }
124
+ }
125
+ /**
126
+ * Tear down everything for an instance: every worktree, then the
127
+ * bare repo + on-disk dir. Safe to call when nothing exists.
128
+ */
129
+ async removeInstance(instanceId) {
130
+ const dir = this.instanceDir(instanceId);
131
+ if (!existsSync(dir))
132
+ return;
133
+ await rm(dir, { recursive: true, force: true });
134
+ this.logger.info('Removed instance directory', { instanceId, dir });
135
+ }
136
+ async isLinkedWorktree(repoDir, worktreePath) {
137
+ try {
138
+ const stdout = await this.git(['worktree', 'list', '--porcelain'], { cwd: repoDir });
139
+ // `worktree` lines look like: `worktree /abs/path` (one per registration).
140
+ return stdout
141
+ .split('\n')
142
+ .some((line) => line.startsWith('worktree ') && line.slice('worktree '.length) === worktreePath);
143
+ }
144
+ catch {
145
+ return false;
146
+ }
147
+ }
148
+ async git(args, opts = {}) {
149
+ const env = opts.env ? { ...process.env, ...opts.env } : process.env;
150
+ const child = execFileAsync('git', args, { cwd: opts.cwd, env });
151
+ if (opts.input !== undefined) {
152
+ child.child.stdin?.end(opts.input);
153
+ }
154
+ try {
155
+ const { stdout } = await child;
156
+ return stdout;
157
+ }
158
+ catch (err) {
159
+ const message = err instanceof Error ? err.message : String(err);
160
+ throw new Error(`git ${args.join(' ')} failed: ${message}`);
161
+ }
162
+ }
163
+ }
164
+ //# sourceMappingURL=git-instance-fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-instance-fs.js","sourceRoot":"","sources":["../src/git-instance-fs.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@
15
15
  */
16
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';
19
20
  import type { LocalRegistry } from './local-registry.js';
20
21
  interface Deps {
@@ -23,6 +24,8 @@ interface Deps {
23
24
  logger: Logger;
24
25
  presets: Preset[];
25
26
  registry: LocalRegistry;
27
+ /** Per-instance bare repo + per-session worktree manager. */
28
+ gitFs: GitInstanceFs;
26
29
  /** HMAC secret for signing download tokens (`sessionFiles.createDownloadUrl`). */
27
30
  tokenSecret: string;
28
31
  /** Externally-reachable base URL (e.g. `http://localhost:8765`) used when minting download URLs. */
@@ -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,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,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,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAA;IACnB,oGAAoG;IACpG,aAAa,EAAE,MAAM,CAAA;CACrB;AAQD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAuBlD"}
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"}
@@ -14,6 +14,7 @@
14
14
  * - instances.archive — no-op; shutdown the server instead
15
15
  */
16
16
  import { SessionId } from '@roj-ai/sdk';
17
+ import { randomUUID } from 'node:crypto';
17
18
  import { Hono } from 'hono';
18
19
  import { signFileToken } from './signed-token.js';
19
20
  export function createPlatformApi(deps) {
@@ -56,13 +57,24 @@ async function dispatch(deps, method, input) {
56
57
  // resources must land in the workspace before the agent's first inference so
57
58
  // the agent sees a non-empty workspace. Mirrors roj-platform's project-init
58
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`.
59
64
  async function startSession(deps, input) {
65
+ const sessionId = randomUUID();
66
+ const workspaceDir = await deps.gitFs.addSessionWorktree(deps.instance.id, sessionId);
60
67
  const created = await deps.sessionManager.callManagerMethod('sessions.create', {
61
68
  presetId: input.presetId,
69
+ sessionId,
70
+ workspaceDir,
62
71
  });
63
- if (!created.ok)
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);
64
76
  throw new Error(created.error.message);
65
- const { sessionId } = created.value;
77
+ }
66
78
  const resources = resolveSessionResources(deps, input.presetId, input.resourceIds);
67
79
  for (const resource of resources) {
68
80
  await injectRegistryResource(deps, sessionId, resource);
@@ -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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"}
@@ -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,aAAa,EAAE,MAAM,EAAE,MAAM,EAAa,cAAc,EAAE,MAAM,aAAa,CAAA;AASlH,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,CA8ItG"}
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"}
package/dist/server.js CHANGED
@@ -19,6 +19,7 @@ import { createBunWebSocketHandlers } from '@roj-ai/transport/bun';
19
19
  import { Hono } from 'hono';
20
20
  import { cors } from 'hono/cors';
21
21
  import { createFilesUploadRoute } from './files-upload-route.js';
22
+ import { GitInstanceFs } from './git-instance-fs.js';
22
23
  import { createInstance } from './instance.js';
23
24
  import { LocalRegistry } from './local-registry.js';
24
25
  import { createPlatformApi } from './platform-api.js';
@@ -66,12 +67,15 @@ export async function startStandaloneServer(options) {
66
67
  if (options.localResources?.length) {
67
68
  await registry.bootstrapLocalResources(options.localResources);
68
69
  }
70
+ const gitFs = new GitInstanceFs(config.dataPath, logger);
71
+ await gitFs.initInstance(instance.id);
69
72
  const platformApp = createPlatformApi({
70
73
  instance,
71
74
  sessionManager,
72
75
  logger,
73
76
  presets,
74
77
  registry,
78
+ gitFs,
75
79
  tokenSecret,
76
80
  publicBaseUrl,
77
81
  });
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roj-ai/standalone-server",
3
- "version": "0.1.12",
3
+ "version": "0.1.14",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "bin": {
@@ -33,10 +33,10 @@
33
33
  "type-check": "tsc --noEmit"
34
34
  },
35
35
  "dependencies": {
36
- "@roj-ai/client": "^0.1.12",
37
- "@roj-ai/sdk": "^0.1.12",
38
- "@roj-ai/shared": "^0.1.12",
39
- "@roj-ai/transport": "^0.1.12",
36
+ "@roj-ai/client": "^0.1.14",
37
+ "@roj-ai/sdk": "^0.1.14",
38
+ "@roj-ai/shared": "^0.1.14",
39
+ "@roj-ai/transport": "^0.1.14",
40
40
  "hono": "^4.10.7"
41
41
  },
42
42
  "devDependencies": {
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Per-instance git layout for the standalone server.
3
+ *
4
+ * Mirrors what `roj-platform` does inside an E2B sandbox: each instance owns
5
+ * a bare repo, each session owns a worktree branched from `main`. The SDK
6
+ * receives the worktree path as `workspaceDir` on `sessions.create` and treats
7
+ * it as an opaque directory — it doesn't know about git.
8
+ *
9
+ * {dataPath}/instances/{instanceId}/repo.git/ ← bare, branch `main`
10
+ * {dataPath}/instances/{instanceId}/sessions/{sid}/ ← worktree, branch `session/{sid}`
11
+ *
12
+ * Why a bare repo + worktrees instead of a plain dir per session:
13
+ * - Parallel sessions on one instance need independent commit history.
14
+ * - `git worktree` shares object storage, so the cost is mostly metadata.
15
+ * - Mental model matches platform — agent `git status` / `git log` behave
16
+ * identically against standalone and against E2B.
17
+ *
18
+ * Idempotent: `initInstance` skips if `repo.git` already exists,
19
+ * `addSessionWorktree` skips if the target worktree is already registered.
20
+ * That keeps `roj-standalone` restart-safe — bare repos and worktrees on disk
21
+ * persist across process restarts the same way `LocalRegistry` does.
22
+ *
23
+ * No auto-commit. Resources extracted via `resources.inject` land in the
24
+ * worktree as untracked files; whether to commit them is the agent's call,
25
+ * matching platform behavior.
26
+ */
27
+
28
+ import type { Logger } from '@roj-ai/sdk'
29
+ import { execFile } from 'node:child_process'
30
+ import { existsSync } from 'node:fs'
31
+ import { mkdir, rm } from 'node:fs/promises'
32
+ import { join } from 'node:path'
33
+ import { promisify } from 'node:util'
34
+
35
+ const execFileAsync = promisify(execFile)
36
+
37
+ // Used for the empty initial commit on `main`. Real commits the agent makes
38
+ // will pick up the host's git config; this just keeps `commit-tree` from
39
+ // failing on machines without `user.name`/`user.email` set.
40
+ const BOOTSTRAP_GIT_ENV = {
41
+ GIT_AUTHOR_NAME: 'roj-standalone',
42
+ GIT_AUTHOR_EMAIL: 'standalone@roj.local',
43
+ GIT_COMMITTER_NAME: 'roj-standalone',
44
+ GIT_COMMITTER_EMAIL: 'standalone@roj.local',
45
+ }
46
+
47
+ export class GitInstanceFs {
48
+ constructor(
49
+ private readonly dataPath: string,
50
+ private readonly logger: Logger,
51
+ ) {}
52
+
53
+ instanceDir(instanceId: string): string {
54
+ return join(this.dataPath, 'instances', instanceId)
55
+ }
56
+
57
+ repoDir(instanceId: string): string {
58
+ return join(this.instanceDir(instanceId), 'repo.git')
59
+ }
60
+
61
+ worktreeDir(instanceId: string, sessionId: string): string {
62
+ return join(this.instanceDir(instanceId), 'sessions', sessionId)
63
+ }
64
+
65
+ /**
66
+ * Idempotently initialize the bare repo for an instance with an empty
67
+ * initial commit on `main`. The commit exists so subsequent
68
+ * `git worktree add -b session/{sid}` calls have something to branch from.
69
+ */
70
+ async initInstance(instanceId: string): Promise<void> {
71
+ const repoDir = this.repoDir(instanceId)
72
+ if (existsSync(repoDir)) {
73
+ this.logger.debug('Instance bare repo already exists, skipping init', { instanceId })
74
+ return
75
+ }
76
+
77
+ await mkdir(this.instanceDir(instanceId), { recursive: true })
78
+ await this.git(['init', '--bare', repoDir])
79
+ // `git init --bare` may default to `master` on older git; normalize so
80
+ // the worktree branch starts from a known parent ref.
81
+ await this.git(['symbolic-ref', 'HEAD', 'refs/heads/main'], { cwd: repoDir })
82
+
83
+ const tree = (await this.git(['mktree'], { cwd: repoDir, input: '' })).trim()
84
+ const commit = (await this.git(
85
+ ['commit-tree', tree, '-m', 'Initial commit'],
86
+ { cwd: repoDir, env: BOOTSTRAP_GIT_ENV },
87
+ )).trim()
88
+ await this.git(['update-ref', 'refs/heads/main', commit], { cwd: repoDir })
89
+
90
+ this.logger.info('Initialized instance bare repo', { instanceId, repoDir })
91
+ }
92
+
93
+ /**
94
+ * Idempotently add a worktree for `sessionId` on branch `session/{sid}`,
95
+ * branching from `main`. Throws if the target dir exists but is not a valid
96
+ * worktree of this instance's bare repo (unrecoverable conflict).
97
+ */
98
+ async addSessionWorktree(instanceId: string, sessionId: string): Promise<string> {
99
+ const repoDir = this.repoDir(instanceId)
100
+ const worktreePath = this.worktreeDir(instanceId, sessionId)
101
+
102
+ if (!existsSync(repoDir)) {
103
+ throw new Error(`Cannot add session worktree: instance bare repo missing at ${repoDir}`)
104
+ }
105
+
106
+ if (existsSync(worktreePath)) {
107
+ if (await this.isLinkedWorktree(repoDir, worktreePath)) {
108
+ this.logger.debug('Session worktree already exists, skipping add', { instanceId, sessionId })
109
+ return worktreePath
110
+ }
111
+ throw new Error(`Path exists but is not a registered worktree of ${repoDir}: ${worktreePath}`)
112
+ }
113
+
114
+ await mkdir(join(this.instanceDir(instanceId), 'sessions'), { recursive: true })
115
+ await this.git(
116
+ ['worktree', 'add', '-b', `session/${sessionId}`, worktreePath, 'main'],
117
+ { cwd: repoDir },
118
+ )
119
+ this.logger.info('Added session worktree', { instanceId, sessionId, worktreePath })
120
+ return worktreePath
121
+ }
122
+
123
+ /**
124
+ * Remove a session's worktree (filesystem + bookkeeping). Silently no-ops
125
+ * if the worktree was never registered.
126
+ */
127
+ async removeSessionWorktree(instanceId: string, sessionId: string): Promise<void> {
128
+ const repoDir = this.repoDir(instanceId)
129
+ const worktreePath = this.worktreeDir(instanceId, sessionId)
130
+
131
+ if (!existsSync(repoDir) || !existsSync(worktreePath)) return
132
+
133
+ try {
134
+ await this.git(['worktree', 'remove', '--force', worktreePath], { cwd: repoDir })
135
+ } catch (err) {
136
+ // worktree may already be detached; fall back to filesystem rm + prune.
137
+ this.logger.warn('git worktree remove failed, falling back to rm + prune', {
138
+ instanceId,
139
+ sessionId,
140
+ error: err instanceof Error ? err.message : String(err),
141
+ })
142
+ await rm(worktreePath, { recursive: true, force: true })
143
+ await this.git(['worktree', 'prune'], { cwd: repoDir }).catch(() => {})
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Tear down everything for an instance: every worktree, then the
149
+ * bare repo + on-disk dir. Safe to call when nothing exists.
150
+ */
151
+ async removeInstance(instanceId: string): Promise<void> {
152
+ const dir = this.instanceDir(instanceId)
153
+ if (!existsSync(dir)) return
154
+ await rm(dir, { recursive: true, force: true })
155
+ this.logger.info('Removed instance directory', { instanceId, dir })
156
+ }
157
+
158
+ private async isLinkedWorktree(repoDir: string, worktreePath: string): Promise<boolean> {
159
+ try {
160
+ const stdout = await this.git(['worktree', 'list', '--porcelain'], { cwd: repoDir })
161
+ // `worktree` lines look like: `worktree /abs/path` (one per registration).
162
+ return stdout
163
+ .split('\n')
164
+ .some((line) => line.startsWith('worktree ') && line.slice('worktree '.length) === worktreePath)
165
+ } catch {
166
+ return false
167
+ }
168
+ }
169
+
170
+ private async git(
171
+ args: string[],
172
+ opts: { cwd?: string; input?: string; env?: Record<string, string> } = {},
173
+ ): Promise<string> {
174
+ const env = opts.env ? { ...process.env, ...opts.env } : process.env
175
+ const child = execFileAsync('git', args, { cwd: opts.cwd, env })
176
+ if (opts.input !== undefined) {
177
+ child.child.stdin?.end(opts.input)
178
+ }
179
+ try {
180
+ const { stdout } = await child
181
+ return stdout
182
+ } catch (err) {
183
+ const message = err instanceof Error ? err.message : String(err)
184
+ throw new Error(`git ${args.join(' ')} failed: ${message}`)
185
+ }
186
+ }
187
+ }
@@ -16,7 +16,9 @@
16
16
 
17
17
  import type { Logger, Preset, SessionManager } from '@roj-ai/sdk'
18
18
  import { SessionId } from '@roj-ai/sdk'
19
+ import { randomUUID } from 'node:crypto'
19
20
  import { Hono } from 'hono'
21
+ import type { GitInstanceFs } from './git-instance-fs.js'
20
22
  import type { InstanceState } from './instance.js'
21
23
  import type { LocalRegistry } from './local-registry.js'
22
24
  import { signFileToken } from './signed-token.js'
@@ -27,6 +29,8 @@ interface Deps {
27
29
  logger: Logger
28
30
  presets: Preset[]
29
31
  registry: LocalRegistry
32
+ /** Per-instance bare repo + per-session worktree manager. */
33
+ gitFs: GitInstanceFs
30
34
  /** HMAC secret for signing download tokens (`sessionFiles.createDownloadUrl`). */
31
35
  tokenSecret: string
32
36
  /** Externally-reachable base URL (e.g. `http://localhost:8765`) used when minting download URLs. */
@@ -100,15 +104,28 @@ interface AutoCreateSessionInput {
100
104
  // resources must land in the workspace before the agent's first inference so
101
105
  // the agent sees a non-empty workspace. Mirrors roj-platform's project-init
102
106
  // (inject-resources → activatePendingSession with initialPrompt).
107
+ //
108
+ // SessionId is minted up-front (rather than letting the SDK generate one) so we
109
+ // can create the matching git worktree before the SDK initializes the session
110
+ // — the worktree path is then passed through as `workspaceDir`.
103
111
  async function startSession(
104
112
  deps: Deps,
105
113
  input: { presetId: string; initialPrompt?: string; resourceIds?: string[] },
106
114
  ): Promise<{ sessionId: string }> {
115
+ const sessionId = randomUUID()
116
+ const workspaceDir = await deps.gitFs.addSessionWorktree(deps.instance.id, sessionId)
117
+
107
118
  const created = await deps.sessionManager.callManagerMethod('sessions.create', {
108
119
  presetId: input.presetId,
120
+ sessionId,
121
+ workspaceDir,
109
122
  })
110
- if (!created.ok) throw new Error(created.error.message)
111
- const { sessionId } = created.value as { sessionId: string }
123
+ if (!created.ok) {
124
+ // Roll back the worktree we just created so a retry isn't blocked by an
125
+ // orphaned dir. Best-effort — failure here is logged inside removeSessionWorktree.
126
+ await deps.gitFs.removeSessionWorktree(deps.instance.id, sessionId)
127
+ throw new Error(created.error.message)
128
+ }
112
129
 
113
130
  const resources = resolveSessionResources(deps, input.presetId, input.resourceIds)
114
131
  for (const resource of resources) {
package/src/server.ts CHANGED
@@ -21,6 +21,7 @@ import { createBunWebSocketHandlers } from '@roj-ai/transport/bun'
21
21
  import { Hono } from 'hono'
22
22
  import { cors } from 'hono/cors'
23
23
  import { createFilesUploadRoute } from './files-upload-route.js'
24
+ import { GitInstanceFs } from './git-instance-fs.js'
24
25
  import { createInstance, type InstanceState } from './instance.js'
25
26
  import { LocalRegistry } from './local-registry.js'
26
27
  import { createPlatformApi } from './platform-api.js'
@@ -107,12 +108,16 @@ export async function startStandaloneServer(options: StartStandaloneOptions): Pr
107
108
  await registry.bootstrapLocalResources(options.localResources)
108
109
  }
109
110
 
111
+ const gitFs = new GitInstanceFs(config.dataPath, logger)
112
+ await gitFs.initInstance(instance.id)
113
+
110
114
  const platformApp = createPlatformApi({
111
115
  instance,
112
116
  sessionManager,
113
117
  logger,
114
118
  presets,
115
119
  registry,
120
+ gitFs,
116
121
  tokenSecret,
117
122
  publicBaseUrl,
118
123
  })