@multiplayer-app/agent 0.1.5 → 0.1.6

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.
Files changed (43) hide show
  1. package/dist/checkpoint-timer.test.d.ts +2 -0
  2. package/dist/checkpoint-timer.test.d.ts.map +1 -0
  3. package/dist/checkpoint-timer.test.js +77 -0
  4. package/dist/checkpoint-timer.test.js.map +1 -0
  5. package/dist/cli.js +15 -6
  6. package/dist/cli.js.map +1 -1
  7. package/dist/git-sync.d.ts +1 -1
  8. package/dist/git-sync.d.ts.map +1 -1
  9. package/dist/git-sync.js +17 -29
  10. package/dist/git-sync.js.map +1 -1
  11. package/dist/git-sync.test.d.ts +2 -0
  12. package/dist/git-sync.test.d.ts.map +1 -0
  13. package/dist/git-sync.test.js +181 -0
  14. package/dist/git-sync.test.js.map +1 -0
  15. package/dist/lambda-microvm-entrypoint.js +22 -8
  16. package/dist/lambda-microvm-entrypoint.js.map +1 -1
  17. package/dist/lifecycle.test.d.ts +2 -0
  18. package/dist/lifecycle.test.d.ts.map +1 -0
  19. package/dist/lifecycle.test.js +46 -0
  20. package/dist/lifecycle.test.js.map +1 -0
  21. package/dist/link.d.ts.map +1 -1
  22. package/dist/link.js +6 -4
  23. package/dist/link.js.map +1 -1
  24. package/dist/protocol.d.ts +6 -0
  25. package/dist/protocol.d.ts.map +1 -1
  26. package/dist/protocol.js +6 -0
  27. package/dist/protocol.js.map +1 -1
  28. package/dist/protocol.test.js +6 -0
  29. package/dist/protocol.test.js.map +1 -1
  30. package/dist/research/filingramp-tools.d.ts +1 -1
  31. package/dist/research/filingramp-tools.d.ts.map +1 -1
  32. package/dist/research/filingramp-tools.js +24 -13
  33. package/dist/research/filingramp-tools.js.map +1 -1
  34. package/dist/research/prompt.js +1 -1
  35. package/dist/runtime.d.ts +2 -0
  36. package/dist/runtime.d.ts.map +1 -1
  37. package/dist/runtime.js +20 -3
  38. package/dist/runtime.js.map +1 -1
  39. package/dist/session.d.ts +6 -1
  40. package/dist/session.d.ts.map +1 -1
  41. package/dist/session.js +59 -31
  42. package/dist/session.js.map +1 -1
  43. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=checkpoint-timer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-timer.test.d.ts","sourceRoot":"","sources":["../src/checkpoint-timer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_fs_1 = require("node:fs");
8
+ const node_os_1 = __importDefault(require("node:os"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const promises_1 = require("node:timers/promises");
11
+ const node_test_1 = require("node:test");
12
+ const session_1 = require("./session");
13
+ const git_sync_1 = require("./git-sync");
14
+ (0, node_test_1.it)('checkpoints idle sessions every five minutes without overlapping slow pushes, and stops the timer on shutdown', async (t) => {
15
+ const dir = await node_fs_1.promises.mkdtemp(node_path_1.default.join(node_os_1.default.tmpdir(), 'agent-checkpoint-timer-'));
16
+ t.after(() => node_fs_1.promises.rm(dir, { recursive: true, force: true }));
17
+ t.mock.timers.enable({ apis: ['setTimeout', 'Date'], now: 1000000 });
18
+ const agent = new session_1.SessionAgent({
19
+ sessionId: 's', mode: 'session', profile: 'coding', workspaceDir: dir,
20
+ model: 'unused', extractionModel: 'unused', mcpConnections: [], provider: {},
21
+ }, { send() { }, onCommand() { }, async ready() { }, async close() { } });
22
+ let release;
23
+ const push = new Promise((resolve) => {
24
+ release = resolve;
25
+ });
26
+ const checkpoint = t.mock.method(agent, 'checkpoint', async () => push);
27
+ await agent.start();
28
+ t.mock.timers.tick(session_1.PERIODIC_CHECKPOINT_MS - 1);
29
+ strict_1.default.equal(checkpoint.mock.callCount(), 0);
30
+ t.mock.timers.tick(1);
31
+ strict_1.default.equal(checkpoint.mock.callCount(), 1);
32
+ strict_1.default.deepEqual(checkpoint.mock.calls[0].arguments, ['periodic']);
33
+ t.mock.timers.tick(session_1.PERIODIC_CHECKPOINT_MS * 3);
34
+ strict_1.default.equal(checkpoint.mock.callCount(), 1);
35
+ release();
36
+ await (0, promises_1.setImmediate)();
37
+ t.mock.timers.tick(session_1.PERIODIC_CHECKPOINT_MS);
38
+ strict_1.default.equal(checkpoint.mock.callCount(), 2);
39
+ await (0, promises_1.setImmediate)();
40
+ await agent.stop();
41
+ const count = checkpoint.mock.callCount();
42
+ t.mock.timers.tick(session_1.PERIODIC_CHECKPOINT_MS * 3);
43
+ strict_1.default.equal(checkpoint.mock.callCount(), count);
44
+ });
45
+ (0, node_test_1.it)('defers periodic work until five minutes after a successful turn/lifecycle checkpoint', async (t) => {
46
+ const dir = await node_fs_1.promises.mkdtemp(node_path_1.default.join(node_os_1.default.tmpdir(), 'agent-checkpoint-recent-'));
47
+ t.after(() => node_fs_1.promises.rm(dir, { recursive: true, force: true }));
48
+ t.mock.timers.enable({ apis: ['setTimeout', 'Date'], now: 1000000 });
49
+ t.mock.method(git_sync_1.GitSync.prototype, 'restore', async () => false);
50
+ const commit = t.mock.method(git_sync_1.GitSync.prototype, 'commit', async () => 'sha');
51
+ let checkpointed;
52
+ const agent = new session_1.SessionAgent({
53
+ sessionId: 's', mode: 'session', profile: 'coding', workspaceDir: dir,
54
+ model: 'unused', extractionModel: 'unused', mcpConnections: [], provider: {},
55
+ git: { dir, serverUrl: 'unused', repository: 'unused', branch: 'session/s', token: 'unused' },
56
+ }, {
57
+ send(event) { if (event.type === 'checkpointed')
58
+ checkpointed === null || checkpointed === void 0 ? void 0 : checkpointed(); },
59
+ onCommand() { }, async ready() { }, async close() { },
60
+ });
61
+ await agent.start();
62
+ t.mock.timers.tick(4 * 60000);
63
+ await agent.checkpoint('turn finished');
64
+ strict_1.default.equal(commit.mock.callCount(), 1);
65
+ t.mock.timers.tick(60000);
66
+ await (0, promises_1.setImmediate)();
67
+ strict_1.default.equal(commit.mock.callCount(), 1);
68
+ const next = new Promise((resolve) => {
69
+ checkpointed = resolve;
70
+ });
71
+ t.mock.timers.tick(4 * 60000);
72
+ await next;
73
+ strict_1.default.equal(commit.mock.callCount(), 2);
74
+ await (0, promises_1.setImmediate)();
75
+ await agent.stop();
76
+ });
77
+ //# sourceMappingURL=checkpoint-timer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-timer.test.js","sourceRoot":"","sources":["../src/checkpoint-timer.test.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -9,17 +9,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  // process.env and go".
10
10
  const runtime_1 = require("./runtime");
11
11
  async function main() {
12
- const running = await (0, runtime_1.startAgent)();
13
- if (!running.session) {
14
- process.exit(0);
15
- }
12
+ const starting = (0, runtime_1.startAgent)();
13
+ let shuttingDown = false;
16
14
  const shutdown = async (signal) => {
15
+ if (shuttingDown)
16
+ return;
17
+ shuttingDown = true;
17
18
  console.log(`[agent] ${signal} received, checkpointing`);
19
+ const running = await starting;
18
20
  await running.close();
19
21
  process.exit(0);
20
22
  };
21
- process.on('SIGTERM', () => void shutdown('SIGTERM'));
22
- process.on('SIGINT', () => void shutdown('SIGINT'));
23
+ for (const signal of ['SIGTERM', 'SIGINT']) {
24
+ process.on(signal, () => void shutdown(signal).catch((error) => {
25
+ console.error('agent shutdown checkpoint failed:', error);
26
+ process.exit(1);
27
+ }));
28
+ }
29
+ const running = await starting;
30
+ if (!running.session && !shuttingDown)
31
+ process.exit(0);
23
32
  }
24
33
  main().catch((error) => {
25
34
  console.error(error instanceof Error ? error.message : error);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,6FAA6F;AAC7F,8FAA8F;AAC9F,qEAAqE;AACrE,6FAA6F;AAC7F,uFAAuF;AACvF,uBAAuB;AACvB,uCAAsC;AAEtC,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,MAAM,IAAA,oBAAU,GAAE,CAAA;IAClC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACxC,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,0BAA0B,CAAC,CAAA;QACxD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAA;IACD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAA;IACrD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,6FAA6F;AAC7F,8FAA8F;AAC9F,qEAAqE;AACrE,6FAA6F;AAC7F,uFAAuF;AACvF,uBAAuB;AACvB,uCAAsC;AAEtC,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,IAAA,oBAAU,GAAE,CAAA;IAC7B,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACxC,IAAI,YAAY;YAAE,OAAM;QACxB,YAAY,GAAG,IAAI,CAAA;QACnB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,0BAA0B,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAA;QAC9B,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAA;IACD,KAAK,MAAM,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACtE,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC,CAAC,CAAC,CAAA;IACL,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAA;IAC9B,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,YAAY;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACxD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -17,7 +17,7 @@ export declare class GitSync {
17
17
  * checkpoint can push. Returns true when previous work was restored.
18
18
  */
19
19
  restore(): Promise<boolean>;
20
- /** Commit everything and push the branch. Resolves with the commit sha, or undefined when nothing changed. */
20
+ /** Commit everything and push, including commits left by a previously failed push. */
21
21
  commit(message: string): Promise<string | undefined>;
22
22
  }
23
23
  //# sourceMappingURL=git-sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-sync.d.ts","sourceRoot":"","sources":["../src/git-sync.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAK7C,eAAO,MAAM,mBAAmB,QAAkG,CAAA;AAWlI,qBAAa,OAAO;IAKN,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;IACvC,OAAO,CAAC,IAAI,CAAsC;gBAErB,MAAM,EAAE,aAAa;IAiBlD,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,2FAA2F;IAC3F,OAAO,CAAC,GAAG;IAIX,6FAA6F;IAC7F,OAAO,CAAC,SAAS;IAMjB;;;;OAIG;IACH,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAiC3B,8GAA8G;IAC9G,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAmBrD"}
1
+ {"version":3,"file":"git-sync.d.ts","sourceRoot":"","sources":["../src/git-sync.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAK7C,eAAO,MAAM,mBAAmB,QAAkG,CAAA;AAWlI,qBAAa,OAAO;IAKN,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;IACvC,OAAO,CAAC,IAAI,CAAsC;gBAErB,MAAM,EAAE,aAAa;IAiBlD,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,2FAA2F;IAC3F,OAAO,CAAC,GAAG;IAIX,6FAA6F;IAC7F,OAAO,CAAC,SAAS;IAMjB;;;;OAIG;IACH,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAwB3B,sFAAsF;IACtF,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAkBrD"}
package/dist/git-sync.js CHANGED
@@ -67,25 +67,14 @@ class GitSync {
67
67
  const { dir, branch } = this.config;
68
68
  await fs_1.promises.mkdir(dir, { recursive: true });
69
69
  if (await pathExists(path_1.default.join(dir, '.git'))) {
70
- try {
71
- await this.git(['fetch', 'origin', branch]);
72
- await this.git(['reset', '--hard', `origin/${branch}`]);
73
- return true;
74
- }
75
- catch (error) {
76
- console.warn('[git] pull failed, keeping the local checkout:', error.message);
77
- return false;
78
- }
79
- }
80
- let remoteBranches = '';
81
- try {
82
- remoteBranches = (await this.git(['ls-remote', '--heads', this.remote, branch], process.cwd())).stdout.trim();
83
- }
84
- catch (error) {
85
- // Unreachable server: work in a local repository anyway so checkpoints still commit;
86
- // the push is retried on every later checkpoint.
87
- console.warn('[git] server unreachable, starting a local repository:', error.message.split('\n')[0]);
70
+ await this.git(['fetch', 'origin', branch]);
71
+ // Preserve any locally committed checkpoint whose push was interrupted.
72
+ await this.git(['merge', '--ff-only', 'FETCH_HEAD']);
73
+ return true;
88
74
  }
75
+ // Only a successful lookup with no branch means a new session. A network/auth error
76
+ // must never let a replacement agent accept a turn against an empty workspace.
77
+ const remoteBranches = (await this.git(['ls-remote', '--heads', this.remote, branch], process.cwd())).stdout.trim();
89
78
  if (remoteBranches) {
90
79
  await this.git(['clone', '--branch', branch, '--single-branch', this.remote, dir], process.cwd());
91
80
  return true;
@@ -96,7 +85,7 @@ class GitSync {
96
85
  return false;
97
86
  });
98
87
  }
99
- /** Commit everything and push the branch. Resolves with the commit sha, or undefined when nothing changed. */
88
+ /** Commit everything and push, including commits left by a previously failed push. */
100
89
  commit(message) {
101
90
  return this.serialize(async () => {
102
91
  if (!(await pathExists(path_1.default.join(this.config.dir, '.gitignore')))) {
@@ -104,17 +93,16 @@ class GitSync {
104
93
  }
105
94
  await this.git(['add', '-A']);
106
95
  const status = (await this.git(['status', '--porcelain'])).stdout.trim();
107
- if (!status)
108
- return undefined;
109
- await this.git(['commit', '-q', '-m', message]);
96
+ if (status)
97
+ await this.git(['commit', '-q', '-m', message]);
110
98
  const sha = (await this.git(['rev-parse', 'HEAD'])).stdout.trim();
111
- try {
112
- await this.git(['push', '-u', 'origin', `HEAD:${this.config.branch}`]);
113
- }
114
- catch (error) {
115
- // The commit is safe locally; the next checkpoint pushes everything accumulated.
116
- console.warn('[git] push failed, will retry on the next checkpoint:', error.message.split('\n')[0]);
117
- }
99
+ // No network request for an unchanged, already-pushed workspace. A failed push leaves
100
+ // the upstream behind HEAD, so a later periodic checkpoint still retries it.
101
+ const upstream = await this.git(['rev-parse', '--verify', '@{upstream}']).catch(() => undefined);
102
+ if ((upstream === null || upstream === void 0 ? void 0 : upstream.stdout.trim()) === sha)
103
+ return undefined;
104
+ // Propagate failure: checkpointed must mean the commit actually reached durable storage.
105
+ await this.git(['push', '-u', 'origin', `HEAD:${this.config.branch}`]);
118
106
  return sha;
119
107
  });
120
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"git-sync.js","sourceRoot":"","sources":["../src/git-sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-sync.js","sourceRoot":"","sources":["../src/git-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=git-sync.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-sync.test.d.ts","sourceRoot":"","sources":["../src/git-sync.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const strict_1 = __importDefault(require("node:assert/strict"));
40
+ const node_child_process_1 = require("node:child_process");
41
+ const node_fs_1 = require("node:fs");
42
+ const node_os_1 = __importDefault(require("node:os"));
43
+ const node_path_1 = __importDefault(require("node:path"));
44
+ const node_util_1 = require("node:util");
45
+ const node_test_1 = require("node:test");
46
+ const test_1 = require("ai/test");
47
+ const modelProvider = __importStar(require("./model"));
48
+ const git_sync_1 = require("./git-sync");
49
+ const session_1 = require("./session");
50
+ const exec = (0, node_util_1.promisify)(node_child_process_1.execFile);
51
+ (0, node_test_1.describe)('session workspace recovery from Git', () => {
52
+ let root;
53
+ let remote;
54
+ let config;
55
+ (0, node_test_1.beforeEach)(async () => {
56
+ root = await node_fs_1.promises.mkdtemp(node_path_1.default.join(node_os_1.default.tmpdir(), 'agent-recovery-'));
57
+ remote = node_path_1.default.join(root, 'git/account/research.git');
58
+ await node_fs_1.promises.mkdir(remote, { recursive: true });
59
+ await exec('git', ['init', '--bare', remote]);
60
+ config = { serverUrl: `file://${root}`, repository: 'account/research', branch: 'session/chat-1', token: 'test', dir: node_path_1.default.join(root, 'original-vm') };
61
+ });
62
+ (0, node_test_1.afterEach)(async () => {
63
+ node_test_1.mock.restoreAll();
64
+ await node_fs_1.promises.rm(root, { recursive: true, force: true });
65
+ });
66
+ (0, node_test_1.it)('restores artifacts and conversation on a new VM before announcing readiness', async () => {
67
+ var _a, _b;
68
+ const original = new git_sync_1.GitSync(config);
69
+ strict_1.default.equal(await original.restore(), false);
70
+ const conversation = { version: 1, messages: [{ role: 'user', content: 'Research valves' }, { role: 'assistant', content: 'Found three filings' }], usedTokens: 123, budget: 1000, budgetPaused: false };
71
+ const files = {
72
+ '.builder/conversation.json': JSON.stringify(conversation),
73
+ 'research/findings.md': '# Three filings',
74
+ 'research/results.csv': 'filing,result\na,yes',
75
+ 'data/text/filing.txt': 'Extracted evidence',
76
+ 'images/chart.png': Buffer.from([137, 80, 78, 71, 0, 1]),
77
+ };
78
+ for (const [name, contents] of Object.entries(files)) {
79
+ await node_fs_1.promises.mkdir(node_path_1.default.dirname(node_path_1.default.join(config.dir, name)), { recursive: true });
80
+ await node_fs_1.promises.writeFile(node_path_1.default.join(config.dir, name), contents);
81
+ }
82
+ await original.commit('completed turn');
83
+ await node_fs_1.promises.rm(config.dir, { recursive: true }); // The previous VM's entire disk is gone.
84
+ const replacementConfig = {
85
+ sessionId: 'chat-1', mode: 'session', profile: 'coding', model: 'unused', extractionModel: 'unused',
86
+ workspaceDir: node_path_1.default.join(root, 'new-vm'), mcpConnections: [], provider: {},
87
+ git: { ...config, dir: node_path_1.default.join(root, 'new-vm') },
88
+ };
89
+ const events = [];
90
+ let handle;
91
+ let finish;
92
+ const finished = new Promise((resolve) => {
93
+ finish = resolve;
94
+ });
95
+ const link = {
96
+ send(event) {
97
+ events.push(event);
98
+ if (event.type === 'done' || event.type === 'error')
99
+ finish();
100
+ },
101
+ onCommand(handler) { handle = handler; },
102
+ async ready() { },
103
+ async close() { },
104
+ };
105
+ const replacement = new session_1.SessionAgent(replacementConfig, link);
106
+ await replacement.start();
107
+ strict_1.default.equal((_a = events[0]) === null || _a === void 0 ? void 0 : _a.type, 'ready');
108
+ strict_1.default.equal(((_b = events[0]) === null || _b === void 0 ? void 0 : _b.type) === 'ready' && events[0].restored, true);
109
+ for (const [name, contents] of Object.entries(files)) {
110
+ strict_1.default.deepEqual(await node_fs_1.promises.readFile(node_path_1.default.join(replacementConfig.workspaceDir, name)), Buffer.from(contents));
111
+ }
112
+ await replacement.checkpoint('continued session');
113
+ strict_1.default.deepEqual(JSON.parse(await node_fs_1.promises.readFile(node_path_1.default.join(replacementConfig.workspaceDir, '.builder/conversation.json'), 'utf8')), conversation);
114
+ const model = new test_1.MockLanguageModelV3({
115
+ doStream: async () => ({
116
+ stream: new ReadableStream({
117
+ start(controller) {
118
+ controller.enqueue({ type: 'text-start', id: 'answer' });
119
+ controller.enqueue({ type: 'text-delta', id: 'answer', delta: 'Continuing from the three filings.' });
120
+ controller.enqueue({ type: 'text-end', id: 'answer' });
121
+ controller.enqueue({
122
+ type: 'finish',
123
+ finishReason: { unified: 'stop', raw: 'stop' },
124
+ usage: {
125
+ inputTokens: { total: 10, noCache: 10, cacheRead: 0, cacheWrite: 0 },
126
+ outputTokens: { total: 5, text: 5, reasoning: 0 },
127
+ },
128
+ });
129
+ controller.close();
130
+ },
131
+ }),
132
+ }),
133
+ });
134
+ node_test_1.mock.method(modelProvider, 'resolveLanguageModel', () => model);
135
+ await handle({ type: 'message', messageId: 'next-turn', text: 'Continue' });
136
+ await finished;
137
+ strict_1.default.equal(events.some((event) => event.type === 'error'), false);
138
+ strict_1.default.deepEqual(model.doStreamCalls[0].prompt.slice(1).map((message) => message.role), ['user', 'assistant', 'user']);
139
+ strict_1.default.match(JSON.stringify(model.doStreamCalls[0].prompt), /Found three filings/);
140
+ // Completion is published only after the new conversation has reached the remote.
141
+ const another = new git_sync_1.GitSync({ ...config, dir: node_path_1.default.join(root, 'another-vm') });
142
+ await another.restore();
143
+ const continued = JSON.parse(await node_fs_1.promises.readFile(node_path_1.default.join(another.dir, '.builder/conversation.json'), 'utf8'));
144
+ strict_1.default.equal(continued.messages.length, 4);
145
+ strict_1.default.match(JSON.stringify(continued.messages[3]), /Continuing from the three filings/);
146
+ });
147
+ (0, node_test_1.it)('does not announce readiness or initialize an empty repo when restoration fails', async () => {
148
+ await node_fs_1.promises.rename(remote, `${remote}.offline`);
149
+ const events = [];
150
+ const agent = new session_1.SessionAgent({ sessionId: 'chat-1', mode: 'session', profile: 'coding', model: 'unused', extractionModel: 'unused', workspaceDir: config.dir, mcpConnections: [], provider: {}, git: config }, {
151
+ send(event) { events.push(event); }, onCommand() { }, async ready() { }, async close() { },
152
+ });
153
+ await strict_1.default.rejects(agent.start());
154
+ strict_1.default.deepEqual(events, []);
155
+ await strict_1.default.rejects(node_fs_1.promises.access(node_path_1.default.join(config.dir, '.git')));
156
+ });
157
+ (0, node_test_1.it)('retries a failed push even when no files changed and preserves local commits on restart', async () => {
158
+ const sync = new git_sync_1.GitSync(config);
159
+ await sync.restore();
160
+ await sync.commit('initial');
161
+ await node_fs_1.promises.writeFile(node_path_1.default.join(config.dir, 'findings.md'), 'must survive');
162
+ await node_fs_1.promises.rename(remote, `${remote}.offline`);
163
+ await strict_1.default.rejects(sync.commit('interrupted push'));
164
+ await node_fs_1.promises.rename(`${remote}.offline`, remote);
165
+ await sync.restore();
166
+ strict_1.default.equal(await node_fs_1.promises.readFile(node_path_1.default.join(config.dir, 'findings.md'), 'utf8'), 'must survive');
167
+ await sync.commit('retry without edits');
168
+ const fresh = new git_sync_1.GitSync({ ...config, dir: node_path_1.default.join(root, 'fresh') });
169
+ strict_1.default.equal(await fresh.restore(), true);
170
+ strict_1.default.equal(await node_fs_1.promises.readFile(node_path_1.default.join(fresh.dir, 'findings.md'), 'utf8'), 'must survive');
171
+ });
172
+ (0, node_test_1.it)('skips empty commits and network pushes when the last snapshot is already durable', async () => {
173
+ const sync = new git_sync_1.GitSync(config);
174
+ await sync.restore();
175
+ const sha = await sync.commit('initial');
176
+ await node_fs_1.promises.rename(remote, `${remote}.offline`);
177
+ strict_1.default.equal(await sync.commit('unchanged periodic checkpoint'), undefined);
178
+ strict_1.default.equal((await exec('git', ['rev-parse', 'HEAD'], { cwd: config.dir })).stdout.trim(), sha);
179
+ });
180
+ });
181
+ //# sourceMappingURL=git-sync.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-sync.test.js","sourceRoot":"","sources":["../src/git-sync.test.ts"],"names":[],"mappings":"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"}
@@ -44,30 +44,32 @@ function start() {
44
44
  starting = (0, runtime_1.startAgent)()
45
45
  .then((agent) => {
46
46
  running = agent;
47
+ return agent;
47
48
  })
48
49
  .catch((error) => {
50
+ starting = undefined;
49
51
  console.error('agent run failed:', error instanceof Error ? error.message : error);
52
+ throw error;
50
53
  });
51
54
  }
52
55
  return starting;
53
56
  }
54
57
  async function onHook(hook, body) {
55
- var _a;
56
58
  switch (hook) {
57
59
  case 'run': {
58
60
  try {
59
61
  const parsed = JSON.parse(body);
60
62
  materializeEnv(parsed.runHookPayload);
61
63
  }
62
- catch (_b) {
64
+ catch (_a) {
63
65
  /* payload is optional */
64
66
  }
65
- void start();
67
+ void start().catch(() => undefined);
66
68
  return;
67
69
  }
68
70
  case 'suspend':
69
71
  case 'terminate':
70
- await ((_a = running === null || running === void 0 ? void 0 : running.session) === null || _a === void 0 ? void 0 : _a.checkpoint(hook));
72
+ await (0, runtime_1.checkpointBeforeFreeze)(starting, hook);
71
73
  return;
72
74
  case 'resume':
73
75
  // Memory and disk survived; the socket reconnects on its own. Nothing to restore.
@@ -94,7 +96,11 @@ const server = http_1.default.createServer((req, res) => {
94
96
  res.end('{}');
95
97
  };
96
98
  if (hook === 'suspend' || hook === 'terminate') {
97
- work.then(reply, reply);
99
+ work.then(reply, (error) => {
100
+ console.error(`lifecycle checkpoint failed (${hook}):`, error instanceof Error ? error.message : error);
101
+ res.writeHead(500, { 'Content-Type': 'application/json' });
102
+ res.end(JSON.stringify({ error: 'Workspace checkpoint failed' }));
103
+ });
98
104
  }
99
105
  else {
100
106
  reply();
@@ -109,15 +115,23 @@ server.listen(PORT, () => {
109
115
  console.log(`agent lifecycle hook server listening on ${PORT}`);
110
116
  // Docker / Fargate: no lifecycle hook caller, so a SESSION_ID already in the env drives startup.
111
117
  if (process.env.SESSION_ID)
112
- setImmediate(() => void start());
118
+ setImmediate(() => void start().catch(() => undefined));
113
119
  });
120
+ let shuttingDown = false;
114
121
  for (const signal of ['SIGTERM', 'SIGINT']) {
115
122
  process.on(signal, () => {
123
+ if (shuttingDown)
124
+ return;
125
+ shuttingDown = true;
116
126
  void (async () => {
117
- await (running === null || running === void 0 ? void 0 : running.close());
127
+ const agent = await starting;
128
+ await (agent === null || agent === void 0 ? void 0 : agent.close());
118
129
  server.close();
119
130
  process.exit(0);
120
- })();
131
+ })().catch((error) => {
132
+ console.error('agent shutdown checkpoint failed:', error);
133
+ process.exit(1);
134
+ });
121
135
  });
122
136
  }
123
137
  //# sourceMappingURL=lambda-microvm-entrypoint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lambda-microvm-entrypoint.js","sourceRoot":"","sources":["../src/lambda-microvm-entrypoint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lambda-microvm-entrypoint.js","sourceRoot":"","sources":["../src/lambda-microvm-entrypoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lifecycle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.test.d.ts","sourceRoot":"","sources":["../src/lifecycle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_test_1 = require("node:test");
8
+ const runtime_1 = require("./runtime");
9
+ (0, node_test_1.describe)('Lambda suspend/terminate checkpoint', () => {
10
+ for (const hook of ['suspend', 'terminate']) {
11
+ (0, node_test_1.it)(`waits for both startup and Git before completing ${hook}`, async () => {
12
+ let started;
13
+ let pushed;
14
+ let finished = false;
15
+ const startup = new Promise((resolve) => {
16
+ started = resolve;
17
+ });
18
+ const push = new Promise((resolve) => {
19
+ pushed = resolve;
20
+ });
21
+ const request = (0, runtime_1.checkpointBeforeFreeze)(startup, hook).then(() => {
22
+ finished = true;
23
+ });
24
+ await Promise.resolve();
25
+ strict_1.default.equal(finished, false);
26
+ started({ session: { checkpoint: async (reason) => {
27
+ strict_1.default.equal(reason, hook);
28
+ await push;
29
+ } } });
30
+ await Promise.resolve();
31
+ strict_1.default.equal(finished, false);
32
+ pushed();
33
+ await request;
34
+ strict_1.default.equal(finished, true);
35
+ });
36
+ }
37
+ (0, node_test_1.it)('rejects the lifecycle request if startup or the Git push fails', async () => {
38
+ await strict_1.default.rejects((0, runtime_1.checkpointBeforeFreeze)(undefined, 'suspend'), /has not started/);
39
+ await strict_1.default.rejects((0, runtime_1.checkpointBeforeFreeze)(Promise.reject(new Error('restore failed')), 'suspend'), /restore failed/);
40
+ const agent = { session: { checkpoint: async () => {
41
+ throw new Error('push failed');
42
+ } } };
43
+ await strict_1.default.rejects((0, runtime_1.checkpointBeforeFreeze)(Promise.resolve(agent), 'terminate'), /push failed/);
44
+ });
45
+ });
46
+ //# sourceMappingURL=lifecycle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.test.js","sourceRoot":"","sources":["../src/lifecycle.test.ts"],"names":[],"mappings":";;;;;AAAA,gEAAuC;AACvC,yCAAwC;AACxC,uCAAqE;AAErE,IAAA,oBAAQ,EAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;QAC5C,IAAA,cAAE,EAAC,oDAAoD,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE;YACxE,IAAI,OAAuC,CAAA;YAC3C,IAAI,MAAmB,CAAA;YACvB,IAAI,QAAQ,GAAG,KAAK,CAAA;YACpB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,EAAE;gBACpD,OAAO,GAAG,OAAO,CAAA;YACnB,CAAC,CAAC,CAAA;YACF,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACzC,MAAM,GAAG,OAAO,CAAA;YAClB,CAAC,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,IAAA,gCAAsB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC9D,QAAQ,GAAG,IAAI,CAAA;YACjB,CAAC,CAAC,CAAA;YACF,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;YACvB,gBAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YAC7B,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;wBACxD,gBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;wBAC1B,MAAM,IAAI,CAAA;oBACZ,CAAC,EAAE,EAA6B,CAAC,CAAA;YACjC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;YACvB,gBAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YAC7B,MAAM,EAAE,CAAA;YACR,MAAM,OAAO,CAAA;YACb,gBAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,IAAA,cAAE,EAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,gBAAM,CAAC,OAAO,CAAC,IAAA,gCAAsB,EAAC,SAAS,EAAE,SAAS,CAAC,EAAE,iBAAiB,CAAC,CAAA;QACrF,MAAM,gBAAM,CAAC,OAAO,CAAC,IAAA,gCAAsB,EAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAA;QACtH,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,IAAI,EAAE;oBAChD,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA;gBAChC,CAAC,EAAE,EAA6B,CAAA;QAChC,MAAM,gBAAM,CAAC,OAAO,CAAC,IAAA,gCAAsB,EAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,EAAE,aAAa,CAAC,CAAA;IAClG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}