fix(extension): bypass 10-item limit of GetAllCascadeTrajectories by utilizing GetDiagnostics
This commit is contained in:
@@ -224,3 +224,8 @@
|
|||||||
- **원인**: ot.py의 chat_snapshot_scanner에서 파일을 순회 파싱할 때 내부의 .unlink() 과정에서 발생하는 예외나 discord.Embed 생성 예외 등을 루프 안에서 잡아주지 못함. 첫 에러 파일(poison pill)을 만나는 순간 루프 전체가 폭파되어 뒤쪽의 정상 파일들도 영원히 처리되지 않고 다음 폴 스케줄에서 다시 첫 파일에 막힘.
|
- **원인**: ot.py의 chat_snapshot_scanner에서 파일을 순회 파싱할 때 내부의 .unlink() 과정에서 발생하는 예외나 discord.Embed 생성 예외 등을 루프 안에서 잡아주지 못함. 첫 에러 파일(poison pill)을 만나는 순간 루프 전체가 폭파되어 뒤쪽의 정상 파일들도 영원히 처리되지 않고 다음 폴 스케줄에서 다시 첫 파일에 막힘.
|
||||||
- **해결**: 루프 내부에 except Exception을 추가하여 전역 예외를 잡아 방어. 실패한 파일은 glob에서 반복 시도되지 않게 .json.failed로 우회(rename)시켜 큐를 비워줌.
|
- **해결**: 루프 내부에 except Exception을 추가하여 전역 예외를 잡아 방어. 실패한 파일은 glob에서 반복 시도되지 않게 .json.failed로 우회(rename)시켜 큐를 비워줌.
|
||||||
- **주의**: 폴링/스캐너 or 루프 내부에서는 개별 아이템 파싱 단계에서 발생 가능한 모든 예외 상태에 대한 Defensive Catch 및 Continue(우회) 로직이 필수임.
|
- **주의**: 폴링/스캐너 or 루프 내부에서는 개별 아이템 파싱 단계에서 발생 가능한 모든 예외 상태에 대한 Defensive Catch 및 Continue(우회) 로직이 필수임.
|
||||||
|
### [2026-04-10] [Extension] GetAllCascadeTrajectories 10-Item Hard Limit Bypass (Signal Drop)
|
||||||
|
- **<2A><><EFBFBD><EFBFBD>**: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ۼ<EFBFBD><DBBC>ߴ<EFBFBD> { limit: 30 } <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>Ͱ<EFBFBD> LS <20>鿣<EFBFBD>忡<EFBFBD><E5BFA1> <20><><EFBFBD>õǾ<C3B5> <20>ֽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10<31><30> <20><><EFBFBD>ѿ<EFBFBD> <20>ɷ<EFBFBD> <20>߷<EFBFBD><DFB7><EFBFBD><EFBFBD><EFBFBD>. (Discord<72><64> <20><EFBFBD><DEBD><EFBFBD> <20><> <20><> <20><><EFBFBD>ڵ<EFBFBD> <20><> <20>Ѿ<EFBFBD><D1BE><EFBFBD>).
|
||||||
|
- **<2A><><EFBFBD><EFBFBD>**: GetAllCascadeTrajectories<65><73> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pagination <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰų<CFB0> <20><><EFBFBD><EFBFBD> 10 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD>.
|
||||||
|
- **<2A>ذ<EFBFBD>**: step-probe.ts<74><73><EFBFBD><EFBFBD> <20>⺻ GetAllCascadeTrajectories<65><73> <20><><EFBFBD>Ҿ<EFBFBD> <20><><EFBFBD><EFBFBD> Ʈ<><C6AE><EFBFBD><EFBFBD><EFBFBD>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> GetDiagnostics API<50><49> <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20>ֽ<EFBFBD> Session ID<49><44> <20><>ġ<EFBFBD><C4A1> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><>.
|
||||||
|
- **<2A><><EFBFBD><EFBFBD>**: LS Backend<6E><64><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RPC<50><43> <20>Ѱ<EFBFBD><D1B0><EFBFBD> Argument <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, <20><><EFBFBD><EFBFBD> GetDiagnostics <20><> <20>鵵<EFBFBD><E9B5B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0><EFBFBD><EFBFBD> <20><>.
|
||||||
|
|||||||
@@ -8,3 +8,4 @@
|
|||||||
| 002 | 16:05 | Gravity Bridge 빠른 응답 누락 오류 해결 (IDLE-to-IDLE 패스 로직 완화) | TBD | ✅ || 003 | 16:12 | [Bridge] DOM Observer <20><>Ž<EFBFBD><C5BD> <20><><EFBFBD><EFBFBD> (PATS <20><>Ȱ<EFBFBD><C8B0>ȭ)<29><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> <20>˸<EFBFBD> <20><><EFBFBD><EFBFBD> | TBD | ? |
|
| 002 | 16:05 | Gravity Bridge 빠른 응답 누락 오류 해결 (IDLE-to-IDLE 패스 로직 완화) | TBD | ✅ || 003 | 16:12 | [Bridge] DOM Observer <20><>Ž<EFBFBD><C5BD> <20><><EFBFBD><EFBFBD> (PATS <20><>Ȱ<EFBFBD><C8B0>ȭ)<29><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> <20>˸<EFBFBD> <20><><EFBFBD><EFBFBD> | TBD | ? |
|
||||||
|
|
||||||
| 004 | 16:31 | [Bot] chat_snapshot_scanner 미처리 예외 큐 막힘 현상 해결 및 Hermes Gateway 재시작 | TBD | ✅ |
|
| 004 | 16:31 | [Bot] chat_snapshot_scanner 미처리 예외 큐 막힘 현상 해결 및 Hermes Gateway 재시작 | TBD | ✅ |
|
||||||
|
| 005 | 16:50 | [Extension] GetAllCascadeTrajectories 10-Item Limit <20><>ȸ<EFBFBD><C8B8> GetDiagnostics <20><><EFBFBD><EFBFBD> <20><>ȸ <20><>ġ | TBD | ? |
|
||||||
|
|||||||
14
docs/devlog/entries/20260410-005.md
Normal file
14
docs/devlog/entries/20260410-005.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# GetAllCascadeTrajectories 10-Item Hard Limit Bypass
|
||||||
|
|
||||||
|
- **시간**: 2026-04-10
|
||||||
|
- **Commit**: TBD
|
||||||
|
- **Vikunja**: TBD
|
||||||
|
|
||||||
|
## 결정 사항
|
||||||
|
- `GetAllCascadeTrajectories` LS API의 `limit` 등 페이지네이션 파라미터가 백엔드에서 무시되어 최신 세션이 10개 제한에 잘려나가는 문제를 확인.
|
||||||
|
- `DOM observer`가 더 이상 작동하지 않는 상태(Empty 보디 이슈로 비활성화됨)에서, `step-probe.ts`마저 이 10개 한도 밖으로 밀려난 현재 세션(`activeSessionId`)을 발견하지 못해, 발생한 모든 채팅 이벤트 파일이 작성되지 않는 문제("단 한글자도 안 날아옴")의 근본 원인을 특정함.
|
||||||
|
- `GetDiagnostics` API를 사용하여 내부적으로 저장된 `recentTrajectories` 덤프 전체를 불러와, 기존 `GetAllCascadeTrajectories`의 결과를 병합/보완하도록 변경.
|
||||||
|
- 이를 통해 아무리 많은 수의 세션이 열려 있어도 현재 사용 중인 세션 ID를 식별 가능.
|
||||||
|
|
||||||
|
## 미완료
|
||||||
|
- 없음.
|
||||||
@@ -126,6 +126,22 @@ export function startHttpBridge(ctx: HttpBridgeContext, sdk: any): Promise<numbe
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (req.method === 'POST' && url.pathname === '/test-rpc') {
|
||||||
|
let rpcBody = '';
|
||||||
|
req.on('data', (c: string) => rpcBody += c);
|
||||||
|
req.on('end', async () => {
|
||||||
|
try {
|
||||||
|
const params = JSON.parse(rpcBody);
|
||||||
|
const result = await sdk.ls.rawRPC(params.method, params.args || {});
|
||||||
|
res.writeHead(200, {'Content-Type': 'application/json'});
|
||||||
|
res.end(typeof result === 'string' ? result : JSON.stringify(result));
|
||||||
|
} catch(e: any) {
|
||||||
|
res.writeHead(500); res.end(e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// GET /ping — health check
|
// GET /ping — health check
|
||||||
if (url.pathname === '/ping') {
|
if (url.pathname === '/ping') {
|
||||||
res.writeHead(200); res.end('pong');
|
res.writeHead(200); res.end('pong');
|
||||||
|
|||||||
@@ -208,10 +208,44 @@ function setupMonitor() {
|
|||||||
ctx.logToFile(`[POLL#${pollCount}] alive`);
|
ctx.logToFile(`[POLL#${pollCount}] alive`);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
// Fix (v0.5.14): Reverted 100-limit DoS but restored descending: true with a safe limit of 30
|
// Fix (v0.5.15): Bypass 10-Item Hard Limit of GetAllCascadeTrajectories.
|
||||||
const allTraj = await ctx.sdk.ls.rawRPC('GetAllCascadeTrajectories', { limit: 30, descending: true });
|
// We fetch GetDiagnostics to discover ALL recent sessions regardless of pagination.
|
||||||
if (!allTraj?.trajectorySummaries) {
|
let allTraj: any = { trajectorySummaries: {} };
|
||||||
if (pollCount <= 3) ctx.logToFile('[POLL] no trajectorySummaries');
|
try {
|
||||||
|
// Primary: Try fetching 100 trajectories (backend might ignore this and give 10)
|
||||||
|
const apiResult = await ctx.sdk.ls.rawRPC('GetAllCascadeTrajectories', { limit: 100, maxResults: 100, pageSize: 100, page_size: 100, descending: true });
|
||||||
|
if (apiResult?.trajectorySummaries) {
|
||||||
|
allTraj.trajectorySummaries = { ...apiResult.trajectorySummaries };
|
||||||
|
}
|
||||||
|
} catch (e: any) {
|
||||||
|
if (pollCount <= 3) ctx.logToFile(`[POLL] GetAllCascadeTrajectories failed: ${e.message}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Fallback / Augment: GetDiagnostics provides ALL recent sessions bypassing the hard limit
|
||||||
|
const diagRaw = await ctx.sdk.ls.rawRPC('GetDiagnostics', {});
|
||||||
|
const diag = typeof diagRaw === 'string' ? JSON.parse(diagRaw) : diagRaw;
|
||||||
|
const recent = diag.recentTrajectories || [];
|
||||||
|
for (const entry of recent) {
|
||||||
|
const sid = entry.googleAgentId;
|
||||||
|
if (sid && !allTraj.trajectorySummaries[sid]) {
|
||||||
|
allTraj.trajectorySummaries[sid] = {
|
||||||
|
status: entry.status || '',
|
||||||
|
stepCount: entry.lastStepIndex || 0,
|
||||||
|
lastModifiedTime: entry.lastModifiedTime || '',
|
||||||
|
summary: entry.summary || 'Untitled',
|
||||||
|
trajectoryMetadata: entry.trajectoryMetadata || {
|
||||||
|
workspaces: [{ workspaceFolderAbsoluteUri: entry.workspaceUri || '' }]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: any) {
|
||||||
|
if (pollCount <= 3) ctx.logToFile(`[POLL] GetDiagnostics fallback failed: ${e.message}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!allTraj?.trajectorySummaries || Object.keys(allTraj.trajectorySummaries).length === 0) {
|
||||||
|
if (pollCount <= 3) ctx.logToFile('[POLL] no trajectorySummaries found from any source');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user