oblien 1.2.7 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +31 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +33 -0
- package/dist/client.js.map +1 -0
- package/dist/error.d.ts +29 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +52 -0
- package/dist/error.js.map +1 -0
- package/dist/http.d.ts +20 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +108 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/api-access.d.ts +21 -0
- package/dist/resources/api-access.d.ts.map +1 -0
- package/dist/resources/api-access.js +32 -0
- package/dist/resources/api-access.js.map +1 -0
- package/dist/resources/base.d.ts +17 -0
- package/dist/resources/base.d.ts.map +1 -0
- package/dist/resources/base.js +21 -0
- package/dist/resources/base.js.map +1 -0
- package/dist/resources/images.d.ts +11 -0
- package/dist/resources/images.d.ts.map +1 -0
- package/dist/resources/images.js +16 -0
- package/dist/resources/images.js.map +1 -0
- package/dist/resources/lifecycle.d.ts +23 -0
- package/dist/resources/lifecycle.d.ts.map +1 -0
- package/dist/resources/lifecycle.js +32 -0
- package/dist/resources/lifecycle.js.map +1 -0
- package/dist/resources/logs.d.ts +25 -0
- package/dist/resources/logs.d.ts.map +1 -0
- package/dist/resources/logs.js +51 -0
- package/dist/resources/logs.js.map +1 -0
- package/dist/resources/metadata.d.ts +15 -0
- package/dist/resources/metadata.d.ts.map +1 -0
- package/dist/resources/metadata.js +20 -0
- package/dist/resources/metadata.js.map +1 -0
- package/dist/resources/metrics.d.ts +17 -0
- package/dist/resources/metrics.d.ts.map +1 -0
- package/dist/resources/metrics.js +27 -0
- package/dist/resources/metrics.js.map +1 -0
- package/dist/resources/network.d.ts +17 -0
- package/dist/resources/network.d.ts.map +1 -0
- package/dist/resources/network.js +20 -0
- package/dist/resources/network.js.map +1 -0
- package/dist/resources/public-access.d.ts +15 -0
- package/dist/resources/public-access.d.ts.map +1 -0
- package/dist/resources/public-access.js +21 -0
- package/dist/resources/public-access.js.map +1 -0
- package/dist/resources/resources.d.ts +15 -0
- package/dist/resources/resources.d.ts.map +1 -0
- package/dist/resources/resources.js +20 -0
- package/dist/resources/resources.js.map +1 -0
- package/dist/resources/snapshots.d.ts +27 -0
- package/dist/resources/snapshots.d.ts.map +1 -0
- package/dist/resources/snapshots.js +45 -0
- package/dist/resources/snapshots.js.map +1 -0
- package/dist/resources/ssh.d.ts +19 -0
- package/dist/resources/ssh.d.ts.map +1 -0
- package/dist/resources/ssh.js +28 -0
- package/dist/resources/ssh.js.map +1 -0
- package/dist/resources/usage.d.ts +25 -0
- package/dist/resources/usage.d.ts.map +1 -0
- package/dist/resources/usage.js +44 -0
- package/dist/resources/usage.js.map +1 -0
- package/dist/resources/workloads.d.ts +39 -0
- package/dist/resources/workloads.d.ts.map +1 -0
- package/dist/resources/workloads.js +83 -0
- package/dist/resources/workloads.js.map +1 -0
- package/dist/runtime/exec.d.ts +71 -0
- package/dist/runtime/exec.d.ts.map +1 -0
- package/dist/runtime/exec.js +163 -0
- package/dist/runtime/exec.js.map +1 -0
- package/dist/runtime/files.d.ts +39 -0
- package/dist/runtime/files.d.ts.map +1 -0
- package/dist/runtime/files.js +143 -0
- package/dist/runtime/files.js.map +1 -0
- package/dist/runtime/search.d.ts +23 -0
- package/dist/runtime/search.d.ts.map +1 -0
- package/dist/runtime/search.js +65 -0
- package/dist/runtime/search.js.map +1 -0
- package/dist/runtime/terminal.d.ts +29 -0
- package/dist/runtime/terminal.d.ts.map +1 -0
- package/dist/runtime/terminal.js +58 -0
- package/dist/runtime/terminal.js.map +1 -0
- package/dist/runtime/watcher.d.ts +27 -0
- package/dist/runtime/watcher.d.ts.map +1 -0
- package/dist/runtime/watcher.js +53 -0
- package/dist/runtime/watcher.js.map +1 -0
- package/dist/runtime/ws.d.ts +92 -0
- package/dist/runtime/ws.d.ts.map +1 -0
- package/dist/runtime/ws.js +228 -0
- package/dist/runtime/ws.js.map +1 -0
- package/dist/runtime-http.d.ts +35 -0
- package/dist/runtime-http.d.ts.map +1 -0
- package/dist/runtime-http.js +99 -0
- package/dist/runtime-http.js.map +1 -0
- package/dist/runtime.d.ts +77 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +97 -0
- package/dist/runtime.js.map +1 -0
- package/dist/types/client.d.ts +7 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/client.js +3 -0
- package/dist/types/client.js.map +1 -0
- package/dist/types/common.d.ts +13 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +3 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/network.d.ts +15 -0
- package/dist/types/network.d.ts.map +1 -0
- package/dist/types/network.js +3 -0
- package/dist/types/network.js.map +1 -0
- package/dist/types/resources.d.ts +10 -0
- package/dist/types/resources.d.ts.map +1 -0
- package/dist/types/resources.js +3 -0
- package/dist/types/resources.js.map +1 -0
- package/dist/types/runtime.d.ts +302 -0
- package/dist/types/runtime.d.ts.map +1 -0
- package/dist/types/runtime.js +3 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/workspace-resources.d.ts +186 -0
- package/dist/types/workspace-resources.d.ts.map +1 -0
- package/dist/types/workspace-resources.js +3 -0
- package/dist/types/workspace-resources.js.map +1 -0
- package/dist/types/workspace.d.ts +41 -0
- package/dist/types/workspace.d.ts.map +1 -0
- package/dist/types/workspace.js +3 -0
- package/dist/types/workspace.js.map +1 -0
- package/dist/workspace.d.ts +135 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +194 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +31 -70
- package/LICENSE +0 -21
- package/README.md +0 -574
- package/agents.js +0 -14
- package/browser.js +0 -6
- package/cdn.js +0 -6
- package/chat.js +0 -21
- package/credits.js +0 -11
- package/icons.js +0 -11
- package/index.d.ts +0 -967
- package/index.js +0 -63
- package/namespaces.js +0 -12
- package/sandbox.js +0 -12
- package/search.js +0 -11
- package/src/agents/agent.js +0 -229
- package/src/agents/index.js +0 -212
- package/src/agents/settings.js +0 -100
- package/src/agents/tools.js +0 -155
- package/src/browser/index.js +0 -449
- package/src/cdn/index.js +0 -744
- package/src/chat/index.js +0 -704
- package/src/chat/session.js +0 -93
- package/src/client.js +0 -175
- package/src/credits/index.js +0 -480
- package/src/icons/index.js +0 -185
- package/src/namespaces/index.js +0 -225
- package/src/namespaces/namespace.js +0 -274
- package/src/sandbox/index.js +0 -185
- package/src/sandbox/sandbox.js +0 -124
- package/src/search/index.js +0 -191
- package/src/utils/guest-manager.js +0 -454
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/runtime/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EAEf,0BAA0B,EAC3B,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,iBAAiB;IAErD,qCAAqC;IAC/B,MAAM,CAAC,MAAM,GAAE,oBAAyB,GAAG,OAAO,CAAC,eAAe,CAAC;IAezE,qCAAqC;IAC/B,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAQxC,gCAAgC;IAC1B,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAOlF,2CAA2C;IACrC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,0BAA0B,CAAC;CAOtG"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal sessions inside the workspace runtime.
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* const term = await rt.terminal.create({ shell: '/bin/bash', cols: 120, rows: 40 });
|
|
6
|
+
* const sessions = await rt.terminal.list();
|
|
7
|
+
* await rt.terminal.close(term.id);
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export class TerminalResource {
|
|
11
|
+
_http;
|
|
12
|
+
constructor(_http) {
|
|
13
|
+
this._http = _http;
|
|
14
|
+
}
|
|
15
|
+
/** Create a new terminal session. */
|
|
16
|
+
async create(params = {}) {
|
|
17
|
+
const body = {};
|
|
18
|
+
if (params.shell)
|
|
19
|
+
body.cmd = [params.shell];
|
|
20
|
+
if (params.cmd)
|
|
21
|
+
body.cmd = params.cmd;
|
|
22
|
+
if (params.cols)
|
|
23
|
+
body.cols = params.cols;
|
|
24
|
+
if (params.rows)
|
|
25
|
+
body.rows = params.rows;
|
|
26
|
+
if (params.scrollbackSize)
|
|
27
|
+
body.scrollback_size = params.scrollbackSize;
|
|
28
|
+
return this._http.request({
|
|
29
|
+
method: 'POST',
|
|
30
|
+
path: '/terminals',
|
|
31
|
+
body,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** List active terminal sessions. */
|
|
35
|
+
async list() {
|
|
36
|
+
const res = await this._http.request({
|
|
37
|
+
method: 'GET',
|
|
38
|
+
path: '/terminals',
|
|
39
|
+
});
|
|
40
|
+
return res.terminals;
|
|
41
|
+
}
|
|
42
|
+
/** Close a terminal session. */
|
|
43
|
+
async close(sessionId) {
|
|
44
|
+
return this._http.request({
|
|
45
|
+
method: 'DELETE',
|
|
46
|
+
path: `/terminals/${sessionId}`,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/** Get scrollback buffer for a session. */
|
|
50
|
+
async scrollback(sessionId, params) {
|
|
51
|
+
return this._http.request({
|
|
52
|
+
method: 'GET',
|
|
53
|
+
path: `/terminals/${sessionId}/scrollback`,
|
|
54
|
+
query: params?.bytes ? { bytes: params.bytes } : undefined,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/runtime/terminal.ts"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AACH,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,KAAwB;QAAxB,UAAK,GAAL,KAAK,CAAmB;IAAG,CAAC;IAEzD,qCAAqC;IACrC,KAAK,CAAC,MAAM,CAAC,SAA+B,EAAE;QAC5C,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,IAAI,MAAM,CAAC,KAAK;YAAE,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,GAAG;YAAE,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACtC,IAAI,MAAM,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzC,IAAI,MAAM,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzC,IAAI,MAAM,CAAC,cAAc;YAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,cAAc,CAAC;QAExE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB;YACzC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,YAAY;YAClB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB;YACzD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,YAAY;SACnB,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,gCAAgC;IAChC,KAAK,CAAC,KAAK,CAAC,SAAiB;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YACxB,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,cAAc,SAAS,EAAE;SAChC,CAAC,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,MAA2B;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6B;YACpD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,cAAc,SAAS,aAAa;YAC1C,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;SAC3D,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { RuntimeHttpClient } from '../runtime-http.js';
|
|
2
|
+
import type { WatcherCreateParams, WatcherInfo } from '../types/runtime.js';
|
|
3
|
+
/**
|
|
4
|
+
* File watcher management inside the workspace runtime.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* const watcher = await rt.watcher.create({ path: '/app/src' });
|
|
8
|
+
* const all = await rt.watcher.list();
|
|
9
|
+
* await rt.watcher.delete(watcher.id);
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export declare class WatcherResource {
|
|
13
|
+
private readonly _http;
|
|
14
|
+
constructor(_http: RuntimeHttpClient);
|
|
15
|
+
/** Create a file watcher on a directory. */
|
|
16
|
+
create(params: WatcherCreateParams): Promise<WatcherInfo>;
|
|
17
|
+
/** List active watchers. */
|
|
18
|
+
list(): Promise<WatcherInfo[]>;
|
|
19
|
+
/** Get watcher info by ID. */
|
|
20
|
+
get(watcherId: string): Promise<WatcherInfo>;
|
|
21
|
+
/** Delete a watcher. */
|
|
22
|
+
delete(watcherId: string): Promise<{
|
|
23
|
+
success: boolean;
|
|
24
|
+
watcher_id: string;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/runtime/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EAEZ,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;GAQG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,iBAAiB;IAErD,4CAA4C;IACtC,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAc/D,4BAA4B;IACtB,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAQpC,8BAA8B;IACxB,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAQlD,wBAAwB;IAClB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAMnF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File watcher management inside the workspace runtime.
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* const watcher = await rt.watcher.create({ path: '/app/src' });
|
|
6
|
+
* const all = await rt.watcher.list();
|
|
7
|
+
* await rt.watcher.delete(watcher.id);
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export class WatcherResource {
|
|
11
|
+
_http;
|
|
12
|
+
constructor(_http) {
|
|
13
|
+
this._http = _http;
|
|
14
|
+
}
|
|
15
|
+
/** Create a file watcher on a directory. */
|
|
16
|
+
async create(params) {
|
|
17
|
+
const res = await this._http.request({
|
|
18
|
+
method: 'POST',
|
|
19
|
+
path: '/watchers',
|
|
20
|
+
body: {
|
|
21
|
+
path: params.path,
|
|
22
|
+
root: params.root,
|
|
23
|
+
excludes: params.excludes,
|
|
24
|
+
exclude: params.exclude,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
return res.watcher;
|
|
28
|
+
}
|
|
29
|
+
/** List active watchers. */
|
|
30
|
+
async list() {
|
|
31
|
+
const res = await this._http.request({
|
|
32
|
+
method: 'GET',
|
|
33
|
+
path: '/watchers',
|
|
34
|
+
});
|
|
35
|
+
return res.watchers;
|
|
36
|
+
}
|
|
37
|
+
/** Get watcher info by ID. */
|
|
38
|
+
async get(watcherId) {
|
|
39
|
+
const res = await this._http.request({
|
|
40
|
+
method: 'GET',
|
|
41
|
+
path: `/watchers/${watcherId}`,
|
|
42
|
+
});
|
|
43
|
+
return res.watcher;
|
|
44
|
+
}
|
|
45
|
+
/** Delete a watcher. */
|
|
46
|
+
async delete(watcherId) {
|
|
47
|
+
return this._http.request({
|
|
48
|
+
method: 'DELETE',
|
|
49
|
+
path: `/watchers/${watcherId}`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/runtime/watcher.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,KAAwB;QAAxB,UAAK,GAAL,KAAK,CAAmB;IAAG,CAAC;IAEzD,4CAA4C;IAC5C,KAAK,CAAC,MAAM,CAAC,MAA2B;QACtC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6C;YAC/E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE;gBACJ,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB;SACF,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB;YACxD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,GAAG,CAAC,SAAiB;QACzB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6C;YAC/E,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,aAAa,SAAS,EAAE;SAC/B,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,wBAAwB;IACxB,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YACxB,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,aAAa,SAAS,EAAE;SAC/B,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { RuntimeOptions, WSOptions, WSMessage, WSWatcherEvent } from '../types/runtime.js';
|
|
2
|
+
/**
|
|
3
|
+
* Multiplexed WebSocket connection for real-time terminal I/O and
|
|
4
|
+
* file watcher events.
|
|
5
|
+
*
|
|
6
|
+
* Protocol (matches the guest server at /ws):
|
|
7
|
+
*
|
|
8
|
+
* **Binary frames** (terminal I/O):
|
|
9
|
+
* - `[terminal_id_byte][raw data]` — both directions.
|
|
10
|
+
* - Client → Server: stdin to terminal.
|
|
11
|
+
* - Server → Client: stdout from terminal.
|
|
12
|
+
*
|
|
13
|
+
* **Text frames** (JSON with "channel" field):
|
|
14
|
+
* - terminal: resize (client→server), exit (server→client)
|
|
15
|
+
* - watcher: change, ready, overflow (server→client)
|
|
16
|
+
*
|
|
17
|
+
* Only one WS connection is active per VM — a new connection replaces the old one.
|
|
18
|
+
*
|
|
19
|
+
* ```ts
|
|
20
|
+
* const ws = rt.ws();
|
|
21
|
+
* ws.onTerminalOutput((id, data) => process.stdout.write(data));
|
|
22
|
+
* ws.onWatcherEvent((ev) => console.log(ev.path, ev.op));
|
|
23
|
+
* ws.connect();
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare class RuntimeWebSocket {
|
|
27
|
+
private _ws;
|
|
28
|
+
private readonly _baseUrl;
|
|
29
|
+
private readonly _token;
|
|
30
|
+
private readonly _reconnect;
|
|
31
|
+
private readonly _reconnectDelay;
|
|
32
|
+
private readonly _maxReconnectAttempts;
|
|
33
|
+
private _reconnectAttempts;
|
|
34
|
+
private _intentionallyClosed;
|
|
35
|
+
private _reconnectTimer;
|
|
36
|
+
/** Terminal stdout data: (terminalId, rawData). */
|
|
37
|
+
private _onTerminalOutput;
|
|
38
|
+
/** Terminal exit event: (terminalId, exitCode). */
|
|
39
|
+
private _onTerminalExit;
|
|
40
|
+
/** Watcher events (change, ready, overflow). */
|
|
41
|
+
private _onWatcherEvent;
|
|
42
|
+
/** Connection opened. */
|
|
43
|
+
private _onOpen;
|
|
44
|
+
/** Connection closed. */
|
|
45
|
+
private _onClose;
|
|
46
|
+
/** Connection error. */
|
|
47
|
+
private _onError;
|
|
48
|
+
/** Any text message (raw). */
|
|
49
|
+
private _onMessage;
|
|
50
|
+
constructor(runtimeOptions: RuntimeOptions, wsOptions?: WSOptions);
|
|
51
|
+
/**
|
|
52
|
+
* Register a handler for terminal output (binary frames).
|
|
53
|
+
* `id` is the terminal session ID (string), `data` is the raw output.
|
|
54
|
+
*/
|
|
55
|
+
onTerminalOutput(handler: (id: string, data: Uint8Array) => void): this;
|
|
56
|
+
/** Register a handler for terminal exit events. */
|
|
57
|
+
onTerminalExit(handler: (id: string, code: number) => void): this;
|
|
58
|
+
/** Register a handler for file watcher events (change, ready, overflow). */
|
|
59
|
+
onWatcherEvent(handler: (event: WSWatcherEvent) => void): this;
|
|
60
|
+
/** Register a handler called when the WebSocket connects. */
|
|
61
|
+
onOpen(handler: () => void): this;
|
|
62
|
+
/** Register a handler called when the WebSocket closes. */
|
|
63
|
+
onClose(handler: (code: number, reason: string) => void): this;
|
|
64
|
+
/** Register a handler for errors. */
|
|
65
|
+
onError(handler: (error: unknown) => void): this;
|
|
66
|
+
/** Register a handler for all incoming text messages (raw parsed JSON). */
|
|
67
|
+
onMessage(handler: (msg: WSMessage) => void): this;
|
|
68
|
+
/**
|
|
69
|
+
* Write stdin data to a terminal session.
|
|
70
|
+
* Binary frame format: `[terminal_id_byte][data]`.
|
|
71
|
+
*
|
|
72
|
+
* `terminalId` is the numeric session ID (same as `parseInt(session.id)`).
|
|
73
|
+
* Accepts either a `string` (e.g. `"1"`) or `number`.
|
|
74
|
+
*/
|
|
75
|
+
writeTerminalInput(terminalId: string | number, data: string | Uint8Array): void;
|
|
76
|
+
/** Send a terminal resize command. */
|
|
77
|
+
resizeTerminal(terminalId: string, cols: number, rows: number): void;
|
|
78
|
+
/** Send a raw JSON text message. */
|
|
79
|
+
sendJSON(msg: Record<string, unknown>): void;
|
|
80
|
+
/** Open the WebSocket connection. */
|
|
81
|
+
connect(): void;
|
|
82
|
+
/** Close the WebSocket connection (no reconnect). */
|
|
83
|
+
close(): void;
|
|
84
|
+
/** Whether the socket is currently open. */
|
|
85
|
+
get connected(): boolean;
|
|
86
|
+
private _doConnect;
|
|
87
|
+
private _handleBinary;
|
|
88
|
+
private _handleText;
|
|
89
|
+
private _handleTerminalMessage;
|
|
90
|
+
private _scheduleReconnect;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=ws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/runtime/ws.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,SAAS,EAGT,cAAc,EACf,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,eAAe,CAA8C;IAIrE,mDAAmD;IACnD,OAAO,CAAC,iBAAiB,CAAyD;IAClF,mDAAmD;IACnD,OAAO,CAAC,eAAe,CAAqD;IAC5E,gDAAgD;IAChD,OAAO,CAAC,eAAe,CAAkD;IACzE,yBAAyB;IACzB,OAAO,CAAC,OAAO,CAA6B;IAC5C,yBAAyB;IACzB,OAAO,CAAC,QAAQ,CAAyD;IACzE,wBAAwB;IACxB,OAAO,CAAC,QAAQ,CAA2C;IAC3D,8BAA8B;IAC9B,OAAO,CAAC,UAAU,CAA2C;gBAEjD,cAAc,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,SAAS;IAWjE;;;OAGG;IACH,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAKvE,mDAAmD;IACnD,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAKjE,4EAA4E;IAC5E,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;IAK9D,6DAA6D;IAC7D,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAKjC,2DAA2D;IAC3D,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAK9D,qCAAqC;IACrC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAKhD,2EAA2E;IAC3E,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI;IAOlD;;;;;;OAMG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAWhF,sCAAsC;IACtC,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAUpE,oCAAoC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAO5C,qCAAqC;IACrC,OAAO,IAAI,IAAI;IAMf,qDAAqD;IACrD,KAAK,IAAI,IAAI;IAYb,4CAA4C;IAC5C,IAAI,SAAS,IAAI,OAAO,CAEvB;IAID,OAAO,CAAC,UAAU;IAgClB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,kBAAkB;CAe3B"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multiplexed WebSocket connection for real-time terminal I/O and
|
|
3
|
+
* file watcher events.
|
|
4
|
+
*
|
|
5
|
+
* Protocol (matches the guest server at /ws):
|
|
6
|
+
*
|
|
7
|
+
* **Binary frames** (terminal I/O):
|
|
8
|
+
* - `[terminal_id_byte][raw data]` — both directions.
|
|
9
|
+
* - Client → Server: stdin to terminal.
|
|
10
|
+
* - Server → Client: stdout from terminal.
|
|
11
|
+
*
|
|
12
|
+
* **Text frames** (JSON with "channel" field):
|
|
13
|
+
* - terminal: resize (client→server), exit (server→client)
|
|
14
|
+
* - watcher: change, ready, overflow (server→client)
|
|
15
|
+
*
|
|
16
|
+
* Only one WS connection is active per VM — a new connection replaces the old one.
|
|
17
|
+
*
|
|
18
|
+
* ```ts
|
|
19
|
+
* const ws = rt.ws();
|
|
20
|
+
* ws.onTerminalOutput((id, data) => process.stdout.write(data));
|
|
21
|
+
* ws.onWatcherEvent((ev) => console.log(ev.path, ev.op));
|
|
22
|
+
* ws.connect();
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export class RuntimeWebSocket {
|
|
26
|
+
_ws = null;
|
|
27
|
+
_baseUrl;
|
|
28
|
+
_token;
|
|
29
|
+
_reconnect;
|
|
30
|
+
_reconnectDelay;
|
|
31
|
+
_maxReconnectAttempts;
|
|
32
|
+
_reconnectAttempts = 0;
|
|
33
|
+
_intentionallyClosed = false;
|
|
34
|
+
_reconnectTimer = null;
|
|
35
|
+
// ── Event callbacks ──────────────────────────────────────────────
|
|
36
|
+
/** Terminal stdout data: (terminalId, rawData). */
|
|
37
|
+
_onTerminalOutput = null;
|
|
38
|
+
/** Terminal exit event: (terminalId, exitCode). */
|
|
39
|
+
_onTerminalExit = null;
|
|
40
|
+
/** Watcher events (change, ready, overflow). */
|
|
41
|
+
_onWatcherEvent = null;
|
|
42
|
+
/** Connection opened. */
|
|
43
|
+
_onOpen = null;
|
|
44
|
+
/** Connection closed. */
|
|
45
|
+
_onClose = null;
|
|
46
|
+
/** Connection error. */
|
|
47
|
+
_onError = null;
|
|
48
|
+
/** Any text message (raw). */
|
|
49
|
+
_onMessage = null;
|
|
50
|
+
constructor(runtimeOptions, wsOptions) {
|
|
51
|
+
const base = (runtimeOptions.baseUrl ?? 'https://workspace.oblien.com').replace(/\/$/, '');
|
|
52
|
+
this._baseUrl = base.replace(/^http/, 'ws');
|
|
53
|
+
this._token = runtimeOptions.token;
|
|
54
|
+
this._reconnect = wsOptions?.reconnect ?? true;
|
|
55
|
+
this._reconnectDelay = wsOptions?.reconnectDelay ?? 1000;
|
|
56
|
+
this._maxReconnectAttempts = wsOptions?.maxReconnectAttempts ?? Infinity;
|
|
57
|
+
}
|
|
58
|
+
// ── Public API: Event Handlers ────────────────────────────────────
|
|
59
|
+
/**
|
|
60
|
+
* Register a handler for terminal output (binary frames).
|
|
61
|
+
* `id` is the terminal session ID (string), `data` is the raw output.
|
|
62
|
+
*/
|
|
63
|
+
onTerminalOutput(handler) {
|
|
64
|
+
this._onTerminalOutput = handler;
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
/** Register a handler for terminal exit events. */
|
|
68
|
+
onTerminalExit(handler) {
|
|
69
|
+
this._onTerminalExit = handler;
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
/** Register a handler for file watcher events (change, ready, overflow). */
|
|
73
|
+
onWatcherEvent(handler) {
|
|
74
|
+
this._onWatcherEvent = handler;
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
/** Register a handler called when the WebSocket connects. */
|
|
78
|
+
onOpen(handler) {
|
|
79
|
+
this._onOpen = handler;
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
/** Register a handler called when the WebSocket closes. */
|
|
83
|
+
onClose(handler) {
|
|
84
|
+
this._onClose = handler;
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
/** Register a handler for errors. */
|
|
88
|
+
onError(handler) {
|
|
89
|
+
this._onError = handler;
|
|
90
|
+
return this;
|
|
91
|
+
}
|
|
92
|
+
/** Register a handler for all incoming text messages (raw parsed JSON). */
|
|
93
|
+
onMessage(handler) {
|
|
94
|
+
this._onMessage = handler;
|
|
95
|
+
return this;
|
|
96
|
+
}
|
|
97
|
+
// ── Public API: Send ──────────────────────────────────────────────
|
|
98
|
+
/**
|
|
99
|
+
* Write stdin data to a terminal session.
|
|
100
|
+
* Binary frame format: `[terminal_id_byte][data]`.
|
|
101
|
+
*
|
|
102
|
+
* `terminalId` is the numeric session ID (same as `parseInt(session.id)`).
|
|
103
|
+
* Accepts either a `string` (e.g. `"1"`) or `number`.
|
|
104
|
+
*/
|
|
105
|
+
writeTerminalInput(terminalId, data) {
|
|
106
|
+
if (!this._ws || this._ws.readyState !== WebSocket.OPEN)
|
|
107
|
+
return;
|
|
108
|
+
const id = typeof terminalId === 'string' ? parseInt(terminalId, 10) : terminalId;
|
|
109
|
+
const payload = typeof data === 'string' ? new TextEncoder().encode(data) : data;
|
|
110
|
+
const frame = new Uint8Array(1 + payload.length);
|
|
111
|
+
frame[0] = id;
|
|
112
|
+
frame.set(payload, 1);
|
|
113
|
+
this._ws.send(frame);
|
|
114
|
+
}
|
|
115
|
+
/** Send a terminal resize command. */
|
|
116
|
+
resizeTerminal(terminalId, cols, rows) {
|
|
117
|
+
this.sendJSON({
|
|
118
|
+
channel: 'terminal',
|
|
119
|
+
type: 'resize',
|
|
120
|
+
id: terminalId,
|
|
121
|
+
cols,
|
|
122
|
+
rows,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/** Send a raw JSON text message. */
|
|
126
|
+
sendJSON(msg) {
|
|
127
|
+
if (!this._ws || this._ws.readyState !== WebSocket.OPEN)
|
|
128
|
+
return;
|
|
129
|
+
this._ws.send(JSON.stringify(msg));
|
|
130
|
+
}
|
|
131
|
+
// ── Public API: Lifecycle ─────────────────────────────────────────
|
|
132
|
+
/** Open the WebSocket connection. */
|
|
133
|
+
connect() {
|
|
134
|
+
this._intentionallyClosed = false;
|
|
135
|
+
this._reconnectAttempts = 0;
|
|
136
|
+
this._doConnect();
|
|
137
|
+
}
|
|
138
|
+
/** Close the WebSocket connection (no reconnect). */
|
|
139
|
+
close() {
|
|
140
|
+
this._intentionallyClosed = true;
|
|
141
|
+
if (this._reconnectTimer) {
|
|
142
|
+
clearTimeout(this._reconnectTimer);
|
|
143
|
+
this._reconnectTimer = null;
|
|
144
|
+
}
|
|
145
|
+
if (this._ws) {
|
|
146
|
+
this._ws.close(1000, 'client close');
|
|
147
|
+
this._ws = null;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/** Whether the socket is currently open. */
|
|
151
|
+
get connected() {
|
|
152
|
+
return this._ws?.readyState === WebSocket.OPEN;
|
|
153
|
+
}
|
|
154
|
+
// ── Internals ─────────────────────────────────────────────────────
|
|
155
|
+
_doConnect() {
|
|
156
|
+
const url = `${this._baseUrl}/ws?token=${encodeURIComponent(this._token)}`;
|
|
157
|
+
const ws = new WebSocket(url);
|
|
158
|
+
ws.binaryType = 'arraybuffer';
|
|
159
|
+
this._ws = ws;
|
|
160
|
+
ws.addEventListener('open', () => {
|
|
161
|
+
this._reconnectAttempts = 0;
|
|
162
|
+
this._onOpen?.();
|
|
163
|
+
});
|
|
164
|
+
ws.addEventListener('close', (ev) => {
|
|
165
|
+
this._onClose?.(ev.code, ev.reason);
|
|
166
|
+
this._ws = null;
|
|
167
|
+
if (!this._intentionallyClosed && this._reconnect) {
|
|
168
|
+
this._scheduleReconnect();
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
ws.addEventListener('error', (ev) => {
|
|
172
|
+
this._onError?.(ev);
|
|
173
|
+
});
|
|
174
|
+
ws.addEventListener('message', (ev) => {
|
|
175
|
+
if (ev.data instanceof ArrayBuffer) {
|
|
176
|
+
this._handleBinary(new Uint8Array(ev.data));
|
|
177
|
+
}
|
|
178
|
+
else if (typeof ev.data === 'string') {
|
|
179
|
+
this._handleText(ev.data);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
_handleBinary(frame) {
|
|
184
|
+
if (frame.length < 2)
|
|
185
|
+
return;
|
|
186
|
+
const id = String(frame[0]);
|
|
187
|
+
const data = frame.subarray(1);
|
|
188
|
+
this._onTerminalOutput?.(id, data);
|
|
189
|
+
}
|
|
190
|
+
_handleText(raw) {
|
|
191
|
+
let msg;
|
|
192
|
+
try {
|
|
193
|
+
msg = JSON.parse(raw);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
this._onMessage?.(msg);
|
|
199
|
+
const channel = msg.channel || 'terminal';
|
|
200
|
+
switch (channel) {
|
|
201
|
+
case 'terminal':
|
|
202
|
+
this._handleTerminalMessage(msg);
|
|
203
|
+
break;
|
|
204
|
+
case 'watcher':
|
|
205
|
+
this._onWatcherEvent?.(msg);
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
_handleTerminalMessage(msg) {
|
|
210
|
+
const type = msg.type;
|
|
211
|
+
if (type === 'exit') {
|
|
212
|
+
const ev = msg;
|
|
213
|
+
this._onTerminalExit?.(ev.id, ev.code);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
_scheduleReconnect() {
|
|
217
|
+
if (this._reconnectAttempts >= this._maxReconnectAttempts)
|
|
218
|
+
return;
|
|
219
|
+
this._reconnectAttempts++;
|
|
220
|
+
// Exponential backoff capped at 30s
|
|
221
|
+
const delay = Math.min(this._reconnectDelay * Math.pow(1.5, this._reconnectAttempts - 1), 30_000);
|
|
222
|
+
this._reconnectTimer = setTimeout(() => {
|
|
223
|
+
this._reconnectTimer = null;
|
|
224
|
+
this._doConnect();
|
|
225
|
+
}, delay);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/runtime/ws.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { RuntimeOptions } from './types/runtime.js';
|
|
2
|
+
/**
|
|
3
|
+
* HTTP transport for the Runtime (workspace internal API).
|
|
4
|
+
* Uses Bearer token auth against workspace.oblien.com or a direct IP.
|
|
5
|
+
*/
|
|
6
|
+
export declare class RuntimeHttpClient {
|
|
7
|
+
private readonly baseUrl;
|
|
8
|
+
private readonly headers;
|
|
9
|
+
constructor(options: RuntimeOptions);
|
|
10
|
+
request<T = unknown>(options: {
|
|
11
|
+
method: string;
|
|
12
|
+
path: string;
|
|
13
|
+
body?: unknown;
|
|
14
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
15
|
+
headers?: Record<string, string>;
|
|
16
|
+
}): Promise<T>;
|
|
17
|
+
/** Send raw bytes (for stdin). */
|
|
18
|
+
requestRaw(path: string, data: string): Promise<unknown>;
|
|
19
|
+
/**
|
|
20
|
+
* Get a raw streaming Response for SSE / NDJSON consumption.
|
|
21
|
+
* Handles auth and error checking; callers parse the stream format.
|
|
22
|
+
*/
|
|
23
|
+
requestStream(options: {
|
|
24
|
+
method: string;
|
|
25
|
+
path: string;
|
|
26
|
+
body?: unknown;
|
|
27
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
28
|
+
headers?: Record<string, string>;
|
|
29
|
+
}): Promise<Response>;
|
|
30
|
+
getBaseUrl(): string;
|
|
31
|
+
getHeaders(): Record<string, string>;
|
|
32
|
+
private buildUrl;
|
|
33
|
+
private errorForStatus;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=runtime-http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-http.d.ts","sourceRoot":"","sources":["../src/runtime-http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAUzD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,OAAO,EAAE,cAAc;IAQ7B,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE;QAClC,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;QAC9D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,CAAC,CAAC;IAsBd,kCAAkC;IAC5B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe9D;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE;QAC3B,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;QAC9D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsBrB,UAAU,IAAI,MAAM;IAIpB,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMpC,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,cAAc;CAcvB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { OblienError, AuthenticationError, NotFoundError, RateLimitError, ValidationError, ConflictError, } from './error.js';
|
|
2
|
+
/**
|
|
3
|
+
* HTTP transport for the Runtime (workspace internal API).
|
|
4
|
+
* Uses Bearer token auth against workspace.oblien.com or a direct IP.
|
|
5
|
+
*/
|
|
6
|
+
export class RuntimeHttpClient {
|
|
7
|
+
baseUrl;
|
|
8
|
+
headers;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.baseUrl = (options.baseUrl ?? 'https://workspace.oblien.com').replace(/\/$/, '');
|
|
11
|
+
this.headers = {
|
|
12
|
+
'Content-Type': 'application/json',
|
|
13
|
+
'Authorization': `Bearer ${options.token}`,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
async request(options) {
|
|
17
|
+
const url = this.buildUrl(options.path, options.query);
|
|
18
|
+
const init = {
|
|
19
|
+
method: options.method,
|
|
20
|
+
headers: { ...this.headers, ...options.headers },
|
|
21
|
+
};
|
|
22
|
+
if (options.body !== undefined) {
|
|
23
|
+
init.body = JSON.stringify(options.body);
|
|
24
|
+
}
|
|
25
|
+
const res = await fetch(url, init);
|
|
26
|
+
const body = await res.json().catch(() => null);
|
|
27
|
+
if (!res.ok) {
|
|
28
|
+
throw this.errorForStatus(res.status, body);
|
|
29
|
+
}
|
|
30
|
+
return body;
|
|
31
|
+
}
|
|
32
|
+
/** Send raw bytes (for stdin). */
|
|
33
|
+
async requestRaw(path, data) {
|
|
34
|
+
const url = this.buildUrl(path);
|
|
35
|
+
const res = await fetch(url, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
headers: {
|
|
38
|
+
...this.headers,
|
|
39
|
+
'Content-Type': 'application/octet-stream',
|
|
40
|
+
},
|
|
41
|
+
body: data,
|
|
42
|
+
});
|
|
43
|
+
const json = await res.json().catch(() => null);
|
|
44
|
+
if (!res.ok)
|
|
45
|
+
throw this.errorForStatus(res.status, json);
|
|
46
|
+
return json;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get a raw streaming Response for SSE / NDJSON consumption.
|
|
50
|
+
* Handles auth and error checking; callers parse the stream format.
|
|
51
|
+
*/
|
|
52
|
+
async requestStream(options) {
|
|
53
|
+
const url = this.buildUrl(options.path, options.query);
|
|
54
|
+
const init = {
|
|
55
|
+
method: options.method,
|
|
56
|
+
headers: { ...this.headers, ...options.headers },
|
|
57
|
+
};
|
|
58
|
+
if (options.body !== undefined) {
|
|
59
|
+
init.body = JSON.stringify(options.body);
|
|
60
|
+
}
|
|
61
|
+
const res = await fetch(url, init);
|
|
62
|
+
if (!res.ok) {
|
|
63
|
+
const body = await res.json().catch(() => null);
|
|
64
|
+
throw this.errorForStatus(res.status, body);
|
|
65
|
+
}
|
|
66
|
+
return res;
|
|
67
|
+
}
|
|
68
|
+
getBaseUrl() {
|
|
69
|
+
return this.baseUrl;
|
|
70
|
+
}
|
|
71
|
+
getHeaders() {
|
|
72
|
+
return { ...this.headers };
|
|
73
|
+
}
|
|
74
|
+
// ── Internals ───────────────────────────────────────────────────────
|
|
75
|
+
buildUrl(path, query) {
|
|
76
|
+
const normalized = path.startsWith('/') ? path : `/${path}`;
|
|
77
|
+
const url = new URL(normalized, this.baseUrl);
|
|
78
|
+
if (query) {
|
|
79
|
+
for (const [k, v] of Object.entries(query)) {
|
|
80
|
+
if (v !== undefined)
|
|
81
|
+
url.searchParams.set(k, String(v));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return url.toString();
|
|
85
|
+
}
|
|
86
|
+
errorForStatus(status, body) {
|
|
87
|
+
const msg = body?.error ??
|
|
88
|
+
`Request failed with status ${status}`;
|
|
89
|
+
switch (status) {
|
|
90
|
+
case 401: return new AuthenticationError(msg);
|
|
91
|
+
case 404: return new NotFoundError(msg);
|
|
92
|
+
case 409: return new ConflictError(msg);
|
|
93
|
+
case 422: return new ValidationError(msg);
|
|
94
|
+
case 429: return new RateLimitError(msg);
|
|
95
|
+
default: return new OblienError(msg, status);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=runtime-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-http.js","sourceRoot":"","sources":["../src/runtime-http.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACX,OAAO,CAAS;IAChB,OAAO,CAAyB;IAEjD,YAAY,OAAuB;QACjC,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,8BAA8B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtF,IAAI,CAAC,OAAO,GAAG;YACb,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;SAC3C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAc,OAM1B;QACC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAgB;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE;SACjD,CAAC;QAEF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,IAAS,CAAC;IACnB,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,IAAY;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,GAAG,IAAI,CAAC,OAAO;gBACf,cAAc,EAAE,0BAA0B;aAC3C;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,OAMnB;QACC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAgB;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE;SACjD,CAAC;QAEF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAEnC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,UAAU;QACR,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,uEAAuE;IAE/D,QAAQ,CACd,IAAY,EACZ,KAA6D;QAE7D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAE9C,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,SAAS;oBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAEO,cAAc,CAAC,MAAc,EAAE,IAAa;QAClD,MAAM,GAAG,GACN,IAAgC,EAAE,KAAe;YAClD,8BAA8B,MAAM,EAAE,CAAC;QAEzC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,GAAG,CAAC,CAAC,OAAO,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAC9C,KAAK,GAAG,CAAC,CAAC,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;YACxC,KAAK,GAAG,CAAC,CAAC,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;YACxC,KAAK,GAAG,CAAC,CAAC,OAAO,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;YAC1C,KAAK,GAAG,CAAC,CAAC,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;YACzC,OAAO,CAAC,CAAE,OAAO,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF"}
|