@crypto512/jicon-mcp 2.2.0 → 2.3.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/.env.example +2 -2
- package/README.md +16 -138
- package/TOOL_LIST.md +361 -296
- package/dist/config/constants.d.ts +15 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +19 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +7 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +38 -6
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +16 -0
- package/dist/config/types.js.map +1 -1
- package/dist/confluence/formatters.d.ts +20 -0
- package/dist/confluence/formatters.d.ts.map +1 -1
- package/dist/confluence/formatters.js +74 -8
- package/dist/confluence/formatters.js.map +1 -1
- package/dist/confluence/tools.d.ts +8 -7
- package/dist/confluence/tools.d.ts.map +1 -1
- package/dist/confluence/tools.js +52 -31
- package/dist/confluence/tools.js.map +1 -1
- package/dist/credentials/extractor.d.ts +1 -2
- package/dist/credentials/extractor.d.ts.map +1 -1
- package/dist/credentials/extractor.js +21 -4
- package/dist/credentials/extractor.js.map +1 -1
- package/dist/credentials/index.d.ts +3 -2
- package/dist/credentials/index.d.ts.map +1 -1
- package/dist/credentials/index.js +3 -2
- package/dist/credentials/index.js.map +1 -1
- package/dist/index.js +43 -20
- package/dist/index.js.map +1 -1
- package/dist/jira/activity-tools.d.ts +8 -11
- package/dist/jira/activity-tools.d.ts.map +1 -1
- package/dist/jira/activity-tools.js +91 -27
- package/dist/jira/activity-tools.js.map +1 -1
- package/dist/jira/client.d.ts +12 -0
- package/dist/jira/client.d.ts.map +1 -1
- package/dist/jira/client.js +35 -0
- package/dist/jira/client.js.map +1 -1
- package/dist/jira/formatters.d.ts +58 -0
- package/dist/jira/formatters.d.ts.map +1 -1
- package/dist/jira/formatters.js +80 -11
- package/dist/jira/formatters.js.map +1 -1
- package/dist/jira/tools.d.ts +30 -12
- package/dist/jira/tools.d.ts.map +1 -1
- package/dist/jira/tools.js +127 -37
- package/dist/jira/tools.js.map +1 -1
- package/dist/permissions/tool-registry.d.ts +6 -6
- package/dist/permissions/tool-registry.d.ts.map +1 -1
- package/dist/permissions/tool-registry.js +4 -3
- package/dist/permissions/tool-registry.js.map +1 -1
- package/dist/session/context.d.ts +81 -0
- package/dist/session/context.d.ts.map +1 -0
- package/dist/session/context.js +107 -0
- package/dist/session/context.js.map +1 -0
- package/dist/session/index.d.ts +12 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +22 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +155 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +285 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/tempo/client.d.ts +14 -0
- package/dist/tempo/client.d.ts.map +1 -1
- package/dist/tempo/client.js +55 -0
- package/dist/tempo/client.js.map +1 -1
- package/dist/tempo/formatters.d.ts +13 -0
- package/dist/tempo/formatters.d.ts.map +1 -1
- package/dist/tempo/formatters.js +106 -20
- package/dist/tempo/formatters.js.map +1 -1
- package/dist/tempo/tools.d.ts +10 -9
- package/dist/tempo/tools.d.ts.map +1 -1
- package/dist/tempo/tools.js +188 -33
- package/dist/tempo/tools.js.map +1 -1
- package/dist/tempo/types.d.ts +20 -6
- package/dist/tempo/types.d.ts.map +1 -1
- package/dist/transport/http.d.ts +20 -3
- package/dist/transport/http.d.ts.map +1 -1
- package/dist/transport/http.js +171 -15
- package/dist/transport/http.js.map +1 -1
- package/dist/transport/types.d.ts +2 -0
- package/dist/transport/types.d.ts.map +1 -1
- package/dist/transport/types.js.map +1 -1
- package/dist/utils/buffer-tools.d.ts +46 -722
- package/dist/utils/buffer-tools.d.ts.map +1 -1
- package/dist/utils/buffer-tools.js +303 -158
- package/dist/utils/buffer-tools.js.map +1 -1
- package/dist/utils/content-buffer.d.ts +10 -31
- package/dist/utils/content-buffer.d.ts.map +1 -1
- package/dist/utils/content-buffer.js +12 -86
- package/dist/utils/content-buffer.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 +163 -101
- package/dist/utils/jicon-help.js.map +1 -1
- package/dist/utils/plantuml/tools.d.ts.map +1 -1
- package/dist/utils/plantuml/tools.js +8 -7
- package/dist/utils/plantuml/tools.js.map +1 -1
- package/dist/utils/response-formatter.d.ts +12 -2
- package/dist/utils/response-formatter.d.ts.map +1 -1
- package/dist/utils/response-formatter.js +85 -13
- package/dist/utils/response-formatter.js.map +1 -1
- package/dist/utils/sandbox/formatters.d.ts +25 -0
- package/dist/utils/sandbox/formatters.d.ts.map +1 -0
- package/dist/utils/sandbox/formatters.js +690 -0
- package/dist/utils/sandbox/formatters.js.map +1 -0
- package/dist/utils/sandbox/helpers.d.ts +16 -0
- package/dist/utils/sandbox/helpers.d.ts.map +1 -0
- package/dist/utils/sandbox/helpers.js +252 -0
- package/dist/utils/sandbox/helpers.js.map +1 -0
- package/dist/utils/sandbox/index.d.ts +19 -0
- package/dist/utils/sandbox/index.d.ts.map +1 -0
- package/dist/utils/sandbox/index.js +269 -0
- package/dist/utils/sandbox/index.js.map +1 -0
- package/dist/utils/sandbox/schema.d.ts +55 -0
- package/dist/utils/sandbox/schema.d.ts.map +1 -0
- package/dist/utils/sandbox/schema.js +39 -0
- package/dist/utils/sandbox/schema.js.map +1 -0
- package/dist/utils/sandbox/types.d.ts +179 -0
- package/dist/utils/sandbox/types.d.ts.map +1 -0
- package/dist/utils/sandbox/types.js +8 -0
- package/dist/utils/sandbox/types.js.map +1 -0
- package/dist/utils/schemas/confluence.d.ts +41 -0
- package/dist/utils/schemas/confluence.d.ts.map +1 -0
- package/dist/utils/schemas/confluence.js +105 -0
- package/dist/utils/schemas/confluence.js.map +1 -0
- package/dist/utils/schemas/index.d.ts +66 -0
- package/dist/utils/schemas/index.d.ts.map +1 -0
- package/dist/utils/schemas/index.js +107 -0
- package/dist/utils/schemas/index.js.map +1 -0
- package/dist/utils/schemas/jira.d.ts +49 -0
- package/dist/utils/schemas/jira.d.ts.map +1 -0
- package/dist/utils/schemas/jira.js +151 -0
- package/dist/utils/schemas/jira.js.map +1 -0
- package/dist/utils/schemas/tempo.d.ts +29 -0
- package/dist/utils/schemas/tempo.d.ts.map +1 -0
- package/dist/utils/schemas/tempo.js +72 -0
- package/dist/utils/schemas/tempo.js.map +1 -0
- package/dist/utils/xhtml/error-locator.js +5 -5
- package/dist/utils/xhtml/error-locator.js.map +1 -1
- package/package.json +10 -9
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager for MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Manages session lifecycle with per-session:
|
|
5
|
+
* - Content buffers (isolated from other sessions)
|
|
6
|
+
* - API clients (with their caches)
|
|
7
|
+
* - Write-home validators
|
|
8
|
+
*
|
|
9
|
+
* Sessions are created on first request with credentials and automatically
|
|
10
|
+
* cleaned up after 30 minutes of inactivity.
|
|
11
|
+
*/
|
|
12
|
+
import { ContentBuffer } from "../utils/content-buffer.js";
|
|
13
|
+
import type { RequestCredentials } from "../credentials/types.js";
|
|
14
|
+
import { JiraClient } from "../jira/client.js";
|
|
15
|
+
import { ConfluenceClient } from "../confluence/client.js";
|
|
16
|
+
import { TempoClient } from "../tempo/client.js";
|
|
17
|
+
import { WriteHomeValidator } from "../permissions/write-home-validator.js";
|
|
18
|
+
import type { ApiConfig } from "../types.js";
|
|
19
|
+
/**
|
|
20
|
+
* Per-session API clients with their caches
|
|
21
|
+
*/
|
|
22
|
+
export interface SessionClients {
|
|
23
|
+
jira: JiraClient | null;
|
|
24
|
+
confluence: ConfluenceClient | null;
|
|
25
|
+
tempo: TempoClient | null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Session data stored by the manager
|
|
29
|
+
*/
|
|
30
|
+
export interface SessionData {
|
|
31
|
+
sessionId: string;
|
|
32
|
+
credentials: RequestCredentials;
|
|
33
|
+
buffer: ContentBuffer;
|
|
34
|
+
clients: SessionClients;
|
|
35
|
+
writeHomeValidator: WriteHomeValidator | null;
|
|
36
|
+
createdAt: number;
|
|
37
|
+
lastActivity: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Configuration for the session manager
|
|
41
|
+
*/
|
|
42
|
+
export interface SessionManagerConfig {
|
|
43
|
+
/** Default Jira configuration (from environment) */
|
|
44
|
+
defaultJiraConfig: ApiConfig | null;
|
|
45
|
+
/** Default Confluence configuration (from environment) */
|
|
46
|
+
defaultConfluenceConfig: ApiConfig | null;
|
|
47
|
+
/** Whether write-home restriction is enabled */
|
|
48
|
+
writeHomeEnabled: boolean;
|
|
49
|
+
/** Session timeout in milliseconds (default: 30 minutes) */
|
|
50
|
+
sessionTimeoutMs?: number;
|
|
51
|
+
/** Cleanup interval in milliseconds (default: 5 minutes) */
|
|
52
|
+
cleanupIntervalMs?: number;
|
|
53
|
+
/** Maximum buffers per session (default: 50) */
|
|
54
|
+
maxBuffersPerSession?: number;
|
|
55
|
+
/** Maximum concurrent sessions (default: 1000, DoS protection) */
|
|
56
|
+
maxSessions?: number;
|
|
57
|
+
/** Callback when a session is destroyed (for transport cleanup coordination) */
|
|
58
|
+
onSessionDestroyed?: (sessionId: string) => void;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Session Manager
|
|
62
|
+
*
|
|
63
|
+
* Manages per-session state including:
|
|
64
|
+
* - ContentBuffer instances (isolated per session)
|
|
65
|
+
* - API clients with their caches
|
|
66
|
+
* - WriteHomeValidator instances
|
|
67
|
+
* - Automatic cleanup of stale sessions
|
|
68
|
+
*/
|
|
69
|
+
export declare class SessionManager {
|
|
70
|
+
private sessions;
|
|
71
|
+
private cleanupInterval;
|
|
72
|
+
private config;
|
|
73
|
+
private sessionTimeoutMs;
|
|
74
|
+
private maxSessions;
|
|
75
|
+
private onSessionDestroyed?;
|
|
76
|
+
constructor(config: SessionManagerConfig);
|
|
77
|
+
/**
|
|
78
|
+
* Create a new session with the given credentials
|
|
79
|
+
* @throws Error if maximum sessions limit reached (DoS protection)
|
|
80
|
+
*/
|
|
81
|
+
createSession(sessionId: string, credentials: RequestCredentials): SessionData;
|
|
82
|
+
/**
|
|
83
|
+
* Get an existing session by ID
|
|
84
|
+
* Updates the lastActivity timestamp on access
|
|
85
|
+
*/
|
|
86
|
+
getSession(sessionId: string): SessionData | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Get or create a session
|
|
89
|
+
* If session exists, returns it (and updates lastActivity)
|
|
90
|
+
* If session doesn't exist, creates it with the given credentials
|
|
91
|
+
*
|
|
92
|
+
* If existing session has no clients but new credentials are provided,
|
|
93
|
+
* updates the clients in-place (preserving session/transport).
|
|
94
|
+
*/
|
|
95
|
+
getOrCreateSession(sessionId: string, credentials: RequestCredentials): SessionData;
|
|
96
|
+
/**
|
|
97
|
+
* Update session clients in-place when new credentials are provided
|
|
98
|
+
* This preserves the session and its transport connection
|
|
99
|
+
*/
|
|
100
|
+
private updateSessionClients;
|
|
101
|
+
/**
|
|
102
|
+
* Destroy a session and clean up its resources
|
|
103
|
+
* Also triggers onSessionDestroyed callback for transport cleanup
|
|
104
|
+
*/
|
|
105
|
+
destroySession(sessionId: string): void;
|
|
106
|
+
/**
|
|
107
|
+
* Clean up sessions that have been inactive for longer than the timeout
|
|
108
|
+
*/
|
|
109
|
+
private cleanupStaleSessions;
|
|
110
|
+
/**
|
|
111
|
+
* Get the number of active sessions
|
|
112
|
+
*/
|
|
113
|
+
getSessionCount(): number;
|
|
114
|
+
/**
|
|
115
|
+
* Get the maximum sessions limit
|
|
116
|
+
*/
|
|
117
|
+
getMaxSessions(): number;
|
|
118
|
+
/**
|
|
119
|
+
* Set the callback for when a session is destroyed
|
|
120
|
+
* Used by HTTP transport for coordinated transport cleanup
|
|
121
|
+
*/
|
|
122
|
+
setSessionDestroyedCallback(callback: (sessionId: string) => void): void;
|
|
123
|
+
/**
|
|
124
|
+
* Shutdown the session manager
|
|
125
|
+
* Destroys all sessions and stops the cleanup interval
|
|
126
|
+
*/
|
|
127
|
+
shutdown(): void;
|
|
128
|
+
/**
|
|
129
|
+
* Resolve Jira configuration from credentials or defaults
|
|
130
|
+
*/
|
|
131
|
+
private resolveJiraConfig;
|
|
132
|
+
/**
|
|
133
|
+
* Resolve Confluence configuration from credentials or defaults
|
|
134
|
+
*/
|
|
135
|
+
private resolveConfluenceConfig;
|
|
136
|
+
/**
|
|
137
|
+
* Convert service credentials to ApiConfig format
|
|
138
|
+
*/
|
|
139
|
+
private toApiConfig;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Initialize the session manager singleton
|
|
143
|
+
* Must be called once during server startup
|
|
144
|
+
*/
|
|
145
|
+
export declare function initializeSessionManager(config: SessionManagerConfig): SessionManager;
|
|
146
|
+
/**
|
|
147
|
+
* Get the session manager singleton
|
|
148
|
+
* Throws if not initialized
|
|
149
|
+
*/
|
|
150
|
+
export declare function getSessionManager(): SessionManager;
|
|
151
|
+
/**
|
|
152
|
+
* Shutdown the session manager singleton
|
|
153
|
+
*/
|
|
154
|
+
export declare function shutdownSessionManager(): void;
|
|
155
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager for MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Manages session lifecycle with per-session:
|
|
5
|
+
* - Content buffers (isolated from other sessions)
|
|
6
|
+
* - API clients (with their caches)
|
|
7
|
+
* - Write-home validators
|
|
8
|
+
*
|
|
9
|
+
* Sessions are created on first request with credentials and automatically
|
|
10
|
+
* cleaned up after 30 minutes of inactivity.
|
|
11
|
+
*/
|
|
12
|
+
import { ContentBuffer } from "../utils/content-buffer.js";
|
|
13
|
+
import { JiraClient } from "../jira/client.js";
|
|
14
|
+
import { ConfluenceClient } from "../confluence/client.js";
|
|
15
|
+
import { TempoClient } from "../tempo/client.js";
|
|
16
|
+
import { WriteHomeValidator } from "../permissions/write-home-validator.js";
|
|
17
|
+
// Import defaults from config constants (single source of truth)
|
|
18
|
+
import { DEFAULT_SESSION_TIMEOUT_MS, DEFAULT_MAX_SESSIONS, DEFAULT_MAX_BUFFERS } from "../config/constants.js";
|
|
19
|
+
/** Default cleanup interval: 5 minutes */
|
|
20
|
+
const DEFAULT_CLEANUP_INTERVAL_MS = 5 * 60 * 1000;
|
|
21
|
+
/**
|
|
22
|
+
* Session Manager
|
|
23
|
+
*
|
|
24
|
+
* Manages per-session state including:
|
|
25
|
+
* - ContentBuffer instances (isolated per session)
|
|
26
|
+
* - API clients with their caches
|
|
27
|
+
* - WriteHomeValidator instances
|
|
28
|
+
* - Automatic cleanup of stale sessions
|
|
29
|
+
*/
|
|
30
|
+
export class SessionManager {
|
|
31
|
+
sessions = new Map();
|
|
32
|
+
cleanupInterval = null;
|
|
33
|
+
config;
|
|
34
|
+
sessionTimeoutMs;
|
|
35
|
+
maxSessions;
|
|
36
|
+
onSessionDestroyed;
|
|
37
|
+
constructor(config) {
|
|
38
|
+
this.config = config;
|
|
39
|
+
this.sessionTimeoutMs = config.sessionTimeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS;
|
|
40
|
+
this.maxSessions = config.maxSessions ?? DEFAULT_MAX_SESSIONS;
|
|
41
|
+
this.onSessionDestroyed = config.onSessionDestroyed;
|
|
42
|
+
// Start periodic cleanup
|
|
43
|
+
const cleanupMs = config.cleanupIntervalMs ?? DEFAULT_CLEANUP_INTERVAL_MS;
|
|
44
|
+
this.cleanupInterval = setInterval(() => this.cleanupStaleSessions(), cleanupMs);
|
|
45
|
+
// Ensure cleanup interval doesn't prevent process exit
|
|
46
|
+
if (this.cleanupInterval.unref) {
|
|
47
|
+
this.cleanupInterval.unref();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create a new session with the given credentials
|
|
52
|
+
* @throws Error if maximum sessions limit reached (DoS protection)
|
|
53
|
+
*/
|
|
54
|
+
createSession(sessionId, credentials) {
|
|
55
|
+
// DoS protection: limit concurrent sessions
|
|
56
|
+
if (this.sessions.size >= this.maxSessions) {
|
|
57
|
+
throw new Error(`Maximum sessions limit reached (${this.maxSessions}). ` +
|
|
58
|
+
"Try again later or contact administrator.");
|
|
59
|
+
}
|
|
60
|
+
const now = Date.now();
|
|
61
|
+
const maxBuffers = this.config.maxBuffersPerSession ?? DEFAULT_MAX_BUFFERS;
|
|
62
|
+
// Create per-session clients
|
|
63
|
+
// Use per-request credentials if available, else fall back to defaults
|
|
64
|
+
const jiraConfig = this.resolveJiraConfig(credentials);
|
|
65
|
+
const confluenceConfig = this.resolveConfluenceConfig(credentials);
|
|
66
|
+
const clients = {
|
|
67
|
+
jira: jiraConfig ? new JiraClient(jiraConfig) : null,
|
|
68
|
+
confluence: confluenceConfig ? new ConfluenceClient(confluenceConfig) : null,
|
|
69
|
+
tempo: jiraConfig ? new TempoClient(jiraConfig) : null, // Tempo uses Jira auth
|
|
70
|
+
};
|
|
71
|
+
// Create write-home validator if Confluence available and write-home mode enabled
|
|
72
|
+
const writeHomeValidator = clients.confluence && this.config.writeHomeEnabled
|
|
73
|
+
? new WriteHomeValidator(clients.confluence)
|
|
74
|
+
: null;
|
|
75
|
+
const session = {
|
|
76
|
+
sessionId,
|
|
77
|
+
credentials,
|
|
78
|
+
buffer: new ContentBuffer({ maxBuffers }),
|
|
79
|
+
clients,
|
|
80
|
+
writeHomeValidator,
|
|
81
|
+
createdAt: now,
|
|
82
|
+
lastActivity: now,
|
|
83
|
+
};
|
|
84
|
+
this.sessions.set(sessionId, session);
|
|
85
|
+
const jiraUrl = jiraConfig?.url || "not configured";
|
|
86
|
+
const confluenceUrl = confluenceConfig?.url || "not configured";
|
|
87
|
+
console.error(`Session created: ${sessionId} (jira: ${jiraUrl}, confluence: ${confluenceUrl})`);
|
|
88
|
+
return session;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get an existing session by ID
|
|
92
|
+
* Updates the lastActivity timestamp on access
|
|
93
|
+
*/
|
|
94
|
+
getSession(sessionId) {
|
|
95
|
+
const session = this.sessions.get(sessionId);
|
|
96
|
+
if (session) {
|
|
97
|
+
session.lastActivity = Date.now();
|
|
98
|
+
}
|
|
99
|
+
return session;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get or create a session
|
|
103
|
+
* If session exists, returns it (and updates lastActivity)
|
|
104
|
+
* If session doesn't exist, creates it with the given credentials
|
|
105
|
+
*
|
|
106
|
+
* If existing session has no clients but new credentials are provided,
|
|
107
|
+
* updates the clients in-place (preserving session/transport).
|
|
108
|
+
*/
|
|
109
|
+
getOrCreateSession(sessionId, credentials) {
|
|
110
|
+
const existing = this.getSession(sessionId);
|
|
111
|
+
if (existing) {
|
|
112
|
+
// Check if credentials have changed and we need to update clients
|
|
113
|
+
const hasNewJira = credentials.jira && !existing.clients.jira;
|
|
114
|
+
const hasNewConfluence = credentials.confluence && !existing.clients.confluence;
|
|
115
|
+
if (hasNewJira || hasNewConfluence) {
|
|
116
|
+
// Update clients in-place (don't destroy session - that would close the transport!)
|
|
117
|
+
console.error(`Session ${sessionId}: credentials updated, updating clients in-place`);
|
|
118
|
+
this.updateSessionClients(existing, credentials);
|
|
119
|
+
}
|
|
120
|
+
return existing;
|
|
121
|
+
}
|
|
122
|
+
return this.createSession(sessionId, credentials);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Update session clients in-place when new credentials are provided
|
|
126
|
+
* This preserves the session and its transport connection
|
|
127
|
+
*/
|
|
128
|
+
updateSessionClients(session, credentials) {
|
|
129
|
+
// Update Jira client if new credentials provided
|
|
130
|
+
if (credentials.jira && !session.clients.jira) {
|
|
131
|
+
const jiraConfig = this.toApiConfig(credentials.jira);
|
|
132
|
+
session.clients.jira = new JiraClient(jiraConfig);
|
|
133
|
+
session.clients.tempo = new TempoClient(jiraConfig); // Tempo uses Jira auth
|
|
134
|
+
console.error(`Session ${session.sessionId}: Jira client created (${jiraConfig.url})`);
|
|
135
|
+
}
|
|
136
|
+
// Update Confluence client if new credentials provided
|
|
137
|
+
if (credentials.confluence && !session.clients.confluence) {
|
|
138
|
+
const confluenceConfig = this.toApiConfig(credentials.confluence);
|
|
139
|
+
session.clients.confluence = new ConfluenceClient(confluenceConfig);
|
|
140
|
+
console.error(`Session ${session.sessionId}: Confluence client created (${confluenceConfig.url})`);
|
|
141
|
+
// Create write-home validator if write-home mode enabled
|
|
142
|
+
if (this.config.writeHomeEnabled && !session.writeHomeValidator) {
|
|
143
|
+
session.writeHomeValidator = new WriteHomeValidator(session.clients.confluence);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Update stored credentials (merge with existing)
|
|
147
|
+
session.credentials = {
|
|
148
|
+
jira: credentials.jira || session.credentials.jira,
|
|
149
|
+
confluence: credentials.confluence || session.credentials.confluence,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Destroy a session and clean up its resources
|
|
154
|
+
* Also triggers onSessionDestroyed callback for transport cleanup
|
|
155
|
+
*/
|
|
156
|
+
destroySession(sessionId) {
|
|
157
|
+
const session = this.sessions.get(sessionId);
|
|
158
|
+
if (session) {
|
|
159
|
+
// Clean up the buffer (stops cleanup interval, clears all buffers)
|
|
160
|
+
session.buffer.destroy();
|
|
161
|
+
this.sessions.delete(sessionId);
|
|
162
|
+
console.error(`Session destroyed: ${sessionId}`);
|
|
163
|
+
// Notify transport layer for coordinated cleanup (fix: issue #7)
|
|
164
|
+
if (this.onSessionDestroyed) {
|
|
165
|
+
try {
|
|
166
|
+
this.onSessionDestroyed(sessionId);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
console.error(`Error in onSessionDestroyed callback for ${sessionId}:`, err);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Clean up sessions that have been inactive for longer than the timeout
|
|
176
|
+
*/
|
|
177
|
+
cleanupStaleSessions() {
|
|
178
|
+
const now = Date.now();
|
|
179
|
+
for (const [sessionId, session] of this.sessions) {
|
|
180
|
+
const inactiveMs = now - session.lastActivity;
|
|
181
|
+
if (inactiveMs > this.sessionTimeoutMs) {
|
|
182
|
+
const inactiveMin = Math.round(inactiveMs / 60000);
|
|
183
|
+
console.error(`Session timeout: ${sessionId} (inactive ${inactiveMin}min)`);
|
|
184
|
+
this.destroySession(sessionId);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get the number of active sessions
|
|
190
|
+
*/
|
|
191
|
+
getSessionCount() {
|
|
192
|
+
return this.sessions.size;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get the maximum sessions limit
|
|
196
|
+
*/
|
|
197
|
+
getMaxSessions() {
|
|
198
|
+
return this.maxSessions;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Set the callback for when a session is destroyed
|
|
202
|
+
* Used by HTTP transport for coordinated transport cleanup
|
|
203
|
+
*/
|
|
204
|
+
setSessionDestroyedCallback(callback) {
|
|
205
|
+
this.onSessionDestroyed = callback;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Shutdown the session manager
|
|
209
|
+
* Destroys all sessions and stops the cleanup interval
|
|
210
|
+
*/
|
|
211
|
+
shutdown() {
|
|
212
|
+
if (this.cleanupInterval) {
|
|
213
|
+
clearInterval(this.cleanupInterval);
|
|
214
|
+
this.cleanupInterval = null;
|
|
215
|
+
}
|
|
216
|
+
// Destroy all sessions
|
|
217
|
+
for (const sessionId of this.sessions.keys()) {
|
|
218
|
+
this.destroySession(sessionId);
|
|
219
|
+
}
|
|
220
|
+
console.error("Session manager shutdown complete");
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Resolve Jira configuration from credentials or defaults
|
|
224
|
+
*/
|
|
225
|
+
resolveJiraConfig(credentials) {
|
|
226
|
+
if (credentials.jira) {
|
|
227
|
+
return this.toApiConfig(credentials.jira);
|
|
228
|
+
}
|
|
229
|
+
return this.config.defaultJiraConfig;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Resolve Confluence configuration from credentials or defaults
|
|
233
|
+
*/
|
|
234
|
+
resolveConfluenceConfig(credentials) {
|
|
235
|
+
if (credentials.confluence) {
|
|
236
|
+
return this.toApiConfig(credentials.confluence);
|
|
237
|
+
}
|
|
238
|
+
return this.config.defaultConfluenceConfig;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Convert service credentials to ApiConfig format
|
|
242
|
+
*/
|
|
243
|
+
toApiConfig(creds) {
|
|
244
|
+
return {
|
|
245
|
+
url: creds.url,
|
|
246
|
+
token: creds.token,
|
|
247
|
+
// Per-request credentials use bearer auth (PAT style)
|
|
248
|
+
authType: "bearer",
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Singleton instance - initialized by the main entry point
|
|
253
|
+
let sessionManagerInstance = null;
|
|
254
|
+
/**
|
|
255
|
+
* Initialize the session manager singleton
|
|
256
|
+
* Must be called once during server startup
|
|
257
|
+
*/
|
|
258
|
+
export function initializeSessionManager(config) {
|
|
259
|
+
if (sessionManagerInstance) {
|
|
260
|
+
console.error("Warning: Session manager already initialized, reinitializing...");
|
|
261
|
+
sessionManagerInstance.shutdown();
|
|
262
|
+
}
|
|
263
|
+
sessionManagerInstance = new SessionManager(config);
|
|
264
|
+
return sessionManagerInstance;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Get the session manager singleton
|
|
268
|
+
* Throws if not initialized
|
|
269
|
+
*/
|
|
270
|
+
export function getSessionManager() {
|
|
271
|
+
if (!sessionManagerInstance) {
|
|
272
|
+
throw new Error("Session manager not initialized. Call initializeSessionManager() first.");
|
|
273
|
+
}
|
|
274
|
+
return sessionManagerInstance;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Shutdown the session manager singleton
|
|
278
|
+
*/
|
|
279
|
+
export function shutdownSessionManager() {
|
|
280
|
+
if (sessionManagerInstance) {
|
|
281
|
+
sessionManagerInstance.shutdown();
|
|
282
|
+
sessionManagerInstance = null;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/tempo/client.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ import type { TempoWorklog, TempoWorklogInput, TempoWorklogSearchResult, TempoAc
|
|
|
10
10
|
export declare class TempoClient {
|
|
11
11
|
private http;
|
|
12
12
|
private cachedCurrentUser;
|
|
13
|
+
private userDisplayNameCache;
|
|
13
14
|
constructor(config: ApiConfig);
|
|
14
15
|
private resolveIssueId;
|
|
15
16
|
private resolveProjectId;
|
|
@@ -41,5 +42,18 @@ export declare class TempoClient {
|
|
|
41
42
|
* Convenience method for tools that need just the workerKey
|
|
42
43
|
*/
|
|
43
44
|
getMyWorkerKey(): Promise<string>;
|
|
45
|
+
/**
|
|
46
|
+
* Resolve workerKey to displayName using Jira Data Center API
|
|
47
|
+
* Tempo DC v4 only returns workerKey, not displayName
|
|
48
|
+
* Results are cached to avoid repeated API calls
|
|
49
|
+
* @param workerKey - The worker key from Tempo (username or JIRAUSER key)
|
|
50
|
+
* @returns displayName if found, or workerKey as fallback
|
|
51
|
+
*/
|
|
52
|
+
resolveUserDisplayName(workerKey: string): Promise<string>;
|
|
53
|
+
/**
|
|
54
|
+
* Resolve multiple workerKeys to displayNames in parallel
|
|
55
|
+
* Uses persistent cache to avoid repeated API calls
|
|
56
|
+
*/
|
|
57
|
+
resolveUserDisplayNames(workerKeys: string[]): Promise<Map<string, string>>;
|
|
44
58
|
}
|
|
45
59
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/tempo/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,EACZ,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,iBAAiB,CAKT;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/tempo/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,EACZ,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,iBAAiB,CAKT;IAEhB,OAAO,CAAC,oBAAoB,CAAkC;gBAElD,MAAM,EAAE,SAAS;YAKf,cAAc;YAKd,gBAAgB;IAMxB,WAAW,CACf,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,wBAAwB,CAAC;IA6E9B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAMpD,OAAO,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IAiC9D,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACtC,OAAO,CAAC,YAAY,CAAC;IAgClB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAQtC,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAMrD,aAAa,CAAC,WAAW,EAAE;QAC/B,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;KAC5B,GAAG,OAAO,CAAC,YAAY,CAAC;IAQnB,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAQhC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAI3C,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,wBAAwB,CAAC;IA4B9B,eAAe,CACnB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC;IAqD9B,cAAc,IAAI,OAAO,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IAiBF;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAKvC;;;;;;OAMG;IACG,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BhE;;;OAGG;IACG,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAqBlF"}
|
package/dist/tempo/client.js
CHANGED
|
@@ -9,6 +9,8 @@ import { HttpClient } from "../utils/http-client.js";
|
|
|
9
9
|
export class TempoClient {
|
|
10
10
|
http;
|
|
11
11
|
cachedCurrentUser = null;
|
|
12
|
+
// Cache for resolved user display names (workerKey -> displayName)
|
|
13
|
+
userDisplayNameCache = new Map();
|
|
12
14
|
constructor(config) {
|
|
13
15
|
this.http = new HttpClient(config);
|
|
14
16
|
}
|
|
@@ -251,5 +253,58 @@ export class TempoClient {
|
|
|
251
253
|
const user = await this.getCurrentUser();
|
|
252
254
|
return user.key;
|
|
253
255
|
}
|
|
256
|
+
/**
|
|
257
|
+
* Resolve workerKey to displayName using Jira Data Center API
|
|
258
|
+
* Tempo DC v4 only returns workerKey, not displayName
|
|
259
|
+
* Results are cached to avoid repeated API calls
|
|
260
|
+
* @param workerKey - The worker key from Tempo (username or JIRAUSER key)
|
|
261
|
+
* @returns displayName if found, or workerKey as fallback
|
|
262
|
+
*/
|
|
263
|
+
async resolveUserDisplayName(workerKey) {
|
|
264
|
+
// Check cache first
|
|
265
|
+
if (this.userDisplayNameCache.has(workerKey)) {
|
|
266
|
+
return this.userDisplayNameCache.get(workerKey);
|
|
267
|
+
}
|
|
268
|
+
let displayName = workerKey; // Default fallback
|
|
269
|
+
try {
|
|
270
|
+
// Jira DC API: try with username parameter first (most common case)
|
|
271
|
+
const user = await this.http.get(`/rest/api/2/user?username=${encodeURIComponent(workerKey)}`);
|
|
272
|
+
displayName = user.displayName || user.name || workerKey;
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
// If username lookup fails, try with key parameter (for JIRAUSER format)
|
|
276
|
+
try {
|
|
277
|
+
const user = await this.http.get(`/rest/api/2/user?key=${encodeURIComponent(workerKey)}`);
|
|
278
|
+
displayName = user.displayName || user.name || workerKey;
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// User not found - use workerKey as fallback (already set)
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Cache the result
|
|
285
|
+
this.userDisplayNameCache.set(workerKey, displayName);
|
|
286
|
+
return displayName;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Resolve multiple workerKeys to displayNames in parallel
|
|
290
|
+
* Uses persistent cache to avoid repeated API calls
|
|
291
|
+
*/
|
|
292
|
+
async resolveUserDisplayNames(workerKeys) {
|
|
293
|
+
const uniqueKeys = [...new Set(workerKeys.filter(Boolean))];
|
|
294
|
+
const result = new Map();
|
|
295
|
+
// Identify keys that need resolution (not in cache)
|
|
296
|
+
const uncachedKeys = uniqueKeys.filter(key => !this.userDisplayNameCache.has(key));
|
|
297
|
+
// Resolve uncached keys in parallel batches (5 at a time to avoid rate limiting)
|
|
298
|
+
const batchSize = 5;
|
|
299
|
+
for (let i = 0; i < uncachedKeys.length; i += batchSize) {
|
|
300
|
+
const batch = uncachedKeys.slice(i, i + batchSize);
|
|
301
|
+
await Promise.all(batch.map(key => this.resolveUserDisplayName(key)));
|
|
302
|
+
}
|
|
303
|
+
// Build result map from cache
|
|
304
|
+
for (const key of uniqueKeys) {
|
|
305
|
+
result.set(key, this.userDisplayNameCache.get(key) || key);
|
|
306
|
+
}
|
|
307
|
+
return result;
|
|
308
|
+
}
|
|
254
309
|
}
|
|
255
310
|
//# sourceMappingURL=client.js.map
|
package/dist/tempo/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/tempo/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAUrD,MAAM,OAAO,WAAW;IACd,IAAI,CAAa;IACjB,iBAAiB,GAKd,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/tempo/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,4 +31,17 @@ export declare function formatTeam(team: TempoTeam): string;
|
|
|
31
31
|
* Format list of teams
|
|
32
32
|
*/
|
|
33
33
|
export declare function formatTeams(teams: TempoTeam[]): string;
|
|
34
|
+
/**
|
|
35
|
+
* Extract worklog metadata for buffered responses (matches tempo_worklog schema)
|
|
36
|
+
* Accepts enriched worklogs with optional workerKey (from mapping)
|
|
37
|
+
*/
|
|
38
|
+
export declare function formatWorklogMetadata(worklog: Record<string, unknown>): Record<string, unknown>;
|
|
39
|
+
/**
|
|
40
|
+
* Extract account metadata for buffered responses (matches tempo_account schema)
|
|
41
|
+
*/
|
|
42
|
+
export declare function formatAccountMetadata(account: TempoAccount): Record<string, unknown>;
|
|
43
|
+
/**
|
|
44
|
+
* Extract team metadata for buffered responses (matches tempo_team schema)
|
|
45
|
+
*/
|
|
46
|
+
export declare function formatTeamMetadata(team: TempoTeam): Record<string, unknown>;
|
|
34
47
|
//# sourceMappingURL=formatters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/tempo/formatters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,YAAY,EACZ,SAAS,EACV,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/tempo/formatters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,YAAY,EACZ,SAAS,EACV,MAAM,YAAY,CAAC;AAWpB;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6BrG;AAmBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAsD3D;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,wBAAwB,GAC/B,MAAM,CA0ER;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAwB3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAqB/D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAoClD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAoBtD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkB/F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUpF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAY3E"}
|