vibe-coding-master 0.7.50 → 0.8.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 (29) hide show
  1. package/dist/backend/adapters/filesystem.js +6 -0
  2. package/dist/backend/api/task-routes.js +20 -1
  3. package/dist/backend/server.js +4 -2
  4. package/dist/backend/services/auto-memory-service.js +111 -34
  5. package/dist/backend/services/claude-hook-service.js +5 -3
  6. package/dist/backend/services/gate-review-service.js +21 -2
  7. package/dist/backend/services/harness-feedback-service.js +53 -15
  8. package/dist/backend/services/message-service.js +10 -0
  9. package/dist/backend/services/runtime-recovery-service.js +9 -0
  10. package/dist/backend/services/translation-service.js +74 -3
  11. package/dist/backend/services/workflow-control-service.js +436 -75
  12. package/dist/backend/templates/handoff.js +14 -2
  13. package/dist/backend/templates/harness/architect-agent.js +6 -5
  14. package/dist/backend/templates/harness/architect-evidence-worker-agent.js +2 -0
  15. package/dist/backend/templates/harness/architect-validation-worker-agent.js +1 -1
  16. package/dist/backend/templates/harness/claude-root.js +3 -3
  17. package/dist/backend/templates/harness/coder-agent.js +1 -0
  18. package/dist/backend/templates/harness/harness-engineer-agent.js +14 -11
  19. package/dist/backend/templates/harness/memory-block.js +10 -0
  20. package/dist/backend/templates/harness/project-manager-agent.js +5 -1
  21. package/dist/backend/templates/harness/tester-agent.js +6 -0
  22. package/dist/backend/templates/harness/vcm-workflow-review-skill.js +17 -1
  23. package/dist/shared/validation/artifact-check.js +36 -3
  24. package/dist/shared/validation/artifact-contract.js +7 -0
  25. package/dist/shared/validation/artifact-registry.js +4 -1
  26. package/dist-frontend/assets/{index-DLsIPTvK.js → index-Dh7uVCmk.js} +1 -1
  27. package/dist-frontend/index.html +1 -1
  28. package/package.json +1 -1
  29. package/scripts/harness-tools/vcm-bash-guard +245 -21
@@ -1099,6 +1099,63 @@ export function createTranslationService(deps) {
1099
1099
  hint: "Wait for the translation panel to finish translating the PM final reply, then retry from Gateway."
1100
1100
  });
1101
1101
  },
1102
+ async shouldDelayFlowPauseNotification(input) {
1103
+ const round = input.roundState;
1104
+ if (!round.flowPause?.paused
1105
+ || round.flowPause.reason !== "stopped-no-next-turn"
1106
+ || round.status !== "stopped"
1107
+ || !round.roundId
1108
+ || !round.activeRole
1109
+ || !isVcmRoleName(round.activeRole)) {
1110
+ return false;
1111
+ }
1112
+ const preferences = await deps.appSettings.getPreferences();
1113
+ if (!preferences.translationEnabled
1114
+ || (preferences.translationOutputMode === "pm-final-only" && round.activeRole !== "project-manager")) {
1115
+ return false;
1116
+ }
1117
+ const roleSession = await deps.sessionService.getRoleSession(input.repoRoot, input.taskSlug, round.activeRole);
1118
+ if (!roleSession) {
1119
+ return false;
1120
+ }
1121
+ await prepareCache({
1122
+ repoRoot: input.taskRepoRoot,
1123
+ baseRepoRoot: input.repoRoot,
1124
+ taskSlug: input.taskSlug,
1125
+ role: roleSession.role,
1126
+ sessionId: roleSession.id
1127
+ });
1128
+ if (roleSession.status === "running") {
1129
+ startTranscriptTail(roleSession);
1130
+ }
1131
+ const candidate = findRoundFinalReplyCandidate(input, round);
1132
+ if (!candidate) {
1133
+ return isWithinTranscriptReplayGrace(round.stoppedAt);
1134
+ }
1135
+ if (candidate.entry.status === "translated" || candidate.entry.status === "failed") {
1136
+ return false;
1137
+ }
1138
+ if (candidate.entry.status === "preserved") {
1139
+ const config = {
1140
+ sourceLanguage: TRANSLATION_SOURCE_LANGUAGE,
1141
+ targetLanguage: preferences.translationTargetLanguage,
1142
+ inputMode: TRANSLATION_INPUT_MODE,
1143
+ outputMode: preferences.translationOutputMode,
1144
+ contextEnabled: TRANSLATION_CONTEXT_ENABLED
1145
+ };
1146
+ const started = startClaudeOutputTranslation(candidate.sessionId, candidate.entry.sourceText, config, {
1147
+ entryId: candidate.entry.id,
1148
+ replaceExisting: true,
1149
+ flushImmediately: true,
1150
+ metadata: {
1151
+ transcriptStopReason: candidate.entry.transcriptStopReason,
1152
+ transcriptTimestamp: candidate.entry.transcriptTimestamp
1153
+ }
1154
+ });
1155
+ return started !== undefined;
1156
+ }
1157
+ return candidate.entry.status === "queued" || candidate.entry.status === "translating";
1158
+ },
1102
1159
  getDiagnostics() {
1103
1160
  let transcriptWatchers = 0;
1104
1161
  let listeners = 0;
@@ -1157,7 +1214,7 @@ export function createTranslationService(deps) {
1157
1214
  continue;
1158
1215
  }
1159
1216
  for (const entry of state.entries) {
1160
- if (isRoundFinalCandidateEntry(entry, input, round.stoppedAt)) {
1217
+ if (isRoundFinalCandidateEntry(entry, input, round.stoppedAt, round.lastTurnStartedAt)) {
1161
1218
  candidates.push({ sessionId, entry });
1162
1219
  }
1163
1220
  }
@@ -1172,14 +1229,21 @@ export function createTranslationService(deps) {
1172
1229
  }
1173
1230
  return !activeRole || state.role === activeRole;
1174
1231
  }
1175
- function isRoundFinalCandidateEntry(entry, input, stoppedAt) {
1232
+ function isRoundFinalCandidateEntry(entry, input, stoppedAt, lastTurnStartedAt) {
1176
1233
  if (entry.taskSlug !== input.taskSlug ||
1177
1234
  entry.direction !== "cc-output-to-user" ||
1178
1235
  entry.sourceKind !== "prose" ||
1179
1236
  entry.transcriptStopReason !== "end_turn") {
1180
1237
  return false;
1181
1238
  }
1182
- if (entry.status !== "preserved" && entry.status !== "queued" && entry.status !== "translating" && entry.status !== "translated") {
1239
+ if (entry.status !== "preserved"
1240
+ && entry.status !== "queued"
1241
+ && entry.status !== "translating"
1242
+ && entry.status !== "translated"
1243
+ && entry.status !== "failed") {
1244
+ return false;
1245
+ }
1246
+ if (lastTurnStartedAt && entry.transcriptTimestamp && entry.transcriptTimestamp < lastTurnStartedAt) {
1183
1247
  return false;
1184
1248
  }
1185
1249
  if (!stoppedAt || !entry.transcriptTimestamp) {
@@ -1195,6 +1259,13 @@ export function createTranslationService(deps) {
1195
1259
  }
1196
1260
  return leftTime.localeCompare(rightTime);
1197
1261
  }
1262
+ function isWithinTranscriptReplayGrace(stoppedAt) {
1263
+ const stoppedAtMs = Date.parse(stoppedAt ?? "");
1264
+ const nowMs = Date.parse(now());
1265
+ return Number.isFinite(stoppedAtMs)
1266
+ && Number.isFinite(nowMs)
1267
+ && nowMs - stoppedAtMs < TRANSCRIPT_REPLAY_GRACE_MS;
1268
+ }
1198
1269
  async function findReusableGatewayOutputTranslation(input) {
1199
1270
  const graceDeadline = Date.now() + (input.sourceEntryIds?.length ? GATEWAY_TRANSLATION_REUSE_GRACE_MS : 0);
1200
1271
  while (true) {