@fabric-harness/connectors 0.14.1 → 0.16.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,74 @@
1
+ import type { SandboxEnv, SandboxFactory } from '@fabric-harness/sdk';
2
+ import type { RemoteAdapterOptions } from './index.js';
3
+ /**
4
+ * Structural shape of `@vercel/sandbox`'s `Sandbox` instance, kept narrow so
5
+ * this package doesn't peer-dep on `@vercel/sandbox` directly. Pass any
6
+ * object satisfying this contract — the real `Sandbox` from
7
+ * `@vercel/sandbox` does.
8
+ *
9
+ * See https://vercel.com/docs/vercel-sandbox/sdk-reference for the upstream
10
+ * API. This adapter targets the post-GA shape (`runCommand`, `fs.*`).
11
+ */
12
+ export interface VercelSandboxLike {
13
+ runCommand(input: {
14
+ cmd: string;
15
+ cwd?: string;
16
+ env?: Record<string, string>;
17
+ timeout?: number;
18
+ }): Promise<{
19
+ stdout?: string;
20
+ stderr?: string;
21
+ exitCode?: number;
22
+ status?: string;
23
+ }>;
24
+ fs: {
25
+ readFile(path: string, encoding?: 'utf8'): Promise<string>;
26
+ readFile(path: string): Promise<Uint8Array | Buffer>;
27
+ writeFile(path: string, content: string | Uint8Array): Promise<void>;
28
+ stat(path: string): Promise<{
29
+ isDirectory?: boolean;
30
+ size?: number;
31
+ mtime?: Date;
32
+ }>;
33
+ readdir(path: string): Promise<string[]>;
34
+ mkdir(path: string, options?: {
35
+ recursive?: boolean;
36
+ }): Promise<void>;
37
+ rm(path: string, options?: {
38
+ recursive?: boolean;
39
+ force?: boolean;
40
+ }): Promise<void>;
41
+ };
42
+ /** Optional: stop and tear down the sandbox. */
43
+ stop?(): Promise<void> | void;
44
+ /** Optional: extend the lifetime of the sandbox before its idle timeout. */
45
+ extendTimeout?(durationMs: number): Promise<void> | void;
46
+ }
47
+ export interface VercelSandboxOptions extends RemoteAdapterOptions {
48
+ /** Defaults to Vercel's container default `/vercel/sandbox`. */
49
+ cwd?: string;
50
+ }
51
+ /**
52
+ * Wrap a Vercel Sandbox instance as a Fabric Harness `SandboxEnv`. The
53
+ * sandbox's filesystem and shell exec are mapped to the fabric contract;
54
+ * `cleanup: true` calls `sandbox.stop()` when the Fabric session tears down.
55
+ *
56
+ * ```ts
57
+ * import { Sandbox } from '@vercel/sandbox';
58
+ * import { vercelSandbox } from '@fabric-harness/connectors/vercel';
59
+ *
60
+ * const remote = await Sandbox.create({ runtime: 'node24' });
61
+ * const fabric = await init({ sandbox: vercelSandbox(remote, { cleanup: true }) });
62
+ * ```
63
+ *
64
+ * Vercel's `runCommand` accepts a single command string with optional
65
+ * `cwd`/`env`/`timeout`; we pass each through and surface stdout/stderr/exit.
66
+ */
67
+ export declare function vercelSandbox(sandbox: VercelSandboxLike, options?: VercelSandboxOptions): SandboxEnv;
68
+ /**
69
+ * Convenience factory that returns a `SandboxFactory`, suitable for
70
+ * `init({ sandbox: vercelSandboxFactory(...) })`. Provisions a fresh sandbox
71
+ * on first use via the supplied `create()` callback.
72
+ */
73
+ export declare function vercelSandboxFactory(create: () => Promise<VercelSandboxLike> | VercelSandboxLike, options?: VercelSandboxOptions): SandboxFactory;
74
+ //# sourceMappingURL=vercel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel.d.ts","sourceRoot":"","sources":["../src/vercel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,UAAU,EACV,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,KAAK,EAAE;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtF,EAAE,EAAE;QACF,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC;QACrD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,WAAW,CAAC,EAAE,OAAO,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,IAAI,CAAA;SAAE,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACtE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,OAAO,CAAC;YAAC,KAAK,CAAC,EAAE,OAAO,CAAA;SAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACrF,CAAC;IACF,gDAAgD;IAChD,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9B,4EAA4E;IAC5E,aAAa,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC1D;AAED,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,oBAAyB,GACjC,UAAU,CA4EZ;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,EAC5D,OAAO,GAAE,oBAAyB,GACjC,cAAc,CAKhB"}
package/dist/vercel.js ADDED
@@ -0,0 +1,111 @@
1
+ import { createRemoteSandboxEnv } from '@fabric-harness/sdk';
2
+ /**
3
+ * Wrap a Vercel Sandbox instance as a Fabric Harness `SandboxEnv`. The
4
+ * sandbox's filesystem and shell exec are mapped to the fabric contract;
5
+ * `cleanup: true` calls `sandbox.stop()` when the Fabric session tears down.
6
+ *
7
+ * ```ts
8
+ * import { Sandbox } from '@vercel/sandbox';
9
+ * import { vercelSandbox } from '@fabric-harness/connectors/vercel';
10
+ *
11
+ * const remote = await Sandbox.create({ runtime: 'node24' });
12
+ * const fabric = await init({ sandbox: vercelSandbox(remote, { cleanup: true }) });
13
+ * ```
14
+ *
15
+ * Vercel's `runCommand` accepts a single command string with optional
16
+ * `cwd`/`env`/`timeout`; we pass each through and surface stdout/stderr/exit.
17
+ */
18
+ export function vercelSandbox(sandbox, options = {}) {
19
+ const api = {
20
+ async exec(command, execOptions) {
21
+ const input = {
22
+ cmd: command,
23
+ };
24
+ if (execOptions?.cwd !== undefined)
25
+ input.cwd = execOptions.cwd;
26
+ if (execOptions?.env !== undefined)
27
+ input.env = execOptions.env;
28
+ if (execOptions?.timeout !== undefined)
29
+ input.timeout = execOptions.timeout;
30
+ const result = await sandbox.runCommand(input);
31
+ return {
32
+ command,
33
+ exitCode: result.exitCode ?? (result.status === 'success' ? 0 : 1),
34
+ stdout: result.stdout ?? '',
35
+ stderr: result.stderr ?? '',
36
+ };
37
+ },
38
+ async readFile(path) {
39
+ const content = await sandbox.fs.readFile(path, 'utf8');
40
+ return content;
41
+ },
42
+ async readFileBuffer(path) {
43
+ // Vercel's fs.readFile is overloaded; calling without an encoding may
44
+ // return a Buffer (Node) or Uint8Array depending on runtime.
45
+ const data = (await sandbox.fs.readFile(path));
46
+ if (data instanceof Uint8Array)
47
+ return data;
48
+ if (typeof data === 'string')
49
+ return new TextEncoder().encode(data);
50
+ return new Uint8Array(data);
51
+ },
52
+ async writeFile(path, content) {
53
+ await sandbox.fs.writeFile(path, content);
54
+ },
55
+ async stat(path) {
56
+ const info = await sandbox.fs.stat(path);
57
+ return {
58
+ type: info.isDirectory ? 'directory' : 'file',
59
+ size: info.size ?? 0,
60
+ ...(info.mtime ? { mtime: info.mtime } : {}),
61
+ };
62
+ },
63
+ async readdir(path) {
64
+ return sandbox.fs.readdir(path);
65
+ },
66
+ async exists(path) {
67
+ try {
68
+ await sandbox.fs.stat(path);
69
+ return true;
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ },
75
+ async mkdir(path, mkdirOptions) {
76
+ await sandbox.fs.mkdir(path, mkdirOptions);
77
+ },
78
+ async rm(path, rmOptions) {
79
+ await sandbox.fs.rm(path, rmOptions);
80
+ },
81
+ };
82
+ const cleanup = options.cleanup === true && sandbox.stop
83
+ ? async () => {
84
+ const stop = sandbox.stop;
85
+ if (stop)
86
+ await stop.call(sandbox);
87
+ }
88
+ : typeof options.cleanup === 'function'
89
+ ? async () => {
90
+ await options.cleanup();
91
+ }
92
+ : undefined;
93
+ return createRemoteSandboxEnv(api, {
94
+ cwd: options.cwd ?? '/vercel/sandbox',
95
+ ...(options.capabilities ? { capabilities: options.capabilities } : {}),
96
+ ...(cleanup ? { cleanup } : {}),
97
+ ...(options.encodeRef ? { encodeRef: options.encodeRef } : {}),
98
+ });
99
+ }
100
+ /**
101
+ * Convenience factory that returns a `SandboxFactory`, suitable for
102
+ * `init({ sandbox: vercelSandboxFactory(...) })`. Provisions a fresh sandbox
103
+ * on first use via the supplied `create()` callback.
104
+ */
105
+ export function vercelSandboxFactory(create, options = {}) {
106
+ return async () => {
107
+ const sandbox = await create();
108
+ return vercelSandbox(sandbox, options);
109
+ };
110
+ }
111
+ //# sourceMappingURL=vercel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel.js","sourceRoot":"","sources":["../src/vercel.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fabric-harness/connectors",
3
- "version": "0.14.1",
3
+ "version": "0.16.1",
4
4
  "description": "Connector recipes (sandbox, mcp, data) for Fabric Harness — markdown-based provider integrations.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Fabric",
@@ -60,6 +60,10 @@
60
60
  "types": "./dist/k8s.d.ts",
61
61
  "import": "./dist/k8s.js"
62
62
  },
63
+ "./vercel": {
64
+ "types": "./dist/vercel.d.ts",
65
+ "import": "./dist/vercel.js"
66
+ },
63
67
  "./sandbox-refs": {
64
68
  "types": "./dist/sandbox-refs.d.ts",
65
69
  "import": "./dist/sandbox-refs.js"
@@ -71,13 +75,14 @@
71
75
  "LICENSE"
72
76
  ],
73
77
  "dependencies": {
74
- "@fabric-harness/sdk": "1.0.0"
78
+ "@fabric-harness/sdk": "^1.12.1"
75
79
  },
76
80
  "peerDependencies": {
77
81
  "@aws-sdk/client-s3": "^3.0.0",
78
82
  "@azure/storage-blob": "^12.0.0",
79
83
  "@google-cloud/storage": "^7.0.0",
80
84
  "@kubernetes/client-node": "^0.21.0",
85
+ "@vercel/sandbox": "*",
81
86
  "octokit": "^4.0.0"
82
87
  },
83
88
  "peerDependenciesMeta": {
@@ -93,6 +98,9 @@
93
98
  "@kubernetes/client-node": {
94
99
  "optional": true
95
100
  },
101
+ "@vercel/sandbox": {
102
+ "optional": true
103
+ },
96
104
  "octokit": {
97
105
  "optional": true
98
106
  }