@linqapp/sdk-mcp 0.30.0 → 0.32.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/code-tool.js +1 -1
- package/code-tool.mjs +1 -1
- package/index.js +7 -0
- package/index.js.map +1 -1
- package/index.mjs +7 -0
- package/index.mjs.map +1 -1
- package/linq-cli-credentials.d.mts +21 -0
- package/linq-cli-credentials.d.mts.map +1 -0
- package/linq-cli-credentials.d.ts +21 -0
- package/linq-cli-credentials.d.ts.map +1 -0
- package/linq-cli-credentials.js +53 -0
- package/linq-cli-credentials.js.map +1 -0
- package/linq-cli-credentials.mjs +48 -0
- package/linq-cli-credentials.mjs.map +1 -0
- package/local-docs-search.js +197 -197
- package/local-docs-search.js.map +1 -1
- package/local-docs-search.mjs +197 -197
- package/local-docs-search.mjs.map +1 -1
- package/package.json +12 -2
- package/server.js +1 -1
- package/server.mjs +1 -1
- package/src/code-tool.ts +1 -1
- package/src/index.ts +8 -0
- package/src/linq-cli-credentials.ts +53 -0
- package/src/local-docs-search.ts +243 -243
- package/src/server.ts +1 -1
package/code-tool.js
CHANGED
package/code-tool.mjs
CHANGED
package/index.js
CHANGED
|
@@ -6,12 +6,19 @@ const options_1 = require("./options.js");
|
|
|
6
6
|
const stdio_1 = require("./stdio.js");
|
|
7
7
|
const http_1 = require("./http.js");
|
|
8
8
|
const logger_1 = require("./logger.js");
|
|
9
|
+
const linq_cli_credentials_1 = require("./linq-cli-credentials.js");
|
|
9
10
|
async function main() {
|
|
10
11
|
const options = parseOptionsOrError();
|
|
11
12
|
(0, logger_1.configureLogger)({
|
|
12
13
|
level: options.debug ? 'debug' : 'info',
|
|
13
14
|
pretty: options.logFormat === 'pretty',
|
|
14
15
|
});
|
|
16
|
+
// Fall back to the credential `linq login` already wrote. Must run before any
|
|
17
|
+
// client is constructed. See linq-cli-credentials.ts for why the env var alone
|
|
18
|
+
// is not reachable for desktop MCP clients.
|
|
19
|
+
if ((0, linq_cli_credentials_1.applyLinqCliCredentials)()) {
|
|
20
|
+
(0, logger_1.getLogger)().info('Using the API key from ~/.linq/config.json');
|
|
21
|
+
}
|
|
15
22
|
const selectedTools = await selectToolsOrError(options);
|
|
16
23
|
(0, logger_1.getLogger)().info({ tools: selectedTools.map((e) => e.tool.name) }, `MCP Server starting with ${selectedTools.length} tools`);
|
|
17
24
|
switch (options.transport) {
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":";;;AAEA,wCAAuC;AACvC,0CAAwD;AACxD,sCAA4C;AAC5C,oCAAoD;AAEpD,wCAAsD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":";;;AAEA,wCAAuC;AACvC,0CAAwD;AACxD,sCAA4C;AAC5C,oCAAoD;AAEpD,wCAAsD;AACtD,oEAAiE;AAEjE,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,IAAA,wBAAe,EAAC;QACd,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QACvC,MAAM,EAAE,OAAO,CAAC,SAAS,KAAK,QAAQ;KACvC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,+EAA+E;IAC/E,4CAA4C;IAC5C,IAAI,IAAA,8CAAuB,GAAE,EAAE,CAAC;QAC9B,IAAA,kBAAS,GAAE,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAExD,IAAA,kBAAS,GAAE,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAChD,4BAA4B,aAAa,CAAC,MAAM,QAAQ,CACzD,CAAC;IAEF,QAAQ,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1B,KAAK,OAAO;YACV,MAAM,IAAA,yBAAiB,EAAC,OAAO,CAAC,CAAC;YACjC,MAAM;QACR,KAAK,MAAM;YACT,MAAM,IAAA,iCAA0B,EAAC;gBAC/B,UAAU,EAAE,OAAO;gBACnB,IAAI,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI;aACrC,CAAC,CAAC;YACH,MAAM;IACV,CAAC;AACH,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB;IAC1B,IAAI,CAAC;QACH,OAAO,IAAA,yBAAe,GAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iEAAiE;QACjE,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAmB;IACnD,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,IAAA,oBAAW,EAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAA,kBAAS,GAAE,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAA,kBAAS,GAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/index.mjs
CHANGED
|
@@ -4,12 +4,19 @@ import { parseCLIOptions } from "./options.mjs";
|
|
|
4
4
|
import { launchStdioServer } from "./stdio.mjs";
|
|
5
5
|
import { launchStreamableHTTPServer } from "./http.mjs";
|
|
6
6
|
import { configureLogger, getLogger } from "./logger.mjs";
|
|
7
|
+
import { applyLinqCliCredentials } from "./linq-cli-credentials.mjs";
|
|
7
8
|
async function main() {
|
|
8
9
|
const options = parseOptionsOrError();
|
|
9
10
|
configureLogger({
|
|
10
11
|
level: options.debug ? 'debug' : 'info',
|
|
11
12
|
pretty: options.logFormat === 'pretty',
|
|
12
13
|
});
|
|
14
|
+
// Fall back to the credential `linq login` already wrote. Must run before any
|
|
15
|
+
// client is constructed. See linq-cli-credentials.ts for why the env var alone
|
|
16
|
+
// is not reachable for desktop MCP clients.
|
|
17
|
+
if (applyLinqCliCredentials()) {
|
|
18
|
+
getLogger().info('Using the API key from ~/.linq/config.json');
|
|
19
|
+
}
|
|
13
20
|
const selectedTools = await selectToolsOrError(options);
|
|
14
21
|
getLogger().info({ tools: selectedTools.map((e) => e.tool.name) }, `MCP Server starting with ${selectedTools.length} tools`);
|
|
15
22
|
switch (options.transport) {
|
package/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,qBAAiB;AACvC,OAAO,EAAc,eAAe,EAAE,sBAAkB;AACxD,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAC5C,OAAO,EAAE,0BAA0B,EAAE,mBAAe;AAEpD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,qBAAiB;
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,qBAAiB;AACvC,OAAO,EAAc,eAAe,EAAE,sBAAkB;AACxD,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAC5C,OAAO,EAAE,0BAA0B,EAAE,mBAAe;AAEpD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,qBAAiB;AACtD,OAAO,EAAE,uBAAuB,EAAE,mCAA+B;AAEjE,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,eAAe,CAAC;QACd,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QACvC,MAAM,EAAE,OAAO,CAAC,SAAS,KAAK,QAAQ;KACvC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,+EAA+E;IAC/E,4CAA4C;IAC5C,IAAI,uBAAuB,EAAE,EAAE,CAAC;QAC9B,SAAS,EAAE,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAExD,SAAS,EAAE,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAChD,4BAA4B,aAAa,CAAC,MAAM,QAAQ,CACzD,CAAC;IAEF,QAAQ,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1B,KAAK,OAAO;YACV,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM;QACR,KAAK,MAAM;YACT,MAAM,0BAA0B,CAAC;gBAC/B,UAAU,EAAE,OAAO;gBACnB,IAAI,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI;aACrC,CAAC,CAAC;YACH,MAAM;IACV,CAAC;AACH,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB;IAC1B,IAAI,CAAC;QACH,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iEAAiE;QACjE,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAmB;IACnD,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,SAAS,EAAE,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const API_KEY_ENV = "LINQ_API_V3_API_KEY";
|
|
2
|
+
/**
|
|
3
|
+
* Read the API token the `linq` CLI stores in ~/.linq/config.json.
|
|
4
|
+
*
|
|
5
|
+
* MCP clients launch this server as a detached child process, so it does not
|
|
6
|
+
* inherit a login shell. On macOS in particular, a GUI-launched editor never
|
|
7
|
+
* sees `export LINQ_API_V3_API_KEY=...` from a shell profile, which leaves the
|
|
8
|
+
* env var the only supported credential source unreachable for most desktop
|
|
9
|
+
* users. Falling back to the CLI's own config means `linq login` is enough.
|
|
10
|
+
*
|
|
11
|
+
* Returns null whenever the file is absent, unreadable, malformed, or holds no
|
|
12
|
+
* token — the caller then proceeds as before and the SDK reports the missing
|
|
13
|
+
* credential itself.
|
|
14
|
+
*/
|
|
15
|
+
export declare function readTokenFromLinqCli(home?: string): string | null;
|
|
16
|
+
/**
|
|
17
|
+
* Populate the API key env var from the CLI config when it is not already set.
|
|
18
|
+
* An explicitly provided key always wins.
|
|
19
|
+
*/
|
|
20
|
+
export declare function applyLinqCliCredentials(env?: NodeJS.ProcessEnv): boolean;
|
|
21
|
+
//# sourceMappingURL=linq-cli-credentials.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linq-cli-credentials.d.mts","sourceRoot":"","sources":["src/linq-cli-credentials.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,wBAAwB,CAAC;AAOjD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,GAAG,IAAI,CAgB5E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAMrF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const API_KEY_ENV = "LINQ_API_V3_API_KEY";
|
|
2
|
+
/**
|
|
3
|
+
* Read the API token the `linq` CLI stores in ~/.linq/config.json.
|
|
4
|
+
*
|
|
5
|
+
* MCP clients launch this server as a detached child process, so it does not
|
|
6
|
+
* inherit a login shell. On macOS in particular, a GUI-launched editor never
|
|
7
|
+
* sees `export LINQ_API_V3_API_KEY=...` from a shell profile, which leaves the
|
|
8
|
+
* env var the only supported credential source unreachable for most desktop
|
|
9
|
+
* users. Falling back to the CLI's own config means `linq login` is enough.
|
|
10
|
+
*
|
|
11
|
+
* Returns null whenever the file is absent, unreadable, malformed, or holds no
|
|
12
|
+
* token — the caller then proceeds as before and the SDK reports the missing
|
|
13
|
+
* credential itself.
|
|
14
|
+
*/
|
|
15
|
+
export declare function readTokenFromLinqCli(home?: string): string | null;
|
|
16
|
+
/**
|
|
17
|
+
* Populate the API key env var from the CLI config when it is not already set.
|
|
18
|
+
* An explicitly provided key always wins.
|
|
19
|
+
*/
|
|
20
|
+
export declare function applyLinqCliCredentials(env?: NodeJS.ProcessEnv): boolean;
|
|
21
|
+
//# sourceMappingURL=linq-cli-credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linq-cli-credentials.d.ts","sourceRoot":"","sources":["src/linq-cli-credentials.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,wBAAwB,CAAC;AAOjD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,GAAG,IAAI,CAgB5E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAMrF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.API_KEY_ENV = void 0;
|
|
4
|
+
exports.readTokenFromLinqCli = readTokenFromLinqCli;
|
|
5
|
+
exports.applyLinqCliCredentials = applyLinqCliCredentials;
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const node_os_1 = require("node:os");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
exports.API_KEY_ENV = 'LINQ_API_V3_API_KEY';
|
|
10
|
+
/**
|
|
11
|
+
* Read the API token the `linq` CLI stores in ~/.linq/config.json.
|
|
12
|
+
*
|
|
13
|
+
* MCP clients launch this server as a detached child process, so it does not
|
|
14
|
+
* inherit a login shell. On macOS in particular, a GUI-launched editor never
|
|
15
|
+
* sees `export LINQ_API_V3_API_KEY=...` from a shell profile, which leaves the
|
|
16
|
+
* env var the only supported credential source unreachable for most desktop
|
|
17
|
+
* users. Falling back to the CLI's own config means `linq login` is enough.
|
|
18
|
+
*
|
|
19
|
+
* Returns null whenever the file is absent, unreadable, malformed, or holds no
|
|
20
|
+
* token — the caller then proceeds as before and the SDK reports the missing
|
|
21
|
+
* credential itself.
|
|
22
|
+
*/
|
|
23
|
+
function readTokenFromLinqCli(home = (0, node_os_1.homedir)()) {
|
|
24
|
+
const configPath = (0, node_path_1.join)(home, '.linq', 'config.json');
|
|
25
|
+
if (!(0, node_fs_1.existsSync)(configPath))
|
|
26
|
+
return null;
|
|
27
|
+
let config;
|
|
28
|
+
try {
|
|
29
|
+
config = JSON.parse((0, node_fs_1.readFileSync)(configPath, 'utf8'));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
// LINQ_PROFILE mirrors the CLI's --profile flag, so a developer working
|
|
35
|
+
// against staging gets staging here too.
|
|
36
|
+
const profileName = process.env['LINQ_PROFILE'] || config.profile || 'default';
|
|
37
|
+
const token = config.profiles?.[profileName]?.token;
|
|
38
|
+
return typeof token === 'string' && token.length > 0 ? token : null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Populate the API key env var from the CLI config when it is not already set.
|
|
42
|
+
* An explicitly provided key always wins.
|
|
43
|
+
*/
|
|
44
|
+
function applyLinqCliCredentials(env = process.env) {
|
|
45
|
+
if (env[exports.API_KEY_ENV])
|
|
46
|
+
return false;
|
|
47
|
+
const token = readTokenFromLinqCli();
|
|
48
|
+
if (!token)
|
|
49
|
+
return false;
|
|
50
|
+
env[exports.API_KEY_ENV] = token;
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=linq-cli-credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linq-cli-credentials.js","sourceRoot":"","sources":["src/linq-cli-credentials.ts"],"names":[],"mappings":";;;AAwBA,oDAgBC;AAMD,0DAMC;AApDD,qCAAmD;AACnD,qCAAkC;AAClC,yCAAiC;AAEpB,QAAA,WAAW,GAAG,qBAAqB,CAAC;AAOjD;;;;;;;;;;;;GAYG;AACH,SAAgB,oBAAoB,CAAC,OAAe,IAAA,iBAAO,GAAE;IAC3D,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IACtD,IAAI,CAAC,IAAA,oBAAU,EAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,IAAI,MAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,UAAU,EAAE,MAAM,CAAC,CAAkB,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wEAAwE;IACxE,yCAAyC;IACzC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC;IAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;IACpD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC1E,IAAI,GAAG,CAAC,mBAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,mBAAW,CAAC,GAAG,KAAK,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
export const API_KEY_ENV = 'LINQ_API_V3_API_KEY';
|
|
5
|
+
/**
|
|
6
|
+
* Read the API token the `linq` CLI stores in ~/.linq/config.json.
|
|
7
|
+
*
|
|
8
|
+
* MCP clients launch this server as a detached child process, so it does not
|
|
9
|
+
* inherit a login shell. On macOS in particular, a GUI-launched editor never
|
|
10
|
+
* sees `export LINQ_API_V3_API_KEY=...` from a shell profile, which leaves the
|
|
11
|
+
* env var the only supported credential source unreachable for most desktop
|
|
12
|
+
* users. Falling back to the CLI's own config means `linq login` is enough.
|
|
13
|
+
*
|
|
14
|
+
* Returns null whenever the file is absent, unreadable, malformed, or holds no
|
|
15
|
+
* token — the caller then proceeds as before and the SDK reports the missing
|
|
16
|
+
* credential itself.
|
|
17
|
+
*/
|
|
18
|
+
export function readTokenFromLinqCli(home = homedir()) {
|
|
19
|
+
const configPath = join(home, '.linq', 'config.json');
|
|
20
|
+
if (!existsSync(configPath))
|
|
21
|
+
return null;
|
|
22
|
+
let config;
|
|
23
|
+
try {
|
|
24
|
+
config = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
// LINQ_PROFILE mirrors the CLI's --profile flag, so a developer working
|
|
30
|
+
// against staging gets staging here too.
|
|
31
|
+
const profileName = process.env['LINQ_PROFILE'] || config.profile || 'default';
|
|
32
|
+
const token = config.profiles?.[profileName]?.token;
|
|
33
|
+
return typeof token === 'string' && token.length > 0 ? token : null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Populate the API key env var from the CLI config when it is not already set.
|
|
37
|
+
* An explicitly provided key always wins.
|
|
38
|
+
*/
|
|
39
|
+
export function applyLinqCliCredentials(env = process.env) {
|
|
40
|
+
if (env[API_KEY_ENV])
|
|
41
|
+
return false;
|
|
42
|
+
const token = readTokenFromLinqCli();
|
|
43
|
+
if (!token)
|
|
44
|
+
return false;
|
|
45
|
+
env[API_KEY_ENV] = token;
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=linq-cli-credentials.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linq-cli-credentials.mjs","sourceRoot":"","sources":["src/linq-cli-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAOjD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe,OAAO,EAAE;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,IAAI,MAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAkB,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wEAAwE;IACxE,yCAAyC;IACzC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC;IAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;IACpD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC1E,IAAI,GAAG,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC"}
|