@multiplayer-app/agent 0.0.7 → 0.1.1

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 (73) hide show
  1. package/dist/cli.js +15 -16
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts +43 -2
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +73 -11
  6. package/dist/config.js.map +1 -1
  7. package/dist/git-sync.d.ts +22 -0
  8. package/dist/git-sync.d.ts.map +1 -0
  9. package/dist/git-sync.js +107 -0
  10. package/dist/git-sync.js.map +1 -0
  11. package/dist/index.d.ts +6 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +26 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/lambda-microvm-entrypoint.js +74 -39
  16. package/dist/lambda-microvm-entrypoint.js.map +1 -1
  17. package/dist/link.d.ts +16 -0
  18. package/dist/link.d.ts.map +1 -0
  19. package/dist/link.js +76 -0
  20. package/dist/link.js.map +1 -0
  21. package/dist/loop.d.ts.map +1 -1
  22. package/dist/loop.js +8 -6
  23. package/dist/loop.js.map +1 -1
  24. package/dist/mcp/mcp-connection.js +1 -1
  25. package/dist/mcp/mcp-connection.js.map +1 -1
  26. package/dist/mcp/mcp-tools.js +1 -1
  27. package/dist/mcp/mcp-tools.js.map +1 -1
  28. package/dist/model.d.ts +4 -0
  29. package/dist/model.d.ts.map +1 -0
  30. package/dist/model.js +20 -0
  31. package/dist/model.js.map +1 -0
  32. package/dist/protocol.d.ts +174 -0
  33. package/dist/protocol.d.ts.map +1 -0
  34. package/dist/protocol.js +95 -0
  35. package/dist/protocol.js.map +1 -0
  36. package/dist/protocol.test.d.ts +2 -0
  37. package/dist/protocol.test.d.ts.map +1 -0
  38. package/dist/protocol.test.js +25 -0
  39. package/dist/protocol.test.js.map +1 -0
  40. package/dist/report.d.ts.map +1 -1
  41. package/dist/report.js +22 -44
  42. package/dist/report.js.map +1 -1
  43. package/dist/research/filingramp-client.d.ts +28 -0
  44. package/dist/research/filingramp-client.d.ts.map +1 -0
  45. package/dist/research/filingramp-client.js +124 -0
  46. package/dist/research/filingramp-client.js.map +1 -0
  47. package/dist/research/filingramp-tools.d.ts +10 -0
  48. package/dist/research/filingramp-tools.d.ts.map +1 -0
  49. package/dist/research/filingramp-tools.js +447 -0
  50. package/dist/research/filingramp-tools.js.map +1 -0
  51. package/dist/research/prompt.d.ts +13 -0
  52. package/dist/research/prompt.d.ts.map +1 -0
  53. package/dist/research/prompt.js +40 -0
  54. package/dist/research/prompt.js.map +1 -0
  55. package/dist/research/scope.d.ts +24 -0
  56. package/dist/research/scope.d.ts.map +1 -0
  57. package/dist/research/scope.js +103 -0
  58. package/dist/research/scope.js.map +1 -0
  59. package/dist/research/scope.test.d.ts +2 -0
  60. package/dist/research/scope.test.d.ts.map +1 -0
  61. package/dist/research/scope.test.js +45 -0
  62. package/dist/research/scope.test.js.map +1 -0
  63. package/dist/runtime.d.ts +10 -0
  64. package/dist/runtime.d.ts.map +1 -0
  65. package/dist/runtime.js +35 -0
  66. package/dist/runtime.js.map +1 -0
  67. package/dist/session.d.ts +38 -0
  68. package/dist/session.d.ts.map +1 -0
  69. package/dist/session.js +427 -0
  70. package/dist/session.js.map +1 -0
  71. package/dist/tools/fs-tools.js +1 -1
  72. package/dist/tools/fs-tools.js.map +1 -1
  73. package/package.json +8 -2
package/dist/cli.js CHANGED
@@ -2,27 +2,26 @@
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  // Generic entrypoint — reads its whole config from real process.env (already materialized by
5
- // the time this runs: QEMU's init script exports ENV_B64 before launching the entrypoint, so
6
- // this is the right entrypoint for that engine). Lambda MicroVM's own entrypoint
5
+ // the time this runs: QEMU's init script exports ENV_B64 before launching the entrypoint, and
6
+ // Docker/Fargate pass env directly). Lambda MicroVM's own entrypoint
7
7
  // (lambda-microvm-entrypoint.ts) has to materialize env from the /run lifecycle hook payload
8
- // first, then calls the same runAgentLoop — this file's job is intentionally just "trust
8
+ // first, then calls the same startAgent — this file's job is intentionally just "trust
9
9
  // process.env and go".
10
- const config_1 = require("./config");
11
- const loop_1 = require("./loop");
12
- const report_1 = require("./report");
10
+ const runtime_1 = require("./runtime");
13
11
  async function main() {
14
- const config = (0, config_1.loadConfigFromEnv)();
15
- const reporter = (0, report_1.createReporter)(config.socketUrl, config.socketToken, config.sessionId);
16
- try {
17
- await (0, loop_1.runAgentLoop)(config, reporter);
18
- }
19
- finally {
20
- await reporter.close();
12
+ const running = await (0, runtime_1.startAgent)();
13
+ if (!running.session) {
14
+ process.exit(0);
21
15
  }
16
+ const shutdown = async (signal) => {
17
+ console.log(`[agent] ${signal} received, checkpointing`);
18
+ await running.close();
19
+ process.exit(0);
20
+ };
21
+ process.on('SIGTERM', () => void shutdown('SIGTERM'));
22
+ process.on('SIGINT', () => void shutdown('SIGINT'));
22
23
  }
23
- main()
24
- .then(() => process.exit(0))
25
- .catch((error) => {
24
+ main().catch((error) => {
26
25
  console.error(error instanceof Error ? error.message : error);
27
26
  process.exit(1);
28
27
  });
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,6FAA6F;AAC7F,6FAA6F;AAC7F,iFAAiF;AACjF,6FAA6F;AAC7F,yFAAyF;AACzF,uBAAuB;AACvB,qCAA4C;AAC5C,iCAAqC;AACrC,qCAAyC;AAEzC,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAA,0BAAiB,GAAE,CAAA;IAClC,MAAM,QAAQ,GAAG,IAAA,uBAAc,EAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;IACvF,IAAI,CAAC;QACH,MAAM,IAAA,mBAAY,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACtC,CAAC;YAAS,CAAC;QACT,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC;AACH,CAAC;AAED,IAAI,EAAE;KACH,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC3B,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACf,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,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"}
package/dist/config.d.ts CHANGED
@@ -1,14 +1,55 @@
1
1
  import type { McpConnectionRecord } from './mcp/mcp-connection';
2
+ export type AgentMode = 'task' | 'session';
3
+ export type AgentProfile = 'coding' | 'research';
4
+ export interface FilingRampConfig {
5
+ baseUrl: string;
6
+ clientId: string;
7
+ clientSecret: string;
8
+ /** The account may also query industry (public) filings. */
9
+ industryData: boolean;
10
+ }
11
+ /** What the research session was created for; every FilingRamp tool call is narrowed to it. */
12
+ export interface ResearchScope {
13
+ dataSource?: 'account' | 'industry';
14
+ states?: string[];
15
+ /** Type-of-insurance codes or names ("17.0001", "Homeowners"). */
16
+ lines?: string[];
17
+ dateFrom?: string;
18
+ dateTo?: string;
19
+ }
20
+ export interface GitSyncConfig {
21
+ serverUrl: string;
22
+ repository: string;
23
+ /** Where the repository is checked out — the session workspace itself. */
24
+ dir: string;
25
+ branch: string;
26
+ token: string;
27
+ }
28
+ export interface ModelProviderConfig {
29
+ openrouterApiKey?: string;
30
+ anthropicApiKey?: string;
31
+ }
2
32
  export interface AgentRuntimeConfig {
3
33
  sessionId: string;
4
- task: string;
34
+ mode: AgentMode;
35
+ profile: AgentProfile;
36
+ /** One-shot task (mode 'task' only). */
37
+ task?: string;
5
38
  model: string;
39
+ /** Cheaper model for bulk extraction; defaults to `model`. */
40
+ extractionModel: string;
41
+ /** Total tokens the session may spend before asking the user whether to continue. */
42
+ tokenBudget?: number;
6
43
  workspaceDir: string;
7
44
  mcpConnections: McpConnectionRecord[];
8
45
  /** Gateway's agent-socket-server endpoint (ws(s)://.../agent-sessions/ws), not the api directly. */
9
46
  socketUrl?: string;
10
47
  socketToken?: string;
48
+ provider: ModelProviderConfig;
49
+ filingRamp?: FilingRampConfig;
50
+ researchScope?: ResearchScope;
51
+ git?: GitSyncConfig;
11
52
  }
12
- /** Reads the full run config from process.env — the guest's own contract, documented on VmCreateRequest.env. */
53
+ /** Reads the full run config from process.env — the guest's own contract, see AGENT_ENV in protocol.ts. */
13
54
  export declare function loadConfigFromEnv(env?: NodeJS.ProcessEnv): AgentRuntimeConfig;
14
55
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE/D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,mBAAmB,EAAE,CAAA;IACrC,oGAAoG;IACpG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAgBD,gHAAgH;AAChH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,kBAAkB,CAe1F"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAG/D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;AAC1C,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,CAAA;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,4DAA4D;IAC5D,YAAY,EAAE,OAAO,CAAA;CACtB;AAED,+FAA+F;AAC/F,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;IACnC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE,YAAY,CAAA;IACrB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,8DAA8D;IAC9D,eAAe,EAAE,MAAM,CAAA;IACvB,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,mBAAmB,EAAE,CAAA;IACrC,oGAAoG;IACpG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,mBAAmB,CAAA;IAC7B,UAAU,CAAC,EAAE,gBAAgB,CAAA;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,GAAG,CAAC,EAAE,aAAa,CAAA;CACpB;AA4DD,2GAA2G;AAC3G,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,kBAAkB,CAgC1F"}
package/dist/config.js CHANGED
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.loadConfigFromEnv = loadConfigFromEnv;
4
- const DEFAULT_MODEL = 'claude-sonnet-4-5';
4
+ const protocol_1 = require("./protocol");
5
+ const DEFAULT_MODEL = 'anthropic/claude-sonnet-5.5';
5
6
  const DEFAULT_WORKSPACE_DIR = '/workspace';
6
7
  function decodeMcpConnections(raw) {
7
8
  if (!raw)
@@ -15,22 +16,83 @@ function decodeMcpConnections(raw) {
15
16
  throw new Error(`MCP_SERVERS_JSON is not valid base64-encoded JSON: ${error.message}`);
16
17
  }
17
18
  }
18
- /** Reads the full run config from process.env — the guest's own contract, documented on VmCreateRequest.env. */
19
+ function parseScope(raw) {
20
+ if (!raw)
21
+ return undefined;
22
+ try {
23
+ const parsed = JSON.parse(raw);
24
+ return parsed && typeof parsed === 'object' ? parsed : undefined;
25
+ }
26
+ catch (error) {
27
+ throw new Error(`RESEARCH_SCOPE_JSON is not valid JSON: ${error.message}`);
28
+ }
29
+ }
30
+ function parsePositiveInt(raw) {
31
+ if (!raw)
32
+ return undefined;
33
+ const value = Number.parseInt(raw, 10);
34
+ return Number.isFinite(value) && value > 0 ? value : undefined;
35
+ }
36
+ function filingRampFromEnv(env) {
37
+ const baseUrl = env[protocol_1.AGENT_ENV.FILINGRAMP_API_BASE_URL];
38
+ const clientId = env[protocol_1.AGENT_ENV.FILINGRAMP_CLIENT_ID];
39
+ const clientSecret = env[protocol_1.AGENT_ENV.FILINGRAMP_CLIENT_SECRET];
40
+ if (!baseUrl || !clientId || !clientSecret)
41
+ return undefined;
42
+ return {
43
+ baseUrl: baseUrl.replace(/\/+$/, ''),
44
+ clientId,
45
+ clientSecret,
46
+ industryData: env[protocol_1.AGENT_ENV.FILINGRAMP_INDUSTRY_DATA] === 'true',
47
+ };
48
+ }
49
+ function gitFromEnv(env, sessionId, workspaceDir) {
50
+ const serverUrl = env[protocol_1.AGENT_ENV.GIT_SERVER_URL];
51
+ const repository = env[protocol_1.AGENT_ENV.GIT_REPOSITORY];
52
+ const token = env[protocol_1.AGENT_ENV.GIT_ACCESS_TOKEN];
53
+ if (!repository)
54
+ return undefined;
55
+ if (!serverUrl || !token)
56
+ throw new Error('Git settings are incomplete (GIT_SERVER_URL / GIT_ACCESS_TOKEN)');
57
+ return {
58
+ serverUrl: serverUrl.replace(/\/+$/, ''),
59
+ repository,
60
+ dir: env[protocol_1.AGENT_ENV.GIT_REPOSITORY_DIR] || workspaceDir,
61
+ branch: env[protocol_1.AGENT_ENV.GIT_BRANCH] || `session/${sessionId}`,
62
+ token,
63
+ };
64
+ }
65
+ /** Reads the full run config from process.env — the guest's own contract, see AGENT_ENV in protocol.ts. */
19
66
  function loadConfigFromEnv(env = process.env) {
20
- const sessionId = env.SESSION_ID;
21
- const task = env.AGENT_TASK;
67
+ const sessionId = env[protocol_1.AGENT_ENV.SESSION_ID];
22
68
  if (!sessionId)
23
69
  throw new Error('SESSION_ID is required');
24
- if (!task)
25
- throw new Error('AGENT_TASK is required');
70
+ const mode = env[protocol_1.AGENT_ENV.AGENT_MODE] === 'session' ? 'session' : 'task';
71
+ const profile = env[protocol_1.AGENT_ENV.AGENT_PROFILE] === 'research' ? 'research' : 'coding';
72
+ const task = env[protocol_1.AGENT_ENV.AGENT_TASK];
73
+ if (mode === 'task' && !task)
74
+ throw new Error('AGENT_TASK is required in task mode');
75
+ const workspaceDir = env[protocol_1.AGENT_ENV.AGENT_WORKSPACE_DIR] || DEFAULT_WORKSPACE_DIR;
76
+ const model = env[protocol_1.AGENT_ENV.AGENT_MODEL] || DEFAULT_MODEL;
26
77
  return {
27
78
  sessionId,
79
+ mode,
80
+ profile,
28
81
  task,
29
- model: env.AGENT_MODEL || DEFAULT_MODEL,
30
- workspaceDir: env.AGENT_WORKSPACE_DIR || DEFAULT_WORKSPACE_DIR,
31
- mcpConnections: decodeMcpConnections(env.MCP_SERVERS_JSON),
32
- socketUrl: env.AGENT_SOCKET_URL,
33
- socketToken: env.AGENT_SOCKET_TOKEN,
82
+ model,
83
+ extractionModel: env[protocol_1.AGENT_ENV.AGENT_EXTRACTION_MODEL] || model,
84
+ tokenBudget: parsePositiveInt(env[protocol_1.AGENT_ENV.AGENT_TOKEN_BUDGET]),
85
+ workspaceDir,
86
+ mcpConnections: decodeMcpConnections(env[protocol_1.AGENT_ENV.MCP_SERVERS_JSON]),
87
+ socketUrl: env[protocol_1.AGENT_ENV.AGENT_SOCKET_URL],
88
+ socketToken: env[protocol_1.AGENT_ENV.AGENT_SOCKET_TOKEN],
89
+ provider: {
90
+ openrouterApiKey: env[protocol_1.AGENT_ENV.OPENROUTER_API_KEY],
91
+ anthropicApiKey: env[protocol_1.AGENT_ENV.ANTHROPIC_API_KEY],
92
+ },
93
+ filingRamp: filingRampFromEnv(env),
94
+ researchScope: parseScope(env[protocol_1.AGENT_ENV.RESEARCH_SCOPE_JSON]),
95
+ git: gitFromEnv(env, sessionId, workspaceDir),
34
96
  };
35
97
  }
36
98
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;AA4BA,8CAeC;AA9BD,MAAM,aAAa,GAAG,mBAAmB,CAAA;AACzC,MAAM,qBAAqB,GAAG,YAAY,CAAA;AAE1C,SAAS,oBAAoB,CAAC,GAAuB;IACnD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAgC,CAAC,CAAC,CAAC,EAAE,CAAA;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sDAAuD,KAAe,CAAC,OAAO,EAAE,CAAC,CAAA;IACnG,CAAC;AACH,CAAC;AAED,gHAAgH;AAChH,SAAgB,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACpE,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAA;IAChC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAA;IAC3B,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IACzD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAEpD,OAAO;QACL,SAAS;QACT,IAAI;QACJ,KAAK,EAAE,GAAG,CAAC,WAAW,IAAI,aAAa;QACvC,YAAY,EAAE,GAAG,CAAC,mBAAmB,IAAI,qBAAqB;QAC9D,cAAc,EAAE,oBAAoB,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC1D,SAAS,EAAE,GAAG,CAAC,gBAAgB;QAC/B,WAAW,EAAE,GAAG,CAAC,kBAAkB;KACpC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { GitSyncConfig } from './config';
2
+ export declare const WORKSPACE_GITIGNORE: string;
3
+ export declare class GitSync {
4
+ private readonly config;
5
+ private readonly remote;
6
+ private readonly env;
7
+ private busy;
8
+ constructor(config: GitSyncConfig);
9
+ get dir(): string;
10
+ private git;
11
+ /** Serializes git operations: a periodic checkpoint must never race a suspend checkpoint. */
12
+ private serialize;
13
+ /**
14
+ * Clone the session branch into the workspace, or pull it when a checkout already exists.
15
+ * A brand-new session has no branch yet: start an empty repository on it so the first
16
+ * checkpoint can push. Returns true when previous work was restored.
17
+ */
18
+ restore(): Promise<boolean>;
19
+ /** Commit everything and push the branch. Resolves with the commit sha, or undefined when nothing changed. */
20
+ commit(message: string): Promise<string | undefined>;
21
+ }
22
+ //# sourceMappingURL=git-sync.d.ts.map
@@ -0,0 +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;AAI7C,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,OAAO,CAAC,GAAG;IAIX,6FAA6F;IAC7F,OAAO,CAAC,SAAS;IAMjB;;;;OAIG;IACH,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IA0B3B,8GAA8G;IAC9G,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAcrD"}
@@ -0,0 +1,107 @@
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
+ exports.GitSync = exports.WORKSPACE_GITIGNORE = void 0;
7
+ // Durability for a session VM whose disk can vanish (Lambda terminates a long-suspended
8
+ // MicroVM): the workspace is a checkout of branch `session/<id>` on the platform's git
9
+ // server. restore() runs at boot, commit() at every checkpoint. Bulk downloads stay out of
10
+ // git (see WORKSPACE_GITIGNORE) — the extracted text and the research outputs are what a
11
+ // restored VM needs; attachments can be fetched again.
12
+ const child_process_1 = require("child_process");
13
+ const fs_1 = require("fs");
14
+ const path_1 = __importDefault(require("path"));
15
+ const util_1 = require("util");
16
+ const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
17
+ exports.WORKSPACE_GITIGNORE = ['data/attachments/', 'node_modules/', '.venv/', '*.sqlite', '*.sqlite-journal', ''].join('\n');
18
+ async function pathExists(target) {
19
+ try {
20
+ await fs_1.promises.access(target);
21
+ return true;
22
+ }
23
+ catch (_a) {
24
+ return false;
25
+ }
26
+ }
27
+ class GitSync {
28
+ constructor(config) {
29
+ this.config = config;
30
+ this.busy = Promise.resolve();
31
+ this.remote = `${config.serverUrl}/git/${config.repository}.git`;
32
+ // The token travels as a per-process http.extraheader, never on the remote URL or in
33
+ // .git/config, so a `git remote -v` inside the workspace cannot leak it.
34
+ this.env = {
35
+ ...process.env,
36
+ GIT_TERMINAL_PROMPT: '0',
37
+ GIT_CONFIG_COUNT: '3',
38
+ GIT_CONFIG_KEY_0: 'http.extraheader',
39
+ GIT_CONFIG_VALUE_0: `Authorization: Bearer ${config.token}`,
40
+ GIT_CONFIG_KEY_1: 'user.name',
41
+ GIT_CONFIG_VALUE_1: 'session-agent',
42
+ GIT_CONFIG_KEY_2: 'user.email',
43
+ GIT_CONFIG_VALUE_2: 'agent@builder.local',
44
+ };
45
+ }
46
+ get dir() {
47
+ return this.config.dir;
48
+ }
49
+ git(args, cwd = this.config.dir) {
50
+ return execFileAsync('git', args, { cwd, env: this.env, maxBuffer: 8 * 1024 * 1024 });
51
+ }
52
+ /** Serializes git operations: a periodic checkpoint must never race a suspend checkpoint. */
53
+ serialize(work) {
54
+ const next = this.busy.then(work, work);
55
+ this.busy = next.catch(() => undefined);
56
+ return next;
57
+ }
58
+ /**
59
+ * Clone the session branch into the workspace, or pull it when a checkout already exists.
60
+ * A brand-new session has no branch yet: start an empty repository on it so the first
61
+ * checkpoint can push. Returns true when previous work was restored.
62
+ */
63
+ restore() {
64
+ return this.serialize(async () => {
65
+ const { dir, branch } = this.config;
66
+ await fs_1.promises.mkdir(dir, { recursive: true });
67
+ if (await pathExists(path_1.default.join(dir, '.git'))) {
68
+ try {
69
+ await this.git(['fetch', 'origin', branch]);
70
+ await this.git(['reset', '--hard', `origin/${branch}`]);
71
+ return true;
72
+ }
73
+ catch (error) {
74
+ console.warn('[git] pull failed, keeping the local checkout:', error.message);
75
+ return false;
76
+ }
77
+ }
78
+ const remoteBranches = (await this.git(['ls-remote', '--heads', this.remote, branch], process.cwd())).stdout.trim();
79
+ if (remoteBranches) {
80
+ await this.git(['clone', '--branch', branch, '--single-branch', this.remote, dir], process.cwd());
81
+ return true;
82
+ }
83
+ await this.git(['init', '--initial-branch', branch]);
84
+ await this.git(['remote', 'add', 'origin', this.remote]);
85
+ await fs_1.promises.writeFile(path_1.default.join(dir, '.gitignore'), exports.WORKSPACE_GITIGNORE);
86
+ return false;
87
+ });
88
+ }
89
+ /** Commit everything and push the branch. Resolves with the commit sha, or undefined when nothing changed. */
90
+ commit(message) {
91
+ return this.serialize(async () => {
92
+ if (!(await pathExists(path_1.default.join(this.config.dir, '.gitignore')))) {
93
+ await fs_1.promises.writeFile(path_1.default.join(this.config.dir, '.gitignore'), exports.WORKSPACE_GITIGNORE);
94
+ }
95
+ await this.git(['add', '-A']);
96
+ const status = (await this.git(['status', '--porcelain'])).stdout.trim();
97
+ if (!status)
98
+ return undefined;
99
+ await this.git(['commit', '-q', '-m', message]);
100
+ const sha = (await this.git(['rev-parse', 'HEAD'])).stdout.trim();
101
+ await this.git(['push', '-u', 'origin', `HEAD:${this.config.branch}`]);
102
+ return sha;
103
+ });
104
+ }
105
+ }
106
+ exports.GitSync = GitSync;
107
+ //# sourceMappingURL=git-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-sync.js","sourceRoot":"","sources":["../src/git-sync.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,10 @@
1
- export { loadConfigFromEnv, type AgentRuntimeConfig } from './config';
1
+ export { loadConfigFromEnv, type AgentRuntimeConfig, type AgentMode, type AgentProfile, type ResearchScope } from './config';
2
2
  export { runAgentLoop } from './loop';
3
3
  export { createReporter, type AgentEvent, type Reporter } from './report';
4
+ export { createSessionLink, type SessionLink } from './link';
5
+ export { SessionAgent, runSessionAgent, limitConversation } from './session';
6
+ export { startAgent, type RunningAgent } from './runtime';
7
+ export { GitSync } from './git-sync';
8
+ export * from './protocol';
4
9
  export type { McpConnectionRecord, McpConnectionSummary, McpOAuthTokens, McpToolSummary } from './mcp/mcp-connection';
5
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,UAAU,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AACzE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AAC5H,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,cAAc,YAAY,CAAA;AAC1B,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}
package/dist/index.js CHANGED
@@ -1,10 +1,35 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createReporter = exports.runAgentLoop = exports.loadConfigFromEnv = void 0;
17
+ exports.GitSync = exports.startAgent = exports.limitConversation = exports.runSessionAgent = exports.SessionAgent = exports.createSessionLink = exports.createReporter = exports.runAgentLoop = exports.loadConfigFromEnv = void 0;
4
18
  var config_1 = require("./config");
5
19
  Object.defineProperty(exports, "loadConfigFromEnv", { enumerable: true, get: function () { return config_1.loadConfigFromEnv; } });
6
20
  var loop_1 = require("./loop");
7
21
  Object.defineProperty(exports, "runAgentLoop", { enumerable: true, get: function () { return loop_1.runAgentLoop; } });
8
22
  var report_1 = require("./report");
9
23
  Object.defineProperty(exports, "createReporter", { enumerable: true, get: function () { return report_1.createReporter; } });
24
+ var link_1 = require("./link");
25
+ Object.defineProperty(exports, "createSessionLink", { enumerable: true, get: function () { return link_1.createSessionLink; } });
26
+ var session_1 = require("./session");
27
+ Object.defineProperty(exports, "SessionAgent", { enumerable: true, get: function () { return session_1.SessionAgent; } });
28
+ Object.defineProperty(exports, "runSessionAgent", { enumerable: true, get: function () { return session_1.runSessionAgent; } });
29
+ Object.defineProperty(exports, "limitConversation", { enumerable: true, get: function () { return session_1.limitConversation; } });
30
+ var runtime_1 = require("./runtime");
31
+ Object.defineProperty(exports, "startAgent", { enumerable: true, get: function () { return runtime_1.startAgent; } });
32
+ var git_sync_1 = require("./git-sync");
33
+ Object.defineProperty(exports, "GitSync", { enumerable: true, get: function () { return git_sync_1.GitSync; } });
34
+ __exportStar(require("./protocol"), exports);
10
35
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAqE;AAA5D,2GAAA,iBAAiB,OAAA;AAC1B,+BAAqC;AAA5B,oGAAA,YAAY,OAAA;AACrB,mCAAyE;AAAhE,wGAAA,cAAc,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mCAA4H;AAAnH,2GAAA,iBAAiB,OAAA;AAC1B,+BAAqC;AAA5B,oGAAA,YAAY,OAAA;AACrB,mCAAyE;AAAhE,wGAAA,cAAc,OAAA;AACvB,+BAA4D;AAAnD,yGAAA,iBAAiB,OAAA;AAC1B,qCAA4E;AAAnE,uGAAA,YAAY,OAAA;AAAE,0GAAA,eAAe,OAAA;AAAE,4GAAA,iBAAiB,OAAA;AACzD,qCAAyD;AAAhD,qGAAA,UAAU,OAAA;AACnB,uCAAoC;AAA3B,mGAAA,OAAO,OAAA;AAChB,6CAA0B"}
@@ -7,22 +7,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  // Lambda MicroVM-specific bootstrap. AWS's platform calls the lifecycle hooks
8
8
  // (/aws/lambda-microvms/runtime/v1/{run,resume,suspend,terminate}) on port 8080 and expects a
9
9
  // response before it considers the instance up (createMicrovmImages registers every image with
10
- // hooks: { run/resume/suspend/terminate: 'ENABLED' } — libs/sandbox/src/microvm-images.ts:58-62
11
- // — this isn't optional). Per-run config (env vars) arrives as the /run hook's runHookPayload,
12
- // not as real process env vars — mirrors the existing plain node/python guest agent
13
- // (microvm-guest-agents.ts's NODE_APP) exactly for that part.
10
+ // hooks: { run/resume/suspend/terminate: 'ENABLED' } — libs/sandbox/src/microvm-images.ts —
11
+ // this isn't optional). Per-run config (env vars) arrives as the /run hook's runHookPayload,
12
+ // not as real process env vars.
14
13
  //
15
- // Once /run is handled, this closes the hook server and runs the agent loop in-process — if
16
- // the task starts a dev server, it binds the now-free $PORT (8080) itself. Matches the existing
17
- // release-deployment guest agent's own tradeoff: once port 8080 is handed over, later
18
- // suspend/resume/terminate hooks have nowhere to land until proper lifecycle support lands
19
- // (tracked alongside EFS persistence — see the plan's deferred section).
14
+ // The hook server stays up for the whole life of the VM: `suspend` and `terminate` checkpoint
15
+ // the session (conversation + workspace to the git server), `resume` re-announces the agent.
16
+ // Research VMs never need port 8080 for an app, so nothing competes for it. Engines without a
17
+ // hook caller (Docker, Fargate) set SESSION_ID in the real env at boot, which starts the agent
18
+ // directly.
20
19
  const http_1 = __importDefault(require("http"));
21
- const config_1 = require("./config");
22
- const loop_1 = require("./loop");
23
- const report_1 = require("./report");
20
+ const runtime_1 = require("./runtime");
24
21
  const HOOK_PREFIX = '/aws/lambda-microvms/runtime/v1/';
25
22
  const PORT = 8080;
23
+ let running;
24
+ let starting;
26
25
  function materializeEnv(runHookPayload) {
27
26
  var _a;
28
27
  if (!runHookPayload)
@@ -33,56 +32,92 @@ function materializeEnv(runHookPayload) {
33
32
  if (typeof value === 'string')
34
33
  process.env[key] = value;
35
34
  }
35
+ if (!process.env.SESSION_ID && typeof session.sessionId === 'string')
36
+ process.env.SESSION_ID = session.sessionId;
36
37
  }
37
38
  catch (_b) {
38
39
  // payload is optional / best-effort, matching the plain node/python guest agent
39
40
  }
40
41
  }
41
- async function runTask() {
42
- let reporter;
43
- try {
44
- const config = (0, config_1.loadConfigFromEnv)();
45
- reporter = (0, report_1.createReporter)(config.socketUrl, config.socketToken, config.sessionId);
46
- await (0, loop_1.runAgentLoop)(config, reporter);
47
- }
48
- catch (error) {
49
- console.error('agent run failed:', error);
42
+ function start() {
43
+ if (!starting) {
44
+ starting = (0, runtime_1.startAgent)()
45
+ .then((agent) => {
46
+ running = agent;
47
+ })
48
+ .catch((error) => {
49
+ console.error('agent run failed:', error instanceof Error ? error.message : error);
50
+ });
50
51
  }
51
- finally {
52
- await (reporter === null || reporter === void 0 ? void 0 : reporter.close());
52
+ return starting;
53
+ }
54
+ async function onHook(hook, body) {
55
+ var _a;
56
+ switch (hook) {
57
+ case 'run': {
58
+ try {
59
+ const parsed = JSON.parse(body);
60
+ materializeEnv(parsed.runHookPayload);
61
+ }
62
+ catch (_b) {
63
+ /* payload is optional */
64
+ }
65
+ void start();
66
+ return;
67
+ }
68
+ case 'suspend':
69
+ case 'terminate':
70
+ await ((_a = running === null || running === void 0 ? void 0 : running.session) === null || _a === void 0 ? void 0 : _a.checkpoint(hook));
71
+ return;
72
+ case 'resume':
73
+ // Memory and disk survived; the socket reconnects on its own. Nothing to restore.
74
+ return;
75
+ default:
76
+ return;
53
77
  }
54
78
  }
55
79
  const server = http_1.default.createServer((req, res) => {
56
- var _a;
80
+ var _a, _b;
57
81
  if (((_a = req.url) === null || _a === void 0 ? void 0 : _a.startsWith(HOOK_PREFIX)) && req.method === 'POST') {
58
82
  const hook = req.url.slice(HOOK_PREFIX.length);
59
83
  const chunks = [];
60
84
  req.on('data', (chunk) => chunks.push(chunk));
61
85
  req.on('end', () => {
62
86
  const body = Buffer.concat(chunks).toString();
63
- // Runtime env may contain MCP tokens or a callback bearer token; never log the body.
87
+ // Runtime env may contain API client secrets or a socket token; never log the body.
64
88
  console.log(`lifecycle hook: ${hook}`);
65
- res.writeHead(200, { 'Content-Type': 'application/json' });
66
- res.end('{}');
67
- if (hook === 'run') {
68
- try {
69
- const parsed = JSON.parse(body);
70
- materializeEnv(parsed.runHookPayload);
71
- }
72
- catch (_a) {
73
- /* payload is optional */
74
- }
75
- server.close(() => {
76
- void runTask();
77
- });
89
+ // suspend/terminate must finish the checkpoint before AWS freezes or kills the VM, so
90
+ // the response waits for it; `run` answers right away and starts the agent in the background.
91
+ const work = onHook(hook, body);
92
+ const reply = () => {
93
+ res.writeHead(200, { 'Content-Type': 'application/json' });
94
+ res.end('{}');
95
+ };
96
+ if (hook === 'suspend' || hook === 'terminate') {
97
+ work.then(reply, reply);
98
+ }
99
+ else {
100
+ reply();
78
101
  }
79
102
  });
80
103
  return;
81
104
  }
82
105
  res.writeHead(200, { 'Content-Type': 'application/json' });
83
- res.end(JSON.stringify({ status: 'ok', path: req.url }));
106
+ res.end(JSON.stringify({ status: 'ok', path: req.url, session: (_b = running === null || running === void 0 ? void 0 : running.config.sessionId) !== null && _b !== void 0 ? _b : null }));
84
107
  });
85
108
  server.listen(PORT, () => {
86
109
  console.log(`agent lifecycle hook server listening on ${PORT}`);
110
+ // Docker / Fargate: no lifecycle hook caller, so a SESSION_ID already in the env drives startup.
111
+ if (process.env.SESSION_ID)
112
+ setImmediate(() => void start());
87
113
  });
114
+ for (const signal of ['SIGTERM', 'SIGINT']) {
115
+ process.on(signal, () => {
116
+ void (async () => {
117
+ await (running === null || running === void 0 ? void 0 : running.close());
118
+ server.close();
119
+ process.exit(0);
120
+ })();
121
+ });
122
+ }
88
123
  //# 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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"}