@brxce/mcp-server 1.1.12 → 1.1.13
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/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -27
- package/dist/index.js.map +1 -1
- package/dist/services/api-client.d.ts +32 -12
- package/dist/services/api-client.d.ts.map +1 -1
- package/dist/services/api-client.js +117 -75
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/workspace-context.d.ts +27 -24
- package/dist/services/workspace-context.d.ts.map +1 -1
- package/dist/services/workspace-context.js +46 -45
- package/dist/services/workspace-context.js.map +1 -1
- package/dist/tools/comment-tool.d.ts.map +1 -1
- package/dist/tools/comment-tool.js +3 -0
- package/dist/tools/comment-tool.js.map +1 -1
- package/dist/tools/criteria-tool.d.ts.map +1 -1
- package/dist/tools/criteria-tool.js +3 -0
- package/dist/tools/criteria-tool.js.map +1 -1
- package/dist/tools/meeting-agenda-notes-tool.js +22 -22
- package/dist/tools/meeting-agenda-notes-tool.js.map +1 -1
- package/dist/tools/meeting-agenda-tool.js +29 -29
- package/dist/tools/meeting-agenda-tool.js.map +1 -1
- package/dist/tools/meeting-decisions-tool.js +28 -28
- package/dist/tools/meeting-decisions-tool.js.map +1 -1
- package/dist/tools/meeting-notes-tool.js +22 -22
- package/dist/tools/meeting-notes-tool.js.map +1 -1
- package/dist/tools/tag-category-tool.js +13 -13
- package/dist/tools/tag-category-tool.js.map +1 -1
- package/dist/tools/tag-search-tool.js +38 -38
- package/dist/tools/tag-search-tool.js.map +1 -1
- package/dist/tools/tag-tool.js +40 -40
- package/dist/tools/tag-tool.js.map +1 -1
- package/dist/tools/worknode-batch-tool.d.ts.map +1 -1
- package/dist/tools/worknode-batch-tool.js +7 -0
- package/dist/tools/worknode-batch-tool.js.map +1 -1
- package/dist/tools/worknode-create-tool.d.ts.map +1 -1
- package/dist/tools/worknode-create-tool.js +18 -2
- package/dist/tools/worknode-create-tool.js.map +1 -1
- package/dist/tools/worknode-delete-tool.d.ts.map +1 -1
- package/dist/tools/worknode-delete-tool.js +7 -0
- package/dist/tools/worknode-delete-tool.js.map +1 -1
- package/dist/tools/worknode-detail-tool.d.ts.map +1 -1
- package/dist/tools/worknode-detail-tool.js +19 -17
- package/dist/tools/worknode-detail-tool.js.map +1 -1
- package/dist/tools/worknode-history-tool.d.ts.map +1 -1
- package/dist/tools/worknode-history-tool.js +3 -1
- package/dist/tools/worknode-history-tool.js.map +1 -1
- package/dist/tools/worknode-move-tool.d.ts.map +1 -1
- package/dist/tools/worknode-move-tool.js +4 -1
- package/dist/tools/worknode-move-tool.js.map +1 -1
- package/dist/tools/worknode-permanent-delete-tool.d.ts.map +1 -1
- package/dist/tools/worknode-permanent-delete-tool.js +7 -0
- package/dist/tools/worknode-permanent-delete-tool.js.map +1 -1
- package/dist/tools/worknode-read-tool.d.ts.map +1 -1
- package/dist/tools/worknode-read-tool.js +18 -1
- package/dist/tools/worknode-read-tool.js.map +1 -1
- package/dist/tools/worknode-subtree-tool.js +19 -19
- package/dist/tools/worknode-subtree-tool.js.map +1 -1
- package/dist/tools/worknode-tag-relations-tool.d.ts.map +1 -1
- package/dist/tools/worknode-tag-relations-tool.js +3 -1
- package/dist/tools/worknode-tag-relations-tool.js.map +1 -1
- package/dist/tools/worknode-tag-tool.d.ts.map +1 -1
- package/dist/tools/worknode-tag-tool.js +43 -31
- package/dist/tools/worknode-tag-tool.js.map +1 -1
- package/dist/tools/worknode-update-tool.d.ts.map +1 -1
- package/dist/tools/worknode-update-tool.js +20 -3
- package/dist/tools/worknode-update-tool.js.map +1 -1
- package/dist/tools/workspace-tree-tool.d.ts.map +1 -1
- package/dist/tools/workspace-tree-tool.js +29 -22
- package/dist/tools/workspace-tree-tool.js.map +1 -1
- package/dist/utils/error-utils.d.ts +6 -4
- package/dist/utils/error-utils.d.ts.map +1 -1
- package/dist/utils/error-utils.js +13 -16
- package/dist/utils/error-utils.js.map +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +0 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAyDA,wBAAsB,SAAS,kBAwL9B;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,OAAO,iBAG/C;AAED,eAAO,MAAM,gBAAgB,eAAiC,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
-
import jwt from 'jsonwebtoken';
|
|
5
4
|
import { loadEnvironment } from './config/environment.js';
|
|
6
5
|
import { ApiClient } from './services/api-client.js';
|
|
7
|
-
import { getErrorMessage } from './utils/error-utils.js';
|
|
8
6
|
import { registerUserResource } from './resources/user-resource.js';
|
|
9
7
|
import { registerWorkspaceResource } from './resources/workspace-resource.js';
|
|
10
8
|
import { registerWorkspaceMembersResource } from './resources/workspace-members-resource.js';
|
|
@@ -57,11 +55,6 @@ import { registerAttachmentTools } from './tools/attachment-tool.js';
|
|
|
57
55
|
import { registerGoalProgressTool } from './tools/goal-progress-tool.js';
|
|
58
56
|
import { registerDailyReportTool } from './tools/daily-report-tool.js';
|
|
59
57
|
export async function bootstrap() {
|
|
60
|
-
// Always log environment variables for debugging
|
|
61
|
-
console.error('[MCP] Environment variables:');
|
|
62
|
-
console.error(' BACKEND_URL:', process.env.BACKEND_URL);
|
|
63
|
-
console.error(' AUTH_TOKEN:', process.env.AUTH_TOKEN ? 'SET' : 'NOT SET');
|
|
64
|
-
console.error(' MCP_DEBUG:', process.env.MCP_DEBUG);
|
|
65
58
|
const config = loadEnvironment();
|
|
66
59
|
console.error('[MCP] Starting BRXCE MCP Server');
|
|
67
60
|
console.error('[MCP] Configuration:', {
|
|
@@ -70,30 +63,11 @@ export async function bootstrap() {
|
|
|
70
63
|
hasRefreshToken: Boolean(config.refreshToken),
|
|
71
64
|
debug: config.debug,
|
|
72
65
|
});
|
|
73
|
-
// Extract user information from auth token
|
|
74
|
-
let currentUserId;
|
|
75
|
-
if (config.authToken) {
|
|
76
|
-
// JWT token: decode locally
|
|
77
|
-
try {
|
|
78
|
-
const decoded = jwt.decode(config.authToken);
|
|
79
|
-
const maybeUserId = decoded?.['userId'];
|
|
80
|
-
if (typeof maybeUserId === 'string') {
|
|
81
|
-
currentUserId = maybeUserId;
|
|
82
|
-
if (config.debug) {
|
|
83
|
-
console.error(`[MCP] Authenticated user: ${currentUserId}`);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
if (config.debug) {
|
|
89
|
-
console.error('[MCP] Failed to decode auth token:', getErrorMessage(error));
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
66
|
// Initialize API client
|
|
94
67
|
const apiClient = new ApiClient({
|
|
95
68
|
baseUrl: config.backendUrl,
|
|
96
69
|
authToken: config.authToken,
|
|
70
|
+
refreshToken: config.refreshToken,
|
|
97
71
|
});
|
|
98
72
|
const server = new McpServer({
|
|
99
73
|
name: 'brxce-mcp-server',
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Enhanced API client for BRXCE backend with:
|
|
3
|
-
* - Token auto-refresh
|
|
4
|
-
* - Retry logic with exponential backoff
|
|
5
|
-
* -
|
|
6
|
-
* - Error classification and handling
|
|
3
|
+
* - Token auto-refresh (deduped against concurrent callers)
|
|
4
|
+
* - Retry logic with exponential backoff (GET only for 5xx)
|
|
5
|
+
* - Per-request timeout override
|
|
6
|
+
* - Error classification and handling with status code propagation
|
|
7
7
|
*/
|
|
8
8
|
export interface ApiClientConfig {
|
|
9
9
|
baseUrl: string;
|
|
@@ -12,6 +12,10 @@ export interface ApiClientConfig {
|
|
|
12
12
|
timeout?: number;
|
|
13
13
|
maxRetries?: number;
|
|
14
14
|
}
|
|
15
|
+
export interface RequestOptions {
|
|
16
|
+
/** Override the default timeout for this single call. */
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
}
|
|
15
19
|
export declare class ApiClient {
|
|
16
20
|
private baseUrl;
|
|
17
21
|
private authToken?;
|
|
@@ -20,10 +24,18 @@ export declare class ApiClient {
|
|
|
20
24
|
private maxRetries;
|
|
21
25
|
private refreshFailureCount;
|
|
22
26
|
private readonly MAX_REFRESH_FAILURES;
|
|
27
|
+
private refreshInFlight;
|
|
23
28
|
constructor(config: ApiClientConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Refresh the access token. Concurrent callers share the same in-flight
|
|
31
|
+
* promise so the backend only sees one refresh request at a time.
|
|
32
|
+
* Returns true on success, false on failure (without throwing).
|
|
33
|
+
*/
|
|
34
|
+
private refreshAccessToken;
|
|
35
|
+
private doRefresh;
|
|
24
36
|
/**
|
|
25
37
|
* A-1: Token auto-refresh
|
|
26
|
-
* Ensures token is valid, refreshes if expiring within 60 seconds
|
|
38
|
+
* Ensures token is valid, refreshes if expiring within 60 seconds.
|
|
27
39
|
*/
|
|
28
40
|
ensureValidToken(): Promise<void>;
|
|
29
41
|
/**
|
|
@@ -35,17 +47,25 @@ export declare class ApiClient {
|
|
|
35
47
|
*/
|
|
36
48
|
fetchWithTimeout(url: string, options: RequestInit, timeoutMs?: number): Promise<Response>;
|
|
37
49
|
/**
|
|
38
|
-
*
|
|
50
|
+
* Build a structured ApiError with status + skipRetry flags.
|
|
51
|
+
*/
|
|
52
|
+
private buildApiError;
|
|
53
|
+
/**
|
|
54
|
+
* A-4: Error classification
|
|
55
|
+
* - 401: Refresh once and retry the original request once.
|
|
56
|
+
* - 429: Wait Retry-After and retry.
|
|
57
|
+
* - 5xx: Retry only if the verb is idempotent.
|
|
58
|
+
* - 4xx: Throw immediately, no retry.
|
|
39
59
|
*/
|
|
40
60
|
private handleErrorResponse;
|
|
41
61
|
/**
|
|
42
|
-
* Core request method with all features
|
|
62
|
+
* Core request method with all features.
|
|
43
63
|
*/
|
|
44
64
|
private request;
|
|
45
|
-
get<T>(path: string): Promise<T>;
|
|
46
|
-
post<T>(path: string, data?: unknown): Promise<T>;
|
|
47
|
-
put<T>(path: string, data?: unknown): Promise<T>;
|
|
48
|
-
patch<T>(path: string, data?: unknown): Promise<T>;
|
|
49
|
-
delete<T>(path: string, data?: unknown): Promise<T>;
|
|
65
|
+
get<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
66
|
+
post<T>(path: string, data?: unknown, options?: RequestOptions): Promise<T>;
|
|
67
|
+
put<T>(path: string, data?: unknown, options?: RequestOptions): Promise<T>;
|
|
68
|
+
patch<T>(path: string, data?: unknown, options?: RequestOptions): Promise<T>;
|
|
69
|
+
delete<T>(path: string, data?: unknown, options?: RequestOptions): Promise<T>;
|
|
50
70
|
}
|
|
51
71
|
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAK;IAC1C,OAAO,CAAC,eAAe,CAA8B;gBAEzC,MAAM,EAAE,eAAe;IAQnC;;;;OAIG;YACW,kBAAkB;YAiBlB,SAAS;IA4BvB;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBvC;;OAEG;IACG,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,MAAwB,GAAG,OAAO,CAAC,CAAC,CAAC;IA+BvF;;OAEG;IACG,gBAAgB,CACpB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,EACpB,SAAS,GAAE,MAAqB,GAC/B,OAAO,CAAC,QAAQ,CAAC;IAuBpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;;;;;OAMG;YACW,mBAAmB;IAqCjC;;OAEG;YACW,OAAO;IAyDf,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1D,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAI3E,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1E,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5E,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;CAGpF"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Enhanced API client for BRXCE backend with:
|
|
3
|
-
* - Token auto-refresh
|
|
4
|
-
* - Retry logic with exponential backoff
|
|
5
|
-
* -
|
|
6
|
-
* - Error classification and handling
|
|
3
|
+
* - Token auto-refresh (deduped against concurrent callers)
|
|
4
|
+
* - Retry logic with exponential backoff (GET only for 5xx)
|
|
5
|
+
* - Per-request timeout override
|
|
6
|
+
* - Error classification and handling with status code propagation
|
|
7
7
|
*/
|
|
8
8
|
import jwt from 'jsonwebtoken';
|
|
9
9
|
import { getErrorMessage } from '../utils/error-utils.js';
|
|
10
|
+
const IDEMPOTENT_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
|
|
10
11
|
export class ApiClient {
|
|
11
12
|
baseUrl;
|
|
12
13
|
authToken;
|
|
@@ -15,6 +16,7 @@ export class ApiClient {
|
|
|
15
16
|
maxRetries;
|
|
16
17
|
refreshFailureCount = 0;
|
|
17
18
|
MAX_REFRESH_FAILURES = 3;
|
|
19
|
+
refreshInFlight = null;
|
|
18
20
|
constructor(config) {
|
|
19
21
|
this.baseUrl = config.baseUrl;
|
|
20
22
|
this.authToken = config.authToken;
|
|
@@ -23,42 +25,70 @@ export class ApiClient {
|
|
|
23
25
|
this.maxRetries = config.maxRetries ?? 3;
|
|
24
26
|
}
|
|
25
27
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
+
* Refresh the access token. Concurrent callers share the same in-flight
|
|
29
|
+
* promise so the backend only sees one refresh request at a time.
|
|
30
|
+
* Returns true on success, false on failure (without throwing).
|
|
28
31
|
*/
|
|
29
|
-
async
|
|
30
|
-
if (!this.
|
|
31
|
-
return;
|
|
32
|
+
async refreshAccessToken() {
|
|
33
|
+
if (!this.refreshToken)
|
|
34
|
+
return false;
|
|
35
|
+
if (!this.refreshInFlight) {
|
|
36
|
+
this.refreshInFlight = this.doRefresh().finally(() => {
|
|
37
|
+
this.refreshInFlight = null;
|
|
38
|
+
});
|
|
32
39
|
}
|
|
33
40
|
try {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
// Reset failure count on successful refresh
|
|
51
|
-
this.refreshFailureCount = 0;
|
|
52
|
-
}
|
|
41
|
+
await this.refreshInFlight;
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async doRefresh() {
|
|
49
|
+
try {
|
|
50
|
+
const response = await fetch(`${this.baseUrl}/auth/refresh`, {
|
|
51
|
+
method: 'POST',
|
|
52
|
+
headers: { 'Content-Type': 'application/json' },
|
|
53
|
+
body: JSON.stringify({ refreshToken: this.refreshToken }),
|
|
54
|
+
});
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
throw new Error(`refresh failed: ${response.status}`);
|
|
53
57
|
}
|
|
58
|
+
const data = (await response.json());
|
|
59
|
+
this.authToken = data.accessToken;
|
|
60
|
+
this.refreshFailureCount = 0;
|
|
54
61
|
}
|
|
55
|
-
catch (
|
|
62
|
+
catch (err) {
|
|
56
63
|
this.refreshFailureCount++;
|
|
57
64
|
console.error(`[MCP] Token refresh failed (${this.refreshFailureCount}/${this.MAX_REFRESH_FAILURES})`);
|
|
58
65
|
if (this.refreshFailureCount >= this.MAX_REFRESH_FAILURES) {
|
|
59
66
|
console.error('[MCP] Max refresh attempts reached. Please re-authenticate.');
|
|
60
67
|
this.authToken = undefined;
|
|
61
68
|
}
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* A-1: Token auto-refresh
|
|
74
|
+
* Ensures token is valid, refreshes if expiring within 60 seconds.
|
|
75
|
+
*/
|
|
76
|
+
async ensureValidToken() {
|
|
77
|
+
if (!this.authToken || !this.refreshToken)
|
|
78
|
+
return;
|
|
79
|
+
let decoded;
|
|
80
|
+
try {
|
|
81
|
+
decoded = jwt.decode(this.authToken);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (!decoded || !decoded.exp)
|
|
87
|
+
return;
|
|
88
|
+
const now = Math.floor(Date.now() / 1000);
|
|
89
|
+
const timeUntilExpiry = decoded.exp - now;
|
|
90
|
+
if (timeUntilExpiry < 60) {
|
|
91
|
+
await this.refreshAccessToken();
|
|
62
92
|
}
|
|
63
93
|
}
|
|
64
94
|
/**
|
|
@@ -72,14 +102,16 @@ export class ApiClient {
|
|
|
72
102
|
}
|
|
73
103
|
catch (error) {
|
|
74
104
|
lastError = error instanceof Error ? error : new Error(getErrorMessage(error));
|
|
75
|
-
// Don't retry if error has skipRetry flag (4xx errors)
|
|
76
|
-
if (error !== null &&
|
|
105
|
+
// Don't retry if error has skipRetry flag (4xx errors, non-idempotent 5xx)
|
|
106
|
+
if (error !== null &&
|
|
107
|
+
typeof error === 'object' &&
|
|
108
|
+
'skipRetry' in error &&
|
|
109
|
+
error.skipRetry) {
|
|
77
110
|
throw error;
|
|
78
111
|
}
|
|
79
112
|
// Don't retry on last attempt
|
|
80
|
-
if (attempt === retries)
|
|
113
|
+
if (attempt === retries)
|
|
81
114
|
break;
|
|
82
|
-
}
|
|
83
115
|
// Exponential backoff: 100ms, 200ms, 400ms
|
|
84
116
|
const delay = 100 * Math.pow(2, attempt);
|
|
85
117
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
@@ -112,63 +144,73 @@ export class ApiClient {
|
|
|
112
144
|
}
|
|
113
145
|
}
|
|
114
146
|
/**
|
|
115
|
-
*
|
|
147
|
+
* Build a structured ApiError with status + skipRetry flags.
|
|
148
|
+
*/
|
|
149
|
+
buildApiError(status, statusText, url, body, skipRetry) {
|
|
150
|
+
const err = new Error(`API request failed: ${status} ${statusText}\nURL: ${url}\nResponse: ${body}`);
|
|
151
|
+
err.status = status;
|
|
152
|
+
if (skipRetry)
|
|
153
|
+
err.skipRetry = true;
|
|
154
|
+
return err;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* A-4: Error classification
|
|
158
|
+
* - 401: Refresh once and retry the original request once.
|
|
159
|
+
* - 429: Wait Retry-After and retry.
|
|
160
|
+
* - 5xx: Retry only if the verb is idempotent.
|
|
161
|
+
* - 4xx: Throw immediately, no retry.
|
|
116
162
|
*/
|
|
117
|
-
async handleErrorResponse(response, url, retryFn) {
|
|
163
|
+
async handleErrorResponse(response, url, method, retryFn, canRefresh) {
|
|
118
164
|
const status = response.status;
|
|
119
165
|
const errorText = await response.text().catch(() => 'Unable to read error response');
|
|
120
|
-
// 401:
|
|
121
|
-
if (status === 401 && this.refreshToken) {
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
headers: { 'Content-Type': 'application/json' },
|
|
125
|
-
body: JSON.stringify({ refreshToken: this.refreshToken }),
|
|
126
|
-
});
|
|
127
|
-
if (refreshResponse.ok) {
|
|
128
|
-
const data = (await refreshResponse.json());
|
|
129
|
-
this.authToken = data.accessToken;
|
|
166
|
+
// 401: try refresh + retry exactly once per request
|
|
167
|
+
if (status === 401 && this.refreshToken && canRefresh) {
|
|
168
|
+
const refreshed = await this.refreshAccessToken();
|
|
169
|
+
if (refreshed) {
|
|
130
170
|
return retryFn();
|
|
131
171
|
}
|
|
132
172
|
}
|
|
133
|
-
// 429:
|
|
173
|
+
// 429: rate limit — wait then retry (handled inside withRetry as a thrown error)
|
|
134
174
|
if (status === 429) {
|
|
135
175
|
const retryAfter = response.headers.get('Retry-After');
|
|
136
176
|
const delay = retryAfter ? parseInt(retryAfter) * 1000 : 1000;
|
|
137
177
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
138
178
|
return retryFn();
|
|
139
179
|
}
|
|
140
|
-
// 5xx:
|
|
141
|
-
//
|
|
142
|
-
// on this error because skipRetry is not set.
|
|
180
|
+
// 5xx: idempotent verbs go through withRetry; non-idempotent verbs surface
|
|
181
|
+
// immediately so callers can decide whether the partial write succeeded.
|
|
143
182
|
if (status >= 500) {
|
|
144
|
-
|
|
183
|
+
const skipRetry = !IDEMPOTENT_METHODS.has(method);
|
|
184
|
+
throw this.buildApiError(status, response.statusText, url, errorText, skipRetry);
|
|
145
185
|
}
|
|
146
|
-
// 4xx
|
|
147
|
-
|
|
148
|
-
err.skipRetry = true;
|
|
149
|
-
throw err;
|
|
186
|
+
// 4xx (client error): throw, never retry
|
|
187
|
+
throw this.buildApiError(status, response.statusText, url, errorText, /* skipRetry */ true);
|
|
150
188
|
}
|
|
151
189
|
/**
|
|
152
|
-
* Core request method with all features
|
|
190
|
+
* Core request method with all features.
|
|
153
191
|
*/
|
|
154
|
-
async request(method, path, data) {
|
|
192
|
+
async request(method, path, data, options = {}) {
|
|
155
193
|
await this.ensureValidToken();
|
|
156
194
|
const url = `${this.baseUrl}${path}`;
|
|
157
|
-
|
|
158
|
-
if (this.authToken) {
|
|
159
|
-
headers['Authorization'] = `Bearer ${this.authToken}`;
|
|
160
|
-
}
|
|
161
|
-
if (data !== undefined) {
|
|
162
|
-
headers['Content-Type'] = 'application/json';
|
|
163
|
-
}
|
|
195
|
+
let canRefresh = true;
|
|
164
196
|
const makeRequest = async () => {
|
|
197
|
+
// Build headers fresh each attempt so a refreshed token is picked up.
|
|
198
|
+
const headers = {};
|
|
199
|
+
if (this.authToken) {
|
|
200
|
+
headers['Authorization'] = `Bearer ${this.authToken}`;
|
|
201
|
+
}
|
|
202
|
+
if (data !== undefined) {
|
|
203
|
+
headers['Content-Type'] = 'application/json';
|
|
204
|
+
}
|
|
165
205
|
const response = await this.fetchWithTimeout(url, {
|
|
166
206
|
method,
|
|
167
207
|
headers,
|
|
168
208
|
body: data ? JSON.stringify(data) : undefined,
|
|
169
|
-
});
|
|
209
|
+
}, options.timeoutMs);
|
|
170
210
|
if (!response.ok) {
|
|
171
|
-
|
|
211
|
+
const allowRefresh = canRefresh;
|
|
212
|
+
canRefresh = false;
|
|
213
|
+
return this.handleErrorResponse(response, url, method, makeRequest, allowRefresh);
|
|
172
214
|
}
|
|
173
215
|
return response;
|
|
174
216
|
};
|
|
@@ -186,20 +228,20 @@ export class ApiClient {
|
|
|
186
228
|
throw new Error(`Network error when calling ${url}: ${error instanceof Error ? error.message : String(error)}`);
|
|
187
229
|
}
|
|
188
230
|
}
|
|
189
|
-
async get(path) {
|
|
190
|
-
return this.request('GET', path);
|
|
231
|
+
async get(path, options) {
|
|
232
|
+
return this.request('GET', path, undefined, options);
|
|
191
233
|
}
|
|
192
|
-
async post(path, data) {
|
|
193
|
-
return this.request('POST', path, data);
|
|
234
|
+
async post(path, data, options) {
|
|
235
|
+
return this.request('POST', path, data, options);
|
|
194
236
|
}
|
|
195
|
-
async put(path, data) {
|
|
196
|
-
return this.request('PUT', path, data);
|
|
237
|
+
async put(path, data, options) {
|
|
238
|
+
return this.request('PUT', path, data, options);
|
|
197
239
|
}
|
|
198
|
-
async patch(path, data) {
|
|
199
|
-
return this.request('PATCH', path, data);
|
|
240
|
+
async patch(path, data, options) {
|
|
241
|
+
return this.request('PATCH', path, data, options);
|
|
200
242
|
}
|
|
201
|
-
async delete(path, data) {
|
|
202
|
-
return this.request('DELETE', path, data);
|
|
243
|
+
async delete(path, data, options) {
|
|
244
|
+
return this.request('DELETE', path, data, options);
|
|
203
245
|
}
|
|
204
246
|
}
|
|
205
247
|
//# sourceMappingURL=api-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,49 +8,52 @@
|
|
|
8
8
|
* This solves the problem where LLM sees displayId (#123) in responses but
|
|
9
9
|
* doesn't know to include workspaceId in follow-up tool calls.
|
|
10
10
|
*/
|
|
11
|
+
export interface ResolveResult {
|
|
12
|
+
workspaceId: string | null;
|
|
13
|
+
inferredFromContext: boolean;
|
|
14
|
+
}
|
|
11
15
|
declare class WorkspaceContextService {
|
|
12
16
|
private currentWorkspaceId;
|
|
13
17
|
private lastUpdated;
|
|
14
|
-
/**
|
|
15
|
-
* Set the current workspace context
|
|
16
|
-
* Called when a tool operation uses a specific workspace
|
|
17
|
-
*/
|
|
18
18
|
setWorkspace(workspaceId: string): void;
|
|
19
|
-
/**
|
|
20
|
-
* Get the current workspace context
|
|
21
|
-
*/
|
|
22
19
|
getWorkspace(): string | null;
|
|
23
|
-
/**
|
|
24
|
-
* Check if a string looks like a displayId (not UUID)
|
|
25
|
-
*/
|
|
26
20
|
isDisplayId(nodeId: string): boolean;
|
|
27
21
|
/**
|
|
28
|
-
* Resolve workspaceId for a tool call
|
|
22
|
+
* Resolve workspaceId for a tool call given any number of node identifiers,
|
|
23
|
+
* and report whether the result came from stored context (callers can warn
|
|
24
|
+
* the LLM that the value might be stale).
|
|
29
25
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
26
|
+
* 1. Explicit providedWorkspaceId always wins and updates the context.
|
|
27
|
+
* 2. Otherwise, if any nodeId looks like a displayId, fall back to the
|
|
28
|
+
* stored context and mark the result as inferred.
|
|
29
|
+
* 3. UUID-only inputs return null + not inferred.
|
|
32
30
|
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* @returns The resolved workspaceId or null
|
|
31
|
+
* Inputs are deliberately loose (`unknown`) so callers don't have to narrow
|
|
32
|
+
* `args.workspaceId` themselves at every site.
|
|
36
33
|
*/
|
|
37
|
-
|
|
34
|
+
resolve(providedWorkspaceId?: unknown, nodeIds?: ReadonlyArray<unknown>): ResolveResult;
|
|
38
35
|
/**
|
|
39
|
-
* Resolve
|
|
36
|
+
* Resolve and write the result back into a tool's args object so the
|
|
37
|
+
* downstream API call automatically picks up the inferred workspaceId.
|
|
38
|
+
* Returns the same info as `resolve()`.
|
|
40
39
|
*/
|
|
40
|
+
resolveInto(args: Record<string, unknown>, nodeIds: ReadonlyArray<unknown>, key?: string): ResolveResult;
|
|
41
|
+
/** @deprecated Use `resolve(providedWorkspaceId, [nodeId]).workspaceId`. */
|
|
42
|
+
resolveWorkspaceId(providedWorkspaceId?: string, nodeId?: string): string | null;
|
|
43
|
+
/** @deprecated Use `resolve(providedWorkspaceId, nodeIds).workspaceId`. */
|
|
41
44
|
resolveWorkspaceIdForBatch(providedWorkspaceId?: string, nodeIds?: string[]): string | null;
|
|
42
|
-
/**
|
|
43
|
-
* Clear the current context (e.g., on logout or session end)
|
|
44
|
-
*/
|
|
45
45
|
clear(): void;
|
|
46
|
-
/**
|
|
47
|
-
* Get context info for debugging
|
|
48
|
-
*/
|
|
49
46
|
getContextInfo(): {
|
|
50
47
|
workspaceId: string | null;
|
|
51
48
|
lastUpdated: Date | null;
|
|
52
49
|
};
|
|
53
50
|
}
|
|
54
51
|
export declare const workspaceContext: WorkspaceContextService;
|
|
52
|
+
/**
|
|
53
|
+
* Render the standard "workspaceId was inferred from prior context" notice.
|
|
54
|
+
* Returns an empty string when no notice should be shown so callers can
|
|
55
|
+
* unconditionally prepend it to their result text.
|
|
56
|
+
*/
|
|
57
|
+
export declare function inferredWorkspaceNotice(result: ResolveResult, variant?: 'preview' | 'result'): string;
|
|
55
58
|
export {};
|
|
56
59
|
//# sourceMappingURL=workspace-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-context.d.ts","sourceRoot":"","sources":["../../src/services/workspace-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,cAAM,uBAAuB;IAC3B,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,WAAW,CAAqB;IAExC
|
|
1
|
+
{"version":3,"file":"workspace-context.d.ts","sourceRoot":"","sources":["../../src/services/workspace-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,cAAM,uBAAuB;IAC3B,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,WAAW,CAAqB;IAExC,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAOvC,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAOpC;;;;;;;;;;;;OAYG;IACH,OAAO,CACL,mBAAmB,CAAC,EAAE,OAAO,EAC7B,OAAO,GAAE,aAAa,CAAC,OAAO,CAAM,GACnC,aAAa;IAgBhB;;;;OAIG;IACH,WAAW,CACT,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAC/B,GAAG,GAAE,MAAsB,GAC1B,aAAa;IAQhB,4EAA4E;IAC5E,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIhF,2EAA2E;IAC3E,0BAA0B,CACxB,mBAAmB,CAAC,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,MAAM,GAAG,IAAI;IAIhB,KAAK,IAAI,IAAI;IAKb,cAAc,IAAI;QAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE;CAM3E;AAGD,eAAO,MAAM,gBAAgB,yBAAgC,CAAC;AAE9D;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,SAAS,GAAG,QAAoB,GACxC,MAAM,CAOR"}
|