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:
73
antigravity-sdk-main/src/core/disposable.ts
Normal file
73
antigravity-sdk-main/src/core/disposable.ts
Normal 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 };
|
||||
}
|
||||
Reference in New Issue
Block a user