common-qa-mcp 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/adapters/factory.d.ts +17 -7
- package/dist/adapters/factory.d.ts.map +1 -1
- package/dist/adapters/factory.js +44 -7
- package/dist/adapters/factory.js.map +1 -1
- package/dist/adapters/http.d.ts +50 -0
- package/dist/adapters/http.d.ts.map +1 -0
- package/dist/adapters/http.js +108 -0
- package/dist/adapters/http.js.map +1 -0
- package/dist/adapters/remoteMcp/adapter.d.ts +16 -2
- package/dist/adapters/remoteMcp/adapter.d.ts.map +1 -1
- package/dist/adapters/remoteMcp/adapter.js +34 -5
- package/dist/adapters/remoteMcp/adapter.js.map +1 -1
- package/dist/adapters/simplifyqa/adapter.d.ts +437 -0
- package/dist/adapters/simplifyqa/adapter.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/adapter.js +3097 -0
- package/dist/adapters/simplifyqa/adapter.js.map +1 -0
- package/dist/adapters/simplifyqa/mapper.d.ts +95 -0
- package/dist/adapters/simplifyqa/mapper.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/mapper.js +858 -0
- package/dist/adapters/simplifyqa/mapper.js.map +1 -0
- package/dist/adapters/types.d.ts +168 -5
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/walnut/adapter.d.ts +235 -0
- package/dist/adapters/walnut/adapter.d.ts.map +1 -0
- package/dist/adapters/walnut/adapter.js +1114 -0
- package/dist/adapters/walnut/adapter.js.map +1 -0
- package/dist/adapters/walnut/mapper.d.ts +30 -9
- package/dist/adapters/walnut/mapper.d.ts.map +1 -1
- package/dist/adapters/walnut/mapper.js +149 -24
- package/dist/adapters/walnut/mapper.js.map +1 -1
- package/dist/config.d.ts +38 -14
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +73 -19
- package/dist/config.js.map +1 -1
- package/dist/connection.d.ts +3 -2
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +44 -15
- package/dist/connection.js.map +1 -1
- package/dist/domain/types.d.ts +680 -5
- package/dist/domain/types.d.ts.map +1 -1
- package/dist/drafts/store.d.ts +4 -1
- package/dist/drafts/store.d.ts.map +1 -1
- package/dist/drafts/store.js +7 -2
- package/dist/drafts/store.js.map +1 -1
- package/dist/initAgents.d.ts.map +1 -1
- package/dist/initAgents.js +48 -18
- package/dist/initAgents.js.map +1 -1
- package/dist/requestConnection.d.ts +5 -3
- package/dist/requestConnection.d.ts.map +1 -1
- package/dist/requestConnection.js +11 -5
- package/dist/requestConnection.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +47 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/backlog.tools.d.ts +13 -0
- package/dist/tools/backlog.tools.d.ts.map +1 -0
- package/dist/tools/backlog.tools.js +399 -0
- package/dist/tools/backlog.tools.js.map +1 -0
- package/dist/tools/connection.tools.js +5 -5
- package/dist/tools/connection.tools.js.map +1 -1
- package/dist/tools/defects.tools.d.ts +7 -0
- package/dist/tools/defects.tools.d.ts.map +1 -0
- package/dist/tools/defects.tools.js +82 -0
- package/dist/tools/defects.tools.js.map +1 -0
- package/dist/tools/discovery.tools.d.ts.map +1 -1
- package/dist/tools/discovery.tools.js +951 -43
- package/dist/tools/discovery.tools.js.map +1 -1
- package/dist/tools/formulas.tools.d.ts +7 -0
- package/dist/tools/formulas.tools.d.ts.map +1 -0
- package/dist/tools/formulas.tools.js +56 -0
- package/dist/tools/formulas.tools.js.map +1 -0
- package/dist/tools/heal.tools.d.ts +17 -0
- package/dist/tools/heal.tools.d.ts.map +1 -0
- package/dist/tools/heal.tools.js +76 -0
- package/dist/tools/heal.tools.js.map +1 -0
- package/dist/tools/markdown.d.ts +3 -3
- package/dist/tools/markdown.d.ts.map +1 -1
- package/dist/tools/markdown.js +89 -18
- package/dist/tools/markdown.js.map +1 -1
- package/dist/tools/objects.tools.d.ts +7 -0
- package/dist/tools/objects.tools.d.ts.map +1 -0
- package/dist/tools/objects.tools.js +201 -0
- package/dist/tools/objects.tools.js.map +1 -0
- package/dist/tools/recording.tools.d.ts.map +1 -1
- package/dist/tools/recording.tools.js +92 -12
- package/dist/tools/recording.tools.js.map +1 -1
- package/dist/tools/run.tools.d.ts.map +1 -1
- package/dist/tools/run.tools.js +464 -39
- package/dist/tools/run.tools.js.map +1 -1
- package/dist/tools/schemas.d.ts +21 -4
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +14 -1
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/storySync.tools.d.ts +66 -0
- package/dist/tools/storySync.tools.d.ts.map +1 -0
- package/dist/tools/storySync.tools.js +213 -0
- package/dist/tools/storySync.tools.js.map +1 -0
- package/dist/tools/tasks.tools.d.ts +7 -0
- package/dist/tools/tasks.tools.d.ts.map +1 -0
- package/dist/tools/tasks.tools.js +75 -0
- package/dist/tools/tasks.tools.js.map +1 -0
- package/dist/tools/testcase.tools.d.ts.map +1 -1
- package/dist/tools/testcase.tools.js +162 -101
- package/dist/tools/testcase.tools.js.map +1 -1
- package/dist/tools/testdata.tools.d.ts +7 -0
- package/dist/tools/testdata.tools.d.ts.map +1 -0
- package/dist/tools/testdata.tools.js +249 -0
- package/dist/tools/testdata.tools.js.map +1 -0
- package/package.json +3 -3
package/dist/config.js
CHANGED
|
@@ -64,6 +64,9 @@ function normalizeLayer(raw) {
|
|
|
64
64
|
const baseUrl = asString(raw['baseUrl']);
|
|
65
65
|
if (baseUrl)
|
|
66
66
|
layer.baseUrl = baseUrl;
|
|
67
|
+
const userId = asString(raw['userId']);
|
|
68
|
+
if (userId)
|
|
69
|
+
layer.userId = userId;
|
|
67
70
|
return layer;
|
|
68
71
|
}
|
|
69
72
|
function parseEnvLayer(env) {
|
|
@@ -80,6 +83,7 @@ function parseEnvLayer(env) {
|
|
|
80
83
|
walnutUiOrigin: env['QA_MCP_WALNUT_UI'],
|
|
81
84
|
agentUrl: env['QA_MCP_AGENT_URL'],
|
|
82
85
|
baseUrl: env['QA_BASE_URL'],
|
|
86
|
+
userId: env['QA_MCP_USER_ID'],
|
|
83
87
|
});
|
|
84
88
|
}
|
|
85
89
|
// Reads the named connection out of ~/.common-qa-mcp/config.json. An absent
|
|
@@ -107,45 +111,95 @@ function applyLayer(target, layer) {
|
|
|
107
111
|
target[key] = value;
|
|
108
112
|
}
|
|
109
113
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
/**
|
|
115
|
+
* A token "looks like a JWT" when it is exactly three non-empty base64url segments separated by dots
|
|
116
|
+
* (header.payload.signature). Used to AUTO-DETECT the auth mode: a Walnut user JWT → 'jwt' (Bearer +
|
|
117
|
+
* x-project-id + x-user-id), anything else (an MCP API key) → 'key' (Bearer only). No decode/verify —
|
|
118
|
+
* shape alone is enough to pick the header set; the backend re-verifies the token itself.
|
|
119
|
+
*/
|
|
120
|
+
export function looksLikeJwt(token) {
|
|
121
|
+
const parts = token.split('.');
|
|
122
|
+
return parts.length === 3 && parts.every((p) => p.length > 0 && /^[A-Za-z0-9_-]+$/.test(p));
|
|
123
|
+
}
|
|
124
|
+
/** Decode a string claim from a JWT payload WITHOUT verifying the signature. Verification is the
|
|
125
|
+
* backend's job; this only extracts embedded metadata (e.g. SQA tokens carry a `url` claim naming
|
|
126
|
+
* the SimplifyQA backend). Returns undefined on any parse failure — never throws. */
|
|
127
|
+
export function jwtStringClaim(token, name) {
|
|
128
|
+
if (!token)
|
|
129
|
+
return undefined;
|
|
130
|
+
try {
|
|
131
|
+
const t = token.startsWith('Bearer ') ? token.slice(7).trim() : token.trim();
|
|
132
|
+
const seg = t.split('.')[1];
|
|
133
|
+
if (!seg)
|
|
134
|
+
return undefined;
|
|
135
|
+
let b64 = seg.replace(/-/g, '+').replace(/_/g, '/');
|
|
136
|
+
b64 += '='.repeat((4 - (b64.length % 4)) % 4);
|
|
137
|
+
const claims = JSON.parse(Buffer.from(b64, 'base64').toString('utf8'));
|
|
138
|
+
const v = claims[name];
|
|
139
|
+
return typeof v === 'string' && v.length > 0 ? v : undefined;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
117
145
|
/**
|
|
118
146
|
* Resolution order (spec §12): defaults -> ~/.common-qa-mcp/config.json
|
|
119
147
|
* (named connections; cliFlags.connection selects) -> QA_MCP_* env -> CLI flags.
|
|
120
148
|
* Each layer only overrides keys it actually sets.
|
|
121
149
|
*
|
|
122
|
-
* Credentials
|
|
123
|
-
* -
|
|
124
|
-
*
|
|
125
|
-
* -
|
|
126
|
-
*
|
|
127
|
-
* -
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
150
|
+
* Credentials are optional overall (design note §3):
|
|
151
|
+
* - token AND baseUrl AND url ALL ABSENT -> OfflineQaConfig, no throw. The normal, supported way to
|
|
152
|
+
* run with no backend at all (author drafts, hand off to the editor).
|
|
153
|
+
* - a PARTIAL set (a baseUrl/url but no token, or a token but neither baseUrl nor url) ->
|
|
154
|
+
* misconfiguration, throws naming what is missing.
|
|
155
|
+
* - token + at least one of (baseUrl | url) -> ConnectedQaConfig. `baseUrl` (QA_BASE_URL) is the
|
|
156
|
+
* Walnut backend for direct data ops; `url` (QA_MCP_URL) is the agent /mcp endpoint (recording +
|
|
157
|
+
* the legacy/SimplifyQA forwarder). projectId is OPTIONAL: absent means "connected, no project
|
|
158
|
+
* selected yet" and the user chooses one at runtime.
|
|
159
|
+
*
|
|
160
|
+
* Auth mode is AUTO-DETECTED from the token shape (jwt vs key) unless QA_MCP_WALNUT_AUTH is set
|
|
161
|
+
* explicitly (env/config-file/CLI), which always wins. Never logs `token` -- callers must go through
|
|
162
|
+
* `mask()` from log.ts if they log config at all.
|
|
131
163
|
*/
|
|
132
164
|
export function resolveConfig(env, cliFlags = {}) {
|
|
133
165
|
const merged = {
|
|
134
|
-
walnutAuth: 'key',
|
|
135
166
|
caps: new Set(DEFAULT_CAPS),
|
|
136
167
|
};
|
|
137
168
|
applyLayer(merged, readConfigFileLayer(cliFlags.connection));
|
|
138
169
|
applyLayer(merged, parseEnvLayer(env));
|
|
139
170
|
applyLayer(merged, cliFlags);
|
|
140
|
-
|
|
141
|
-
|
|
171
|
+
// Auth mode: an explicit QA_MCP_WALNUT_AUTH (env/config-file/CLI) always wins; otherwise auto-detect
|
|
172
|
+
// from the token — a JWT-shaped token → 'jwt', anything else → 'key'. Offline (no token) keeps the
|
|
173
|
+
// harmless 'key' default. Computed AFTER the token is known (below the layer merge).
|
|
174
|
+
merged.walnutAuth = merged.walnutAuth ?? (merged.token && looksLikeJwt(merged.token) ? 'jwt' : 'key');
|
|
175
|
+
const hasToken = !!merged.token;
|
|
176
|
+
const hasUrl = !!merged.url;
|
|
177
|
+
const hasBaseUrl = !!merged.baseUrl;
|
|
178
|
+
if (!hasToken && !hasUrl && !hasBaseUrl) {
|
|
142
179
|
// No credentials supplied at all -- offline is the intended, error-free outcome.
|
|
143
180
|
return { ...merged, mode: 'offline' };
|
|
144
181
|
}
|
|
182
|
+
// A partial set is a misconfiguration -- name exactly what is missing.
|
|
183
|
+
const missing = [];
|
|
184
|
+
if (!hasToken)
|
|
185
|
+
missing.push('QA_MCP_TOKEN');
|
|
186
|
+
if (!hasUrl && !hasBaseUrl)
|
|
187
|
+
missing.push('QA_BASE_URL or QA_MCP_URL');
|
|
145
188
|
if (missing.length) {
|
|
146
189
|
throw new Error(`Missing required configuration: set ${missing.join(', ')} (via environment variables, ` +
|
|
147
190
|
`~/.common-qa-mcp/config.json, or CLI flags).`);
|
|
148
191
|
}
|
|
192
|
+
// SimplifyQA specifically needs a resolvable base URL — either QA_BASE_URL, or a JWT whose
|
|
193
|
+
// payload carries the `url` claim. Without one, the factory would silently fall back to the
|
|
194
|
+
// agent-forwarder (RemoteMcpAdapter), and every common tool (list_projects, tc_list, …) would
|
|
195
|
+
// require the local agent to be running just to make what are really direct REST calls. Fail loud
|
|
196
|
+
// at boot instead so the user fixes the config.
|
|
197
|
+
if (merged.provider === 'simplifyqa' && !hasBaseUrl && !jwtStringClaim(merged.token, 'url')) {
|
|
198
|
+
throw new Error('SimplifyQA needs a base URL for direct REST calls. Set QA_BASE_URL in mcp.json (or ' +
|
|
199
|
+
'~/.common-qa-mcp/config.json), or use a token JWT that embeds the "url" claim. ' +
|
|
200
|
+
'QA_MCP_URL (the local agent) alone is not enough — read-only tools (list_projects, ' +
|
|
201
|
+
'tc_list, story_list, …) call the SimplifyQA backend directly and do not need the agent.');
|
|
202
|
+
}
|
|
149
203
|
return { ...merged, mode: 'connected' };
|
|
150
204
|
}
|
|
151
205
|
// A probe that throws (DNS failure, TLS failure, timeout, connection refused) is not a
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/connection.d.ts
CHANGED
|
@@ -30,8 +30,9 @@
|
|
|
30
30
|
import type { ProviderAdapter } from './adapters/types.js';
|
|
31
31
|
import type { QaConfig } from './config.js';
|
|
32
32
|
export interface ConnectRequest {
|
|
33
|
-
/**
|
|
34
|
-
|
|
33
|
+
/** The MCP endpoint to hop to: the local agent `/mcp` (walnut recording) or the SimplifyQA `/mcp`.
|
|
34
|
+
* OPTIONAL for a walnut DIRECT connection — pass `baseUrl` (the backend) instead/as well. */
|
|
35
|
+
url?: string;
|
|
35
36
|
/** Bearer token: a Walnut session JWT, or an MCP API key. */
|
|
36
37
|
token: string;
|
|
37
38
|
/** Required for a JWT (the token alone carries no project context); optional for an API key,
|
package/dist/connection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAqB,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAqB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO/D,MAAM,WAAW,cAAc;IAC7B;kGAC8F;IAC9F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd;uDACmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;2CACuC;IACvC,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACrB;qGACiG;IACjG,OAAO,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IAClC;qFACiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,SAAS,GAAG,WAAW,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACrB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;sBACkB;IAClB,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;CACvD;AAED,qBAAa,YAAY;IAOX,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,MAAM,CAAyB;IACvC,kGAAkG;IAClG,OAAO,CAAC,SAAS,CAAyB;gBAEb,OAAO,EAAE,QAAQ;IAuB9C,uFAAuF;IACvF,OAAO,IAAI,eAAe,GAAG,IAAI;IAOjC,MAAM,IAAI,QAAQ;IAIlB,QAAQ,IAAI,qBAAqB;IAgBjC;;;;;;OAMG;IACG,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAmFvG;;;;;OAKG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA2B3G;+DAC2D;IAC3D,UAAU,IAAI,IAAI;CAOnB"}
|
package/dist/connection.js
CHANGED
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
* different orgs through the same agent would share it. Documented rather than pretended away.
|
|
29
29
|
*/
|
|
30
30
|
import { createAdapter } from './adapters/factory.js';
|
|
31
|
+
import { jwtStringClaim, looksLikeJwt } from './config.js';
|
|
31
32
|
import { readLastProject, writeLastProject } from './projectStore.js';
|
|
32
33
|
import { createLogger } from './vendor/logger.js';
|
|
33
34
|
const logger = createLogger('QaConnection');
|
|
@@ -47,10 +48,13 @@ export class QaConnection {
|
|
|
47
48
|
// is since stale, project-scoped calls fail cleanly and the user can switch — the connection
|
|
48
49
|
// itself is fine.
|
|
49
50
|
if (startup.mode === 'connected' && !startup.projectId) {
|
|
50
|
-
|
|
51
|
+
// Key the remembered project by the effective backend base: `url` (agent /mcp) for the
|
|
52
|
+
// legacy/SQA forwarder, else `baseUrl` (QA_BASE_URL) for the direct walnut path.
|
|
53
|
+
const key = startup.url ?? startup.baseUrl ?? '';
|
|
54
|
+
const remembered = readLastProject(key);
|
|
51
55
|
if (remembered) {
|
|
52
56
|
this.current = { ...startup, projectId: remembered };
|
|
53
|
-
logger.info(`Restored last-selected project ${remembered} for ${
|
|
57
|
+
logger.info(`Restored last-selected project ${remembered} for ${key}`);
|
|
54
58
|
}
|
|
55
59
|
}
|
|
56
60
|
}
|
|
@@ -69,9 +73,12 @@ export class QaConnection {
|
|
|
69
73
|
const c = this.current;
|
|
70
74
|
if (c.mode !== 'connected')
|
|
71
75
|
return { mode: 'offline', source: this.source };
|
|
76
|
+
// The effective backend base: `url` (agent /mcp) for the legacy/SQA forwarder, else `baseUrl`
|
|
77
|
+
// (QA_BASE_URL) for the direct walnut path. Omitted entirely if somehow neither is set.
|
|
78
|
+
const effectiveUrl = c.url ?? c.baseUrl;
|
|
72
79
|
return {
|
|
73
80
|
mode: 'connected',
|
|
74
|
-
url:
|
|
81
|
+
...(effectiveUrl ? { url: effectiveUrl } : {}),
|
|
75
82
|
projectId: c.projectId ?? '', // '' = connected but no project selected yet
|
|
76
83
|
auth: c.walnutAuth === 'key' ? 'key' : 'jwt',
|
|
77
84
|
token: `present (${c.token.length} chars)`,
|
|
@@ -86,18 +93,41 @@ export class QaConnection {
|
|
|
86
93
|
* and is visible to that token. On failure NOTHING changes.
|
|
87
94
|
*/
|
|
88
95
|
async connect(req) {
|
|
89
|
-
const url = req.url?.trim();
|
|
90
96
|
// Tolerate a pasted/`headers.Authorization`-style "Bearer <token>": the field is labelled
|
|
91
97
|
// "Bearer token" and MCP-client header values carry the scheme, but we add `Bearer ` ourselves
|
|
92
98
|
// downstream -- so keep only the raw credential and never send "Bearer Bearer ...".
|
|
93
99
|
const token = (req.token ?? '').trim().replace(/^Bearer\s+/i, '').trim();
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (!/^https?:\/\//i.test(url)) {
|
|
97
|
-
return { ok: false, error: `url must be absolute and start with http:// or https:// -- got "${url}".` };
|
|
98
|
-
}
|
|
100
|
+
const url = req.url?.trim();
|
|
101
|
+
const baseUrl = req.baseUrl?.trim().replace(/\/+$/, '');
|
|
99
102
|
const product = req.product === 'simplifyqa' ? 'simplifyqa' : 'walnut';
|
|
100
|
-
|
|
103
|
+
if (!token)
|
|
104
|
+
return { ok: false, error: 'token is required.' };
|
|
105
|
+
// A connection needs an endpoint. `baseUrl` (QA_BASE_URL) is the product BACKEND REST base for
|
|
106
|
+
// direct data ops; `url` (QA_MCP_URL) is an MCP endpoint to hop to — the local agent (recording,
|
|
107
|
+
// not-yet-ported writes). SimplifyQA specifically must have baseUrl (or a JWT embedding `url`)
|
|
108
|
+
// so common tools (list_projects, tc_list, …) speak SQA REST directly and don't require the
|
|
109
|
+
// agent to be running.
|
|
110
|
+
if (product === 'simplifyqa' && !baseUrl && !jwtStringClaim(token, 'url')) {
|
|
111
|
+
return {
|
|
112
|
+
ok: false,
|
|
113
|
+
error: 'SimplifyQA needs a base URL: pass baseUrl=<your SimplifyQA URL>, or use a JWT that ' +
|
|
114
|
+
'embeds the "url" claim. The agent url alone is not enough — read-only tools ' +
|
|
115
|
+
'(list_projects, tc_list, story_list, …) call the SimplifyQA backend directly and should ' +
|
|
116
|
+
'keep working even when the local agent is off.',
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (!url && !baseUrl) {
|
|
120
|
+
return { ok: false, error: 'Provide baseUrl (the product backend) and/or url (the agent /mcp) — at least one is required.' };
|
|
121
|
+
}
|
|
122
|
+
if (url && !/^https?:\/\//i.test(url)) {
|
|
123
|
+
return { ok: false, error: `url must be absolute and start with http:// or https:// — got "${url}".` };
|
|
124
|
+
}
|
|
125
|
+
if (baseUrl && !/^https?:\/\//i.test(baseUrl)) {
|
|
126
|
+
return { ok: false, error: `baseUrl must be absolute and start with http:// or https:// — got "${baseUrl}".` };
|
|
127
|
+
}
|
|
128
|
+
// Auth mode: explicit wins; else auto-detect from the token shape (JWT vs key) — same rule as the
|
|
129
|
+
// startup config (config.ts looksLikeJwt). A JWT sends x-project-id; a key sends Authorization only.
|
|
130
|
+
const auth = req.auth === 'key' ? 'key' : req.auth === 'jwt' ? 'jwt' : (looksLikeJwt(token) ? 'jwt' : 'key');
|
|
101
131
|
const projectId = req.projectId?.trim() ?? '';
|
|
102
132
|
// The JWT-needs-projectId rule is Walnut-specific (it sends x-project-id). SQA forwards the token
|
|
103
133
|
// to its own MCP, which resolves tenant context however it likes, so we don't force it there.
|
|
@@ -108,17 +138,16 @@ export class QaConnection {
|
|
|
108
138
|
+ 'Pass projectId, or auth:"key" if this is an MCP API key.',
|
|
109
139
|
};
|
|
110
140
|
}
|
|
111
|
-
const baseUrl = req.baseUrl?.trim().replace(/\/+$/, '');
|
|
112
141
|
const candidate = {
|
|
113
142
|
...this.startup,
|
|
114
143
|
mode: 'connected',
|
|
115
144
|
provider: product,
|
|
116
|
-
url: url.replace(/\/+$/, ''),
|
|
117
145
|
token,
|
|
118
146
|
// An API key is project-scoped server-side; keep whatever the startup config had so
|
|
119
147
|
// project-scoped helpers still have something to name, but never require it.
|
|
120
148
|
projectId: projectId || (this.startup.projectId ?? ''),
|
|
121
149
|
walnutAuth: auth,
|
|
150
|
+
...(url ? { url: url.replace(/\/+$/, '') } : {}),
|
|
122
151
|
...(baseUrl ? { baseUrl } : {}),
|
|
123
152
|
};
|
|
124
153
|
const probe = createAdapter(candidate);
|
|
@@ -133,9 +162,9 @@ export class QaConnection {
|
|
|
133
162
|
// Remember the project so a later restart reboots into it (see projectStore). Only when one
|
|
134
163
|
// was actually chosen — a key-scoped connect may carry none.
|
|
135
164
|
if (candidate.projectId)
|
|
136
|
-
writeLastProject(candidate.url, candidate.projectId);
|
|
165
|
+
writeLastProject(candidate.url ?? candidate.baseUrl ?? '', candidate.projectId);
|
|
137
166
|
// URL and project only -- never the token, not even truncated.
|
|
138
|
-
logger.info(`Connected to ${candidate.url} (project ${candidate.projectId || '(key-scoped)'}, auth ${auth})`);
|
|
167
|
+
logger.info(`Connected to ${candidate.url ?? candidate.baseUrl} (project ${candidate.projectId || '(key-scoped)'}, auth ${auth})`);
|
|
139
168
|
return { ok: true, info };
|
|
140
169
|
}
|
|
141
170
|
catch (err) {
|
|
@@ -169,7 +198,7 @@ export class QaConnection {
|
|
|
169
198
|
this.cachedFor = candidate;
|
|
170
199
|
this.source = 'runtime-connect';
|
|
171
200
|
// Remember it so a restart reboots into this project instead of project-less (projectStore).
|
|
172
|
-
writeLastProject(candidate.url, pid);
|
|
201
|
+
writeLastProject(candidate.url ?? candidate.baseUrl ?? '', pid);
|
|
173
202
|
logger.info(`Switched to project ${pid}`);
|
|
174
203
|
return { ok: true, info };
|
|
175
204
|
}
|
package/dist/connection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|