@theaiinc/yggdrasil-runtime 0.1.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 The AI Inc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,114 @@
1
+ # @theaiinc/yggdrasil-runtime
2
+
3
+ <p align="center">
4
+ <a href="https://github.com/theaiinc/yggdrasil"><img alt="GitHub Repo" src="https://img.shields.io/badge/github-theaiinc%2Fyggdrasil-181717?style=flat-square&logo=github"/></a>
5
+ <a href="https://www.npmjs.com/package/@theaiinc/yggdrasil-runtime"><img alt="npm" src="https://img.shields.io/npm/v/@theaiinc/yggdrasil-runtime?style=flat-square&logo=npm"/></a>
6
+ <a href="https://github.com/theaiinc/yggdrasil/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/theaiinc/yggdrasil?style=flat-square"/></a>
7
+ </p>
8
+
9
+ <p align="center">
10
+ <img src="./yggdrasil-runtime.svg" alt="Yggdrasil Runtime" width="300" />
11
+ </p>
12
+
13
+ `ComputerUseRuntime` implementation that bridges [Cognition](https://github.com/theaiinc/oasis-cognition) to [Yggdrasil](https://www.npmjs.com/package/@theaiinc/yggdrasil) + [Realm](https://github.com/theaiinc/realm-api) for remote desktop automation.
14
+
15
+ This package proves the **control-plane / data-plane split**:
16
+
17
+ - **Yggdrasil** (control plane) — session create, terminate, pause, resume
18
+ - **Realm** (data plane) — observation (screenshots) and input (click, type, scroll)
19
+
20
+ Cognition never knows Yggdrasil, Ratatoskr, or Realm exist. It only sees `ComputerUseRuntime`.
21
+
22
+ ## Architecture
23
+
24
+ ```mermaid
25
+ graph TD
26
+ C[Cognition] -->|ComputerUseRuntime| YR[YggdrasilRuntime]
27
+ YR -->|start/stop| Y[Yggdrasil<br/>control plane]
28
+ YR -->|getScreenImage<br/>click<br/>type| R[Realm<br/>data plane]
29
+ ```
30
+
31
+ ## Installation
32
+
33
+ ```bash
34
+ npm install @theaiinc/yggdrasil-runtime
35
+ ```
36
+
37
+ ## Quick Start
38
+
39
+ ```typescript
40
+ import { YggdrasilRuntime } from '@theaiinc/yggdrasil-runtime';
41
+
42
+ const runtime = new YggdrasilRuntime({
43
+ yggdrasilUrl: 'http://localhost:3000',
44
+ apiKey: 'my-api-key',
45
+ sessionType: 'computer-use',
46
+ });
47
+
48
+ // Start a session — creates via Yggdrasil
49
+ const session = await runtime.start();
50
+ console.log('Session created:', session.id);
51
+
52
+ // Observe — talks to Realm directly
53
+ const screenshot = await runtime.getScreenImage();
54
+ console.log('Screenshot captured:', screenshot ? screenshot.slice(0, 40) + '...' : 'none');
55
+
56
+ // Interact — talks to Realm directly
57
+ await runtime.click({ x: 100, y: 200 });
58
+ await runtime.type({ text: 'Hello, world!' });
59
+
60
+ // Stop — terminates via Yggdrasil
61
+ await runtime.stop();
62
+ ```
63
+
64
+ ## Configuration
65
+
66
+ | Option | Type | Default | Description |
67
+ |--------|------|---------|-------------|
68
+ | `yggdrasilUrl` | `string` | (required) | Yggdrasil server URL for session lifecycle |
69
+ | `apiKey` | `string` | — | API key for Yggdrasil authentication |
70
+ | `realmUrl` | `string` | from session | Realm URL override (for development) |
71
+ | `sessionType` | `'computer-use' \| 'phone-use'` | `'computer-use'` | Session type to create |
72
+ | `ownerId` | `string` | — | Owner identity for Veil authorization |
73
+ | `participantIds` | `string[]` | — | Participant identities |
74
+ | `capabilities` | `string[]` | type defaults | Requested session capabilities |
75
+
76
+ ## Runbook: Proving the Architecture
77
+
78
+ This validation shows that Cognition can run unchanged against either `LocalMacOSRuntime` or `YggdrasilRuntime`:
79
+
80
+ ```typescript
81
+ import { YggdrasilRuntime } from '@theaiinc/yggdrasil-runtime';
82
+
83
+ async function proveArchitecture() {
84
+ const runtime = new YggdrasilRuntime({
85
+ yggdrasilUrl: 'http://localhost:3000',
86
+ apiKey: process.env['YGGDRASIL_API_KEY'],
87
+ });
88
+
89
+ await runtime.start();
90
+ const image = await runtime.getScreenImage();
91
+ await runtime.click({ x: 500, y: 400 });
92
+ await runtime.type({ text: 'Hello from Yggdrasil!' });
93
+ await runtime.stop();
94
+ }
95
+ ```
96
+
97
+ If this works, the `ComputerUseRuntime` abstraction is validated — Cognition is fully decoupled from infrastructure.
98
+
99
+ ## Development
100
+
101
+ ```bash
102
+ # Install dependencies
103
+ npm install
104
+
105
+ # Build
106
+ npm run build
107
+
108
+ # Test
109
+ npm test
110
+ ```
111
+
112
+ ## License
113
+
114
+ MIT — © 2026 The AI Inc
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @theaiinc/yggdrasil-runtime — ComputerUseRuntime implementation that bridges
3
+ * Cognition to Yggdrasil + Realm for remote desktop automation.
4
+ */
5
+ export { YggdrasilRuntime } from './yggdrasil-runtime.js';
6
+ export type { YggdrasilRuntimeConfig, SessionDescriptor, CreateSessionResponse, ScreenInfo, ScreenshotOptions, ClickOptions, TypeOptions, KeyPressOptions, ScrollOptions, ComputerActionResult, OcrResult, PageTextResult, HealthInfo, WindowBounds, UIDetection, RuntimeCapabilities, } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,YAAY,EACV,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,cAAc,EACd,UAAU,EACV,YAAY,EACZ,WAAW,EACX,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @theaiinc/yggdrasil-runtime — ComputerUseRuntime implementation that bridges
3
+ * Cognition to Yggdrasil + Realm for remote desktop automation.
4
+ */
5
+ export { YggdrasilRuntime } from './yggdrasil-runtime.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Types for the YggdrasilRuntime — mirrors the ComputerUseRuntime interface
3
+ * from oasis-cognition so that @theaiinc/yggdrasil-runtime can be a drop-in
4
+ * replacement for LocalMacOSRuntime without depending on the Cognition codebase.
5
+ *
6
+ * These are structurally identical to the types in:
7
+ * apps/api-gateway/src/computer-use/computer-use-runtime.interface.ts
8
+ */
9
+ export interface ScreenInfo {
10
+ index: number;
11
+ width: number;
12
+ height: number;
13
+ x: number;
14
+ y: number;
15
+ name?: string;
16
+ }
17
+ export interface WindowBounds {
18
+ x: number;
19
+ y: number;
20
+ width: number;
21
+ height: number;
22
+ }
23
+ export interface ScreenshotOptions {
24
+ /** Device pixel ratio scaling (default 2 for retina). */
25
+ scale?: number;
26
+ /** Optional region to capture in CSS pixels. */
27
+ region?: {
28
+ x: number;
29
+ y: number;
30
+ width: number;
31
+ height: number;
32
+ };
33
+ }
34
+ export interface ClickOptions {
35
+ x: number;
36
+ y: number;
37
+ clickCount?: number;
38
+ button?: 'left' | 'right' | 'middle';
39
+ }
40
+ export interface ScrollOptions {
41
+ deltaX?: number;
42
+ deltaY?: number;
43
+ }
44
+ export interface TypeOptions {
45
+ text: string;
46
+ replace?: boolean;
47
+ }
48
+ export interface KeyPressOptions {
49
+ keys: string | string[];
50
+ }
51
+ export interface ComputerActionResult {
52
+ output: string;
53
+ screenshot?: string;
54
+ }
55
+ export interface OcrResult {
56
+ text: string;
57
+ elements?: Array<{
58
+ text: string;
59
+ x: number;
60
+ y: number;
61
+ width: number;
62
+ height: number;
63
+ }>;
64
+ }
65
+ export interface PageTextResult {
66
+ text: string;
67
+ url?: string;
68
+ title?: string;
69
+ }
70
+ export interface HealthInfo {
71
+ platform: 'darwin' | 'linux' | 'windows' | 'unknown';
72
+ version?: string;
73
+ screens?: ScreenInfo[];
74
+ }
75
+ export interface UIDetection {
76
+ elements: Array<{
77
+ id?: number;
78
+ type: string;
79
+ text: string;
80
+ x: number;
81
+ y: number;
82
+ width: number;
83
+ height: number;
84
+ }>;
85
+ ocr_text?: string;
86
+ }
87
+ export interface RuntimeCapabilities {
88
+ canObserve: boolean;
89
+ canInput: boolean;
90
+ screenshotMaxWidth?: number;
91
+ supportsChromeBridge: boolean;
92
+ supportsOcr: boolean;
93
+ supportsInterferenceDetection: boolean;
94
+ }
95
+ /**
96
+ * Session descriptor returned by Yggdrasil's POST /api/v1/sessions.
97
+ */
98
+ export interface SessionDescriptor {
99
+ id: string;
100
+ type: 'computer-use' | 'phone-use';
101
+ state: string;
102
+ observationEndpoint: string;
103
+ inputEndpoint: string;
104
+ capabilities: string[];
105
+ observationMethod: string;
106
+ realmId: string;
107
+ ownerId?: string;
108
+ participantIds?: string[];
109
+ createdAt: string;
110
+ updatedAt: string;
111
+ metadata?: Record<string, unknown>;
112
+ }
113
+ /**
114
+ * Response from createSession.
115
+ */
116
+ export interface CreateSessionResponse {
117
+ sessionId: string;
118
+ descriptor: SessionDescriptor;
119
+ }
120
+ /**
121
+ * Configuration for YggdrasilRuntime.
122
+ */
123
+ export interface YggdrasilRuntimeConfig {
124
+ /** Yggdrasil server URL (control plane — session create/terminate). */
125
+ yggdrasilUrl: string;
126
+ /** API key for Yggdrasil authentication. */
127
+ apiKey?: string;
128
+ /** Realm URL (data plane — observation/input). If not provided, derived from session descriptor. */
129
+ realmUrl?: string;
130
+ /** Session type to create. Defaults to 'computer-use'. */
131
+ sessionType?: 'computer-use' | 'phone-use';
132
+ /** Owner identity for this session. */
133
+ ownerId?: string;
134
+ /** Participant identities for this session. */
135
+ participantIds?: string[];
136
+ /** Requested capabilities. If omitted, type-based defaults apply. */
137
+ capabilities?: string[];
138
+ }
139
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Types for the YggdrasilRuntime — mirrors the ComputerUseRuntime interface
3
+ * from oasis-cognition so that @theaiinc/yggdrasil-runtime can be a drop-in
4
+ * replacement for LocalMacOSRuntime without depending on the Cognition codebase.
5
+ *
6
+ * These are structurally identical to the types in:
7
+ * apps/api-gateway/src/computer-use/computer-use-runtime.interface.ts
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * YggdrasilRuntime — ComputerUseRuntime implementation that bridges Cognition
3
+ * to Yggdrasil + Realm for remote desktop automation.
4
+ *
5
+ * Architecture:
6
+ * Yggdrasil is the control plane (session create/terminate).
7
+ * Realm is the data plane (observation/input).
8
+ *
9
+ * YggdrasilRuntime talks to Yggdrasil for session lifecycle and to Realm
10
+ * directly for screenshots and input actions.
11
+ *
12
+ * Cognition never knows Yggdrasil, Ratatoskr, or Realm exist.
13
+ */
14
+ import type { YggdrasilRuntimeConfig, SessionDescriptor, ScreenInfo, ScreenshotOptions, ClickOptions, TypeOptions, KeyPressOptions, ScrollOptions, HealthInfo, RuntimeCapabilities, ComputerActionResult, OcrResult, PageTextResult, WindowBounds, UIDetection } from './types.js';
15
+ export declare class YggdrasilRuntime {
16
+ readonly name = "yggdrasil";
17
+ readonly capabilities: RuntimeCapabilities;
18
+ private readonly yggdrasilClient;
19
+ private readonly config;
20
+ private session;
21
+ private realmClient;
22
+ private _running;
23
+ constructor(config: YggdrasilRuntimeConfig);
24
+ /**
25
+ * Check whether the Yggdrasil server is reachable and healthy.
26
+ */
27
+ health(): Promise<HealthInfo>;
28
+ /**
29
+ * Capture the current screen via Realm. Returns a base64-encoded JPEG.
30
+ */
31
+ getScreenImage(options?: ScreenshotOptions): Promise<string | undefined>;
32
+ /**
33
+ * List available displays via Realm.
34
+ */
35
+ listScreens(): Promise<ScreenInfo[]>;
36
+ /**
37
+ * Get the native CSS-pixel dimensions of the current display.
38
+ */
39
+ getScreenSize(): Promise<{
40
+ width: number;
41
+ height: number;
42
+ }>;
43
+ /**
44
+ * Perform OCR on the current screen.
45
+ * Requires `capabilities.supportsOcr === true` — currently not supported.
46
+ */
47
+ ocrScreenshot(_options?: ScreenshotOptions): Promise<OcrResult>;
48
+ /**
49
+ * Extract visible page text via Chrome Bridge / DOM.
50
+ * Requires `capabilities.supportsChromeBridge === true` — currently not supported.
51
+ */
52
+ getPageText(_options?: {
53
+ tabHint?: string;
54
+ }): Promise<PageTextResult>;
55
+ /**
56
+ * Parse UI elements from a screenshot.
57
+ * Currently not supported via Realm.
58
+ */
59
+ parseUI(_imageB64: string): Promise<UIDetection>;
60
+ /**
61
+ * Focus a window. Delegated to Realm's window management.
62
+ */
63
+ focusWindow(name: string): Promise<void>;
64
+ /**
65
+ * List open windows via Realm.
66
+ */
67
+ listWindows(): Promise<string[]>;
68
+ /**
69
+ * Open an application.
70
+ */
71
+ openApplication(name: string): Promise<void>;
72
+ /**
73
+ * Get bounding box of a window.
74
+ */
75
+ getWindowBounds(name: string): Promise<WindowBounds | null>;
76
+ /**
77
+ * Move a window to a specific display.
78
+ */
79
+ moveWindowToScreen(_windowName: string, _displayIndex: number): Promise<void>;
80
+ /**
81
+ * Click at the specified coordinates via Realm.
82
+ */
83
+ click(options: ClickOptions): Promise<void>;
84
+ /**
85
+ * Type text via Realm.
86
+ */
87
+ type(options: TypeOptions): Promise<void>;
88
+ /**
89
+ * Press a key or key combination via Realm.
90
+ */
91
+ keyPress(options: KeyPressOptions): Promise<void>;
92
+ /**
93
+ * Scroll via Realm.
94
+ */
95
+ scroll(options: ScrollOptions): Promise<void>;
96
+ /**
97
+ * Move the mouse to coordinates via Realm.
98
+ */
99
+ mouseMove(x: number, y: number, _duration?: number): Promise<void>;
100
+ /**
101
+ * Execute a high-level plan step. This is the entry point used by
102
+ * the CU controller's adaptive loop, matching the LocalMacOSRuntime pattern.
103
+ */
104
+ executeStep(action: string, target?: string, options?: {
105
+ text?: string;
106
+ x?: number;
107
+ y?: number;
108
+ keys?: string | string[];
109
+ windowName?: string;
110
+ displayIndex?: number;
111
+ clickCount?: number;
112
+ }, _sessionId?: string): Promise<ComputerActionResult>;
113
+ /**
114
+ * Start a session: creates a session via Yggdrasil and sets up the Realm client.
115
+ */
116
+ start(): Promise<SessionDescriptor>;
117
+ /**
118
+ * Stop the session: terminates it via Yggdrasil and cleans up.
119
+ */
120
+ stop(): Promise<void>;
121
+ /**
122
+ * Get the current session descriptor.
123
+ */
124
+ getSession(): SessionDescriptor | null;
125
+ /**
126
+ * Whether the runtime has an active session.
127
+ */
128
+ get running(): boolean;
129
+ launchOverlay(): Promise<void>;
130
+ startInterferenceDetection(): Promise<void>;
131
+ stopInterferenceDetection(): Promise<void>;
132
+ private getRealmClient;
133
+ /**
134
+ * Extract the base URL from a full observation endpoint path.
135
+ * e.g. "http://realm:8542/api/v1/realms/abc123/capture" → "http://realm:8542/api/v1/realms/abc123"
136
+ */
137
+ private getRealmBaseUrl;
138
+ }
139
+ //# sourceMappingURL=yggdrasil-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yggdrasil-runtime.d.ts","sourceRoot":"","sources":["../../src/yggdrasil-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,392 @@
1
+ /**
2
+ * YggdrasilRuntime — ComputerUseRuntime implementation that bridges Cognition
3
+ * to Yggdrasil + Realm for remote desktop automation.
4
+ *
5
+ * Architecture:
6
+ * Yggdrasil is the control plane (session create/terminate).
7
+ * Realm is the data plane (observation/input).
8
+ *
9
+ * YggdrasilRuntime talks to Yggdrasil for session lifecycle and to Realm
10
+ * directly for screenshots and input actions.
11
+ *
12
+ * Cognition never knows Yggdrasil, Ratatoskr, or Realm exist.
13
+ */
14
+ import axios from 'axios';
15
+ const ACTION_TIMEOUT_MS = 60_000;
16
+ export class YggdrasilRuntime {
17
+ name = 'yggdrasil';
18
+ capabilities = {
19
+ canObserve: true,
20
+ canInput: true,
21
+ screenshotMaxWidth: 1024,
22
+ supportsChromeBridge: false,
23
+ supportsOcr: false,
24
+ supportsInterferenceDetection: false,
25
+ };
26
+ yggdrasilClient;
27
+ config;
28
+ session = null;
29
+ realmClient = null;
30
+ _running = false;
31
+ constructor(config) {
32
+ const headers = { 'Content-Type': 'application/json' };
33
+ if (config.apiKey)
34
+ headers['x-api-key'] = config.apiKey;
35
+ this.config = {
36
+ ...config,
37
+ sessionType: config.sessionType ?? 'computer-use',
38
+ };
39
+ this.yggdrasilClient = axios.create({
40
+ baseURL: this.config.yggdrasilUrl.replace(/\/$/, ''),
41
+ headers,
42
+ timeout: ACTION_TIMEOUT_MS,
43
+ });
44
+ }
45
+ // ── Lifecycle ──────────────────────────────────────────────────────────
46
+ /**
47
+ * Check whether the Yggdrasil server is reachable and healthy.
48
+ */
49
+ async health() {
50
+ try {
51
+ const { data } = await this.yggdrasilClient.get('/health', { timeout: 5000 });
52
+ const info = {
53
+ platform: 'unknown',
54
+ version: data?.version,
55
+ };
56
+ if (this.session) {
57
+ info.screens = [{ index: 0, width: 0, height: 0, x: 0, y: 0 }];
58
+ }
59
+ return info;
60
+ }
61
+ catch {
62
+ return { platform: 'unknown' };
63
+ }
64
+ }
65
+ // ── Screen observation ─────────────────────────────────────────────────
66
+ /**
67
+ * Capture the current screen via Realm. Returns a base64-encoded JPEG.
68
+ */
69
+ async getScreenImage(options) {
70
+ const client = this.getRealmClient();
71
+ if (!client)
72
+ return undefined;
73
+ try {
74
+ const params = {};
75
+ if (options?.scale)
76
+ params.scale = options.scale;
77
+ if (options?.region)
78
+ params.region = options.region;
79
+ const { data } = await client.get('/capture', { params });
80
+ if (data?.screenshot) {
81
+ return data.screenshot;
82
+ }
83
+ }
84
+ catch {
85
+ // Observation failed — session may be terminated
86
+ }
87
+ return undefined;
88
+ }
89
+ /**
90
+ * List available displays via Realm.
91
+ */
92
+ async listScreens() {
93
+ const client = this.getRealmClient();
94
+ if (!client)
95
+ return [];
96
+ try {
97
+ const { data } = await client.get('/screens');
98
+ return data?.screens ?? [];
99
+ }
100
+ catch {
101
+ return [];
102
+ }
103
+ }
104
+ /**
105
+ * Get the native CSS-pixel dimensions of the current display.
106
+ */
107
+ async getScreenSize() {
108
+ const client = this.getRealmClient();
109
+ if (!client)
110
+ return { width: 1920, height: 1080 };
111
+ try {
112
+ const { data } = await client.get('/screens/size');
113
+ return data;
114
+ }
115
+ catch {
116
+ return { width: 1920, height: 1080 };
117
+ }
118
+ }
119
+ /**
120
+ * Perform OCR on the current screen.
121
+ * Requires `capabilities.supportsOcr === true` — currently not supported.
122
+ */
123
+ async ocrScreenshot(_options) {
124
+ return { text: '' };
125
+ }
126
+ /**
127
+ * Extract visible page text via Chrome Bridge / DOM.
128
+ * Requires `capabilities.supportsChromeBridge === true` — currently not supported.
129
+ */
130
+ async getPageText(_options) {
131
+ return { text: '' };
132
+ }
133
+ /**
134
+ * Parse UI elements from a screenshot.
135
+ * Currently not supported via Realm.
136
+ */
137
+ async parseUI(_imageB64) {
138
+ return { elements: [] };
139
+ }
140
+ // ── Window / app management ────────────────────────────────────────────
141
+ /**
142
+ * Focus a window. Delegated to Realm's window management.
143
+ */
144
+ async focusWindow(name) {
145
+ const client = this.getRealmClient();
146
+ if (!client)
147
+ throw new Error('No active session');
148
+ await client.post('/window/focus', { name }).catch(() => { });
149
+ }
150
+ /**
151
+ * List open windows via Realm.
152
+ */
153
+ async listWindows() {
154
+ const client = this.getRealmClient();
155
+ if (!client)
156
+ return [];
157
+ try {
158
+ const { data } = await client.get('/windows');
159
+ return data?.windows ?? [];
160
+ }
161
+ catch {
162
+ return [];
163
+ }
164
+ }
165
+ /**
166
+ * Open an application.
167
+ */
168
+ async openApplication(name) {
169
+ const client = this.getRealmClient();
170
+ if (!client)
171
+ throw new Error('No active session');
172
+ await client.post('/app/open', { name }).catch(() => { });
173
+ }
174
+ /**
175
+ * Get bounding box of a window.
176
+ */
177
+ async getWindowBounds(name) {
178
+ const client = this.getRealmClient();
179
+ if (!client)
180
+ return null;
181
+ try {
182
+ const { data } = await client.post('/window/bounds', { name });
183
+ return data?.bounds ?? null;
184
+ }
185
+ catch {
186
+ return null;
187
+ }
188
+ }
189
+ /**
190
+ * Move a window to a specific display.
191
+ */
192
+ async moveWindowToScreen(_windowName, _displayIndex) {
193
+ // Not yet supported
194
+ }
195
+ // ── Input actions ──────────────────────────────────────────────────────
196
+ /**
197
+ * Click at the specified coordinates via Realm.
198
+ */
199
+ async click(options) {
200
+ const client = this.getRealmClient();
201
+ if (!client)
202
+ throw new Error('No active session');
203
+ await client.post('/click', {
204
+ x: options.x,
205
+ y: options.y,
206
+ ...(options.clickCount && options.clickCount > 1 ? { click_count: options.clickCount } : {}),
207
+ ...(options.button && options.button !== 'left' ? { button: options.button } : {}),
208
+ });
209
+ }
210
+ /**
211
+ * Type text via Realm.
212
+ */
213
+ async type(options) {
214
+ const client = this.getRealmClient();
215
+ if (!client)
216
+ throw new Error('No active session');
217
+ await client.post('/type', {
218
+ text: options.text,
219
+ ...(options.replace ? { replace: true } : {}),
220
+ });
221
+ }
222
+ /**
223
+ * Press a key or key combination via Realm.
224
+ */
225
+ async keyPress(options) {
226
+ const client = this.getRealmClient();
227
+ if (!client)
228
+ throw new Error('No active session');
229
+ await client.post('/key', {
230
+ keys: typeof options.keys === 'string' ? options.keys : options.keys.join(','),
231
+ });
232
+ }
233
+ /**
234
+ * Scroll via Realm.
235
+ */
236
+ async scroll(options) {
237
+ const client = this.getRealmClient();
238
+ if (!client)
239
+ throw new Error('No active session');
240
+ await client.post('/scroll', {
241
+ deltaX: options.deltaX ?? 0,
242
+ deltaY: options.deltaY ?? 0,
243
+ });
244
+ }
245
+ /**
246
+ * Move the mouse to coordinates via Realm.
247
+ */
248
+ async mouseMove(x, y, _duration) {
249
+ const client = this.getRealmClient();
250
+ if (!client)
251
+ throw new Error('No active session');
252
+ await client.post('/mouse/move', { x, y });
253
+ }
254
+ // ── Convenience: execute a high-level step ──────────────────────────
255
+ /**
256
+ * Execute a high-level plan step. This is the entry point used by
257
+ * the CU controller's adaptive loop, matching the LocalMacOSRuntime pattern.
258
+ */
259
+ async executeStep(action, target, options, _sessionId) {
260
+ const a = action.toLowerCase();
261
+ if (a === 'screenshot' || a === 'read_screen') {
262
+ const img = await this.getScreenImage();
263
+ const result = { output: 'Screen captured' };
264
+ if (img !== undefined)
265
+ result.screenshot = img;
266
+ return result;
267
+ }
268
+ if (a === 'click' && options?.x !== undefined && options?.y !== undefined) {
269
+ const clickOpts = { x: options.x, y: options.y };
270
+ if (options.clickCount !== undefined)
271
+ clickOpts.clickCount = options.clickCount;
272
+ await this.click(clickOpts);
273
+ return { output: `Clicked at (${options.x}, ${options.y})` };
274
+ }
275
+ if ((a === 'type' || a === 'type_text') && options?.text) {
276
+ await this.type({ text: options.text });
277
+ return { output: `Typed "${options.text.slice(0, 60)}"` };
278
+ }
279
+ if (a === 'key_press' && options?.keys) {
280
+ await this.keyPress({ keys: options.keys });
281
+ return { output: `Pressed key: ${options.keys}` };
282
+ }
283
+ if (a === 'scroll') {
284
+ const scrollOpts = {};
285
+ if (options?.x !== undefined)
286
+ scrollOpts.deltaX = options.x;
287
+ if (options?.y !== undefined)
288
+ scrollOpts.deltaY = options.y;
289
+ await this.scroll(scrollOpts);
290
+ return { output: 'Scrolled' };
291
+ }
292
+ if (a === 'wait') {
293
+ await new Promise((r) => setTimeout(r, 1000));
294
+ return { output: 'Waited 1 second' };
295
+ }
296
+ if (a === 'focus_window' && options?.windowName) {
297
+ await this.focusWindow(options.windowName);
298
+ return { output: `Focused window: ${options.windowName}` };
299
+ }
300
+ if (a === 'open_app' && target) {
301
+ await this.openApplication(target);
302
+ return { output: `Opened app: ${target}` };
303
+ }
304
+ return { output: `Action "${action}" not supported by YggdrasilRuntime` };
305
+ }
306
+ // ── YggdrasilRuntime-specific methods ─────────────────────────────────
307
+ /**
308
+ * Start a session: creates a session via Yggdrasil and sets up the Realm client.
309
+ */
310
+ async start() {
311
+ const { data } = await this.yggdrasilClient.post('/api/v1/sessions', {
312
+ type: this.config.sessionType,
313
+ ...(this.config.ownerId !== undefined ? { ownerId: this.config.ownerId } : {}),
314
+ ...(this.config.participantIds !== undefined ? { participantIds: this.config.participantIds } : {}),
315
+ ...(this.config.capabilities !== undefined ? { capabilities: this.config.capabilities } : {}),
316
+ });
317
+ this.session = data.descriptor;
318
+ this._running = true;
319
+ // Create a direct Realm client using the observation endpoint base URL
320
+ const realmBase = this.config.realmUrl ?? this.getRealmBaseUrl(this.session.observationEndpoint);
321
+ const realmHeaders = { 'Content-Type': 'application/json' };
322
+ if (this.config.apiKey)
323
+ realmHeaders['x-api-key'] = this.config.apiKey;
324
+ this.realmClient = axios.create({
325
+ baseURL: realmBase,
326
+ headers: realmHeaders,
327
+ timeout: ACTION_TIMEOUT_MS,
328
+ });
329
+ return this.session;
330
+ }
331
+ /**
332
+ * Stop the session: terminates it via Yggdrasil and cleans up.
333
+ */
334
+ async stop() {
335
+ if (!this.session)
336
+ return;
337
+ try {
338
+ await this.yggdrasilClient.delete(`/api/v1/sessions/${this.session.id}`);
339
+ }
340
+ catch {
341
+ // Best-effort cleanup
342
+ }
343
+ this.session = null;
344
+ this.realmClient = null;
345
+ this._running = false;
346
+ }
347
+ /**
348
+ * Get the current session descriptor.
349
+ */
350
+ getSession() {
351
+ return this.session;
352
+ }
353
+ /**
354
+ * Whether the runtime has an active session.
355
+ */
356
+ get running() {
357
+ return this._running;
358
+ }
359
+ // ── Overlay & interference (not supported via Realm) ──────────────────
360
+ async launchOverlay() {
361
+ // Not supported via Realm
362
+ }
363
+ async startInterferenceDetection() {
364
+ // Not supported via Realm
365
+ }
366
+ async stopInterferenceDetection() {
367
+ // Not supported via Realm
368
+ }
369
+ // ── Private helpers ─────────────────────────────────────────
370
+ getRealmClient() {
371
+ return this.realmClient;
372
+ }
373
+ /**
374
+ * Extract the base URL from a full observation endpoint path.
375
+ * e.g. "http://realm:8542/api/v1/realms/abc123/capture" → "http://realm:8542/api/v1/realms/abc123"
376
+ */
377
+ getRealmBaseUrl(observationEndpoint) {
378
+ if (!observationEndpoint)
379
+ return '';
380
+ // Strip trailing /capture (or any path segment) to get the realm base
381
+ const url = new URL(observationEndpoint);
382
+ const pathParts = url.pathname.split('/').filter(Boolean);
383
+ // Keep everything up to and including the realmId (/api/v1/realms/:realmId)
384
+ const captureIdx = pathParts.indexOf('capture');
385
+ if (captureIdx !== -1) {
386
+ const basePath = '/' + pathParts.slice(0, captureIdx).join('/');
387
+ return `${url.protocol}//${url.host}${basePath}`;
388
+ }
389
+ return observationEndpoint.replace(/\/+$/, '');
390
+ }
391
+ }
392
+ //# sourceMappingURL=yggdrasil-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yggdrasil-runtime.js","sourceRoot":"","sources":["../../src/yggdrasil-runtime.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@theaiinc/yggdrasil-runtime",
3
+ "version": "0.1.1",
4
+ "description": "ComputerUseRuntime implementation that bridges Cognition to Yggdrasil + Realm — the remote desktop automation backend for Oasis",
5
+ "author": "The AI Inc",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "dist/src/index.js",
9
+ "types": "dist/src/index.d.ts",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/theaiinc/yggdrasil.git",
13
+ "directory": "packages/yggdrasil-runtime"
14
+ },
15
+ "homepage": "https://github.com/theaiinc/yggdrasil/blob/main/packages/yggdrasil-runtime/README.md",
16
+ "bugs": {
17
+ "url": "https://github.com/theaiinc/yggdrasil/issues"
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "scripts": {
23
+ "build": "tsc -p ./tsconfig.json",
24
+ "test": "vitest",
25
+ "lint": "eslint . --ext .ts",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "files": [
29
+ "dist/src/",
30
+ "README.md",
31
+ "LICENSE"
32
+ ],
33
+ "dependencies": {
34
+ "axios": "^1.6.7",
35
+ "nanoid": "^5.0.6"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^20.17.24",
39
+ "typescript": "^5.3.2",
40
+ "vitest": "^3.2.4"
41
+ },
42
+ "engines": {
43
+ "node": ">=18.0.0"
44
+ },
45
+ "keywords": [
46
+ "ai",
47
+ "agent",
48
+ "computer-use",
49
+ "desktop-automation",
50
+ "yggdrasil",
51
+ "realm",
52
+ "ratatoskr",
53
+ "oasis",
54
+ "cognition"
55
+ ]
56
+ }