@rome-os/app-runtime 0.0.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.
@@ -0,0 +1,57 @@
1
+ export interface DiscoveredBrowserEndpoint {
2
+ name: string;
3
+ browserUrl: string;
4
+ }
5
+ export interface BrowserCapabilityDiscovery {
6
+ getBrowserEndpoints(): DiscoveredBrowserEndpoint[];
7
+ }
8
+ interface PageReadyProbe {
9
+ readyState?: string;
10
+ href?: string;
11
+ }
12
+ export interface OpenedPageSession {
13
+ endpoint: DiscoveredBrowserEndpoint;
14
+ session: CdpSession;
15
+ close(): Promise<void>;
16
+ }
17
+ export interface BuildBrowserScriptExpressionOptions {
18
+ scriptSource: string;
19
+ entrypointExpression: string;
20
+ args?: unknown[];
21
+ autorunFlag?: string;
22
+ missingEntrypointMessage?: string;
23
+ }
24
+ export interface RunDiscoveredBrowserScriptOptions {
25
+ pageUrl: string;
26
+ scriptUrl: URL;
27
+ entrypointExpression: string;
28
+ args?: unknown[];
29
+ autorunFlag?: string;
30
+ missingEntrypointMessage?: string;
31
+ }
32
+ export interface RunDiscoveredBrowserScriptResult<TResult> {
33
+ endpoint: DiscoveredBrowserEndpoint;
34
+ result: TResult;
35
+ close(): Promise<void>;
36
+ }
37
+ export declare function pickBrowserEndpoint(endpoints: DiscoveredBrowserEndpoint[]): DiscoveredBrowserEndpoint | null;
38
+ export declare function openDiscoveredPageSession(capabilityDiscovery: BrowserCapabilityDiscovery, pageUrl: string): Promise<OpenedPageSession>;
39
+ export declare function isPageReadyForAutomation(probe: PageReadyProbe): boolean;
40
+ export declare class CdpSession {
41
+ private readonly socket;
42
+ private nextId;
43
+ private pending;
44
+ private closed;
45
+ private constructor();
46
+ static connect(webSocketUrl: string): Promise<CdpSession>;
47
+ send<TResult = unknown>(method: string, params?: Record<string, unknown>): Promise<TResult>;
48
+ evaluateByValue<TValue>(expression: string): Promise<TValue>;
49
+ close(): Promise<void>;
50
+ private handleMessage;
51
+ private rejectPending;
52
+ }
53
+ export declare function loadCachedScriptSource(scriptUrl: URL): Promise<string>;
54
+ export declare function buildBrowserScriptExpression(options: BuildBrowserScriptExpressionOptions): string;
55
+ export declare function runDiscoveredBrowserScript<TResult>(capabilityDiscovery: BrowserCapabilityDiscovery, options: RunDiscoveredBrowserScriptOptions): Promise<RunDiscoveredBrowserScriptResult<TResult>>;
56
+ export {};
57
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,mBAAmB,IAAI,yBAAyB,EAAE,CAAC;CACpD;AAiCD,UAAU,cAAc;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,OAAO,EAAE,UAAU,CAAC;IACpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,mCAAmC;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,GAAG,CAAC;IACf,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,gCAAgC,CAAC,OAAO;IACvD,QAAQ,EAAE,yBAAyB,CAAC;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AA+CD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,yBAAyB,EAAE,GACrC,yBAAyB,GAAG,IAAI,CAWlC;AAED,wBAAsB,yBAAyB,CAC7C,mBAAmB,EAAE,0BAA0B,EAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC,CAyB5B;AAqCD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAOvE;AAED,qBAAa,UAAU;IAWD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAV3C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAMX;IACJ,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;WAeM,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAYzD,IAAI,CAAC,OAAO,GAAG,OAAO,EAC1B,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,OAAO,CAAC;IAgCb,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB5D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,aAAa;CAMtB;AAED,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAc5E;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,mCAAmC,GAC3C,MAAM,CAmCR;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EACtD,mBAAmB,EAAE,0BAA0B,EAC/C,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,gCAAgC,CAAC,OAAO,CAAC,CAAC,CAuBpD"}
@@ -0,0 +1,326 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import WebSocket from "ws";
3
+ const HTTP_TIMEOUT_MS = 10_000;
4
+ const PAGE_READY_TIMEOUT_MS = 20_000;
5
+ const PAGE_READY_POLL_MS = 500;
6
+ const PAGE_READY_STABLE_POLLS = 2;
7
+ const scriptSourceCache = new Map();
8
+ function delay(ms) {
9
+ return new Promise((resolve) => {
10
+ setTimeout(resolve, ms);
11
+ });
12
+ }
13
+ function normalizeBrowserUrl(browserUrl) {
14
+ return browserUrl.endsWith("/") ? browserUrl.slice(0, -1) : browserUrl;
15
+ }
16
+ async function openPage(browserUrl, pageUrl) {
17
+ const normalizedBrowserUrl = normalizeBrowserUrl(browserUrl);
18
+ const endpoint = `${normalizedBrowserUrl}/json/new?${encodeURIComponent(pageUrl)}`;
19
+ let response = await fetch(endpoint, {
20
+ method: "PUT",
21
+ signal: AbortSignal.timeout(HTTP_TIMEOUT_MS),
22
+ });
23
+ if (response.status === 405) {
24
+ response = await fetch(endpoint, {
25
+ method: "GET",
26
+ signal: AbortSignal.timeout(HTTP_TIMEOUT_MS),
27
+ });
28
+ }
29
+ if (!response.ok) {
30
+ throw new Error(`Failed to open a CDP page at ${normalizedBrowserUrl}: ${response.status}`);
31
+ }
32
+ return (await response.json());
33
+ }
34
+ async function closePage(browserUrl, targetId) {
35
+ const normalizedBrowserUrl = normalizeBrowserUrl(browserUrl);
36
+ try {
37
+ await fetch(`${normalizedBrowserUrl}/json/close/${encodeURIComponent(targetId)}`, {
38
+ method: "GET",
39
+ signal: AbortSignal.timeout(HTTP_TIMEOUT_MS),
40
+ });
41
+ }
42
+ catch {
43
+ // Best effort cleanup.
44
+ }
45
+ }
46
+ export function pickBrowserEndpoint(endpoints) {
47
+ if (endpoints.length === 0) {
48
+ return null;
49
+ }
50
+ const sorted = [...endpoints].sort((left, right) => left.name.localeCompare(right.name));
51
+ return (sorted.find((endpoint) => endpoint.name === "cdp-local-chromium") ??
52
+ sorted.find((endpoint) => endpoint.name.includes("local")) ??
53
+ sorted[0]);
54
+ }
55
+ export async function openDiscoveredPageSession(capabilityDiscovery, pageUrl) {
56
+ const endpoint = pickBrowserEndpoint(capabilityDiscovery.getBrowserEndpoints());
57
+ if (!endpoint) {
58
+ throw new Error("No discovered browser endpoints are available");
59
+ }
60
+ const page = await openPage(endpoint.browserUrl, pageUrl);
61
+ if (!page.id || !page.webSocketDebuggerUrl) {
62
+ throw new Error(`CDP did not return a debuggable page target for ${pageUrl}`);
63
+ }
64
+ const session = await CdpSession.connect(page.webSocketDebuggerUrl);
65
+ await session.send("Page.enable");
66
+ await session.send("Runtime.enable");
67
+ await session.send("Page.bringToFront");
68
+ await waitForPageReady(session);
69
+ return {
70
+ endpoint,
71
+ session,
72
+ close: async () => {
73
+ await session.close();
74
+ await closePage(endpoint.browserUrl, page.id);
75
+ },
76
+ };
77
+ }
78
+ async function waitForPageReady(session) {
79
+ const deadline = Date.now() + PAGE_READY_TIMEOUT_MS;
80
+ let stableReadyPolls = 0;
81
+ let lastReadyHref = null;
82
+ while (Date.now() < deadline) {
83
+ try {
84
+ const probe = await session.evaluateByValue("({ readyState: document.readyState, href: location.href })");
85
+ const href = probe.href?.trim() ?? "";
86
+ if (isPageReadyForAutomation(probe)) {
87
+ stableReadyPolls = href === lastReadyHref ? stableReadyPolls + 1 : 1;
88
+ lastReadyHref = href;
89
+ if (stableReadyPolls >= PAGE_READY_STABLE_POLLS) {
90
+ return;
91
+ }
92
+ }
93
+ else {
94
+ stableReadyPolls = 0;
95
+ lastReadyHref = href || null;
96
+ }
97
+ }
98
+ catch {
99
+ stableReadyPolls = 0;
100
+ lastReadyHref = null;
101
+ }
102
+ await delay(PAGE_READY_POLL_MS);
103
+ }
104
+ throw new Error(`Timed out waiting for the page to finish loading after ${PAGE_READY_TIMEOUT_MS}ms`);
105
+ }
106
+ export function isPageReadyForAutomation(probe) {
107
+ const href = probe.href?.trim();
108
+ if (!href || href === "about:blank") {
109
+ return false;
110
+ }
111
+ return probe.readyState === "interactive" || probe.readyState === "complete";
112
+ }
113
+ export class CdpSession {
114
+ socket;
115
+ nextId = 1;
116
+ pending = new Map();
117
+ closed = false;
118
+ constructor(socket) {
119
+ this.socket = socket;
120
+ this.socket.on("message", (data) => {
121
+ this.handleMessage(data.toString());
122
+ });
123
+ this.socket.on("close", () => {
124
+ this.closed = true;
125
+ this.rejectPending(new Error("CDP connection closed"));
126
+ });
127
+ this.socket.on("error", (error) => {
128
+ this.rejectPending(error instanceof Error ? error : new Error(`CDP socket error: ${String(error)}`));
129
+ });
130
+ }
131
+ static async connect(webSocketUrl) {
132
+ const socket = await new Promise((resolve, reject) => {
133
+ const ws = new WebSocket(webSocketUrl);
134
+ ws.once("open", () => resolve(ws));
135
+ ws.once("error", (error) => {
136
+ reject(error instanceof Error ? error : new Error(`CDP socket error: ${String(error)}`));
137
+ });
138
+ });
139
+ return new CdpSession(socket);
140
+ }
141
+ async send(method, params) {
142
+ if (this.closed) {
143
+ throw new Error("CDP connection is already closed");
144
+ }
145
+ const id = this.nextId++;
146
+ const payload = JSON.stringify({ id, method, params });
147
+ const responsePromise = new Promise((resolve, reject) => {
148
+ this.pending.set(id, {
149
+ resolve: (value) => resolve(value),
150
+ reject,
151
+ });
152
+ });
153
+ this.socket.send(payload, (error) => {
154
+ if (!error) {
155
+ return;
156
+ }
157
+ const pending = this.pending.get(id);
158
+ if (!pending) {
159
+ return;
160
+ }
161
+ this.pending.delete(id);
162
+ pending.reject(error instanceof Error ? error : new Error(String(error)));
163
+ });
164
+ return await responsePromise;
165
+ }
166
+ async evaluateByValue(expression) {
167
+ const response = await this.send("Runtime.evaluate", {
168
+ expression,
169
+ awaitPromise: true,
170
+ returnByValue: true,
171
+ });
172
+ if (response.exceptionDetails) {
173
+ const description = response.exceptionDetails.exception?.description ??
174
+ response.exceptionDetails.exception?.value ??
175
+ response.exceptionDetails.text ??
176
+ "Unknown CDP runtime evaluation error";
177
+ throw new Error(String(description));
178
+ }
179
+ return response.result.value;
180
+ }
181
+ async close() {
182
+ if (this.closed) {
183
+ return;
184
+ }
185
+ this.closed = true;
186
+ await new Promise((resolve) => {
187
+ this.socket.once("close", () => resolve());
188
+ this.socket.close();
189
+ });
190
+ }
191
+ handleMessage(message) {
192
+ let parsed;
193
+ try {
194
+ parsed = JSON.parse(message);
195
+ }
196
+ catch {
197
+ return;
198
+ }
199
+ if (typeof parsed.id !== "number") {
200
+ return;
201
+ }
202
+ const pending = this.pending.get(parsed.id);
203
+ if (!pending) {
204
+ return;
205
+ }
206
+ this.pending.delete(parsed.id);
207
+ if (parsed.error?.message) {
208
+ pending.reject(new Error(parsed.error.message));
209
+ return;
210
+ }
211
+ pending.resolve(parsed.result);
212
+ }
213
+ rejectPending(error) {
214
+ for (const [id, pending] of this.pending.entries()) {
215
+ this.pending.delete(id);
216
+ pending.reject(error);
217
+ }
218
+ }
219
+ }
220
+ export async function loadCachedScriptSource(scriptUrl) {
221
+ const cacheKey = scriptUrl.href;
222
+ let sourcePromise = scriptSourceCache.get(cacheKey);
223
+ if (!sourcePromise) {
224
+ sourcePromise = readFile(scriptUrl, "utf-8");
225
+ scriptSourceCache.set(cacheKey, sourcePromise);
226
+ }
227
+ try {
228
+ return await sourcePromise;
229
+ }
230
+ catch (error) {
231
+ scriptSourceCache.delete(cacheKey);
232
+ throw error;
233
+ }
234
+ }
235
+ export function buildBrowserScriptExpression(options) {
236
+ const { scriptSource, entrypointExpression, args = [], autorunFlag, missingEntrypointMessage = `${entrypointExpression} is not defined after loading the browser script`, } = options;
237
+ const serializedArgs = args.map((arg) => serializeJavascriptLiteral(arg)).join(", ");
238
+ const serializedAutorunFlag = autorunFlag ? JSON.stringify(autorunFlag) : null;
239
+ return `
240
+ (async () => {
241
+ ${serializedAutorunFlag ? `globalThis[${serializedAutorunFlag}] = false;` : ""}
242
+ try {
243
+ ${scriptSource}
244
+ const __romeBrowserScriptEntrypoint = ${entrypointExpression};
245
+ if (typeof __romeBrowserScriptEntrypoint !== "function") {
246
+ throw new Error(${JSON.stringify(missingEntrypointMessage)});
247
+ }
248
+
249
+ return await __romeBrowserScriptEntrypoint(${serializedArgs});
250
+ } finally {
251
+ ${serializedAutorunFlag
252
+ ? `try {
253
+ delete globalThis[${serializedAutorunFlag}];
254
+ } catch {
255
+ globalThis[${serializedAutorunFlag}] = undefined;
256
+ }`
257
+ : ""}
258
+ }
259
+ })()
260
+ `.trim();
261
+ }
262
+ export async function runDiscoveredBrowserScript(capabilityDiscovery, options) {
263
+ const scriptSource = await loadCachedScriptSource(options.scriptUrl);
264
+ const expression = buildBrowserScriptExpression({
265
+ scriptSource,
266
+ entrypointExpression: options.entrypointExpression,
267
+ args: options.args,
268
+ autorunFlag: options.autorunFlag,
269
+ missingEntrypointMessage: options.missingEntrypointMessage,
270
+ });
271
+ const page = await openDiscoveredPageSession(capabilityDiscovery, options.pageUrl);
272
+ try {
273
+ const result = await page.session.evaluateByValue(expression);
274
+ return {
275
+ endpoint: page.endpoint,
276
+ result,
277
+ close: page.close,
278
+ };
279
+ }
280
+ catch (error) {
281
+ await page.close();
282
+ throw error;
283
+ }
284
+ }
285
+ function serializeJavascriptLiteral(value) {
286
+ if (value === undefined) {
287
+ return "undefined";
288
+ }
289
+ if (value === null) {
290
+ return "null";
291
+ }
292
+ if (typeof value === "string") {
293
+ return JSON.stringify(value);
294
+ }
295
+ if (typeof value === "number") {
296
+ if (!Number.isFinite(value)) {
297
+ throw new Error("Browser script arguments must be finite numbers");
298
+ }
299
+ return String(value);
300
+ }
301
+ if (typeof value === "boolean") {
302
+ return String(value);
303
+ }
304
+ if (Array.isArray(value)) {
305
+ return `[${value.map((entry) => serializeJavascriptLiteral(entry)).join(", ")}]`;
306
+ }
307
+ if (isPlainObject(value)) {
308
+ const properties = Object.entries(value).map(([key, entryValue]) => {
309
+ const propertyKey = isValidIdentifier(key) ? key : JSON.stringify(key);
310
+ return `${propertyKey}: ${serializeJavascriptLiteral(entryValue)}`;
311
+ });
312
+ return `{ ${properties.join(", ")} }`;
313
+ }
314
+ throw new Error(`Unsupported browser script argument type: ${typeof value}`);
315
+ }
316
+ function isPlainObject(value) {
317
+ if (Object.prototype.toString.call(value) !== "[object Object]") {
318
+ return false;
319
+ }
320
+ const prototype = Object.getPrototypeOf(value);
321
+ return prototype === null || prototype === Object.prototype;
322
+ }
323
+ function isValidIdentifier(value) {
324
+ return /^[A-Za-z_$][A-Za-z0-9_$]*$/u.test(value);
325
+ }
326
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,413 @@
1
+ import type { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
2
+ export * from "./browser.js";
3
+ export { getWorkerRpc, isWorkerRpcResponse, WorkerRpcTimeoutError, WorkerRpcDisconnectError, type RpcResponseMessage, } from "./worker-rpc.js";
4
+ export type SpanAttributes = Record<string, unknown>;
5
+ export interface TelemetryBridge {
6
+ withRomeSpan<T>(name: string, attrs: SpanAttributes, fn: () => Promise<T>): Promise<T>;
7
+ startRomeSpan(name: string, attrs?: SpanAttributes): void;
8
+ currentSessionId(): string | undefined;
9
+ runWithSession<T>(sessionId: string, fn: () => T): T;
10
+ }
11
+ /**
12
+ * Core calls this at `initTelemetry()` time to wire the real OTEL-backed
13
+ * impls into the SDK. Passing `null` unregisters (useful in tests).
14
+ */
15
+ export declare function setTelemetryBridge(bridge: TelemetryBridge | null): void;
16
+ /**
17
+ * Run `fn` inside a `name` span with `attrs` attached. If no bridge is
18
+ * registered (e.g., pure unit test without core's telemetry initialized)
19
+ * the span is a no-op and `fn` runs verbatim.
20
+ */
21
+ export declare function withRomeSpan<T>(name: string, attrs: SpanAttributes, fn: () => Promise<T>): Promise<T>;
22
+ /**
23
+ * Start a detached span. No-op if no bridge is registered. The SDK does not
24
+ * return a `Span` handle to apps — apps should prefer `withRomeSpan` /
25
+ * `withSdkSpan` which bracket their own work.
26
+ */
27
+ export declare function startRomeSpan(name: string, attrs?: SpanAttributes): void;
28
+ /** Current session id from core's AsyncLocalStorage, or `undefined`. */
29
+ export declare function currentSessionId(): string | undefined;
30
+ /**
31
+ * Run `fn` inside a fresh session context. If no bridge is registered the
32
+ * function runs verbatim with no context established.
33
+ */
34
+ export declare function runWithSession<T>(sessionId: string, fn: () => T): T;
35
+ /**
36
+ * Wrap `fn` in a `sdk:<methodName>` span with the method name stamped as
37
+ * `sdk.method`. Extra `attrs` merge in (e.g., `rome.app.name`). Apps call
38
+ * this from their own code to opt in to tracing without importing OTEL.
39
+ */
40
+ export declare function withSdkSpan<T>(methodName: string, attrs: SpanAttributes, fn: () => Promise<T>): Promise<T>;
41
+ export interface ActionConfig {
42
+ name: string;
43
+ type: "system" | "custom";
44
+ description: string;
45
+ entry?: string;
46
+ complexity: "simple" | "moderate" | "complex";
47
+ speed: "fast" | "moderate" | "slow";
48
+ reliability: "high" | "medium" | "low";
49
+ sideEffects: "read-only" | "write";
50
+ requiresApproval?: boolean;
51
+ cancellable?: boolean;
52
+ webhook?: boolean;
53
+ }
54
+ export interface Action {
55
+ config: ActionConfig;
56
+ inputSchema?: Record<string, unknown>;
57
+ execute(args: Record<string, unknown>): Promise<ActionResult>;
58
+ /**
59
+ * Optional preview renderer. Returns a structured payload describing what
60
+ * the action would do, used to build approval cards shown to the guardian.
61
+ * Pure function over args — no I/O.
62
+ */
63
+ preview?(args: Record<string, unknown>): PreviewPayload;
64
+ }
65
+ export type PreviewPayload = {
66
+ kind: "sensitive_message";
67
+ channel: string;
68
+ threadId: string;
69
+ text: string;
70
+ reason?: string;
71
+ } | {
72
+ kind: "generic";
73
+ title: string;
74
+ summary: string;
75
+ fields?: {
76
+ label: string;
77
+ value: string;
78
+ }[];
79
+ };
80
+ export interface ActionResult {
81
+ success: boolean;
82
+ data?: unknown;
83
+ error?: string;
84
+ pendingApproval?: {
85
+ approvalId: string;
86
+ actionName: string;
87
+ description: string;
88
+ };
89
+ }
90
+ export interface Logger {
91
+ debug(message: string, data?: Record<string, unknown>): void;
92
+ info(message: string, data?: Record<string, unknown>): void;
93
+ warn(message: string, data?: Record<string, unknown>): void;
94
+ error(message: string, data?: Record<string, unknown>): void;
95
+ }
96
+ export type AgentMessage = {
97
+ type: "text";
98
+ content: string;
99
+ } | {
100
+ type: "thinking";
101
+ content: string;
102
+ } | {
103
+ type: "tool_use";
104
+ tool: string;
105
+ input: unknown;
106
+ } | {
107
+ type: "tool_result";
108
+ tool: string;
109
+ output: unknown;
110
+ } | {
111
+ type: "result";
112
+ content: string;
113
+ } | {
114
+ type: "error";
115
+ error: string;
116
+ } | {
117
+ type: "session_init";
118
+ sessionId: string;
119
+ systemPrompt?: string;
120
+ userPrompt?: string;
121
+ };
122
+ export type StreamAgentMessage = AgentMessage & {
123
+ agent?: string;
124
+ };
125
+ export interface ThreadContext {
126
+ channel: string;
127
+ threadId: string;
128
+ threadPath?: string;
129
+ channelUserId?: string;
130
+ threadName?: string;
131
+ threadType?: "private" | "group";
132
+ projectName?: string;
133
+ }
134
+ export interface RunParams {
135
+ agentName: string;
136
+ prompt: string;
137
+ channelThreadKey?: string;
138
+ threadContext?: ThreadContext;
139
+ sessionId?: string;
140
+ contextSuffix?: string;
141
+ sharedContext?: Record<string, unknown>;
142
+ workingDir?: string;
143
+ }
144
+ export interface AgentRunnerInterface {
145
+ run(params: RunParams): AsyncIterable<AgentMessage>;
146
+ }
147
+ export interface Attachment {
148
+ type: "image" | "video" | "audio" | "document" | "sticker" | "location" | "contact";
149
+ url?: string;
150
+ mimeType?: string;
151
+ fileName?: string;
152
+ caption?: string;
153
+ data?: Buffer;
154
+ }
155
+ export interface OutgoingAttachment {
156
+ type: "image" | "video" | "audio" | "document";
157
+ source: string;
158
+ caption?: string;
159
+ }
160
+ export interface OutgoingMessage {
161
+ text?: string;
162
+ attachments?: OutgoingAttachment[];
163
+ replyToMessageId?: string;
164
+ /**
165
+ * Structured message parts. When provided, replaces the plain-text path so
166
+ * channels that support rich content (web chat today) can render typed
167
+ * blocks like approval cards. Channels without rich support ignore it.
168
+ */
169
+ parts?: MessagePart[];
170
+ }
171
+ export type ApprovalCardStatus = "pending" | "approved" | "rejected" | "executing" | "executed" | "failed";
172
+ export type MessagePart = {
173
+ type: "text";
174
+ content: string;
175
+ } | {
176
+ type: "approval_card";
177
+ approvalId: string;
178
+ actionName: string;
179
+ preview: PreviewPayload;
180
+ status: ApprovalCardStatus;
181
+ };
182
+ export interface NormalizedMessage {
183
+ id: string;
184
+ channel: "telegram" | "whatsapp" | "webchat" | "discord";
185
+ channelUserId: string;
186
+ displayName: string;
187
+ threadId: string;
188
+ threadName?: string;
189
+ threadType: "private" | "group";
190
+ timestamp: Date;
191
+ text: string;
192
+ attachments: Attachment[];
193
+ replyToMessageId?: string;
194
+ rawEvent: unknown;
195
+ }
196
+ export interface ChannelAdapter {
197
+ readonly channelName: string;
198
+ start(): Promise<void>;
199
+ stop(): Promise<void>;
200
+ sendMessage(channelUserId: string, threadId: string, message: OutgoingMessage): Promise<void>;
201
+ onMessage(handler: (msg: NormalizedMessage) => Promise<void>): void;
202
+ notifyTyping?(threadId: string): Promise<void>;
203
+ /**
204
+ * Optional: fetch recent message history.
205
+ * @param threadId - Specific thread ID, or null to fetch across all accessible
206
+ * threads (e.g. all Discord guild channels).
207
+ * @param windowHours - How many hours back to look.
208
+ */
209
+ fetchHistory?(threadId: string | null, windowHours: number): Promise<NormalizedMessage[]>;
210
+ }
211
+ export interface ChannelMessageHook {
212
+ register(): void;
213
+ registerAdapter(adapter: ChannelAdapter): void;
214
+ }
215
+ export interface ActionRunContext {
216
+ initiator?: string;
217
+ channelContext?: ThreadContext;
218
+ sharedContext?: Record<string, unknown>;
219
+ }
220
+ export interface CurrentActionContext {
221
+ channelContext?: ThreadContext;
222
+ sessionId?: string;
223
+ agentName?: string;
224
+ channelThreadKey?: string;
225
+ sharedContext?: Record<string, unknown>;
226
+ }
227
+ export type CurrentActionContextPatch = Partial<CurrentActionContext>;
228
+ type CurrentActionContextRunner = <T>(patch: CurrentActionContextPatch, fn: () => Promise<T>) => Promise<T>;
229
+ export declare function setCurrentActionContextResolver(resolver: (() => CurrentActionContext | undefined) | null): void;
230
+ export declare function getCurrentActionContext(): CurrentActionContext | undefined;
231
+ export declare function setCurrentActionContextRunner(runner: CurrentActionContextRunner | null): void;
232
+ export declare function runWithCurrentActionContext<T>(patch: CurrentActionContextPatch, fn: () => Promise<T>): Promise<T>;
233
+ export interface ActionEngineLike {
234
+ run(name: string, args: Record<string, unknown>, context?: ActionRunContext): Promise<ActionResult>;
235
+ }
236
+ export type DrizzleDb = BetterSQLite3Database<Record<string, never>>;
237
+ export interface AppDbContext {
238
+ connection: DrizzleDb;
239
+ tablePrefix: string;
240
+ tableName(name: string): string;
241
+ }
242
+ export interface RomeAppDefinition {
243
+ id: string;
244
+ version: string;
245
+ description: string;
246
+ kind?: string;
247
+ }
248
+ export interface RomeAppContext {
249
+ app: RomeAppDefinition;
250
+ registry: unknown;
251
+ db: AppDbContext;
252
+ log: Logger;
253
+ runAction(name: string, args: Record<string, unknown>): Promise<ActionResult>;
254
+ listEvents(): Promise<ScheduledEvent[]>;
255
+ }
256
+ export type AppActionRuntimeDeps<TShared = Record<string, unknown>> = TShared & {
257
+ appContext: RomeAppContext;
258
+ };
259
+ export interface RomeAppApiRequest {
260
+ method: string;
261
+ path: string[];
262
+ headers: Record<string, string>;
263
+ query: URLSearchParams;
264
+ body?: Uint8Array;
265
+ }
266
+ export interface RomeAppApiHandler {
267
+ handle(request: RomeAppApiRequest): Promise<Response>;
268
+ }
269
+ export interface ChannelMappingRecord {
270
+ channel: string;
271
+ channelUserId: string;
272
+ }
273
+ export interface PersonRecord {
274
+ id: string;
275
+ displayName: string;
276
+ bondLevel: "guardian" | "inner-circle" | "acquaintance" | "other";
277
+ channelMappings: ChannelMappingRecord[];
278
+ profilePath?: string | null;
279
+ approved?: boolean | null;
280
+ createdAt?: Date;
281
+ [key: string]: unknown;
282
+ }
283
+ export interface PersonMappingRepository {
284
+ findByChannelUser(channel: string, channelUserId: string): Promise<PersonRecord | null>;
285
+ findByName(displayName: string): Promise<PersonRecord[]>;
286
+ findByNameFuzzy(displayName: string): Promise<PersonRecord | null>;
287
+ findByBondLevel(bondLevel: "guardian" | "inner-circle" | "acquaintance" | "other"): Promise<PersonRecord[]>;
288
+ create(data: {
289
+ displayName: string;
290
+ bondLevel: "guardian" | "inner-circle" | "acquaintance" | "other";
291
+ profilePath?: string;
292
+ approved?: boolean;
293
+ channelMappings?: {
294
+ channel: string;
295
+ channelUserId: string;
296
+ }[];
297
+ }): Promise<string>;
298
+ addChannelMapping(personId: string, channel: string, channelUserId: string, displayName?: string): Promise<unknown>;
299
+ }
300
+ export interface ApprovalRecord {
301
+ id: string;
302
+ type: string;
303
+ status: "pending" | "approved" | "rejected" | "auto_approved";
304
+ requestedBy: string;
305
+ description: string;
306
+ payload: unknown;
307
+ createdAt: Date;
308
+ }
309
+ export interface ApprovalsRepository {
310
+ create(data: {
311
+ type: string;
312
+ requestedBy: string;
313
+ description: string;
314
+ payload?: unknown;
315
+ status?: "pending" | "approved" | "rejected" | "auto_approved";
316
+ }): Promise<string>;
317
+ }
318
+ export interface SentinelLogEntry {
319
+ id: string;
320
+ channel: string;
321
+ channelUserId: string;
322
+ displayName: string | null;
323
+ text: string | null;
324
+ action: "replied" | "ignored" | "escalated";
325
+ response: string | null;
326
+ createdAt: Date;
327
+ }
328
+ export interface SentinelLogRepository {
329
+ create(data: {
330
+ messageId: string;
331
+ channel: string;
332
+ channelUserId: string;
333
+ displayName?: string;
334
+ threadId?: string;
335
+ text?: string;
336
+ action: "replied" | "ignored" | "escalated";
337
+ response?: string;
338
+ }): Promise<string>;
339
+ findUnreviewed(): Promise<SentinelLogEntry[]>;
340
+ markReviewed(ids: string[]): Promise<void>;
341
+ }
342
+ export interface SettingsRepository {
343
+ get<T = unknown>(key: string): Promise<T | null>;
344
+ set(key: string, value: unknown): Promise<void>;
345
+ }
346
+ export interface PolicyRule {
347
+ action: "allow" | "block" | "require_approval" | "sentinel_review";
348
+ conditions?: Record<string, unknown>;
349
+ }
350
+ export interface PolicyContext {
351
+ channel: string;
352
+ sender: {
353
+ id: string;
354
+ bondLevel: string;
355
+ } | null;
356
+ bondLevel: string;
357
+ threadName?: string;
358
+ threadType?: string;
359
+ }
360
+ export interface PolicyEngine {
361
+ evaluate(context: PolicyContext): Promise<PolicyRule>;
362
+ }
363
+ export interface ScheduledEvent {
364
+ id: string;
365
+ name: string;
366
+ type: "one-off" | "recurring";
367
+ tzid: string;
368
+ localTime: string;
369
+ rrule?: string | null;
370
+ startTime: Date;
371
+ endTime?: Date | null;
372
+ actionName: string;
373
+ args: unknown;
374
+ enabled: boolean | null;
375
+ createdAt: Date;
376
+ lastRunAt?: Date | null;
377
+ nextRunAt?: Date | null;
378
+ }
379
+ export interface EventsRepository {
380
+ findById(id: string): Promise<ScheduledEvent | null>;
381
+ create(data: {
382
+ name: string;
383
+ type: "one-off" | "recurring";
384
+ tzid: string;
385
+ localTime: string;
386
+ rrule?: string;
387
+ startTime: Date;
388
+ endTime?: Date;
389
+ actionName: string;
390
+ args: Record<string, unknown>[];
391
+ nextRunAt?: Date;
392
+ }): Promise<string>;
393
+ update(id: string, data: Partial<{
394
+ name: string;
395
+ type: "one-off" | "recurring";
396
+ tzid: string;
397
+ localTime: string;
398
+ rrule: string | null;
399
+ startTime: Date;
400
+ endTime: Date | null;
401
+ actionName: string;
402
+ args: Record<string, unknown>[];
403
+ enabled: boolean;
404
+ }>): Promise<void>;
405
+ findAll(): Promise<ScheduledEvent[]>;
406
+ delete(id: string): Promise<void>;
407
+ }
408
+ export interface EventScheduler {
409
+ scheduleEvent(event: ScheduledEvent): void;
410
+ cancelEvent(eventId: string): void;
411
+ }
412
+ export declare function createAppLogger(component: string): Logger;
413
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,119 @@
1
+ export * from "./browser.js";
2
+ export { getWorkerRpc, isWorkerRpcResponse, WorkerRpcTimeoutError, WorkerRpcDisconnectError, } from "./worker-rpc.js";
3
+ const TELEMETRY_BRIDGE_KEY = Symbol.for("rome.appRuntime.telemetryBridge");
4
+ function getBridge() {
5
+ return globalThis[TELEMETRY_BRIDGE_KEY];
6
+ }
7
+ /**
8
+ * Core calls this at `initTelemetry()` time to wire the real OTEL-backed
9
+ * impls into the SDK. Passing `null` unregisters (useful in tests).
10
+ */
11
+ export function setTelemetryBridge(bridge) {
12
+ globalThis[TELEMETRY_BRIDGE_KEY] =
13
+ bridge ?? undefined;
14
+ }
15
+ /**
16
+ * Run `fn` inside a `name` span with `attrs` attached. If no bridge is
17
+ * registered (e.g., pure unit test without core's telemetry initialized)
18
+ * the span is a no-op and `fn` runs verbatim.
19
+ */
20
+ export function withRomeSpan(name, attrs, fn) {
21
+ const bridge = getBridge();
22
+ return bridge ? bridge.withRomeSpan(name, attrs, fn) : fn();
23
+ }
24
+ /**
25
+ * Start a detached span. No-op if no bridge is registered. The SDK does not
26
+ * return a `Span` handle to apps — apps should prefer `withRomeSpan` /
27
+ * `withSdkSpan` which bracket their own work.
28
+ */
29
+ export function startRomeSpan(name, attrs = {}) {
30
+ getBridge()?.startRomeSpan(name, attrs);
31
+ }
32
+ /** Current session id from core's AsyncLocalStorage, or `undefined`. */
33
+ export function currentSessionId() {
34
+ return getBridge()?.currentSessionId();
35
+ }
36
+ /**
37
+ * Run `fn` inside a fresh session context. If no bridge is registered the
38
+ * function runs verbatim with no context established.
39
+ */
40
+ export function runWithSession(sessionId, fn) {
41
+ const bridge = getBridge();
42
+ return bridge ? bridge.runWithSession(sessionId, fn) : fn();
43
+ }
44
+ /**
45
+ * Wrap `fn` in a `sdk:<methodName>` span with the method name stamped as
46
+ * `sdk.method`. Extra `attrs` merge in (e.g., `rome.app.name`). Apps call
47
+ * this from their own code to opt in to tracing without importing OTEL.
48
+ */
49
+ export async function withSdkSpan(methodName, attrs, fn) {
50
+ return withRomeSpan(`sdk:${methodName}`, { "sdk.method": methodName, ...attrs }, fn);
51
+ }
52
+ const CURRENT_ACTION_CONTEXT_RESOLVER = Symbol.for("rome.appRuntime.currentActionContextResolver");
53
+ const CURRENT_ACTION_CONTEXT_RUNNER = Symbol.for("rome.appRuntime.currentActionContextRunner");
54
+ export function setCurrentActionContextResolver(resolver) {
55
+ const registry = globalThis;
56
+ registry[CURRENT_ACTION_CONTEXT_RESOLVER] = resolver ?? undefined;
57
+ }
58
+ export function getCurrentActionContext() {
59
+ const registry = globalThis;
60
+ return registry[CURRENT_ACTION_CONTEXT_RESOLVER]?.();
61
+ }
62
+ export function setCurrentActionContextRunner(runner) {
63
+ const registry = globalThis;
64
+ registry[CURRENT_ACTION_CONTEXT_RUNNER] = runner ?? undefined;
65
+ }
66
+ export async function runWithCurrentActionContext(patch, fn) {
67
+ const registry = globalThis;
68
+ const runner = registry[CURRENT_ACTION_CONTEXT_RUNNER];
69
+ if (!runner) {
70
+ return await fn();
71
+ }
72
+ return await runner(patch, fn);
73
+ }
74
+ const LEVEL_ORDER = {
75
+ debug: 0,
76
+ info: 1,
77
+ warn: 2,
78
+ error: 3,
79
+ };
80
+ function shouldLog(level) {
81
+ const currentLevel = (process.env.LOG_LEVEL ?? "info").toLowerCase();
82
+ return LEVEL_ORDER[level] >= (LEVEL_ORDER[currentLevel] ?? LEVEL_ORDER.info);
83
+ }
84
+ export function createAppLogger(component) {
85
+ function log(level, message, data) {
86
+ if (!shouldLog(level)) {
87
+ return;
88
+ }
89
+ const entry = {
90
+ timestamp: new Date().toISOString(),
91
+ level,
92
+ component,
93
+ message,
94
+ };
95
+ if (data !== undefined) {
96
+ entry.data = data;
97
+ }
98
+ const line = JSON.stringify(entry);
99
+ switch (level) {
100
+ case "debug":
101
+ case "info":
102
+ console.log(line);
103
+ break;
104
+ case "warn":
105
+ console.warn(line);
106
+ break;
107
+ case "error":
108
+ console.error(line);
109
+ break;
110
+ }
111
+ }
112
+ return {
113
+ debug: (message, data) => log("debug", message, data),
114
+ info: (message, data) => log("info", message, data),
115
+ warn: (message, data) => log("warn", message, data),
116
+ error: (message, data) => log("error", message, data),
117
+ };
118
+ }
119
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface RpcResponseMessage {
2
+ type: "rpc_response";
3
+ clientId: string;
4
+ id: number;
5
+ result?: unknown;
6
+ error?: string;
7
+ }
8
+ export declare class WorkerRpcTimeoutError extends Error {
9
+ constructor(method: string, timeoutMs: number);
10
+ }
11
+ export declare class WorkerRpcDisconnectError extends Error {
12
+ constructor();
13
+ }
14
+ declare class WorkerRpcClient {
15
+ private readonly clientId;
16
+ private pending;
17
+ private nextId;
18
+ private processHandlersInstalled;
19
+ call<T = unknown>(method: string, params?: unknown, options?: {
20
+ timeoutMs?: number;
21
+ }): Promise<T>;
22
+ handleResponse(message: RpcResponseMessage): void;
23
+ private ensureProcessHandlers;
24
+ }
25
+ export declare function getWorkerRpc(): WorkerRpcClient;
26
+ export declare function isWorkerRpcResponse(message: unknown): message is RpcResponseMessage;
27
+ export {};
28
+ //# sourceMappingURL=worker-rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-rpc.d.ts","sourceRoot":"","sources":["../src/worker-rpc.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAI9C;AAED,qBAAa,wBAAyB,SAAQ,KAAK;;CAKlD;AAoBD,cAAM,eAAe;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,wBAAwB,CAAS;IAEnC,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,CAAC,CAAC;IA0Cb,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAYjD,OAAO,CAAC,qBAAqB;CAkB9B;AAID,wBAAgB,YAAY,IAAI,eAAe,CAK9C;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,kBAAkB,CAOnF"}
@@ -0,0 +1,113 @@
1
+ // Worker-side RPC client for calling main-process services.
2
+ //
3
+ // The main process owns live references to ChannelManager, EventScheduler,
4
+ // and related services. Worker processes reach them over Node's child-process
5
+ // IPC channel via this client — a replacement for the former HTTP callbacks
6
+ // to the internal API.
7
+ import { randomUUID } from "node:crypto";
8
+ export class WorkerRpcTimeoutError extends Error {
9
+ constructor(method, timeoutMs) {
10
+ super(`WorkerRPC timeout: ${method} (${timeoutMs}ms)`);
11
+ this.name = "WorkerRpcTimeoutError";
12
+ }
13
+ }
14
+ export class WorkerRpcDisconnectError extends Error {
15
+ constructor() {
16
+ super("WorkerRPC main process disconnected");
17
+ this.name = "WorkerRpcDisconnectError";
18
+ }
19
+ }
20
+ const DEFAULT_TIMEOUT_MS = 30_000;
21
+ // There may be more than one copy of this module loaded in the same process
22
+ // (e.g. when an installed app ships its own physical copy of @rome-os/app-runtime
23
+ // under node_modules/, producing a distinct ESM URL from the monorepo source).
24
+ // Each copy constructs its own WorkerRpcClient with a distinct `clientId`.
25
+ // Every instance installs its own process.on("message") listener; the main
26
+ // process echoes `clientId` back on responses, so each listener only resolves
27
+ // responses originating from its own pending map. This keeps pending maps
28
+ // fully isolated across copies and avoids id-space collisions (nextId starts
29
+ // from 1 independently in each copy).
30
+ class WorkerRpcClient {
31
+ clientId = randomUUID();
32
+ pending = new Map();
33
+ nextId = 1;
34
+ processHandlersInstalled = false;
35
+ async call(method, params, options) {
36
+ if (!process.send) {
37
+ throw new Error(`WorkerRPC: not running in a Node.js child process (method=${method})`);
38
+ }
39
+ this.ensureProcessHandlers();
40
+ const id = this.nextId++;
41
+ const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
42
+ return await new Promise((resolve, reject) => {
43
+ const timeout = setTimeout(() => {
44
+ this.pending.delete(id);
45
+ reject(new WorkerRpcTimeoutError(method, timeoutMs));
46
+ }, timeoutMs);
47
+ this.pending.set(id, {
48
+ resolve: (value) => resolve(value),
49
+ reject,
50
+ timeout,
51
+ method,
52
+ });
53
+ const request = {
54
+ type: "rpc_request",
55
+ clientId: this.clientId,
56
+ id,
57
+ method,
58
+ params,
59
+ };
60
+ process.send(request, (err) => {
61
+ if (err) {
62
+ clearTimeout(timeout);
63
+ this.pending.delete(id);
64
+ reject(err);
65
+ }
66
+ });
67
+ });
68
+ }
69
+ handleResponse(message) {
70
+ const pending = this.pending.get(message.id);
71
+ if (!pending)
72
+ return;
73
+ clearTimeout(pending.timeout);
74
+ this.pending.delete(message.id);
75
+ if (message.error !== undefined) {
76
+ pending.reject(new Error(message.error));
77
+ }
78
+ else {
79
+ pending.resolve(message.result);
80
+ }
81
+ }
82
+ ensureProcessHandlers() {
83
+ if (this.processHandlersInstalled)
84
+ return;
85
+ this.processHandlersInstalled = true;
86
+ process.on("message", (message) => {
87
+ if (isWorkerRpcResponse(message) && message.clientId === this.clientId) {
88
+ this.handleResponse(message);
89
+ }
90
+ });
91
+ process.on("disconnect", () => {
92
+ for (const pending of this.pending.values()) {
93
+ clearTimeout(pending.timeout);
94
+ pending.reject(new WorkerRpcDisconnectError());
95
+ }
96
+ this.pending.clear();
97
+ });
98
+ }
99
+ }
100
+ let singleton = null;
101
+ export function getWorkerRpc() {
102
+ if (!singleton) {
103
+ singleton = new WorkerRpcClient();
104
+ }
105
+ return singleton;
106
+ }
107
+ export function isWorkerRpcResponse(message) {
108
+ return (typeof message === "object" &&
109
+ message !== null &&
110
+ message.type === "rpc_response" &&
111
+ typeof message.clientId === "string");
112
+ }
113
+ //# sourceMappingURL=worker-rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-rpc.js","sourceRoot":"","sources":["../src/worker-rpc.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@rome-os/app-runtime",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "default": "./dist/index.js"
9
+ }
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "access": "public",
15
+ "dependencies": {
16
+ "ws": "^8.18.0"
17
+ },
18
+ "devDependencies": {
19
+ "@opentelemetry/api": "^1.9.0",
20
+ "@opentelemetry/sdk-trace-base": "^2.5.1",
21
+ "@types/ws": "^8.18.0",
22
+ "drizzle-orm": "^0.45.1",
23
+ "typescript": "^5.9.3"
24
+ },
25
+ "scripts": {
26
+ "build": "tsc",
27
+ "typecheck": "tsc --noEmit"
28
+ },
29
+ "main": "./dist/index.js",
30
+ "types": "./dist/index.d.ts"
31
+ }