@crypto512/jicon-mcp 2.1.1 → 2.2.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/README.md +288 -1
- package/TOOL_LIST.md +390 -87
- package/dist/config/constants.d.ts +12 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +13 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +27 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +93 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +26 -0
- package/dist/config/types.js.map +1 -1
- package/dist/confluence/tools.d.ts +8 -1
- package/dist/confluence/tools.d.ts.map +1 -1
- package/dist/confluence/tools.js +61 -51
- package/dist/confluence/tools.js.map +1 -1
- package/dist/credentials/client-factory.d.ts +64 -0
- package/dist/credentials/client-factory.d.ts.map +1 -0
- package/dist/credentials/client-factory.js +110 -0
- package/dist/credentials/client-factory.js.map +1 -0
- package/dist/credentials/context.d.ts +25 -0
- package/dist/credentials/context.d.ts.map +1 -0
- package/dist/credentials/context.js +35 -0
- package/dist/credentials/context.js.map +1 -0
- package/dist/credentials/extractor.d.ts +21 -0
- package/dist/credentials/extractor.d.ts.map +1 -0
- package/dist/credentials/extractor.js +46 -0
- package/dist/credentials/extractor.js.map +1 -0
- package/dist/credentials/index.d.ts +9 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +8 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/types.d.ts +21 -0
- package/dist/credentials/types.d.ts.map +1 -0
- package/dist/credentials/types.js +13 -0
- package/dist/credentials/types.js.map +1 -0
- package/dist/index.js +98 -75
- package/dist/index.js.map +1 -1
- package/dist/jira/activity-tools.d.ts +54 -1
- package/dist/jira/activity-tools.d.ts.map +1 -1
- package/dist/jira/activity-tools.js +737 -79
- package/dist/jira/activity-tools.js.map +1 -1
- package/dist/jira/client.d.ts +34 -2
- package/dist/jira/client.d.ts.map +1 -1
- package/dist/jira/client.js +119 -63
- package/dist/jira/client.js.map +1 -1
- package/dist/jira/tools.d.ts +58 -1
- package/dist/jira/tools.d.ts.map +1 -1
- package/dist/jira/tools.js +226 -27
- package/dist/jira/tools.js.map +1 -1
- package/dist/jira/types.d.ts +22 -0
- package/dist/jira/types.d.ts.map +1 -1
- package/dist/permissions/tool-registry.d.ts +10 -10
- package/dist/permissions/tool-registry.d.ts.map +1 -1
- package/dist/permissions/tool-registry.js +8 -4
- package/dist/permissions/tool-registry.js.map +1 -1
- package/dist/tempo/tools.d.ts +33 -1
- package/dist/tempo/tools.d.ts.map +1 -1
- package/dist/tempo/tools.js +141 -17
- package/dist/tempo/tools.js.map +1 -1
- package/dist/transport/http.d.ts +18 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +66 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/index.d.ts +17 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +32 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/types.d.ts +15 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +12 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/buffer-pipeline/index.js +2 -2
- package/dist/utils/buffer-pipeline/index.js.map +1 -1
- package/dist/utils/buffer-pipeline/schema.d.ts +99 -99
- package/dist/utils/buffer-pipeline/schema.d.ts.map +1 -1
- package/dist/utils/buffer-tools.d.ts +91 -83
- package/dist/utils/buffer-tools.d.ts.map +1 -1
- package/dist/utils/buffer-tools.js +312 -139
- package/dist/utils/buffer-tools.js.map +1 -1
- package/dist/utils/jicon-help.d.ts +3 -3
- package/dist/utils/jicon-help.d.ts.map +1 -1
- package/dist/utils/jicon-help.js +141 -10
- package/dist/utils/jicon-help.js.map +1 -1
- package/dist/utils/json-structure.d.ts +11 -0
- package/dist/utils/json-structure.d.ts.map +1 -1
- package/dist/utils/json-structure.js +61 -0
- package/dist/utils/json-structure.js.map +1 -1
- package/dist/utils/plantuml/tools.d.ts +4 -4
- package/dist/utils/plantuml/tools.d.ts.map +1 -1
- package/dist/utils/plantuml/tools.js +29 -8
- package/dist/utils/plantuml/tools.js.map +1 -1
- package/dist/utils/plantuml/types.d.ts +4 -4
- package/dist/utils/response-formatter.d.ts.map +1 -1
- package/dist/utils/response-formatter.js +8 -4
- package/dist/utils/response-formatter.js.map +1 -1
- package/package.json +5 -2
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client factory for creating API clients with per-request or default credentials
|
|
3
|
+
*/
|
|
4
|
+
import { JiraClient } from "../jira/client.js";
|
|
5
|
+
import { ConfluenceClient } from "../confluence/client.js";
|
|
6
|
+
import { TempoClient } from "../tempo/client.js";
|
|
7
|
+
import type { ApiConfig } from "../types.js";
|
|
8
|
+
export interface Clients {
|
|
9
|
+
jira: JiraClient | null;
|
|
10
|
+
confluence: ConfluenceClient | null;
|
|
11
|
+
tempo: TempoClient | null;
|
|
12
|
+
}
|
|
13
|
+
export interface ClientFactoryConfig {
|
|
14
|
+
defaultJiraConfig: ApiConfig | null;
|
|
15
|
+
defaultConfluenceConfig: ApiConfig | null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Factory for creating API clients
|
|
19
|
+
*
|
|
20
|
+
* - Checks AsyncLocalStorage for per-request credentials
|
|
21
|
+
* - Falls back to default credentials from environment
|
|
22
|
+
* - Caches default clients for reuse (when no per-request credentials)
|
|
23
|
+
*/
|
|
24
|
+
export declare class ClientFactory {
|
|
25
|
+
private defaultClients;
|
|
26
|
+
private config;
|
|
27
|
+
constructor(config: ClientFactoryConfig);
|
|
28
|
+
/**
|
|
29
|
+
* Get Jira client for current request
|
|
30
|
+
*
|
|
31
|
+
* Checks for per-request credentials in AsyncLocalStorage context,
|
|
32
|
+
* falls back to default client if none provided.
|
|
33
|
+
*/
|
|
34
|
+
getJiraClient(): JiraClient | null;
|
|
35
|
+
/**
|
|
36
|
+
* Get Confluence client for current request
|
|
37
|
+
*/
|
|
38
|
+
getConfluenceClient(): ConfluenceClient | null;
|
|
39
|
+
/**
|
|
40
|
+
* Get Tempo client for current request (uses Jira credentials)
|
|
41
|
+
*/
|
|
42
|
+
getTempoClient(): TempoClient | null;
|
|
43
|
+
/**
|
|
44
|
+
* Get all clients for current request
|
|
45
|
+
*/
|
|
46
|
+
getClients(): Clients;
|
|
47
|
+
/**
|
|
48
|
+
* Get default clients (ignores per-request credentials)
|
|
49
|
+
*/
|
|
50
|
+
getDefaultClients(): Clients;
|
|
51
|
+
/**
|
|
52
|
+
* Check if Jira is configured (either default or per-request)
|
|
53
|
+
*/
|
|
54
|
+
hasJira(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Check if Confluence is configured (either default or per-request)
|
|
57
|
+
*/
|
|
58
|
+
hasConfluence(): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Convert service credentials to ApiConfig
|
|
61
|
+
*/
|
|
62
|
+
private toApiConfig;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=client-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-factory.d.ts","sourceRoot":"","sources":["../../src/credentials/client-factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,EAAE,SAAS,GAAG,IAAI,CAAC;IACpC,uBAAuB,EAAE,SAAS,GAAG,IAAI,CAAC;CAC3C;AAED;;;;;;GAMG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAavC;;;;;OAKG;IACH,aAAa,IAAI,UAAU,GAAG,IAAI;IAYlC;;OAEG;IACH,mBAAmB,IAAI,gBAAgB,GAAG,IAAI;IAY9C;;OAEG;IACH,cAAc,IAAI,WAAW,GAAG,IAAI;IAYpC;;OAEG;IACH,UAAU,IAAI,OAAO;IAQrB;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;OAEG;IACH,OAAO,IAAI,OAAO;IAKlB;;OAEG;IACH,aAAa,IAAI,OAAO;IAKxB;;OAEG;IACH,OAAO,CAAC,WAAW;CAQpB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client factory for creating API clients with per-request or default credentials
|
|
3
|
+
*/
|
|
4
|
+
import { JiraClient } from "../jira/client.js";
|
|
5
|
+
import { ConfluenceClient } from "../confluence/client.js";
|
|
6
|
+
import { TempoClient } from "../tempo/client.js";
|
|
7
|
+
import { getRequestCredentials } from "./context.js";
|
|
8
|
+
/**
|
|
9
|
+
* Factory for creating API clients
|
|
10
|
+
*
|
|
11
|
+
* - Checks AsyncLocalStorage for per-request credentials
|
|
12
|
+
* - Falls back to default credentials from environment
|
|
13
|
+
* - Caches default clients for reuse (when no per-request credentials)
|
|
14
|
+
*/
|
|
15
|
+
export class ClientFactory {
|
|
16
|
+
defaultClients;
|
|
17
|
+
config;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
// Create default clients from environment credentials
|
|
21
|
+
this.defaultClients = {
|
|
22
|
+
jira: config.defaultJiraConfig ? new JiraClient(config.defaultJiraConfig) : null,
|
|
23
|
+
confluence: config.defaultConfluenceConfig
|
|
24
|
+
? new ConfluenceClient(config.defaultConfluenceConfig)
|
|
25
|
+
: null,
|
|
26
|
+
tempo: config.defaultJiraConfig ? new TempoClient(config.defaultJiraConfig) : null,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get Jira client for current request
|
|
31
|
+
*
|
|
32
|
+
* Checks for per-request credentials in AsyncLocalStorage context,
|
|
33
|
+
* falls back to default client if none provided.
|
|
34
|
+
*/
|
|
35
|
+
getJiraClient() {
|
|
36
|
+
const requestCreds = getRequestCredentials();
|
|
37
|
+
if (requestCreds?.jira) {
|
|
38
|
+
// Create client with per-request credentials
|
|
39
|
+
return new JiraClient(this.toApiConfig(requestCreds.jira));
|
|
40
|
+
}
|
|
41
|
+
// Use default client
|
|
42
|
+
return this.defaultClients.jira;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get Confluence client for current request
|
|
46
|
+
*/
|
|
47
|
+
getConfluenceClient() {
|
|
48
|
+
const requestCreds = getRequestCredentials();
|
|
49
|
+
if (requestCreds?.confluence) {
|
|
50
|
+
// Create client with per-request credentials
|
|
51
|
+
return new ConfluenceClient(this.toApiConfig(requestCreds.confluence));
|
|
52
|
+
}
|
|
53
|
+
// Use default client
|
|
54
|
+
return this.defaultClients.confluence;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get Tempo client for current request (uses Jira credentials)
|
|
58
|
+
*/
|
|
59
|
+
getTempoClient() {
|
|
60
|
+
const requestCreds = getRequestCredentials();
|
|
61
|
+
if (requestCreds?.jira) {
|
|
62
|
+
// Create client with per-request Jira credentials
|
|
63
|
+
return new TempoClient(this.toApiConfig(requestCreds.jira));
|
|
64
|
+
}
|
|
65
|
+
// Use default client
|
|
66
|
+
return this.defaultClients.tempo;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get all clients for current request
|
|
70
|
+
*/
|
|
71
|
+
getClients() {
|
|
72
|
+
return {
|
|
73
|
+
jira: this.getJiraClient(),
|
|
74
|
+
confluence: this.getConfluenceClient(),
|
|
75
|
+
tempo: this.getTempoClient(),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get default clients (ignores per-request credentials)
|
|
80
|
+
*/
|
|
81
|
+
getDefaultClients() {
|
|
82
|
+
return this.defaultClients;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check if Jira is configured (either default or per-request)
|
|
86
|
+
*/
|
|
87
|
+
hasJira() {
|
|
88
|
+
const requestCreds = getRequestCredentials();
|
|
89
|
+
return !!(requestCreds?.jira || this.config.defaultJiraConfig);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if Confluence is configured (either default or per-request)
|
|
93
|
+
*/
|
|
94
|
+
hasConfluence() {
|
|
95
|
+
const requestCreds = getRequestCredentials();
|
|
96
|
+
return !!(requestCreds?.confluence || this.config.defaultConfluenceConfig);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Convert service credentials to ApiConfig
|
|
100
|
+
*/
|
|
101
|
+
toApiConfig(creds) {
|
|
102
|
+
return {
|
|
103
|
+
url: creds.url,
|
|
104
|
+
token: creds.token,
|
|
105
|
+
// Per-request credentials use bearer auth (PAT style)
|
|
106
|
+
authType: "bearer",
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=client-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-factory.js","sourceRoot":"","sources":["../../src/credentials/client-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request context for per-user credentials using AsyncLocalStorage
|
|
3
|
+
*
|
|
4
|
+
* This allows tool handlers to access per-request credentials without
|
|
5
|
+
* needing to modify their function signatures.
|
|
6
|
+
*/
|
|
7
|
+
import type { RequestCredentials } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Run a function with per-request credentials in context
|
|
10
|
+
*
|
|
11
|
+
* @param credentials - Per-request credentials from HTTP headers
|
|
12
|
+
* @param fn - Function to run with credentials in context
|
|
13
|
+
*/
|
|
14
|
+
export declare function runWithCredentials<T>(credentials: RequestCredentials, fn: () => T | Promise<T>): T | Promise<T>;
|
|
15
|
+
/**
|
|
16
|
+
* Get credentials from the current request context
|
|
17
|
+
*
|
|
18
|
+
* @returns Per-request credentials if available, undefined otherwise
|
|
19
|
+
*/
|
|
20
|
+
export declare function getRequestCredentials(): RequestCredentials | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Check if we're running in a request context with credentials
|
|
23
|
+
*/
|
|
24
|
+
export declare function hasRequestContext(): boolean;
|
|
25
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/credentials/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAOrD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,WAAW,EAAE,kBAAkB,EAC/B,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEhB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,kBAAkB,GAAG,SAAS,CAEtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request context for per-user credentials using AsyncLocalStorage
|
|
3
|
+
*
|
|
4
|
+
* This allows tool handlers to access per-request credentials without
|
|
5
|
+
* needing to modify their function signatures.
|
|
6
|
+
*/
|
|
7
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
8
|
+
/**
|
|
9
|
+
* AsyncLocalStorage instance for request credentials
|
|
10
|
+
*/
|
|
11
|
+
const credentialStorage = new AsyncLocalStorage();
|
|
12
|
+
/**
|
|
13
|
+
* Run a function with per-request credentials in context
|
|
14
|
+
*
|
|
15
|
+
* @param credentials - Per-request credentials from HTTP headers
|
|
16
|
+
* @param fn - Function to run with credentials in context
|
|
17
|
+
*/
|
|
18
|
+
export function runWithCredentials(credentials, fn) {
|
|
19
|
+
return credentialStorage.run(credentials, fn);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get credentials from the current request context
|
|
23
|
+
*
|
|
24
|
+
* @returns Per-request credentials if available, undefined otherwise
|
|
25
|
+
*/
|
|
26
|
+
export function getRequestCredentials() {
|
|
27
|
+
return credentialStorage.getStore();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if we're running in a request context with credentials
|
|
31
|
+
*/
|
|
32
|
+
export function hasRequestContext() {
|
|
33
|
+
return credentialStorage.getStore() !== undefined;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/credentials/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD;;GAEG;AACH,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAsB,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAA+B,EAC/B,EAAwB;IAExB,OAAO,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,iBAAiB,CAAC,QAAQ,EAAE,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,iBAAiB,CAAC,QAAQ,EAAE,KAAK,SAAS,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract per-user credentials from HTTP headers
|
|
3
|
+
*/
|
|
4
|
+
import type { RequestCredentials } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* MCP SDK's IsomorphicHeaders type
|
|
7
|
+
* Headers are stored as Record<string, string | string[] | undefined>
|
|
8
|
+
*/
|
|
9
|
+
type IsomorphicHeaders = Record<string, string | string[] | undefined>;
|
|
10
|
+
/**
|
|
11
|
+
* Extract credentials from HTTP request headers
|
|
12
|
+
*
|
|
13
|
+
* Headers are case-insensitive per HTTP spec
|
|
14
|
+
*/
|
|
15
|
+
export declare function extractCredentials(headers?: IsomorphicHeaders): RequestCredentials;
|
|
16
|
+
/**
|
|
17
|
+
* Check if request has any per-user credentials
|
|
18
|
+
*/
|
|
19
|
+
export declare function hasCredentials(credentials: RequestCredentials): boolean;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/credentials/extractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGrD;;;GAGG;AACH,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAcvE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,kBAAkB,CAwBlF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,kBAAkB,GAAG,OAAO,CAEvE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract per-user credentials from HTTP headers
|
|
3
|
+
*/
|
|
4
|
+
import { CREDENTIAL_HEADERS } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Get a header value as a string (handles arrays and normalizes to lowercase keys)
|
|
7
|
+
*/
|
|
8
|
+
function getHeader(headers, name) {
|
|
9
|
+
// Headers are case-insensitive, try both exact and lowercase
|
|
10
|
+
const value = headers[name] ?? headers[name.toLowerCase()];
|
|
11
|
+
if (Array.isArray(value)) {
|
|
12
|
+
return value[0];
|
|
13
|
+
}
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Extract credentials from HTTP request headers
|
|
18
|
+
*
|
|
19
|
+
* Headers are case-insensitive per HTTP spec
|
|
20
|
+
*/
|
|
21
|
+
export function extractCredentials(headers) {
|
|
22
|
+
if (!headers) {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
const credentials = {};
|
|
26
|
+
// Extract Jira credentials
|
|
27
|
+
const jiraUrl = getHeader(headers, CREDENTIAL_HEADERS.JIRA_URL);
|
|
28
|
+
const jiraToken = getHeader(headers, CREDENTIAL_HEADERS.JIRA_TOKEN);
|
|
29
|
+
if (jiraUrl && jiraToken) {
|
|
30
|
+
credentials.jira = { url: jiraUrl, token: jiraToken };
|
|
31
|
+
}
|
|
32
|
+
// Extract Confluence credentials
|
|
33
|
+
const confluenceUrl = getHeader(headers, CREDENTIAL_HEADERS.CONFLUENCE_URL);
|
|
34
|
+
const confluenceToken = getHeader(headers, CREDENTIAL_HEADERS.CONFLUENCE_TOKEN);
|
|
35
|
+
if (confluenceUrl && confluenceToken) {
|
|
36
|
+
credentials.confluence = { url: confluenceUrl, token: confluenceToken };
|
|
37
|
+
}
|
|
38
|
+
return credentials;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if request has any per-user credentials
|
|
42
|
+
*/
|
|
43
|
+
export function hasCredentials(credentials) {
|
|
44
|
+
return !!(credentials.jira || credentials.confluence);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/credentials/extractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAQhD;;GAEG;AACH,SAAS,SAAS,CAAC,OAA0B,EAAE,IAAY;IACzD,6DAA6D;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA2B;IAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,WAAW,GAAuB,EAAE,CAAC;IAE3C,2BAA2B;IAC3B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAEpE,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACxD,CAAC;IAED,iCAAiC;IACjC,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAC5E,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAEhF,IAAI,aAAa,IAAI,eAAe,EAAE,CAAC;QACrC,WAAW,CAAC,UAAU,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAC1E,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAA+B;IAC5D,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credentials module for per-user authentication
|
|
3
|
+
*/
|
|
4
|
+
export type { RequestCredentials, ServiceCredentials } from "./types.js";
|
|
5
|
+
export { CREDENTIAL_HEADERS } from "./types.js";
|
|
6
|
+
export { extractCredentials, hasCredentials } from "./extractor.js";
|
|
7
|
+
export { ClientFactory, type Clients, type ClientFactoryConfig } from "./client-factory.js";
|
|
8
|
+
export { runWithCredentials, getRequestCredentials, hasRequestContext } from "./context.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/credentials/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credentials module for per-user authentication
|
|
3
|
+
*/
|
|
4
|
+
export { CREDENTIAL_HEADERS } from "./types.js";
|
|
5
|
+
export { extractCredentials, hasCredentials } from "./extractor.js";
|
|
6
|
+
export { ClientFactory } from "./client-factory.js";
|
|
7
|
+
export { runWithCredentials, getRequestCredentials, hasRequestContext } from "./context.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/credentials/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,aAAa,EAA0C,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-request credential types
|
|
3
|
+
*/
|
|
4
|
+
export interface ServiceCredentials {
|
|
5
|
+
url: string;
|
|
6
|
+
token: string;
|
|
7
|
+
}
|
|
8
|
+
export interface RequestCredentials {
|
|
9
|
+
jira?: ServiceCredentials;
|
|
10
|
+
confluence?: ServiceCredentials;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* HTTP header names for per-user credentials
|
|
14
|
+
*/
|
|
15
|
+
export declare const CREDENTIAL_HEADERS: {
|
|
16
|
+
readonly JIRA_URL: "x-jira-url";
|
|
17
|
+
readonly JIRA_TOKEN: "x-jira-token";
|
|
18
|
+
readonly CONFLUENCE_URL: "x-confluence-url";
|
|
19
|
+
readonly CONFLUENCE_TOKEN: "x-confluence-token";
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/credentials/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;CAKrB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-request credential types
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* HTTP header names for per-user credentials
|
|
6
|
+
*/
|
|
7
|
+
export const CREDENTIAL_HEADERS = {
|
|
8
|
+
JIRA_URL: "x-jira-url",
|
|
9
|
+
JIRA_TOKEN: "x-jira-token",
|
|
10
|
+
CONFLUENCE_URL: "x-confluence-url",
|
|
11
|
+
CONFLUENCE_TOKEN: "x-confluence-token",
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/credentials/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ,EAAE,YAAY;IACtB,UAAU,EAAE,cAAc;IAC1B,cAAc,EAAE,kBAAkB;IAClC,gBAAgB,EAAE,oBAAoB;CAC9B,CAAC"}
|