hungry-ghost-hive 0.43.0 → 0.43.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.
Files changed (133) hide show
  1. package/dist/cli/commands/agents.d.ts.map +1 -1
  2. package/dist/cli/commands/agents.js +4 -11
  3. package/dist/cli/commands/agents.js.map +1 -1
  4. package/dist/cli/commands/approach.d.ts.map +1 -1
  5. package/dist/cli/commands/approach.js +2 -6
  6. package/dist/cli/commands/approach.js.map +1 -1
  7. package/dist/cli/commands/init.d.ts.map +1 -1
  8. package/dist/cli/commands/init.js +9 -0
  9. package/dist/cli/commands/init.js.map +1 -1
  10. package/dist/cli/commands/init.test.js +3 -0
  11. package/dist/cli/commands/init.test.js.map +1 -1
  12. package/dist/cli/commands/manager/index.d.ts +2 -27
  13. package/dist/cli/commands/manager/index.d.ts.map +1 -1
  14. package/dist/cli/commands/manager/index.js +23 -1519
  15. package/dist/cli/commands/manager/index.js.map +1 -1
  16. package/dist/cli/commands/manager/manager-utils.d.ts +9 -0
  17. package/dist/cli/commands/manager/manager-utils.d.ts.map +1 -0
  18. package/dist/cli/commands/manager/manager-utils.js +49 -0
  19. package/dist/cli/commands/manager/manager-utils.js.map +1 -0
  20. package/dist/cli/commands/manager/pr-sync-orchestrator.d.ts +7 -0
  21. package/dist/cli/commands/manager/pr-sync-orchestrator.d.ts.map +1 -0
  22. package/dist/cli/commands/manager/pr-sync-orchestrator.js +537 -0
  23. package/dist/cli/commands/manager/pr-sync-orchestrator.js.map +1 -0
  24. package/dist/cli/commands/manager/qa-review-handler.d.ts +15 -0
  25. package/dist/cli/commands/manager/qa-review-handler.d.ts.map +1 -0
  26. package/dist/cli/commands/manager/qa-review-handler.js +290 -0
  27. package/dist/cli/commands/manager/qa-review-handler.js.map +1 -0
  28. package/dist/cli/commands/manager/stuck-story-helpers.d.ts +32 -0
  29. package/dist/cli/commands/manager/stuck-story-helpers.d.ts.map +1 -0
  30. package/dist/cli/commands/manager/stuck-story-helpers.js +163 -0
  31. package/dist/cli/commands/manager/stuck-story-helpers.js.map +1 -0
  32. package/dist/cli/commands/manager/stuck-story-processor.d.ts +8 -0
  33. package/dist/cli/commands/manager/stuck-story-processor.d.ts.map +1 -0
  34. package/dist/cli/commands/manager/stuck-story-processor.js +392 -0
  35. package/dist/cli/commands/manager/stuck-story-processor.js.map +1 -0
  36. package/dist/cli/commands/manager/tech-lead-lifecycle.d.ts +3 -0
  37. package/dist/cli/commands/manager/tech-lead-lifecycle.d.ts.map +1 -0
  38. package/dist/cli/commands/manager/tech-lead-lifecycle.js +141 -0
  39. package/dist/cli/commands/manager/tech-lead-lifecycle.js.map +1 -0
  40. package/dist/cli/commands/my-stories.d.ts.map +1 -1
  41. package/dist/cli/commands/my-stories.js +5 -20
  42. package/dist/cli/commands/my-stories.js.map +1 -1
  43. package/dist/cli/commands/pr.js +7 -22
  44. package/dist/cli/commands/pr.js.map +1 -1
  45. package/dist/cli/commands/progress.d.ts.map +1 -1
  46. package/dist/cli/commands/progress.js +2 -5
  47. package/dist/cli/commands/progress.js.map +1 -1
  48. package/dist/cli/commands/resume.d.ts.map +1 -1
  49. package/dist/cli/commands/resume.js +3 -6
  50. package/dist/cli/commands/resume.js.map +1 -1
  51. package/dist/cli/commands/status.d.ts.map +1 -1
  52. package/dist/cli/commands/status.js +2 -5
  53. package/dist/cli/commands/status.js.map +1 -1
  54. package/dist/cli/commands/stories.d.ts.map +1 -1
  55. package/dist/cli/commands/stories.js +2 -5
  56. package/dist/cli/commands/stories.js.map +1 -1
  57. package/dist/cluster/adapters.d.ts +3 -2
  58. package/dist/cluster/adapters.d.ts.map +1 -1
  59. package/dist/cluster/adapters.js +2 -11
  60. package/dist/cluster/adapters.js.map +1 -1
  61. package/dist/cluster/cluster-http-server.d.ts +20 -0
  62. package/dist/cluster/cluster-http-server.d.ts.map +1 -0
  63. package/dist/cluster/cluster-http-server.js +140 -0
  64. package/dist/cluster/cluster-http-server.js.map +1 -0
  65. package/dist/cluster/heartbeat-manager.d.ts +24 -0
  66. package/dist/cluster/heartbeat-manager.d.ts.map +1 -0
  67. package/dist/cluster/heartbeat-manager.js +74 -0
  68. package/dist/cluster/heartbeat-manager.js.map +1 -0
  69. package/dist/cluster/raft-state-machine.d.ts +48 -0
  70. package/dist/cluster/raft-state-machine.d.ts.map +1 -0
  71. package/dist/cluster/raft-state-machine.js +207 -0
  72. package/dist/cluster/raft-state-machine.js.map +1 -0
  73. package/dist/cluster/runtime.d.ts +5 -29
  74. package/dist/cluster/runtime.d.ts.map +1 -1
  75. package/dist/cluster/runtime.js +58 -406
  76. package/dist/cluster/runtime.js.map +1 -1
  77. package/dist/integrations/jira/sync.d.ts +2 -5
  78. package/dist/integrations/jira/sync.d.ts.map +1 -1
  79. package/dist/integrations/jira/sync.js +116 -178
  80. package/dist/integrations/jira/sync.js.map +1 -1
  81. package/dist/utils/cli-helpers.d.ts +19 -0
  82. package/dist/utils/cli-helpers.d.ts.map +1 -0
  83. package/dist/utils/cli-helpers.js +51 -0
  84. package/dist/utils/cli-helpers.js.map +1 -0
  85. package/dist/utils/cli-helpers.test.d.ts +2 -0
  86. package/dist/utils/cli-helpers.test.d.ts.map +1 -0
  87. package/dist/utils/cli-helpers.test.js +100 -0
  88. package/dist/utils/cli-helpers.test.js.map +1 -0
  89. package/dist/utils/github-cli.d.ts +3 -0
  90. package/dist/utils/github-cli.d.ts.map +1 -0
  91. package/dist/utils/github-cli.js +4 -0
  92. package/dist/utils/github-cli.js.map +1 -0
  93. package/dist/utils/pr-sync.d.ts.map +1 -1
  94. package/dist/utils/pr-sync.js +1 -2
  95. package/dist/utils/pr-sync.js.map +1 -1
  96. package/dist/utils/story-status.d.ts +19 -0
  97. package/dist/utils/story-status.d.ts.map +1 -0
  98. package/dist/utils/story-status.js +58 -0
  99. package/dist/utils/story-status.js.map +1 -0
  100. package/dist/utils/story-status.test.d.ts +2 -0
  101. package/dist/utils/story-status.test.d.ts.map +1 -0
  102. package/dist/utils/story-status.test.js +65 -0
  103. package/dist/utils/story-status.test.js.map +1 -0
  104. package/package.json +1 -1
  105. package/src/cli/commands/agents.ts +3 -11
  106. package/src/cli/commands/approach.ts +2 -7
  107. package/src/cli/commands/init.test.ts +4 -0
  108. package/src/cli/commands/init.ts +9 -0
  109. package/src/cli/commands/manager/index.ts +166 -2236
  110. package/src/cli/commands/manager/manager-utils.ts +85 -0
  111. package/src/cli/commands/manager/pr-sync-orchestrator.ts +659 -0
  112. package/src/cli/commands/manager/qa-review-handler.ts +399 -0
  113. package/src/cli/commands/manager/stuck-story-helpers.ts +255 -0
  114. package/src/cli/commands/manager/stuck-story-processor.ts +604 -0
  115. package/src/cli/commands/manager/tech-lead-lifecycle.ts +210 -0
  116. package/src/cli/commands/my-stories.ts +5 -30
  117. package/src/cli/commands/pr.ts +6 -22
  118. package/src/cli/commands/progress.ts +2 -7
  119. package/src/cli/commands/resume.ts +3 -6
  120. package/src/cli/commands/status.ts +2 -5
  121. package/src/cli/commands/stories.ts +2 -5
  122. package/src/cluster/adapters.ts +3 -12
  123. package/src/cluster/cluster-http-server.ts +187 -0
  124. package/src/cluster/heartbeat-manager.ts +112 -0
  125. package/src/cluster/raft-state-machine.ts +267 -0
  126. package/src/cluster/runtime.ts +71 -515
  127. package/src/integrations/jira/sync.ts +157 -215
  128. package/src/utils/cli-helpers.test.ts +138 -0
  129. package/src/utils/cli-helpers.ts +61 -0
  130. package/src/utils/github-cli.ts +4 -0
  131. package/src/utils/pr-sync.ts +1 -3
  132. package/src/utils/story-status.test.ts +74 -0
  133. package/src/utils/story-status.ts +62 -0
@@ -0,0 +1,290 @@
1
+ // Licensed under the Hungry Ghost Hive License. See LICENSE.
2
+ import chalk from 'chalk';
3
+ import { syncStatusForStory } from '../../../connectors/project-management/operations.js';
4
+ import { withTransaction } from '../../../db/client.js';
5
+ import { createLog } from '../../../db/queries/logs.js';
6
+ import { getMergeQueue, getPullRequestsByStatus, updatePullRequest, } from '../../../db/queries/pull-requests.js';
7
+ import { updateStory } from '../../../db/queries/stories.js';
8
+ import { getPullRequestComments, getPullRequestReviews } from '../../../git/github.js';
9
+ import { AgentState } from '../../../state-detectors/types.js';
10
+ import { agentStates } from './agent-monitoring.js';
11
+ import { sendManagerNudge, verboseLogCtx } from './manager-utils.js';
12
+ export async function notifyQAOfQueuedPRs(ctx) {
13
+ // Phase 1: Read PR queue and assign reviews (brief lock)
14
+ const { queuedPRs, dispatched } = await ctx.withDb(async (db) => {
15
+ const openPRs = getMergeQueue(db.db);
16
+ verboseLogCtx(ctx, `notifyQAOfQueuedPRs: open=${openPRs.length}`);
17
+ const queued = openPRs.filter(pr => pr.status === 'queued');
18
+ const reviewing = openPRs.filter(pr => pr.status === 'reviewing');
19
+ ctx.counters.queuedPRCount = queued.length;
20
+ ctx.counters.reviewingPRCount = reviewing.length;
21
+ verboseLogCtx(ctx, `notifyQAOfQueuedPRs: queued=${queued.length}`);
22
+ if (queued.length === 0) {
23
+ return {
24
+ queuedPRs: [],
25
+ dispatched: [],
26
+ };
27
+ }
28
+ const reviewingSessions = new Set(openPRs
29
+ .filter(pr => pr.status === 'reviewing' && pr.reviewed_by)
30
+ .map(pr => pr.reviewed_by));
31
+ const idleQASessions = ctx.hiveSessions.filter(session => {
32
+ if (!session.name.includes('-qa-'))
33
+ return false;
34
+ if (reviewingSessions.has(session.name))
35
+ return false;
36
+ const agent = ctx.agentsBySessionName.get(session.name);
37
+ return Boolean(agent && agent.status === 'idle');
38
+ });
39
+ verboseLogCtx(ctx, `notifyQAOfQueuedPRs: idleQA=${idleQASessions.length}`);
40
+ const dispatchedList = [];
41
+ let dispatchCount = 0;
42
+ for (const qa of idleQASessions) {
43
+ const nextPR = queued[dispatchCount];
44
+ if (!nextPR)
45
+ break;
46
+ await withTransaction(db.db, () => {
47
+ updatePullRequest(db.db, nextPR.id, {
48
+ status: 'reviewing',
49
+ reviewedBy: qa.name,
50
+ });
51
+ createLog(db.db, {
52
+ agentId: qa.name,
53
+ storyId: nextPR.story_id || undefined,
54
+ eventType: 'PR_REVIEW_STARTED',
55
+ message: `Manager assigned PR review: ${nextPR.id}`,
56
+ metadata: { pr_id: nextPR.id, branch: nextPR.branch_name },
57
+ });
58
+ }, () => db.save());
59
+ dispatchedList.push({
60
+ prId: nextPR.id,
61
+ qaName: qa.name,
62
+ storyId: nextPR.story_id,
63
+ githubPrUrl: nextPR.github_pr_url,
64
+ });
65
+ dispatchCount++;
66
+ verboseLogCtx(ctx, `notifyQAOfQueuedPRs: assigned pr=${nextPR.id} -> ${qa.name}`);
67
+ }
68
+ return { queuedPRs: queued, dispatched: dispatchedList };
69
+ });
70
+ if (queuedPRs.length === 0)
71
+ return;
72
+ // Phase 2: Send tmux nudges (no lock needed)
73
+ for (const d of dispatched) {
74
+ const githubLine = d.githubPrUrl ? `\n# GitHub: ${d.githubPrUrl}` : '';
75
+ await sendManagerNudge(ctx, d.qaName, `# You are assigned PR review ${d.prId} (${d.storyId || 'no-story'}).${githubLine}
76
+ # Execute now:
77
+ # hive pr show ${d.prId}
78
+ # hive pr approve ${d.prId}
79
+ # (If manual merge is required in this repo, use --no-merge.)
80
+ # or reject:
81
+ # hive pr reject ${d.prId} -r "reason"`);
82
+ }
83
+ // Fallback nudge if PRs are still queued but all QA sessions are busy/unavailable.
84
+ if (dispatched.length === 0) {
85
+ verboseLogCtx(ctx, 'notifyQAOfQueuedPRs: no idle QA, sent queue nudge fallback');
86
+ const qaSessions = ctx.hiveSessions.filter(s => s.name.includes('-qa-'));
87
+ for (const qa of qaSessions) {
88
+ await sendManagerNudge(ctx, qa.name, `# ${queuedPRs.length} PR(s) waiting in queue. Run: hive pr queue`);
89
+ }
90
+ }
91
+ }
92
+ /**
93
+ * Auto-reject PRs where the QA agent posted review comments/feedback on GitHub
94
+ * but never formally approved or rejected via `hive pr approve/reject`.
95
+ *
96
+ * Detection: PR is in 'reviewing' status, the assigned QA agent is idle,
97
+ * and there are GitHub comments or CHANGES_REQUESTED reviews on the PR.
98
+ *
99
+ * Action: Auto-reject the PR with the QA's feedback as the rejection reason,
100
+ * which triggers the standard qa_failed flow back to the developer agent.
101
+ */
102
+ export async function autoRejectCommentOnlyReviews(ctx) {
103
+ // Phase 1: Identify reviewing PRs with idle QA agents (brief lock)
104
+ const candidates = await ctx.withDb(async (db) => {
105
+ const reviewingPRs = getPullRequestsByStatus(db.db, 'reviewing').filter(pr => pr.github_pr_number && pr.team_id && pr.reviewed_by);
106
+ verboseLogCtx(ctx, `autoRejectCommentOnlyReviews: reviewingWithQA=${reviewingPRs.length}`);
107
+ if (reviewingPRs.length === 0)
108
+ return [];
109
+ // Only consider PRs whose QA agent is idle (finished reviewing but didn't approve/reject)
110
+ const idlePRs = reviewingPRs.filter(pr => {
111
+ const qaAgent = ctx.agentsBySessionName.get(pr.reviewed_by);
112
+ if (!qaAgent)
113
+ return false;
114
+ // Check if the QA agent is idle or if their session shows idle state
115
+ const qaState = agentStates.get(pr.reviewed_by);
116
+ return qaAgent.status === 'idle' || qaState?.lastState === AgentState.IDLE_AT_PROMPT;
117
+ });
118
+ verboseLogCtx(ctx, `autoRejectCommentOnlyReviews: idleQACandidates=${idlePRs.length}`);
119
+ if (idlePRs.length === 0)
120
+ return [];
121
+ const { getAllTeams } = await import('../../../db/queries/teams.js');
122
+ const teams = getAllTeams(db.db);
123
+ const teamsById = new Map(teams.map(team => [team.id, team]));
124
+ return idlePRs
125
+ .map(pr => {
126
+ const team = teamsById.get(pr.team_id);
127
+ if (!team?.repo_path)
128
+ return null;
129
+ return {
130
+ id: pr.id,
131
+ storyId: pr.story_id,
132
+ teamId: pr.team_id,
133
+ branchName: pr.branch_name,
134
+ githubPrNumber: pr.github_pr_number,
135
+ reviewedBy: pr.reviewed_by,
136
+ submittedBy: pr.submitted_by,
137
+ repoDir: `${ctx.root}/${team.repo_path}`,
138
+ };
139
+ })
140
+ .filter(Boolean);
141
+ });
142
+ if (candidates.length === 0)
143
+ return;
144
+ // Phase 2: Check GitHub for comments/reviews on each candidate (no lock)
145
+ const toReject = [];
146
+ for (const candidate of candidates) {
147
+ try {
148
+ // Fetch both reviews and comments from GitHub
149
+ const [reviews, comments] = await Promise.all([
150
+ getPullRequestReviews(candidate.repoDir, candidate.githubPrNumber).catch(() => []),
151
+ getPullRequestComments(candidate.repoDir, candidate.githubPrNumber).catch(() => []),
152
+ ]);
153
+ // If there's a formal APPROVED review, skip (QA approved via GitHub directly)
154
+ const hasApproval = reviews.some(r => r.state === 'APPROVED');
155
+ if (hasApproval) {
156
+ verboseLogCtx(ctx, `autoRejectCommentOnlyReviews: pr=${candidate.id} has GitHub approval, skipping`);
157
+ continue;
158
+ }
159
+ // Check for CHANGES_REQUESTED reviews
160
+ const changesRequested = reviews.filter(r => r.state === 'CHANGES_REQUESTED');
161
+ // Check for substantive issue comments (filter out bot noise and very short comments)
162
+ const substantiveComments = comments.filter(c => {
163
+ if (c.body.length < 20)
164
+ return false;
165
+ // Skip known bot comments (Ellipsis, etc.)
166
+ if (c.body.includes('Looks good to me') && c.body.length < 100)
167
+ return false;
168
+ return true;
169
+ });
170
+ // If there are review feedback items, auto-reject
171
+ if (changesRequested.length > 0 || substantiveComments.length > 0) {
172
+ // Build rejection reason from the feedback
173
+ const feedbackParts = [];
174
+ for (const review of changesRequested) {
175
+ if (review.body)
176
+ feedbackParts.push(review.body);
177
+ }
178
+ for (const comment of substantiveComments) {
179
+ feedbackParts.push(comment.body);
180
+ }
181
+ const reason = feedbackParts.length > 0
182
+ ? feedbackParts.join('\n---\n').slice(0, 2000)
183
+ : 'QA posted review feedback on GitHub without formal approval. See PR comments.';
184
+ toReject.push({ candidate, reason });
185
+ verboseLogCtx(ctx, `autoRejectCommentOnlyReviews: pr=${candidate.id} has ${changesRequested.length} changes_requested + ${substantiveComments.length} comments, will auto-reject`);
186
+ }
187
+ }
188
+ catch (err) {
189
+ verboseLogCtx(ctx, `autoRejectCommentOnlyReviews: skip pr=${candidate.id} github_check_failed=${err instanceof Error ? err.message : String(err)}`);
190
+ }
191
+ }
192
+ if (toReject.length === 0)
193
+ return;
194
+ // Phase 3: Reject PRs in DB (brief lock)
195
+ await ctx.withDb(async (db) => {
196
+ for (const { candidate, reason } of toReject) {
197
+ await withTransaction(db.db, () => {
198
+ updatePullRequest(db.db, candidate.id, {
199
+ status: 'rejected',
200
+ reviewNotes: reason,
201
+ });
202
+ if (candidate.storyId) {
203
+ updateStory(db.db, candidate.storyId, { status: 'qa_failed' });
204
+ }
205
+ createLog(db.db, {
206
+ agentId: 'manager',
207
+ eventType: 'PR_REJECTED',
208
+ message: `Auto-rejected PR ${candidate.id}: QA posted review comments without formal approve/reject`,
209
+ storyId: candidate.storyId || undefined,
210
+ metadata: { pr_id: candidate.id, auto_rejected: true },
211
+ });
212
+ }, () => db.save());
213
+ console.log(chalk.yellow(` Auto-rejected PR ${candidate.id} (story: ${candidate.storyId || '-'}): QA left review comments without approving`));
214
+ }
215
+ });
216
+ // Phase 4: Notify developer agents via tmux (no lock)
217
+ for (const { candidate, reason } of toReject) {
218
+ if (candidate.submittedBy) {
219
+ const devSession = ctx.hiveSessions.find(s => s.name === candidate.submittedBy);
220
+ if (devSession) {
221
+ await sendManagerNudge(ctx, devSession.name, `# ⚠️ PR AUTO-REJECTED - QA REVIEW FEEDBACK ⚠️
222
+ # Story: ${candidate.storyId || 'Unknown'}
223
+ # QA agent (${candidate.reviewedBy}) posted review feedback without formally approving.
224
+ # Feedback:
225
+ # ${reason.split('\n').slice(0, 10).join('\n# ')}
226
+ #
227
+ # Fix the issues and resubmit: hive pr submit -b ${candidate.branchName} -s ${candidate.storyId || 'STORY-ID'} --from ${devSession.name}`);
228
+ }
229
+ }
230
+ }
231
+ }
232
+ export async function handleRejectedPRs(ctx) {
233
+ // Phase 1: Read rejected PRs and update DB (brief lock)
234
+ const rejectedPRData = await ctx.withDb(async (db) => {
235
+ const rejectedPRs = getPullRequestsByStatus(db.db, 'rejected');
236
+ verboseLogCtx(ctx, `handleRejectedPRs: rejected=${rejectedPRs.length}`);
237
+ if (rejectedPRs.length === 0)
238
+ return [];
239
+ const prData = [];
240
+ for (const pr of rejectedPRs) {
241
+ if (pr.story_id) {
242
+ const storyId = pr.story_id;
243
+ await withTransaction(db.db, () => {
244
+ updateStory(db.db, storyId, { status: 'qa_failed' });
245
+ createLog(db.db, {
246
+ agentId: 'manager',
247
+ eventType: 'STORY_QA_FAILED',
248
+ message: `Story ${storyId} QA failed: ${pr.review_notes || 'See review comments'}`,
249
+ storyId: storyId,
250
+ });
251
+ }, () => db.save());
252
+ // Sync status change to Jira
253
+ await syncStatusForStory(ctx.root, db.db, storyId, 'qa_failed');
254
+ }
255
+ // Mark as closed to prevent re-notification spam
256
+ await withTransaction(db.db, () => {
257
+ updatePullRequest(db.db, pr.id, { status: 'closed' });
258
+ }, () => db.save());
259
+ prData.push({
260
+ id: pr.id,
261
+ storyId: pr.story_id,
262
+ branchName: pr.branch_name,
263
+ reviewNotes: pr.review_notes,
264
+ submittedBy: pr.submitted_by,
265
+ });
266
+ }
267
+ return prData;
268
+ });
269
+ if (rejectedPRData.length === 0)
270
+ return;
271
+ // Phase 2: Send tmux notifications (no lock needed)
272
+ let rejectionNotified = 0;
273
+ for (const pr of rejectedPRData) {
274
+ if (pr.submittedBy) {
275
+ const devSession = ctx.hiveSessions.find(s => s.name === pr.submittedBy);
276
+ if (devSession) {
277
+ verboseLogCtx(ctx, `handleRejectedPRs: notifying ${devSession.name} for pr=${pr.id}, story=${pr.storyId || '-'}`);
278
+ await sendManagerNudge(ctx, devSession.name, `# ⚠️ PR REJECTED - ACTION REQUIRED ⚠️
279
+ # Story: ${pr.storyId || 'Unknown'}
280
+ # Reason: ${pr.reviewNotes || 'See review comments'}
281
+ #
282
+ # You MUST fix this issue before doing anything else.
283
+ # Fix the issues and resubmit: hive pr submit -b ${pr.branchName} -s ${pr.storyId || 'STORY-ID'} --from ${devSession.name}`);
284
+ rejectionNotified++;
285
+ }
286
+ }
287
+ }
288
+ console.log(chalk.yellow(` Notified ${rejectionNotified} developer(s) of PR rejection(s)`));
289
+ }
290
+ //# sourceMappingURL=qa-review-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qa-review-handler.js","sourceRoot":"","sources":["../../../../src/cli/commands/manager/qa-review-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { HiveConfig } from '../../../config/schema.js';
2
+ import { AgentState } from '../../../state-detectors/types.js';
3
+ import { detectAgentState } from './agent-monitoring.js';
4
+ import type { ManagerCheckContext } from './types.js';
5
+ export interface ScreenStaticTracking {
6
+ fingerprint: string;
7
+ unchangedSinceMs: number;
8
+ lastAiAssessmentMs: number;
9
+ }
10
+ interface UnknownStateStuckHeuristicSnapshot {
11
+ state: AgentState;
12
+ isWaiting: boolean;
13
+ sessionUnchangedForMs: number;
14
+ staticInactivityThresholdMs: number;
15
+ }
16
+ interface StuckReminderDeferralSnapshot {
17
+ state: AgentState;
18
+ sessionUnchangedForMs: number;
19
+ staticInactivityThresholdMs: number;
20
+ }
21
+ export declare const screenStaticBySession: Map<string, ScreenStaticTracking>;
22
+ export declare function shouldTreatUnknownAsStuckWaiting(snapshot: UnknownStateStuckHeuristicSnapshot): boolean;
23
+ export declare function shouldDeferStuckReminderUntilStaticWindow(snapshot: StuckReminderDeferralSnapshot): boolean;
24
+ export declare function shouldIncludeProgressUpdates(config: HiveConfig): boolean;
25
+ export declare function isClassifierTimeoutReason(reason: string): boolean;
26
+ export declare function applyHumanInterventionStateOverride(ctx: ManagerCheckContext, sessionName: string, storyId: string | null, stateResult: ReturnType<typeof detectAgentState>, agentId?: string | null): Promise<ReturnType<typeof detectAgentState>>;
27
+ export declare function clearHumanIntervention(sessionName: string): void;
28
+ export declare function markClassifierTimeoutForHumanIntervention(ctx: ManagerCheckContext, sessionName: string, storyId: string, reason: string, agentId?: string | null): Promise<void>;
29
+ export declare function markDoneFalseForHumanIntervention(ctx: ManagerCheckContext, sessionName: string, storyId: string, reason: string, agentId?: string | null): Promise<void>;
30
+ export declare function getSessionStaticUnchangedForMs(sessionName: string, nowMs: number): number;
31
+ export {};
32
+ //# sourceMappingURL=stuck-story-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stuck-story-helpers.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/manager/stuck-story-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAO5D,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAe,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAWtD,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,UAAU,kCAAkC;IAC1C,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,2BAA2B,EAAE,MAAM,CAAC;CACrC;AAED,UAAU,6BAA6B;IACrC,KAAK,EAAE,UAAU,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,2BAA2B,EAAE,MAAM,CAAC;CACrC;AAED,eAAO,MAAM,qBAAqB,mCAA0C,CAAC;AAI7E,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,kCAAkC,GAC3C,OAAO,CAOT;AAED,wBAAgB,yCAAyC,CACvD,QAAQ,EAAE,6BAA6B,GACtC,OAAO,CAMT;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAExE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEjE;AAQD,wBAAsB,mCAAmC,CACvD,GAAG,EAAE,mBAAmB,EACxB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,WAAW,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EAChD,OAAO,GAAE,MAAM,GAAG,IAAW,GAC5B,OAAO,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAmD9C;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAGhE;AAED,wBAAsB,yCAAyC,CAC7D,GAAG,EAAE,mBAAmB,EACxB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAM,GAAG,IAAW,GAC5B,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAQD,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,mBAAmB,EACxB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAM,GAAG,IAAW,GAC5B,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzF"}
@@ -0,0 +1,163 @@
1
+ // Licensed under the Hungry Ghost Hive License. See LICENSE.
2
+ import { createEscalation, getActiveEscalationsForAgent, getPendingEscalations, } from '../../../db/queries/escalations.js';
3
+ import { createLog } from '../../../db/queries/logs.js';
4
+ import { AgentState } from '../../../state-detectors/types.js';
5
+ import { agentStates } from './agent-monitoring.js';
6
+ const CLASSIFIER_TIMEOUT_REASON_PREFIX = 'Classifier timeout';
7
+ const AI_DONE_FALSE_REASON_PREFIX = 'AI done=false escalation';
8
+ export const screenStaticBySession = new Map();
9
+ const classifierTimeoutInterventionsBySession = new Map();
10
+ const aiDoneFalseInterventionsBySession = new Map();
11
+ export function shouldTreatUnknownAsStuckWaiting(snapshot) {
12
+ const thresholdMs = Math.max(1, snapshot.staticInactivityThresholdMs);
13
+ return (snapshot.state === AgentState.UNKNOWN &&
14
+ !snapshot.isWaiting &&
15
+ snapshot.sessionUnchangedForMs >= thresholdMs);
16
+ }
17
+ export function shouldDeferStuckReminderUntilStaticWindow(snapshot) {
18
+ const thresholdMs = Math.max(1, snapshot.staticInactivityThresholdMs);
19
+ if (snapshot.state === AgentState.WORK_COMPLETE) {
20
+ return false;
21
+ }
22
+ return snapshot.sessionUnchangedForMs < thresholdMs;
23
+ }
24
+ export function shouldIncludeProgressUpdates(config) {
25
+ return config.integrations?.project_management?.provider !== 'none';
26
+ }
27
+ export function isClassifierTimeoutReason(reason) {
28
+ return /local classifier unavailable:.*timed out|command timed out/i.test(reason);
29
+ }
30
+ function formatClassifierTimeoutEscalationReason(storyId, reason) {
31
+ const singleLine = reason.replace(/\s+/g, ' ').trim();
32
+ const shortReason = singleLine.length > 240 ? `${singleLine.slice(0, 237)}...` : singleLine;
33
+ return `${CLASSIFIER_TIMEOUT_REASON_PREFIX}: manager completion classifier timed out for ${storyId}. Manual human intervention required. Detail: ${shortReason}`;
34
+ }
35
+ export async function applyHumanInterventionStateOverride(ctx, sessionName, storyId, stateResult, agentId = null) {
36
+ const timeoutIntervention = classifierTimeoutInterventionsBySession.get(sessionName);
37
+ if (timeoutIntervention && (!storyId || storyId !== timeoutIntervention.storyId)) {
38
+ classifierTimeoutInterventionsBySession.delete(sessionName);
39
+ }
40
+ const doneFalseIntervention = aiDoneFalseInterventionsBySession.get(sessionName);
41
+ if (doneFalseIntervention && (!storyId || storyId !== doneFalseIntervention.storyId)) {
42
+ aiDoneFalseInterventionsBySession.delete(sessionName);
43
+ }
44
+ const transientIntervention = [timeoutIntervention, doneFalseIntervention]
45
+ .filter((candidate) => Boolean(candidate && storyId && candidate.storyId === storyId))
46
+ .sort((a, b) => b.createdAtMs - a.createdAtMs)[0] ?? null;
47
+ const persistedIntervention = storyId === null
48
+ ? null
49
+ : await ctx.withDb(async (db) => {
50
+ return ((agentId ? getActiveEscalationsForAgent(db.db, agentId) : []).find(escalation => escalation.story_id === storyId &&
51
+ (escalation.reason.startsWith(CLASSIFIER_TIMEOUT_REASON_PREFIX) ||
52
+ escalation.reason.startsWith(AI_DONE_FALSE_REASON_PREFIX))) ??
53
+ getPendingEscalations(db.db).find(escalation => escalation.story_id === storyId &&
54
+ (escalation.reason.startsWith(CLASSIFIER_TIMEOUT_REASON_PREFIX) ||
55
+ escalation.reason.startsWith(AI_DONE_FALSE_REASON_PREFIX))) ??
56
+ null);
57
+ });
58
+ const interventionReason = transientIntervention?.reason || persistedIntervention?.reason || null;
59
+ if (!interventionReason) {
60
+ return stateResult;
61
+ }
62
+ return {
63
+ ...stateResult,
64
+ state: AgentState.ASKING_QUESTION,
65
+ needsHuman: true,
66
+ isWaiting: true,
67
+ reason: `Manual intervention required: ${interventionReason}`,
68
+ };
69
+ }
70
+ export function clearHumanIntervention(sessionName) {
71
+ classifierTimeoutInterventionsBySession.delete(sessionName);
72
+ aiDoneFalseInterventionsBySession.delete(sessionName);
73
+ }
74
+ export async function markClassifierTimeoutForHumanIntervention(ctx, sessionName, storyId, reason, agentId = null) {
75
+ const escalationReason = formatClassifierTimeoutEscalationReason(storyId, reason);
76
+ classifierTimeoutInterventionsBySession.set(sessionName, {
77
+ storyId,
78
+ reason: escalationReason,
79
+ createdAtMs: Date.now(),
80
+ });
81
+ await ctx.withDb(async (db) => {
82
+ const activeTimeoutEscalation = (agentId ? getActiveEscalationsForAgent(db.db, agentId) : []).some(escalation => escalation.reason.startsWith(CLASSIFIER_TIMEOUT_REASON_PREFIX));
83
+ if (!activeTimeoutEscalation) {
84
+ const escalation = createEscalation(db.db, {
85
+ storyId,
86
+ fromAgentId: agentId,
87
+ toAgentId: null,
88
+ reason: escalationReason,
89
+ });
90
+ createLog(db.db, {
91
+ agentId: 'manager',
92
+ storyId,
93
+ eventType: 'ESCALATION_CREATED',
94
+ status: 'error',
95
+ message: `${sessionName} requires human intervention: completion classifier timed out`,
96
+ metadata: {
97
+ escalation_id: escalation.id,
98
+ session_name: sessionName,
99
+ escalation_type: 'classifier_timeout',
100
+ },
101
+ });
102
+ db.save();
103
+ ctx.counters.escalationsCreated++;
104
+ ctx.escalatedSessions.add(sessionName);
105
+ }
106
+ });
107
+ const tracked = agentStates.get(sessionName);
108
+ if (tracked) {
109
+ tracked.lastState = AgentState.ASKING_QUESTION;
110
+ tracked.lastStateChangeTime = Date.now();
111
+ }
112
+ }
113
+ function formatDoneFalseEscalationReason(storyId, reason) {
114
+ const singleLine = reason.replace(/\s+/g, ' ').trim();
115
+ const shortReason = singleLine.length > 240 ? `${singleLine.slice(0, 237)}...` : singleLine;
116
+ return `${AI_DONE_FALSE_REASON_PREFIX}: manager AI assessment returned done=false for ${storyId} after nudge limit reached. Manual human intervention required. Detail: ${shortReason}`;
117
+ }
118
+ export async function markDoneFalseForHumanIntervention(ctx, sessionName, storyId, reason, agentId = null) {
119
+ const escalationReason = formatDoneFalseEscalationReason(storyId, reason);
120
+ aiDoneFalseInterventionsBySession.set(sessionName, {
121
+ storyId,
122
+ reason: escalationReason,
123
+ createdAtMs: Date.now(),
124
+ });
125
+ await ctx.withDb(async (db) => {
126
+ const hasActiveEscalation = (agentId ? getActiveEscalationsForAgent(db.db, agentId) : []).some(escalation => escalation.reason.startsWith(AI_DONE_FALSE_REASON_PREFIX));
127
+ if (!hasActiveEscalation) {
128
+ const escalation = createEscalation(db.db, {
129
+ storyId,
130
+ fromAgentId: agentId,
131
+ toAgentId: null,
132
+ reason: escalationReason,
133
+ });
134
+ createLog(db.db, {
135
+ agentId: 'manager',
136
+ storyId,
137
+ eventType: 'ESCALATION_CREATED',
138
+ status: 'error',
139
+ message: `${sessionName} requires human intervention: AI assessment reports blocked/incomplete after nudge limit`,
140
+ metadata: {
141
+ escalation_id: escalation.id,
142
+ session_name: sessionName,
143
+ escalation_type: 'ai_done_false',
144
+ },
145
+ });
146
+ db.save();
147
+ ctx.counters.escalationsCreated++;
148
+ ctx.escalatedSessions.add(sessionName);
149
+ }
150
+ });
151
+ const tracked = agentStates.get(sessionName);
152
+ if (tracked) {
153
+ tracked.lastState = AgentState.ASKING_QUESTION;
154
+ tracked.lastStateChangeTime = Date.now();
155
+ }
156
+ }
157
+ export function getSessionStaticUnchangedForMs(sessionName, nowMs) {
158
+ const tracking = screenStaticBySession.get(sessionName);
159
+ if (!tracking)
160
+ return 0;
161
+ return Math.max(0, nowMs - tracking.unchangedSinceMs);
162
+ }
163
+ //# sourceMappingURL=stuck-story-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stuck-story-helpers.js","sourceRoot":"","sources":["../../../../src/cli/commands/manager/stuck-story-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { StoryRow } from '../../../db/client.js';
2
+ import { type getAllAgents } from '../../../db/queries/agents.js';
3
+ import type { ManagerCheckContext } from './types.js';
4
+ export declare function nudgeStuckStories(ctx: ManagerCheckContext): Promise<void>;
5
+ export declare function autoProgressDoneStory(ctx: ManagerCheckContext, story: StoryRow, agent: ReturnType<typeof getAllAgents>[number], sessionName: string, reason: string, confidence: number): Promise<boolean>;
6
+ export declare function nudgeQAFailedStories(ctx: ManagerCheckContext): Promise<void>;
7
+ export declare function recoverUnassignedQAFailedStories(ctx: ManagerCheckContext): Promise<void>;
8
+ //# sourceMappingURL=stuck-story-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stuck-story-processor.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/manager/stuck-story-processor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA6BhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKtD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8R/E;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,EAC9C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAoGlB;AAkCD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiElF;AAED,wBAAsB,gCAAgC,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiE9F"}