@supaku/agentfactory-server 0.7.35 → 0.7.36

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.
@@ -115,8 +115,15 @@ export declare function deleteSessionState(linearSessionId: string): Promise<boo
115
115
  * Get session state by issue ID
116
116
  * Useful when we have the issue but not the session ID
117
117
  *
118
+ * When multiple sessions exist for the same issue (e.g., one running + several
119
+ * failed), this function returns the most relevant one — preferring active
120
+ * sessions (running/claimed/pending) over inactive ones. Without this
121
+ * prioritization, an arbitrary first-match could hide a running session behind
122
+ * a failed one, causing the governor to re-dispatch work for an issue that
123
+ * already has an agent in-flight.
124
+ *
118
125
  * @param issueId - The Linear issue ID
119
- * @returns The most recent session state for this issue or null
126
+ * @returns The most relevant session state for this issue or null
120
127
  */
121
128
  export declare function getSessionStateByIssue(issueId: string): Promise<AgentSessionState | null>;
122
129
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"session-storage.d.ts","sourceRoot":"","sources":["../../src/session-storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-storage.d.ts","sourceRoot":"","sources":["../../src/session-storage.ts"],"names":[],"mappings":"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"}
@@ -216,8 +216,15 @@ export async function deleteSessionState(linearSessionId) {
216
216
  * Get session state by issue ID
217
217
  * Useful when we have the issue but not the session ID
218
218
  *
219
+ * When multiple sessions exist for the same issue (e.g., one running + several
220
+ * failed), this function returns the most relevant one — preferring active
221
+ * sessions (running/claimed/pending) over inactive ones. Without this
222
+ * prioritization, an arbitrary first-match could hide a running session behind
223
+ * a failed one, causing the governor to re-dispatch work for an issue that
224
+ * already has an agent in-flight.
225
+ *
219
226
  * @param issueId - The Linear issue ID
220
- * @returns The most recent session state for this issue or null
227
+ * @returns The most relevant session state for this issue or null
221
228
  */
222
229
  export async function getSessionStateByIssue(issueId) {
223
230
  if (!isRedisConfigured()) {
@@ -226,13 +233,22 @@ export async function getSessionStateByIssue(issueId) {
226
233
  // Scan for sessions with this issue ID
227
234
  // Note: This is less efficient than direct lookup, use sparingly
228
235
  const keys = await redisKeys(`${SESSION_KEY_PREFIX}*`);
236
+ const activeStatuses = ['running', 'claimed', 'pending'];
237
+ let fallback = null;
229
238
  for (const key of keys) {
230
239
  const state = await redisGet(key);
231
240
  if (state?.issueId === issueId) {
232
- return state;
241
+ // Prefer active sessions — return immediately if found
242
+ if (activeStatuses.includes(state.status)) {
243
+ return state;
244
+ }
245
+ // Keep first non-active match as fallback
246
+ if (!fallback) {
247
+ fallback = state;
248
+ }
233
249
  }
234
250
  }
235
- return null;
251
+ return fallback;
236
252
  }
237
253
  // ============================================
238
254
  // Worker Pool Operations
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supaku/agentfactory-server",
3
- "version": "0.7.35",
3
+ "version": "0.7.36",
4
4
  "type": "module",
5
5
  "description": "Webhook server and distributed worker pool for AgentFactory — Redis queues, issue locks, session management",
6
6
  "author": "Supaku (https://supaku.com)",
@@ -44,8 +44,8 @@
44
44
  ],
45
45
  "dependencies": {
46
46
  "ioredis": "^5.4.2",
47
- "@supaku/agentfactory": "0.7.35",
48
- "@supaku/agentfactory-linear": "0.7.35"
47
+ "@supaku/agentfactory": "0.7.36",
48
+ "@supaku/agentfactory-linear": "0.7.36"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@types/node": "^22.5.4",