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.
- package/dist/backend/adapters/filesystem.js +6 -0
- package/dist/backend/api/task-routes.js +20 -1
- package/dist/backend/server.js +4 -2
- package/dist/backend/services/auto-memory-service.js +111 -34
- package/dist/backend/services/claude-hook-service.js +5 -3
- package/dist/backend/services/gate-review-service.js +21 -2
- package/dist/backend/services/harness-feedback-service.js +53 -15
- package/dist/backend/services/message-service.js +10 -0
- package/dist/backend/services/runtime-recovery-service.js +9 -0
- package/dist/backend/services/translation-service.js +74 -3
- package/dist/backend/services/workflow-control-service.js +436 -75
- package/dist/backend/templates/handoff.js +14 -2
- package/dist/backend/templates/harness/architect-agent.js +6 -5
- package/dist/backend/templates/harness/architect-evidence-worker-agent.js +2 -0
- package/dist/backend/templates/harness/architect-validation-worker-agent.js +1 -1
- package/dist/backend/templates/harness/claude-root.js +3 -3
- package/dist/backend/templates/harness/coder-agent.js +1 -0
- package/dist/backend/templates/harness/harness-engineer-agent.js +14 -11
- package/dist/backend/templates/harness/memory-block.js +10 -0
- package/dist/backend/templates/harness/project-manager-agent.js +5 -1
- package/dist/backend/templates/harness/tester-agent.js +6 -0
- package/dist/backend/templates/harness/vcm-workflow-review-skill.js +17 -1
- package/dist/shared/validation/artifact-check.js +36 -3
- package/dist/shared/validation/artifact-contract.js +7 -0
- package/dist/shared/validation/artifact-registry.js +4 -1
- package/dist-frontend/assets/{index-DLsIPTvK.js → index-Dh7uVCmk.js} +1 -1
- package/dist-frontend/index.html +1 -1
- package/package.json +1 -1
- 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"
|
|
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) {
|