@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.
Files changed (148) hide show
  1. package/agent/index.js +33 -22
  2. package/agent/index.js.map +1 -1
  3. package/agent-manager-R7BPQO6D.js +11 -0
  4. package/chat-LPML22J5.js +24 -0
  5. package/{chunk-7L6AQUBR.js → chunk-4LJQIQMN.js} +6 -2
  6. package/{chunk-7L6AQUBR.js.map → chunk-4LJQIQMN.js.map} +1 -1
  7. package/{chunk-7HIPFSOA.js → chunk-57P45FNY.js} +11 -3
  8. package/chunk-57P45FNY.js.map +1 -0
  9. package/chunk-6IBPK6UE.js +1063 -0
  10. package/chunk-6IBPK6UE.js.map +1 -0
  11. package/{chunk-GXE5TLLJ.js → chunk-KV4GJKXU.js} +17 -17
  12. package/{chunk-XAFOP677.js → chunk-MZSDTA4A.js} +480 -233
  13. package/chunk-MZSDTA4A.js.map +1 -0
  14. package/{chunk-UR3HL373.js → chunk-NPMSBYXC.js} +8 -8
  15. package/{chunk-P73PTVII.js → chunk-SEPAURTQ.js} +369 -1282
  16. package/chunk-SEPAURTQ.js.map +1 -0
  17. package/{chunk-NSS47H26.js → chunk-UD42LACH.js} +348 -78
  18. package/chunk-UD42LACH.js.map +1 -0
  19. package/{chunk-IXO5KIO5.js → chunk-VPSQJOSN.js} +23 -2
  20. package/{chunk-IXO5KIO5.js.map → chunk-VPSQJOSN.js.map} +1 -1
  21. package/{companion-2LHKU577.js → companion-W3UMZWGH.js} +11 -7
  22. package/{desktop-installer-page-6JDSXK2E.js → desktop-installer-page-I5FHFDES.js} +11 -8
  23. package/desktop-installer-page-I5FHFDES.js.map +1 -0
  24. package/{desktop-launcher-YPNRQMIS.js → desktop-launcher-GD4QPM66.js} +3 -3
  25. package/external-NMKQPROK.js +387 -0
  26. package/external-NMKQPROK.js.map +1 -0
  27. package/index.js +34 -12
  28. package/index.js.map +1 -1
  29. package/{install-gate-2NNH7RM2.js → install-gate-PVMGJDWE.js} +2 -2
  30. package/mcp-server/external.d.ts +44 -0
  31. package/mcp-server/external.js +2679 -0
  32. package/mcp-server/external.js.map +1 -0
  33. package/mcp-server/index.js +142 -40
  34. package/mcp-server/index.js.map +1 -1
  35. package/mcp-server/launch.d.ts +19 -1
  36. package/mcp-server/launch.js +20 -0
  37. package/mcp-server/launch.js.map +1 -1
  38. package/package.json +1 -1
  39. package/settings-manager-XPLBO35P.js +10 -0
  40. package/src-DCCEUWE6.js +385 -0
  41. package/{src-5TEXF3SU.js → src-LEDGW5KP.js} +1029 -536
  42. package/src-LEDGW5KP.js.map +1 -0
  43. package/{vault-resolver-VK6W5J6W.js → vault-resolver-E7KPKA5C.js} +3 -2
  44. package/vault-resolver-E7KPKA5C.js.map +1 -0
  45. package/web/assets/{AgentScalarChatInterface.vue-B-SjOsdj.js → AgentScalarChatInterface.vue-BYszptaB.js} +1 -1
  46. package/web/assets/{AgentTerminalPage-JzC8DUgu.js → AgentTerminalPage-C3TJ1NL9.js} +1 -1
  47. package/web/assets/{AiChatModals-D1928AxG.js → AiChatModals-D3scRE3S.js} +1 -1
  48. package/web/assets/AppLayout-BMQUjPKe.js +1 -0
  49. package/web/assets/{AppLayout-8sBPr3od.css → AppLayout-tsw5Ow0w.css} +1 -1
  50. package/web/assets/{AuditPage-BZIJ3_Kr.js → AuditPage-CKcExBws.js} +1 -1
  51. package/web/assets/{CloudAccountPage-DBv470sT.js → CloudAccountPage-B6oPg0BZ.js} +1 -1
  52. package/web/assets/{CloudMessagingPage-qCI8-UDL.js → CloudMessagingPage-C5fwVe-F.js} +1 -1
  53. package/web/assets/DashboardPage-9RV7sx3e.js +1 -0
  54. package/web/assets/{DashboardPage-D9-PpC3F.css → DashboardPage-FvNuC_e4.css} +1 -1
  55. package/web/assets/{DirectoryPickerDialog-B5DvDfQP.js → DirectoryPickerDialog-C06BXyfJ.js} +1 -1
  56. package/web/assets/{EnvironmentForm-Bw8Djnqm.js → EnvironmentForm-CAvDoira.js} +1 -1
  57. package/web/assets/{EnvironmentFormPage-B59uiYtp.js → EnvironmentFormPage-BmAxhN-m.js} +1 -1
  58. package/web/assets/{EnvironmentListPage-W9zLDZAg.js → EnvironmentListPage-B8uATPBI.js} +1 -1
  59. package/web/assets/KanbanBoardPage-CQsOkRUf.js +4 -0
  60. package/web/assets/KanbanBoardPage-eHmsrFGA.css +1 -0
  61. package/web/assets/{KanbanListPage-Bn9k8Rpc.js → KanbanListPage-CWZqkjD6.js} +1 -1
  62. package/web/assets/{LaunchProjectPage-Dc7v1UjQ.js → LaunchProjectPage-saSmC7Pr.js} +1 -1
  63. package/web/assets/LaunchServicesPage-BkKyLMEz.js +1 -0
  64. package/web/assets/LaunchServicesPage-DoLDPqQq.css +1 -0
  65. package/web/assets/{LaunchShell-LonTJpb3.js → LaunchShell-DUrSunB4.js} +1 -1
  66. package/web/assets/{LogViewer-DkuqWYkQ.js → LogViewer-CZBYkH9J.js} +1 -1
  67. package/web/assets/{OrgKeyPrompt-By1VjlSN.js → OrgKeyPrompt-DzQ7pwbs.js} +1 -1
  68. package/web/assets/{ProcessControls-C0skzKGL.js → ProcessControls-BEeoNlNV.js} +1 -1
  69. package/web/assets/{ProcessDetailPage-BvPX6z_X.js → ProcessDetailPage-CQgu5uKm.js} +1 -1
  70. package/web/assets/{ProjectCreateDialog-C4o9u15L.js → ProjectCreateDialog-BolrhRD-.js} +1 -1
  71. package/web/assets/{ProjectLocationGate-BJ1CSQt0.js → ProjectLocationGate-DhMVdIjN.js} +1 -1
  72. package/web/assets/{ProjectPublishDialog-Cp-zXdGm.js → ProjectPublishDialog-DsZNWrfz.js} +1 -1
  73. package/web/assets/{RandomJobTestPage-DF4a1U13.js → RandomJobTestPage-BUS2Ty6-.js} +1 -1
  74. package/web/assets/ScenarioEditorPage-MIAGh2us.js +14 -0
  75. package/web/assets/{SendToChatDialog-Dg2SHkVD.js → SendToChatDialog-BxWsyv29.js} +1 -1
  76. package/web/assets/{ServiceControlsBar-q2VHWaxK.js → ServiceControlsBar-DqDPAZt7.js} +1 -1
  77. package/web/assets/ServiceDetailPage-hkSAzZ-l.js +2 -0
  78. package/web/assets/{ServiceFormPage-tT_n7WUy.js → ServiceFormPage-DXqhqXg8.js} +1 -1
  79. package/web/assets/SettingsPage-4pKUgKPm.css +1 -0
  80. package/web/assets/SettingsPage-DS2YhMIM.js +2086 -0
  81. package/web/assets/{UnlockPage-BKAdMJkb.js → UnlockPage-s8SgVcKk.js} +1 -1
  82. package/web/assets/{VaultMigrationPage-D9KUTTss.js → VaultMigrationPage-s0b44MDM.js} +1 -1
  83. package/web/assets/{VersionBadge-moKP5bAv.js → VersionBadge-BmArk24p.js} +1 -1
  84. package/web/assets/{WikiPage-hLUndDxo.js → WikiPage-DADu8WUA.js} +1 -1
  85. package/web/assets/{WikiView-rrjXRR72.js → WikiView-DtGwIt_Q.js} +1 -1
  86. package/web/assets/{add-scalar-classes-CBfRr8B2.js → add-scalar-classes-dWEWPlFD.js} +2 -2
  87. package/web/assets/{agent.store-B3dVemmT.js → agent.store-CKLAkF9a.js} +1 -1
  88. package/web/assets/app-mode-BVpTuh0i.js +1 -0
  89. package/web/assets/auth-Cg9BWTfK.js +2 -0
  90. package/web/assets/{cloud-chat.store-Wg1poFem.js → cloud-chat.store-b-BHGz7I.js} +1 -1
  91. package/web/assets/{cloud-client-DQlUaoAw.js → cloud-client-D_zCiW0s.js} +2 -2
  92. package/web/assets/{cloud-session-DRUqcSGP.js → cloud-session-DOaDpZTy.js} +2 -2
  93. package/web/assets/dist-N4nrnbnA.js +1 -0
  94. package/web/assets/{editor.store-SoH48ux2.js → editor.store-DCAZSeVG.js} +1 -1
  95. package/web/assets/i18n-D0afQEGs.js +1 -0
  96. package/web/assets/{index-D_x2s8Ut.js → index-D8VRbyoP.js} +101 -101
  97. package/web/assets/index-DsezNbSM.css +1 -0
  98. package/web/assets/{modal-CpsVK_dA.js → modal-qYgTMkYb.js} +1 -1
  99. package/web/assets/{project-launch.store-C3fZeRGb.js → project-launch.store-y7JBMNiE.js} +1 -1
  100. package/web/assets/{project.store-BEk4fciH.js → project.store-DGJr0Qr9.js} +1 -1
  101. package/web/assets/{scenario.store-D-JrRiVO.js → scenario.store-YWHL2_wu.js} +3 -3
  102. package/web/assets/{service.store-B5uYZtyM.js → service.store-5jWsJxPx.js} +1 -1
  103. package/web/assets/{settings-scope-Blnwj3rR.js → settings-scope-Bv7QGPrt.js} +1 -1
  104. package/web/assets/{settings.store-Bo3FYs1o.js → settings.store-bEsB7oKb.js} +1 -1
  105. package/web/assets/{src-CAwAaB5j.js → src-C-D_y7ou.js} +1 -1
  106. package/web/assets/{src-DValZNJU.js → src-Dnwk6NpV.js} +5 -5
  107. package/web/assets/src-g1DRo8xZ.css +1 -0
  108. package/web/assets/{trpc-DbsE5GvQ.js → trpc-Drabzwpd.js} +3 -3
  109. package/web/assets/{useCloudOrg-DygUBG1a.js → useCloudOrg-BAQEtFPl.js} +1 -1
  110. package/web/assets/{useEnvVarAutocomplete-DmYNOXgd.js → useEnvVarAutocomplete-BqGTODUv.js} +1 -1
  111. package/web/assets/{useProjectCatalog-D2mHB7dg.js → useProjectCatalog-yocjIKt6.js} +1 -1
  112. package/web/assets/{useProjectCloudOrg-avTCVold.js → useProjectCloudOrg-CEN9-_OA.js} +1 -1
  113. package/web/assets/{useServiceUrlHost-Q3fzGox3.js → useServiceUrlHost-BuoPEXZX.js} +1 -1
  114. package/web/assets/{vue-draggable-plus-WgrMXXmE.js → vue-draggable-plus-DX4rTBiu.js} +1 -1
  115. package/web/index.html +19 -18
  116. package/agent-manager-M4NA5YFD.js +0 -11
  117. package/chat-X3X527EX.js +0 -23
  118. package/chunk-7HIPFSOA.js.map +0 -1
  119. package/chunk-NSS47H26.js.map +0 -1
  120. package/chunk-P73PTVII.js.map +0 -1
  121. package/chunk-XAFOP677.js.map +0 -1
  122. package/desktop-installer-page-6JDSXK2E.js.map +0 -1
  123. package/settings-manager-32SVMAFN.js +0 -10
  124. package/src-5TEXF3SU.js.map +0 -1
  125. package/web/assets/AppLayout-CVQIBYqg.js +0 -1
  126. package/web/assets/DashboardPage-D0UZM0mr.js +0 -1
  127. package/web/assets/KanbanBoardPage-DRACMk_D.css +0 -1
  128. package/web/assets/KanbanBoardPage-DwPqoJDJ.js +0 -4
  129. package/web/assets/LaunchServicesPage-CXUS9O3y.js +0 -1
  130. package/web/assets/LaunchServicesPage-DJDIN8HU.css +0 -1
  131. package/web/assets/ScenarioEditorPage-Dl-gEkJI.js +0 -14
  132. package/web/assets/ServiceDetailPage-CJ8WaFod.js +0 -2
  133. package/web/assets/SettingsPage-CWakkv0V.js +0 -2086
  134. package/web/assets/SettingsPage-aGSxZw1n.css +0 -1
  135. package/web/assets/auth-BCrvnP1U.js +0 -2
  136. package/web/assets/dist-DoChtT9t.js +0 -1
  137. package/web/assets/i18n-BszFg0ko.js +0 -1
  138. package/web/assets/index-C_JV7fYy.css +0 -1
  139. package/web/assets/src-DuBXN1hu.css +0 -1
  140. /package/{agent-manager-M4NA5YFD.js.map → agent-manager-R7BPQO6D.js.map} +0 -0
  141. /package/{chat-X3X527EX.js.map → chat-LPML22J5.js.map} +0 -0
  142. /package/{chunk-GXE5TLLJ.js.map → chunk-KV4GJKXU.js.map} +0 -0
  143. /package/{chunk-UR3HL373.js.map → chunk-NPMSBYXC.js.map} +0 -0
  144. /package/{companion-2LHKU577.js.map → companion-W3UMZWGH.js.map} +0 -0
  145. /package/{desktop-launcher-YPNRQMIS.js.map → desktop-launcher-GD4QPM66.js.map} +0 -0
  146. /package/{install-gate-2NNH7RM2.js.map → install-gate-PVMGJDWE.js.map} +0 -0
  147. /package/{settings-manager-32SVMAFN.js.map → settings-manager-XPLBO35P.js.map} +0 -0
  148. /package/{vault-resolver-VK6W5J6W.js.map → src-DCCEUWE6.js.map} +0 -0
@@ -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 z25 } from "zod";
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 text = raw.trim();
1404
- if (text.startsWith("[")) {
1412
+ const text2 = raw.trim();
1413
+ if (text2.startsWith("[")) {
1405
1414
  try {
1406
- const parsed = JSON.parse(text);
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 text.split(",").map((v) => v.trim().replace(/^["'[]+|["'\]]+$/g, "")).filter(Boolean);
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 text = String(raw).trim();
1416
- if (!text || text === "null") return { [key]: null };
1417
- return { [key]: parse(text) };
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 text = raw.trim();
1442
- const json = listItem(text);
1443
- if (json !== text) result = schema.safeParse(json);
1444
- if (!result.success && !/^[[{]/.test(text)) {
1445
- const list = schema.safeParse(toList(text).map(listItem));
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: "Its organization. Needed only when the same project id exists in several.", required: false }
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
- buildInput: (p) => p.projectId ? { projectId: p.projectId, ...p.orgId ? { orgId: p.orgId } : {} } : void 0
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 = new McpServer({ name: "runeya", version: "1.0.0" });
2359
- for (const cap of RUNEYA_CAPABILITIES) {
2360
- server.tool(cap.name, cap.description, buildMcpShape(cap), async (input) => {
2361
- try {
2362
- const rawParams = toRawParams(input, cap);
2363
- const raw = rawParams["authToken"];
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: z25.string().describe("The question to ask the user") },
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 text = typeof result === "string" ? result : JSON.stringify(result);
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
  }