@xemahq/agent-runtime-bridge 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.
Files changed (43) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +60 -0
  3. package/dist/index.d.ts +10 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +31 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/applier.d.ts +31 -0
  8. package/dist/lib/applier.d.ts.map +1 -0
  9. package/dist/lib/applier.js +169 -0
  10. package/dist/lib/applier.js.map +1 -0
  11. package/dist/lib/bundle-fingerprint.d.ts +43 -0
  12. package/dist/lib/bundle-fingerprint.d.ts.map +1 -0
  13. package/dist/lib/bundle-fingerprint.js +59 -0
  14. package/dist/lib/bundle-fingerprint.js.map +1 -0
  15. package/dist/lib/control-plane.d.ts +75 -0
  16. package/dist/lib/control-plane.d.ts.map +1 -0
  17. package/dist/lib/control-plane.js +109 -0
  18. package/dist/lib/control-plane.js.map +1 -0
  19. package/dist/lib/driver.d.ts +17 -0
  20. package/dist/lib/driver.d.ts.map +1 -0
  21. package/dist/lib/driver.js +357 -0
  22. package/dist/lib/driver.js.map +1 -0
  23. package/dist/lib/opencode-event-translator.d.ts +46 -0
  24. package/dist/lib/opencode-event-translator.d.ts.map +1 -0
  25. package/dist/lib/opencode-event-translator.js +621 -0
  26. package/dist/lib/opencode-event-translator.js.map +1 -0
  27. package/dist/lib/runtime-frame.d.ts +127 -0
  28. package/dist/lib/runtime-frame.d.ts.map +1 -0
  29. package/dist/lib/runtime-frame.js +82 -0
  30. package/dist/lib/runtime-frame.js.map +1 -0
  31. package/dist/lib/sse-protocol.d.ts +8 -0
  32. package/dist/lib/sse-protocol.d.ts.map +1 -0
  33. package/dist/lib/sse-protocol.js +55 -0
  34. package/dist/lib/sse-protocol.js.map +1 -0
  35. package/dist/lib/tool-reply-routes.d.ts +10 -0
  36. package/dist/lib/tool-reply-routes.d.ts.map +1 -0
  37. package/dist/lib/tool-reply-routes.js +29 -0
  38. package/dist/lib/tool-reply-routes.js.map +1 -0
  39. package/dist/lib/worker-auth.d.ts +2 -0
  40. package/dist/lib/worker-auth.d.ts.map +1 -0
  41. package/dist/lib/worker-auth.js +8 -0
  42. package/dist/lib/worker-auth.js.map +1 -0
  43. package/package.json +48 -0
@@ -0,0 +1,127 @@
1
+ import type { SessionFrame } from '@xemahq/agent-session-runtime';
2
+ export type RuntimeFileAction = 'created' | 'edited' | 'deleted';
3
+ export type RuntimeFileWatcherEvent = 'add' | 'change' | 'unlink';
4
+ export type RuntimeToolCallStatus = 'started' | 'completed' | 'error';
5
+ export type RuntimePermissionReply = 'allow' | 'deny' | 'always';
6
+ export interface RuntimeTodoItem {
7
+ readonly content: string;
8
+ readonly status: string;
9
+ readonly priority: string;
10
+ }
11
+ export declare const RUNTIME_QUESTION_OPEN_TEXT_OPTION = "__open_text__";
12
+ export declare const RUNTIME_QUESTION_AUTO_DECIDE_OPTION = "__auto_decide__";
13
+ export interface RuntimeQuestionOption {
14
+ readonly label: string;
15
+ readonly description: string;
16
+ }
17
+ export interface RuntimeQuestionInfo {
18
+ readonly header: string;
19
+ readonly question: string;
20
+ readonly options: readonly RuntimeQuestionOption[];
21
+ readonly multiple?: boolean;
22
+ readonly canAutoDecide?: boolean;
23
+ }
24
+ export interface RuntimeStepTokens {
25
+ readonly input: number;
26
+ readonly output: number;
27
+ readonly reasoning: number;
28
+ readonly cacheRead: number;
29
+ readonly cacheWrite: number;
30
+ }
31
+ export type RuntimeFrame = {
32
+ readonly kind: 'session_ready';
33
+ readonly sessionId: string;
34
+ readonly opencodeSessionId: string;
35
+ } | {
36
+ readonly kind: 'text_delta';
37
+ readonly text: string;
38
+ } | {
39
+ readonly kind: 'reasoning_delta';
40
+ readonly text: string;
41
+ } | {
42
+ readonly kind: 'tool_call';
43
+ readonly toolName: string;
44
+ readonly status: RuntimeToolCallStatus;
45
+ readonly toolCallId?: string;
46
+ readonly args?: unknown;
47
+ readonly summary?: string;
48
+ readonly openCodeSessionId?: string;
49
+ } | {
50
+ readonly kind: 'tool_result';
51
+ readonly toolName: string;
52
+ readonly toolCallId?: string;
53
+ readonly output?: unknown;
54
+ readonly errorMessage?: string;
55
+ readonly openCodeSessionId?: string;
56
+ } | {
57
+ readonly kind: 'todo_updated';
58
+ readonly openCodeSessionId?: string;
59
+ readonly todos: readonly RuntimeTodoItem[];
60
+ } | {
61
+ readonly kind: 'file_change';
62
+ readonly path: string;
63
+ readonly action: RuntimeFileAction;
64
+ } | {
65
+ readonly kind: 'file_watcher_updated';
66
+ readonly path: string;
67
+ readonly event: RuntimeFileWatcherEvent;
68
+ } | {
69
+ readonly kind: 'question_asked';
70
+ readonly requestId: string;
71
+ readonly sessionId: string;
72
+ readonly questions: readonly RuntimeQuestionInfo[];
73
+ } | {
74
+ readonly kind: 'question_replied';
75
+ readonly requestId: string;
76
+ readonly sessionId: string;
77
+ readonly answers: readonly (readonly string[])[];
78
+ } | {
79
+ readonly kind: 'question_rejected';
80
+ readonly requestId: string;
81
+ readonly sessionId: string;
82
+ } | {
83
+ readonly kind: 'permission_asked';
84
+ readonly requestId: string;
85
+ readonly sessionId: string;
86
+ readonly permission: string;
87
+ readonly pattern: string;
88
+ readonly title?: string;
89
+ } | {
90
+ readonly kind: 'permission_replied';
91
+ readonly requestId: string;
92
+ readonly sessionId: string;
93
+ readonly reply: RuntimePermissionReply;
94
+ } | {
95
+ readonly kind: 'mcp_tools_changed';
96
+ readonly server: string;
97
+ } | {
98
+ readonly kind: 'lsp_updated';
99
+ } | {
100
+ readonly kind: 'lsp_diagnostics';
101
+ readonly serverId: string;
102
+ readonly path: string;
103
+ } | {
104
+ readonly kind: 'session_compacted';
105
+ readonly sessionId: string;
106
+ } | {
107
+ readonly kind: 'thinking';
108
+ readonly status: string;
109
+ readonly summary?: string;
110
+ } | {
111
+ readonly kind: 'step_finished';
112
+ readonly partId: string;
113
+ readonly messageId: string;
114
+ readonly reason: string;
115
+ readonly cost: number;
116
+ readonly tokens: RuntimeStepTokens;
117
+ } | {
118
+ readonly kind: 'done';
119
+ readonly sessionId: string;
120
+ readonly content: string;
121
+ readonly structured?: unknown;
122
+ } | {
123
+ readonly kind: 'error';
124
+ readonly message: string;
125
+ };
126
+ export declare function projectRuntimeFrameToSessionFrame(frame: RuntimeFrame): SessionFrame | null;
127
+ //# sourceMappingURL=runtime-frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-frame.d.ts","sourceRoot":"","sources":["../../src/lib/runtime-frame.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RUNTIME_QUESTION_AUTO_DECIDE_OPTION = exports.RUNTIME_QUESTION_OPEN_TEXT_OPTION = void 0;
4
+ exports.projectRuntimeFrameToSessionFrame = projectRuntimeFrameToSessionFrame;
5
+ const sse_protocol_1 = require("./sse-protocol");
6
+ exports.RUNTIME_QUESTION_OPEN_TEXT_OPTION = '__open_text__';
7
+ exports.RUNTIME_QUESTION_AUTO_DECIDE_OPTION = '__auto_decide__';
8
+ function projectRuntimeFrameToSessionFrame(frame) {
9
+ switch (frame.kind) {
10
+ case 'text_delta':
11
+ case 'reasoning_delta':
12
+ return { kind: 'token', text: frame.text };
13
+ case 'tool_call':
14
+ return {
15
+ kind: 'tool-call',
16
+ tool: frame.toolName,
17
+ args: frame.args,
18
+ status: frame.status,
19
+ ...(frame.toolCallId ? { toolCallId: frame.toolCallId } : {}),
20
+ ...(frame.summary ? { summary: frame.summary } : {}),
21
+ };
22
+ case 'tool_result':
23
+ return {
24
+ kind: 'tool-result',
25
+ tool: frame.toolName,
26
+ result: frame.output,
27
+ ...(frame.toolCallId ? { toolCallId: frame.toolCallId } : {}),
28
+ ...(frame.errorMessage ? { errorMessage: frame.errorMessage } : {}),
29
+ };
30
+ case 'question_asked': {
31
+ const promptText = frame.questions
32
+ .map((q) => q.question.trim())
33
+ .filter((s) => s.length > 0)
34
+ .join('\n\n');
35
+ if (promptText.length === 0) {
36
+ return {
37
+ kind: 'error',
38
+ message: `question_asked frame has no non-empty question text (requestId=${frame.requestId})`,
39
+ };
40
+ }
41
+ let choices = null;
42
+ if (frame.questions.length === 1) {
43
+ const opts = frame.questions[0]?.options ?? [];
44
+ if (opts.length > 0) {
45
+ choices = opts.map((o) => o.label);
46
+ }
47
+ }
48
+ return {
49
+ kind: 'tool_pause',
50
+ toolName: sse_protocol_1.AGENT_TOOL_NAME_QUESTION,
51
+ toolRequestId: frame.requestId,
52
+ promptText,
53
+ choices,
54
+ };
55
+ }
56
+ case 'done':
57
+ return {
58
+ kind: 'done',
59
+ turnId: frame.sessionId,
60
+ finalText: frame.content,
61
+ structuredOutput: 'structured' in frame ? frame.structured ?? null : null,
62
+ };
63
+ case 'error':
64
+ return { kind: 'error', message: frame.message };
65
+ case 'session_ready':
66
+ case 'todo_updated':
67
+ case 'file_change':
68
+ case 'file_watcher_updated':
69
+ case 'question_replied':
70
+ case 'question_rejected':
71
+ case 'permission_asked':
72
+ case 'permission_replied':
73
+ case 'mcp_tools_changed':
74
+ case 'lsp_updated':
75
+ case 'lsp_diagnostics':
76
+ case 'session_compacted':
77
+ case 'thinking':
78
+ case 'step_finished':
79
+ return null;
80
+ }
81
+ }
82
+ //# sourceMappingURL=runtime-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-frame.js","sourceRoot":"","sources":["../../src/lib/runtime-frame.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface WireSseBlock {
2
+ readonly event: string;
3
+ readonly payload: unknown;
4
+ }
5
+ export declare function parseSseStream(body: ReadableStream<Uint8Array>): AsyncIterable<WireSseBlock>;
6
+ export declare function parseBlockLines(block: string): WireSseBlock | null;
7
+ export declare const AGENT_TOOL_NAME_QUESTION = "question";
8
+ //# sourceMappingURL=sse-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-protocol.d.ts","sourceRoot":"","sources":["../../src/lib/sse-protocol.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAMD,wBAAuB,cAAc,CACnC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAC/B,aAAa,CAAC,YAAY,CAAC,CAyB7B;AAOD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAelE;AAQD,eAAO,MAAM,wBAAwB,aAAa,CAAC"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AGENT_TOOL_NAME_QUESTION = void 0;
4
+ exports.parseSseStream = parseSseStream;
5
+ exports.parseBlockLines = parseBlockLines;
6
+ async function* parseSseStream(body) {
7
+ const reader = body.getReader();
8
+ const decoder = new TextDecoder('utf-8');
9
+ let buffer = '';
10
+ try {
11
+ while (true) {
12
+ const { value, done } = await reader.read();
13
+ if (done)
14
+ break;
15
+ buffer += decoder.decode(value, { stream: true });
16
+ let sep = buffer.indexOf('\n\n');
17
+ while (sep !== -1) {
18
+ const block = buffer.slice(0, sep);
19
+ buffer = buffer.slice(sep + 2);
20
+ const parsed = parseBlockLines(block);
21
+ if (parsed)
22
+ yield parsed;
23
+ sep = buffer.indexOf('\n\n');
24
+ }
25
+ }
26
+ }
27
+ finally {
28
+ try {
29
+ reader.releaseLock();
30
+ }
31
+ catch {
32
+ }
33
+ }
34
+ }
35
+ function parseBlockLines(block) {
36
+ let event;
37
+ let data;
38
+ for (const line of block.split('\n')) {
39
+ if (line.startsWith('event:'))
40
+ event = line.slice(6).trim();
41
+ else if (line.startsWith('data:')) {
42
+ data = (data ? data + '\n' : '') + line.slice(5).trim();
43
+ }
44
+ }
45
+ if (!event || data === undefined)
46
+ return null;
47
+ try {
48
+ return { event, payload: JSON.parse(data) };
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ exports.AGENT_TOOL_NAME_QUESTION = 'question';
55
+ //# sourceMappingURL=sse-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-protocol.js","sourceRoot":"","sources":["../../src/lib/sse-protocol.ts"],"names":[],"mappings":";;;AAyBA,wCA2BC;AAOD,0CAeC;AAjDM,KAAK,SAAS,CAAC,CAAC,cAAc,CACnC,IAAgC;IAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,IAAI,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACjC,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACnC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAC/B,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,MAAM;oBAAE,MAAM,MAAM,CAAC;gBACzB,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACH,CAAC;AACH,CAAC;AAOD,SAAgB,eAAe,CAAC,KAAa;IAC3C,IAAI,KAAyB,CAAC;IAC9B,IAAI,IAAwB,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACvD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAQY,QAAA,wBAAwB,GAAG,UAAU,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type ToolReplyRoute = (input: {
2
+ readonly proxyBaseUrl: string;
3
+ readonly toolRequestId: string;
4
+ }) => string;
5
+ export declare function resolveToolReplyRoute(toolName: string): ToolReplyRoute;
6
+ export declare class UnknownToolReplyRouteError extends Error {
7
+ readonly toolName: string;
8
+ constructor(toolName: string);
9
+ }
10
+ //# sourceMappingURL=tool-reply-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-reply-routes.d.ts","sourceRoot":"","sources":["../../src/lib/tool-reply-routes.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,KAAK,MAAM,CAAC;AAiBb,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAMtE;AAED,qBAAa,0BAA2B,SAAQ,KAAK;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM;gBAAhB,QAAQ,EAAE,MAAM;CAOtC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnknownToolReplyRouteError = void 0;
4
+ exports.resolveToolReplyRoute = resolveToolReplyRoute;
5
+ const sse_protocol_1 = require("./sse-protocol");
6
+ const TOOL_REPLY_ROUTES = new Map([
7
+ [
8
+ sse_protocol_1.AGENT_TOOL_NAME_QUESTION,
9
+ ({ proxyBaseUrl, toolRequestId }) => `${proxyBaseUrl}/question/${encodeURIComponent(toolRequestId)}/reply`,
10
+ ],
11
+ ]);
12
+ function resolveToolReplyRoute(toolName) {
13
+ const route = TOOL_REPLY_ROUTES.get(toolName);
14
+ if (!route) {
15
+ throw new UnknownToolReplyRouteError(toolName);
16
+ }
17
+ return route;
18
+ }
19
+ class UnknownToolReplyRouteError extends Error {
20
+ toolName;
21
+ constructor(toolName) {
22
+ super(`No reply route registered for tool '${toolName}'. ` +
23
+ `Add it to TOOL_REPLY_ROUTES in @xemahq/agent-runtime-bridge.`);
24
+ this.toolName = toolName;
25
+ this.name = 'UnknownToolReplyRouteError';
26
+ }
27
+ }
28
+ exports.UnknownToolReplyRouteError = UnknownToolReplyRouteError;
29
+ //# sourceMappingURL=tool-reply-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-reply-routes.js","sourceRoot":"","sources":["../../src/lib/tool-reply-routes.ts"],"names":[],"mappings":";;;AAyCA,sDAMC;AAjCD,iDAA0D;AAY1D,MAAM,iBAAiB,GAAwC,IAAI,GAAG,CAGpE;IACA;QACE,uCAAwB;QAKxB,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,EAAE,CAClC,GAAG,YAAY,aAAa,kBAAkB,CAAC,aAAa,CAAC,QAAQ;KACxE;CACF,CAAC,CAAC;AAEH,SAAgB,qBAAqB,CAAC,QAAgB;IACpD,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAa,0BAA2B,SAAQ,KAAK;IAC9B;IAArB,YAAqB,QAAgB;QACnC,KAAK,CACH,uCAAuC,QAAQ,KAAK;YAClD,8DAA8D,CACjE,CAAC;QAJiB,aAAQ,GAAR,QAAQ,CAAQ;QAKnC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AARD,gEAQC"}
@@ -0,0 +1,2 @@
1
+ export declare function buildWorkerBasicAuthHeader(password: string): string;
2
+ //# sourceMappingURL=worker-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-auth.d.ts","sourceRoot":"","sources":["../../src/lib/worker-auth.ts"],"names":[],"mappings":"AAWA,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGnE"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildWorkerBasicAuthHeader = buildWorkerBasicAuthHeader;
4
+ function buildWorkerBasicAuthHeader(password) {
5
+ const encoded = Buffer.from(`opencode:${password}`).toString('base64');
6
+ return `Basic ${encoded}`;
7
+ }
8
+ //# sourceMappingURL=worker-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-auth.js","sourceRoot":"","sources":["../../src/lib/worker-auth.ts"],"names":[],"mappings":";;AAWA,gEAGC;AAHD,SAAgB,0BAA0B,CAAC,QAAgB;IACzD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvE,OAAO,SAAS,OAAO,EAAE,CAAC;AAC5B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@xemahq/agent-runtime-bridge",
3
+ "version": "0.1.1",
4
+ "publishConfig": {
5
+ "registry": "https://npm.pkg.github.com"
6
+ },
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "devDependencies": {
13
+ "@types/jest": "^30.0.0",
14
+ "@types/node": "25.2.3",
15
+ "jest": "^30.3.0",
16
+ "prettier": "3.6.2",
17
+ "ts-jest": "^29.4.9",
18
+ "typescript": "5.9.3"
19
+ },
20
+ "dependencies": {
21
+ "@xemahq/agent-session-runtime": "^0.1.0",
22
+ "@xemahq/kernel-contracts": "^0.2.0",
23
+ "@xemahq/tool-policy": "^0.1.0",
24
+ "@xemahq/agent-tool-inquiry-channel": "0.1.1"
25
+ },
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "xema-source": "./src/index.ts",
30
+ "default": "./dist/index.js"
31
+ },
32
+ "./dist/*": {
33
+ "types": "./dist/*.d.ts",
34
+ "default": "./dist/*.js"
35
+ },
36
+ "./dist/lib/*": {
37
+ "types": "./dist/lib/*.d.ts",
38
+ "default": "./dist/lib/*.js"
39
+ }
40
+ },
41
+ "scripts": {
42
+ "clean": "rm -rf dist",
43
+ "build": "tsc -p tsconfig.json",
44
+ "format": "prettier --write \"src/**/*.ts\"",
45
+ "typecheck": "tsc -p tsconfig.json --noEmit",
46
+ "test": "jest --config jest.config.ts"
47
+ }
48
+ }