oui-spec 0.1.0 → 0.2.0
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 +95 -10
- package/dist/chunk-5TQ6AVQH.cjs +108 -0
- package/dist/chunk-5TQ6AVQH.cjs.map +1 -0
- package/dist/{chunk-LEXIU2MH.cjs → chunk-HK7OXB2W.cjs} +74 -7
- package/dist/chunk-HK7OXB2W.cjs.map +1 -0
- package/dist/{chunk-JO5LGOB6.js → chunk-ILUTAHUJ.js} +74 -8
- package/dist/chunk-ILUTAHUJ.js.map +1 -0
- package/dist/{chunk-WZXUKJ7E.cjs → chunk-MTMEW6MM.cjs} +2 -106
- package/dist/chunk-MTMEW6MM.cjs.map +1 -0
- package/dist/chunk-O6EI77LD.js +106 -0
- package/dist/chunk-O6EI77LD.js.map +1 -0
- package/dist/{chunk-7EXSMPGR.js → chunk-YDMGV72W.js} +3 -106
- package/dist/chunk-YDMGV72W.js.map +1 -0
- package/dist/core/index.cjs +7 -2
- package/dist/core/index.d.cts +116 -102
- package/dist/core/index.d.ts +116 -102
- package/dist/core/index.js +2 -1
- package/dist/define-surface-D6XPtoqu.d.cts +151 -0
- package/dist/define-surface-DXBop-uB.d.ts +151 -0
- package/dist/index.cjs +10 -5
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +3 -2
- package/dist/react/index.d.cts +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/transport/index.cjs +4 -3
- package/dist/transport/index.d.cts +4 -77
- package/dist/transport/index.d.ts +4 -77
- package/dist/transport/index.js +2 -1
- package/dist/websocket-CiWvkaz_.d.ts +78 -0
- package/dist/websocket-CrI0yRNo.d.cts +78 -0
- package/package.json +4 -3
- package/dist/chunk-7EXSMPGR.js.map +0 -1
- package/dist/chunk-JO5LGOB6.js.map +0 -1
- package/dist/chunk-LEXIU2MH.cjs.map +0 -1
- package/dist/chunk-WZXUKJ7E.cjs.map +0 -1
|
@@ -1,79 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* OUI Transport — the wire protocol between agent runtime and surfaces.
|
|
5
|
-
*
|
|
6
|
-
* Two one-way channels:
|
|
7
|
-
* - Dispatch channel (server → client): sends action instructions
|
|
8
|
-
* - Observation channel (client → server): pushes state updates
|
|
9
|
-
*
|
|
10
|
-
* NO request/response. NO correlation IDs. NO waiting.
|
|
11
|
-
* The Lambda dispatches and terminates. The browser processes and pushes state.
|
|
12
|
-
*/
|
|
13
|
-
interface OUITransport {
|
|
14
|
-
/** Dispatch an action to a surface (one-way, fire-and-forget) */
|
|
15
|
-
dispatch(surfaceId: string, actionId: string, params: Record<string, unknown>): void;
|
|
16
|
-
/** Receive dispatched actions (surface/client side) */
|
|
17
|
-
onAction(handler: OUIActionHandler): () => void;
|
|
18
|
-
/** Push an observation update from the surface to the agent runtime */
|
|
19
|
-
pushObservation(update: OUIObservationUpdate): void;
|
|
20
|
-
/** Receive observation updates (runtime/server side) */
|
|
21
|
-
onObservation(handler: OUIObservationHandler): () => void;
|
|
22
|
-
/** Register a surface manifest (client → server) */
|
|
23
|
-
registerSurface(surface: OUISurface): void;
|
|
24
|
-
/** Deregister a surface (client → server) */
|
|
25
|
-
deregisterSurface(surfaceId: string): void;
|
|
26
|
-
/** Receive surface registrations (server side) */
|
|
27
|
-
onSurfaceRegister(handler: (surface: OUISurface) => void): () => void;
|
|
28
|
-
/** Receive surface deregistrations (server side) */
|
|
29
|
-
onSurfaceDeregister(handler: (surfaceId: string) => void): () => void;
|
|
30
|
-
readonly connected: boolean;
|
|
31
|
-
connect(): Promise<void>;
|
|
32
|
-
disconnect(): void;
|
|
33
|
-
onConnectionChange(handler: (connected: boolean) => void): () => void;
|
|
34
|
-
}
|
|
35
|
-
/** Handler for incoming action dispatches (client side) */
|
|
36
|
-
type OUIActionHandler = (surfaceId: string, actionId: string, params: Record<string, unknown>) => void;
|
|
37
|
-
/** Handler for incoming observation updates (server side) */
|
|
38
|
-
type OUIObservationHandler = (update: OUIObservationUpdate) => void;
|
|
39
|
-
/**
|
|
40
|
-
* Transport configuration options.
|
|
41
|
-
*/
|
|
42
|
-
interface OUITransportConfig {
|
|
43
|
-
/** Namespace prefix for events (default: 'oui') */
|
|
44
|
-
namespace?: string;
|
|
45
|
-
/** Connection timeout in ms */
|
|
46
|
-
connectTimeoutMs?: number;
|
|
47
|
-
/** Whether to buffer dispatches while disconnected */
|
|
48
|
-
bufferWhileDisconnected?: boolean;
|
|
49
|
-
/** Max buffer size (messages dropped after this) */
|
|
50
|
-
maxBufferSize?: number;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* WebSocket transport using Socket.IO.
|
|
55
|
-
* Maps OUI protocol events to socket events with a configurable namespace prefix.
|
|
56
|
-
*
|
|
57
|
-
* Events emitted:
|
|
58
|
-
* {ns}:dispatch — action dispatch (server → client)
|
|
59
|
-
* {ns}:observation — observation update (client → server)
|
|
60
|
-
* {ns}:surface:register — surface registration (client → server)
|
|
61
|
-
* {ns}:surface:deregister — surface deregistration (client → server)
|
|
62
|
-
*/
|
|
63
|
-
declare function createWebSocketTransport(socket: SocketLike, config?: OUITransportConfig): OUITransport;
|
|
64
|
-
/**
|
|
65
|
-
* Minimal socket interface — compatible with Socket.IO client or server socket.
|
|
66
|
-
* Only the methods OUI actually uses.
|
|
67
|
-
*/
|
|
68
|
-
interface SocketLike {
|
|
69
|
-
readonly connected?: boolean;
|
|
70
|
-
emit(event: string, data: unknown): void;
|
|
71
|
-
on(event: string, handler: (...args: any[]) => void): void;
|
|
72
|
-
off(event: string, handler: (...args: any[]) => void): void;
|
|
73
|
-
once(event: string, handler: (...args: any[]) => void): void;
|
|
74
|
-
connect?(): void;
|
|
75
|
-
disconnect?(): void;
|
|
76
|
-
}
|
|
1
|
+
import { b as OUITransport } from '../websocket-CrI0yRNo.cjs';
|
|
2
|
+
export { O as OUIActionHandler, a as OUIObservationHandler, c as OUITransportConfig, S as SocketLike, d as createWebSocketTransport } from '../websocket-CrI0yRNo.cjs';
|
|
3
|
+
import '../spec/index.cjs';
|
|
77
4
|
|
|
78
5
|
/**
|
|
79
6
|
* Direct transport — for same-process communication.
|
|
@@ -88,4 +15,4 @@ declare function createDirectTransportPair(): {
|
|
|
88
15
|
client: OUITransport;
|
|
89
16
|
};
|
|
90
17
|
|
|
91
|
-
export {
|
|
18
|
+
export { OUITransport, createDirectTransportPair };
|
|
@@ -1,79 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* OUI Transport — the wire protocol between agent runtime and surfaces.
|
|
5
|
-
*
|
|
6
|
-
* Two one-way channels:
|
|
7
|
-
* - Dispatch channel (server → client): sends action instructions
|
|
8
|
-
* - Observation channel (client → server): pushes state updates
|
|
9
|
-
*
|
|
10
|
-
* NO request/response. NO correlation IDs. NO waiting.
|
|
11
|
-
* The Lambda dispatches and terminates. The browser processes and pushes state.
|
|
12
|
-
*/
|
|
13
|
-
interface OUITransport {
|
|
14
|
-
/** Dispatch an action to a surface (one-way, fire-and-forget) */
|
|
15
|
-
dispatch(surfaceId: string, actionId: string, params: Record<string, unknown>): void;
|
|
16
|
-
/** Receive dispatched actions (surface/client side) */
|
|
17
|
-
onAction(handler: OUIActionHandler): () => void;
|
|
18
|
-
/** Push an observation update from the surface to the agent runtime */
|
|
19
|
-
pushObservation(update: OUIObservationUpdate): void;
|
|
20
|
-
/** Receive observation updates (runtime/server side) */
|
|
21
|
-
onObservation(handler: OUIObservationHandler): () => void;
|
|
22
|
-
/** Register a surface manifest (client → server) */
|
|
23
|
-
registerSurface(surface: OUISurface): void;
|
|
24
|
-
/** Deregister a surface (client → server) */
|
|
25
|
-
deregisterSurface(surfaceId: string): void;
|
|
26
|
-
/** Receive surface registrations (server side) */
|
|
27
|
-
onSurfaceRegister(handler: (surface: OUISurface) => void): () => void;
|
|
28
|
-
/** Receive surface deregistrations (server side) */
|
|
29
|
-
onSurfaceDeregister(handler: (surfaceId: string) => void): () => void;
|
|
30
|
-
readonly connected: boolean;
|
|
31
|
-
connect(): Promise<void>;
|
|
32
|
-
disconnect(): void;
|
|
33
|
-
onConnectionChange(handler: (connected: boolean) => void): () => void;
|
|
34
|
-
}
|
|
35
|
-
/** Handler for incoming action dispatches (client side) */
|
|
36
|
-
type OUIActionHandler = (surfaceId: string, actionId: string, params: Record<string, unknown>) => void;
|
|
37
|
-
/** Handler for incoming observation updates (server side) */
|
|
38
|
-
type OUIObservationHandler = (update: OUIObservationUpdate) => void;
|
|
39
|
-
/**
|
|
40
|
-
* Transport configuration options.
|
|
41
|
-
*/
|
|
42
|
-
interface OUITransportConfig {
|
|
43
|
-
/** Namespace prefix for events (default: 'oui') */
|
|
44
|
-
namespace?: string;
|
|
45
|
-
/** Connection timeout in ms */
|
|
46
|
-
connectTimeoutMs?: number;
|
|
47
|
-
/** Whether to buffer dispatches while disconnected */
|
|
48
|
-
bufferWhileDisconnected?: boolean;
|
|
49
|
-
/** Max buffer size (messages dropped after this) */
|
|
50
|
-
maxBufferSize?: number;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* WebSocket transport using Socket.IO.
|
|
55
|
-
* Maps OUI protocol events to socket events with a configurable namespace prefix.
|
|
56
|
-
*
|
|
57
|
-
* Events emitted:
|
|
58
|
-
* {ns}:dispatch — action dispatch (server → client)
|
|
59
|
-
* {ns}:observation — observation update (client → server)
|
|
60
|
-
* {ns}:surface:register — surface registration (client → server)
|
|
61
|
-
* {ns}:surface:deregister — surface deregistration (client → server)
|
|
62
|
-
*/
|
|
63
|
-
declare function createWebSocketTransport(socket: SocketLike, config?: OUITransportConfig): OUITransport;
|
|
64
|
-
/**
|
|
65
|
-
* Minimal socket interface — compatible with Socket.IO client or server socket.
|
|
66
|
-
* Only the methods OUI actually uses.
|
|
67
|
-
*/
|
|
68
|
-
interface SocketLike {
|
|
69
|
-
readonly connected?: boolean;
|
|
70
|
-
emit(event: string, data: unknown): void;
|
|
71
|
-
on(event: string, handler: (...args: any[]) => void): void;
|
|
72
|
-
off(event: string, handler: (...args: any[]) => void): void;
|
|
73
|
-
once(event: string, handler: (...args: any[]) => void): void;
|
|
74
|
-
connect?(): void;
|
|
75
|
-
disconnect?(): void;
|
|
76
|
-
}
|
|
1
|
+
import { b as OUITransport } from '../websocket-CiWvkaz_.js';
|
|
2
|
+
export { O as OUIActionHandler, a as OUIObservationHandler, c as OUITransportConfig, S as SocketLike, d as createWebSocketTransport } from '../websocket-CiWvkaz_.js';
|
|
3
|
+
import '../spec/index.js';
|
|
77
4
|
|
|
78
5
|
/**
|
|
79
6
|
* Direct transport — for same-process communication.
|
|
@@ -88,4 +15,4 @@ declare function createDirectTransportPair(): {
|
|
|
88
15
|
client: OUITransport;
|
|
89
16
|
};
|
|
90
17
|
|
|
91
|
-
export {
|
|
18
|
+
export { OUITransport, createDirectTransportPair };
|
package/dist/transport/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { createDirectTransportPair
|
|
1
|
+
export { createDirectTransportPair } from '../chunk-O6EI77LD.js';
|
|
2
|
+
export { createWebSocketTransport } from '../chunk-YDMGV72W.js';
|
|
2
3
|
//# sourceMappingURL=index.js.map
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { OUIObservationUpdate, OUISurface } from './spec/index.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* OUI Transport — the wire protocol between agent runtime and surfaces.
|
|
5
|
+
*
|
|
6
|
+
* Two one-way channels:
|
|
7
|
+
* - Dispatch channel (server → client): sends action instructions
|
|
8
|
+
* - Observation channel (client → server): pushes state updates
|
|
9
|
+
*
|
|
10
|
+
* NO request/response. NO correlation IDs. NO waiting.
|
|
11
|
+
* The Lambda dispatches and terminates. The browser processes and pushes state.
|
|
12
|
+
*/
|
|
13
|
+
interface OUITransport {
|
|
14
|
+
/** Dispatch an action to a surface (one-way, fire-and-forget) */
|
|
15
|
+
dispatch(surfaceId: string, actionId: string, params: Record<string, unknown>): void;
|
|
16
|
+
/** Receive dispatched actions (surface/client side) */
|
|
17
|
+
onAction(handler: OUIActionHandler): () => void;
|
|
18
|
+
/** Push an observation update from the surface to the agent runtime */
|
|
19
|
+
pushObservation(update: OUIObservationUpdate): void;
|
|
20
|
+
/** Receive observation updates (runtime/server side) */
|
|
21
|
+
onObservation(handler: OUIObservationHandler): () => void;
|
|
22
|
+
/** Register a surface manifest (client → server) */
|
|
23
|
+
registerSurface(surface: OUISurface): void;
|
|
24
|
+
/** Deregister a surface (client → server) */
|
|
25
|
+
deregisterSurface(surfaceId: string): void;
|
|
26
|
+
/** Receive surface registrations (server side) */
|
|
27
|
+
onSurfaceRegister(handler: (surface: OUISurface) => void): () => void;
|
|
28
|
+
/** Receive surface deregistrations (server side) */
|
|
29
|
+
onSurfaceDeregister(handler: (surfaceId: string) => void): () => void;
|
|
30
|
+
readonly connected: boolean;
|
|
31
|
+
connect(): Promise<void>;
|
|
32
|
+
disconnect(): void;
|
|
33
|
+
onConnectionChange(handler: (connected: boolean) => void): () => void;
|
|
34
|
+
}
|
|
35
|
+
/** Handler for incoming action dispatches (client side) */
|
|
36
|
+
type OUIActionHandler = (surfaceId: string, actionId: string, params: Record<string, unknown>) => void;
|
|
37
|
+
/** Handler for incoming observation updates (server side) */
|
|
38
|
+
type OUIObservationHandler = (update: OUIObservationUpdate) => void;
|
|
39
|
+
/**
|
|
40
|
+
* Transport configuration options.
|
|
41
|
+
*/
|
|
42
|
+
interface OUITransportConfig {
|
|
43
|
+
/** Namespace prefix for events (default: 'oui') */
|
|
44
|
+
namespace?: string;
|
|
45
|
+
/** Connection timeout in ms */
|
|
46
|
+
connectTimeoutMs?: number;
|
|
47
|
+
/** Whether to buffer dispatches while disconnected */
|
|
48
|
+
bufferWhileDisconnected?: boolean;
|
|
49
|
+
/** Max buffer size (messages dropped after this) */
|
|
50
|
+
maxBufferSize?: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* WebSocket transport using Socket.IO.
|
|
55
|
+
* Maps OUI protocol events to socket events with a configurable namespace prefix.
|
|
56
|
+
*
|
|
57
|
+
* Events emitted:
|
|
58
|
+
* {ns}:dispatch — action dispatch (server → client)
|
|
59
|
+
* {ns}:observation — observation update (client → server)
|
|
60
|
+
* {ns}:surface:register — surface registration (client → server)
|
|
61
|
+
* {ns}:surface:deregister — surface deregistration (client → server)
|
|
62
|
+
*/
|
|
63
|
+
declare function createWebSocketTransport(socket: SocketLike, config?: OUITransportConfig): OUITransport;
|
|
64
|
+
/**
|
|
65
|
+
* Minimal socket interface — compatible with Socket.IO client or server socket.
|
|
66
|
+
* Only the methods OUI actually uses.
|
|
67
|
+
*/
|
|
68
|
+
interface SocketLike {
|
|
69
|
+
readonly connected?: boolean;
|
|
70
|
+
emit(event: string, data: unknown): void;
|
|
71
|
+
on(event: string, handler: (...args: any[]) => void): void;
|
|
72
|
+
off(event: string, handler: (...args: any[]) => void): void;
|
|
73
|
+
once(event: string, handler: (...args: any[]) => void): void;
|
|
74
|
+
connect?(): void;
|
|
75
|
+
disconnect?(): void;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { type OUIActionHandler as O, type SocketLike as S, type OUIObservationHandler as a, type OUITransport as b, type OUITransportConfig as c, createWebSocketTransport as d };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { OUIObservationUpdate, OUISurface } from './spec/index.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* OUI Transport — the wire protocol between agent runtime and surfaces.
|
|
5
|
+
*
|
|
6
|
+
* Two one-way channels:
|
|
7
|
+
* - Dispatch channel (server → client): sends action instructions
|
|
8
|
+
* - Observation channel (client → server): pushes state updates
|
|
9
|
+
*
|
|
10
|
+
* NO request/response. NO correlation IDs. NO waiting.
|
|
11
|
+
* The Lambda dispatches and terminates. The browser processes and pushes state.
|
|
12
|
+
*/
|
|
13
|
+
interface OUITransport {
|
|
14
|
+
/** Dispatch an action to a surface (one-way, fire-and-forget) */
|
|
15
|
+
dispatch(surfaceId: string, actionId: string, params: Record<string, unknown>): void;
|
|
16
|
+
/** Receive dispatched actions (surface/client side) */
|
|
17
|
+
onAction(handler: OUIActionHandler): () => void;
|
|
18
|
+
/** Push an observation update from the surface to the agent runtime */
|
|
19
|
+
pushObservation(update: OUIObservationUpdate): void;
|
|
20
|
+
/** Receive observation updates (runtime/server side) */
|
|
21
|
+
onObservation(handler: OUIObservationHandler): () => void;
|
|
22
|
+
/** Register a surface manifest (client → server) */
|
|
23
|
+
registerSurface(surface: OUISurface): void;
|
|
24
|
+
/** Deregister a surface (client → server) */
|
|
25
|
+
deregisterSurface(surfaceId: string): void;
|
|
26
|
+
/** Receive surface registrations (server side) */
|
|
27
|
+
onSurfaceRegister(handler: (surface: OUISurface) => void): () => void;
|
|
28
|
+
/** Receive surface deregistrations (server side) */
|
|
29
|
+
onSurfaceDeregister(handler: (surfaceId: string) => void): () => void;
|
|
30
|
+
readonly connected: boolean;
|
|
31
|
+
connect(): Promise<void>;
|
|
32
|
+
disconnect(): void;
|
|
33
|
+
onConnectionChange(handler: (connected: boolean) => void): () => void;
|
|
34
|
+
}
|
|
35
|
+
/** Handler for incoming action dispatches (client side) */
|
|
36
|
+
type OUIActionHandler = (surfaceId: string, actionId: string, params: Record<string, unknown>) => void;
|
|
37
|
+
/** Handler for incoming observation updates (server side) */
|
|
38
|
+
type OUIObservationHandler = (update: OUIObservationUpdate) => void;
|
|
39
|
+
/**
|
|
40
|
+
* Transport configuration options.
|
|
41
|
+
*/
|
|
42
|
+
interface OUITransportConfig {
|
|
43
|
+
/** Namespace prefix for events (default: 'oui') */
|
|
44
|
+
namespace?: string;
|
|
45
|
+
/** Connection timeout in ms */
|
|
46
|
+
connectTimeoutMs?: number;
|
|
47
|
+
/** Whether to buffer dispatches while disconnected */
|
|
48
|
+
bufferWhileDisconnected?: boolean;
|
|
49
|
+
/** Max buffer size (messages dropped after this) */
|
|
50
|
+
maxBufferSize?: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* WebSocket transport using Socket.IO.
|
|
55
|
+
* Maps OUI protocol events to socket events with a configurable namespace prefix.
|
|
56
|
+
*
|
|
57
|
+
* Events emitted:
|
|
58
|
+
* {ns}:dispatch — action dispatch (server → client)
|
|
59
|
+
* {ns}:observation — observation update (client → server)
|
|
60
|
+
* {ns}:surface:register — surface registration (client → server)
|
|
61
|
+
* {ns}:surface:deregister — surface deregistration (client → server)
|
|
62
|
+
*/
|
|
63
|
+
declare function createWebSocketTransport(socket: SocketLike, config?: OUITransportConfig): OUITransport;
|
|
64
|
+
/**
|
|
65
|
+
* Minimal socket interface — compatible with Socket.IO client or server socket.
|
|
66
|
+
* Only the methods OUI actually uses.
|
|
67
|
+
*/
|
|
68
|
+
interface SocketLike {
|
|
69
|
+
readonly connected?: boolean;
|
|
70
|
+
emit(event: string, data: unknown): void;
|
|
71
|
+
on(event: string, handler: (...args: any[]) => void): void;
|
|
72
|
+
off(event: string, handler: (...args: any[]) => void): void;
|
|
73
|
+
once(event: string, handler: (...args: any[]) => void): void;
|
|
74
|
+
connect?(): void;
|
|
75
|
+
disconnect?(): void;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { type OUIActionHandler as O, type SocketLike as S, type OUIObservationHandler as a, type OUITransport as b, type OUITransportConfig as c, createWebSocketTransport as d };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oui-spec",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "OUI — The OpenUI Specification. A machine-readable contract for agent-controllable user interfaces.",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -69,12 +69,13 @@
|
|
|
69
69
|
],
|
|
70
70
|
"scripts": {
|
|
71
71
|
"build": "tsup",
|
|
72
|
-
"typecheck": "tsc --noEmit",
|
|
72
|
+
"typecheck": "tsc --noEmit && npm run typecheck:contract",
|
|
73
73
|
"lint": "eslint src",
|
|
74
74
|
"test": "vitest run",
|
|
75
75
|
"test:watch": "vitest",
|
|
76
76
|
"prepare": "husky",
|
|
77
|
-
"prepublishOnly": "npm run build"
|
|
77
|
+
"prepublishOnly": "npm run build",
|
|
78
|
+
"typecheck:contract": "tsc --noEmit --strict --target ES2022 --module ESNext --moduleResolution bundler __tests__/create-oui.compile.test-d.ts"
|
|
78
79
|
},
|
|
79
80
|
"peerDependencies": {
|
|
80
81
|
"react": ">=18.0.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transport/websocket.ts","../src/transport/direct.ts"],"names":[],"mappings":"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","file":"chunk-7EXSMPGR.js","sourcesContent":["import type { OUITransport, OUITransportConfig, OUIActionHandler, OUIObservationHandler } from './types.js';\nimport type { OUISurface, OUIObservationUpdate } from '../spec/index.js';\n\n/**\n * WebSocket transport using Socket.IO.\n * Maps OUI protocol events to socket events with a configurable namespace prefix.\n *\n * Events emitted:\n * {ns}:dispatch — action dispatch (server → client)\n * {ns}:observation — observation update (client → server)\n * {ns}:surface:register — surface registration (client → server)\n * {ns}:surface:deregister — surface deregistration (client → server)\n */\nexport function createWebSocketTransport(\n socket: SocketLike,\n config?: OUITransportConfig,\n): OUITransport {\n const ns = config?.namespace ?? 'oui';\n const buffer: Array<{ event: string; data: unknown }> = [];\n const maxBuffer = config?.maxBufferSize ?? 100;\n const shouldBuffer = config?.bufferWhileDisconnected ?? true;\n\n let connected = socket.connected ?? false;\n const connectionHandlers: Array<(c: boolean) => void> = [];\n\n // Track connection state\n socket.on('connect', () => {\n connected = true;\n connectionHandlers.forEach(h => h(true));\n // Flush buffer\n if (shouldBuffer) {\n while (buffer.length > 0) {\n const msg = buffer.shift()!;\n socket.emit(msg.event, msg.data);\n }\n }\n });\n\n socket.on('disconnect', () => {\n connected = false;\n connectionHandlers.forEach(h => h(false));\n });\n\n function emit(event: string, data: unknown) {\n if (connected) {\n socket.emit(event, data);\n } else if (shouldBuffer && buffer.length < maxBuffer) {\n buffer.push({ event, data });\n }\n }\n\n return {\n // ─── Dispatch Channel ───────────────────────────────────────\n dispatch(surfaceId, actionId, params) {\n emit(`${ns}:dispatch`, { surfaceId, actionId, params, timestamp: Date.now() });\n },\n\n onAction(handler: OUIActionHandler) {\n const listener = (data: { surfaceId: string; actionId: string; params: Record<string, unknown> }) => {\n handler(data.surfaceId, data.actionId, data.params);\n };\n socket.on(`${ns}:dispatch`, listener);\n return () => socket.off(`${ns}:dispatch`, listener);\n },\n\n // ─── Observation Channel ────────────────────────────────────\n pushObservation(update: OUIObservationUpdate) {\n emit(`${ns}:observation`, update);\n },\n\n onObservation(handler: OUIObservationHandler) {\n const listener = (data: OUIObservationUpdate) => handler(data);\n socket.on(`${ns}:observation`, listener);\n return () => socket.off(`${ns}:observation`, listener);\n },\n\n // ─── Surface Lifecycle ──────────────────────────────────────\n registerSurface(surface: OUISurface) {\n emit(`${ns}:surface:register`, { surface, timestamp: Date.now() });\n },\n\n deregisterSurface(surfaceId: string) {\n emit(`${ns}:surface:deregister`, { surfaceId, timestamp: Date.now() });\n },\n\n onSurfaceRegister(handler: (surface: OUISurface) => void) {\n const listener = (data: { surface: OUISurface }) => handler(data.surface);\n socket.on(`${ns}:surface:register`, listener);\n return () => socket.off(`${ns}:surface:register`, listener);\n },\n\n onSurfaceDeregister(handler: (surfaceId: string) => void) {\n const listener = (data: { surfaceId: string }) => handler(data.surfaceId);\n socket.on(`${ns}:surface:deregister`, listener);\n return () => socket.off(`${ns}:surface:deregister`, listener);\n },\n\n // ─── Connection ─────────────────────────────────────────────\n get connected() { return connected; },\n\n async connect() {\n if (connected) return;\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(`OUI transport connect timeout (${config?.connectTimeoutMs ?? 10000}ms)`));\n }, config?.connectTimeoutMs ?? 10000);\n\n socket.once('connect', () => {\n clearTimeout(timeout);\n resolve();\n });\n\n if (typeof socket.connect === 'function') {\n socket.connect();\n }\n });\n },\n\n disconnect() {\n if (typeof socket.disconnect === 'function') {\n socket.disconnect();\n }\n },\n\n onConnectionChange(handler: (c: boolean) => void) {\n connectionHandlers.push(handler);\n return () => {\n const idx = connectionHandlers.indexOf(handler);\n if (idx >= 0) connectionHandlers.splice(idx, 1);\n };\n },\n };\n}\n\n/**\n * Minimal socket interface — compatible with Socket.IO client or server socket.\n * Only the methods OUI actually uses.\n */\nexport interface SocketLike {\n readonly connected?: boolean;\n emit(event: string, data: unknown): void;\n on(event: string, handler: (...args: any[]) => void): void;\n off(event: string, handler: (...args: any[]) => void): void;\n once(event: string, handler: (...args: any[]) => void): void;\n connect?(): void;\n disconnect?(): void;\n}\n","import type { OUITransport, OUIActionHandler, OUIObservationHandler } from './types.js';\nimport type { OUISurface, OUIObservationUpdate } from '../spec/index.js';\n\n/**\n * Direct transport — for same-process communication.\n * Used for API surfaces (where the agent runtime and surface are in the same Lambda)\n * and for testing (where you want synchronous, in-memory communication).\n *\n * Creates a paired (server, client) transport where messages sent on one\n * side are immediately received on the other.\n */\nexport function createDirectTransportPair(): { server: OUITransport; client: OUITransport } {\n const actionHandlers: OUIActionHandler[] = [];\n const observationHandlers: OUIObservationHandler[] = [];\n const surfaceRegisterHandlers: Array<(s: OUISurface) => void> = [];\n const surfaceDeregisterHandlers: Array<(id: string) => void> = [];\n\n const server: OUITransport = {\n dispatch(surfaceId, actionId, params) {\n // Server dispatches → client receives\n actionHandlers.forEach(h => h(surfaceId, actionId, params));\n },\n onAction() { return () => {}; }, // Server doesn't receive dispatches\n pushObservation() {}, // Server doesn't push observations\n onObservation(handler) {\n observationHandlers.push(handler);\n return () => { const i = observationHandlers.indexOf(handler); if (i >= 0) observationHandlers.splice(i, 1); };\n },\n registerSurface() {},\n deregisterSurface() {},\n onSurfaceRegister(handler) {\n surfaceRegisterHandlers.push(handler);\n return () => { const i = surfaceRegisterHandlers.indexOf(handler); if (i >= 0) surfaceRegisterHandlers.splice(i, 1); };\n },\n onSurfaceDeregister(handler) {\n surfaceDeregisterHandlers.push(handler);\n return () => { const i = surfaceDeregisterHandlers.indexOf(handler); if (i >= 0) surfaceDeregisterHandlers.splice(i, 1); };\n },\n get connected() { return true; },\n async connect() {},\n disconnect() {},\n onConnectionChange() { return () => {}; },\n };\n\n const client: OUITransport = {\n dispatch() {}, // Client doesn't dispatch\n onAction(handler) {\n actionHandlers.push(handler);\n return () => { const i = actionHandlers.indexOf(handler); if (i >= 0) actionHandlers.splice(i, 1); };\n },\n pushObservation(update: OUIObservationUpdate) {\n // Client pushes → server receives\n observationHandlers.forEach(h => h(update));\n },\n onObservation() { return () => {}; }, // Client doesn't receive observations\n registerSurface(surface) {\n surfaceRegisterHandlers.forEach(h => h(surface));\n },\n deregisterSurface(surfaceId) {\n surfaceDeregisterHandlers.forEach(h => h(surfaceId));\n },\n onSurfaceRegister() { return () => {}; },\n onSurfaceDeregister() { return () => {}; },\n get connected() { return true; },\n async connect() {},\n disconnect() {},\n onConnectionChange() { return () => {}; },\n };\n\n return { server, client };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/define-surface.ts"],"names":[],"mappings":";AA6GO,SAAS,cACd,UAAA,EAC0B;AAE1B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,KAAA,MAAW,MAAA,IAAU,WAAW,OAAA,EAAS;AACvC,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,MAAM,CAAA,2BAAA,EAA8B,MAAA,CAAO,EAAE,CAAA,cAAA,EAAiB,UAAA,CAAW,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1F;AACA,IAAA,SAAA,CAAU,GAAA,CAAI,OAAO,EAAE,CAAA;AAAA,EACzB;AAGA,EAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,IAAA,KAAA,MAAW,GAAA,IAAO,WAAW,YAAA,EAAc;AACzC,MAAA,IAAI,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AACtB,QAAA,MAAM,IAAI,MAAM,CAAA,gCAAA,EAAmC,GAAA,CAAI,EAAE,CAAA,cAAA,EAAiB,UAAA,CAAW,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,MAC5F;AACA,MAAA,MAAA,CAAO,GAAA,CAAI,IAAI,EAAE,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,UAAA;AAAA;AAAA,IAGH,UAAA,GAAyB;AACvB,MAAA,OAAO;AAAA,QACL,IAAI,UAAA,CAAW,EAAA;AAAA,QACf,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,aAAa,UAAA,CAAW,WAAA;AAAA,QACxB,SAAS,UAAA,CAAW,OAAA;AAAA,QACpB,YAAY,UAAA,CAAW,UAAA;AAAA,QACvB,OAAA,EAAS,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAAA,QAChD,YAAA,EAAc,UAAA,CAAW,YAAA,EAAc,GAAA,CAAI,aAAa,CAAA;AAAA,QACxD,UAAU,UAAA,CAAW;AAAA,OACvB;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,MAAM,aAAA,CAAc,QAAA,EAAkB,MAAA,EAAiC,OAAA,EAAiD;AACtH,MAAA,MAAM,SAAS,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,QAAQ,CAAA;AAC7D,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,kBAAA,EAAoB,OAAA,EAAS,CAAA,QAAA,EAAW,QAAQ,CAAA,wBAAA,EAA2B,UAAA,CAAW,EAAE,KAAI,EAAE;AAAA,MACxI;AACA,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAA;AAAA,MAC7C,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,wBAAA;AAAA,YACN,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA;AAC1D,SACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,YAAA,GAAyB;AACvB,MAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE,CAAA;AAAA,IACzC,CAAA;AAAA;AAAA,IAGA,iBAAiB,QAAA,EAAgD;AAC/D,MAAA,MAAM,SAAS,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,QAAQ,CAAA;AAC7D,MAAA,OAAO,MAAA,EAAQ,OAAA;AAAA,IACjB;AAAA,GACF;AACF;AAaA,SAAS,iBAAoB,MAAA,EAAwC;AACnE,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,CAAO,EAAA;AAAA,IACX,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,mBAAmB,MAAA,CAAO,iBAAA;AAAA,IAC1B,MAAM,MAAA,CAAO;AAAA,GACf;AACF;AAEA,SAAS,cAAc,GAAA,EAA4C;AACjE,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,QAAQ,GAAA,CAAI;AAAA,GACd;AACF","file":"chunk-JO5LGOB6.js","sourcesContent":["import type { OUISurface, OUIAction, OUIObservation, OUIActivation, OUIActionPolling, JSONSchema } from '../spec/index.js';\n\n/**\n * Configuration for defining an OUI surface with handlers.\n * This is the \"integration file\" an app provides — it declares both\n * the schema (what the agent sees) and the implementation (what executes).\n */\nexport interface SurfaceDefinition<TContext = unknown> {\n id: string;\n name: string;\n description: string;\n version?: string;\n activation?: OUIActivation;\n actions: ActionDefinition<TContext>[];\n observations?: ObservationDefinition[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Polling config with an optional resolve handler.\n * The spec's OUIActionPolling is the manifest shape (no functions).\n * The core extends it with the resolve implementation for the runtime.\n */\nexport interface ActionPollingConfig<TContext = unknown> extends OUIActionPolling {\n /**\n * Called on each poll interval. Receives the dispatch result from the handler\n * plus the current context. Return { done: true, data } to stop polling,\n * or { done: false, data } to continue.\n */\n resolve?: (dispatchResult: unknown, context: TContext) => Promise<{ done: boolean; data: unknown }>;\n}\n\n/**\n * An action definition includes both the schema (for the agent) and\n * the handler (for execution). This is the single source of truth —\n * no separate YAML, no separate listener, no drift possible.\n */\nexport interface ActionDefinition<TContext = unknown> {\n id: string;\n description: string;\n input: JSONSchema;\n output?: JSONSchema;\n confirm?: boolean;\n async?: boolean;\n\n /**\n * Polling/subscription config for async actions.\n * After the handler returns, the OUI runtime starts polling or subscribing\n * and pushes observation updates until the operation completes.\n * Extends the spec's OUIActionPolling with an optional resolve handler.\n */\n polling?: ActionPollingConfig<TContext>;\n\n usage?: string;\n preconditions?: string;\n estimatedDuration?: string;\n tags?: string[];\n\n /**\n * The handler that executes when the agent invokes this action.\n * Receives typed params and a context object (app-specific state/utilities).\n * Returns a result that the agent sees as the tool output.\n */\n handler: (params: Record<string, unknown>, context: TContext) => Promise<ActionHandlerResult>;\n}\n\nexport interface ActionHandlerResult {\n success: boolean;\n data?: unknown;\n error?: { code: string; message: string; details?: unknown };\n /** For async actions: metadata passed to the polling resolver */\n dispatchMeta?: Record<string, unknown>;\n}\n\nexport interface ObservationDefinition {\n id: string;\n description: string;\n schema: JSONSchema;\n /** Function that returns the current observation value */\n getValue?: () => unknown;\n}\n\n/**\n * Define an OUI surface — the single entry point for integrating\n * an application feature with the OUI protocol.\n *\n * This function validates the definition and returns a typed surface\n * object that can be registered with an agent runtime or transport layer.\n *\n * @example\n * ```typescript\n * const mySurface = defineSurface({\n * id: 'my-feature',\n * name: 'My Feature',\n * description: 'Does something cool',\n * actions: [\n * {\n * id: 'do_thing',\n * description: 'Does the thing',\n * input: { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] },\n * handler: async (params) => {\n * const result = await doTheThing(params.name);\n * return { success: true, data: result };\n * },\n * },\n * ],\n * });\n * ```\n */\nexport function defineSurface<TContext = unknown>(\n definition: SurfaceDefinition<TContext>,\n): DefinedSurface<TContext> {\n // Validate: no duplicate action IDs\n const actionIds = new Set<string>();\n for (const action of definition.actions) {\n if (actionIds.has(action.id)) {\n throw new Error(`[OUI] Duplicate action ID \"${action.id}\" in surface \"${definition.id}\"`);\n }\n actionIds.add(action.id);\n }\n\n // Validate: no duplicate observation IDs\n if (definition.observations) {\n const obsIds = new Set<string>();\n for (const obs of definition.observations) {\n if (obsIds.has(obs.id)) {\n throw new Error(`[OUI] Duplicate observation ID \"${obs.id}\" in surface \"${definition.id}\"`);\n }\n obsIds.add(obs.id);\n }\n }\n\n return {\n ...definition,\n\n /** Extract the manifest (schema only, no handlers) for transmission to the agent runtime */\n toManifest(): OUISurface {\n return {\n id: definition.id,\n name: definition.name,\n description: definition.description,\n version: definition.version,\n activation: definition.activation,\n actions: definition.actions.map(actionToManifest),\n observations: definition.observations?.map(obsToManifest),\n metadata: definition.metadata,\n };\n },\n\n /** Execute an action by ID with the given params and context */\n async executeAction(actionId: string, params: Record<string, unknown>, context: TContext): Promise<ActionHandlerResult> {\n const action = definition.actions.find(a => a.id === actionId);\n if (!action) {\n return { success: false, error: { code: 'ACTION_NOT_FOUND', message: `Action \"${actionId}\" not found on surface \"${definition.id}\"` } };\n }\n try {\n return await action.handler(params, context);\n } catch (err) {\n return {\n success: false,\n error: {\n code: 'ACTION_EXECUTION_ERROR',\n message: err instanceof Error ? err.message : String(err),\n },\n };\n }\n },\n\n /** Get all action IDs */\n getActionIds(): string[] {\n return definition.actions.map(a => a.id);\n },\n\n /** Get the polling config for an action (if async) */\n getPollingConfig(actionId: string): OUIActionPolling | undefined {\n const action = definition.actions.find(a => a.id === actionId);\n return action?.polling;\n },\n };\n}\n\n/** A fully defined surface with both manifest extraction and execution capabilities */\nexport interface DefinedSurface<TContext = unknown> extends SurfaceDefinition<TContext> {\n toManifest(): OUISurface;\n executeAction(actionId: string, params: Record<string, unknown>, context: TContext): Promise<ActionHandlerResult>;\n getActionIds(): string[];\n /** Get the polling config for an action (if async) */\n getPollingConfig(actionId: string): OUIActionPolling | undefined;\n}\n\n// ─── Internal helpers ────────────────────────────────────────────────────────\n\nfunction actionToManifest<T>(action: ActionDefinition<T>): OUIAction {\n return {\n id: action.id,\n description: action.description,\n input: action.input,\n output: action.output,\n confirm: action.confirm,\n async: action.async,\n polling: action.polling,\n usage: action.usage,\n preconditions: action.preconditions,\n estimatedDuration: action.estimatedDuration,\n tags: action.tags,\n };\n}\n\nfunction obsToManifest(obs: ObservationDefinition): OUIObservation {\n return {\n id: obs.id,\n description: obs.description,\n schema: obs.schema,\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/define-surface.ts"],"names":[],"mappings":"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","file":"chunk-LEXIU2MH.cjs","sourcesContent":["import type { OUISurface, OUIAction, OUIObservation, OUIActivation, OUIActionPolling, JSONSchema } from '../spec/index.js';\n\n/**\n * Configuration for defining an OUI surface with handlers.\n * This is the \"integration file\" an app provides — it declares both\n * the schema (what the agent sees) and the implementation (what executes).\n */\nexport interface SurfaceDefinition<TContext = unknown> {\n id: string;\n name: string;\n description: string;\n version?: string;\n activation?: OUIActivation;\n actions: ActionDefinition<TContext>[];\n observations?: ObservationDefinition[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Polling config with an optional resolve handler.\n * The spec's OUIActionPolling is the manifest shape (no functions).\n * The core extends it with the resolve implementation for the runtime.\n */\nexport interface ActionPollingConfig<TContext = unknown> extends OUIActionPolling {\n /**\n * Called on each poll interval. Receives the dispatch result from the handler\n * plus the current context. Return { done: true, data } to stop polling,\n * or { done: false, data } to continue.\n */\n resolve?: (dispatchResult: unknown, context: TContext) => Promise<{ done: boolean; data: unknown }>;\n}\n\n/**\n * An action definition includes both the schema (for the agent) and\n * the handler (for execution). This is the single source of truth —\n * no separate YAML, no separate listener, no drift possible.\n */\nexport interface ActionDefinition<TContext = unknown> {\n id: string;\n description: string;\n input: JSONSchema;\n output?: JSONSchema;\n confirm?: boolean;\n async?: boolean;\n\n /**\n * Polling/subscription config for async actions.\n * After the handler returns, the OUI runtime starts polling or subscribing\n * and pushes observation updates until the operation completes.\n * Extends the spec's OUIActionPolling with an optional resolve handler.\n */\n polling?: ActionPollingConfig<TContext>;\n\n usage?: string;\n preconditions?: string;\n estimatedDuration?: string;\n tags?: string[];\n\n /**\n * The handler that executes when the agent invokes this action.\n * Receives typed params and a context object (app-specific state/utilities).\n * Returns a result that the agent sees as the tool output.\n */\n handler: (params: Record<string, unknown>, context: TContext) => Promise<ActionHandlerResult>;\n}\n\nexport interface ActionHandlerResult {\n success: boolean;\n data?: unknown;\n error?: { code: string; message: string; details?: unknown };\n /** For async actions: metadata passed to the polling resolver */\n dispatchMeta?: Record<string, unknown>;\n}\n\nexport interface ObservationDefinition {\n id: string;\n description: string;\n schema: JSONSchema;\n /** Function that returns the current observation value */\n getValue?: () => unknown;\n}\n\n/**\n * Define an OUI surface — the single entry point for integrating\n * an application feature with the OUI protocol.\n *\n * This function validates the definition and returns a typed surface\n * object that can be registered with an agent runtime or transport layer.\n *\n * @example\n * ```typescript\n * const mySurface = defineSurface({\n * id: 'my-feature',\n * name: 'My Feature',\n * description: 'Does something cool',\n * actions: [\n * {\n * id: 'do_thing',\n * description: 'Does the thing',\n * input: { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] },\n * handler: async (params) => {\n * const result = await doTheThing(params.name);\n * return { success: true, data: result };\n * },\n * },\n * ],\n * });\n * ```\n */\nexport function defineSurface<TContext = unknown>(\n definition: SurfaceDefinition<TContext>,\n): DefinedSurface<TContext> {\n // Validate: no duplicate action IDs\n const actionIds = new Set<string>();\n for (const action of definition.actions) {\n if (actionIds.has(action.id)) {\n throw new Error(`[OUI] Duplicate action ID \"${action.id}\" in surface \"${definition.id}\"`);\n }\n actionIds.add(action.id);\n }\n\n // Validate: no duplicate observation IDs\n if (definition.observations) {\n const obsIds = new Set<string>();\n for (const obs of definition.observations) {\n if (obsIds.has(obs.id)) {\n throw new Error(`[OUI] Duplicate observation ID \"${obs.id}\" in surface \"${definition.id}\"`);\n }\n obsIds.add(obs.id);\n }\n }\n\n return {\n ...definition,\n\n /** Extract the manifest (schema only, no handlers) for transmission to the agent runtime */\n toManifest(): OUISurface {\n return {\n id: definition.id,\n name: definition.name,\n description: definition.description,\n version: definition.version,\n activation: definition.activation,\n actions: definition.actions.map(actionToManifest),\n observations: definition.observations?.map(obsToManifest),\n metadata: definition.metadata,\n };\n },\n\n /** Execute an action by ID with the given params and context */\n async executeAction(actionId: string, params: Record<string, unknown>, context: TContext): Promise<ActionHandlerResult> {\n const action = definition.actions.find(a => a.id === actionId);\n if (!action) {\n return { success: false, error: { code: 'ACTION_NOT_FOUND', message: `Action \"${actionId}\" not found on surface \"${definition.id}\"` } };\n }\n try {\n return await action.handler(params, context);\n } catch (err) {\n return {\n success: false,\n error: {\n code: 'ACTION_EXECUTION_ERROR',\n message: err instanceof Error ? err.message : String(err),\n },\n };\n }\n },\n\n /** Get all action IDs */\n getActionIds(): string[] {\n return definition.actions.map(a => a.id);\n },\n\n /** Get the polling config for an action (if async) */\n getPollingConfig(actionId: string): OUIActionPolling | undefined {\n const action = definition.actions.find(a => a.id === actionId);\n return action?.polling;\n },\n };\n}\n\n/** A fully defined surface with both manifest extraction and execution capabilities */\nexport interface DefinedSurface<TContext = unknown> extends SurfaceDefinition<TContext> {\n toManifest(): OUISurface;\n executeAction(actionId: string, params: Record<string, unknown>, context: TContext): Promise<ActionHandlerResult>;\n getActionIds(): string[];\n /** Get the polling config for an action (if async) */\n getPollingConfig(actionId: string): OUIActionPolling | undefined;\n}\n\n// ─── Internal helpers ────────────────────────────────────────────────────────\n\nfunction actionToManifest<T>(action: ActionDefinition<T>): OUIAction {\n return {\n id: action.id,\n description: action.description,\n input: action.input,\n output: action.output,\n confirm: action.confirm,\n async: action.async,\n polling: action.polling,\n usage: action.usage,\n preconditions: action.preconditions,\n estimatedDuration: action.estimatedDuration,\n tags: action.tags,\n };\n}\n\nfunction obsToManifest(obs: ObservationDefinition): OUIObservation {\n return {\n id: obs.id,\n description: obs.description,\n schema: obs.schema,\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transport/websocket.ts","../src/transport/direct.ts"],"names":[],"mappings":"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","file":"chunk-WZXUKJ7E.cjs","sourcesContent":["import type { OUITransport, OUITransportConfig, OUIActionHandler, OUIObservationHandler } from './types.js';\nimport type { OUISurface, OUIObservationUpdate } from '../spec/index.js';\n\n/**\n * WebSocket transport using Socket.IO.\n * Maps OUI protocol events to socket events with a configurable namespace prefix.\n *\n * Events emitted:\n * {ns}:dispatch — action dispatch (server → client)\n * {ns}:observation — observation update (client → server)\n * {ns}:surface:register — surface registration (client → server)\n * {ns}:surface:deregister — surface deregistration (client → server)\n */\nexport function createWebSocketTransport(\n socket: SocketLike,\n config?: OUITransportConfig,\n): OUITransport {\n const ns = config?.namespace ?? 'oui';\n const buffer: Array<{ event: string; data: unknown }> = [];\n const maxBuffer = config?.maxBufferSize ?? 100;\n const shouldBuffer = config?.bufferWhileDisconnected ?? true;\n\n let connected = socket.connected ?? false;\n const connectionHandlers: Array<(c: boolean) => void> = [];\n\n // Track connection state\n socket.on('connect', () => {\n connected = true;\n connectionHandlers.forEach(h => h(true));\n // Flush buffer\n if (shouldBuffer) {\n while (buffer.length > 0) {\n const msg = buffer.shift()!;\n socket.emit(msg.event, msg.data);\n }\n }\n });\n\n socket.on('disconnect', () => {\n connected = false;\n connectionHandlers.forEach(h => h(false));\n });\n\n function emit(event: string, data: unknown) {\n if (connected) {\n socket.emit(event, data);\n } else if (shouldBuffer && buffer.length < maxBuffer) {\n buffer.push({ event, data });\n }\n }\n\n return {\n // ─── Dispatch Channel ───────────────────────────────────────\n dispatch(surfaceId, actionId, params) {\n emit(`${ns}:dispatch`, { surfaceId, actionId, params, timestamp: Date.now() });\n },\n\n onAction(handler: OUIActionHandler) {\n const listener = (data: { surfaceId: string; actionId: string; params: Record<string, unknown> }) => {\n handler(data.surfaceId, data.actionId, data.params);\n };\n socket.on(`${ns}:dispatch`, listener);\n return () => socket.off(`${ns}:dispatch`, listener);\n },\n\n // ─── Observation Channel ────────────────────────────────────\n pushObservation(update: OUIObservationUpdate) {\n emit(`${ns}:observation`, update);\n },\n\n onObservation(handler: OUIObservationHandler) {\n const listener = (data: OUIObservationUpdate) => handler(data);\n socket.on(`${ns}:observation`, listener);\n return () => socket.off(`${ns}:observation`, listener);\n },\n\n // ─── Surface Lifecycle ──────────────────────────────────────\n registerSurface(surface: OUISurface) {\n emit(`${ns}:surface:register`, { surface, timestamp: Date.now() });\n },\n\n deregisterSurface(surfaceId: string) {\n emit(`${ns}:surface:deregister`, { surfaceId, timestamp: Date.now() });\n },\n\n onSurfaceRegister(handler: (surface: OUISurface) => void) {\n const listener = (data: { surface: OUISurface }) => handler(data.surface);\n socket.on(`${ns}:surface:register`, listener);\n return () => socket.off(`${ns}:surface:register`, listener);\n },\n\n onSurfaceDeregister(handler: (surfaceId: string) => void) {\n const listener = (data: { surfaceId: string }) => handler(data.surfaceId);\n socket.on(`${ns}:surface:deregister`, listener);\n return () => socket.off(`${ns}:surface:deregister`, listener);\n },\n\n // ─── Connection ─────────────────────────────────────────────\n get connected() { return connected; },\n\n async connect() {\n if (connected) return;\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(`OUI transport connect timeout (${config?.connectTimeoutMs ?? 10000}ms)`));\n }, config?.connectTimeoutMs ?? 10000);\n\n socket.once('connect', () => {\n clearTimeout(timeout);\n resolve();\n });\n\n if (typeof socket.connect === 'function') {\n socket.connect();\n }\n });\n },\n\n disconnect() {\n if (typeof socket.disconnect === 'function') {\n socket.disconnect();\n }\n },\n\n onConnectionChange(handler: (c: boolean) => void) {\n connectionHandlers.push(handler);\n return () => {\n const idx = connectionHandlers.indexOf(handler);\n if (idx >= 0) connectionHandlers.splice(idx, 1);\n };\n },\n };\n}\n\n/**\n * Minimal socket interface — compatible with Socket.IO client or server socket.\n * Only the methods OUI actually uses.\n */\nexport interface SocketLike {\n readonly connected?: boolean;\n emit(event: string, data: unknown): void;\n on(event: string, handler: (...args: any[]) => void): void;\n off(event: string, handler: (...args: any[]) => void): void;\n once(event: string, handler: (...args: any[]) => void): void;\n connect?(): void;\n disconnect?(): void;\n}\n","import type { OUITransport, OUIActionHandler, OUIObservationHandler } from './types.js';\nimport type { OUISurface, OUIObservationUpdate } from '../spec/index.js';\n\n/**\n * Direct transport — for same-process communication.\n * Used for API surfaces (where the agent runtime and surface are in the same Lambda)\n * and for testing (where you want synchronous, in-memory communication).\n *\n * Creates a paired (server, client) transport where messages sent on one\n * side are immediately received on the other.\n */\nexport function createDirectTransportPair(): { server: OUITransport; client: OUITransport } {\n const actionHandlers: OUIActionHandler[] = [];\n const observationHandlers: OUIObservationHandler[] = [];\n const surfaceRegisterHandlers: Array<(s: OUISurface) => void> = [];\n const surfaceDeregisterHandlers: Array<(id: string) => void> = [];\n\n const server: OUITransport = {\n dispatch(surfaceId, actionId, params) {\n // Server dispatches → client receives\n actionHandlers.forEach(h => h(surfaceId, actionId, params));\n },\n onAction() { return () => {}; }, // Server doesn't receive dispatches\n pushObservation() {}, // Server doesn't push observations\n onObservation(handler) {\n observationHandlers.push(handler);\n return () => { const i = observationHandlers.indexOf(handler); if (i >= 0) observationHandlers.splice(i, 1); };\n },\n registerSurface() {},\n deregisterSurface() {},\n onSurfaceRegister(handler) {\n surfaceRegisterHandlers.push(handler);\n return () => { const i = surfaceRegisterHandlers.indexOf(handler); if (i >= 0) surfaceRegisterHandlers.splice(i, 1); };\n },\n onSurfaceDeregister(handler) {\n surfaceDeregisterHandlers.push(handler);\n return () => { const i = surfaceDeregisterHandlers.indexOf(handler); if (i >= 0) surfaceDeregisterHandlers.splice(i, 1); };\n },\n get connected() { return true; },\n async connect() {},\n disconnect() {},\n onConnectionChange() { return () => {}; },\n };\n\n const client: OUITransport = {\n dispatch() {}, // Client doesn't dispatch\n onAction(handler) {\n actionHandlers.push(handler);\n return () => { const i = actionHandlers.indexOf(handler); if (i >= 0) actionHandlers.splice(i, 1); };\n },\n pushObservation(update: OUIObservationUpdate) {\n // Client pushes → server receives\n observationHandlers.forEach(h => h(update));\n },\n onObservation() { return () => {}; }, // Client doesn't receive observations\n registerSurface(surface) {\n surfaceRegisterHandlers.forEach(h => h(surface));\n },\n deregisterSurface(surfaceId) {\n surfaceDeregisterHandlers.forEach(h => h(surfaceId));\n },\n onSurfaceRegister() { return () => {}; },\n onSurfaceDeregister() { return () => {}; },\n get connected() { return true; },\n async connect() {},\n disconnect() {},\n onConnectionChange() { return () => {}; },\n };\n\n return { server, client };\n}\n"]}
|