connectonion 0.0.8 β 0.0.10
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/README.md +120 -1
- package/dist/connect.d.ts +57 -32
- package/dist/connect.d.ts.map +1 -1
- package/dist/connect.js +76 -69
- package/dist/console.d.ts +31 -0
- package/dist/console.d.ts.map +1 -1
- package/dist/console.js +31 -0
- package/dist/core/agent.d.ts +57 -0
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +57 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -0
- package/dist/llm/anthropic.d.ts +28 -0
- package/dist/llm/anthropic.d.ts.map +1 -1
- package/dist/llm/anthropic.js +28 -0
- package/dist/llm/gemini.d.ts +30 -0
- package/dist/llm/gemini.d.ts.map +1 -1
- package/dist/llm/gemini.js +30 -0
- package/dist/llm/index.d.ts +36 -0
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +36 -0
- package/dist/llm/llm-do.d.ts.map +1 -1
- package/dist/llm/llm-do.js +32 -0
- package/dist/llm/noop.d.ts +14 -0
- package/dist/llm/noop.d.ts.map +1 -1
- package/dist/llm/noop.js +14 -0
- package/dist/llm/openai.d.ts +39 -0
- package/dist/llm/openai.d.ts.map +1 -1
- package/dist/llm/openai.js +39 -0
- package/dist/react/index.d.ts +14 -24
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +50 -45
- package/dist/tools/email.d.ts.map +1 -1
- package/dist/tools/email.js +20 -0
- package/dist/tools/replay.d.ts +32 -0
- package/dist/tools/replay.d.ts.map +1 -1
- package/dist/tools/replay.js +32 -0
- package/dist/tools/tool-executor.d.ts +40 -0
- package/dist/tools/tool-executor.d.ts.map +1 -1
- package/dist/tools/tool-executor.js +40 -0
- package/dist/tools/tool-utils.d.ts +56 -0
- package/dist/tools/tool-utils.d.ts.map +1 -1
- package/dist/tools/tool-utils.js +56 -0
- package/dist/tools/xray.d.ts +48 -0
- package/dist/tools/xray.d.ts.map +1 -1
- package/dist/tools/xray.js +48 -0
- package/dist/trust/index.d.ts +27 -0
- package/dist/trust/index.d.ts.map +1 -1
- package/dist/trust/index.js +27 -0
- package/dist/trust/tools.d.ts.map +1 -1
- package/dist/trust/tools.js +26 -0
- package/dist/types.d.ts +40 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +40 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -205,7 +205,98 @@ While we recommend building agents in Python, you can also build simple agents d
|
|
|
205
205
|
|
|
206
206
|
If you encounter bugs building agents in TypeScript, please [report them on GitHub](https://github.com/openonion/connectonion-ts/issues).
|
|
207
207
|
|
|
208
|
-
## ποΈ
|
|
208
|
+
## ποΈ Architecture
|
|
209
|
+
|
|
210
|
+
### System Overview
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
214
|
+
β ConnectOnion TypeScript SDK β
|
|
215
|
+
β β
|
|
216
|
+
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββ β
|
|
217
|
+
β β Agent β β connect() β β llmDo() β β
|
|
218
|
+
β β (local AI) β β (remote) β β (one-shot LLM call) β β
|
|
219
|
+
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββββββββ¬ββββββββββββ β
|
|
220
|
+
β β β β β
|
|
221
|
+
β βΌ βΌ β β
|
|
222
|
+
β βββββββββββββββββββββββββββββββ β β
|
|
223
|
+
β β LLM Factory βββββββββββββββββββββ β
|
|
224
|
+
β β createLLM(model) β β
|
|
225
|
+
β ββββββββββββ¬βββββββββββββββββββ β
|
|
226
|
+
β βββββββββΌβββββββββββ¬βββββββββββββ β
|
|
227
|
+
β βΌ βΌ βΌ βΌ β
|
|
228
|
+
β Anthropic OpenAI Gemini OpenOnion β
|
|
229
|
+
β (claude-*) (gpt-*) (gemini-*) (co/*) β
|
|
230
|
+
β β
|
|
231
|
+
β ββββββββββββββββ ββββββββββββ βββββββββββββ βββββββββββββ β
|
|
232
|
+
β β Tool System β β Trust β β Console β β Xray β β
|
|
233
|
+
β β funcβschema β β Levels β β Logging β β Debugger β β
|
|
234
|
+
β ββββββββββββββββ ββββββββββββ βββββββββββββ βββββββββββββ β
|
|
235
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Agent Execution Flow
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
agent.input("What is 2+2?")
|
|
242
|
+
β
|
|
243
|
+
βΌ
|
|
244
|
+
βββββββββββββββββββ
|
|
245
|
+
β Init messages β [system prompt] + [user message]
|
|
246
|
+
ββββββββββ¬βββββββββ
|
|
247
|
+
β
|
|
248
|
+
βΌ
|
|
249
|
+
βββββββββββββββββββββββββββββββββββββββ
|
|
250
|
+
β Main Loop (max 10 iter) β
|
|
251
|
+
β β
|
|
252
|
+
β LLM.complete(messages, tools) β
|
|
253
|
+
β β β
|
|
254
|
+
β βββ No tool calls βββΆ EXIT β
|
|
255
|
+
β β β
|
|
256
|
+
β βββ Tool calls found: β
|
|
257
|
+
β Promise.all( β
|
|
258
|
+
β tool_1.run(args), β
|
|
259
|
+
β tool_2.run(args) β
|
|
260
|
+
β ) β
|
|
261
|
+
β β β
|
|
262
|
+
β βΌ β
|
|
263
|
+
β Append results β LOOP β
|
|
264
|
+
βββββββββββββββββββββββββββββββββββββββ
|
|
265
|
+
β
|
|
266
|
+
βΌ
|
|
267
|
+
Return final text response
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Tool Conversion
|
|
271
|
+
|
|
272
|
+
```
|
|
273
|
+
Your code SDK internals
|
|
274
|
+
|
|
275
|
+
function add(a: number, Tool {
|
|
276
|
+
b: number): number { βββΆ name: "add",
|
|
277
|
+
return a + b; description: "...",
|
|
278
|
+
} run(args) β add(a, b),
|
|
279
|
+
toFunctionSchema() β {
|
|
280
|
+
class API { type: "object",
|
|
281
|
+
search(q: string) {} βββΆ properties: {a: {type: "number"}, ...}
|
|
282
|
+
fetch(id: number) {} }
|
|
283
|
+
} }
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### LLM Provider Routing
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
createLLM(model)
|
|
290
|
+
β
|
|
291
|
+
βββ "co/*" βββΆ OpenAI LLM + OpenOnion baseURL
|
|
292
|
+
βββ "claude-*" βββΆ Anthropic LLM (default)
|
|
293
|
+
βββ "gpt-*" βββΆ OpenAI LLM
|
|
294
|
+
βββ "o*" βββΆ OpenAI LLM
|
|
295
|
+
βββ "gemini-*" βββΆ Gemini LLM
|
|
296
|
+
βββ (unknown) βββΆ Anthropic (fallback) or NoopLLM
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Project Structure
|
|
209
300
|
|
|
210
301
|
```
|
|
211
302
|
your-project/
|
|
@@ -218,6 +309,34 @@ your-project/
|
|
|
218
309
|
βββ tsconfig.json
|
|
219
310
|
```
|
|
220
311
|
|
|
312
|
+
### SDK Internal Structure
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
src/
|
|
316
|
+
βββ core/
|
|
317
|
+
β βββ agent.ts # Main Agent class (orchestrator)
|
|
318
|
+
βββ llm/
|
|
319
|
+
β βββ index.ts # LLM factory (routes model names)
|
|
320
|
+
β βββ anthropic.ts # Anthropic Claude provider (default)
|
|
321
|
+
β βββ openai.ts # OpenAI GPT/O-series provider
|
|
322
|
+
β βββ gemini.ts # Google Gemini provider
|
|
323
|
+
β βββ noop.ts # Fallback for missing config
|
|
324
|
+
β βββ llm-do.ts # One-shot llmDo() helper
|
|
325
|
+
βββ tools/
|
|
326
|
+
β βββ tool-utils.ts # Function β Tool conversion
|
|
327
|
+
β βββ tool-executor.ts # Execution + trace recording
|
|
328
|
+
β βββ xray.ts # Debug context injection (@xray)
|
|
329
|
+
β βββ replay.ts # Replay decorator for debugging
|
|
330
|
+
β βββ email.ts # Mock email tools for demos/tests
|
|
331
|
+
βββ trust/
|
|
332
|
+
β βββ index.ts # Trust levels (open/careful/strict)
|
|
333
|
+
β βββ tools.ts # Whitelist checks & verification
|
|
334
|
+
βββ connect.ts # Remote agent connection via relay
|
|
335
|
+
βββ console.ts # Dual logging (stderr + file)
|
|
336
|
+
βββ types.ts # Core TypeScript interfaces
|
|
337
|
+
βββ index.ts # Public API exports
|
|
338
|
+
```
|
|
339
|
+
|
|
221
340
|
---
|
|
222
341
|
|
|
223
342
|
## π¬ Join the Community
|
package/dist/connect.d.ts
CHANGED
|
@@ -1,30 +1,56 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @purpose Client for connecting to remote agents via WebSocket with automatic keep-alive, session recovery, and polling fallback
|
|
3
|
-
* @llm-note
|
|
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
3
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
4
|
+
* @graph Connection Modes
|
|
5
|
+
*
|
|
6
|
+
* connect('0xAddr', options?)
|
|
7
|
+
* β
|
|
8
|
+
* βββ directUrl set? ββyesβββΆ Direct: wss://{directUrl}/ws
|
|
9
|
+
* β
|
|
10
|
+
* βββ resolveEndpoint()? ββfoundβββΆ Direct: resolved wsUrl
|
|
11
|
+
* β
|
|
12
|
+
* βββ fallback βββΆ Relay: {relayUrl}/ws/input
|
|
14
13
|
*
|
|
15
|
-
*
|
|
16
|
-
* Server sends PING every 30s β Client responds PONG β Health check every 10s
|
|
14
|
+
* @graph Remote Agent Communication Flow
|
|
17
15
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
16
|
+
* Client (TS) Relay / Agent
|
|
17
|
+
* β β
|
|
18
|
+
* β connect('0xAddr') β
|
|
19
|
+
* β βββΆ RemoteAgent β
|
|
20
|
+
* β (lazy-load Ed25519 keys) β
|
|
21
|
+
* β β
|
|
22
|
+
* β agent.input("prompt") β
|
|
23
|
+
* β βββΆ WebSocket open ββββββββββΆ β
|
|
24
|
+
* β INPUT{prompt, sig, to} β βββΆ agent processes
|
|
25
|
+
* β β
|
|
26
|
+
* β βββ PING ββββββββββββββββββ β (every 30s keep-alive)
|
|
27
|
+
* β βββΆ PONG βββββββββββββββββββΆ β
|
|
28
|
+
* β β
|
|
29
|
+
* β βββ stream events βββββββββ β (thinking, tool_call,
|
|
30
|
+
* β (update agent.ui[]) β tool_result, assistant)
|
|
31
|
+
* β β
|
|
32
|
+
* β βββ OUTPUT{result, session} β β
|
|
33
|
+
* β ws.close() β
|
|
34
|
+
* βΌ βΌ
|
|
20
35
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
36
|
+
* @graph Recovery Flow (on disconnect/timeout)
|
|
37
|
+
*
|
|
38
|
+
* WebSocket fails
|
|
39
|
+
* β
|
|
40
|
+
* βΌ
|
|
41
|
+
* Poll GET /sessions/{session_id} (every 10s)
|
|
42
|
+
* β
|
|
43
|
+
* βββ status: "running" βββΆ retry poll
|
|
44
|
+
* βββ status: "done" βββΆ return result
|
|
45
|
+
* βββ 404 / max attempts βββΆ throw Error
|
|
46
|
+
*
|
|
47
|
+
* @llm-note
|
|
48
|
+
* 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]
|
|
49
|
+
* Data flow: connect(address, options) β creates RemoteAgent β agent.input(prompt) β generates session_id (UUID) β opens WebSocket β sends INPUT{type, input_id, to, prompt, session{session_id, messages}, signature?} β receives PING every 30s, responds with PONG β receives stream events (tool_call, tool_result, thinking, assistant) with session state β receives OUTPUT{result, session_id, session} β returns Response{text, done} | On disconnect/timeout: polls GET /sessions/{session_id} every 10s until result ready
|
|
50
|
+
* State/Effects: opens WebSocket connections | sends signed/unsigned messages | updates internal UI events array | syncs session from server events (in-memory) | generates/loads Ed25519 keys | saves keys to localStorage (browser) or .co/keys/ (Node.js) | polls server via HTTP fetch on connection failure | health check interval detects dead connections
|
|
51
|
+
* 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
|
|
52
|
+
* Performance: 600s timeout default (10 min) | real-time WebSocket streaming | PING/PONG keep-alive every 30s | health check every 10s | polling fallback on failures | results persist 24h server-side
|
|
53
|
+
* 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 | graceful fallback to polling prevents data loss
|
|
28
54
|
*/
|
|
29
55
|
import * as address from './address';
|
|
30
56
|
export type { AddressData } from './address';
|
|
@@ -45,6 +71,7 @@ export type ChatItem = {
|
|
|
45
71
|
id: string;
|
|
46
72
|
type: 'user';
|
|
47
73
|
content: string;
|
|
74
|
+
images?: string[];
|
|
48
75
|
} | {
|
|
49
76
|
id: string;
|
|
50
77
|
type: 'agent';
|
|
@@ -279,14 +306,20 @@ export declare class RemoteAgent {
|
|
|
279
306
|
* Returns Response with text and done flag.
|
|
280
307
|
*
|
|
281
308
|
* @param prompt - User's input
|
|
282
|
-
* @param
|
|
309
|
+
* @param options - Optional settings: images (base64 data URLs), timeoutMs
|
|
283
310
|
* @returns Response with text and done flag
|
|
284
311
|
*/
|
|
285
|
-
input(prompt: string,
|
|
312
|
+
input(prompt: string, options?: {
|
|
313
|
+
images?: string[];
|
|
314
|
+
timeoutMs?: number;
|
|
315
|
+
}): Promise<Response>;
|
|
286
316
|
/**
|
|
287
317
|
* Async version of input (same as input, for API consistency with Python).
|
|
288
318
|
*/
|
|
289
|
-
inputAsync(prompt: string,
|
|
319
|
+
inputAsync(prompt: string, options?: {
|
|
320
|
+
images?: string[];
|
|
321
|
+
timeoutMs?: number;
|
|
322
|
+
}): Promise<Response>;
|
|
290
323
|
/**
|
|
291
324
|
* Respond to ask_user event.
|
|
292
325
|
* Only valid when status === 'waiting' after an ask_user event.
|
|
@@ -324,14 +357,6 @@ export declare class RemoteAgent {
|
|
|
324
357
|
* Repeatedly checks GET /sessions/{session_id} until result is ready.
|
|
325
358
|
*/
|
|
326
359
|
private _pollForResult;
|
|
327
|
-
/**
|
|
328
|
-
* Save session ID to localStorage (browser only).
|
|
329
|
-
*/
|
|
330
|
-
private _saveSessionId;
|
|
331
|
-
/**
|
|
332
|
-
* Clear session ID from localStorage (browser only).
|
|
333
|
-
*/
|
|
334
|
-
private _clearSessionId;
|
|
335
360
|
/**
|
|
336
361
|
* Start health check interval to detect dead connections.
|
|
337
362
|
* Checks if PING received within 60 seconds, attempts reconnect if not.
|
package/dist/connect.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"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"}
|
package/dist/connect.js
CHANGED
|
@@ -1,31 +1,57 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* @purpose Client for connecting to remote agents via WebSocket with automatic keep-alive, session recovery, and polling fallback
|
|
4
|
-
* @llm-note
|
|
5
|
-
* 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]
|
|
6
|
-
* 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
|
|
7
|
-
* 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
|
|
8
|
-
* 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
|
|
9
|
-
* 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
|
|
10
|
-
* 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
|
|
11
4
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
5
|
+
* @graph Connection Modes
|
|
6
|
+
*
|
|
7
|
+
* connect('0xAddr', options?)
|
|
8
|
+
* β
|
|
9
|
+
* βββ directUrl set? ββyesβββΆ Direct: wss://{directUrl}/ws
|
|
10
|
+
* β
|
|
11
|
+
* βββ resolveEndpoint()? ββfoundβββΆ Direct: resolved wsUrl
|
|
12
|
+
* β
|
|
13
|
+
* βββ fallback βββΆ Relay: {relayUrl}/ws/input
|
|
15
14
|
*
|
|
16
|
-
*
|
|
17
|
-
* Server sends PING every 30s β Client responds PONG β Health check every 10s
|
|
15
|
+
* @graph Remote Agent Communication Flow
|
|
18
16
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
17
|
+
* Client (TS) Relay / Agent
|
|
18
|
+
* β β
|
|
19
|
+
* β connect('0xAddr') β
|
|
20
|
+
* β βββΆ RemoteAgent β
|
|
21
|
+
* β (lazy-load Ed25519 keys) β
|
|
22
|
+
* β β
|
|
23
|
+
* β agent.input("prompt") β
|
|
24
|
+
* β βββΆ WebSocket open ββββββββββΆ β
|
|
25
|
+
* β INPUT{prompt, sig, to} β βββΆ agent processes
|
|
26
|
+
* β β
|
|
27
|
+
* β βββ PING ββββββββββββββββββ β (every 30s keep-alive)
|
|
28
|
+
* β βββΆ PONG βββββββββββββββββββΆ β
|
|
29
|
+
* β β
|
|
30
|
+
* β βββ stream events βββββββββ β (thinking, tool_call,
|
|
31
|
+
* β (update agent.ui[]) β tool_result, assistant)
|
|
32
|
+
* β β
|
|
33
|
+
* β βββ OUTPUT{result, session} β β
|
|
34
|
+
* β ws.close() β
|
|
35
|
+
* βΌ βΌ
|
|
21
36
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
37
|
+
* @graph Recovery Flow (on disconnect/timeout)
|
|
38
|
+
*
|
|
39
|
+
* WebSocket fails
|
|
40
|
+
* β
|
|
41
|
+
* βΌ
|
|
42
|
+
* Poll GET /sessions/{session_id} (every 10s)
|
|
43
|
+
* β
|
|
44
|
+
* βββ status: "running" βββΆ retry poll
|
|
45
|
+
* βββ status: "done" βββΆ return result
|
|
46
|
+
* βββ 404 / max attempts βββΆ throw Error
|
|
47
|
+
*
|
|
48
|
+
* @llm-note
|
|
49
|
+
* 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]
|
|
50
|
+
* Data flow: connect(address, options) β creates RemoteAgent β agent.input(prompt) β generates session_id (UUID) β opens WebSocket β sends INPUT{type, input_id, to, prompt, session{session_id, messages}, signature?} β receives PING every 30s, responds with PONG β receives stream events (tool_call, tool_result, thinking, assistant) with session state β receives OUTPUT{result, session_id, session} β returns Response{text, done} | On disconnect/timeout: polls GET /sessions/{session_id} every 10s until result ready
|
|
51
|
+
* State/Effects: opens WebSocket connections | sends signed/unsigned messages | updates internal UI events array | syncs session from server events (in-memory) | generates/loads Ed25519 keys | saves keys to localStorage (browser) or .co/keys/ (Node.js) | polls server via HTTP fetch on connection failure | health check interval detects dead connections
|
|
52
|
+
* 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
|
|
53
|
+
* Performance: 600s timeout default (10 min) | real-time WebSocket streaming | PING/PONG keep-alive every 30s | health check every 10s | polling fallback on failures | results persist 24h server-side
|
|
54
|
+
* 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 | graceful fallback to polling prevents data loss
|
|
29
55
|
*/
|
|
30
56
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
31
57
|
if (k2 === undefined) k2 = k;
|
|
@@ -360,17 +386,19 @@ class RemoteAgent {
|
|
|
360
386
|
* Returns Response with text and done flag.
|
|
361
387
|
*
|
|
362
388
|
* @param prompt - User's input
|
|
363
|
-
* @param
|
|
389
|
+
* @param options - Optional settings: images (base64 data URLs), timeoutMs
|
|
364
390
|
* @returns Response with text and done flag
|
|
365
391
|
*/
|
|
366
|
-
async input(prompt,
|
|
367
|
-
|
|
392
|
+
async input(prompt, options) {
|
|
393
|
+
const timeoutMs = options?.timeoutMs ?? 600000;
|
|
394
|
+
const images = options?.images;
|
|
395
|
+
return this._streamInput(prompt, timeoutMs, images);
|
|
368
396
|
}
|
|
369
397
|
/**
|
|
370
398
|
* Async version of input (same as input, for API consistency with Python).
|
|
371
399
|
*/
|
|
372
|
-
async inputAsync(prompt,
|
|
373
|
-
return this.input(prompt,
|
|
400
|
+
async inputAsync(prompt, options) {
|
|
401
|
+
return this.input(prompt, options);
|
|
374
402
|
}
|
|
375
403
|
/**
|
|
376
404
|
* Respond to ask_user event.
|
|
@@ -493,32 +521,6 @@ class RemoteAgent {
|
|
|
493
521
|
}
|
|
494
522
|
throw new Error('Polling timeout: Result not ready after maximum attempts');
|
|
495
523
|
}
|
|
496
|
-
/**
|
|
497
|
-
* Save session ID to localStorage (browser only).
|
|
498
|
-
*/
|
|
499
|
-
_saveSessionId(sessionId) {
|
|
500
|
-
if (isBrowserEnv() && typeof globalThis !== 'undefined' && 'localStorage' in globalThis) {
|
|
501
|
-
try {
|
|
502
|
-
globalThis.localStorage.setItem('connectonion_active_session', sessionId);
|
|
503
|
-
}
|
|
504
|
-
catch {
|
|
505
|
-
// Ignore localStorage errors
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
/**
|
|
510
|
-
* Clear session ID from localStorage (browser only).
|
|
511
|
-
*/
|
|
512
|
-
_clearSessionId() {
|
|
513
|
-
if (isBrowserEnv() && typeof globalThis !== 'undefined' && 'localStorage' in globalThis) {
|
|
514
|
-
try {
|
|
515
|
-
globalThis.localStorage.removeItem('connectonion_active_session');
|
|
516
|
-
}
|
|
517
|
-
catch {
|
|
518
|
-
// Ignore localStorage errors
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
524
|
/**
|
|
523
525
|
* Start health check interval to detect dead connections.
|
|
524
526
|
* Checks if PING received within 60 seconds, attempts reconnect if not.
|
|
@@ -538,16 +540,13 @@ class RemoteAgent {
|
|
|
538
540
|
if (this._enablePolling) {
|
|
539
541
|
this._pollForResult(sessionId)
|
|
540
542
|
.then((result) => {
|
|
541
|
-
this._clearSessionId();
|
|
542
543
|
resolve({ text: result, done: true });
|
|
543
544
|
})
|
|
544
545
|
.catch((pollError) => {
|
|
545
|
-
this._clearSessionId();
|
|
546
546
|
reject(new Error(`Connection health check failed and polling failed: ${pollError}`));
|
|
547
547
|
});
|
|
548
548
|
}
|
|
549
549
|
else {
|
|
550
|
-
this._clearSessionId();
|
|
551
550
|
reject(new Error('Connection health check failed: No PING received for 60 seconds'));
|
|
552
551
|
}
|
|
553
552
|
}
|
|
@@ -584,21 +583,20 @@ class RemoteAgent {
|
|
|
584
583
|
* Stream input to agent with real-time UI events.
|
|
585
584
|
* Uses directUrl if provided, otherwise tries auto-discovery, then falls back to relay.
|
|
586
585
|
*/
|
|
587
|
-
async _streamInput(prompt, timeoutMs) {
|
|
586
|
+
async _streamInput(prompt, timeoutMs, images) {
|
|
588
587
|
// Lazy-load keys on first use
|
|
589
588
|
this._ensureKeys();
|
|
590
589
|
// Try endpoint resolution (once, cached)
|
|
591
590
|
await this._tryResolveEndpoint();
|
|
592
591
|
// Add user event to UI
|
|
593
|
-
this._addChatItem({ type: 'user', content: prompt });
|
|
592
|
+
this._addChatItem({ type: 'user', content: prompt, images });
|
|
594
593
|
// Add optimistic thinking (shows immediately, removed when real events arrive)
|
|
595
594
|
this._addChatItem({ type: 'thinking', id: '__optimistic__', status: 'running' });
|
|
596
595
|
// Set status to working
|
|
597
596
|
this._status = 'working';
|
|
598
597
|
const inputId = generateUUID();
|
|
599
|
-
//
|
|
598
|
+
// Reuse existing session_id or generate new one for tracking and polling fallback
|
|
600
599
|
const sessionId = this._currentSession?.session_id || generateUUID();
|
|
601
|
-
this._saveSessionId(sessionId);
|
|
602
600
|
// Choose connection mode: direct (explicit or resolved) or via relay
|
|
603
601
|
let wsUrl;
|
|
604
602
|
let isDirect = false;
|
|
@@ -634,16 +632,16 @@ class RemoteAgent {
|
|
|
634
632
|
if (this._enablePolling) {
|
|
635
633
|
try {
|
|
636
634
|
const result = await this._pollForResult(sessionId);
|
|
637
|
-
|
|
635
|
+
// Don't clear session - keep for next message
|
|
638
636
|
resolve({ text: result, done: true });
|
|
639
637
|
}
|
|
640
638
|
catch (pollError) {
|
|
641
|
-
|
|
639
|
+
// Don't clear session - keep for retry with context
|
|
642
640
|
reject(new Error(`Connection timed out and polling failed: ${pollError}`));
|
|
643
641
|
}
|
|
644
642
|
}
|
|
645
643
|
else {
|
|
646
|
-
|
|
644
|
+
// Don't clear session - keep for retry with context
|
|
647
645
|
reject(new Error('Connection timed out'));
|
|
648
646
|
}
|
|
649
647
|
}
|
|
@@ -667,6 +665,10 @@ class RemoteAgent {
|
|
|
667
665
|
prompt,
|
|
668
666
|
...signed,
|
|
669
667
|
};
|
|
668
|
+
// Add images if provided
|
|
669
|
+
if (images && images.length > 0) {
|
|
670
|
+
inputMessage.images = images;
|
|
671
|
+
}
|
|
670
672
|
// Only include 'to' for relay mode
|
|
671
673
|
if (!isDirect) {
|
|
672
674
|
inputMessage.to = this.address;
|
|
@@ -720,6 +722,10 @@ class RemoteAgent {
|
|
|
720
722
|
data?.type === 'intent' || data?.type === 'eval' || data?.type === 'compact' ||
|
|
721
723
|
data?.type === 'tool_blocked') {
|
|
722
724
|
this._handleStreamEvent(data);
|
|
725
|
+
// Sync session state from each event (client is source of truth)
|
|
726
|
+
if (data.session) {
|
|
727
|
+
this._currentSession = data.session;
|
|
728
|
+
}
|
|
723
729
|
}
|
|
724
730
|
// Handle ask_user event (agent needs more input)
|
|
725
731
|
// Keep WebSocket OPEN - user will respond via respond() method
|
|
@@ -807,6 +813,7 @@ class RemoteAgent {
|
|
|
807
813
|
settled = true;
|
|
808
814
|
clearTimeout(timer);
|
|
809
815
|
this._stopHealthCheck();
|
|
816
|
+
this._removeOptimisticThinking();
|
|
810
817
|
this._status = 'idle';
|
|
811
818
|
// Sync session from server
|
|
812
819
|
if (data.session) {
|
|
@@ -821,7 +828,7 @@ class RemoteAgent {
|
|
|
821
828
|
}
|
|
822
829
|
}
|
|
823
830
|
this._activeWs = null; // Clear before close
|
|
824
|
-
|
|
831
|
+
// Don't clear session - keep for next message in conversation
|
|
825
832
|
try {
|
|
826
833
|
ws.close();
|
|
827
834
|
}
|
|
@@ -835,7 +842,7 @@ class RemoteAgent {
|
|
|
835
842
|
this._stopHealthCheck();
|
|
836
843
|
this._status = 'idle';
|
|
837
844
|
this._activeWs = null; // Clear before close
|
|
838
|
-
|
|
845
|
+
// Don't clear session - keep for retry with context
|
|
839
846
|
try {
|
|
840
847
|
ws.close();
|
|
841
848
|
}
|
|
@@ -848,7 +855,7 @@ class RemoteAgent {
|
|
|
848
855
|
clearTimeout(timer);
|
|
849
856
|
this._stopHealthCheck();
|
|
850
857
|
this._status = 'idle';
|
|
851
|
-
|
|
858
|
+
// Don't clear session - keep for retry with context
|
|
852
859
|
try {
|
|
853
860
|
ws.close();
|
|
854
861
|
}
|
|
@@ -871,7 +878,7 @@ class RemoteAgent {
|
|
|
871
878
|
if (this._enablePolling) {
|
|
872
879
|
try {
|
|
873
880
|
const result = await this._pollForResult(sessionId);
|
|
874
|
-
|
|
881
|
+
// Don't clear session - keep for next message
|
|
875
882
|
resolve({ text: result, done: true });
|
|
876
883
|
return;
|
|
877
884
|
}
|
|
@@ -879,7 +886,7 @@ class RemoteAgent {
|
|
|
879
886
|
// Polling failed, fall through to original error
|
|
880
887
|
}
|
|
881
888
|
}
|
|
882
|
-
|
|
889
|
+
// Don't clear session - keep for retry with context
|
|
883
890
|
reject(new Error(`WebSocket error: ${String(err)}`));
|
|
884
891
|
};
|
|
885
892
|
ws.onclose = async () => {
|
|
@@ -893,7 +900,7 @@ class RemoteAgent {
|
|
|
893
900
|
if (this._enablePolling) {
|
|
894
901
|
try {
|
|
895
902
|
const result = await this._pollForResult(sessionId);
|
|
896
|
-
|
|
903
|
+
// Don't clear session - keep for next message
|
|
897
904
|
resolve({ text: result, done: true });
|
|
898
905
|
return;
|
|
899
906
|
}
|
|
@@ -901,7 +908,7 @@ class RemoteAgent {
|
|
|
901
908
|
// Polling failed, fall through to original error
|
|
902
909
|
}
|
|
903
910
|
}
|
|
904
|
-
|
|
911
|
+
// Don't clear session - keep for retry with context
|
|
905
912
|
reject(new Error('Connection closed before response'));
|
|
906
913
|
}
|
|
907
914
|
};
|
package/dist/console.d.ts
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @purpose Dual-output logging system (terminal + optional file) that mirrors Python SDK UX with colored terminal output and @xray tool tracing
|
|
3
|
+
*
|
|
4
|
+
* @graph Dual Output Flow
|
|
5
|
+
*
|
|
6
|
+
* Agent / Tool Executor
|
|
7
|
+
* β
|
|
8
|
+
* βΌ
|
|
9
|
+
* console.print(message)
|
|
10
|
+
* β
|
|
11
|
+
* ββββββββββββββββββββββββββββββββ
|
|
12
|
+
* βΌ βΌ
|
|
13
|
+
* ββββββββββββββββββββ βββββββββββββββββββββββββ
|
|
14
|
+
* β stderr (TTY) β β Log File (optional) β
|
|
15
|
+
* β β β β
|
|
16
|
+
* β [HH:MM:SS] β β .co/logs/{name}.log β
|
|
17
|
+
* β + ANSI colors β β plain text, no ANSI β
|
|
18
|
+
* β + dim timestamp β β + [timestamp] prefix β
|
|
19
|
+
* ββββββββββββββββββββ βββββββββββββββββββββββββ
|
|
20
|
+
*
|
|
21
|
+
* @graph @xray Output Block
|
|
22
|
+
*
|
|
23
|
+
* printXray(toolName, args, result, timing, context)
|
|
24
|
+
* β
|
|
25
|
+
* βΌ
|
|
26
|
+
* βββββββββββββββββββββββββββββββββββββββββ
|
|
27
|
+
* β @xray: toolName β
|
|
28
|
+
* β agent: myAgent iter: 3 β
|
|
29
|
+
* β args: { query: "hello" } β
|
|
30
|
+
* β result: "world" β
|
|
31
|
+
* β timing: 42ms β
|
|
32
|
+
* βββββββββββββββββββββββββββββββββββββββββ
|
|
33
|
+
*
|
|
3
34
|
* @llm-note
|
|
4
35
|
* Dependencies: imports from [node:fs, node:path] | imported by [src/core/agent.ts, src/tools/tool-executor.ts] | tested by agent tests
|
|
5
36
|
* Data flow: receives log messages/xray traces β formats with timestamps/colors β writes to stderr + optional file (.co/logs/{name}.log)
|
package/dist/console.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../src/console.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAKH,qBAAa,OAAO;IAClB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,YAAY,CAAU;gBAElB,OAAO,CAAC,EAAE,MAAM;IAM5B,OAAO,CAAC,WAAW;IASnB,KAAK,CAAC,OAAO,EAAE,MAAM;IAUrB,SAAS,CACP,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,MAAM,EAAE,GAAG,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAgBvE,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,IAAI;CACb"}
|