@crypto512/jicon-mcp 2.2.1 → 2.3.19
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/PROMPT.md +10 -28
- package/README.md +39 -6
- package/TOOL_LIST.md +542 -407
- package/dist/config/constants.d.ts +28 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +34 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +12 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +49 -6
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +18 -0
- package/dist/config/types.js.map +1 -1
- package/dist/confluence/client.d.ts.map +1 -1
- package/dist/confluence/client.js +7 -2
- package/dist/confluence/client.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 +16 -20
- package/dist/confluence/tools.d.ts.map +1 -1
- package/dist/confluence/tools.js +71 -68
- package/dist/confluence/tools.js.map +1 -1
- package/dist/credentials/extractor.d.ts +15 -5
- package/dist/credentials/extractor.d.ts.map +1 -1
- package/dist/credentials/extractor.js +99 -12
- package/dist/credentials/extractor.js.map +1 -1
- package/dist/credentials/index.d.ts +4 -3
- 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/credentials/types.d.ts +22 -0
- package/dist/credentials/types.d.ts.map +1 -1
- package/dist/credentials/types.js.map +1 -1
- package/dist/index.js +211 -176
- package/dist/index.js.map +1 -1
- package/dist/jira/activity-tools.d.ts +8 -15
- package/dist/jira/activity-tools.d.ts.map +1 -1
- package/dist/jira/activity-tools.js +131 -90
- package/dist/jira/activity-tools.js.map +1 -1
- package/dist/jira/client.d.ts +24 -0
- package/dist/jira/client.d.ts.map +1 -1
- package/dist/jira/client.js +65 -6
- package/dist/jira/client.js.map +1 -1
- package/dist/jira/formatters.d.ts +61 -0
- package/dist/jira/formatters.d.ts.map +1 -1
- package/dist/jira/formatters.js +83 -11
- package/dist/jira/formatters.js.map +1 -1
- package/dist/jira/tools.d.ts +78 -26
- package/dist/jira/tools.d.ts.map +1 -1
- package/dist/jira/tools.js +293 -130
- package/dist/jira/tools.js.map +1 -1
- package/dist/permissions/filter.d.ts.map +1 -1
- package/dist/permissions/filter.js +8 -4
- package/dist/permissions/filter.js.map +1 -1
- package/dist/permissions/tool-registry.d.ts +15 -13
- package/dist/permissions/tool-registry.d.ts.map +1 -1
- package/dist/permissions/tool-registry.js +19 -10
- 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 +186 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +383 -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 +57 -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 +14 -13
- package/dist/tempo/tools.d.ts.map +1 -1
- package/dist/tempo/tools.js +203 -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 +21 -5
- package/dist/transport/http.d.ts.map +1 -1
- package/dist/transport/http.js +193 -22
- package/dist/transport/http.js.map +1 -1
- package/dist/transport/index.d.ts +7 -2
- package/dist/transport/index.d.ts.map +1 -1
- package/dist/transport/index.js +10 -4
- package/dist/transport/index.js.map +1 -1
- package/dist/utils/buffer-tools.d.ts +48 -724
- package/dist/utils/buffer-tools.d.ts.map +1 -1
- package/dist/utils/buffer-tools.js +337 -170
- 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/http-client.d.ts.map +1 -1
- package/dist/utils/http-client.js +99 -2
- package/dist/utils/http-client.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 +164 -312
- package/dist/utils/jicon-help.js.map +1 -1
- package/dist/utils/logger.d.ts +43 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +102 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/plantuml/tools.d.ts.map +1 -1
- package/dist/utils/plantuml/tools.js +10 -9
- package/dist/utils/plantuml/tools.js.map +1 -1
- package/dist/utils/response-formatter.d.ts +20 -2
- package/dist/utils/response-formatter.d.ts.map +1 -1
- package/dist/utils/response-formatter.js +147 -17
- 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 +77 -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 +153 -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/whoami-tools.d.ts +17 -0
- package/dist/utils/whoami-tools.d.ts.map +1 -0
- package/dist/utils/whoami-tools.js +90 -0
- package/dist/utils/whoami-tools.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
- package/dist/credentials/client-factory.d.ts +0 -64
- package/dist/credentials/client-factory.d.ts.map +0 -1
- package/dist/credentials/client-factory.js +0 -110
- package/dist/credentials/client-factory.js.map +0 -1
- package/dist/credentials/context.d.ts +0 -25
- package/dist/credentials/context.d.ts.map +0 -1
- package/dist/credentials/context.js +0 -35
- package/dist/credentials/context.js.map +0 -1
- package/dist/utils/buffer-pipeline/index.d.ts +0 -30
- package/dist/utils/buffer-pipeline/index.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/index.js +0 -317
- package/dist/utils/buffer-pipeline/index.js.map +0 -1
- package/dist/utils/buffer-pipeline/output/csv.d.ts +0 -20
- package/dist/utils/buffer-pipeline/output/csv.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/output/csv.js +0 -117
- package/dist/utils/buffer-pipeline/output/csv.js.map +0 -1
- package/dist/utils/buffer-pipeline/output/json.d.ts +0 -16
- package/dist/utils/buffer-pipeline/output/json.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/output/json.js +0 -48
- package/dist/utils/buffer-pipeline/output/json.js.map +0 -1
- package/dist/utils/buffer-pipeline/output/markdown.d.ts +0 -15
- package/dist/utils/buffer-pipeline/output/markdown.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/output/markdown.js +0 -105
- package/dist/utils/buffer-pipeline/output/markdown.js.map +0 -1
- package/dist/utils/buffer-pipeline/output/xhtml-list.d.ts +0 -16
- package/dist/utils/buffer-pipeline/output/xhtml-list.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/output/xhtml-list.js +0 -81
- package/dist/utils/buffer-pipeline/output/xhtml-list.js.map +0 -1
- package/dist/utils/buffer-pipeline/output/xhtml-table.d.ts +0 -15
- package/dist/utils/buffer-pipeline/output/xhtml-table.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/output/xhtml-table.js +0 -176
- package/dist/utils/buffer-pipeline/output/xhtml-table.js.map +0 -1
- package/dist/utils/buffer-pipeline/schema.d.ts +0 -1878
- package/dist/utils/buffer-pipeline/schema.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/schema.js +0 -168
- package/dist/utils/buffer-pipeline/schema.js.map +0 -1
- package/dist/utils/buffer-pipeline/stages/filter.d.ts +0 -32
- package/dist/utils/buffer-pipeline/stages/filter.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/stages/filter.js +0 -208
- package/dist/utils/buffer-pipeline/stages/filter.js.map +0 -1
- package/dist/utils/buffer-pipeline/stages/format.d.ts +0 -45
- package/dist/utils/buffer-pipeline/stages/format.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/stages/format.js +0 -160
- package/dist/utils/buffer-pipeline/stages/format.js.map +0 -1
- package/dist/utils/buffer-pipeline/stages/group-by.d.ts +0 -25
- package/dist/utils/buffer-pipeline/stages/group-by.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/stages/group-by.js +0 -190
- package/dist/utils/buffer-pipeline/stages/group-by.js.map +0 -1
- package/dist/utils/buffer-pipeline/stages/select.d.ts +0 -54
- package/dist/utils/buffer-pipeline/stages/select.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/stages/select.js +0 -228
- package/dist/utils/buffer-pipeline/stages/select.js.map +0 -1
- package/dist/utils/buffer-pipeline/stages/sort.d.ts +0 -20
- package/dist/utils/buffer-pipeline/stages/sort.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/stages/sort.js +0 -96
- package/dist/utils/buffer-pipeline/stages/sort.js.map +0 -1
- package/dist/utils/buffer-pipeline/types.d.ts +0 -277
- package/dist/utils/buffer-pipeline/types.d.ts.map +0 -1
- package/dist/utils/buffer-pipeline/types.js +0 -8
- package/dist/utils/buffer-pipeline/types.js.map +0 -1
- package/dist/utils/plantuml/docker-manager.d.ts +0 -37
- package/dist/utils/plantuml/docker-manager.d.ts.map +0 -1
- package/dist/utils/plantuml/docker-manager.js +0 -284
- package/dist/utils/plantuml/docker-manager.js.map +0 -1
|
@@ -0,0 +1,383 @@
|
|
|
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 1 hour 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 { log, error as logError } from "../utils/logger.js";
|
|
18
|
+
import { DEFAULT_SESSION_TIMEOUT_MS, DEFAULT_MAX_SESSIONS, DEFAULT_MAX_BUFFERS, } from "../config/constants.js";
|
|
19
|
+
/**
|
|
20
|
+
* Session Manager
|
|
21
|
+
*
|
|
22
|
+
* Manages per-session state including:
|
|
23
|
+
* - ContentBuffer instances (isolated per session)
|
|
24
|
+
* - API clients with their caches
|
|
25
|
+
* - WriteHomeValidator instances
|
|
26
|
+
*
|
|
27
|
+
* Sessions are cleaned up after a configurable timeout of inactivity (default: 1 hour).
|
|
28
|
+
* The timeout is reset on actual tool calls.
|
|
29
|
+
*/
|
|
30
|
+
export class SessionManager {
|
|
31
|
+
sessions = new Map();
|
|
32
|
+
config;
|
|
33
|
+
maxSessions;
|
|
34
|
+
sessionTimeoutMs;
|
|
35
|
+
cleanupInterval = null;
|
|
36
|
+
onSessionDestroyed;
|
|
37
|
+
constructor(config) {
|
|
38
|
+
this.config = config;
|
|
39
|
+
this.maxSessions = config.maxSessions ?? DEFAULT_MAX_SESSIONS;
|
|
40
|
+
this.sessionTimeoutMs = config.sessionTimeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS;
|
|
41
|
+
this.onSessionDestroyed = config.onSessionDestroyed;
|
|
42
|
+
// Start cleanup interval (check every minute for timed-out sessions)
|
|
43
|
+
this.startCleanupInterval();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Start the session cleanup interval
|
|
47
|
+
* Checks every minute for sessions that have exceeded the timeout
|
|
48
|
+
*/
|
|
49
|
+
startCleanupInterval() {
|
|
50
|
+
// Check every minute for timed-out sessions
|
|
51
|
+
this.cleanupInterval = setInterval(() => {
|
|
52
|
+
this.cleanupTimedOutSessions();
|
|
53
|
+
}, 60 * 1000);
|
|
54
|
+
// Don't prevent process exit
|
|
55
|
+
this.cleanupInterval.unref();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Clean up sessions that have exceeded the inactivity timeout
|
|
59
|
+
*/
|
|
60
|
+
cleanupTimedOutSessions() {
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
const timeoutMs = this.sessionTimeoutMs;
|
|
63
|
+
for (const [sessionId, session] of this.sessions) {
|
|
64
|
+
const idleMs = now - session.lastActivity;
|
|
65
|
+
if (idleMs > timeoutMs) {
|
|
66
|
+
const idleMinutes = Math.round(idleMs / 60000);
|
|
67
|
+
log(`Session timeout: ${sessionId} (inactive ${idleMinutes}min)`);
|
|
68
|
+
this.destroySession(sessionId);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a new session with the given credentials
|
|
74
|
+
* @throws Error if maximum sessions limit reached (DoS protection)
|
|
75
|
+
*/
|
|
76
|
+
createSession(sessionId, credentials) {
|
|
77
|
+
// DoS protection: limit concurrent sessions
|
|
78
|
+
if (this.sessions.size >= this.maxSessions) {
|
|
79
|
+
throw new Error(`Maximum sessions limit reached (${this.maxSessions}). ` +
|
|
80
|
+
"Try again later or contact administrator.");
|
|
81
|
+
}
|
|
82
|
+
const now = Date.now();
|
|
83
|
+
const maxBuffers = this.config.maxBuffersPerSession ?? DEFAULT_MAX_BUFFERS;
|
|
84
|
+
// Create per-session clients
|
|
85
|
+
// Use per-request credentials if available, else fall back to defaults
|
|
86
|
+
const jiraConfig = this.resolveJiraConfig(credentials);
|
|
87
|
+
const confluenceConfig = this.resolveConfluenceConfig(credentials);
|
|
88
|
+
const clients = {
|
|
89
|
+
jira: jiraConfig ? new JiraClient(jiraConfig) : null,
|
|
90
|
+
confluence: confluenceConfig ? new ConfluenceClient(confluenceConfig) : null,
|
|
91
|
+
tempo: jiraConfig ? new TempoClient(jiraConfig) : null, // Tempo uses Jira auth
|
|
92
|
+
};
|
|
93
|
+
// Create write-home validator if Confluence available and write-home mode enabled
|
|
94
|
+
const writeHomeValidator = clients.confluence && this.config.writeHomeEnabled
|
|
95
|
+
? new WriteHomeValidator(clients.confluence)
|
|
96
|
+
: null;
|
|
97
|
+
const session = {
|
|
98
|
+
sessionId,
|
|
99
|
+
credentials,
|
|
100
|
+
buffer: new ContentBuffer({ maxBuffers }),
|
|
101
|
+
clients,
|
|
102
|
+
writeHomeValidator,
|
|
103
|
+
createdAt: now,
|
|
104
|
+
lastActivity: now,
|
|
105
|
+
};
|
|
106
|
+
this.sessions.set(sessionId, session);
|
|
107
|
+
const jiraUrl = jiraConfig?.url || "not configured";
|
|
108
|
+
const confluenceUrl = confluenceConfig?.url || "not configured";
|
|
109
|
+
log(`Session created: ${sessionId} (jira: ${jiraUrl}, confluence: ${confluenceUrl})`);
|
|
110
|
+
return session;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get an existing session by ID
|
|
114
|
+
* Updates the lastActivity timestamp on access
|
|
115
|
+
*/
|
|
116
|
+
getSession(sessionId) {
|
|
117
|
+
const session = this.sessions.get(sessionId);
|
|
118
|
+
if (session) {
|
|
119
|
+
session.lastActivity = Date.now();
|
|
120
|
+
}
|
|
121
|
+
return session;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get or create a session
|
|
125
|
+
* If session exists, returns it (and updates lastActivity)
|
|
126
|
+
* If session doesn't exist, creates it with the given credentials
|
|
127
|
+
*
|
|
128
|
+
* If existing session has different credentials than the request,
|
|
129
|
+
* recreates the affected clients to use the new credentials.
|
|
130
|
+
* This ensures per-request credential isolation in multi-user scenarios.
|
|
131
|
+
*/
|
|
132
|
+
getOrCreateSession(sessionId, credentials) {
|
|
133
|
+
const existing = this.getSession(sessionId);
|
|
134
|
+
if (existing) {
|
|
135
|
+
// Check if credentials have changed and we need to update/create clients
|
|
136
|
+
const jiraTokenChanged = !!(credentials.jira?.token &&
|
|
137
|
+
credentials.jira.token !== existing.credentials.jira?.token);
|
|
138
|
+
const confluenceTokenChanged = !!(credentials.confluence?.token &&
|
|
139
|
+
credentials.confluence.token !== existing.credentials.confluence?.token);
|
|
140
|
+
const hasNewJira = !!(credentials.jira && !existing.clients.jira);
|
|
141
|
+
const hasNewConfluence = !!(credentials.confluence && !existing.clients.confluence);
|
|
142
|
+
if (jiraTokenChanged || confluenceTokenChanged || hasNewJira || hasNewConfluence) {
|
|
143
|
+
// Update clients in-place (don't destroy session - that would close the transport!)
|
|
144
|
+
const changes = [];
|
|
145
|
+
if (jiraTokenChanged)
|
|
146
|
+
changes.push("jira token");
|
|
147
|
+
if (confluenceTokenChanged)
|
|
148
|
+
changes.push("confluence token");
|
|
149
|
+
if (hasNewJira)
|
|
150
|
+
changes.push("new jira");
|
|
151
|
+
if (hasNewConfluence)
|
|
152
|
+
changes.push("new confluence");
|
|
153
|
+
log(`Session ${sessionId}: credentials changed (${changes.join(", ")}), updating clients`);
|
|
154
|
+
this.updateSessionClients(existing, credentials, { jiraTokenChanged, confluenceTokenChanged });
|
|
155
|
+
}
|
|
156
|
+
return existing;
|
|
157
|
+
}
|
|
158
|
+
return this.createSession(sessionId, credentials);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Update session clients in-place when credentials change
|
|
162
|
+
* This preserves the session and its transport connection while updating API clients
|
|
163
|
+
*
|
|
164
|
+
* @param session - The existing session to update
|
|
165
|
+
* @param credentials - New credentials from the request
|
|
166
|
+
* @param options - Flags indicating which credentials changed
|
|
167
|
+
*/
|
|
168
|
+
updateSessionClients(session, credentials, options = {}) {
|
|
169
|
+
// Update Jira client if token changed OR if we don't have one yet
|
|
170
|
+
if (options.jiraTokenChanged || !session.clients.jira) {
|
|
171
|
+
const jiraConfig = this.resolveJiraConfig(credentials);
|
|
172
|
+
if (jiraConfig) {
|
|
173
|
+
session.clients.jira = new JiraClient(jiraConfig);
|
|
174
|
+
session.clients.tempo = new TempoClient(jiraConfig); // Tempo uses Jira auth
|
|
175
|
+
const action = options.jiraTokenChanged ? "recreated" : "created";
|
|
176
|
+
log(`Session ${session.sessionId}: Jira client ${action} (${jiraConfig.url})`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Update Confluence client if token changed OR if we don't have one yet
|
|
180
|
+
if (options.confluenceTokenChanged || !session.clients.confluence) {
|
|
181
|
+
const confluenceConfig = this.resolveConfluenceConfig(credentials);
|
|
182
|
+
if (confluenceConfig) {
|
|
183
|
+
session.clients.confluence = new ConfluenceClient(confluenceConfig);
|
|
184
|
+
const action = options.confluenceTokenChanged ? "recreated" : "created";
|
|
185
|
+
log(`Session ${session.sessionId}: Confluence client ${action} (${confluenceConfig.url})`);
|
|
186
|
+
// Create/update write-home validator if write-home mode enabled
|
|
187
|
+
if (this.config.writeHomeEnabled) {
|
|
188
|
+
session.writeHomeValidator = new WriteHomeValidator(session.clients.confluence);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Update stored credentials (per-request overrides existing)
|
|
193
|
+
session.credentials = {
|
|
194
|
+
jira: {
|
|
195
|
+
...session.credentials.jira,
|
|
196
|
+
...credentials.jira,
|
|
197
|
+
},
|
|
198
|
+
confluence: {
|
|
199
|
+
...session.credentials.confluence,
|
|
200
|
+
...credentials.confluence,
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Destroy a session and clean up its resources
|
|
206
|
+
* Also triggers onSessionDestroyed callback for transport cleanup
|
|
207
|
+
*/
|
|
208
|
+
destroySession(sessionId) {
|
|
209
|
+
const session = this.sessions.get(sessionId);
|
|
210
|
+
if (session) {
|
|
211
|
+
// Clean up the buffer (stops cleanup interval, clears all buffers)
|
|
212
|
+
session.buffer.destroy();
|
|
213
|
+
this.sessions.delete(sessionId);
|
|
214
|
+
log(`Session destroyed: ${sessionId}`);
|
|
215
|
+
// Notify transport layer for coordinated cleanup (fix: issue #7)
|
|
216
|
+
if (this.onSessionDestroyed) {
|
|
217
|
+
try {
|
|
218
|
+
this.onSessionDestroyed(sessionId);
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
logError(`Error in onSessionDestroyed callback for ${sessionId}`, err);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get the number of active sessions
|
|
228
|
+
*/
|
|
229
|
+
getSessionCount() {
|
|
230
|
+
return this.sessions.size;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get the maximum sessions limit
|
|
234
|
+
*/
|
|
235
|
+
getMaxSessions() {
|
|
236
|
+
return this.maxSessions;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Check if a session exists without updating its activity timestamp
|
|
240
|
+
*/
|
|
241
|
+
hasSession(sessionId) {
|
|
242
|
+
return this.sessions.has(sessionId);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Update session activity timestamp without returning full session data
|
|
246
|
+
* Used to extend session lifetime when real activity occurs (tool calls)
|
|
247
|
+
*
|
|
248
|
+
* @returns true if session was found, false otherwise
|
|
249
|
+
*/
|
|
250
|
+
touchSession(sessionId) {
|
|
251
|
+
const session = this.sessions.get(sessionId);
|
|
252
|
+
if (session) {
|
|
253
|
+
session.lastActivity = Date.now();
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Set the callback for when a session is destroyed
|
|
260
|
+
* Used by HTTP transport for coordinated transport cleanup
|
|
261
|
+
*/
|
|
262
|
+
setSessionDestroyedCallback(callback) {
|
|
263
|
+
this.onSessionDestroyed = callback;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Shutdown the session manager
|
|
267
|
+
* Destroys all sessions and stops the cleanup interval
|
|
268
|
+
*/
|
|
269
|
+
shutdown() {
|
|
270
|
+
// Stop cleanup interval
|
|
271
|
+
if (this.cleanupInterval) {
|
|
272
|
+
clearInterval(this.cleanupInterval);
|
|
273
|
+
this.cleanupInterval = null;
|
|
274
|
+
}
|
|
275
|
+
// Destroy all sessions
|
|
276
|
+
for (const sessionId of this.sessions.keys()) {
|
|
277
|
+
this.destroySession(sessionId);
|
|
278
|
+
}
|
|
279
|
+
log("Session manager shutdown complete");
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get the session timeout in milliseconds
|
|
283
|
+
*/
|
|
284
|
+
getSessionTimeoutMs() {
|
|
285
|
+
return this.sessionTimeoutMs;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Resolve Jira configuration by merging partial per-request credentials with defaults
|
|
289
|
+
*
|
|
290
|
+
* Priority: per-request > environment defaults
|
|
291
|
+
* - URL from header OR URL from env
|
|
292
|
+
* - Token from header OR token from env
|
|
293
|
+
* - Both must be present for a valid config
|
|
294
|
+
*/
|
|
295
|
+
resolveJiraConfig(credentials) {
|
|
296
|
+
const defaultConfig = this.config.defaultJiraConfig;
|
|
297
|
+
const perRequest = credentials.jira;
|
|
298
|
+
// No per-request and no default → null
|
|
299
|
+
if (!perRequest && !defaultConfig) {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
// Merge: per-request values override defaults
|
|
303
|
+
const url = perRequest?.url || defaultConfig?.url;
|
|
304
|
+
const token = perRequest?.token || defaultConfig?.token;
|
|
305
|
+
// Need both URL and token to make API calls
|
|
306
|
+
if (!url || !token) {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
url,
|
|
311
|
+
token,
|
|
312
|
+
// Use bearer auth if token came from per-request header, otherwise preserve default authType
|
|
313
|
+
authType: perRequest?.token ? "bearer" : defaultConfig?.authType,
|
|
314
|
+
// Preserve username from defaults for basic auth scenarios
|
|
315
|
+
username: perRequest?.token ? undefined : defaultConfig?.username,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Resolve Confluence configuration by merging partial per-request credentials with defaults
|
|
320
|
+
*
|
|
321
|
+
* Priority: per-request > environment defaults
|
|
322
|
+
* - URL from header OR URL from env
|
|
323
|
+
* - Token from header OR token from env
|
|
324
|
+
* - Both must be present for a valid config
|
|
325
|
+
*/
|
|
326
|
+
resolveConfluenceConfig(credentials) {
|
|
327
|
+
const defaultConfig = this.config.defaultConfluenceConfig;
|
|
328
|
+
const perRequest = credentials.confluence;
|
|
329
|
+
// No per-request and no default → null
|
|
330
|
+
if (!perRequest && !defaultConfig) {
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
// Merge: per-request values override defaults
|
|
334
|
+
const url = perRequest?.url || defaultConfig?.url;
|
|
335
|
+
const token = perRequest?.token || defaultConfig?.token;
|
|
336
|
+
// Need both URL and token to make API calls
|
|
337
|
+
if (!url || !token) {
|
|
338
|
+
return null;
|
|
339
|
+
}
|
|
340
|
+
return {
|
|
341
|
+
url,
|
|
342
|
+
token,
|
|
343
|
+
// Use bearer auth if token came from per-request header, otherwise preserve default authType
|
|
344
|
+
authType: perRequest?.token ? "bearer" : defaultConfig?.authType,
|
|
345
|
+
// Preserve username from defaults for basic auth scenarios
|
|
346
|
+
username: perRequest?.token ? undefined : defaultConfig?.username,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// Singleton instance - initialized by the main entry point
|
|
351
|
+
let sessionManagerInstance = null;
|
|
352
|
+
/**
|
|
353
|
+
* Initialize the session manager singleton
|
|
354
|
+
* Must be called once during server startup
|
|
355
|
+
*/
|
|
356
|
+
export function initializeSessionManager(config) {
|
|
357
|
+
if (sessionManagerInstance) {
|
|
358
|
+
log("Warning: Session manager already initialized, reinitializing...");
|
|
359
|
+
sessionManagerInstance.shutdown();
|
|
360
|
+
}
|
|
361
|
+
sessionManagerInstance = new SessionManager(config);
|
|
362
|
+
return sessionManagerInstance;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Get the session manager singleton
|
|
366
|
+
* Throws if not initialized
|
|
367
|
+
*/
|
|
368
|
+
export function getSessionManager() {
|
|
369
|
+
if (!sessionManagerInstance) {
|
|
370
|
+
throw new Error("Session manager not initialized. Call initializeSessionManager() first.");
|
|
371
|
+
}
|
|
372
|
+
return sessionManagerInstance;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Shutdown the session manager singleton
|
|
376
|
+
*/
|
|
377
|
+
export function shutdownSessionManager() {
|
|
378
|
+
if (sessionManagerInstance) {
|
|
379
|
+
sessionManagerInstance.shutdown();
|
|
380
|
+
sessionManagerInstance = null;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# 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;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/tempo/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,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;IAgChE;;;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
|
@@ -6,9 +6,12 @@
|
|
|
6
6
|
* This client automatically converts user-friendly keys to numeric IDs.
|
|
7
7
|
*/
|
|
8
8
|
import { HttpClient } from "../utils/http-client.js";
|
|
9
|
+
import { debug } from "../utils/logger.js";
|
|
9
10
|
export class TempoClient {
|
|
10
11
|
http;
|
|
11
12
|
cachedCurrentUser = null;
|
|
13
|
+
// Cache for resolved user display names (workerKey -> displayName)
|
|
14
|
+
userDisplayNameCache = new Map();
|
|
12
15
|
constructor(config) {
|
|
13
16
|
this.http = new HttpClient(config);
|
|
14
17
|
}
|
|
@@ -251,5 +254,59 @@ export class TempoClient {
|
|
|
251
254
|
const user = await this.getCurrentUser();
|
|
252
255
|
return user.key;
|
|
253
256
|
}
|
|
257
|
+
/**
|
|
258
|
+
* Resolve workerKey to displayName using Jira Data Center API
|
|
259
|
+
* Tempo DC v4 only returns workerKey, not displayName
|
|
260
|
+
* Results are cached to avoid repeated API calls
|
|
261
|
+
* @param workerKey - The worker key from Tempo (username or JIRAUSER key)
|
|
262
|
+
* @returns displayName if found, or workerKey as fallback
|
|
263
|
+
*/
|
|
264
|
+
async resolveUserDisplayName(workerKey) {
|
|
265
|
+
// Check cache first
|
|
266
|
+
if (this.userDisplayNameCache.has(workerKey)) {
|
|
267
|
+
return this.userDisplayNameCache.get(workerKey);
|
|
268
|
+
}
|
|
269
|
+
let displayName = workerKey; // Default fallback
|
|
270
|
+
try {
|
|
271
|
+
// Jira DC API: try with username parameter first (most common case)
|
|
272
|
+
const user = await this.http.get(`/rest/api/2/user?username=${encodeURIComponent(workerKey)}`);
|
|
273
|
+
displayName = user.displayName || user.name || workerKey;
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// If username lookup fails, try with key parameter (for JIRAUSER format)
|
|
277
|
+
try {
|
|
278
|
+
const user = await this.http.get(`/rest/api/2/user?key=${encodeURIComponent(workerKey)}`);
|
|
279
|
+
displayName = user.displayName || user.name || workerKey;
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
// User not found - use workerKey as fallback
|
|
283
|
+
debug(`User lookup failed for workerKey: ${workerKey}, using as-is`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// Cache the result
|
|
287
|
+
this.userDisplayNameCache.set(workerKey, displayName);
|
|
288
|
+
return displayName;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Resolve multiple workerKeys to displayNames in parallel
|
|
292
|
+
* Uses persistent cache to avoid repeated API calls
|
|
293
|
+
*/
|
|
294
|
+
async resolveUserDisplayNames(workerKeys) {
|
|
295
|
+
const uniqueKeys = [...new Set(workerKeys.filter(Boolean))];
|
|
296
|
+
const result = new Map();
|
|
297
|
+
// Identify keys that need resolution (not in cache)
|
|
298
|
+
const uncachedKeys = uniqueKeys.filter(key => !this.userDisplayNameCache.has(key));
|
|
299
|
+
// Resolve uncached keys in parallel batches (5 at a time to avoid rate limiting)
|
|
300
|
+
const batchSize = 5;
|
|
301
|
+
for (let i = 0; i < uncachedKeys.length; i += batchSize) {
|
|
302
|
+
const batch = uncachedKeys.slice(i, i + batchSize);
|
|
303
|
+
await Promise.all(batch.map(key => this.resolveUserDisplayName(key)));
|
|
304
|
+
}
|
|
305
|
+
// Build result map from cache
|
|
306
|
+
for (const key of uniqueKeys) {
|
|
307
|
+
result.set(key, this.userDisplayNameCache.get(key) || key);
|
|
308
|
+
}
|
|
309
|
+
return result;
|
|
310
|
+
}
|
|
254
311
|
}
|
|
255
312
|
//# 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;
|
|
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"}
|