@sandbank.dev/boxlite 0.1.0 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,YAAY,EAGZ,UAAU,EACV,cAAc,EACd,WAAW,EAIZ,MAAM,oBAAoB,CAAA;AAG3B,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,YAAY,CAAA;AAsKlE,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,IAAI,aAAY;IACzB,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,UAAU,CAAC,CAM5C;IAEF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;gBAEtD,MAAM,EAAE,oBAAoB;IAKlC,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IA0C5D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAW/C,aAAa,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA0B1D,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAShD"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,YAAY,EAGZ,UAAU,EACV,cAAc,EACd,WAAW,EAIZ,MAAM,oBAAoB,CAAA;AAG3B,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,YAAY,CAAA;AAwKlE,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,IAAI,aAAY;IACzB,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,UAAU,CAAC,CAM5C;IAEF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;gBAEtD,MAAM,EAAE,oBAAoB;IAKlC,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IA0C5D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAW/C,aAAa,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA0B1D,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAShD"}
package/dist/adapter.js CHANGED
@@ -102,16 +102,18 @@ function wrapBox(box, client, config, portMappings) {
102
102
  async startTerminal(options) {
103
103
  const port = 7681;
104
104
  const shell = options?.shell ?? '/bin/bash';
105
- const ttydUrl = 'https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd.x86_64';
105
+ const ttydBase = 'https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd';
106
106
  // 1. Ensure ttyd is available
107
107
  const check = await client.exec(box.box_id, { command: 'which', args: ['ttyd'] });
108
108
  if (check.exitCode !== 0) {
109
109
  await client.exec(box.box_id, {
110
110
  command: 'bash',
111
111
  args: ['-c',
112
- `command -v curl > /dev/null && curl -sL ${ttydUrl} -o /usr/local/bin/ttyd`
113
- + ` || { command -v wget > /dev/null && wget -qO /usr/local/bin/ttyd ${ttydUrl}; }`
114
- + ` || { apt-get update -qq && apt-get install -y -qq wget > /dev/null && wget -qO /usr/local/bin/ttyd ${ttydUrl}; }`,
112
+ `ARCH=$(uname -m); case "$ARCH" in aarch64|arm64) ARCH=aarch64;; x86_64) ARCH=x86_64;; *) echo "Unsupported arch: $ARCH" >&2; exit 1;; esac; `
113
+ + `TTYD_URL="${ttydBase}.$ARCH"; `
114
+ + `command -v curl > /dev/null && curl -sL "$TTYD_URL" -o /usr/local/bin/ttyd`
115
+ + ` || { command -v wget > /dev/null && wget -qO /usr/local/bin/ttyd "$TTYD_URL"; }`
116
+ + ` || { apt-get update -qq && apt-get install -y -qq wget > /dev/null && wget -qO /usr/local/bin/ttyd "$TTYD_URL"; }`,
115
117
  ],
116
118
  });
117
119
  await client.exec(box.box_id, {
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAElB,eAAe,EAEhB,MAAM,YAAY,CAAA;AAEnB,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB;sBA4HpC,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;kBAO7C,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;uBAIvB,MAAM,aAAa,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;qBASnD,MAAM,oBAAkB,OAAO,CAAC,IAAI,CAAC;oBAMtC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;mBAIvB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;gBAOlC,MAAM,OACR,kBAAkB,GACtB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;sBAwBvD,MAAM,OACR,kBAAkB,GACtB,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;uBAuEb,MAAM,QAAQ,MAAM,WAAW,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;yBAkBvD,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;0BAwBzD,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;2BAO9C,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;yBAMtC,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;0BAIlC,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAMnE;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAA"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAElB,eAAe,EAEhB,MAAM,YAAY,CAAA;AAEnB,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB;sBA0HpC,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;kBAO7C,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;uBAIvB,MAAM,aAAa,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;qBASnD,MAAM,oBAAkB,OAAO,CAAC,IAAI,CAAC;oBAMtC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;mBAIvB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;gBAOlC,MAAM,OACR,kBAAkB,GACtB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;sBAwBvD,MAAM,OACR,kBAAkB,GACtB,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;uBAuEb,MAAM,QAAQ,MAAM,WAAW,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;yBAkBvD,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;0BAwBzD,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;2BAO9C,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;yBAMtC,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;0BAIlC,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAMnE;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAA"}
package/dist/client.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export function createBoxLiteClient(config) {
2
2
  const { apiUrl } = config;
3
- const prefix = config.prefix ?? 'default';
3
+ const prefix = config.prefix ?? '';
4
4
  const baseUrl = apiUrl.replace(/\/$/, '') + '/v1';
5
5
  // --- Token management ---
6
6
  let token = config.apiToken ?? '';
@@ -9,13 +9,12 @@ export function createBoxLiteClient(config) {
9
9
  // If a static token was provided, always use it
10
10
  if (config.apiToken)
11
11
  return config.apiToken;
12
+ // No auth configured — run without authentication
13
+ if (!config.clientId || !config.clientSecret)
14
+ return '';
12
15
  // If we have a valid cached token, use it
13
16
  if (token && Date.now() < tokenExpiresAt)
14
17
  return token;
15
- // Acquire token via OAuth2 client credentials
16
- if (!config.clientId || !config.clientSecret) {
17
- throw new Error('BoxLite: either apiToken or clientId+clientSecret must be provided');
18
- }
19
18
  const response = await fetch(`${baseUrl}/oauth/tokens`, {
20
19
  method: 'POST',
21
20
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
@@ -37,15 +36,15 @@ export function createBoxLiteClient(config) {
37
36
  }
38
37
  async function request(path, options = {}, rawResponse = false) {
39
38
  const bearerToken = await ensureToken();
40
- const url = `${baseUrl}/${prefix}${path}`;
41
- const response = await fetch(url, {
42
- ...options,
43
- headers: {
44
- 'Authorization': `Bearer ${bearerToken}`,
45
- 'Content-Type': 'application/json',
46
- ...options.headers,
47
- },
48
- });
39
+ const url = prefix ? `${baseUrl}/${prefix}${path}` : `${baseUrl}${path}`;
40
+ const headers = {
41
+ 'Content-Type': 'application/json',
42
+ ...options.headers,
43
+ };
44
+ if (bearerToken) {
45
+ headers['Authorization'] = `Bearer ${bearerToken}`;
46
+ }
47
+ const response = await fetch(url, { ...options, headers });
49
48
  if (rawResponse)
50
49
  return response;
51
50
  if (!response.ok) {
@@ -215,7 +214,7 @@ export function createBoxLiteClient(config) {
215
214
  // --- Files (native tar API) ---
216
215
  async uploadFiles(boxId, path, tarData) {
217
216
  const bearerToken = await ensureToken();
218
- const url = `${baseUrl}/${prefix}/boxes/${boxId}/files?path=${encodeURIComponent(path)}`;
217
+ const url = `${baseUrl}${prefix ? `/${prefix}` : ''}/boxes/${boxId}/files?path=${encodeURIComponent(path)}`;
219
218
  const response = await fetch(url, {
220
219
  method: 'PUT',
221
220
  headers: {
@@ -231,7 +230,7 @@ export function createBoxLiteClient(config) {
231
230
  },
232
231
  async downloadFiles(boxId, path) {
233
232
  const bearerToken = await ensureToken();
234
- const url = `${baseUrl}/${prefix}/boxes/${boxId}/files?path=${encodeURIComponent(path)}`;
233
+ const url = `${baseUrl}${prefix ? `/${prefix}` : ''}/boxes/${boxId}/files?path=${encodeURIComponent(path)}`;
235
234
  const response = await fetch(url, {
236
235
  headers: {
237
236
  'Authorization': `Bearer ${bearerToken}`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sandbank.dev/boxlite",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "BoxLite bare-metal sandbox adapter for Sandbank",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -10,31 +10,23 @@
10
10
  "url": "https://github.com/chekusu/sandbank.git",
11
11
  "directory": "packages/boxlite"
12
12
  },
13
- "keywords": [
14
- "sandbox",
15
- "ai-agent",
16
- "boxlite",
17
- "bare-metal",
18
- "kvm"
19
- ],
13
+ "keywords": ["sandbox", "ai-agent", "boxlite", "bare-metal", "kvm"],
20
14
  "exports": {
21
15
  ".": {
22
16
  "types": "./dist/index.d.ts",
23
17
  "import": "./dist/index.js"
24
18
  }
25
19
  },
26
- "files": [
27
- "dist"
28
- ],
29
- "dependencies": {
30
- "@sandbank.dev/core": "0.1.0"
31
- },
32
- "devDependencies": {
33
- "typescript": "^5.7.3"
34
- },
20
+ "files": ["dist"],
35
21
  "scripts": {
36
22
  "build": "tsc",
37
23
  "typecheck": "tsc --noEmit",
38
24
  "clean": "rm -rf dist"
25
+ },
26
+ "dependencies": {
27
+ "@sandbank.dev/core": "^0.2.0"
28
+ },
29
+ "devDependencies": {
30
+ "typescript": "^5.7.3"
39
31
  }
40
- }
32
+ }