fix(bridge): rawRPC direct polling + SDK analysis docs + trial-and-error log

- Root cause: getDiagnostics.lastStepIndex is stale, SDK EventMonitor cannot detect real-time step changes
- Fix: Direct rawRPC('GetCascadeTrajectorySteps') polling every 5s
- Relay: PLANNER_RESPONSE, NOTIFY_USER, TASK_BOUNDARY, WAITING steps
- Added: docs/discord-bridge-analysis.md (full SDK architecture analysis)
- Added: docs/devlog/entries/20260308-003.md (trial-and-error history)
- Added: antigravity-sdk-main/ source reference
- Vikunja: #252 done, #253 created, #251 commented
This commit is contained in:
2026-03-08 07:08:25 +09:00
parent 731dad35bf
commit c3964f8e7a
40 changed files with 11086 additions and 25 deletions

View File

@@ -0,0 +1,73 @@
/**
* Disposable pattern for resource cleanup.
*
* @module disposable
*/
/**
* An object that can release resources when no longer needed.
*/
export interface IDisposable {
dispose(): void;
}
/**
* Collects multiple disposables and disposes them all at once.
*
* @example
* ```typescript
* const store = new DisposableStore();
* store.add(someEventSub);
* store.add(anotherSub);
* // Later:
* store.dispose(); // cleans up everything
* ```
*/
export class DisposableStore implements IDisposable {
private readonly _disposables: IDisposable[] = [];
private _disposed = false;
/**
* Add a disposable to the store.
*
* @param disposable - The disposable to track
* @returns The same disposable (for chaining)
*/
add<T extends IDisposable>(disposable: T): T {
if (this._disposed) {
disposable.dispose();
console.warn('[AntigravitySDK] Adding disposable to already disposed store');
} else {
this._disposables.push(disposable);
}
return disposable;
}
/**
* Dispose all tracked disposables.
*/
dispose(): void {
if (this._disposed) {
return;
}
this._disposed = true;
for (const d of this._disposables) {
try {
d.dispose();
} catch (error) {
console.error('[AntigravitySDK] Dispose error:', error);
}
}
this._disposables.length = 0;
}
}
/**
* Creates a disposable from a cleanup function.
*
* @param fn - Cleanup function to call on dispose
*/
export function toDisposable(fn: () => void): IDisposable {
return { dispose: fn };
}