connectonion 0.0.5 → 0.0.6

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.
package/dist/connect.d.ts CHANGED
@@ -1,23 +1,30 @@
1
1
  /**
2
- * @purpose Client for connecting to remote agents via WebSocket relay with real-time streaming and multi-turn session management
2
+ * @purpose Client for connecting to remote agents via WebSocket with automatic keep-alive, session recovery, and polling fallback
3
3
  * @llm-note
4
- * Dependencies: imports from [src/address.ts (AddressData, generate, load, sign, etc.)] | imported by [src/index.ts, src/react/index.ts, examples/connect-example.ts, tests/connect.test.ts] | tested by [tests/connect.test.ts]
5
- * Data flow: connect(address, options) → creates RemoteAgent → agent.input(prompt) → opens WebSocket → sends INPUT{type, input_id, to, prompt, session?, signature?} → receives stream events (tool_call, tool_result, thinking, assistant) → receives OUTPUT{result, session} → returns Response{text, done}
6
- * State/Effects: opens WebSocket connections | sends signed/unsigned messages | updates internal UI events array | syncs session from server | generates/loads Ed25519 keys | saves keys to localStorage (browser) or .co/keys/ (Node.js)
7
- * Integration: exposes connect(address, options), RemoteAgent class, Response, UIEvent types, AgentStatus | supports relay mode (wss://oo.openonion.ai) and direct mode (deployed agent URL) | Ed25519 signing for authentication | session persistence across calls
8
- * Performance: 60s timeout default | real-time WebSocket streaming | parallel tool execution on agent side | no client-side caching | auto-generates keys if missing
9
- * Errors: throws on timeout (60s default) | throws on WebSocket errors | throws on connection close before response | throws on ERROR messages from server | includes error context in messages
4
+ * Dependencies: imports from [src/address.ts (AddressData, generate, load, sign, etc.), src/types.ts (SessionStatus)] | imported by [src/index.ts, src/react/index.ts, examples/connect-example.ts, tests/connect.test.ts] | tested by [tests/connect.test.ts]
5
+ * Data flow: connect(address, options) → creates RemoteAgent → agent.input(prompt) → generates session_id (UUID) → saves to localStorage → opens WebSocket → sends INPUT{type, input_id, to, prompt, session{session_id}, signature?} → receives PING every 30s, responds with PONG → receives stream events (tool_call, tool_result, thinking, assistant) → receives OUTPUT{result, session_id, session} → clears localStorage → returns Response{text, done} | On disconnect/timeout: polls GET /sessions/{session_id} every 10s until result ready
6
+ * State/Effects: opens WebSocket connections | sends signed/unsigned messages | updates internal UI events array | syncs session from server | generates/loads Ed25519 keys | saves keys to localStorage (browser) or .co/keys/ (Node.js) | saves active session_id to localStorage for recovery | polls server via HTTP fetch on connection failure | health check interval detects dead connections
7
+ * Integration: exposes connect(address, options), RemoteAgent class, Response, ChatItem types, AgentStatus, ConnectOptions{enablePolling, pollIntervalMs, maxPollAttempts} | supports relay mode (wss://oo.openonion.ai) and direct mode (deployed agent URL) | Ed25519 signing for authentication | session persistence across calls | automatic recovery from network failures, timeouts, page refreshes
8
+ * Performance: 600s timeout default (10 min, up from 180s) | real-time WebSocket streaming | parallel tool execution on agent side | no client-side caching | auto-generates keys if missing | PING/PONG keep-alive every 30s | health check every 10s | polling fallback on failures | results persist 24h server-side
9
+ * Errors: throws on timeout (600s default) after polling exhausted | throws on WebSocket errors after polling attempt | throws on connection close after polling attempt | throws on ERROR messages from server | throws if session expired (404) during polling | includes error context in messages | graceful fallback to polling prevents data loss
10
10
  *
11
11
  * Architecture:
12
- * Client → /ws/input → Relay → forwards to Agent's /ws/announce connection
13
- * Agent processessends OUTPUT → Relay resolves pending_outputs future
14
- * Relay → forwards OUTPUT → Client receives response
12
+ * Normal Flow:
13
+ * Client /ws/input Relay → Agent → OUTPUT → Relay Client
14
+ *
15
+ * Keep-Alive:
16
+ * Server sends PING every 30s → Client responds PONG → Health check every 10s
17
+ *
18
+ * Recovery Flow (on disconnect/timeout):
19
+ * WebSocket fails → Poll GET /sessions/{session_id} every 10s → Status="done" → Return result
15
20
  *
16
21
  * Related Files:
17
22
  * - oo-api/relay/routes.py: Relay server WebSocket endpoints
18
23
  * - connectonion/network/connect.py: Python equivalent of this file
24
+ * - connectonion/network/asgi/websocket.py: Server-side PING sender
25
+ * - connectonion/network/host/session.py: SessionStorage for 24h TTL
19
26
  * - src/react/index.ts: useAgent hook built on RemoteAgent
20
- * - oo-chat/components/chat/use-agent-stream.ts: Direct WS alternative
27
+ * - src/types.ts: SessionStatus, PollResult interfaces
21
28
  */
22
29
  import * as address from './address';
23
30
  export type { AddressData } from './address';
@@ -31,43 +38,92 @@ export interface Response {
31
38
  text: string;
32
39
  done: boolean;
33
40
  }
34
- /** UI event types for rendering */
35
- export type UIEventType = 'user' | 'agent' | 'thinking' | 'tool_call' | 'ask_user';
36
- /** Base UI event with common fields */
37
- interface BaseUIEvent {
41
+ /** Chat item type */
42
+ export type ChatItemType = 'user' | 'agent' | 'thinking' | 'tool_call' | 'ask_user' | 'approval_needed' | 'onboard_required' | 'onboard_success' | 'intent' | 'eval' | 'compact';
43
+ /** Chat item - data for rendering one element in chat UI */
44
+ export type ChatItem = {
38
45
  id: string;
39
- type: UIEventType;
40
- }
41
- /** User message event */
42
- export interface UserUIEvent extends BaseUIEvent {
43
46
  type: 'user';
44
47
  content: string;
45
- }
46
- /** Agent response event */
47
- export interface AgentUIEvent extends BaseUIEvent {
48
+ } | {
49
+ id: string;
48
50
  type: 'agent';
49
51
  content: string;
50
- }
51
- /** Thinking indicator event */
52
- export interface ThinkingUIEvent extends BaseUIEvent {
52
+ } | {
53
+ id: string;
53
54
  type: 'thinking';
54
- }
55
- /** Tool execution event (merged from tool_call + tool_result) */
56
- export interface ToolCallUIEvent extends BaseUIEvent {
55
+ status: 'running' | 'done' | 'error';
56
+ model?: string;
57
+ duration_ms?: number;
58
+ content?: string;
59
+ kind?: string;
60
+ context_percent?: number;
61
+ usage?: {
62
+ input_tokens?: number;
63
+ output_tokens?: number;
64
+ prompt_tokens?: number;
65
+ completion_tokens?: number;
66
+ total_tokens?: number;
67
+ cost?: number;
68
+ };
69
+ } | {
70
+ id: string;
57
71
  type: 'tool_call';
58
72
  name: string;
59
73
  args?: Record<string, unknown>;
60
74
  status: 'running' | 'done' | 'error';
61
75
  result?: string;
62
76
  timing_ms?: number;
63
- }
64
- /** Ask user event */
65
- export interface AskUserUIEvent extends BaseUIEvent {
77
+ } | {
78
+ id: string;
66
79
  type: 'ask_user';
67
80
  text: string;
68
- }
69
- /** Union of all UI event types */
70
- export type UIEvent = UserUIEvent | AgentUIEvent | ThinkingUIEvent | ToolCallUIEvent | AskUserUIEvent;
81
+ options: string[];
82
+ multi_select: boolean;
83
+ } | {
84
+ id: string;
85
+ type: 'approval_needed';
86
+ tool: string;
87
+ arguments: Record<string, unknown>;
88
+ description?: string;
89
+ batch_remaining?: Array<{
90
+ tool: string;
91
+ arguments: string;
92
+ }>;
93
+ } | {
94
+ id: string;
95
+ type: 'onboard_required';
96
+ methods: string[];
97
+ paymentAmount?: number;
98
+ } | {
99
+ id: string;
100
+ type: 'onboard_success';
101
+ level: string;
102
+ message: string;
103
+ } | {
104
+ id: string;
105
+ type: 'intent';
106
+ status: 'analyzing' | 'understood';
107
+ ack?: string;
108
+ is_build?: boolean;
109
+ } | {
110
+ id: string;
111
+ type: 'eval';
112
+ status: 'evaluating' | 'done';
113
+ passed?: boolean;
114
+ summary?: string;
115
+ expected?: string;
116
+ eval_path?: string;
117
+ } | {
118
+ id: string;
119
+ type: 'compact';
120
+ status: 'compacting' | 'done' | 'error';
121
+ context_before?: number;
122
+ context_after?: number;
123
+ context_percent?: number;
124
+ message?: string;
125
+ error?: string;
126
+ };
71
127
  type WebSocketLike = {
72
128
  onopen: ((ev?: unknown) => unknown) | null;
73
129
  onmessage: ((ev: {
@@ -97,6 +153,12 @@ export interface ConnectOptions {
97
153
  directUrl?: string;
98
154
  /** Custom WebSocket constructor */
99
155
  wsCtor?: WebSocketCtor;
156
+ /** Enable polling fallback when WebSocket fails (default: true) */
157
+ enablePolling?: boolean;
158
+ /** Polling interval in milliseconds (default: 10000 / 10 seconds) */
159
+ pollIntervalMs?: number;
160
+ /** Maximum polling attempts (default: 30 / 5 minutes of polling) */
161
+ maxPollAttempts?: number;
100
162
  }
101
163
  /** Session state synced from server */
102
164
  export interface SessionState {
@@ -140,17 +202,36 @@ export declare class RemoteAgent {
140
202
  private _status;
141
203
  /** Session state synced from server */
142
204
  private _currentSession;
143
- /** UI events for rendering */
144
- private _uiEvents;
145
- /** Counter for generating UI event IDs */
205
+ /** Chat items for rendering */
206
+ private _chatItems;
207
+ /** Active WebSocket for sending responses (ask_user, approval_needed, onboard) */
208
+ private _activeWs;
209
+ /** Pending prompt for retry after onboard success */
210
+ private _pendingPrompt;
211
+ /** Pending input ID for retry after onboard success */
212
+ private _pendingInputId;
213
+ /** Pending session ID for retry after onboard success */
214
+ private _pendingSessionId;
215
+ /**
216
+ * Fallback counter for UI event IDs.
217
+ * Most events (thinking, tool_call, assistant) use backend-generated UUIDs.
218
+ * Counter is only used for client-only events (user input) that have no backend ID.
219
+ */
146
220
  private _uiIdCounter;
221
+ /** Polling configuration */
222
+ private _enablePolling;
223
+ private _pollIntervalMs;
224
+ private _maxPollAttempts;
225
+ /** Ping/pong health tracking */
226
+ private _lastPingTime;
227
+ private _healthCheckInterval;
147
228
  constructor(agentAddress: string, options?: ConnectOptions);
148
229
  /** Current status: 'idle' | 'working' | 'waiting' */
149
230
  get status(): AgentStatus;
150
231
  /** Session state synced from server (read-only) */
151
232
  get currentSession(): SessionState | null;
152
- /** UI events for rendering. One type = one component. */
153
- get ui(): UIEvent[];
233
+ /** Chat items for rendering. One type = one component. */
234
+ get ui(): ChatItem[];
154
235
  /** Clear session and UI state, start fresh */
155
236
  reset(): void;
156
237
  /** Alias for reset (backwards compatibility) */
@@ -160,7 +241,7 @@ export declare class RemoteAgent {
160
241
  * Returns Response with text and done flag.
161
242
  *
162
243
  * @param prompt - User's input
163
- * @param timeoutMs - Timeout in milliseconds (default: 60000)
244
+ * @param timeoutMs - Timeout in milliseconds (default: 600000 / 10 minutes)
164
245
  * @returns Response with text and done flag
165
246
  */
166
247
  input(prompt: string, timeoutMs?: number): Promise<Response>;
@@ -168,25 +249,80 @@ export declare class RemoteAgent {
168
249
  * Async version of input (same as input, for API consistency with Python).
169
250
  */
170
251
  inputAsync(prompt: string, timeoutMs?: number): Promise<Response>;
252
+ /**
253
+ * Respond to ask_user event.
254
+ * Only valid when status === 'waiting' after an ask_user event.
255
+ *
256
+ * @param answer - User's answer (string or array for multi-select)
257
+ */
258
+ respond(answer: string | string[]): void;
259
+ /**
260
+ * Respond to approval_needed event.
261
+ * Only valid when status === 'waiting' after an approval_needed event.
262
+ *
263
+ * @param approved - Whether the tool is approved
264
+ * @param scope - 'once' for single use, 'session' to remember for session
265
+ * @param mode - Rejection mode: 'reject_soft' (skip, agent continues), 'reject_hard' (stop loop), 'reject_explain' (explain to user first)
266
+ * @param feedback - Optional feedback for the agent on why rejected
267
+ */
268
+ respondToApproval(approved: boolean, scope?: 'once' | 'session', mode?: 'reject_soft' | 'reject_hard' | 'reject_explain', feedback?: string): void;
269
+ /**
270
+ * Submit onboard credentials (invite code or payment).
271
+ * Only valid when status === 'waiting' after an onboard_required event.
272
+ *
273
+ * @param options - Either inviteCode or payment
274
+ */
275
+ submitOnboard(options: {
276
+ inviteCode?: string;
277
+ payment?: number;
278
+ }): void;
171
279
  /**
172
280
  * Ensure keys are loaded or generated (lazy initialization).
173
281
  * Only runs once, on first connection attempt.
174
282
  */
175
283
  private _ensureKeys;
284
+ /**
285
+ * Poll for session result when WebSocket fails or times out.
286
+ * Repeatedly checks GET /sessions/{session_id} until result is ready.
287
+ */
288
+ private _pollForResult;
289
+ /**
290
+ * Save session ID to localStorage (browser only).
291
+ */
292
+ private _saveSessionId;
293
+ /**
294
+ * Clear session ID from localStorage (browser only).
295
+ */
296
+ private _clearSessionId;
297
+ /**
298
+ * Start health check interval to detect dead connections.
299
+ * Checks if PING received within 60 seconds, attempts reconnect if not.
300
+ */
301
+ private _startHealthCheck;
302
+ /**
303
+ * Stop health check interval.
304
+ */
305
+ private _stopHealthCheck;
176
306
  /**
177
307
  * Stream input to agent with real-time UI events.
178
308
  * Uses directUrl if provided, otherwise routes via relay.
179
309
  */
180
310
  private _streamInput;
311
+ /**
312
+ * Remove the optimistic thinking item (added for instant feedback).
313
+ */
314
+ private _removeOptimisticThinking;
181
315
  /**
182
316
  * Handle streaming event and update UI.
183
317
  * Merges tool_result into existing tool_call.
184
318
  */
185
319
  private _handleStreamEvent;
186
320
  /**
187
- * Add UI event with auto-generated ID if not present.
321
+ * Add chat item with ID for React keys.
322
+ * Backend events (thinking, tool_call, assistant) include UUID in event.id.
323
+ * Client-only events (user input) use fallback counter.
188
324
  */
189
- private _addUIEvent;
325
+ private _addChatItem;
190
326
  /** Sign a payload if keys are available */
191
327
  private _signPayload;
192
328
  toString(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"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"}