use-vibes 0.19.29-dev-cli → 0.19.32-dev-cli

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/LICENSE.md +232 -0
  2. package/README.md +49 -0
  3. package/RELEASE-NOTES.md +21 -0
  4. package/bin.d.ts +2 -0
  5. package/bin.js +12 -0
  6. package/bin.js.map +1 -0
  7. package/{esm/cli → cli}/exec/info.d.ts +0 -1
  8. package/cli/exec/info.js +16 -0
  9. package/cli/exec/info.js.map +1 -0
  10. package/cli/exec/result-to-exit-code.d.ts +3 -0
  11. package/cli/exec/result-to-exit-code.js +8 -0
  12. package/cli/exec/result-to-exit-code.js.map +1 -0
  13. package/{esm/cli → cli}/exec/skills.d.ts +0 -1
  14. package/cli/exec/skills.js +11 -0
  15. package/cli/exec/skills.js.map +1 -0
  16. package/{esm/cli → cli}/exec/system.d.ts +0 -1
  17. package/cli/exec/system.js +20 -0
  18. package/cli/exec/system.js.map +1 -0
  19. package/{esm/cli → cli}/exec/whoami.d.ts +0 -1
  20. package/cli/exec/whoami.js +11 -0
  21. package/cli/exec/whoami.js.map +1 -0
  22. package/{esm/cli → cli}/executable.d.ts +2 -4
  23. package/cli/executable.js +2 -0
  24. package/cli/executable.js.map +1 -0
  25. package/{esm/commands/cli-output.d.ts → commands/cli-output-node.d.ts} +0 -1
  26. package/{esm/commands/cli-output.js → commands/cli-output-node.js} +1 -0
  27. package/commands/cli-output-node.js.map +1 -0
  28. package/commands/config.d.ts +15 -0
  29. package/commands/config.js +26 -0
  30. package/commands/config.js.map +1 -0
  31. package/commands/info.d.ts +6 -0
  32. package/{esm/commands → commands}/info.js +8 -8
  33. package/commands/info.js.map +1 -0
  34. package/{esm/commands → commands}/resolve-target.d.ts +0 -1
  35. package/{esm/commands → commands}/resolve-target.js +3 -2
  36. package/commands/resolve-target.js.map +1 -0
  37. package/commands/skills.d.ts +3 -0
  38. package/{esm/commands → commands}/skills.js +3 -2
  39. package/commands/skills.js.map +1 -0
  40. package/commands/system.d.ts +6 -0
  41. package/{esm/commands → commands}/system.js +5 -4
  42. package/commands/system.js.map +1 -0
  43. package/commands/whoami.d.ts +3 -0
  44. package/commands/whoami.js +5 -0
  45. package/commands/whoami.js.map +1 -0
  46. package/{esm/dispatcher.d.ts → dispatcher.d.ts} +0 -2
  47. package/{esm/dispatcher.js → dispatcher.js} +7 -20
  48. package/dispatcher.js.map +1 -0
  49. package/{esm/index.d.ts → index.d.ts} +0 -1
  50. package/index.js +2 -0
  51. package/index.js.map +1 -0
  52. package/package.json +20 -17
  53. package/tsconfig.json +22 -0
  54. package/esm/bin.d.ts +0 -3
  55. package/esm/bin.d.ts.map +0 -1
  56. package/esm/bin.js +0 -13
  57. package/esm/cli/exec/handle-register.d.ts +0 -3
  58. package/esm/cli/exec/handle-register.d.ts.map +0 -1
  59. package/esm/cli/exec/handle-register.js +0 -18
  60. package/esm/cli/exec/info.d.ts.map +0 -1
  61. package/esm/cli/exec/info.js +0 -18
  62. package/esm/cli/exec/login.d.ts +0 -3
  63. package/esm/cli/exec/login.d.ts.map +0 -1
  64. package/esm/cli/exec/login.js +0 -32
  65. package/esm/cli/exec/skills.d.ts.map +0 -1
  66. package/esm/cli/exec/skills.js +0 -13
  67. package/esm/cli/exec/system.d.ts.map +0 -1
  68. package/esm/cli/exec/system.js +0 -23
  69. package/esm/cli/exec/whoami.d.ts.map +0 -1
  70. package/esm/cli/exec/whoami.js +0 -13
  71. package/esm/cli/executable.d.ts.map +0 -1
  72. package/esm/cli/executable.js +0 -1
  73. package/esm/commands/cli-output.d.ts.map +0 -1
  74. package/esm/commands/config.d.ts +0 -13
  75. package/esm/commands/config.d.ts.map +0 -1
  76. package/esm/commands/config.js +0 -36
  77. package/esm/commands/handle-register.d.ts +0 -19
  78. package/esm/commands/handle-register.d.ts.map +0 -1
  79. package/esm/commands/handle-register.js +0 -65
  80. package/esm/commands/info.d.ts +0 -8
  81. package/esm/commands/info.d.ts.map +0 -1
  82. package/esm/commands/login-platform-node.d.ts +0 -3
  83. package/esm/commands/login-platform-node.d.ts.map +0 -1
  84. package/esm/commands/login-platform-node.js +0 -56
  85. package/esm/commands/login.d.ts +0 -22
  86. package/esm/commands/login.d.ts.map +0 -1
  87. package/esm/commands/login.js +0 -127
  88. package/esm/commands/resolve-target.d.ts.map +0 -1
  89. package/esm/commands/skills.d.ts +0 -4
  90. package/esm/commands/skills.d.ts.map +0 -1
  91. package/esm/commands/system.d.ts +0 -7
  92. package/esm/commands/system.d.ts.map +0 -1
  93. package/esm/commands/vibes-api.d.ts +0 -15
  94. package/esm/commands/vibes-api.d.ts.map +0 -1
  95. package/esm/commands/vibes-api.js +0 -51
  96. package/esm/commands/whoami.d.ts +0 -21
  97. package/esm/commands/whoami.d.ts.map +0 -1
  98. package/esm/commands/whoami.js +0 -102
  99. package/esm/dispatcher.d.ts.map +0 -1
  100. package/esm/index.d.ts.map +0 -1
  101. package/esm/index.js +0 -14
  102. package/esm/package.json +0 -3
@@ -1,56 +0,0 @@
1
- import { createServer } from "node:http";
2
- import { execFile } from "node:child_process";
3
- import { env, platform } from "node:process";
4
- function closeServer(server) {
5
- return new Promise((resolve, reject) => {
6
- server.close((err) => (err ? reject(err) : resolve()));
7
- });
8
- }
9
- export const nodeLoginPlatform = {
10
- serve(opts, handler) {
11
- let finishedResolve;
12
- const finished = new Promise((r) => {
13
- finishedResolve = r;
14
- });
15
- const server = createServer(async (req, res) => {
16
- const url = new URL(req.url ?? "/", `http://${opts.hostname}:${opts.port}`);
17
- const request = new Request(url.toString(), { method: req.method });
18
- try {
19
- const response = await handler(request);
20
- res.writeHead(response.status, Object.fromEntries(response.headers.entries()));
21
- const body = await response.text();
22
- res.end(body);
23
- }
24
- catch (err) {
25
- res.writeHead(500);
26
- res.end(err instanceof Error ? err.message : "Internal error");
27
- }
28
- });
29
- server.on("error", () => {
30
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- assigned synchronously in Promise constructor
31
- finishedResolve();
32
- });
33
- opts.signal.addEventListener("abort", () => {
34
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- assigned synchronously in Promise constructor
35
- server.close(() => finishedResolve());
36
- });
37
- server.listen(opts.port, opts.hostname);
38
- return {
39
- close() {
40
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- assigned synchronously in Promise constructor
41
- closeServer(server).then(finishedResolve, finishedResolve);
42
- },
43
- finished,
44
- };
45
- },
46
- async openBrowser(url) {
47
- const cmd = platform === "win32" ? "cmd" : platform === "darwin" ? "open" : "xdg-open";
48
- const args = platform === "win32" ? ["/c", "start", "", url] : [url];
49
- await new Promise((resolve, reject) => {
50
- execFile(cmd, args, (err) => (err ? reject(err) : resolve()));
51
- });
52
- },
53
- getEnv(key) {
54
- return env[key];
55
- },
56
- };
@@ -1,22 +0,0 @@
1
- import { Result } from "@adviser/cement";
2
- import type { CliOutput } from "./cli-output.js";
3
- export interface LoginServer {
4
- close(): void;
5
- readonly finished: Promise<void>;
6
- }
7
- export interface LoginPlatform {
8
- readonly serve: (opts: {
9
- port: number;
10
- hostname: string;
11
- signal: AbortSignal;
12
- }, handler: (req: Request) => Response | Promise<Response>) => LoginServer;
13
- readonly openBrowser: (url: string) => Promise<void>;
14
- readonly getEnv: (key: string) => string | undefined;
15
- }
16
- export interface LoginOptions {
17
- readonly caUrl?: string;
18
- readonly timeout?: number;
19
- readonly forceRenew?: boolean;
20
- }
21
- export declare function runLogin(options: LoginOptions, output: CliOutput, platform: LoginPlatform): Promise<Result<void>>;
22
- //# sourceMappingURL=login.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAMzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMjD,MAAM,WAAW,WAAW;IAC1B,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,CACd,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,EAC7D,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,KACpD,WAAW,CAAC;IACjB,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAoIvH"}
@@ -1,127 +0,0 @@
1
- import { Result } from "@adviser/cement";
2
- import { DeviceIdKey, DeviceIdCSR } from "@fireproof/core-device-id";
3
- import { getKeyBag } from "@fireproof/core-keybag";
4
- import { CertificatePayloadSchema } from "@fireproof/core-types-base";
5
- import { ensureSuperThis } from "@fireproof/core-runtime";
6
- import { decodeJwt } from "jose";
7
- const DEFAULT_CA_URL = "https://vibes.diy/csr2cert";
8
- const CA_URL_ENV = "VIBES_DIY_CA_URL";
9
- const DEFAULT_TIMEOUT_S = 120;
10
- export async function runLogin(options, output, platform) {
11
- const sthis = ensureSuperThis();
12
- const keyBag = await getKeyBag(sthis);
13
- const existing = await keyBag.getDeviceId();
14
- // Check if already registered
15
- if (existing.cert.IsSome() && !options.forceRenew) {
16
- const jwk = existing.deviceId.unwrap();
17
- const deviceIdKey = (await DeviceIdKey.createFromJWK(jwk)).unwrap();
18
- const fingerprint = await deviceIdKey.fingerPrint();
19
- output.stdout(`Already registered. Device fingerprint: ${fingerprint}\n`);
20
- output.stdout("Use --force-renew to renew the certificate.\n");
21
- return Result.Ok(undefined);
22
- }
23
- // Step 1: Create or load device key
24
- let deviceIdKey;
25
- if (existing.deviceId.IsNone()) {
26
- output.stdout("Creating device key pair...\n");
27
- deviceIdKey = await DeviceIdKey.create();
28
- const jwkPrivate = await deviceIdKey.exportPrivateJWK();
29
- await keyBag.setDeviceId(jwkPrivate);
30
- }
31
- else {
32
- const createResult = await DeviceIdKey.createFromJWK(existing.deviceId.unwrap());
33
- if (createResult.isErr()) {
34
- return Result.Err(`Failed to load device key: ${createResult.Err()}`);
35
- }
36
- deviceIdKey = createResult.Ok();
37
- }
38
- const fingerprint = await deviceIdKey.fingerPrint();
39
- output.stdout(`Device fingerprint: ${fingerprint}\n`);
40
- // Step 2: Generate CSR
41
- output.stdout("Generating certificate signing request...\n");
42
- const deviceIdCSR = new DeviceIdCSR(sthis, deviceIdKey);
43
- const csrResult = await deviceIdCSR.createCSR({
44
- commonName: `use-vibes-cli@${fingerprint}`,
45
- organization: "vibes.diy",
46
- locality: "SF",
47
- stateOrProvinceName: "CA",
48
- countryName: "US",
49
- });
50
- if (csrResult.isErr()) {
51
- return Result.Err(`CSR generation failed: ${csrResult.Err()}`);
52
- }
53
- const csrJWS = csrResult.Ok();
54
- // Step 3: Start localhost callback server
55
- const state = crypto.randomUUID();
56
- const port = Math.floor(Math.random() * (65535 - 49152) + 49152);
57
- const callbackUrl = `http://127.0.0.1:${port}/cert`;
58
- const timeoutMs = (options.timeout ?? DEFAULT_TIMEOUT_S) * 1000;
59
- let certResolve;
60
- const certPromise = new Promise((resolve, _reject) => {
61
- certResolve = resolve;
62
- });
63
- const abortController = new AbortController();
64
- const server = platform.serve({ port, hostname: "127.0.0.1", signal: abortController.signal }, (req) => {
65
- const url = new URL(req.url);
66
- if (url.pathname !== "/cert") {
67
- return new Response("Not Found", { status: 404 });
68
- }
69
- const cert = url.searchParams.get("cert");
70
- const returnedState = url.searchParams.get("state");
71
- if (!cert) {
72
- return new Response("Missing cert parameter", { status: 400 });
73
- }
74
- if (returnedState !== state) {
75
- return new Response("State mismatch", { status: 403 });
76
- }
77
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- assigned synchronously in Promise constructor
78
- certResolve(cert);
79
- return new Response("Certificate received. You can close this window.", {
80
- headers: { "Content-Type": "text/plain" },
81
- });
82
- });
83
- // Step 4: Open browser
84
- const caUrl = options.caUrl ?? platform.getEnv(CA_URL_ENV) ?? DEFAULT_CA_URL;
85
- const browserUrl = `${caUrl}?csr=${encodeURIComponent(csrJWS)}&returnUrl=${encodeURIComponent(callbackUrl)}&state=${encodeURIComponent(state)}`;
86
- output.stdout(`\nOpen this URL in your browser to authorize:\n${browserUrl}\n\n`);
87
- // Try to open browser automatically
88
- try {
89
- await platform.openBrowser(browserUrl);
90
- output.stdout("Browser opened. Waiting for authorization...\n");
91
- }
92
- catch {
93
- output.stdout("Waiting for authorization...\n");
94
- }
95
- // Step 5: Wait for certificate with timeout
96
- let receivedCert;
97
- try {
98
- receivedCert = await Promise.race([
99
- certPromise,
100
- new Promise((_, reject) => setTimeout(() => reject(new Error(`Timeout after ${options.timeout ?? DEFAULT_TIMEOUT_S}s`)), timeoutMs)),
101
- ]);
102
- }
103
- catch (err) {
104
- abortController.abort();
105
- await server.finished;
106
- return Result.Err(err instanceof Error ? err.message : "Login failed");
107
- }
108
- // Step 6: Shut down server immediately
109
- server.close();
110
- await server.finished;
111
- // Step 7: Validate and store certificate
112
- output.stdout("Certificate received. Storing...\n");
113
- try {
114
- const decoded = decodeJwt(receivedCert);
115
- const certPayload = CertificatePayloadSchema.parse(decoded);
116
- const jwkPrivate = await deviceIdKey.exportPrivateJWK();
117
- await keyBag.setDeviceId(jwkPrivate, {
118
- certificateJWT: receivedCert,
119
- certificatePayload: certPayload,
120
- });
121
- }
122
- catch (err) {
123
- return Result.Err(`Failed to store certificate: ${err instanceof Error ? err.message : err}`);
124
- }
125
- output.stdout(`Login successful! Device fingerprint: ${fingerprint}\n`);
126
- return Result.Ok(undefined);
127
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve-target.d.ts","sourceRoot":"","sources":["../../src/commands/resolve-target.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,oBAAoB,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,CAgD/F"}
@@ -1,4 +0,0 @@
1
- import { Result } from "@adviser/cement";
2
- import { type CliOutput } from "./cli-output.js";
3
- export declare function runSkills(output?: CliOutput): Promise<Result<void>>;
4
- //# sourceMappingURL=skills.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoB,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,iBAAiB,CAAC;AAEnE,wBAAsB,SAAS,CAAC,MAAM,GAAE,SAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAS3F"}
@@ -1,7 +0,0 @@
1
- import { Result } from "@adviser/cement";
2
- import { type CliOutput } from "./cli-output.js";
3
- export interface RunSystemOptions {
4
- readonly skillsCsv?: string;
5
- }
6
- export declare function runSystem(options: RunSystemOptions, output?: CliOutput): Promise<Result<void>>;
7
- //# sourceMappingURL=system.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/commands/system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoB,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAuCD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,GAAE,SAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAwCtH"}
@@ -1,15 +0,0 @@
1
- import { Result } from "@adviser/cement";
2
- import { type VibesDiyApiParam } from "@vibes.diy/api-impl";
3
- import type { DashAuthType, VibesDiyApiIface } from "@vibes.diy/api-types";
4
- export interface CliVibesApiOptions {
5
- readonly apiUrl?: string;
6
- readonly getToken?: () => Promise<Result<DashAuthType>>;
7
- readonly timeoutMs?: number;
8
- readonly fetch?: VibesDiyApiParam["fetch"];
9
- readonly ws?: WebSocket;
10
- }
11
- export declare function getCliVibesApiUrl(env?: Readonly<Record<string, string | undefined>>): string;
12
- export declare function getCliDashAuth(): Promise<Result<DashAuthType>>;
13
- export declare function toCliVibesApiParam(options?: CliVibesApiOptions): VibesDiyApiParam;
14
- export declare function createCliVibesApi(options?: CliVibesApiOptions): VibesDiyApiIface;
15
- //# sourceMappingURL=vibes-api.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vibes-api.d.ts","sourceRoot":"","sources":["../../src/commands/vibes-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAS3E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAc,GAAG,MAAM,CAQxG;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAyBpE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,kBAAuB,GAAG,gBAAgB,CAQrF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,gBAAgB,CAEpF"}
@@ -1,51 +0,0 @@
1
- import { Result } from "@adviser/cement";
2
- import { VibeDiyApi } from "@vibes.diy/api-impl";
3
- import { DeviceIdKey, DeviceIdSignMsg } from "@fireproof/core-device-id";
4
- import { getKeyBag } from "@fireproof/core-keybag";
5
- import { ensureSuperThis } from "@fireproof/core-runtime";
6
- import { env as processEnv } from "node:process";
7
- const DEFAULT_CLI_VIBES_API_URL = "wss://api.vibes.diy/v1/ws";
8
- const VIBES_API_URL_ENV = "VIBES_DIY_API_URL";
9
- export function getCliVibesApiUrl(env = processEnv) {
10
- const envUrl = env[VIBES_API_URL_ENV];
11
- switch (true) {
12
- case typeof envUrl === "string" && envUrl.length > 0:
13
- return envUrl;
14
- default:
15
- return DEFAULT_CLI_VIBES_API_URL;
16
- }
17
- }
18
- export async function getCliDashAuth() {
19
- const sthis = ensureSuperThis();
20
- const keyBag = await getKeyBag(sthis);
21
- const existing = await keyBag.getDeviceId();
22
- if (existing.deviceId.IsNone() || existing.cert.IsNone()) {
23
- return Result.Err("Not logged in. Run: use-vibes login");
24
- }
25
- const jwk = existing.deviceId.unwrap();
26
- const createResult = await DeviceIdKey.createFromJWK(jwk);
27
- if (createResult.isErr()) {
28
- return Result.Err(`Failed to load device key: ${createResult.Err()}`);
29
- }
30
- const deviceIdKey = createResult.Ok();
31
- const cert = existing.cert.unwrap();
32
- if (!cert) {
33
- return Result.Err("Not logged in. Run: use-vibes login");
34
- }
35
- const fingerprint = await deviceIdKey.fingerPrint();
36
- const signer = new DeviceIdSignMsg(sthis.txt.base64, deviceIdKey, cert.certificatePayload);
37
- const token = await signer.sign({ deviceId: fingerprint, seq: 0 });
38
- return Result.Ok({ type: "device-id", token });
39
- }
40
- export function toCliVibesApiParam(options = {}) {
41
- return {
42
- apiUrl: options.apiUrl ?? getCliVibesApiUrl(),
43
- getToken: options.getToken ?? getCliDashAuth,
44
- timeoutMs: options.timeoutMs,
45
- fetch: options.fetch,
46
- ws: options.ws,
47
- };
48
- }
49
- export function createCliVibesApi(options = {}) {
50
- return new VibeDiyApi(toCliVibesApiParam(options));
51
- }
@@ -1,21 +0,0 @@
1
- import { Result } from "@adviser/cement";
2
- import type { CliOutput } from "./cli-output.js";
3
- import type { ReqListUserSlugAppSlug, ResListUserSlugAppSlug } from "@vibes.diy/api-types";
4
- export interface WhoamiListResultLike {
5
- isErr(): boolean;
6
- Err(): unknown;
7
- Ok(): ResListUserSlugAppSlug;
8
- }
9
- export interface WhoamiApi {
10
- listUserSlugAppSlug(req: Omit<ReqListUserSlugAppSlug, "type" | "auth">): Promise<WhoamiListResultLike>;
11
- }
12
- export interface WhoamiDeviceInfo {
13
- readonly fingerprint: string;
14
- readonly certExpiry: Date | undefined;
15
- }
16
- export interface WhoamiDeps {
17
- readonly api?: WhoamiApi;
18
- readonly deviceInfo?: WhoamiDeviceInfo;
19
- }
20
- export declare function runWhoami(output: CliOutput, deps?: WhoamiDeps): Promise<Result<void>>;
21
- //# sourceMappingURL=whoami.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAKzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAiB,MAAM,sBAAsB,CAAC;AAG1G,MAAM,WAAW,oBAAoB;IACnC,KAAK,IAAI,OAAO,CAAC;IACjB,GAAG,IAAI,OAAO,CAAC;IACf,EAAE,IAAI,sBAAsB,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACxG;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;CACxC;AAqCD,wBAAsB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CA4B/F"}
@@ -1,102 +0,0 @@
1
- import { Result } from "@adviser/cement";
2
- import { DeviceIdKey } from "@fireproof/core-device-id";
3
- import { getKeyBag } from "@fireproof/core-keybag";
4
- import { ensureSuperThis } from "@fireproof/core-runtime";
5
- import { decodeJwt } from "jose";
6
- import { createCliVibesApi, getCliDashAuth } from "./vibes-api.js";
7
- function hasCode(value) {
8
- return typeof value === "object" && value !== null && "code" in value && typeof Reflect.get(value, "code") === "string";
9
- }
10
- async function loadDeviceInfo() {
11
- const sthis = ensureSuperThis();
12
- const keyBag = await getKeyBag(sthis);
13
- const existing = await keyBag.getDeviceId();
14
- if (existing.deviceId.IsNone()) {
15
- return Result.Err("No device identity. Run: use-vibes login");
16
- }
17
- if (existing.cert.IsNone()) {
18
- return Result.Err("Not registered. Run: use-vibes login");
19
- }
20
- const jwk = existing.deviceId.unwrap();
21
- const createResult = await DeviceIdKey.createFromJWK(jwk);
22
- if (createResult.isErr()) {
23
- return Result.Err(`Failed to load device key: ${createResult.Err()}`);
24
- }
25
- const deviceIdKey = createResult.Ok();
26
- const fingerprint = await deviceIdKey.fingerPrint();
27
- const cert = existing.cert.unwrap();
28
- if (!cert) {
29
- return Result.Err("Not registered. Run: use-vibes login");
30
- }
31
- const decoded = decodeJwt(cert.certificateJWT);
32
- const certExpiry = decoded.exp ? new Date(decoded.exp * 1000) : undefined;
33
- return Result.Ok({ fingerprint, certExpiry });
34
- }
35
- export async function runWhoami(output, deps = {}) {
36
- let deviceInfo;
37
- if (deps.deviceInfo) {
38
- deviceInfo = deps.deviceInfo;
39
- }
40
- else {
41
- const rDevice = await loadDeviceInfo();
42
- if (rDevice.isErr()) {
43
- return Result.Err(rDevice.Err());
44
- }
45
- deviceInfo = rDevice.Ok();
46
- }
47
- // Fetch handles from API (non-fatal on failure)
48
- await fetchAndPrintHandles(output, deps);
49
- output.stdout(`Device: ${deviceInfo.fingerprint}\n`);
50
- if (deviceInfo.certExpiry) {
51
- const now = new Date();
52
- if (deviceInfo.certExpiry < now) {
53
- output.stdout(`Certificate: expired ${deviceInfo.certExpiry.toISOString()}\n`);
54
- }
55
- else {
56
- output.stdout(`Certificate: valid until ${deviceInfo.certExpiry.toISOString()}\n`);
57
- }
58
- }
59
- return Result.Ok(undefined);
60
- }
61
- async function fetchAndPrintHandles(output, deps) {
62
- try {
63
- const api = await resolveApi(deps);
64
- if (!api) {
65
- return;
66
- }
67
- const result = await api.listUserSlugAppSlug({});
68
- if (result.isErr()) {
69
- const err = result.Err();
70
- if (hasCode(err) && err.code === "require-login") {
71
- output.stderr("Session expired — run: use-vibes login\n");
72
- }
73
- else {
74
- output.stderr("Could not reach API — handle info unavailable\n");
75
- }
76
- return;
77
- }
78
- const res = result.Ok();
79
- if (res.items.length === 0) {
80
- output.stdout("No handles linked\n");
81
- return;
82
- }
83
- for (const item of res.items) {
84
- output.stdout(`Handle: @${item.userSlug}\n`);
85
- }
86
- }
87
- catch {
88
- output.stderr("Could not reach API — handle info unavailable\n");
89
- }
90
- }
91
- async function resolveApi(deps) {
92
- if (deps.api) {
93
- return deps.api;
94
- }
95
- const rAuth = await getCliDashAuth();
96
- if (rAuth.isErr()) {
97
- return undefined;
98
- }
99
- return createCliVibesApi({
100
- getToken: () => Promise.resolve(rAuth),
101
- });
102
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAQzE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAazD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC7F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,YAAY,EACZ,SAAS,EACT,OAAO,EACP,OAAO,EACP,KAAK,SAAS,EAGd,MAAM,EACN,MAAM,EACN,KAAK,MAAM,EAGX,MAAM,EACN,KAAK,WAAW,EAGhB,QAAQ,EACR,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,YAAY,EAGjB,iBAAiB,EAGjB,SAAS,GACV,MAAM,2BAA2B,CAAC"}
package/esm/index.js DELETED
@@ -1,14 +0,0 @@
1
- // Clean consumer API - ONLY exports for user vibes
2
- export {
3
- // Core Fireproof integration
4
- useFireproof, fireproof, ImgFile, toCloud,
5
- // AI integration
6
- callAI, callAi,
7
- // Consumer components
8
- ImgGen,
9
- // Vibes generation hook
10
- useVibes,
11
- // Install ID generation
12
- generateInstallId,
13
- // Hooks (kept for compatibility)
14
- useMobile, } from "@vibes.diy/use-vibes-base";
package/esm/package.json DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "type": "module"
3
- }