@sand.ai/vibable-cli 0.1.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/args.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ export type ConnectArgs = {
2
+ apiBaseUrl: string;
3
+ sessionId: string;
4
+ token: string;
5
+ directory: string;
6
+ localDeps: boolean;
7
+ };
8
+ export type ExecArgs = {
9
+ apiBaseUrl: string;
10
+ sessionId: string;
11
+ token: string;
12
+ shell: boolean;
13
+ command: string[];
14
+ };
15
+ export declare function parseConnectArgs(args: string[]): ConnectArgs;
16
+ export declare function parseExecArgs(args: string[]): Omit<ExecArgs, "apiBaseUrl" | "sessionId" | "token"> & Partial<Pick<ExecArgs, "apiBaseUrl" | "sessionId" | "token">>;
17
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAgB5D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC,GACjG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC,CAAC,CAgB9D"}
package/dist/args.js ADDED
@@ -0,0 +1,58 @@
1
+ export function parseConnectArgs(args) {
2
+ const values = parseOptions(args, new Set(["--local-deps"]));
3
+ const directory = values.positionals[0];
4
+ if (!values.options.api || !values.options.session || !values.options.token || !directory) {
5
+ throw new Error("Usage: vibable connect --api <url> --session <id> --token <token> <directory>");
6
+ }
7
+ return {
8
+ apiBaseUrl: values.options.api,
9
+ sessionId: values.options.session,
10
+ token: values.options.token,
11
+ directory,
12
+ localDeps: values.flags.has("--local-deps"),
13
+ };
14
+ }
15
+ export function parseExecArgs(args) {
16
+ const separatorIndex = args.indexOf("--");
17
+ const optionArgs = separatorIndex >= 0 ? args.slice(0, separatorIndex) : args;
18
+ const command = separatorIndex >= 0 ? args.slice(separatorIndex + 1) : [];
19
+ const values = parseOptions(optionArgs, new Set(["--shell"]));
20
+ if (command.length === 0) {
21
+ throw new Error("Usage: vibable exec [--api <url> --session <id> --token <token>] -- <command>");
22
+ }
23
+ return {
24
+ ...(values.options.api ? { apiBaseUrl: values.options.api } : {}),
25
+ ...(values.options.session ? { sessionId: values.options.session } : {}),
26
+ ...(values.options.token ? { token: values.options.token } : {}),
27
+ shell: values.flags.has("--shell"),
28
+ command,
29
+ };
30
+ }
31
+ function parseOptions(args, booleanFlags) {
32
+ const options = {};
33
+ const flags = new Set();
34
+ const positionals = [];
35
+ for (let index = 0; index < args.length; index += 1) {
36
+ const arg = args[index];
37
+ if (!arg) {
38
+ continue;
39
+ }
40
+ if (booleanFlags.has(arg)) {
41
+ flags.add(arg);
42
+ continue;
43
+ }
44
+ if (arg.startsWith("--")) {
45
+ const key = arg.slice(2);
46
+ const value = args[index + 1];
47
+ if (!value || value.startsWith("--")) {
48
+ throw new Error(`Missing value for ${arg}`);
49
+ }
50
+ options[key] = value;
51
+ index += 1;
52
+ continue;
53
+ }
54
+ positionals.push(arg);
55
+ }
56
+ return { flags, options, positionals };
57
+ }
58
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ import { parseConnectArgs, parseExecArgs } from "./args.js";
3
+ import { connectAndWatch, readLocalConfig, runRemoteCommand } from "./sync.js";
4
+ async function main() {
5
+ const [command, ...args] = process.argv.slice(2);
6
+ if (command === "connect") {
7
+ await connectAndWatch(parseConnectArgs(args));
8
+ return;
9
+ }
10
+ if (command === "exec") {
11
+ const parsed = parseExecArgs(args);
12
+ const config = parsed.apiBaseUrl && parsed.sessionId && parsed.token
13
+ ? {
14
+ apiBaseUrl: parsed.apiBaseUrl,
15
+ sessionId: parsed.sessionId,
16
+ token: parsed.token,
17
+ }
18
+ : await readLocalConfig();
19
+ await runRemoteCommand({
20
+ ...config,
21
+ shell: parsed.shell,
22
+ command: parsed.command,
23
+ });
24
+ return;
25
+ }
26
+ process.stderr.write([
27
+ "Usage:",
28
+ " vibable connect --api <url> --session <id> --token <token> <directory>",
29
+ " vibable exec [--api <url> --session <id> --token <token>] -- <command>",
30
+ "",
31
+ ].join("\n"));
32
+ process.exitCode = 1;
33
+ }
34
+ main().catch((error) => {
35
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
36
+ process.exitCode = 1;
37
+ });
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE/E,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,eAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,MAAM,GACV,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK;YACnD,CAAC,CAAC;gBACE,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB;YACH,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC;QAC9B,MAAM,gBAAgB,CAAC;YACrB,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,QAAQ;QACR,0EAA0E;QAC1E,0EAA0E;QAC1E,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ export declare const remoteDevProtocolVersion = "remote-dev.v1";
2
+ export declare const remoteDevMaxFileBytes: number;
3
+ export declare const remoteDevMaxEventsPerBatch = 500;
4
+ export type RemoteDevSessionStatus = "active" | "disconnected" | "revoked" | "expired";
5
+ export type RemoteDevSessionSummary = {
6
+ id: string;
7
+ status: RemoteDevSessionStatus;
8
+ protocolVersion: string;
9
+ clientVersion: string | null;
10
+ lastSequence: number;
11
+ lastSeenAt: string | null;
12
+ lastSyncAt: string | null;
13
+ recentSyncPaths: string[];
14
+ expiresAt: string;
15
+ createdAt: string;
16
+ };
17
+ export type RemoteDevSyncEvent = {
18
+ type: "upsert";
19
+ path: string;
20
+ contentBase64: string;
21
+ hash: string;
22
+ executable?: boolean;
23
+ } | {
24
+ type: "delete";
25
+ path: string;
26
+ } | {
27
+ type: "mkdir";
28
+ path: string;
29
+ };
30
+ export type RemoteDevManifestEntry = {
31
+ path: string;
32
+ type: "file" | "directory";
33
+ size: number;
34
+ hash: string | null;
35
+ updatedAt: string;
36
+ };
37
+ export declare function shouldIgnoreRemoteDevPath(path: string): boolean;
38
+ export declare function assertRemoteDevPath(path: string): string;
39
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,kBAAkB,CAAC;AACxD,eAAO,MAAM,qBAAqB,QAAkB,CAAC;AACrD,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,MAAM,MAAM,sBAAsB,GAC9B,QAAQ,GACR,cAAc,GACd,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,sBAAsB,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpC,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAcF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,WAUrD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,UAa/C"}
@@ -0,0 +1,34 @@
1
+ export const remoteDevProtocolVersion = "remote-dev.v1";
2
+ export const remoteDevMaxFileBytes = 5 * 1024 * 1024;
3
+ export const remoteDevMaxEventsPerBatch = 500;
4
+ const remoteDevIgnoredNames = new Set([
5
+ ".git",
6
+ ".vibable",
7
+ "node_modules",
8
+ ".next",
9
+ ".turbo",
10
+ ".cache",
11
+ "dist",
12
+ "build",
13
+ "coverage",
14
+ ]);
15
+ export function shouldIgnoreRemoteDevPath(path) {
16
+ return path
17
+ .split(/[\\/]/)
18
+ .filter(Boolean)
19
+ .some((segment) => remoteDevIgnoredNames.has(segment) ||
20
+ segment === ".DS_Store" ||
21
+ segment.startsWith(".env"));
22
+ }
23
+ export function assertRemoteDevPath(path) {
24
+ if (path.length === 0 ||
25
+ path.length > 1000 ||
26
+ path.includes("\0") ||
27
+ path.startsWith("/") ||
28
+ path.split(/[\\/]/).includes("..") ||
29
+ shouldIgnoreRemoteDevPath(path)) {
30
+ throw new Error(`Path is not allowed for remote dev sync: ${path}`);
31
+ }
32
+ return path;
33
+ }
34
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAC;AACxD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AACrD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAwC9C,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,MAAM;IACN,UAAU;IACV,cAAc;IACd,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,UAAU;CACX,CAAC,CAAC;AAEH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,OAAO,IAAI;SACR,KAAK,CAAC,OAAO,CAAC;SACd,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CACH,CAAC,OAAO,EAAE,EAAE,CACV,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC;QAClC,OAAO,KAAK,WAAW;QACvB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAC7B,CAAC;AACN,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IACE,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,IAAI;QAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,yBAAyB,CAAC,IAAI,CAAC,EAC/B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
package/dist/sync.d.ts ADDED
@@ -0,0 +1,56 @@
1
+ import { type RemoteDevManifestEntry, type RemoteDevSyncEvent } from "./protocol.js";
2
+ export declare const cliVersion = "0.1.0";
3
+ export type LocalConfig = {
4
+ apiBaseUrl: string;
5
+ sessionId: string;
6
+ token: string;
7
+ };
8
+ export type LocalEntry = {
9
+ type: "directory";
10
+ path: string;
11
+ } | {
12
+ type: "file";
13
+ path: string;
14
+ hash: string;
15
+ executable: boolean;
16
+ };
17
+ export declare function connectAndWatch(input: {
18
+ apiBaseUrl: string;
19
+ sessionId: string;
20
+ token: string;
21
+ directory: string;
22
+ }): Promise<void>;
23
+ export declare function runRemoteCommand(input: {
24
+ apiBaseUrl: string;
25
+ sessionId: string;
26
+ token: string;
27
+ shell: boolean;
28
+ command: string[];
29
+ }): Promise<void>;
30
+ export declare function readLocalConfig(cwd?: string): Promise<LocalConfig>;
31
+ export declare function manifestEntriesToLocalEntries(entries: RemoteDevManifestEntry[]): Map<string, LocalEntry>;
32
+ export declare function buildSyncEvents(previous: Map<string, LocalEntry>, next: Map<string, LocalEntry>): RemoteDevSyncEvent[];
33
+ export declare function findRemoteDevConflicts(previous: Map<string, LocalEntry> | null, remote: Map<string, LocalEntry>, local: Map<string, LocalEntry>): string[];
34
+ export declare function scanLocalTree(root: string, options?: {
35
+ onSkippedLargeFile?: (relativePath: string, size: number) => void;
36
+ }): Promise<Map<string, LocalEntry>>;
37
+ export declare class HttpError extends Error {
38
+ readonly status: number;
39
+ constructor(message: string, status: number);
40
+ }
41
+ export declare function isTerminalRemoteDevError(error: unknown): boolean;
42
+ export declare function chunkEvents(events: RemoteDevSyncEvent[], size: number): RemoteDevSyncEvent[][];
43
+ export declare function hydrateUpsertContents(root: string, events: RemoteDevSyncEvent[]): Promise<({
44
+ type: "delete";
45
+ path: string;
46
+ } | {
47
+ type: "mkdir";
48
+ path: string;
49
+ } | {
50
+ contentBase64: string;
51
+ type: "upsert";
52
+ path: string;
53
+ hash: string;
54
+ executable?: boolean;
55
+ })[]>;
56
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAIA,OAAO,EAML,KAAK,sBAAsB,EAE3B,KAAK,kBAAkB,EACxB,MAAM,eAAe,CAAC;AAIvB,eAAO,MAAM,UAAU,UAAU,CAAC;AAGlC,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAgBtE,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,iBA8FA;AAqBD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,iBAgCA;AAED,wBAAsB,eAAe,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAmB/E;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,sBAAsB,EAAE,2BAmB9E;AAwED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EACjC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,wBAyC9B;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,IAAI,EACxC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC/B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,YAmB/B;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,oCAKpF;AA+RD,qBAAa,SAAU,SAAQ,KAAK;IAGhC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADvB,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM;CAK1B;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,WAEtD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,MAAM,0BAMrE;AAWD,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,kBAAkB,EAAE;;;;;;;;;;;;MAa7B"}
package/dist/sync.js ADDED
@@ -0,0 +1,520 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lstat, mkdir, readdir, readFile, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { assertRemoteDevPath, remoteDevMaxEventsPerBatch, remoteDevMaxFileBytes, remoteDevProtocolVersion, shouldIgnoreRemoteDevPath, } from "./protocol.js";
5
+ import { extractStoredZip } from "./zip.js";
6
+ export const cliVersion = "0.1.0";
7
+ const heartbeatIntervalMs = 15_000;
8
+ export async function connectAndWatch(input) {
9
+ const root = path.resolve(input.directory);
10
+ await mkdir(root, { recursive: true });
11
+ await writeLocalConfig(root, input);
12
+ const connected = await postJson({
13
+ ...input,
14
+ path: `/api/remote-dev/sessions/${input.sessionId}/connect`,
15
+ body: {
16
+ protocolVersion: remoteDevProtocolVersion,
17
+ clientVersion: cliVersion,
18
+ localPath: root,
19
+ },
20
+ });
21
+ const skippedLargeFiles = new Set();
22
+ const onSkippedLargeFile = (relativePath, size) => {
23
+ const key = `${relativePath}:${size}`;
24
+ if (skippedLargeFiles.has(key)) {
25
+ return;
26
+ }
27
+ skippedLargeFiles.add(key);
28
+ process.stderr.write(`Skipping ${relativePath}: file is larger than ${remoteDevMaxFileBytes} bytes\n`);
29
+ };
30
+ if (await isDirectoryEmptyExceptVibable(root)) {
31
+ const archive = await getBinary({
32
+ ...input,
33
+ path: `/api/remote-dev/sessions/${input.sessionId}/source.zip`,
34
+ });
35
+ await extractStoredZip({ archive, destination: root });
36
+ }
37
+ const manifest = await getJson({
38
+ ...input,
39
+ path: `/api/remote-dev/sessions/${input.sessionId}/manifest`,
40
+ });
41
+ const remoteBaseline = manifestEntriesToLocalEntries(manifest.entries);
42
+ const localState = await readLocalState(root);
43
+ const localEntries = await scanLocalTree(root, { onSkippedLargeFile });
44
+ const conflicts = findRemoteDevConflicts(localState ? localStateEntriesToMap(localState.baseline) : null, remoteBaseline, localEntries);
45
+ if (conflicts.length > 0) {
46
+ throw new Error([
47
+ "Remote files changed since this local directory was last synced.",
48
+ "Reconcile the local directory or start from a fresh connect directory.",
49
+ `Conflicts: ${conflicts.slice(0, 10).join(", ")}`,
50
+ ].join(" "));
51
+ }
52
+ await writeLocalState(root, { baseline: localEntriesToStateEntries(remoteBaseline) });
53
+ let previous = remoteBaseline;
54
+ let sequence = connected.session.lastSequence + 1;
55
+ let lastHeartbeatAt = 0;
56
+ process.stdout.write(`Connected remote dev session ${input.sessionId}\n`);
57
+ await new Promise((_resolve, reject) => {
58
+ let running = false;
59
+ const interval = setInterval(() => {
60
+ if (running) {
61
+ return;
62
+ }
63
+ running = true;
64
+ void runConnectLoopTick({
65
+ ...input,
66
+ root,
67
+ sequence,
68
+ previous,
69
+ lastHeartbeatAt,
70
+ onSkippedLargeFile,
71
+ })
72
+ .then((result) => {
73
+ previous = result.nextEntries;
74
+ sequence = result.nextSequence;
75
+ lastHeartbeatAt = result.nextHeartbeatAt;
76
+ })
77
+ .catch((error) => {
78
+ if (isTerminalRemoteDevError(error)) {
79
+ clearInterval(interval);
80
+ reject(error);
81
+ return;
82
+ }
83
+ process.stderr.write(`${formatError(error)}\n`);
84
+ })
85
+ .finally(() => {
86
+ running = false;
87
+ });
88
+ }, 500);
89
+ });
90
+ }
91
+ async function runConnectLoopTick(input) {
92
+ const now = Date.now();
93
+ const nextHeartbeatAt = now - input.lastHeartbeatAt >= heartbeatIntervalMs
94
+ ? await sendHeartbeat(input).then(() => now)
95
+ : input.lastHeartbeatAt;
96
+ const result = await syncOnce(input);
97
+ return { ...result, nextHeartbeatAt };
98
+ }
99
+ export async function runRemoteCommand(input) {
100
+ const command = input.command[0];
101
+ if (!command) {
102
+ throw new Error("Remote command is required");
103
+ }
104
+ const response = await fetch(`${trimTrailingSlash(input.apiBaseUrl)}/api/remote-dev/sessions/${input.sessionId}/exec`, {
105
+ method: "POST",
106
+ headers: {
107
+ authorization: `Bearer ${input.token}`,
108
+ "content-type": "application/json",
109
+ },
110
+ body: JSON.stringify(input.shell
111
+ ? { mode: "shell", command: input.command.join(" ") }
112
+ : {
113
+ mode: "argv",
114
+ command,
115
+ args: input.command.slice(1),
116
+ }),
117
+ });
118
+ if (!response.ok) {
119
+ throw new Error(await readErrorMessage(response));
120
+ }
121
+ const exitCode = await consumeRemoteExecStream(response);
122
+ process.exitCode = exitCode;
123
+ }
124
+ export async function readLocalConfig(cwd = process.cwd()) {
125
+ const parsed = JSON.parse(await readNearestLocalConfig(path.resolve(cwd)));
126
+ if (!parsed ||
127
+ typeof parsed !== "object" ||
128
+ !("apiBaseUrl" in parsed) ||
129
+ !("sessionId" in parsed) ||
130
+ !("token" in parsed) ||
131
+ typeof parsed.apiBaseUrl !== "string" ||
132
+ typeof parsed.sessionId !== "string" ||
133
+ typeof parsed.token !== "string") {
134
+ throw new Error("Invalid .vibable/config.json");
135
+ }
136
+ return {
137
+ apiBaseUrl: parsed.apiBaseUrl,
138
+ sessionId: parsed.sessionId,
139
+ token: parsed.token,
140
+ };
141
+ }
142
+ export function manifestEntriesToLocalEntries(entries) {
143
+ const localEntries = new Map();
144
+ for (const entry of entries) {
145
+ const relativePath = assertRemoteDevPath(entry.path);
146
+ if (entry.type === "directory") {
147
+ localEntries.set(relativePath, { type: "directory", path: relativePath });
148
+ continue;
149
+ }
150
+ if (entry.hash) {
151
+ localEntries.set(relativePath, {
152
+ type: "file",
153
+ path: relativePath,
154
+ hash: entry.hash,
155
+ executable: false,
156
+ });
157
+ }
158
+ }
159
+ return localEntries;
160
+ }
161
+ async function readNearestLocalConfig(startDirectory) {
162
+ let currentDirectory = startDirectory;
163
+ while (true) {
164
+ const configPath = path.join(currentDirectory, ".vibable", "config.json");
165
+ try {
166
+ return await readFile(configPath, "utf8");
167
+ }
168
+ catch (error) {
169
+ if (!isMissingFileError(error)) {
170
+ throw error;
171
+ }
172
+ }
173
+ const parentDirectory = path.dirname(currentDirectory);
174
+ if (parentDirectory === currentDirectory) {
175
+ throw new Error("No .vibable/config.json found from current directory or parents");
176
+ }
177
+ currentDirectory = parentDirectory;
178
+ }
179
+ }
180
+ function isMissingFileError(error) {
181
+ return Boolean(error &&
182
+ typeof error === "object" &&
183
+ "code" in error &&
184
+ error.code === "ENOENT");
185
+ }
186
+ async function syncOnce(input) {
187
+ const nextEntries = await scanLocalTree(input.root, input.onSkippedLargeFile
188
+ ? { onSkippedLargeFile: input.onSkippedLargeFile }
189
+ : {});
190
+ const events = buildSyncEvents(input.previous, nextEntries);
191
+ if (events.length === 0) {
192
+ return { nextEntries, nextSequence: input.sequence };
193
+ }
194
+ let nextSequence = input.sequence;
195
+ for (const chunk of chunkEvents(events, remoteDevMaxEventsPerBatch)) {
196
+ const hydratedEvents = await hydrateUpsertContents(input.root, chunk);
197
+ await postJson({
198
+ apiBaseUrl: input.apiBaseUrl,
199
+ sessionId: input.sessionId,
200
+ token: input.token,
201
+ path: `/api/remote-dev/sessions/${input.sessionId}/sync/batch`,
202
+ body: {
203
+ sequence: nextSequence,
204
+ events: hydratedEvents,
205
+ },
206
+ });
207
+ nextSequence += 1;
208
+ }
209
+ await writeLocalState(input.root, { baseline: localEntriesToStateEntries(nextEntries) });
210
+ process.stdout.write(`synced ${events.length} change(s)\n`);
211
+ return { nextEntries, nextSequence };
212
+ }
213
+ export function buildSyncEvents(previous, next) {
214
+ const events = [];
215
+ for (const entry of next.values()) {
216
+ const existing = previous.get(entry.path);
217
+ if (entry.type === "directory") {
218
+ if (existing?.type === "file") {
219
+ events.push({ type: "delete", path: entry.path });
220
+ }
221
+ if (!existing || existing.type !== "directory") {
222
+ events.push({ type: "mkdir", path: entry.path });
223
+ }
224
+ continue;
225
+ }
226
+ if (existing?.type !== "file" ||
227
+ existing.hash !== entry.hash ||
228
+ existing.executable !== entry.executable) {
229
+ if (existing?.type === "directory") {
230
+ events.push({ type: "delete", path: entry.path });
231
+ }
232
+ events.push({
233
+ type: "upsert",
234
+ path: entry.path,
235
+ contentBase64: "",
236
+ hash: entry.hash,
237
+ executable: entry.executable,
238
+ });
239
+ }
240
+ }
241
+ for (const entry of previous.values()) {
242
+ if (!next.has(entry.path) && !hasDeletedAncestor(events, entry.path)) {
243
+ events.push({ type: "delete", path: entry.path });
244
+ }
245
+ }
246
+ return events;
247
+ }
248
+ export function findRemoteDevConflicts(previous, remote, local) {
249
+ if (!previous) {
250
+ return [];
251
+ }
252
+ const paths = new Set([
253
+ ...previous.keys(),
254
+ ...remote.keys(),
255
+ ...local.keys(),
256
+ ]);
257
+ return Array.from(paths)
258
+ .filter((entryPath) => {
259
+ const previousSignature = entrySignature(previous.get(entryPath));
260
+ const remoteSignature = entrySignature(remote.get(entryPath));
261
+ const localSignature = entrySignature(local.get(entryPath));
262
+ return remoteSignature !== previousSignature && localSignature !== remoteSignature;
263
+ })
264
+ .sort((left, right) => left.localeCompare(right));
265
+ }
266
+ export async function scanLocalTree(root, options = {}) {
267
+ const entries = new Map();
268
+ await collectLocalEntries({ root, relativeDirectory: "", entries, options });
269
+ return entries;
270
+ }
271
+ async function collectLocalEntries(input) {
272
+ const directoryPath = path.join(input.root, input.relativeDirectory);
273
+ const directoryEntries = await readdir(directoryPath, { withFileTypes: true });
274
+ for (const entry of directoryEntries) {
275
+ const relativePath = input.relativeDirectory
276
+ ? `${input.relativeDirectory}/${entry.name}`
277
+ : entry.name;
278
+ if (shouldIgnoreRemoteDevPath(relativePath) || entry.isSymbolicLink()) {
279
+ continue;
280
+ }
281
+ assertRemoteDevPath(relativePath);
282
+ const absolutePath = path.join(input.root, relativePath);
283
+ if (entry.isDirectory()) {
284
+ input.entries.set(relativePath, { type: "directory", path: relativePath });
285
+ await collectLocalEntries({
286
+ root: input.root,
287
+ relativeDirectory: relativePath,
288
+ entries: input.entries,
289
+ options: input.options,
290
+ });
291
+ continue;
292
+ }
293
+ if (!entry.isFile()) {
294
+ continue;
295
+ }
296
+ const fileStat = await lstat(absolutePath);
297
+ if (fileStat.size > remoteDevMaxFileBytes) {
298
+ input.options.onSkippedLargeFile?.(relativePath, fileStat.size);
299
+ continue;
300
+ }
301
+ const content = await readFile(absolutePath);
302
+ input.entries.set(relativePath, {
303
+ type: "file",
304
+ path: relativePath,
305
+ hash: sha256(content),
306
+ executable: (fileStat.mode & 0o111) !== 0,
307
+ });
308
+ }
309
+ }
310
+ async function postJson(input) {
311
+ const response = await fetch(`${trimTrailingSlash(input.apiBaseUrl)}${input.path}`, {
312
+ method: "POST",
313
+ headers: {
314
+ authorization: `Bearer ${input.token}`,
315
+ "content-type": "application/json",
316
+ },
317
+ body: JSON.stringify(input.body),
318
+ });
319
+ if (!response.ok) {
320
+ throw new HttpError(await readErrorMessage(response), response.status);
321
+ }
322
+ return (await response.json());
323
+ }
324
+ async function getJson(input) {
325
+ const response = await fetch(`${trimTrailingSlash(input.apiBaseUrl)}${input.path}`, {
326
+ headers: {
327
+ authorization: `Bearer ${input.token}`,
328
+ },
329
+ });
330
+ if (!response.ok) {
331
+ throw new HttpError(await readErrorMessage(response), response.status);
332
+ }
333
+ return (await response.json());
334
+ }
335
+ async function sendHeartbeat(input) {
336
+ await postJson({
337
+ apiBaseUrl: input.apiBaseUrl,
338
+ sessionId: input.sessionId,
339
+ token: input.token,
340
+ path: `/api/remote-dev/sessions/${input.sessionId}/heartbeat`,
341
+ body: {},
342
+ });
343
+ }
344
+ async function getBinary(input) {
345
+ const response = await fetch(`${trimTrailingSlash(input.apiBaseUrl)}${input.path}`, {
346
+ headers: {
347
+ authorization: `Bearer ${input.token}`,
348
+ },
349
+ });
350
+ if (!response.ok) {
351
+ throw new Error(await readErrorMessage(response));
352
+ }
353
+ return Buffer.from(await response.arrayBuffer());
354
+ }
355
+ async function writeLocalConfig(root, config) {
356
+ const configDirectory = path.join(root, ".vibable");
357
+ await mkdir(configDirectory, { recursive: true });
358
+ await writeFile(path.join(configDirectory, "config.json"), JSON.stringify(config, null, 2), { mode: 0o600 });
359
+ await writeFile(path.join(configDirectory, "AGENTS.md"), [
360
+ "# Vibable Remote Dev",
361
+ "",
362
+ "Use `vibable exec -- <command>` when a command must run in the remote feature container.",
363
+ "Do not sync or edit `.vibable/config.json` manually.",
364
+ "",
365
+ ].join("\n"));
366
+ }
367
+ async function readLocalState(root) {
368
+ try {
369
+ const parsed = JSON.parse(await readFile(path.join(root, ".vibable", "state.json"), "utf8"));
370
+ if (!isLocalState(parsed)) {
371
+ return null;
372
+ }
373
+ return parsed;
374
+ }
375
+ catch (error) {
376
+ if (isMissingFileError(error)) {
377
+ return null;
378
+ }
379
+ throw error;
380
+ }
381
+ }
382
+ async function writeLocalState(root, state) {
383
+ const configDirectory = path.join(root, ".vibable");
384
+ await mkdir(configDirectory, { recursive: true });
385
+ await writeFile(path.join(configDirectory, "state.json"), JSON.stringify(state, null, 2), { mode: 0o600 });
386
+ }
387
+ function isLocalState(value) {
388
+ return Boolean(value &&
389
+ typeof value === "object" &&
390
+ "baseline" in value &&
391
+ Array.isArray(value.baseline) &&
392
+ value.baseline.every(isLocalStateEntry));
393
+ }
394
+ function isLocalStateEntry(value) {
395
+ if (!value || typeof value !== "object" || !("type" in value) || !("path" in value)) {
396
+ return false;
397
+ }
398
+ if (value.type === "directory") {
399
+ return typeof value.path === "string";
400
+ }
401
+ return (value.type === "file" &&
402
+ typeof value.path === "string" &&
403
+ "hash" in value &&
404
+ typeof value.hash === "string" &&
405
+ "executable" in value &&
406
+ typeof value.executable === "boolean");
407
+ }
408
+ function localEntriesToStateEntries(entries) {
409
+ return Array.from(entries.values()).sort((left, right) => left.path.localeCompare(right.path));
410
+ }
411
+ function localStateEntriesToMap(entries) {
412
+ return new Map(entries.map((entry) => [entry.path, entry]));
413
+ }
414
+ function entrySignature(entry) {
415
+ if (!entry) {
416
+ return "missing";
417
+ }
418
+ if (entry.type === "directory") {
419
+ return "directory";
420
+ }
421
+ return `file:${entry.hash}`;
422
+ }
423
+ async function isDirectoryEmptyExceptVibable(directory) {
424
+ const entries = await readdir(directory).catch(() => []);
425
+ return entries.filter((entry) => entry !== ".vibable").length === 0;
426
+ }
427
+ async function consumeRemoteExecStream(response) {
428
+ const reader = response.body?.getReader();
429
+ if (!reader) {
430
+ return 1;
431
+ }
432
+ let buffer = "";
433
+ let exitCode = 1;
434
+ const decoder = new TextDecoder();
435
+ while (true) {
436
+ const result = await reader.read();
437
+ if (result.done) {
438
+ break;
439
+ }
440
+ buffer += decoder.decode(result.value, { stream: true });
441
+ const lines = buffer.split("\n");
442
+ buffer = lines.pop() ?? "";
443
+ for (const line of lines) {
444
+ if (!line.trim()) {
445
+ continue;
446
+ }
447
+ const event = JSON.parse(line);
448
+ if (event.type === "stdout") {
449
+ process.stdout.write(Buffer.from(event.dataBase64, "base64"));
450
+ }
451
+ else if (event.type === "stderr") {
452
+ process.stderr.write(Buffer.from(event.dataBase64, "base64"));
453
+ }
454
+ else {
455
+ exitCode = event.code ?? 1;
456
+ }
457
+ }
458
+ }
459
+ return exitCode;
460
+ }
461
+ async function readErrorMessage(response) {
462
+ const text = await response.text();
463
+ try {
464
+ const parsed = JSON.parse(text);
465
+ if (parsed &&
466
+ typeof parsed === "object" &&
467
+ "message" in parsed &&
468
+ typeof parsed.message === "string") {
469
+ return parsed.message;
470
+ }
471
+ }
472
+ catch {
473
+ return text || `${response.status} ${response.statusText}`;
474
+ }
475
+ return text || `${response.status} ${response.statusText}`;
476
+ }
477
+ function sha256(content) {
478
+ return `sha256:${createHash("sha256").update(content).digest("hex")}`;
479
+ }
480
+ function trimTrailingSlash(value) {
481
+ return value.replace(/\/+$/u, "");
482
+ }
483
+ function formatError(error) {
484
+ return error instanceof Error ? error.message : String(error);
485
+ }
486
+ export class HttpError extends Error {
487
+ status;
488
+ constructor(message, status) {
489
+ super(message);
490
+ this.status = status;
491
+ this.name = "HttpError";
492
+ }
493
+ }
494
+ export function isTerminalRemoteDevError(error) {
495
+ return error instanceof HttpError && (error.status === 401 || error.status === 409);
496
+ }
497
+ export function chunkEvents(events, size) {
498
+ const chunks = [];
499
+ for (let index = 0; index < events.length; index += size) {
500
+ chunks.push(events.slice(index, index + size));
501
+ }
502
+ return chunks;
503
+ }
504
+ function hasDeletedAncestor(events, path) {
505
+ return events.some((event) => event.type === "delete" &&
506
+ path !== event.path &&
507
+ path.startsWith(`${event.path}/`));
508
+ }
509
+ export async function hydrateUpsertContents(root, events) {
510
+ return Promise.all(events.map(async (event) => {
511
+ if (event.type !== "upsert") {
512
+ return event;
513
+ }
514
+ return {
515
+ ...event,
516
+ contentBase64: (await readFile(path.join(root, event.path))).toString("base64"),
517
+ };
518
+ }));
519
+ }
520
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
package/dist/zip.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare function extractStoredZip(input: {
2
+ archive: Buffer;
3
+ destination: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=zip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../src/zip.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB,iBAgCA"}
package/dist/zip.js ADDED
@@ -0,0 +1,44 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ export async function extractStoredZip(input) {
4
+ let offset = 0;
5
+ while (offset + 30 <= input.archive.length) {
6
+ const signature = input.archive.readUInt32LE(offset);
7
+ if (signature === 0x02014b50 || signature === 0x06054b50) {
8
+ break;
9
+ }
10
+ if (signature !== 0x04034b50) {
11
+ throw new Error("Unsupported zip archive");
12
+ }
13
+ const compressionMethod = input.archive.readUInt16LE(offset + 8);
14
+ if (compressionMethod !== 0) {
15
+ throw new Error("Only stored zip entries are supported");
16
+ }
17
+ const compressedSize = input.archive.readUInt32LE(offset + 18);
18
+ const nameLength = input.archive.readUInt16LE(offset + 26);
19
+ const extraLength = input.archive.readUInt16LE(offset + 28);
20
+ const nameStart = offset + 30;
21
+ const contentStart = nameStart + nameLength + extraLength;
22
+ const contentEnd = contentStart + compressedSize;
23
+ const entryName = input.archive.subarray(nameStart, nameStart + nameLength).toString("utf8");
24
+ if (entryName && !entryName.endsWith("/")) {
25
+ const targetPath = resolveArchivePath(input.destination, entryName);
26
+ await mkdir(path.dirname(targetPath), { recursive: true });
27
+ await writeFile(targetPath, input.archive.subarray(contentStart, contentEnd));
28
+ }
29
+ offset = contentEnd;
30
+ }
31
+ }
32
+ function resolveArchivePath(root, entryName) {
33
+ const normalized = entryName.replace(/\\/g, "/");
34
+ if (normalized.startsWith("/") || normalized.split("/").includes("..")) {
35
+ throw new Error(`Unsafe zip entry path: ${entryName}`);
36
+ }
37
+ const resolved = path.resolve(root, normalized);
38
+ const rootPath = path.resolve(root);
39
+ if (resolved !== rootPath && !resolved.startsWith(`${rootPath}${path.sep}`)) {
40
+ throw new Error(`Unsafe zip entry path: ${entryName}`);
41
+ }
42
+ return resolved;
43
+ }
44
+ //# sourceMappingURL=zip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../src/zip.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@sand.ai/vibable-cli",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "bin": {
7
+ "vibable": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "restricted"
14
+ },
15
+ "dependencies": {},
16
+ "devDependencies": {
17
+ "tsx": "^4.20.0"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json",
21
+ "test": "tsx --test src/**/*.test.ts",
22
+ "typecheck": "tsc -p tsconfig.json --noEmit",
23
+ "lint": "tsc -p tsconfig.json --noEmit"
24
+ }
25
+ }