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.
- package/README.md +10 -5
- package/dist/backend/api/task-routes.js +31 -2
- package/dist/backend/api/workflow-control-routes.js +0 -31
- package/dist/backend/cli/install-vcm-harness.js +40 -6
- package/dist/backend/role-tool-policy.js +1 -1
- package/dist/backend/server.js +12 -5
- package/dist/backend/services/artifact-service.js +3 -2
- package/dist/backend/services/auto-memory-service.js +2 -2
- package/dist/backend/services/claude-hook-service.js +103 -4
- package/dist/backend/services/harness-feedback-service.js +105 -3
- package/dist/backend/services/harness-service.js +38 -6
- package/dist/backend/services/memory-review-paths.js +13 -0
- package/dist/backend/services/role-stall-detector-service.js +322 -0
- package/dist/backend/services/round-service.js +25 -0
- package/dist/backend/services/runtime-coordinator-service.js +10 -0
- package/dist/backend/services/session-service.js +70 -3
- package/dist/backend/services/workflow-control-service.js +439 -203
- package/dist/backend/templates/handoff.js +2 -3
- package/dist/backend/templates/harness/architect-agent.js +2 -2
- package/dist/backend/templates/harness/coder-agent.js +4 -5
- package/dist/backend/templates/harness/gate-review.js +7 -9
- package/dist/backend/templates/harness/harness-engineer-agent.js +18 -8
- package/dist/backend/templates/harness/project-manager-agent.js +5 -5
- package/dist/backend/templates/harness/vcm-code-navigation-skill.js +6 -7
- package/dist/backend/templates/harness/vcm-workflow-review-skill.js +7 -9
- package/dist/shared/types/role-stall.js +1 -0
- package/dist/shared/types/workflow.js +14 -0
- package/dist/shared/validation/artifact-registry.js +1 -1
- package/dist-frontend/assets/{index-C_XHGNBD.css → index-B0d4Z6ny.css} +1 -1
- package/dist-frontend/assets/{index-Bocc2DWF.js → index-VW9tYPP5.js} +38 -38
- package/dist-frontend/index.html +2 -2
- package/package.json +1 -1
- 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) {
|