@kilospark/nairo 0.0.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.
Files changed (69) hide show
  1. package/dist/api.d.ts +16 -0
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +102 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/auth-browser.d.ts +5 -0
  6. package/dist/auth-browser.d.ts.map +1 -0
  7. package/dist/auth-browser.js +217 -0
  8. package/dist/auth-browser.js.map +1 -0
  9. package/dist/commands/bootstrap.d.ts +5 -0
  10. package/dist/commands/bootstrap.d.ts.map +1 -0
  11. package/dist/commands/bootstrap.js +363 -0
  12. package/dist/commands/bootstrap.js.map +1 -0
  13. package/dist/commands/delete.d.ts +4 -0
  14. package/dist/commands/delete.d.ts.map +1 -0
  15. package/dist/commands/delete.js +64 -0
  16. package/dist/commands/delete.js.map +1 -0
  17. package/dist/commands/export.d.ts +4 -0
  18. package/dist/commands/export.d.ts.map +1 -0
  19. package/dist/commands/export.js +25 -0
  20. package/dist/commands/export.js.map +1 -0
  21. package/dist/commands/hook.d.ts +4 -0
  22. package/dist/commands/hook.d.ts.map +1 -0
  23. package/dist/commands/hook.js +242 -0
  24. package/dist/commands/hook.js.map +1 -0
  25. package/dist/commands/import.d.ts +2 -0
  26. package/dist/commands/import.d.ts.map +1 -0
  27. package/dist/commands/import.js +210 -0
  28. package/dist/commands/import.js.map +1 -0
  29. package/dist/commands/install.d.ts +9 -0
  30. package/dist/commands/install.d.ts.map +1 -0
  31. package/dist/commands/install.js +282 -0
  32. package/dist/commands/install.js.map +1 -0
  33. package/dist/commands/list.d.ts +5 -0
  34. package/dist/commands/list.d.ts.map +1 -0
  35. package/dist/commands/list.js +90 -0
  36. package/dist/commands/list.js.map +1 -0
  37. package/dist/commands/login.d.ts +2 -0
  38. package/dist/commands/login.d.ts.map +1 -0
  39. package/dist/commands/login.js +24 -0
  40. package/dist/commands/login.js.map +1 -0
  41. package/dist/commands/search.d.ts +4 -0
  42. package/dist/commands/search.d.ts.map +1 -0
  43. package/dist/commands/search.js +42 -0
  44. package/dist/commands/search.js.map +1 -0
  45. package/dist/commands/signup.d.ts +2 -0
  46. package/dist/commands/signup.d.ts.map +1 -0
  47. package/dist/commands/signup.js +6 -0
  48. package/dist/commands/signup.js.map +1 -0
  49. package/dist/config.d.ts +10 -0
  50. package/dist/config.d.ts.map +1 -0
  51. package/dist/config.js +35 -0
  52. package/dist/config.js.map +1 -0
  53. package/dist/index.d.ts +3 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +93 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/prompt.d.ts +10 -0
  58. package/dist/prompt.d.ts.map +1 -0
  59. package/dist/prompt.js +37 -0
  60. package/dist/prompt.js.map +1 -0
  61. package/dist/tools/configure.d.ts +9 -0
  62. package/dist/tools/configure.d.ts.map +1 -0
  63. package/dist/tools/configure.js +326 -0
  64. package/dist/tools/configure.js.map +1 -0
  65. package/dist/tools/detect.d.ts +7 -0
  66. package/dist/tools/detect.d.ts.map +1 -0
  67. package/dist/tools/detect.js +125 -0
  68. package/dist/tools/detect.js.map +1 -0
  69. package/package.json +24 -0
package/dist/api.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ export interface ApiOptions {
2
+ method?: string;
3
+ body?: unknown;
4
+ headers?: Record<string, string>;
5
+ sessionToken?: string;
6
+ }
7
+ export declare function apiClient<T = unknown>(path: string, options?: ApiOptions): Promise<T>;
8
+ /**
9
+ * API client for unauthenticated requests (signup/login).
10
+ */
11
+ export declare function apiRequest<T = unknown>(apiUrl: string, path: string, options?: {
12
+ method?: string;
13
+ body?: unknown;
14
+ headers?: Record<string, string>;
15
+ }): Promise<T>;
16
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmCD,wBAAsB,SAAS,CAAC,CAAC,GAAG,OAAO,EACzC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,CAAC,CAAC,CAiDZ;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAClF,OAAO,CAAC,CAAC,CAAC,CA4BZ"}
package/dist/api.js ADDED
@@ -0,0 +1,102 @@
1
+ import { getConfig } from "./config.js";
2
+ function inferClientName() {
3
+ return "nairo-cli";
4
+ }
5
+ function inferOrigin() {
6
+ if (process.env.NAIRO_ORIGIN) {
7
+ return process.env.NAIRO_ORIGIN.trim().toLowerCase();
8
+ }
9
+ if (process.env.CODEX_THREAD_ID || process.env.CODEX_CI) {
10
+ return "codex";
11
+ }
12
+ if (process.env.CLAUDECODE || process.env.CLAUDE_CODE) {
13
+ return "claude-code";
14
+ }
15
+ if (process.env.CURSOR_TRACE_ID || process.env.CURSOR_WORKSPACE_ID) {
16
+ return "cursor";
17
+ }
18
+ return undefined;
19
+ }
20
+ function inferClientOs() {
21
+ switch (process.platform) {
22
+ case "darwin":
23
+ return "macOS";
24
+ case "win32":
25
+ return "Windows";
26
+ case "linux":
27
+ return "Linux";
28
+ default:
29
+ return process.platform;
30
+ }
31
+ }
32
+ export async function apiClient(path, options = {}) {
33
+ const config = getConfig();
34
+ const url = `${config.apiUrl}${path}`;
35
+ const headers = {
36
+ ...options.headers,
37
+ };
38
+ if (!headers["Content-Type"]) {
39
+ headers["Content-Type"] = "application/json";
40
+ }
41
+ if (!headers["X-Nairo-Client"]) {
42
+ headers["X-Nairo-Client"] = inferClientName();
43
+ }
44
+ if (!headers["X-Nairo-Client-Version"]) {
45
+ headers["X-Nairo-Client-Version"] = "0.0.1";
46
+ }
47
+ if (!headers["X-Nairo-OS"]) {
48
+ headers["X-Nairo-OS"] = inferClientOs();
49
+ }
50
+ const origin = inferOrigin();
51
+ if (!headers["X-Nairo-Origin"] && origin) {
52
+ headers["X-Nairo-Origin"] = origin;
53
+ }
54
+ if (options.sessionToken) {
55
+ headers["Authorization"] = `Bearer ${options.sessionToken}`;
56
+ }
57
+ else {
58
+ headers["Authorization"] = `Bearer ${config.apiKey}`;
59
+ }
60
+ const response = await fetch(url, {
61
+ method: options.method ?? "GET",
62
+ headers,
63
+ body: options.body
64
+ ? options.body instanceof Buffer
65
+ ? options.body
66
+ : JSON.stringify(options.body)
67
+ : undefined,
68
+ });
69
+ const data = await response.json();
70
+ if (!response.ok) {
71
+ const message = data.error ?? `HTTP ${response.status}`;
72
+ throw new Error(String(message));
73
+ }
74
+ return data;
75
+ }
76
+ /**
77
+ * API client for unauthenticated requests (signup/login).
78
+ */
79
+ export async function apiRequest(apiUrl, path, options = {}) {
80
+ const url = `${apiUrl}${path}`;
81
+ const origin = inferOrigin();
82
+ const headers = {
83
+ "Content-Type": "application/json",
84
+ "X-Nairo-Client": inferClientName(),
85
+ "X-Nairo-Client-Version": "0.0.1",
86
+ "X-Nairo-OS": inferClientOs(),
87
+ ...(origin ? { "X-Nairo-Origin": origin } : {}),
88
+ ...options.headers,
89
+ };
90
+ const response = await fetch(url, {
91
+ method: options.method ?? "GET",
92
+ headers,
93
+ body: options.body ? JSON.stringify(options.body) : undefined,
94
+ });
95
+ const data = await response.json();
96
+ if (!response.ok) {
97
+ const message = data.error ?? `HTTP ${response.status}`;
98
+ throw new Error(String(message));
99
+ }
100
+ return data;
101
+ }
102
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function authenticateViaBrowser(apiUrl: string): Promise<{
2
+ apiKey: string;
3
+ email: string;
4
+ }>;
5
+ //# sourceMappingURL=auth-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-browser.d.ts","sourceRoot":"","sources":["../src/auth-browser.ts"],"names":[],"mappings":"AAoPA,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B5C"}
@@ -0,0 +1,217 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { spawn } from "node:child_process";
4
+ function base64Url(input) {
5
+ return input
6
+ .toString("base64")
7
+ .replace(/\+/g, "-")
8
+ .replace(/\//g, "_")
9
+ .replace(/=+$/g, "");
10
+ }
11
+ function pkceChallenge(verifier) {
12
+ return createHash("sha256").update(verifier).digest("base64url");
13
+ }
14
+ function buildAuthorizeUrl(args) {
15
+ const url = new URL("/oauth/authorize", args.apiUrl.replace(/\/+$/, "") + "/");
16
+ url.searchParams.set("response_type", "code");
17
+ url.searchParams.set("client_id", args.clientId);
18
+ url.searchParams.set("redirect_uri", args.redirectUri);
19
+ url.searchParams.set("scope", "mcp:read mcp:write");
20
+ url.searchParams.set("state", args.state);
21
+ url.searchParams.set("code_challenge", args.codeChallenge);
22
+ url.searchParams.set("code_challenge_method", "S256");
23
+ return url.toString();
24
+ }
25
+ function openBrowser(url) {
26
+ const platform = process.platform;
27
+ try {
28
+ if (platform === "darwin") {
29
+ const child = spawn("open", [url], { detached: true, stdio: "ignore" });
30
+ child.unref();
31
+ return true;
32
+ }
33
+ if (platform === "win32") {
34
+ const child = spawn("cmd", ["/c", "start", "", url], {
35
+ detached: true,
36
+ stdio: "ignore",
37
+ });
38
+ child.unref();
39
+ return true;
40
+ }
41
+ const child = spawn("xdg-open", [url], { detached: true, stdio: "ignore" });
42
+ child.unref();
43
+ return true;
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
49
+ function sendCallbackPage(res, ok) {
50
+ const body = ok
51
+ ? "<h1>Nairo sign-in complete</h1><p>You can return to your terminal.</p>"
52
+ : "<h1>Nairo sign-in failed</h1><p>You can close this tab and check the terminal for details.</p>";
53
+ res.statusCode = ok ? 200 : 400;
54
+ res.setHeader("Content-Type", "text/html; charset=utf-8");
55
+ res.end(`<!doctype html><html><body style="font-family:monospace;padding:24px">${body}</body></html>`);
56
+ }
57
+ async function waitForOAuthCode(args) {
58
+ return await new Promise((resolve, reject) => {
59
+ const server = createServer((req, res) => {
60
+ try {
61
+ const reqUrl = new URL(req.url || "/", "http://127.0.0.1");
62
+ if (reqUrl.pathname !== "/callback") {
63
+ res.statusCode = 404;
64
+ res.end("Not found");
65
+ return;
66
+ }
67
+ const returnedState = reqUrl.searchParams.get("state");
68
+ const code = reqUrl.searchParams.get("code");
69
+ const error = reqUrl.searchParams.get("error");
70
+ if (error) {
71
+ sendCallbackPage(res, false);
72
+ server.close();
73
+ reject(new Error(`OAuth authorization failed: ${error}`));
74
+ return;
75
+ }
76
+ if (!code || !returnedState || returnedState !== args.state) {
77
+ sendCallbackPage(res, false);
78
+ server.close();
79
+ reject(new Error("OAuth callback validation failed."));
80
+ return;
81
+ }
82
+ sendCallbackPage(res, true);
83
+ const address = server.address();
84
+ const port = address && typeof address === "object" ? address.port : null;
85
+ const redirectUri = `http://localhost:${port}/callback`;
86
+ server.close();
87
+ resolve({ code, redirectUri });
88
+ }
89
+ catch {
90
+ sendCallbackPage(res, false);
91
+ server.close();
92
+ reject(new Error("OAuth callback parsing failed."));
93
+ }
94
+ });
95
+ server.listen(0, "localhost", () => {
96
+ const address = server.address();
97
+ if (!address || typeof address !== "object") {
98
+ server.close();
99
+ reject(new Error("Could not start local OAuth callback server."));
100
+ return;
101
+ }
102
+ const redirectUri = `http://localhost:${address.port}/callback`;
103
+ const authorizeUrl = buildAuthorizeUrl({
104
+ apiUrl: args.apiUrl,
105
+ clientId: args.clientId,
106
+ redirectUri,
107
+ state: args.state,
108
+ codeChallenge: args.codeChallenge,
109
+ });
110
+ console.log("Opening browser for Nairo login...");
111
+ const opened = openBrowser(authorizeUrl);
112
+ if (!opened) {
113
+ console.log("Could not open browser automatically.");
114
+ }
115
+ console.log(`If needed, open this URL manually:\n${authorizeUrl}\n`);
116
+ });
117
+ const timeout = setTimeout(() => {
118
+ server.close();
119
+ reject(new Error("Timed out waiting for browser login."));
120
+ }, 5 * 60 * 1000);
121
+ server.on("close", () => clearTimeout(timeout));
122
+ server.on("error", (err) => {
123
+ clearTimeout(timeout);
124
+ reject(err);
125
+ });
126
+ });
127
+ }
128
+ async function exchangeCodeForAccessToken(args) {
129
+ const url = `${args.apiUrl.replace(/\/+$/, "")}/oauth/token`;
130
+ let res;
131
+ try {
132
+ res = await fetch(url, {
133
+ method: "POST",
134
+ headers: { "Content-Type": "application/json" },
135
+ body: JSON.stringify({
136
+ grant_type: "authorization_code",
137
+ code: args.code,
138
+ redirect_uri: args.redirectUri,
139
+ client_id: args.clientId,
140
+ code_verifier: args.codeVerifier,
141
+ }),
142
+ });
143
+ }
144
+ catch (error) {
145
+ const message = error instanceof Error ? error.message : String(error);
146
+ throw new Error(`OAuth token exchange request failed (${url}): ${message}`);
147
+ }
148
+ const data = (await res.json().catch(() => ({})));
149
+ if (!res.ok) {
150
+ const message = typeof data.error_description === "string"
151
+ ? data.error_description
152
+ : typeof data.error === "string"
153
+ ? data.error
154
+ : `HTTP ${res.status}`;
155
+ throw new Error(`OAuth token exchange failed: ${message}`);
156
+ }
157
+ if (typeof data.access_token !== "string") {
158
+ throw new Error("OAuth token exchange returned no access token.");
159
+ }
160
+ return { access_token: data.access_token };
161
+ }
162
+ async function exchangeAccessTokenForApiKey(args) {
163
+ const url = `${args.apiUrl.replace(/\/+$/, "")}/api/auth/cli/exchange`;
164
+ let res;
165
+ try {
166
+ res = await fetch(url, {
167
+ method: "POST",
168
+ headers: {
169
+ "Content-Type": "application/json",
170
+ Authorization: `Bearer ${args.accessToken}`,
171
+ },
172
+ body: JSON.stringify({}),
173
+ });
174
+ }
175
+ catch (error) {
176
+ const message = error instanceof Error ? error.message : String(error);
177
+ throw new Error(`API key exchange request failed (${url}): ${message}`);
178
+ }
179
+ const data = (await res.json().catch(() => ({})));
180
+ if (!res.ok) {
181
+ const message = typeof data.error === "string" ? data.error : `HTTP ${res.status}`;
182
+ throw new Error(`API key exchange failed: ${message}`);
183
+ }
184
+ if (typeof data.apiKey !== "string" || typeof data.email !== "string") {
185
+ throw new Error("API key exchange returned an invalid response.");
186
+ }
187
+ return {
188
+ apiKey: data.apiKey,
189
+ email: data.email,
190
+ keyPrefix: typeof data.keyPrefix === "string" ? data.keyPrefix : "",
191
+ };
192
+ }
193
+ export async function authenticateViaBrowser(apiUrl) {
194
+ const clientId = "nairo-cli";
195
+ const state = base64Url(randomBytes(24));
196
+ const codeVerifier = base64Url(randomBytes(48));
197
+ const codeChallenge = pkceChallenge(codeVerifier);
198
+ const { code, redirectUri } = await waitForOAuthCode({
199
+ state,
200
+ apiUrl,
201
+ clientId,
202
+ codeChallenge,
203
+ });
204
+ const token = await exchangeCodeForAccessToken({
205
+ apiUrl,
206
+ clientId,
207
+ code,
208
+ redirectUri,
209
+ codeVerifier,
210
+ });
211
+ const exchange = await exchangeAccessTokenForApiKey({
212
+ apiUrl,
213
+ accessToken: token.access_token,
214
+ });
215
+ return { apiKey: exchange.apiKey, email: exchange.email };
216
+ }
217
+ //# sourceMappingURL=auth-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-browser.js","sourceRoot":"","sources":["../src/auth-browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function bootstrapCommand(options: {
2
+ project?: string;
3
+ yes?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AAyRA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CA2IhB"}