@runeya/runeya 2.0.144 → 2.0.146
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/agent/index.js +33 -22
- package/agent/index.js.map +1 -1
- package/agent-manager-R7BPQO6D.js +11 -0
- package/chat-LPML22J5.js +24 -0
- package/{chunk-7L6AQUBR.js → chunk-4LJQIQMN.js} +6 -2
- package/{chunk-7L6AQUBR.js.map → chunk-4LJQIQMN.js.map} +1 -1
- package/{chunk-7HIPFSOA.js → chunk-57P45FNY.js} +11 -3
- package/chunk-57P45FNY.js.map +1 -0
- package/chunk-6IBPK6UE.js +1063 -0
- package/chunk-6IBPK6UE.js.map +1 -0
- package/{chunk-GXE5TLLJ.js → chunk-KV4GJKXU.js} +17 -17
- package/{chunk-XAFOP677.js → chunk-MZSDTA4A.js} +480 -233
- package/chunk-MZSDTA4A.js.map +1 -0
- package/{chunk-UR3HL373.js → chunk-NPMSBYXC.js} +8 -8
- package/{chunk-P73PTVII.js → chunk-SEPAURTQ.js} +369 -1282
- package/chunk-SEPAURTQ.js.map +1 -0
- package/{chunk-NSS47H26.js → chunk-UD42LACH.js} +348 -78
- package/chunk-UD42LACH.js.map +1 -0
- package/{chunk-IXO5KIO5.js → chunk-VPSQJOSN.js} +23 -2
- package/{chunk-IXO5KIO5.js.map → chunk-VPSQJOSN.js.map} +1 -1
- package/{companion-2LHKU577.js → companion-W3UMZWGH.js} +11 -7
- package/{desktop-installer-page-6JDSXK2E.js → desktop-installer-page-I5FHFDES.js} +11 -8
- package/desktop-installer-page-I5FHFDES.js.map +1 -0
- package/{desktop-launcher-YPNRQMIS.js → desktop-launcher-GD4QPM66.js} +3 -3
- package/external-NMKQPROK.js +387 -0
- package/external-NMKQPROK.js.map +1 -0
- package/index.js +34 -12
- package/index.js.map +1 -1
- package/{install-gate-2NNH7RM2.js → install-gate-PVMGJDWE.js} +2 -2
- package/mcp-server/external.d.ts +44 -0
- package/mcp-server/external.js +2679 -0
- package/mcp-server/external.js.map +1 -0
- package/mcp-server/index.js +142 -40
- package/mcp-server/index.js.map +1 -1
- package/mcp-server/launch.d.ts +19 -1
- package/mcp-server/launch.js +20 -0
- package/mcp-server/launch.js.map +1 -1
- package/package.json +1 -1
- package/settings-manager-XPLBO35P.js +10 -0
- package/src-DCCEUWE6.js +385 -0
- package/{src-5TEXF3SU.js → src-LEDGW5KP.js} +1029 -536
- package/src-LEDGW5KP.js.map +1 -0
- package/{vault-resolver-VK6W5J6W.js → vault-resolver-E7KPKA5C.js} +3 -2
- package/vault-resolver-E7KPKA5C.js.map +1 -0
- package/web/assets/{AgentScalarChatInterface.vue-B-SjOsdj.js → AgentScalarChatInterface.vue-BYszptaB.js} +1 -1
- package/web/assets/{AgentTerminalPage-JzC8DUgu.js → AgentTerminalPage-C3TJ1NL9.js} +1 -1
- package/web/assets/{AiChatModals-D1928AxG.js → AiChatModals-D3scRE3S.js} +1 -1
- package/web/assets/AppLayout-BMQUjPKe.js +1 -0
- package/web/assets/{AppLayout-8sBPr3od.css → AppLayout-tsw5Ow0w.css} +1 -1
- package/web/assets/{AuditPage-BZIJ3_Kr.js → AuditPage-CKcExBws.js} +1 -1
- package/web/assets/{CloudAccountPage-DBv470sT.js → CloudAccountPage-B6oPg0BZ.js} +1 -1
- package/web/assets/{CloudMessagingPage-qCI8-UDL.js → CloudMessagingPage-C5fwVe-F.js} +1 -1
- package/web/assets/DashboardPage-9RV7sx3e.js +1 -0
- package/web/assets/{DashboardPage-D9-PpC3F.css → DashboardPage-FvNuC_e4.css} +1 -1
- package/web/assets/{DirectoryPickerDialog-B5DvDfQP.js → DirectoryPickerDialog-C06BXyfJ.js} +1 -1
- package/web/assets/{EnvironmentForm-Bw8Djnqm.js → EnvironmentForm-CAvDoira.js} +1 -1
- package/web/assets/{EnvironmentFormPage-B59uiYtp.js → EnvironmentFormPage-BmAxhN-m.js} +1 -1
- package/web/assets/{EnvironmentListPage-W9zLDZAg.js → EnvironmentListPage-B8uATPBI.js} +1 -1
- package/web/assets/KanbanBoardPage-CQsOkRUf.js +4 -0
- package/web/assets/KanbanBoardPage-eHmsrFGA.css +1 -0
- package/web/assets/{KanbanListPage-Bn9k8Rpc.js → KanbanListPage-CWZqkjD6.js} +1 -1
- package/web/assets/{LaunchProjectPage-Dc7v1UjQ.js → LaunchProjectPage-saSmC7Pr.js} +1 -1
- package/web/assets/LaunchServicesPage-BkKyLMEz.js +1 -0
- package/web/assets/LaunchServicesPage-DoLDPqQq.css +1 -0
- package/web/assets/{LaunchShell-LonTJpb3.js → LaunchShell-DUrSunB4.js} +1 -1
- package/web/assets/{LogViewer-DkuqWYkQ.js → LogViewer-CZBYkH9J.js} +1 -1
- package/web/assets/{OrgKeyPrompt-By1VjlSN.js → OrgKeyPrompt-DzQ7pwbs.js} +1 -1
- package/web/assets/{ProcessControls-C0skzKGL.js → ProcessControls-BEeoNlNV.js} +1 -1
- package/web/assets/{ProcessDetailPage-BvPX6z_X.js → ProcessDetailPage-CQgu5uKm.js} +1 -1
- package/web/assets/{ProjectCreateDialog-C4o9u15L.js → ProjectCreateDialog-BolrhRD-.js} +1 -1
- package/web/assets/{ProjectLocationGate-BJ1CSQt0.js → ProjectLocationGate-DhMVdIjN.js} +1 -1
- package/web/assets/{ProjectPublishDialog-Cp-zXdGm.js → ProjectPublishDialog-DsZNWrfz.js} +1 -1
- package/web/assets/{RandomJobTestPage-DF4a1U13.js → RandomJobTestPage-BUS2Ty6-.js} +1 -1
- package/web/assets/ScenarioEditorPage-MIAGh2us.js +14 -0
- package/web/assets/{SendToChatDialog-Dg2SHkVD.js → SendToChatDialog-BxWsyv29.js} +1 -1
- package/web/assets/{ServiceControlsBar-q2VHWaxK.js → ServiceControlsBar-DqDPAZt7.js} +1 -1
- package/web/assets/ServiceDetailPage-hkSAzZ-l.js +2 -0
- package/web/assets/{ServiceFormPage-tT_n7WUy.js → ServiceFormPage-DXqhqXg8.js} +1 -1
- package/web/assets/SettingsPage-4pKUgKPm.css +1 -0
- package/web/assets/SettingsPage-DS2YhMIM.js +2086 -0
- package/web/assets/{UnlockPage-BKAdMJkb.js → UnlockPage-s8SgVcKk.js} +1 -1
- package/web/assets/{VaultMigrationPage-D9KUTTss.js → VaultMigrationPage-s0b44MDM.js} +1 -1
- package/web/assets/{VersionBadge-moKP5bAv.js → VersionBadge-BmArk24p.js} +1 -1
- package/web/assets/{WikiPage-hLUndDxo.js → WikiPage-DADu8WUA.js} +1 -1
- package/web/assets/{WikiView-rrjXRR72.js → WikiView-DtGwIt_Q.js} +1 -1
- package/web/assets/{add-scalar-classes-CBfRr8B2.js → add-scalar-classes-dWEWPlFD.js} +2 -2
- package/web/assets/{agent.store-B3dVemmT.js → agent.store-CKLAkF9a.js} +1 -1
- package/web/assets/app-mode-BVpTuh0i.js +1 -0
- package/web/assets/auth-Cg9BWTfK.js +2 -0
- package/web/assets/{cloud-chat.store-Wg1poFem.js → cloud-chat.store-b-BHGz7I.js} +1 -1
- package/web/assets/{cloud-client-DQlUaoAw.js → cloud-client-D_zCiW0s.js} +2 -2
- package/web/assets/{cloud-session-DRUqcSGP.js → cloud-session-DOaDpZTy.js} +2 -2
- package/web/assets/dist-N4nrnbnA.js +1 -0
- package/web/assets/{editor.store-SoH48ux2.js → editor.store-DCAZSeVG.js} +1 -1
- package/web/assets/i18n-D0afQEGs.js +1 -0
- package/web/assets/{index-D_x2s8Ut.js → index-D8VRbyoP.js} +101 -101
- package/web/assets/index-DsezNbSM.css +1 -0
- package/web/assets/{modal-CpsVK_dA.js → modal-qYgTMkYb.js} +1 -1
- package/web/assets/{project-launch.store-C3fZeRGb.js → project-launch.store-y7JBMNiE.js} +1 -1
- package/web/assets/{project.store-BEk4fciH.js → project.store-DGJr0Qr9.js} +1 -1
- package/web/assets/{scenario.store-D-JrRiVO.js → scenario.store-YWHL2_wu.js} +3 -3
- package/web/assets/{service.store-B5uYZtyM.js → service.store-5jWsJxPx.js} +1 -1
- package/web/assets/{settings-scope-Blnwj3rR.js → settings-scope-Bv7QGPrt.js} +1 -1
- package/web/assets/{settings.store-Bo3FYs1o.js → settings.store-bEsB7oKb.js} +1 -1
- package/web/assets/{src-CAwAaB5j.js → src-C-D_y7ou.js} +1 -1
- package/web/assets/{src-DValZNJU.js → src-Dnwk6NpV.js} +5 -5
- package/web/assets/src-g1DRo8xZ.css +1 -0
- package/web/assets/{trpc-DbsE5GvQ.js → trpc-Drabzwpd.js} +3 -3
- package/web/assets/{useCloudOrg-DygUBG1a.js → useCloudOrg-BAQEtFPl.js} +1 -1
- package/web/assets/{useEnvVarAutocomplete-DmYNOXgd.js → useEnvVarAutocomplete-BqGTODUv.js} +1 -1
- package/web/assets/{useProjectCatalog-D2mHB7dg.js → useProjectCatalog-yocjIKt6.js} +1 -1
- package/web/assets/{useProjectCloudOrg-avTCVold.js → useProjectCloudOrg-CEN9-_OA.js} +1 -1
- package/web/assets/{useServiceUrlHost-Q3fzGox3.js → useServiceUrlHost-BuoPEXZX.js} +1 -1
- package/web/assets/{vue-draggable-plus-WgrMXXmE.js → vue-draggable-plus-DX4rTBiu.js} +1 -1
- package/web/index.html +19 -18
- package/agent-manager-M4NA5YFD.js +0 -11
- package/chat-X3X527EX.js +0 -23
- package/chunk-7HIPFSOA.js.map +0 -1
- package/chunk-NSS47H26.js.map +0 -1
- package/chunk-P73PTVII.js.map +0 -1
- package/chunk-XAFOP677.js.map +0 -1
- package/desktop-installer-page-6JDSXK2E.js.map +0 -1
- package/settings-manager-32SVMAFN.js +0 -10
- package/src-5TEXF3SU.js.map +0 -1
- package/web/assets/AppLayout-CVQIBYqg.js +0 -1
- package/web/assets/DashboardPage-D0UZM0mr.js +0 -1
- package/web/assets/KanbanBoardPage-DRACMk_D.css +0 -1
- package/web/assets/KanbanBoardPage-DwPqoJDJ.js +0 -4
- package/web/assets/LaunchServicesPage-CXUS9O3y.js +0 -1
- package/web/assets/LaunchServicesPage-DJDIN8HU.css +0 -1
- package/web/assets/ScenarioEditorPage-Dl-gEkJI.js +0 -14
- package/web/assets/ServiceDetailPage-CJ8WaFod.js +0 -2
- package/web/assets/SettingsPage-CWakkv0V.js +0 -2086
- package/web/assets/SettingsPage-aGSxZw1n.css +0 -1
- package/web/assets/auth-BCrvnP1U.js +0 -2
- package/web/assets/dist-DoChtT9t.js +0 -1
- package/web/assets/i18n-BszFg0ko.js +0 -1
- package/web/assets/index-C_JV7fYy.css +0 -1
- package/web/assets/src-DuBXN1hu.css +0 -1
- /package/{agent-manager-M4NA5YFD.js.map → agent-manager-R7BPQO6D.js.map} +0 -0
- /package/{chat-X3X527EX.js.map → chat-LPML22J5.js.map} +0 -0
- /package/{chunk-GXE5TLLJ.js.map → chunk-KV4GJKXU.js.map} +0 -0
- /package/{chunk-UR3HL373.js.map → chunk-NPMSBYXC.js.map} +0 -0
- /package/{companion-2LHKU577.js.map → companion-W3UMZWGH.js.map} +0 -0
- /package/{desktop-launcher-YPNRQMIS.js.map → desktop-launcher-GD4QPM66.js.map} +0 -0
- /package/{install-gate-2NNH7RM2.js.map → install-gate-PVMGJDWE.js.map} +0 -0
- /package/{settings-manager-32SVMAFN.js.map → settings-manager-XPLBO35P.js.map} +0 -0
- /package/{vault-resolver-VK6W5J6W.js.map → src-DCCEUWE6.js.map} +0 -0
package/mcp-server/index.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
|
-
import { z as
|
|
5
|
+
import { z as z26 } from "zod";
|
|
7
6
|
|
|
8
7
|
// src/session-token.ts
|
|
9
8
|
var RETRY_DELAY_MS = 1e3;
|
|
@@ -74,6 +73,10 @@ function startSessionToken(initial, baseUrl, fetchImpl = fetch) {
|
|
|
74
73
|
};
|
|
75
74
|
}
|
|
76
75
|
|
|
76
|
+
// src/server.ts
|
|
77
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
78
|
+
import { z as z25 } from "zod";
|
|
79
|
+
|
|
77
80
|
// ../ai-capabilities/dist/index.js
|
|
78
81
|
import { z as z23 } from "zod";
|
|
79
82
|
|
|
@@ -285,7 +288,13 @@ var CompanionSettingsSchema = z5.object({
|
|
|
285
288
|
* Rejeté au-delà de la borne plutôt que tronqué (§1) : un prompt coupé en
|
|
286
289
|
* plein milieu produirait des relectures incohérentes sans rien signaler.
|
|
287
290
|
*/
|
|
288
|
-
prompt: z5.string().max(2e4).optional()
|
|
291
|
+
prompt: z5.string().max(2e4).optional(),
|
|
292
|
+
/** Runner du compagnon des conversations créées ensuite. Absent = celui de la conversation. */
|
|
293
|
+
runner: z5.enum(["claude-code", "codex"]).optional(),
|
|
294
|
+
/** Modèle du compagnon des conversations créées ensuite. Absent = défaut du runner. */
|
|
295
|
+
model: z5.string().max(200).optional(),
|
|
296
|
+
/** Effort du compagnon des conversations créées ensuite. Absent = effort par défaut. */
|
|
297
|
+
effort: z5.enum(["low", "normal", "high"]).optional()
|
|
289
298
|
});
|
|
290
299
|
var SettingsSchema = z5.object({
|
|
291
300
|
mode: z5.enum(["local-simple", "cloud"]),
|
|
@@ -1400,21 +1409,21 @@ import { z as z24 } from "zod";
|
|
|
1400
1409
|
import { z as z32 } from "zod";
|
|
1401
1410
|
function toList(raw) {
|
|
1402
1411
|
if (!raw) return [];
|
|
1403
|
-
const
|
|
1404
|
-
if (
|
|
1412
|
+
const text2 = raw.trim();
|
|
1413
|
+
if (text2.startsWith("[")) {
|
|
1405
1414
|
try {
|
|
1406
|
-
const parsed = JSON.parse(
|
|
1415
|
+
const parsed = JSON.parse(text2);
|
|
1407
1416
|
if (Array.isArray(parsed)) return parsed.map((v) => String(v).trim()).filter(Boolean);
|
|
1408
1417
|
} catch {
|
|
1409
1418
|
}
|
|
1410
1419
|
}
|
|
1411
|
-
return
|
|
1420
|
+
return text2.split(",").map((v) => v.trim().replace(/^["'[]+|["'\]]+$/g, "")).filter(Boolean);
|
|
1412
1421
|
}
|
|
1413
1422
|
function clearable(raw, parse, key) {
|
|
1414
1423
|
if (raw === void 0) return {};
|
|
1415
|
-
const
|
|
1416
|
-
if (!
|
|
1417
|
-
return { [key]: parse(
|
|
1424
|
+
const text2 = String(raw).trim();
|
|
1425
|
+
if (!text2 || text2 === "null") return { [key]: null };
|
|
1426
|
+
return { [key]: parse(text2) };
|
|
1418
1427
|
}
|
|
1419
1428
|
function gitTarget(p) {
|
|
1420
1429
|
return {
|
|
@@ -1438,11 +1447,11 @@ function parseTyped(name, schema, raw) {
|
|
|
1438
1447
|
let result = raw.trim() === "null" ? schema.safeParse(null) : schema.safeParse(raw);
|
|
1439
1448
|
if (!result.success && raw.trim() === "null") result = schema.safeParse(raw);
|
|
1440
1449
|
if (!result.success) {
|
|
1441
|
-
const
|
|
1442
|
-
const json = listItem(
|
|
1443
|
-
if (json !==
|
|
1444
|
-
if (!result.success && !/^[[{]/.test(
|
|
1445
|
-
const list = schema.safeParse(toList(
|
|
1450
|
+
const text2 = raw.trim();
|
|
1451
|
+
const json = listItem(text2);
|
|
1452
|
+
if (json !== text2) result = schema.safeParse(json);
|
|
1453
|
+
if (!result.success && !/^[[{]/.test(text2)) {
|
|
1454
|
+
const list = schema.safeParse(toList(text2).map(listItem));
|
|
1446
1455
|
if (list.success) result = list;
|
|
1447
1456
|
}
|
|
1448
1457
|
}
|
|
@@ -1530,9 +1539,14 @@ var RUNEYA_CAPABILITIES = [
|
|
|
1530
1539
|
method: "GET",
|
|
1531
1540
|
params: [
|
|
1532
1541
|
{ name: "projectId", description: "Restrict to this project, from list_projects. Omit to list every service on the machine.", required: false },
|
|
1533
|
-
{ name: "orgId", description: "
|
|
1542
|
+
{ name: "orgId", description: "With projectId: its organization, needed only when the same project id exists in several. Alone: list the services of this whole organization.", required: false }
|
|
1534
1543
|
],
|
|
1535
|
-
|
|
1544
|
+
// `orgId` seul est une portée à part entière, que `service.list` sait filtrer :
|
|
1545
|
+
// l'omettre rendait toute la machine.
|
|
1546
|
+
buildInput: (p) => {
|
|
1547
|
+
if (p.projectId) return { projectId: p.projectId, ...p.orgId ? { orgId: p.orgId } : {} };
|
|
1548
|
+
return p.orgId ? { orgId: p.orgId } : void 0;
|
|
1549
|
+
}
|
|
1536
1550
|
},
|
|
1537
1551
|
{
|
|
1538
1552
|
name: "get_service_status",
|
|
@@ -1833,6 +1847,24 @@ var RUNEYA_CAPABILITIES = [
|
|
|
1833
1847
|
],
|
|
1834
1848
|
buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId })
|
|
1835
1849
|
},
|
|
1850
|
+
{
|
|
1851
|
+
name: "kanban_get_card_context",
|
|
1852
|
+
description: "Load the working context of a kanban card: the card, the board's columns, the team's guidelines for the board and the expected ending (move the card if needed, then comment). Call it first when the user asks you to work on a card, then follow it. It is the context a session started from the card in Runeya receives.",
|
|
1853
|
+
route: "kanban.cardContext",
|
|
1854
|
+
method: "GET",
|
|
1855
|
+
params: [
|
|
1856
|
+
{ name: "boardId", description: "The kanban board ID", required: true },
|
|
1857
|
+
{ name: "cardId", description: "The card ID", required: true },
|
|
1858
|
+
{ name: "projectId", description: "The project the work happens in, named in the context. Optional.", required: false },
|
|
1859
|
+
{ name: "orgId", description: "Its organization. Optional.", required: false }
|
|
1860
|
+
],
|
|
1861
|
+
buildInput: (p) => ({
|
|
1862
|
+
boardId: p.boardId,
|
|
1863
|
+
cardId: p.cardId,
|
|
1864
|
+
...p.projectId ? { projectId: p.projectId } : {},
|
|
1865
|
+
...p.orgId ? { orgId: p.orgId } : {}
|
|
1866
|
+
})
|
|
1867
|
+
},
|
|
1836
1868
|
{
|
|
1837
1869
|
name: "kanban_update_card",
|
|
1838
1870
|
description: "Update an existing kanban card. Only the fields you pass are changed; passing null to priority, color or deadline clears it. Prefer this over creating a second card when something needs correcting.",
|
|
@@ -2345,6 +2377,90 @@ function applyProjectAnchor(cap, params, anchor) {
|
|
|
2345
2377
|
return anchored;
|
|
2346
2378
|
}
|
|
2347
2379
|
|
|
2380
|
+
// src/server.ts
|
|
2381
|
+
function needsAnchor(cap, params) {
|
|
2382
|
+
const accepts = (name) => cap.params.some((p) => p.name === name);
|
|
2383
|
+
if (params["orgId"] || params["organizationId"]) return false;
|
|
2384
|
+
if (accepts("projectId")) return !params["projectId"];
|
|
2385
|
+
return ["orgId", "organizationId"].some((name) => accepts(name) && !params[name]);
|
|
2386
|
+
}
|
|
2387
|
+
var RETRY = /* @__PURE__ */ Symbol("retry");
|
|
2388
|
+
function text(value) {
|
|
2389
|
+
return { content: [{ type: "text", text: typeof value === "string" ? value : JSON.stringify(value, null, 2) }] };
|
|
2390
|
+
}
|
|
2391
|
+
function error(err) {
|
|
2392
|
+
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
2393
|
+
}
|
|
2394
|
+
function createRuneyaMcpServer(opts) {
|
|
2395
|
+
const server2 = new McpServer({ name: "runeya", version: "1.0.0" });
|
|
2396
|
+
async function callCapability(cap, input) {
|
|
2397
|
+
const rawParams = toRawParams(input, cap);
|
|
2398
|
+
const raw = rawParams["authToken"];
|
|
2399
|
+
const explicit = raw && !raw.startsWith("$") && !opts.sessionToken.isInitial(raw) ? raw : null;
|
|
2400
|
+
const call = async () => {
|
|
2401
|
+
const target = await opts.target(input);
|
|
2402
|
+
const authToken = explicit ?? (target.authToken || opts.sessionToken.current() || opts.internalToken || void 0);
|
|
2403
|
+
if (!authToken) throw new Error("No auth token available");
|
|
2404
|
+
const anchor = target.projectAnchor && needsAnchor(cap, rawParams) ? await target.projectAnchor() : opts.projectAnchor;
|
|
2405
|
+
const params = applyProjectAnchor(cap, rawParams, anchor);
|
|
2406
|
+
try {
|
|
2407
|
+
return await runCapability(cap, target.baseUrl, params, authToken);
|
|
2408
|
+
} catch (err) {
|
|
2409
|
+
if (!explicit && target.forgetToken && /UNAUTHORIZED/.test(err.message)) {
|
|
2410
|
+
target.forgetToken();
|
|
2411
|
+
return RETRY;
|
|
2412
|
+
}
|
|
2413
|
+
throw err;
|
|
2414
|
+
}
|
|
2415
|
+
};
|
|
2416
|
+
let result = await call();
|
|
2417
|
+
if (result === RETRY) result = await call();
|
|
2418
|
+
if (result === RETRY) throw new Error("Runeya refuse le jeton de ce client, m\xEAme renouvel\xE9.");
|
|
2419
|
+
return result;
|
|
2420
|
+
}
|
|
2421
|
+
for (const cap of RUNEYA_CAPABILITIES) {
|
|
2422
|
+
server2.tool(cap.name, cap.description, { ...buildMcpShape(cap), ...opts.extraShape }, async (input) => {
|
|
2423
|
+
try {
|
|
2424
|
+
return text(await callCapability(cap, input));
|
|
2425
|
+
} catch (err) {
|
|
2426
|
+
return error(err);
|
|
2427
|
+
}
|
|
2428
|
+
});
|
|
2429
|
+
}
|
|
2430
|
+
registerWorkOnCardPrompt(server2, (input) => callCapability(CARD_CONTEXT, input), opts.extraShape !== void 0);
|
|
2431
|
+
return server2;
|
|
2432
|
+
}
|
|
2433
|
+
var CARD_CONTEXT = RUNEYA_CAPABILITIES.find((c) => c.name === "kanban_get_card_context");
|
|
2434
|
+
function registerWorkOnCardPrompt(server2, cardContext, withInstance) {
|
|
2435
|
+
const args = {
|
|
2436
|
+
boardId: z25.string().max(128).describe("The kanban board ID"),
|
|
2437
|
+
cardId: z25.string().max(128).describe("The card ID"),
|
|
2438
|
+
...withInstance ? { runeyaInstance: z25.string().max(16).optional().describe("pid of the Runeya instance, when several are running") } : {}
|
|
2439
|
+
};
|
|
2440
|
+
server2.prompt(
|
|
2441
|
+
"work_on_card",
|
|
2442
|
+
"Work on a Runeya kanban card: loads the card, the board guidelines and the expected ending.",
|
|
2443
|
+
args,
|
|
2444
|
+
async (input) => {
|
|
2445
|
+
const { boardId, cardId, runeyaInstance } = input;
|
|
2446
|
+
const pid = runeyaInstance ? Number(runeyaInstance) : void 0;
|
|
2447
|
+
const { context } = await cardContext({ boardId, cardId, ...pid ? { runeyaInstance: pid } : {} });
|
|
2448
|
+
return {
|
|
2449
|
+
description: `Carte ${cardId}`,
|
|
2450
|
+
messages: [{
|
|
2451
|
+
role: "user",
|
|
2452
|
+
content: {
|
|
2453
|
+
type: "text",
|
|
2454
|
+
text: `Je veux travailler sur cette carte du kanban Runeya. Voici son contexte, tel que Runeya le donne \xE0 une session lanc\xE9e depuis la carte : suis ces consignes, en particulier la fin attendue (d\xE9placer la carte si besoin, puis la commenter).
|
|
2455
|
+
|
|
2456
|
+
${context}`
|
|
2457
|
+
}
|
|
2458
|
+
}]
|
|
2459
|
+
};
|
|
2460
|
+
}
|
|
2461
|
+
);
|
|
2462
|
+
}
|
|
2463
|
+
|
|
2348
2464
|
// src/index.ts
|
|
2349
2465
|
var BASE_URL = process.env["RUNEYA_BASE_URL"] ?? "http://localhost:4000";
|
|
2350
2466
|
var CONVERSATION_ID = process.env["RUNEYA_CONVERSATION_ID"] ?? "";
|
|
@@ -2355,31 +2471,17 @@ var PROJECT_ANCHOR = {
|
|
|
2355
2471
|
projectId: process.env["RUNEYA_PROJECT_ID"] || void 0,
|
|
2356
2472
|
orgId: process.env["RUNEYA_ORG_ID"] || void 0
|
|
2357
2473
|
};
|
|
2358
|
-
var server =
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2364
|
-
const explicit = raw && !raw.startsWith("$") && !sessionToken.isInitial(raw) ? raw : null;
|
|
2365
|
-
const authToken = explicit ?? (sessionToken.current() || INTERNAL_TOKEN || void 0);
|
|
2366
|
-
if (!authToken) throw new Error("No auth token available");
|
|
2367
|
-
const params = applyProjectAnchor(cap, rawParams, PROJECT_ANCHOR);
|
|
2368
|
-
const result = await runCapability(cap, BASE_URL, params, authToken);
|
|
2369
|
-
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
2370
|
-
} catch (err) {
|
|
2371
|
-
return {
|
|
2372
|
-
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
2373
|
-
isError: true
|
|
2374
|
-
};
|
|
2375
|
-
}
|
|
2376
|
-
});
|
|
2377
|
-
}
|
|
2474
|
+
var server = createRuneyaMcpServer({
|
|
2475
|
+
target: () => Promise.resolve({ baseUrl: BASE_URL }),
|
|
2476
|
+
sessionToken,
|
|
2477
|
+
internalToken: INTERNAL_TOKEN,
|
|
2478
|
+
projectAnchor: PROJECT_ANCHOR
|
|
2479
|
+
});
|
|
2378
2480
|
if (CONVERSATION_ID && INTERNAL_TOKEN) {
|
|
2379
2481
|
server.tool(
|
|
2380
2482
|
"ask_user",
|
|
2381
2483
|
"Ask the user a question and wait for their reply. Use this when you need clarification or input from the user to proceed.",
|
|
2382
|
-
{ question:
|
|
2484
|
+
{ question: z26.string().describe("The question to ask the user") },
|
|
2383
2485
|
async ({ question }) => {
|
|
2384
2486
|
try {
|
|
2385
2487
|
const res = await fetch(`${BASE_URL}/api/trpc/scenario.requestInput`, {
|
|
@@ -2394,8 +2496,8 @@ if (CONVERSATION_ID && INTERNAL_TOKEN) {
|
|
|
2394
2496
|
});
|
|
2395
2497
|
const json = await res.json();
|
|
2396
2498
|
const result = json["result"]?.["data"] ?? json;
|
|
2397
|
-
const
|
|
2398
|
-
return { content: [{ type: "text", text }] };
|
|
2499
|
+
const text2 = typeof result === "string" ? result : JSON.stringify(result);
|
|
2500
|
+
return { content: [{ type: "text", text: text2 }] };
|
|
2399
2501
|
} catch (err) {
|
|
2400
2502
|
return { content: [{ type: "text", text: `Error: ${err.message}` }], isError: true };
|
|
2401
2503
|
}
|