@aexol/spectral 0.9.54 → 0.9.58
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/commands/login.d.ts +1 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +12 -0
- package/dist/extensions/aexol-mcp.d.ts.map +1 -1
- package/dist/extensions/aexol-mcp.js +42 -52
- package/dist/extensions/kanban-bridge.d.ts.map +1 -1
- package/dist/extensions/kanban-bridge.js +126 -27
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +12 -0
- package/dist/server/handlers/projects.js +4 -4
- package/dist/server/storage.d.ts +3 -0
- package/dist/server/storage.d.ts.map +1 -1
- package/dist/server/storage.js +47 -9
- package/dist/server/wire.d.ts +2 -0
- package/dist/server/wire.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/commands/login.d.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* 2b. OAuth: open browser for Aexol Studio authorization.
|
|
10
10
|
* 3. Verify reachability + auth by calling tools/list against the URL.
|
|
11
11
|
* 4. On success: persist to ~/.spectral/config.json (mode 0600).
|
|
12
|
+
* 5. Chain OAuth to also obtain a user JWT for Kanban/Studio features.
|
|
12
13
|
*
|
|
13
14
|
* Exits non-zero on any failure so shell scripts can detect it.
|
|
14
15
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAiBH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqCzF;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAqF9C"}
|
package/dist/commands/login.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* 2b. OAuth: open browser for Aexol Studio authorization.
|
|
10
10
|
* 3. Verify reachability + auth by calling tools/list against the URL.
|
|
11
11
|
* 4. On success: persist to ~/.spectral/config.json (mode 0600).
|
|
12
|
+
* 5. Chain OAuth to also obtain a user JWT for Kanban/Studio features.
|
|
12
13
|
*
|
|
13
14
|
* Exits non-zero on any failure so shell scripts can detect it.
|
|
14
15
|
*
|
|
@@ -20,6 +21,7 @@ import { password, select } from "@inquirer/prompts";
|
|
|
20
21
|
import pc from "picocolors";
|
|
21
22
|
import { TEAM_API_KEY_PREFIX, getApiUrl, getConfigFile, validateTeamApiKey, writeConfig, } from "../config.js";
|
|
22
23
|
import { AexolMcpClient, AexolMcpError } from "../mcp-client.js";
|
|
24
|
+
import { runOAuthFlow } from "../auth-helper.js";
|
|
23
25
|
/**
|
|
24
26
|
* Pure login logic. Throws `Error` with one of these stable message prefixes:
|
|
25
27
|
* - "Invalid API key prefix" — local validation failed
|
|
@@ -126,4 +128,14 @@ export async function runLogin() {
|
|
|
126
128
|
}
|
|
127
129
|
process.stdout.write(pc.green(`✓ Authenticated. Found ${result.toolCount} tools.\n`));
|
|
128
130
|
process.stdout.write(pc.dim(`Saved credentials to ${getConfigFile()}\n`));
|
|
131
|
+
// Chain OAuth for Kanban/Studio features (non-fatal — MCP tools work without it)
|
|
132
|
+
process.stdout.write(pc.dim("\nAuthorizing for Aexol Studio features (Kanban)...\n"));
|
|
133
|
+
const oauthResult = await runOAuthFlow(apiUrl);
|
|
134
|
+
if (oauthResult.ok) {
|
|
135
|
+
process.stdout.write(pc.green("✓ CLI authorized for Studio/Kanban.\n"));
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
process.stderr.write(pc.yellow(`⚠ OAuth authorization skipped (${oauthResult.reason}). Kanban/Studio features may not be available.\n`));
|
|
139
|
+
process.stderr.write(pc.dim(" Run `spectral login` and choose OAuth to set it up later.\n"));
|
|
140
|
+
}
|
|
129
141
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aexol-mcp.d.ts","sourceRoot":"","sources":["../../src/extensions/aexol-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoC,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"aexol-mcp.d.ts","sourceRoot":"","sources":["../../src/extensions/aexol-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoC,MAAM,8BAA8B,CAAC;AAiKnG,wBAA8B,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsShF"}
|
|
@@ -80,22 +80,16 @@ function toLabel(name) {
|
|
|
80
80
|
// ---------------------------------------------------------------------------
|
|
81
81
|
// Studio binding – in-memory cache, refreshed on startup & by local tools
|
|
82
82
|
// ---------------------------------------------------------------------------
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
let bindingMtimeMs = null;
|
|
83
|
+
/** Per-cwd binding cache — eliminates races when multiple sessions share a process. */
|
|
84
|
+
const bindingCache = new Map();
|
|
86
85
|
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* new conversation. The AgentBridge's reloadProjectBindings() refreshes model
|
|
91
|
-
* proxy routing, but the aexol-mcp extension's currentBinding is only read at
|
|
92
|
-
* session_start otherwise. mtime caching keeps the common case (no change) at
|
|
93
|
-
* a single cheap stat() per remote_* call.
|
|
86
|
+
* Per-cwd binding reader. Reads `.aexol/aexol.jsonc` under the given
|
|
87
|
+
* working directory with mtime caching. The cache key is the cwd itself,
|
|
88
|
+
* so concurrent sessions serving different projects never interfere.
|
|
94
89
|
*/
|
|
95
|
-
async function
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const bindingFile = join(sessionCwd, ".aexol", "aexol.jsonc");
|
|
90
|
+
async function refreshBindingForCwd(cwd) {
|
|
91
|
+
const bindingFile = join(cwd, ".aexol", "aexol.jsonc");
|
|
92
|
+
const cached = bindingCache.get(cwd);
|
|
99
93
|
let mtimeMs;
|
|
100
94
|
try {
|
|
101
95
|
mtimeMs = (await stat(bindingFile)).mtimeMs;
|
|
@@ -103,24 +97,23 @@ async function refreshBindingFromDisk() {
|
|
|
103
97
|
catch (err) {
|
|
104
98
|
const code = err.code;
|
|
105
99
|
if (code === "ENOENT" || code === "ENOTDIR") {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
bindingMtimeMs = null;
|
|
109
|
-
}
|
|
110
|
-
return;
|
|
100
|
+
bindingCache.set(cwd, { binding: null, mtimeMs: null });
|
|
101
|
+
return null;
|
|
111
102
|
}
|
|
112
103
|
// Non-fatal: keep the last known binding.
|
|
113
|
-
return;
|
|
104
|
+
return cached?.binding ?? null;
|
|
114
105
|
}
|
|
115
|
-
if (mtimeMs ===
|
|
116
|
-
return;
|
|
106
|
+
if (cached && mtimeMs === cached.mtimeMs)
|
|
107
|
+
return cached.binding;
|
|
117
108
|
try {
|
|
118
|
-
|
|
119
|
-
|
|
109
|
+
const binding = await readStudioBinding(cwd);
|
|
110
|
+
bindingCache.set(cwd, { binding, mtimeMs });
|
|
111
|
+
return binding;
|
|
120
112
|
}
|
|
121
113
|
catch {
|
|
122
114
|
// Parse error etc. — keep last known binding, force re-read next time.
|
|
123
|
-
|
|
115
|
+
bindingCache.set(cwd, { binding: cached?.binding ?? null, mtimeMs: null });
|
|
116
|
+
return cached?.binding ?? null;
|
|
124
117
|
}
|
|
125
118
|
}
|
|
126
119
|
/**
|
|
@@ -141,15 +134,15 @@ const MODEL_INJECTING_TOOLS = new Set([
|
|
|
141
134
|
]);
|
|
142
135
|
const SPECTRAL_PROXY_USER_MODEL = "spectral-proxy-user-model";
|
|
143
136
|
const BUILT_IN_PREFIX = "built-in/";
|
|
144
|
-
function augmentParams(toolName, params, ctx) {
|
|
137
|
+
function augmentParams(toolName, params, ctx, binding) {
|
|
145
138
|
if (!toolName.startsWith("remote_"))
|
|
146
139
|
return { params };
|
|
147
140
|
const augmented = { ...params };
|
|
148
|
-
if (
|
|
149
|
-
augmented.teamId =
|
|
141
|
+
if (binding?.teamId && !("teamId" in params)) {
|
|
142
|
+
augmented.teamId = binding.teamId;
|
|
150
143
|
}
|
|
151
|
-
if (
|
|
152
|
-
augmented.projectId =
|
|
144
|
+
if (binding?.projectId && !("projectId" in params)) {
|
|
145
|
+
augmented.projectId = binding.projectId;
|
|
153
146
|
}
|
|
154
147
|
if (MODEL_INJECTING_TOOLS.has(toolName)) {
|
|
155
148
|
const model = ctx.model;
|
|
@@ -185,13 +178,12 @@ export default async function aexolMcpExtension(ext) {
|
|
|
185
178
|
const client = new AexolMcpClient(apiUrl, token);
|
|
186
179
|
// ---- Load local Studio binding on session start --------------------------
|
|
187
180
|
ext.on("session_start", async (_event, ctx) => {
|
|
188
|
-
sessionCwd = ctx.cwd;
|
|
189
181
|
try {
|
|
190
|
-
await
|
|
191
|
-
if (
|
|
192
|
-
const displayName =
|
|
193
|
-
process.stderr.write(`[aexol-mcp] Studio binding found: ${displayName} (${
|
|
194
|
-
(
|
|
182
|
+
const binding = await refreshBindingForCwd(ctx.cwd);
|
|
183
|
+
if (binding) {
|
|
184
|
+
const displayName = binding.name ?? binding.projectId;
|
|
185
|
+
process.stderr.write(`[aexol-mcp] Studio binding found: ${displayName} (${binding.projectId})` +
|
|
186
|
+
(binding.teamId ? `, team ${binding.teamId}` : "") +
|
|
195
187
|
`\n`);
|
|
196
188
|
}
|
|
197
189
|
}
|
|
@@ -253,8 +245,8 @@ export default async function aexolMcpExtension(ext) {
|
|
|
253
245
|
description: tool.description ?? "",
|
|
254
246
|
parameters,
|
|
255
247
|
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
256
|
-
await
|
|
257
|
-
const augmented = augmentParams(tool.name, params, ctx);
|
|
248
|
+
const binding = await refreshBindingForCwd(ctx.cwd);
|
|
249
|
+
const augmented = augmentParams(tool.name, params, ctx, binding);
|
|
258
250
|
if ("error" in augmented) {
|
|
259
251
|
return {
|
|
260
252
|
content: [{ type: "text", text: augmented.error }],
|
|
@@ -335,10 +327,8 @@ export default async function aexolMcpExtension(ext) {
|
|
|
335
327
|
};
|
|
336
328
|
try {
|
|
337
329
|
await writeStudioBinding(binding, ctx.cwd);
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
currentBinding = binding;
|
|
341
|
-
bindingMtimeMs = null;
|
|
330
|
+
// Invalidate the per-cwd cache so the next refreshBindingForCwd re-reads.
|
|
331
|
+
bindingCache.set(ctx.cwd, { binding, mtimeMs: null });
|
|
342
332
|
const displayName = binding.name ?? binding.projectId;
|
|
343
333
|
return {
|
|
344
334
|
content: [{
|
|
@@ -377,20 +367,19 @@ export default async function aexolMcpExtension(ext) {
|
|
|
377
367
|
properties: {},
|
|
378
368
|
},
|
|
379
369
|
async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {
|
|
380
|
-
|
|
370
|
+
const binding = await refreshBindingForCwd(ctx.cwd);
|
|
371
|
+
if (!binding) {
|
|
381
372
|
return {
|
|
382
373
|
content: [{ type: "text", text: "No Studio binding found in this directory — nothing to unbind." }],
|
|
383
374
|
details: { isError: false },
|
|
384
375
|
};
|
|
385
376
|
}
|
|
386
|
-
const displayName =
|
|
387
|
-
const projectId =
|
|
377
|
+
const displayName = binding.name ?? binding.projectId;
|
|
378
|
+
const projectId = binding.projectId;
|
|
388
379
|
try {
|
|
389
380
|
const deleted = await deleteStudioBinding(ctx.cwd);
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
currentBinding = null;
|
|
393
|
-
bindingMtimeMs = null;
|
|
381
|
+
// Invalidate the per-cwd cache.
|
|
382
|
+
bindingCache.set(ctx.cwd, { binding: null, mtimeMs: null });
|
|
394
383
|
if (deleted) {
|
|
395
384
|
return {
|
|
396
385
|
content: [{
|
|
@@ -430,8 +419,9 @@ export default async function aexolMcpExtension(ext) {
|
|
|
430
419
|
type: "object",
|
|
431
420
|
properties: {},
|
|
432
421
|
},
|
|
433
|
-
async execute() {
|
|
434
|
-
|
|
422
|
+
async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {
|
|
423
|
+
const binding = await refreshBindingForCwd(ctx.cwd);
|
|
424
|
+
if (!binding) {
|
|
435
425
|
return {
|
|
436
426
|
content: [{
|
|
437
427
|
type: "text",
|
|
@@ -444,7 +434,7 @@ export default async function aexolMcpExtension(ext) {
|
|
|
444
434
|
return {
|
|
445
435
|
content: [{
|
|
446
436
|
type: "text",
|
|
447
|
-
text: JSON.stringify(
|
|
437
|
+
text: JSON.stringify(binding, null, 2),
|
|
448
438
|
}],
|
|
449
439
|
details: { isError: false },
|
|
450
440
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kanban-bridge.d.ts","sourceRoot":"","sources":["../../src/extensions/kanban-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoC,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"kanban-bridge.d.ts","sourceRoot":"","sources":["../../src/extensions/kanban-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoC,MAAM,8BAA8B,CAAC;AA09BnG,wBAA8B,qBAAqB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCpF"}
|
|
@@ -43,11 +43,32 @@ async function graphqlRequest(opts, query, variables) {
|
|
|
43
43
|
catch { /* ignore */ }
|
|
44
44
|
throw new GraphQLError(`HTTP ${res.status} from GraphQL${detail ? `: ${detail}` : ""}`, res.status);
|
|
45
45
|
}
|
|
46
|
-
const
|
|
46
|
+
const rawBody = await res.text();
|
|
47
|
+
let json;
|
|
48
|
+
try {
|
|
49
|
+
json = JSON.parse(rawBody);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
throw new GraphQLError(`GraphQL returned non-JSON response (${res.status}): ${rawBody.slice(0, 200)}`);
|
|
53
|
+
}
|
|
47
54
|
if (json.errors && json.errors.length > 0) {
|
|
48
|
-
|
|
55
|
+
const errDetail = json.errors.map((e) => {
|
|
56
|
+
let s = e.message;
|
|
57
|
+
if (e.extensions?.code)
|
|
58
|
+
s += ` [code: ${e.extensions.code}]`;
|
|
59
|
+
return s;
|
|
60
|
+
}).join("; ");
|
|
61
|
+
// Detect auth-related errors — the backend returns 200 with auth errors in the body
|
|
62
|
+
const isAuthError = json.errors.some((e) => e.extensions?.code === "UNAUTHENTICATED" ||
|
|
63
|
+
(e.extensions?.originalError &&
|
|
64
|
+
typeof e.extensions.originalError === "object" &&
|
|
65
|
+
e.extensions.originalError.message === "Authentication required"));
|
|
66
|
+
process.stderr.write(`[kanban-bridge] GraphQL errors from ${opts.backendUrl}/graphql (project ${opts.projectId}): ${errDetail}\n`);
|
|
67
|
+
process.stderr.write(`[kanban-bridge] Full response: ${rawBody.slice(0, 500)}\n`);
|
|
68
|
+
throw new GraphQLError(errDetail, isAuthError ? 401 : undefined);
|
|
49
69
|
}
|
|
50
70
|
if (!json.data) {
|
|
71
|
+
process.stderr.write(`[kanban-bridge] GraphQL missing data from ${opts.backendUrl}/graphql (project ${opts.projectId}): ${rawBody.slice(0, 500)}\n`);
|
|
51
72
|
throw new GraphQLError("GraphQL response missing data");
|
|
52
73
|
}
|
|
53
74
|
return json.data;
|
|
@@ -164,14 +185,42 @@ async function deleteKanbanTask(opts, taskId) {
|
|
|
164
185
|
// ---------------------------------------------------------------------------
|
|
165
186
|
// Config resolution
|
|
166
187
|
// ---------------------------------------------------------------------------
|
|
167
|
-
import { readConfig } from "../config.js";
|
|
188
|
+
import { getApiUrl, getConfigFile, readConfig } from "../config.js";
|
|
168
189
|
import { readStudioBinding } from "../studio-binding.js";
|
|
169
|
-
import {
|
|
170
|
-
import {
|
|
190
|
+
import { ensureAuthenticated, runOAuthFlow } from "../auth-helper.js";
|
|
191
|
+
import { stat } from "node:fs/promises";
|
|
192
|
+
import { join } from "node:path";
|
|
171
193
|
// Track whether we've already attempted reauth in this session to avoid loops
|
|
172
194
|
let _reauthAttempted = false;
|
|
173
|
-
|
|
174
|
-
async function
|
|
195
|
+
const _bindingCache = new Map();
|
|
196
|
+
async function refreshBindingForCwd(cwd) {
|
|
197
|
+
const bindingFile = join(cwd, ".aexol", "aexol.jsonc");
|
|
198
|
+
const cached = _bindingCache.get(cwd);
|
|
199
|
+
let mtimeMs;
|
|
200
|
+
try {
|
|
201
|
+
mtimeMs = (await stat(bindingFile)).mtimeMs;
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
const code = err.code;
|
|
205
|
+
if (code === "ENOENT" || code === "ENOTDIR") {
|
|
206
|
+
_bindingCache.set(cwd, { binding: null, mtimeMs: null });
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
return cached?.binding ?? null;
|
|
210
|
+
}
|
|
211
|
+
if (cached && mtimeMs === cached.mtimeMs)
|
|
212
|
+
return cached.binding;
|
|
213
|
+
try {
|
|
214
|
+
const binding = await readStudioBinding(cwd);
|
|
215
|
+
_bindingCache.set(cwd, { binding, mtimeMs });
|
|
216
|
+
return binding;
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
_bindingCache.set(cwd, { binding: cached?.binding ?? null, mtimeMs: null });
|
|
220
|
+
return cached?.binding ?? null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async function resolveKanbanConfig(explicitProjectId, cwd) {
|
|
175
224
|
const cfg = await readConfig();
|
|
176
225
|
if (!cfg) {
|
|
177
226
|
if (!_reauthAttempted) {
|
|
@@ -179,42 +228,50 @@ async function resolveKanbanConfig(explicitProjectId) {
|
|
|
179
228
|
process.stderr.write(`[kanban-bridge] No config found at ${getConfigFile()}. Attempting OAuth login...\n`);
|
|
180
229
|
const result = await ensureAuthenticated();
|
|
181
230
|
if (result.ok && result.config) {
|
|
182
|
-
return resolveKanbanConfig(explicitProjectId); // Retry with fresh config
|
|
231
|
+
return resolveKanbanConfig(explicitProjectId, cwd); // Retry with fresh config
|
|
183
232
|
}
|
|
184
233
|
}
|
|
185
234
|
process.stderr.write(`[kanban-bridge] No config found at ${getConfigFile()}. Run \`spectral login\`.\n`);
|
|
186
235
|
return null;
|
|
187
236
|
}
|
|
188
|
-
|
|
237
|
+
// If we only have a team API key, proactively get a user JWT via OAuth.
|
|
238
|
+
// The team API key passes MCP health checks but fails GraphQL kanban auth.
|
|
239
|
+
if (cfg.teamApiKey && !cfg.userJwt && !_reauthAttempted) {
|
|
240
|
+
_reauthAttempted = true;
|
|
241
|
+
process.stderr.write(`[kanban-bridge] Team API key found but no user JWT. Kanban requires user auth — obtaining via OAuth...\n`);
|
|
242
|
+
const oauthResult = await runOAuthFlow();
|
|
243
|
+
if (oauthResult.ok) {
|
|
244
|
+
return resolveKanbanConfig(explicitProjectId, cwd); // Retry with fresh config (now has userJwt)
|
|
245
|
+
}
|
|
246
|
+
process.stderr.write(`[kanban-bridge] OAuth failed: ${oauthResult.reason}. Kanban calls will likely fail.\n`);
|
|
247
|
+
}
|
|
248
|
+
const token = cfg.userJwt || cfg.teamApiKey || "";
|
|
189
249
|
if (!token) {
|
|
190
250
|
if (!_reauthAttempted) {
|
|
191
251
|
_reauthAttempted = true;
|
|
192
252
|
process.stderr.write(`[kanban-bridge] No auth token in config. Attempting OAuth login...\n`);
|
|
193
253
|
const result = await ensureAuthenticated();
|
|
194
254
|
if (result.ok && result.config) {
|
|
195
|
-
return resolveKanbanConfig(explicitProjectId);
|
|
255
|
+
return resolveKanbanConfig(explicitProjectId, cwd);
|
|
196
256
|
}
|
|
197
257
|
}
|
|
198
258
|
process.stderr.write(`[kanban-bridge] No auth token in config. Run \`spectral login\`.\n`);
|
|
199
259
|
return null;
|
|
200
260
|
}
|
|
201
261
|
// Resolve backend URL — the config stores the MCP URL, we need the base
|
|
202
|
-
const backendUrl =
|
|
262
|
+
const backendUrl = process.env.SPECTRAL_BACKEND_URL ||
|
|
263
|
+
getApiUrl(cfg.apiUrl).replace(/\/mcp\/?$/, "");
|
|
203
264
|
// Resolve projectId: explicit param > studio binding
|
|
204
265
|
let projectId = explicitProjectId || null;
|
|
205
266
|
if (!projectId) {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
catch {
|
|
213
|
-
// ignore
|
|
267
|
+
const lookupCwd = cwd ?? process.cwd();
|
|
268
|
+
const binding = await refreshBindingForCwd(lookupCwd);
|
|
269
|
+
if (binding?.projectId) {
|
|
270
|
+
projectId = binding.projectId;
|
|
214
271
|
}
|
|
215
272
|
}
|
|
216
273
|
if (!projectId) {
|
|
217
|
-
process.stderr.write(`[kanban-bridge] No projectId available. Bind a project via \`spectral bind <project-id>\` or pass projectId explicitly.\n`);
|
|
274
|
+
process.stderr.write(`[kanban-bridge] No projectId available for cwd ${cwd ?? process.cwd()}. Bind a project via \`spectral bind <project-id>\` or pass projectId explicitly.\n`);
|
|
218
275
|
return null;
|
|
219
276
|
}
|
|
220
277
|
return { token, backendUrl, projectId };
|
|
@@ -290,7 +347,12 @@ const kanbanListTool = {
|
|
|
290
347
|
};
|
|
291
348
|
}
|
|
292
349
|
catch (err) {
|
|
350
|
+
if (err instanceof GraphQLError && (err.status === 401 || err.status === 403)) {
|
|
351
|
+
throw err; // Propagate to withReauthRetry for OAuth handling
|
|
352
|
+
}
|
|
293
353
|
const msg = err instanceof Error ? err.message : String(err);
|
|
354
|
+
process.stderr.write(`[kanban-bridge] kanban_list failed for project ${cfg.projectId}: ${msg}\n` +
|
|
355
|
+
`${err instanceof Error && err.stack ? err.stack + '\n' : ''}`);
|
|
294
356
|
return {
|
|
295
357
|
content: [{ type: "text", text: `Error listing tasks: ${msg}` }],
|
|
296
358
|
details: { isError: true },
|
|
@@ -347,7 +409,12 @@ const kanbanGetTool = {
|
|
|
347
409
|
};
|
|
348
410
|
}
|
|
349
411
|
catch (err) {
|
|
412
|
+
if (err instanceof GraphQLError && (err.status === 401 || err.status === 403)) {
|
|
413
|
+
throw err; // Propagate to withReauthRetry for OAuth handling
|
|
414
|
+
}
|
|
350
415
|
const msg = err instanceof Error ? err.message : String(err);
|
|
416
|
+
process.stderr.write(`[kanban-bridge] kanban_get failed for project ${cfg.projectId}: ${msg}\n` +
|
|
417
|
+
`${err instanceof Error && err.stack ? err.stack + '\n' : ''}`);
|
|
351
418
|
return { content: [{ type: "text", text: `Error: ${msg}` }], details: { isError: true } };
|
|
352
419
|
}
|
|
353
420
|
},
|
|
@@ -394,7 +461,12 @@ const kanbanCreateTool = {
|
|
|
394
461
|
};
|
|
395
462
|
}
|
|
396
463
|
catch (err) {
|
|
464
|
+
if (err instanceof GraphQLError && (err.status === 401 || err.status === 403)) {
|
|
465
|
+
throw err; // Propagate to withReauthRetry for OAuth handling
|
|
466
|
+
}
|
|
397
467
|
const msg = err instanceof Error ? err.message : String(err);
|
|
468
|
+
process.stderr.write(`[kanban-bridge] kanban_create failed for project ${cfg.projectId}: ${msg}\n` +
|
|
469
|
+
`${err instanceof Error && err.stack ? err.stack + '\n' : ''}`);
|
|
398
470
|
return { content: [{ type: "text", text: `Error creating task: ${msg}` }], details: { isError: true } };
|
|
399
471
|
}
|
|
400
472
|
},
|
|
@@ -444,7 +516,12 @@ const kanbanUpdateTool = {
|
|
|
444
516
|
};
|
|
445
517
|
}
|
|
446
518
|
catch (err) {
|
|
519
|
+
if (err instanceof GraphQLError && (err.status === 401 || err.status === 403)) {
|
|
520
|
+
throw err; // Propagate to withReauthRetry for OAuth handling
|
|
521
|
+
}
|
|
447
522
|
const msg = err instanceof Error ? err.message : String(err);
|
|
523
|
+
process.stderr.write(`[kanban-bridge] kanban_update failed for project ${cfg.projectId}: ${msg}\n` +
|
|
524
|
+
`${err instanceof Error && err.stack ? err.stack + '\n' : ''}`);
|
|
448
525
|
return { content: [{ type: "text", text: `Error updating task: ${msg}` }], details: { isError: true } };
|
|
449
526
|
}
|
|
450
527
|
},
|
|
@@ -495,7 +572,12 @@ const kanbanMoveTool = {
|
|
|
495
572
|
};
|
|
496
573
|
}
|
|
497
574
|
catch (err) {
|
|
575
|
+
if (err instanceof GraphQLError && (err.status === 401 || err.status === 403)) {
|
|
576
|
+
throw err; // Propagate to withReauthRetry for OAuth handling
|
|
577
|
+
}
|
|
498
578
|
const msg = err instanceof Error ? err.message : String(err);
|
|
579
|
+
process.stderr.write(`[kanban-bridge] kanban_move failed for project ${cfg.projectId}: ${msg}\n` +
|
|
580
|
+
`${err instanceof Error && err.stack ? err.stack + '\n' : ''}`);
|
|
499
581
|
return { content: [{ type: "text", text: `Error moving task: ${msg}` }], details: { isError: true } };
|
|
500
582
|
}
|
|
501
583
|
},
|
|
@@ -616,7 +698,12 @@ const kanbanNextTool = {
|
|
|
616
698
|
return { content: [{ type: "text", text: lines.join("\n") }], details: {} };
|
|
617
699
|
}
|
|
618
700
|
catch (err) {
|
|
701
|
+
if (err instanceof GraphQLError && (err.status === 401 || err.status === 403)) {
|
|
702
|
+
throw err; // Propagate to withReauthRetry for OAuth handling
|
|
703
|
+
}
|
|
619
704
|
const msg = err instanceof Error ? err.message : String(err);
|
|
705
|
+
process.stderr.write(`[kanban-bridge] kanban_next failed for project ${cfg.projectId}: ${msg}\n` +
|
|
706
|
+
`${err instanceof Error && err.stack ? err.stack + '\n' : ''}`);
|
|
620
707
|
return { content: [{ type: "text", text: `Error: ${msg}` }], details: { isError: true } };
|
|
621
708
|
}
|
|
622
709
|
},
|
|
@@ -650,7 +737,12 @@ const kanbanDeleteTool = {
|
|
|
650
737
|
};
|
|
651
738
|
}
|
|
652
739
|
catch (err) {
|
|
740
|
+
if (err instanceof GraphQLError && (err.status === 401 || err.status === 403)) {
|
|
741
|
+
throw err; // Propagate to withReauthRetry for OAuth handling
|
|
742
|
+
}
|
|
653
743
|
const msg = err instanceof Error ? err.message : String(err);
|
|
744
|
+
process.stderr.write(`[kanban-bridge] kanban_delete failed for project ${cfg.projectId}: ${msg}\n` +
|
|
745
|
+
`${err instanceof Error && err.stack ? err.stack + '\n' : ''}`);
|
|
654
746
|
return { content: [{ type: "text", text: `Error deleting task: ${msg}` }], details: { isError: true } };
|
|
655
747
|
}
|
|
656
748
|
},
|
|
@@ -671,15 +763,17 @@ function withReauthRetry(toolName, execute) {
|
|
|
671
763
|
if (err instanceof GraphQLError && (err.status === 401 || err.status === 403)) {
|
|
672
764
|
if (_reauthAttempted) {
|
|
673
765
|
return {
|
|
674
|
-
content: [{ type: "text", text: `Authentication failed (HTTP ${err.status}). Please run \`spectral login\` to re-authenticate.` }],
|
|
766
|
+
content: [{ type: "text", text: `Error: Authentication failed (HTTP ${err.status}). Please run \`spectral login\` to re-authenticate.` }],
|
|
675
767
|
details: { isError: true },
|
|
676
768
|
};
|
|
677
769
|
}
|
|
678
770
|
_reauthAttempted = true;
|
|
679
771
|
process.stderr.write(`[kanban-bridge] Auth error (${err.status}) on ${toolName}. Attempting OAuth re-login...\n`);
|
|
680
|
-
const
|
|
681
|
-
if (
|
|
772
|
+
const oauthResult = await runOAuthFlow();
|
|
773
|
+
if (oauthResult.ok) {
|
|
682
774
|
process.stderr.write(`[kanban-bridge] Re-authenticated — retrying ${toolName}...\n`);
|
|
775
|
+
// Reset reauth flag so resolveKanbanConfig can use the fresh token
|
|
776
|
+
_reauthAttempted = false;
|
|
683
777
|
try {
|
|
684
778
|
return await execute(toolCallId, params, signal, onUpdate, ctx);
|
|
685
779
|
}
|
|
@@ -692,11 +786,17 @@ function withReauthRetry(toolName, execute) {
|
|
|
692
786
|
}
|
|
693
787
|
}
|
|
694
788
|
return {
|
|
695
|
-
content: [{ type: "text", text: `Re-authentication failed: ${
|
|
789
|
+
content: [{ type: "text", text: `Error: Re-authentication failed: ${oauthResult.reason ?? "unknown"}. Please run \`spectral login\` manually.` }],
|
|
696
790
|
details: { isError: true },
|
|
697
791
|
};
|
|
698
792
|
}
|
|
699
|
-
|
|
793
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
794
|
+
process.stderr.write(`[kanban-bridge] ${toolName} unexpected failure: ${msg}\n` +
|
|
795
|
+
`${err instanceof Error && err.stack ? err.stack + "\n" : ""}`);
|
|
796
|
+
return {
|
|
797
|
+
content: [{ type: "text", text: `Kanban ${toolName} failed: ${msg}` }],
|
|
798
|
+
details: { isError: true },
|
|
799
|
+
};
|
|
700
800
|
}
|
|
701
801
|
};
|
|
702
802
|
}
|
|
@@ -727,8 +827,7 @@ export default async function kanbanBridgeExtension(ext) {
|
|
|
727
827
|
}
|
|
728
828
|
// Verify config is resolvable on startup (non-fatal — tools work lazily too)
|
|
729
829
|
ext.on("session_start", async (_event, ctx) => {
|
|
730
|
-
|
|
731
|
-
const cfg = await resolveKanbanConfig();
|
|
830
|
+
const cfg = await resolveKanbanConfig(undefined, ctx.cwd);
|
|
732
831
|
if (cfg) {
|
|
733
832
|
process.stderr.write(`[kanban-bridge] Registered ${registered} Kanban tool(s). Connected to project ${cfg.projectId}.\n`);
|
|
734
833
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/relay/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAIH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAK/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AA8CzD,OAAO,KAAK,EACV,oBAAoB,EACpB,UAAU,EACX,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ/C;;;GAGG;AACH,UAAU,UAAU;IAClB,KAAK,EACD,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,aAAa,GACb,eAAe,GACf,0BAA0B,GAC1B,uBAAuB,GACvB,0BAA0B,GAC1B,gBAAgB,GAChB,aAAa,GACb,sBAAsB,GACtB,gBAAgB,GAChB,gBAAgB,GAChB,oBAAoB,GACpB,4BAA4B,GAC5B,iBAAiB,GACjB,6BAA6B,GAC7B,cAAc,GACd,wBAAwB,GACxB,gBAAgB,GAChB,sBAAsB,GACtB,gBAAgB,GAChB,kBAAkB,GAClB,eAAe,GACf,oBAAoB,GACpB,iBAAiB,GACjB,mBAAmB,GACnB,2BAA2B,GAC3B,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,8BAA8B,GAC9B,8BAA8B,GAC9B,aAAa,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,UAAU,GAAG,IAAI,CAqLnB;AAMD;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,6FAA6F;IAC7F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uGAAuG;IACvG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,uBAAuB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAiD5B;
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/relay/dispatcher.ts"],"names":[],"mappings":"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"}
|
package/dist/relay/dispatcher.js
CHANGED
|
@@ -398,6 +398,12 @@ async function dispatchRoute(match, body, deps) {
|
|
|
398
398
|
manager.reloadProjectBindings().catch((err) => {
|
|
399
399
|
logger?.error?.(`[dispatcher] reloadProjectBindings failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
400
400
|
});
|
|
401
|
+
// Reload MCP config so the aexol-mcp extension picks up the new binding.
|
|
402
|
+
if (deps.mcpState) {
|
|
403
|
+
handleReloadMcpConfig(deps.mcpState).catch((err) => {
|
|
404
|
+
logger?.error?.(`[dispatcher] MCP reload after bind failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
405
|
+
});
|
|
406
|
+
}
|
|
401
407
|
return result;
|
|
402
408
|
}
|
|
403
409
|
case "unbind_studio": {
|
|
@@ -413,6 +419,12 @@ async function dispatchRoute(match, body, deps) {
|
|
|
413
419
|
manager.reloadProjectBindings().catch((err) => {
|
|
414
420
|
logger?.error?.(`[dispatcher] reloadProjectBindings failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
415
421
|
});
|
|
422
|
+
// Reload MCP config so the aexol-mcp extension clears the old binding.
|
|
423
|
+
if (deps.mcpState) {
|
|
424
|
+
handleReloadMcpConfig(deps.mcpState).catch((err) => {
|
|
425
|
+
logger?.error?.(`[dispatcher] MCP reload after unbind failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
426
|
+
});
|
|
427
|
+
}
|
|
416
428
|
return result;
|
|
417
429
|
}
|
|
418
430
|
case "get_project_observations": {
|
|
@@ -118,8 +118,8 @@ export async function handleBindStudioProject(store, id, body) {
|
|
|
118
118
|
if (studioProjectName && studioProjectName !== project.name) {
|
|
119
119
|
store.updateProject(id, { name: studioProjectName });
|
|
120
120
|
}
|
|
121
|
-
//
|
|
122
|
-
const updated = store.
|
|
121
|
+
// Persist the Studio binding in SQLite too so /agent can show linked state after serve restarts.
|
|
122
|
+
const updated = store.setProjectStudioBinding(id, binding);
|
|
123
123
|
return {
|
|
124
124
|
project: updated,
|
|
125
125
|
studioProjectId,
|
|
@@ -144,8 +144,8 @@ export async function handleUnbindStudioProject(store, id) {
|
|
|
144
144
|
// `applyBindingFields` (called by getProject) already attached it.
|
|
145
145
|
const previousStudioProjectId = project.studioProjectId ?? null;
|
|
146
146
|
await deleteStudioBindingAt(project.path);
|
|
147
|
-
//
|
|
148
|
-
const updated = store.
|
|
147
|
+
// Clear the persisted Studio binding so the returned project no longer carries studio fields.
|
|
148
|
+
const updated = store.setProjectStudioBinding(id, null);
|
|
149
149
|
return {
|
|
150
150
|
project: updated,
|
|
151
151
|
studioProjectId: previousStudioProjectId,
|
package/dist/server/storage.d.ts
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
*/
|
|
28
28
|
import type { ImageAttachment, WireMessage, WireProject, WireSessionDetail, WireSessionSummary } from "./wire.js";
|
|
29
29
|
import type { SupportedMemoryDetails } from "../memory/types.js";
|
|
30
|
+
import { type StudioBinding } from "../studio-binding.js";
|
|
30
31
|
import type { InterAgentMessage } from "./inter-agent-broker.js";
|
|
31
32
|
/** A single message as stored in SQLite. Identical to WireMessage. */
|
|
32
33
|
export type StoredMessage = WireMessage;
|
|
@@ -85,6 +86,7 @@ export declare class SessionStore {
|
|
|
85
86
|
private stmtGetProject;
|
|
86
87
|
private stmtCreateProject;
|
|
87
88
|
private stmtUpdateProject;
|
|
89
|
+
private stmtSetProjectStudioBinding;
|
|
88
90
|
private stmtDeleteProject;
|
|
89
91
|
private stmtListSessionsByProject;
|
|
90
92
|
private stmtListSessionIdsByProject;
|
|
@@ -135,6 +137,7 @@ export declare class SessionStore {
|
|
|
135
137
|
createProject(input: CreateProjectInput): WireProject;
|
|
136
138
|
/** Returns null if not found. */
|
|
137
139
|
getProject(id: string): WireProject | null;
|
|
140
|
+
setProjectStudioBinding(id: string, binding: StudioBinding | null): WireProject | null;
|
|
138
141
|
/**
|
|
139
142
|
* Update a project's name and/or path. At least one must be provided.
|
|
140
143
|
* Returns the updated project, or null if not found. Empty `name` falls
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAUH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/server/storage.js
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
import { createSqliteAdapter } from "./sqlite-adapter.js";
|
|
29
29
|
import { randomUUID } from "node:crypto";
|
|
30
30
|
import { mkdirSync, readFileSync } from "node:fs";
|
|
31
|
-
import { dirname, join } from "node:path";
|
|
31
|
+
import { dirname, join, resolve } from "node:path";
|
|
32
32
|
import { getConfigDir } from "../config.js";
|
|
33
33
|
import { stripJsoncComments } from "../studio-binding.js";
|
|
34
34
|
/**
|
|
@@ -45,6 +45,9 @@ CREATE TABLE IF NOT EXISTS projects (
|
|
|
45
45
|
id TEXT PRIMARY KEY,
|
|
46
46
|
name TEXT NOT NULL,
|
|
47
47
|
path TEXT NOT NULL,
|
|
48
|
+
studio_project_id TEXT,
|
|
49
|
+
studio_project_name TEXT,
|
|
50
|
+
studio_team_id TEXT,
|
|
48
51
|
created_at INTEGER NOT NULL,
|
|
49
52
|
updated_at INTEGER NOT NULL
|
|
50
53
|
);
|
|
@@ -138,14 +141,15 @@ function readBindingSync(projectPath) {
|
|
|
138
141
|
}
|
|
139
142
|
}
|
|
140
143
|
/** Augment a WireProject row with Studio binding fields when present. */
|
|
141
|
-
function applyBindingFields(project) {
|
|
142
|
-
const binding = readBindingSync(project.path);
|
|
143
|
-
if (!binding)
|
|
144
|
+
function applyBindingFields(project, rowBinding) {
|
|
145
|
+
const binding = readBindingSync(project.path) ?? rowBinding;
|
|
146
|
+
if (!binding?.projectId)
|
|
144
147
|
return project;
|
|
145
148
|
return {
|
|
146
149
|
...project,
|
|
147
150
|
studioProjectId: binding.projectId,
|
|
148
151
|
studioProjectName: binding.name || binding.projectId,
|
|
152
|
+
studioTeamId: binding.teamId,
|
|
149
153
|
};
|
|
150
154
|
}
|
|
151
155
|
/** Tables we own — used by the migration drop step. */
|
|
@@ -186,6 +190,7 @@ export class SessionStore {
|
|
|
186
190
|
stmtGetProject;
|
|
187
191
|
stmtCreateProject;
|
|
188
192
|
stmtUpdateProject;
|
|
193
|
+
stmtSetProjectStudioBinding;
|
|
189
194
|
stmtDeleteProject;
|
|
190
195
|
stmtListSessionsByProject;
|
|
191
196
|
stmtListSessionIdsByProject;
|
|
@@ -264,6 +269,18 @@ export class SessionStore {
|
|
|
264
269
|
// SCHEMA_VERSION would also nuke conversation history we now want to
|
|
265
270
|
// preserve. The check is cheap (one PRAGMA per startup) and safe to run
|
|
266
271
|
// every time.
|
|
272
|
+
const projectCols = this.db
|
|
273
|
+
.prepare(`PRAGMA table_info(projects)`)
|
|
274
|
+
.all();
|
|
275
|
+
if (!projectCols.some((c) => c.name === "studio_project_id")) {
|
|
276
|
+
this.db.exec(`ALTER TABLE projects ADD COLUMN studio_project_id TEXT`);
|
|
277
|
+
}
|
|
278
|
+
if (!projectCols.some((c) => c.name === "studio_project_name")) {
|
|
279
|
+
this.db.exec(`ALTER TABLE projects ADD COLUMN studio_project_name TEXT`);
|
|
280
|
+
}
|
|
281
|
+
if (!projectCols.some((c) => c.name === "studio_team_id")) {
|
|
282
|
+
this.db.exec(`ALTER TABLE projects ADD COLUMN studio_team_id TEXT`);
|
|
283
|
+
}
|
|
267
284
|
const sessionCols = this.db
|
|
268
285
|
.prepare(`PRAGMA table_info(sessions)`)
|
|
269
286
|
.all();
|
|
@@ -321,13 +338,15 @@ export class SessionStore {
|
|
|
321
338
|
// ---- project statements ----------------------------------------------
|
|
322
339
|
this.stmtListProjects = this.db.prepare(`
|
|
323
340
|
SELECT p.id, p.name, p.path, p.created_at, p.updated_at,
|
|
341
|
+
p.studio_project_id, p.studio_project_name, p.studio_team_id,
|
|
324
342
|
(SELECT COUNT(*) FROM sessions s WHERE s.project_id = p.id) AS session_count
|
|
325
343
|
FROM projects p
|
|
326
344
|
ORDER BY p.updated_at DESC
|
|
327
345
|
`);
|
|
328
|
-
this.stmtGetProject = this.db.prepare(`SELECT id, name, path, created_at, updated_at FROM projects WHERE id = ?`);
|
|
346
|
+
this.stmtGetProject = this.db.prepare(`SELECT id, name, path, created_at, updated_at, studio_project_id, studio_project_name, studio_team_id FROM projects WHERE id = ?`);
|
|
329
347
|
this.stmtCreateProject = this.db.prepare(`INSERT INTO projects (id, name, path, created_at, updated_at) VALUES (?, ?, ?, ?, ?)`);
|
|
330
348
|
this.stmtUpdateProject = this.db.prepare(`UPDATE projects SET name = ?, path = ?, updated_at = ? WHERE id = ?`);
|
|
349
|
+
this.stmtSetProjectStudioBinding = this.db.prepare(`UPDATE projects SET studio_project_id = ?, studio_project_name = ?, studio_team_id = ?, updated_at = ? WHERE id = ?`);
|
|
331
350
|
this.stmtDeleteProject = this.db.prepare(`DELETE FROM projects WHERE id = ?`);
|
|
332
351
|
this.stmtListSessionsByProject = this.db.prepare(`
|
|
333
352
|
SELECT s.id, s.project_id, s.title, s.created_at, s.updated_at,
|
|
@@ -457,13 +476,20 @@ export class SessionStore {
|
|
|
457
476
|
updatedAt: r.updated_at,
|
|
458
477
|
sessionCount: r.session_count,
|
|
459
478
|
};
|
|
460
|
-
|
|
479
|
+
const rowBinding = r.studio_project_id
|
|
480
|
+
? {
|
|
481
|
+
projectId: r.studio_project_id,
|
|
482
|
+
...(r.studio_project_name ? { name: r.studio_project_name } : {}),
|
|
483
|
+
...(r.studio_team_id ? { teamId: r.studio_team_id } : {}),
|
|
484
|
+
}
|
|
485
|
+
: null;
|
|
486
|
+
return applyBindingFields(project, rowBinding);
|
|
461
487
|
});
|
|
462
488
|
}
|
|
463
489
|
createProject(input) {
|
|
464
490
|
const id = input.id ?? randomUUID();
|
|
465
491
|
const name = input.name.trim() || "Untitled project";
|
|
466
|
-
const path = input.path;
|
|
492
|
+
const path = resolve(input.path);
|
|
467
493
|
const now = Date.now();
|
|
468
494
|
this.stmtCreateProject.run(id, name, path, now, now);
|
|
469
495
|
return {
|
|
@@ -490,7 +516,19 @@ export class SessionStore {
|
|
|
490
516
|
updatedAt: row.updated_at,
|
|
491
517
|
sessionCount: withCount?.session_count ?? 0,
|
|
492
518
|
};
|
|
493
|
-
|
|
519
|
+
const rowBinding = row.studio_project_id
|
|
520
|
+
? {
|
|
521
|
+
projectId: row.studio_project_id,
|
|
522
|
+
...(row.studio_project_name ? { name: row.studio_project_name } : {}),
|
|
523
|
+
...(row.studio_team_id ? { teamId: row.studio_team_id } : {}),
|
|
524
|
+
}
|
|
525
|
+
: null;
|
|
526
|
+
return applyBindingFields(project, rowBinding);
|
|
527
|
+
}
|
|
528
|
+
setProjectStudioBinding(id, binding) {
|
|
529
|
+
const now = Date.now();
|
|
530
|
+
this.stmtSetProjectStudioBinding.run(binding?.projectId ?? null, binding?.name ?? null, binding?.teamId ?? null, now, id);
|
|
531
|
+
return this.getProject(id);
|
|
494
532
|
}
|
|
495
533
|
/**
|
|
496
534
|
* Update a project's name and/or path. At least one must be provided.
|
|
@@ -504,7 +542,7 @@ export class SessionStore {
|
|
|
504
542
|
const nextName = input.name !== undefined
|
|
505
543
|
? (input.name.trim() || "Untitled project")
|
|
506
544
|
: existing.name;
|
|
507
|
-
const nextPath = input.path !== undefined ? input.path : existing.path;
|
|
545
|
+
const nextPath = input.path !== undefined ? resolve(input.path) : existing.path;
|
|
508
546
|
const now = Date.now();
|
|
509
547
|
this.stmtUpdateProject.run(nextName, nextPath, now, id);
|
|
510
548
|
return this.getProject(id);
|
package/dist/server/wire.d.ts
CHANGED
|
@@ -51,6 +51,8 @@ export interface WireProject {
|
|
|
51
51
|
studioProjectId?: string;
|
|
52
52
|
/** Studio project display name when bound. Falls back to projectId if name is not set. */
|
|
53
53
|
studioProjectName?: string;
|
|
54
|
+
/** Studio team ID when the project is bound to Aexol Studio. */
|
|
55
|
+
studioTeamId?: string;
|
|
54
56
|
/** True when at least one of this project's sessions has an in-flight turn. */
|
|
55
57
|
hasActiveSession?: boolean;
|
|
56
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/server/wire.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/server/wire.ts"],"names":[],"mappings":"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"}
|