@mindfoldhq/runtime-manager 0.1.1 → 0.1.2

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.
@@ -1081,7 +1081,7 @@ var RUNTIME_PROVIDER_PROFILE_BACKENDS = [
1081
1081
  ];
1082
1082
  var RuntimeProviderProfileBackend = z4.enum(RUNTIME_PROVIDER_PROFILE_BACKENDS);
1083
1083
  var RUNTIME_RUNNER_COMMAND_DEFAULT = "vine-runtime-runner";
1084
- var LOCAL_DOCKER_RUNNER_IMAGE_DEFAULT = "vine-runtime-runner:dev";
1084
+ var LOCAL_DOCKER_RUNNER_IMAGE_DEFAULT = "taosuuuuuuu/vine-runtime-runner:dev";
1085
1085
  var RUNLOOP_API_BASE_URL_DEFAULT = "https://api.runloop.ai/v1";
1086
1086
  var RUNLOOP_BLUEPRINT_NAME_DEFAULT = RUNTIME_RUNNER_COMMAND_DEFAULT;
1087
1087
  var E2B_TEMPLATE_DEFAULT = "yblue0216/vine-runtime-runner:dev";
@@ -1189,7 +1189,7 @@ var REMOTE_SANDBOX_PROVIDER_DESCRIPTORS = {
1189
1189
  profileName: "E2B remote sandbox",
1190
1190
  managerNamePrefix: "e2b",
1191
1191
  implemented: true,
1192
- onboardingAvailable: false,
1192
+ onboardingAvailable: true,
1193
1193
  envApiKeyRef: RuntimeProviderEnvSecretRef.parse("env:E2B_API_KEY"),
1194
1194
  defaultApiKeySecretRef: RuntimeProviderSecretRef.parse(`${ORG_SECRET_REF_PREFIX}e2b-api-key`),
1195
1195
  secretRefKey: "e2b_api_key_ref",
@@ -1319,6 +1319,7 @@ var ErrorCode = z5.enum([
1319
1319
  "PROJECT_REPOSITORY_NOT_FOUND",
1320
1320
  "TASK_NOT_FOUND",
1321
1321
  "TASK_THREAD_NOT_FOUND",
1322
+ "TASK_ARTIFACT_NOT_FOUND",
1322
1323
  "AGENT_PROFILE_NOT_FOUND",
1323
1324
  "SKILL_NOT_FOUND",
1324
1325
  "AGENT_TURN_NOT_FOUND",
@@ -1408,6 +1409,7 @@ var ERROR_HTTP_STATUS = {
1408
1409
  PROJECT_REPOSITORY_NOT_FOUND: 404,
1409
1410
  TASK_NOT_FOUND: 404,
1410
1411
  TASK_THREAD_NOT_FOUND: 404,
1412
+ TASK_ARTIFACT_NOT_FOUND: 404,
1411
1413
  AGENT_PROFILE_NOT_FOUND: 404,
1412
1414
  SKILL_NOT_FOUND: 404,
1413
1415
  AGENT_TURN_NOT_FOUND: 404,
@@ -1740,13 +1742,20 @@ var TaskResearchFileDto = z9.object({
1740
1742
  size_bytes: z9.number().int().nonnegative(),
1741
1743
  mtime: z9.string().nullable()
1742
1744
  });
1745
+ var ArtifactRootKind = z9.enum(["repo", "task"]);
1746
+ var SnapshotContentShape = {
1747
+ content: z9.string().optional(),
1748
+ truncated: z9.boolean().optional()
1749
+ };
1750
+ var TaskSpecRefSnapshotItem = TaskSpecRefDto.extend(SnapshotContentShape);
1751
+ var TaskResearchFileSnapshotItem = TaskResearchFileDto.extend(SnapshotContentShape);
1743
1752
  var TaskRefsSnapshotPayload = z9.object({
1744
1753
  session_id: Id,
1745
1754
  task_id: Id,
1746
1755
  trellis_id: z9.string().min(1),
1747
- spec_refs: z9.array(TaskSpecRefDto).default([]),
1748
- check_refs: z9.array(TaskSpecRefDto).default([]),
1749
- research_files: z9.array(TaskResearchFileDto).default([])
1756
+ spec_refs: z9.array(TaskSpecRefSnapshotItem).default([]),
1757
+ check_refs: z9.array(TaskSpecRefSnapshotItem).default([]),
1758
+ research_files: z9.array(TaskResearchFileSnapshotItem).default([])
1750
1759
  });
1751
1760
  var TaskDto = z9.object({
1752
1761
  id: Id,
@@ -1845,7 +1854,8 @@ var TaskImportFromTrellisInput = z9.object({
1845
1854
  });
1846
1855
  var TaskReadArtifactInput = z9.object({
1847
1856
  task_id: Id,
1848
- relative_path: z9.string().min(1).max(512)
1857
+ root_kind: ArtifactRootKind,
1858
+ path: z9.string().min(1).max(512)
1849
1859
  });
1850
1860
  var TaskReadArtifactDto = z9.object({
1851
1861
  content: z9.string(),
@@ -5733,7 +5743,7 @@ var RUNTIME_PROVIDER_UI_DESCRIPTORS = {
5733
5743
  description: "Run the manager directly on this host.",
5734
5744
  registrationAvailable: true,
5735
5745
  channelConfigAvailable: true,
5736
- onboardingAvailable: true
5746
+ onboardingAvailable: false
5737
5747
  },
5738
5748
  local_docker: {
5739
5749
  kind: "local_docker",
@@ -9441,7 +9451,7 @@ class StateEmitter {
9441
9451
  last_error: lastError
9442
9452
  });
9443
9453
  }
9444
- emitAgentSessionState(session, agentSession, status) {
9454
+ emitAgentSessionState(session, agentSession, status, metadata) {
9445
9455
  this.m.serverClient.emitAgentSessionState({
9446
9456
  agent_session_id: agentSession.agentSessionId,
9447
9457
  session_id: session.sessionId,
@@ -9454,10 +9464,11 @@ class StateEmitter {
9454
9464
  status,
9455
9465
  external_session_id: agentSession.externalSessionId,
9456
9466
  cwd_path: agentSession.cwdPath,
9457
- last_error: null
9467
+ last_error: null,
9468
+ ...metadata ? { metadata } : {}
9458
9469
  });
9459
9470
  }
9460
- emitAgentSessionStateFailed(session, agentSession, lastError) {
9471
+ emitAgentSessionStateFailed(session, agentSession, lastError, metadata) {
9461
9472
  this.m.serverClient.emitAgentSessionState({
9462
9473
  agent_session_id: agentSession.agentSessionId,
9463
9474
  session_id: session.sessionId,
@@ -9470,7 +9481,8 @@ class StateEmitter {
9470
9481
  status: "failed",
9471
9482
  external_session_id: agentSession.externalSessionId,
9472
9483
  cwd_path: agentSession.cwdPath,
9473
- last_error: lastError
9484
+ last_error: lastError,
9485
+ ...metadata ? { metadata } : {}
9474
9486
  });
9475
9487
  }
9476
9488
  emitReleasedState(session) {
@@ -9497,7 +9509,8 @@ class StateEmitter {
9497
9509
  this.m.emitRunnerState(session, session.ready ? "ready" : "starting");
9498
9510
  }
9499
9511
  for (const agentSession of session.agentSessions.values()) {
9500
- this.m.emitAgentSessionState(session, agentSession, "idle");
9512
+ const terminalMetadata = agentSession.lastTerminalTurnId ? { terminal_agent_turn_id: agentSession.lastTerminalTurnId } : undefined;
9513
+ this.m.emitAgentSessionState(session, agentSession, "idle", terminalMetadata);
9501
9514
  }
9502
9515
  }
9503
9516
  }
@@ -10546,12 +10559,14 @@ class TurnRouter {
10546
10559
  if (externalSessionId) {
10547
10560
  agentSession.externalSessionId = externalSessionId;
10548
10561
  }
10562
+ agentSession.lastTerminalTurnId = turnId;
10563
+ const terminalMetadata = { terminal_agent_turn_id: turnId };
10549
10564
  if (status === "failed") {
10550
- this.m.emitAgentSessionStateFailed(session, agentSession, failureDetail ?? "turn failed without detail");
10565
+ this.m.emitAgentSessionStateFailed(session, agentSession, failureDetail ?? "turn failed without detail", terminalMetadata);
10551
10566
  } else if (status === "cancelled") {
10552
- this.m.emitAgentSessionState(session, agentSession, "cancelled");
10567
+ this.m.emitAgentSessionState(session, agentSession, "cancelled", terminalMetadata);
10553
10568
  } else {
10554
- this.m.emitAgentSessionState(session, agentSession, "idle");
10569
+ this.m.emitAgentSessionState(session, agentSession, "idle", terminalMetadata);
10555
10570
  }
10556
10571
  } else {
10557
10572
  log14.warn({ session_id: sessionId, turn_id: turnId }, "turn.finished without recorded agent_session — agent_session.state not updated");
@@ -10567,11 +10582,13 @@ import { randomUUID as randomUUID6 } from "node:crypto";
10567
10582
  import { hostname } from "node:os";
10568
10583
  import WebSocket2 from "ws";
10569
10584
  var log15 = childLogger2({ subsystem: "server-link" });
10570
- var MANAGER_VERSION = "0.1.0-slice4";
10585
+ var MANAGER_VERSION = "0.1.0-slice6-ref-preview";
10571
10586
  var HEARTBEAT_INTERVAL_MS = 30000;
10572
10587
  var RECONNECT_BASE_MS = 1000;
10573
10588
  var RECONNECT_MAX_MS = 30000;
10574
10589
  var TASK_REQUEST_TIMEOUT_MS = 30000;
10590
+ var SUPERSEDED_CLOSE_CODE = 4000;
10591
+ var SUPERSEDED_CLOSE_REASON = "runtime manager connection superseded";
10575
10592
 
10576
10593
  class ServerClient {
10577
10594
  opts;
@@ -10650,20 +10667,29 @@ class ServerClient {
10650
10667
  this.onMessage(rawDataToText2(data));
10651
10668
  });
10652
10669
  ws.on("close", (code, reason) => {
10653
- log15.warn({ code, reason: reason.toString() }, "server ws closed");
10654
- this.ws = null;
10655
- this.organizationId = null;
10656
- this.managerId = null;
10657
- this.serverSupportsRebuiltResumeRetry_ = false;
10658
- this.clearHeartbeat();
10659
- this.rejectPendingTaskRequests(new Error("server websocket closed"));
10660
- this.opts.onServerDisconnected?.();
10661
- this.scheduleReconnect();
10670
+ this.handleClose(code, reason.toString());
10662
10671
  });
10663
10672
  ws.on("error", (err) => {
10664
10673
  log15.warn({ err: asAppError(err) }, "server ws error event");
10665
10674
  });
10666
10675
  }
10676
+ handleClose(code, reason) {
10677
+ log15.warn({ code, reason }, "server ws closed");
10678
+ this.ws = null;
10679
+ this.organizationId = null;
10680
+ this.managerId = null;
10681
+ this.serverSupportsRebuiltResumeRetry_ = false;
10682
+ this.clearHeartbeat();
10683
+ this.rejectPendingTaskRequests(new Error("server websocket closed"));
10684
+ this.opts.onServerDisconnected?.();
10685
+ if (code === SUPERSEDED_CLOSE_CODE && reason === SUPERSEDED_CLOSE_REASON) {
10686
+ this.stopped = true;
10687
+ this.clearTimers();
10688
+ log15.warn("server ws superseded this runtime-manager; reconnect stopped");
10689
+ return;
10690
+ }
10691
+ this.scheduleReconnect();
10692
+ }
10667
10693
  scheduleReconnect() {
10668
10694
  if (this.stopped || this.reconnectTimer)
10669
10695
  return;
@@ -11668,11 +11694,11 @@ class RuntimeManager {
11668
11694
  emitRunnerStateFailed(session, lastError) {
11669
11695
  this.stateEmitter.emitRunnerStateFailed(session, lastError);
11670
11696
  }
11671
- emitAgentSessionState(session, agentSession, status) {
11672
- this.stateEmitter.emitAgentSessionState(session, agentSession, status);
11697
+ emitAgentSessionState(session, agentSession, status, metadata) {
11698
+ this.stateEmitter.emitAgentSessionState(session, agentSession, status, metadata);
11673
11699
  }
11674
- emitAgentSessionStateFailed(session, agentSession, lastError) {
11675
- this.stateEmitter.emitAgentSessionStateFailed(session, agentSession, lastError);
11700
+ emitAgentSessionStateFailed(session, agentSession, lastError, metadata) {
11701
+ this.stateEmitter.emitAgentSessionStateFailed(session, agentSession, lastError, metadata);
11676
11702
  }
11677
11703
  }
11678
11704
 
@@ -12516,11 +12542,11 @@ class RuntimeManager2 {
12516
12542
  emitRunnerStateFailed(session, lastError) {
12517
12543
  this.stateEmitter.emitRunnerStateFailed(session, lastError);
12518
12544
  }
12519
- emitAgentSessionState(session, agentSession, status) {
12520
- this.stateEmitter.emitAgentSessionState(session, agentSession, status);
12545
+ emitAgentSessionState(session, agentSession, status, metadata) {
12546
+ this.stateEmitter.emitAgentSessionState(session, agentSession, status, metadata);
12521
12547
  }
12522
- emitAgentSessionStateFailed(session, agentSession, lastError) {
12523
- this.stateEmitter.emitAgentSessionStateFailed(session, agentSession, lastError);
12548
+ emitAgentSessionStateFailed(session, agentSession, lastError, metadata) {
12549
+ this.stateEmitter.emitAgentSessionStateFailed(session, agentSession, lastError, metadata);
12524
12550
  }
12525
12551
  }
12526
12552
 
@@ -12545,7 +12571,7 @@ Env:
12545
12571
  local_process, local_docker, remote_sandbox:<backend>
12546
12572
  VINE_DEFAULT_PROVIDER fallback registration when dispatch has no provider hint
12547
12573
  VINE_PROVIDER legacy single-provider fallback when VINE_PROVIDERS is unset
12548
- VINE_RUNNER_IMAGE docker provider runner image (default vine-runtime-runner:dev)
12574
+ VINE_RUNNER_IMAGE docker provider runner image (default taosuuuuuuu/vine-runtime-runner:dev)
12549
12575
  VINE_RUNNER_LINK_HOST runner-link bind host (optional)
12550
12576
  VINE_RUNNER_LINK_PORT runner-link bind port (optional)
12551
12577
  VINE_RUNNER_LINK_PUBLIC_URL public/tunneled runner-link URL for remote_sandbox
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindfoldhq/runtime-manager",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Vine runtime manager CLI",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",