vibe-coding-master 0.7.42 → 0.7.43

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 (33) hide show
  1. package/README.md +10 -5
  2. package/dist/backend/api/task-routes.js +31 -2
  3. package/dist/backend/api/workflow-control-routes.js +0 -31
  4. package/dist/backend/cli/install-vcm-harness.js +40 -6
  5. package/dist/backend/role-tool-policy.js +1 -1
  6. package/dist/backend/server.js +12 -5
  7. package/dist/backend/services/artifact-service.js +3 -2
  8. package/dist/backend/services/auto-memory-service.js +2 -2
  9. package/dist/backend/services/claude-hook-service.js +103 -4
  10. package/dist/backend/services/harness-feedback-service.js +105 -3
  11. package/dist/backend/services/harness-service.js +38 -6
  12. package/dist/backend/services/memory-review-paths.js +13 -0
  13. package/dist/backend/services/role-stall-detector-service.js +322 -0
  14. package/dist/backend/services/round-service.js +25 -0
  15. package/dist/backend/services/runtime-coordinator-service.js +10 -0
  16. package/dist/backend/services/session-service.js +70 -3
  17. package/dist/backend/services/workflow-control-service.js +439 -203
  18. package/dist/backend/templates/handoff.js +2 -3
  19. package/dist/backend/templates/harness/architect-agent.js +2 -2
  20. package/dist/backend/templates/harness/coder-agent.js +4 -5
  21. package/dist/backend/templates/harness/gate-review.js +7 -9
  22. package/dist/backend/templates/harness/harness-engineer-agent.js +18 -8
  23. package/dist/backend/templates/harness/project-manager-agent.js +5 -5
  24. package/dist/backend/templates/harness/vcm-code-navigation-skill.js +6 -7
  25. package/dist/backend/templates/harness/vcm-workflow-review-skill.js +7 -9
  26. package/dist/shared/types/role-stall.js +1 -0
  27. package/dist/shared/types/workflow.js +14 -0
  28. package/dist/shared/validation/artifact-registry.js +1 -1
  29. package/dist-frontend/assets/{index-C_XHGNBD.css → index-B0d4Z6ny.css} +1 -1
  30. package/dist-frontend/assets/{index-Bocc2DWF.js → index-VW9tYPP5.js} +38 -38
  31. package/dist-frontend/index.html +2 -2
  32. package/package.json +1 -1
  33. package/scripts/harness-tools/vcm-bash-guard +203 -13
@@ -721,7 +721,8 @@ export function createSessionService(deps) {
721
721
  return undefined;
722
722
  }
723
723
  const timestamp = now();
724
- const turnWasRunning = current.activityStatus === "running";
724
+ const turnWasRunning = current.activityStatus === "running"
725
+ && current.expectedRuntimeExitReason !== "role-stall-recovery";
725
726
  const updated = {
726
727
  ...current,
727
728
  status: input.status,
@@ -737,6 +738,71 @@ export function createSessionService(deps) {
737
738
  await persistRoleSessionRecord(deps.fs, repoRoot, getTaskRuntimeRepoRoot(task), config.stateRoot, updated);
738
739
  return { record: updated, turnWasRunning };
739
740
  }
741
+ async function persistTaskRoleRecord(repoRoot, taskSlug, record) {
742
+ deps.registry.upsert(record);
743
+ const config = await deps.projectService.loadConfig(repoRoot);
744
+ const task = await deps.taskService.loadTask(repoRoot, taskSlug);
745
+ await persistRoleSessionRecord(deps.fs, repoRoot, getTaskRuntimeRepoRoot(task), config.stateRoot, record);
746
+ return record;
747
+ }
748
+ async function recoverRoleSession(repoRoot, taskSlug, input) {
749
+ const current = await getTaskRoleSessionView(repoRoot, taskSlug, input.role);
750
+ if (!current
751
+ || current.id !== input.expectedSessionId
752
+ || current.runtimeSessionToken !== input.expectedRuntimeSessionToken
753
+ || current.status !== "running"
754
+ || current.activityStatus !== "running") {
755
+ throw new VcmError({
756
+ code: "ROLE_STALL_SESSION_CHANGED",
757
+ message: `${input.role} session changed before recovery could begin.`,
758
+ statusCode: 409
759
+ });
760
+ }
761
+ if (!current.claudeSessionId) {
762
+ throw new VcmError({
763
+ code: "CLAUDE_SESSION_MISSING",
764
+ message: `${input.role} does not have a confirmed Claude session id to resume.`,
765
+ statusCode: 409
766
+ });
767
+ }
768
+ const prepared = await persistTaskRoleRecord(repoRoot, taskSlug, {
769
+ ...current,
770
+ expectedRuntimeExitReason: "role-stall-recovery",
771
+ updatedAt: now()
772
+ });
773
+ if (deps.runtime.getSession(prepared.id)) {
774
+ await deps.runtime.stop(prepared.id);
775
+ }
776
+ await persistTaskRoleRecord(repoRoot, taskSlug, {
777
+ ...prepared,
778
+ status: "exited",
779
+ activityStatus: "idle",
780
+ pid: undefined,
781
+ expectedRuntimeExitReason: undefined,
782
+ updatedAt: now()
783
+ });
784
+ const resumed = await launchRoleSession(repoRoot, taskSlug, input.role, {
785
+ permissionMode: prepared.permissionMode,
786
+ model: prepared.model,
787
+ effort: prepared.effort
788
+ }, "resume");
789
+ if ((await waitForSessionInputReady(resumed.id)) === "exited") {
790
+ throw new VcmError({
791
+ code: "ROLE_STALL_RESUME_FAILED",
792
+ message: `${input.role} session exited before recovery input could be submitted.`,
793
+ statusCode: 409
794
+ });
795
+ }
796
+ await submitTerminalInput(deps.runtime, resumed.id, input.recoveryPrompt);
797
+ return persistTaskRoleRecord(repoRoot, taskSlug, {
798
+ ...resumed,
799
+ activityStatus: "running",
800
+ lastTurnStartedAt: now(),
801
+ lastHookEventAt: now(),
802
+ expectedRuntimeExitReason: undefined,
803
+ updatedAt: now()
804
+ });
805
+ }
740
806
  return {
741
807
  async assertModelLaunchReady(model = "default") {
742
808
  await getModelLaunchEnvironment(normalizeClaudeModel(model));
@@ -1204,7 +1270,8 @@ export function createSessionService(deps) {
1204
1270
  : undefined;
1205
1271
  }
1206
1272
  return markTaskRoleActivityIdle(repoRoot, taskSlug, role);
1207
- }
1273
+ },
1274
+ recoverRoleSession
1208
1275
  };
1209
1276
  }
1210
1277
  function toRoleSessionRecordView(record, runtime) {
@@ -1294,7 +1361,7 @@ function isSessionMissingError(error) {
1294
1361
  error.code === "SESSION_MISSING";
1295
1362
  }
1296
1363
  function withoutRuntimeOnlySessionFields(session) {
1297
- const { pid: _pid, runtimeSessionToken: _runtimeSessionToken, ...persisted } = session;
1364
+ const { pid: _pid, runtimeSessionToken: _runtimeSessionToken, expectedRuntimeExitReason: _expectedRuntimeExitReason, ...persisted } = session;
1298
1365
  return persisted;
1299
1366
  }
1300
1367
  function defaultIsProcessAlive(pid) {