@theaiinc/yggdrasil 0.2.3 → 0.3.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.
@@ -0,0 +1,136 @@
1
+ /**
2
+ * RealmRegistry — stores Realm templates advertised by runners and Realm instances.
3
+ *
4
+ * Responsibilities:
5
+ * - Tracks RealmTemplate[] per runner (what CAN be spawned)
6
+ * - Tracks Realm[] (what IS running)
7
+ * - Provides lookup by runner, template type, owner, and pool tag
8
+ *
9
+ * Yggdrasil is stateless-in-memory in v1. A future version may add
10
+ * FileSessionStore or database-backed persistence.
11
+ */
12
+ export class RealmRegistry {
13
+ /** Runner ID → realm templates they advertise. */
14
+ templatesByRunner = new Map();
15
+ /** Realm ID → realm instance + its template. */
16
+ realms = new Map();
17
+ // ── Template management ──────────────────────────────────────────────
18
+ /**
19
+ * Register or update realm templates for a runner.
20
+ */
21
+ setTemplates(runnerId, templates) {
22
+ this.templatesByRunner.set(runnerId, templates);
23
+ }
24
+ /**
25
+ * Get templates for a specific runner.
26
+ */
27
+ getTemplates(runnerId) {
28
+ return this.templatesByRunner.get(runnerId) ?? [];
29
+ }
30
+ /**
31
+ * Get all templates across all runners that match a given template type.
32
+ */
33
+ getTemplatesByType(type) {
34
+ const results = [];
35
+ for (const [runnerId, templates] of this.templatesByRunner.entries()) {
36
+ for (const template of templates) {
37
+ if (template.type === type) {
38
+ results.push({ runnerId, template });
39
+ }
40
+ }
41
+ }
42
+ return results;
43
+ }
44
+ /**
45
+ * Remove templates for a runner (e.g. on deregistration).
46
+ */
47
+ removeTemplates(runnerId) {
48
+ this.templatesByRunner.delete(runnerId);
49
+ }
50
+ // ── Realm instance management ────────────────────────────────────────
51
+ /**
52
+ * Register a new realm instance.
53
+ */
54
+ addRealm(realm, template) {
55
+ this.realms.set(realm.id, { realm, template });
56
+ }
57
+ /**
58
+ * Get a realm instance by ID.
59
+ */
60
+ getRealm(realmId) {
61
+ return this.realms.get(realmId)?.realm;
62
+ }
63
+ /**
64
+ * Get realm + template by ID.
65
+ */
66
+ getEntry(realmId) {
67
+ return this.realms.get(realmId);
68
+ }
69
+ /**
70
+ * Find a running realm by owner ID and template type (persistent realm affinity).
71
+ * This is how ownerId becomes a scheduling primitive.
72
+ */
73
+ findRealmByOwner(ownerId, templateType) {
74
+ for (const [, entry] of this.realms.entries()) {
75
+ if (entry.realm.ownerId === ownerId &&
76
+ entry.template.type === templateType &&
77
+ (entry.realm.state === 'running' || entry.realm.state === 'paused')) {
78
+ return entry.realm;
79
+ }
80
+ }
81
+ return undefined;
82
+ }
83
+ /**
84
+ * Find an idle realm in a pool (by template type, no owner).
85
+ */
86
+ findPooledRealm(templateType, poolTag) {
87
+ for (const [, entry] of this.realms.entries()) {
88
+ if (entry.realm.state === 'running' &&
89
+ entry.template.type === templateType &&
90
+ entry.realm.ownerId === undefined) {
91
+ if (poolTag === undefined || entry.realm.poolTag === poolTag) {
92
+ return entry.realm;
93
+ }
94
+ }
95
+ }
96
+ return undefined;
97
+ }
98
+ /**
99
+ * List all realm instances.
100
+ */
101
+ listRealms() {
102
+ return Array.from(this.realms.values()).map((e) => e.realm);
103
+ }
104
+ /**
105
+ * List realms for a specific runner.
106
+ */
107
+ listRealmsByRunner(runnerId) {
108
+ return Array.from(this.realms.values())
109
+ .filter((e) => e.realm.runnerId === runnerId)
110
+ .map((e) => e.realm);
111
+ }
112
+ /**
113
+ * Update realm state.
114
+ */
115
+ updateRealmState(realmId, state) {
116
+ const entry = this.realms.get(realmId);
117
+ if (entry) {
118
+ entry.realm.state = state;
119
+ entry.realm.updatedAt = new Date().toISOString();
120
+ }
121
+ }
122
+ /**
123
+ * Remove a realm.
124
+ */
125
+ removeRealm(realmId) {
126
+ this.realms.delete(realmId);
127
+ }
128
+ /**
129
+ * Clear all state (useful for testing).
130
+ */
131
+ clear() {
132
+ this.templatesByRunner.clear();
133
+ this.realms.clear();
134
+ }
135
+ }
136
+ //# sourceMappingURL=realm-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realm-registry.js","sourceRoot":"","sources":["../../../src/services/realm-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * RealmScheduler — makes allocation decisions for session requests.
3
+ *
4
+ * Yggdrasil owns all scheduling policy:
5
+ * - Which realm type?
6
+ * - Which owner?
7
+ * - Reuse allowed?
8
+ * - Spawn allowed?
9
+ * - Priority?
10
+ *
11
+ * Ratatoskr reports facts (CPU, memory, realms, templates).
12
+ * Yggdrasil decides. Ratatoskr may veto ("I cannot do that") but
13
+ * must never suggest alternatives — that is orchestration.
14
+ *
15
+ * Current implementation:
16
+ * Simple first-fit by template match + online status.
17
+ *
18
+ * Future:
19
+ * Resource-aware, owner-aware, cost-aware, affinity-aware,
20
+ * informed by Ratatoskr's /state endpoint.
21
+ */
22
+ import type { CreateSessionRequest, RealmAllocation, SessionCapability, RunnerInfo } from '../types/index.js';
23
+ import { RealmRegistry } from './realm-registry.js';
24
+ export declare class RealmScheduler {
25
+ private readonly registry;
26
+ private readonly getRunner;
27
+ constructor(registry: RealmRegistry, getRunner: (runnerId: string) => RunnerInfo | undefined);
28
+ /**
29
+ * Decide how to allocate a realm for a session request.
30
+ *
31
+ * Yggdrasil decides:
32
+ * - Which runner
33
+ * - Which template
34
+ * - Whether to spawn new or attach to existing
35
+ *
36
+ * Priority order:
37
+ * 1. Attach to existing realm owned by this owner (persistent realm)
38
+ * 2. Attach to a pooled idle realm (pre-warmed)
39
+ * 3. Spawn a new realm on a healthy runner
40
+ */
41
+ schedule(request: CreateSessionRequest): Promise<RealmAllocation>;
42
+ /**
43
+ * Resolve default capabilities for a template type when not explicitly provided.
44
+ */
45
+ static defaultCapabilitiesFor(type: string): SessionCapability[];
46
+ }
47
+ //# sourceMappingURL=realm-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realm-scheduler.d.ts","sourceRoot":"","sources":["../../../src/services/realm-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,UAAU,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAoBpD,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS;IAG1E;;;;;;;;;;;;OAYG;IACG,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC;IAqDvE;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE;CAGjE"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * RealmScheduler — makes allocation decisions for session requests.
3
+ *
4
+ * Yggdrasil owns all scheduling policy:
5
+ * - Which realm type?
6
+ * - Which owner?
7
+ * - Reuse allowed?
8
+ * - Spawn allowed?
9
+ * - Priority?
10
+ *
11
+ * Ratatoskr reports facts (CPU, memory, realms, templates).
12
+ * Yggdrasil decides. Ratatoskr may veto ("I cannot do that") but
13
+ * must never suggest alternatives — that is orchestration.
14
+ *
15
+ * Current implementation:
16
+ * Simple first-fit by template match + online status.
17
+ *
18
+ * Future:
19
+ * Resource-aware, owner-aware, cost-aware, affinity-aware,
20
+ * informed by Ratatoskr's /state endpoint.
21
+ */
22
+ /**
23
+ * Map from SessionType to the required RealmTemplateType.
24
+ */
25
+ const SESSION_TO_TEMPLATE = {
26
+ 'computer-use': 'ubuntu',
27
+ 'phone-use': 'android',
28
+ };
29
+ /**
30
+ * Default capabilities for a template when none are explicitly advertised.
31
+ */
32
+ const DEFAULT_TEMPLATE_CAPABILITIES = {
33
+ ubuntu: ['observe', 'mouse', 'keyboard', 'scroll', 'clipboard'],
34
+ android: ['observe', 'touch', 'keyboard', 'scroll'],
35
+ browser: ['observe', 'keyboard'],
36
+ windows: ['observe', 'mouse', 'keyboard', 'scroll'],
37
+ };
38
+ export class RealmScheduler {
39
+ registry;
40
+ getRunner;
41
+ constructor(registry, getRunner) {
42
+ this.registry = registry;
43
+ this.getRunner = getRunner;
44
+ }
45
+ /**
46
+ * Decide how to allocate a realm for a session request.
47
+ *
48
+ * Yggdrasil decides:
49
+ * - Which runner
50
+ * - Which template
51
+ * - Whether to spawn new or attach to existing
52
+ *
53
+ * Priority order:
54
+ * 1. Attach to existing realm owned by this owner (persistent realm)
55
+ * 2. Attach to a pooled idle realm (pre-warmed)
56
+ * 3. Spawn a new realm on a healthy runner
57
+ */
58
+ async schedule(request) {
59
+ const templateType = SESSION_TO_TEMPLATE[request.type];
60
+ if (!templateType) {
61
+ throw new Error(`No realm template available for session type: ${request.type}`);
62
+ }
63
+ // Priority 1: Persistent realm affinity by owner
64
+ if (request.ownerId) {
65
+ const existing = this.registry.findRealmByOwner(request.ownerId, templateType);
66
+ if (existing) {
67
+ const entry = this.registry.getEntry(existing.id);
68
+ return {
69
+ runnerId: existing.runnerId,
70
+ template: entry.template,
71
+ action: 'attach',
72
+ realmId: existing.id,
73
+ };
74
+ }
75
+ }
76
+ // Priority 2: Pooled idle realm
77
+ const pooled = this.registry.findPooledRealm(templateType);
78
+ if (pooled) {
79
+ const entry = this.registry.getEntry(pooled.id);
80
+ return {
81
+ runnerId: pooled.runnerId,
82
+ template: entry.template,
83
+ action: 'attach',
84
+ realmId: pooled.id,
85
+ };
86
+ }
87
+ // Priority 3: Find a runner that can host this template type
88
+ const candidates = this.registry.getTemplatesByType(templateType);
89
+ if (candidates.length === 0) {
90
+ throw new Error(`No runner available that can host realm type: ${templateType}`);
91
+ }
92
+ // Pick first healthy runner with capacity
93
+ for (const candidate of candidates) {
94
+ const runner = this.getRunner(candidate.runnerId);
95
+ if (runner && runner.status === 'online') {
96
+ return {
97
+ runnerId: candidate.runnerId,
98
+ template: candidate.template,
99
+ action: 'spawn',
100
+ };
101
+ }
102
+ }
103
+ throw new Error(`No online runner available for realm type: ${templateType}`);
104
+ }
105
+ /**
106
+ * Resolve default capabilities for a template type when not explicitly provided.
107
+ */
108
+ static defaultCapabilitiesFor(type) {
109
+ return DEFAULT_TEMPLATE_CAPABILITIES[type] ?? ['observe'];
110
+ }
111
+ }
112
+ //# sourceMappingURL=realm-scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realm-scheduler.js","sourceRoot":"","sources":["../../../src/services/realm-scheduler.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,194 @@ export interface LoggerConfig {
12
12
  format: 'json' | 'simple';
13
13
  transports: string[];
14
14
  }
15
+ /**
16
+ * Registration payload sent by a Realm instance (via Ratatoskr) to Yggdrasil.
17
+ * Realm announces itself after boot.
18
+ */
19
+ export interface RealmRegistration {
20
+ realmId: string;
21
+ runnerId: string;
22
+ /** The template type this realm was spawned from (e.g. "ubuntu", "android"). */
23
+ template: RealmTemplateType;
24
+ /** Realm software version. */
25
+ version: string;
26
+ /** Capabilities this realm instance provides. */
27
+ capabilities: SessionCapability[];
28
+ /** Live endpoints for observation and input. */
29
+ endpoints: {
30
+ observation: string;
31
+ input: string;
32
+ };
33
+ /** Future: Veil-issued token for authenticating registrations. */
34
+ registrationToken?: string | undefined;
35
+ startedAt: string;
36
+ }
37
+ /**
38
+ * Periodic heartbeat from a Realm instance (via Ratatoskr) to Yggdrasil.
39
+ */
40
+ export interface RealmHeartbeat {
41
+ realmId: string;
42
+ uptime: number;
43
+ healthy: boolean;
44
+ memoryMb?: number | undefined;
45
+ cpuPercent?: number | undefined;
46
+ activeSessions: number;
47
+ }
48
+ /**
49
+ * Deregistration payload sent by a Realm instance on shutdown.
50
+ */
51
+ export interface RealmDeregistration {
52
+ realmId: string;
53
+ reason: 'shutdown' | 'error' | 'replaced';
54
+ }
55
+ /** Supported session types for interaction with execution environments. */
56
+ export type SessionType = 'computer-use' | 'phone-use';
57
+ /** Lifecycle states for a session. */
58
+ export type SessionState = 'creating' | 'active' | 'paused' | 'completed' | 'failed' | 'terminated';
59
+ /** Observation method chosen by Realm — consumers must not depend on a specific implementation. */
60
+ export type ObservationMethod = 'accessibility_tree' | 'dom_snapshot' | 'screenshot' | 'video_stream' | 'hybrid';
61
+ /** Input capabilities a session may expose. */
62
+ export type InputCapability = 'mouse' | 'keyboard' | 'touch' | 'scroll' | 'drag' | 'clipboard';
63
+ /**
64
+ * Capabilities a session may support — used for session contracts and Veil authorization.
65
+ * Broader than InputCapability: includes observation and device-level capabilities.
66
+ */
67
+ export type SessionCapability = 'observe' | 'mouse' | 'keyboard' | 'touch' | 'scroll' | 'drag' | 'clipboard' | 'audio' | 'camera';
68
+ /** Types of execution environments a runner can host. */
69
+ export type RealmTemplateType = 'ubuntu' | 'android' | 'browser' | 'windows';
70
+ /** Lifecycle states for a Realm instance. */
71
+ export type RealmState = 'creating' | 'running' | 'paused' | 'unhealthy' | 'destroyed';
72
+ /**
73
+ * A realm template advertised by a runner via Ratatoskr.
74
+ * Templates describe what kinds of environments a runner CAN spawn,
75
+ * not what is currently running.
76
+ */
77
+ export interface RealmTemplate {
78
+ id: string;
79
+ type: RealmTemplateType;
80
+ /** Capabilities this template provides when a realm is spawned (e.g. ["observe", "mouse", "keyboard"]). */
81
+ capabilities: SessionCapability[];
82
+ }
83
+ /**
84
+ * A running Realm instance — the actual execution environment that sessions attach to.
85
+ *
86
+ * Sessions do NOT run on runners. Sessions run on realms. Realms run on runners.
87
+ */
88
+ export interface Realm {
89
+ id: string;
90
+ templateId: string;
91
+ runnerId: string;
92
+ /** The entity that owns or requested this realm (used for persistent realm affinity). */
93
+ ownerId?: string | undefined;
94
+ state: RealmState;
95
+ endpoints: {
96
+ /** Full URL for observation (e.g. screenshots, a11y tree). */
97
+ observation: string;
98
+ /** Full URL for input (e.g. click, type, scroll). */
99
+ input: string;
100
+ };
101
+ createdAt: string;
102
+ updatedAt: string;
103
+ /** Timestamp of the last heartbeat received from this realm. */
104
+ lastHeartbeat?: string | undefined;
105
+ /** Future: Veil-issued token for authenticating realm operations. */
106
+ registrationToken?: string | undefined;
107
+ /** Pool tag — if set, this realm can be reused for sessions matching the same template+owner. */
108
+ poolTag?: string | undefined;
109
+ }
110
+ /**
111
+ * Result of a scheduling decision. The scheduler returns an allocation;
112
+ * the provisioner acts on it.
113
+ */
114
+ export interface RealmAllocation {
115
+ runnerId: string;
116
+ template: RealmTemplate;
117
+ /** Whether to spawn a new realm or attach to an existing one. */
118
+ action: 'spawn' | 'attach';
119
+ /** Set when attaching to an existing realm. */
120
+ realmId?: string | undefined;
121
+ }
122
+ /**
123
+ * Descriptor for an active session.
124
+ *
125
+ * Yggdrasil is the **control plane** — it creates/terminates/pauses/resumes sessions.
126
+ * Realm is the **data plane** — observation and input go DIRECTLY to Realm endpoints,
127
+ * NOT through Yggdrasil.
128
+ *
129
+ * Consumers (Cognition via ComputerUseRuntime) use observationEndpoint and
130
+ * inputEndpoint to talk to Realm directly. Yggdrasil never proxies observe/input calls.
131
+ */
132
+ export interface SessionDescriptor {
133
+ id: string;
134
+ type: SessionType;
135
+ state: SessionState;
136
+ /** Full Realm URL for observation (e.g. screenshots, a11y tree, DOM). Consumers talk to Realm directly. */
137
+ observationEndpoint: string;
138
+ /** Full Realm URL for input (e.g. click, type, scroll). Consumers talk to Realm directly. */
139
+ inputEndpoint: string;
140
+ /** Capabilities this session supports (e.g. ["mouse", "keyboard"]). */
141
+ capabilities: SessionCapability[];
142
+ /** The observation method Realm chose (internal detail — informational only). */
143
+ observationMethod: ObservationMethod;
144
+ /** Realm ID backing this session. */
145
+ realmId: string;
146
+ /** Identity of the entity that owns this session. */
147
+ ownerId?: string | undefined;
148
+ /** Identities of participants allowed to interact with this session. */
149
+ participantIds?: string[] | undefined;
150
+ createdAt: string;
151
+ updatedAt: string;
152
+ metadata?: Record<string, unknown> | undefined;
153
+ }
154
+ /** Request to create a new interaction session. */
155
+ export interface CreateSessionRequest {
156
+ type: SessionType;
157
+ ownerId?: string | undefined;
158
+ participantIds?: string[] | undefined;
159
+ /** Requested capabilities for this session. If omitted, type defaults apply. */
160
+ capabilities?: SessionCapability[] | undefined;
161
+ realmId?: string | undefined;
162
+ metadata?: Record<string, unknown> | undefined;
163
+ }
164
+ /** Response from creating a session. */
165
+ export interface CreateSessionResponse {
166
+ sessionId: string;
167
+ descriptor: SessionDescriptor;
168
+ }
169
+ /** Observation payload returned by a session's observe endpoint. */
170
+ export interface SessionObservation {
171
+ /** Base64-encoded screenshot (when method is screenshot or hybrid). */
172
+ screenshot?: string | undefined;
173
+ /** Accessibility tree snapshot (when method is accessibility_tree or hybrid). */
174
+ accessibilityTree?: unknown;
175
+ /** DOM snapshot (when method is dom_snapshot or hybrid). */
176
+ domSnapshot?: unknown;
177
+ /** Whether PII redaction was applied. */
178
+ piiRedacted?: boolean | undefined;
179
+ /** Timestamp of the observation. */
180
+ timestamp: string;
181
+ /** Structured data for JSON-based observation (e.g. UI element tree). */
182
+ data?: Record<string, unknown> | undefined;
183
+ }
184
+ /** Input action sent to a session. */
185
+ export interface SessionInput {
186
+ type: InputCapability;
187
+ params: Record<string, unknown>;
188
+ }
189
+ /** Result of an input action. */
190
+ export interface SessionInputResult {
191
+ success: boolean;
192
+ error?: string | undefined;
193
+ }
194
+ /** Session health reported by Ratatoskr to Yggdrasil. */
195
+ export interface SessionHealth {
196
+ sessionId: string;
197
+ state: SessionState;
198
+ realmId: string;
199
+ lastObservationAt?: string | undefined;
200
+ lastInputAt?: string | undefined;
201
+ errorCount: number;
202
+ }
15
203
  export interface SystemResources {
16
204
  cpu: {
17
205
  load1: number;
@@ -49,6 +237,8 @@ export interface RunnerInfo {
49
237
  endpoint: string;
50
238
  version: string;
51
239
  capabilities: string[];
240
+ /** Realm templates this runner can spawn. */
241
+ realmTemplates: RealmTemplate[];
52
242
  labels: Record<string, string>;
53
243
  lastHeartbeat: Date;
54
244
  status: 'online' | 'offline';
@@ -62,6 +252,8 @@ export interface RegisterRunnerPayload {
62
252
  endpoint?: string;
63
253
  version?: string;
64
254
  capabilities?: string[];
255
+ /** Realm templates this runner can spawn. */
256
+ realmTemplates?: RealmTemplate[];
65
257
  labels?: Record<string, string>;
66
258
  metadata?: Record<string, unknown>;
67
259
  resources?: SystemResources;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAID,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE;QACH,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,aAAa,EAAE,IAAI,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAID,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,24 @@
1
1
  {
2
2
  "name": "@theaiinc/yggdrasil",
3
- "version": "0.2.3",
4
- "description": "Distributed runner orchestration controller — registration, heartbeat, task dispatch, lease management, and Prometheus metrics for Ratatoskr agents",
3
+ "version": "0.3.0",
4
+ "description": "Distributed runner orchestration controller — registration, heartbeat, task dispatch, lease management, Realm lifecycle, and Prometheus metrics for Ratatoskr agents",
5
5
  "author": "The AI Inc",
6
6
  "license": "MIT",
7
7
  "type": "module",
8
8
  "main": "dist/src/index.js",
9
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"
14
+ },
15
+ "homepage": "https://github.com/theaiinc/yggdrasil/blob/main/packages/yggdrasil/README.md",
16
+ "bugs": {
17
+ "url": "https://github.com/theaiinc/yggdrasil/issues"
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
10
22
  "scripts": {
11
23
  "build": "tsc -p ./tsconfig.json",
12
24
  "dev": "nodemon --exec \"node --loader ts-node/esm src/orchestration-controller.ts\"",