@runeya/runeya 2.0.146 → 2.0.148

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 (171) hide show
  1. package/agent/index.js +10 -4
  2. package/agent/index.js.map +1 -1
  3. package/{agent-manager-R7BPQO6D.js → agent-manager-46C4NIQ2.js} +4 -2
  4. package/{chat-LPML22J5.js → chat-CMNDMXIP.js} +9 -5
  5. package/{chunk-SEPAURTQ.js → chunk-2NE52CL5.js} +156 -923
  6. package/chunk-2NE52CL5.js.map +1 -0
  7. package/chunk-4D3GCBPO.js +462 -0
  8. package/chunk-4D3GCBPO.js.map +1 -0
  9. package/{chunk-KV4GJKXU.js → chunk-5XG3X2TM.js} +27 -1479
  10. package/chunk-5XG3X2TM.js.map +1 -0
  11. package/chunk-7QXP4FXD.js +969 -0
  12. package/chunk-7QXP4FXD.js.map +1 -0
  13. package/chunk-DA2DZBTL.js +43 -0
  14. package/chunk-DA2DZBTL.js.map +1 -0
  15. package/chunk-DFPZ4MTI.js +1041 -0
  16. package/chunk-DFPZ4MTI.js.map +1 -0
  17. package/{chunk-UD42LACH.js → chunk-JNK6H5KH.js} +164 -1007
  18. package/chunk-JNK6H5KH.js.map +1 -0
  19. package/chunk-WDHLEO5S.js +809 -0
  20. package/chunk-WDHLEO5S.js.map +1 -0
  21. package/{companion-W3UMZWGH.js → companion-XKMNRIJB.js} +8 -3
  22. package/environment-resolver-ZDTF3MHI.js +18 -0
  23. package/environment-resolver-ZDTF3MHI.js.map +1 -0
  24. package/index.js +7 -7
  25. package/{install-gate-PVMGJDWE.js → install-gate-PWPGC63Z.js} +2 -2
  26. package/mcp-ready-TAPBAOZY.js +9 -0
  27. package/mcp-ready-TAPBAOZY.js.map +1 -0
  28. package/mcp-server/index.js +24 -0
  29. package/mcp-server/index.js.map +1 -1
  30. package/mcp-server/launch.d.ts +6 -0
  31. package/mcp-server/launch.js +2 -1
  32. package/mcp-server/launch.js.map +1 -1
  33. package/package.json +1 -1
  34. package/project-store-FLXTAD3J.js +23 -0
  35. package/project-store-FLXTAD3J.js.map +1 -0
  36. package/{src-LEDGW5KP.js → src-I5TPC6GW.js} +155 -63
  37. package/src-I5TPC6GW.js.map +1 -0
  38. package/web/assets/{AgentScalarChatInterface.vue-BYszptaB.js → AgentScalarChatInterface.vue-DKBinB_l.js} +2 -2
  39. package/web/assets/AgentTerminalPage-CixU7x6O.js +1 -0
  40. package/web/assets/AiChatModals-BvGUd-QD.css +1 -0
  41. package/web/assets/AiChatModals-C-hXImkO.js +4 -0
  42. package/web/assets/AppLayout-At9wk0sx.js +1 -0
  43. package/web/assets/{AppLayout-tsw5Ow0w.css → AppLayout-BlhwflMq.css} +1 -1
  44. package/web/assets/AuditPage-BkqbHxjY.js +1 -0
  45. package/web/assets/CloudAccountPage-D5C2SCS9.js +1 -0
  46. package/web/assets/CloudMessagingPage-Bi57GGHO.js +2 -0
  47. package/web/assets/DashboardPage-dEQop9ql.js +1 -0
  48. package/web/assets/DirectoryPickerDialog-DIMSeDhw.js +1 -0
  49. package/web/assets/{EditorIcon-CypGLV6w.js → EditorIcon-W3Szca4J.js} +1 -1
  50. package/web/assets/EnvironmentForm-C5emavNh.js +1 -0
  51. package/web/assets/EnvironmentFormPage-BIoy8fsW.js +1 -0
  52. package/web/assets/EnvironmentListPage-BDYeh7XF.js +1 -0
  53. package/web/assets/{FlagChip-R_T5qYpL.js → FlagChip-DPtIBCjQ.js} +1 -1
  54. package/web/assets/KanbanBoardPage-BlCcjBwV.js +4 -0
  55. package/web/assets/KanbanListPage-DbXONxfC.js +1 -0
  56. package/web/assets/LaunchProjectPage-Cg92hHwQ.js +1 -0
  57. package/web/assets/LaunchServicesPage-CO8gOB9D.js +1 -0
  58. package/web/assets/LaunchServicesPage-h5o3zLcy.css +1 -0
  59. package/web/assets/{LaunchShell-DUrSunB4.js → LaunchShell-CDb21ihZ.js} +1 -1
  60. package/web/assets/LogViewer-DsusKk2b.js +3 -0
  61. package/web/assets/OrgKeyPrompt-CX9K7r9I.js +1 -0
  62. package/web/assets/ProcessControls-B7hWVqiR.css +1 -0
  63. package/web/assets/ProcessControls-TEZutuxq.js +1 -0
  64. package/web/assets/ProcessDetailPage-Cj23FECq.js +1 -0
  65. package/web/assets/ProcessMetrics-1P6iE2Il.js +1 -0
  66. package/web/assets/ProjectCreateDialog-D3aMWKfw.js +1 -0
  67. package/web/assets/{ProjectLocationGate-DhMVdIjN.js → ProjectLocationGate-DU0Jj8Nw.js} +1 -1
  68. package/web/assets/ProjectPublishDialog-D7sNKei3.js +1 -0
  69. package/web/assets/{RandomJobTestPage-BUS2Ty6-.js → RandomJobTestPage-DQUMRHyf.js} +1 -1
  70. package/web/assets/{ScenarioEditorPage-vMoRt0Qn.css → ScenarioEditorPage-BSjSX4bw.css} +1 -1
  71. package/web/assets/ScenarioEditorPage-DvCdcY9m.js +14 -0
  72. package/web/assets/SendToChatDialog-BdWKjYmv.js +1 -0
  73. package/web/assets/ServiceControlsBar-B_J5m-Kc.js +1 -0
  74. package/web/assets/ServiceDetailPage-DhJcjFfY.js +2 -0
  75. package/web/assets/{ServiceDetailPage-COdaCZ6r.css → ServiceDetailPage-DnSf5cm9.css} +1 -1
  76. package/web/assets/ServiceFormPage-fp8NCHSv.js +1 -0
  77. package/web/assets/{SettingsPage-4pKUgKPm.css → SettingsPage-NH2fQap4.css} +1 -1
  78. package/web/assets/SettingsPage-s28BodWe.js +2086 -0
  79. package/web/assets/UnlockPage-BXXIPHW_.js +1 -0
  80. package/web/assets/VaultMigrationPage-BfNuKtkJ.js +1 -0
  81. package/web/assets/{VersionBadge-BmArk24p.js → VersionBadge-CW7czacg.js} +1 -1
  82. package/web/assets/{WikiPage-DADu8WUA.js → WikiPage-BiwpCM3E.js} +1 -1
  83. package/web/assets/WikiView-CMch_06Z.js +1 -0
  84. package/web/assets/{add-scalar-classes-dWEWPlFD.js → add-scalar-classes-Ckanjq1h.js} +14 -14
  85. package/web/assets/{agent.store-CKLAkF9a.js → agent.store-piokQ9Dt.js} +1 -1
  86. package/web/assets/{auth-Cg9BWTfK.js → auth-BT_jf-5e.js} +2 -2
  87. package/web/assets/cloud-chat.store-CDKh4tIy.js +1 -0
  88. package/web/assets/{cloud-client-D_zCiW0s.js → cloud-client-CzPdZLDq.js} +2 -2
  89. package/web/assets/{cloud-session-DOaDpZTy.js → cloud-session-BYfn6YM4.js} +2 -2
  90. package/web/assets/floating-ui.dom-DF3oyfHd.js +1 -0
  91. package/web/assets/i18n-D0FT7rCj.js +1 -0
  92. package/web/assets/index-3LTzgeU-.css +1 -0
  93. package/web/assets/index-Ci2CNnit.js +309 -0
  94. package/web/assets/modal-iRaP1izE.js +5 -0
  95. package/web/assets/notification.store-CvvuTBVz.js +1 -0
  96. package/web/assets/{project-launch.store-y7JBMNiE.js → project-launch.store-CTmbl8UY.js} +1 -1
  97. package/web/assets/{project.store-DGJr0Qr9.js → project.store-CNC6_4r4.js} +1 -1
  98. package/web/assets/runtime-dom.esm-bundler-CyEVRK6B.js +1 -0
  99. package/web/assets/scenario.store-BIFQPXgl.js +7 -0
  100. package/web/assets/{service.store-5jWsJxPx.js → service.store-B40U4QzI.js} +1 -1
  101. package/web/assets/settings-scope-CyWMCjRY.js +1 -0
  102. package/web/assets/settings.store-Dw6bAoWE.js +1 -0
  103. package/web/assets/{src-Dnwk6NpV.js → src-CrNi4Pjg.js} +3 -3
  104. package/web/assets/src-DIBHat7I.js +3 -0
  105. package/web/assets/src-DtCW_XCh.js +1 -0
  106. package/web/assets/{trpc-Drabzwpd.js → trpc-BAZGRZBD.js} +3 -3
  107. package/web/assets/{useCloudOrg-BAQEtFPl.js → useCloudOrg-EnXFBwt1.js} +1 -1
  108. package/web/assets/useEnvVarAutocomplete-BxJh2Lw0.js +1 -0
  109. package/web/assets/useProjectCatalog-BrvUGv9A.js +1 -0
  110. package/web/assets/{useProjectCloudOrg-CEN9-_OA.js → useProjectCloudOrg-Czxlg00k.js} +1 -1
  111. package/web/assets/{useServiceUrlHost-BuoPEXZX.js → useServiceUrlHost-Szz9y3rh.js} +1 -1
  112. package/web/assets/vue-i18n-o7yraQpR.js +3 -0
  113. package/web/index.html +21 -21
  114. package/chunk-KV4GJKXU.js.map +0 -1
  115. package/chunk-SEPAURTQ.js.map +0 -1
  116. package/chunk-UD42LACH.js.map +0 -1
  117. package/src-LEDGW5KP.js.map +0 -1
  118. package/web/assets/AgentTerminalPage-C3TJ1NL9.js +0 -1
  119. package/web/assets/AiChatModals-D3scRE3S.js +0 -4
  120. package/web/assets/AiChatModals-EfRuvId7.css +0 -1
  121. package/web/assets/AppLayout-BMQUjPKe.js +0 -1
  122. package/web/assets/AuditPage-CKcExBws.js +0 -1
  123. package/web/assets/CloudAccountPage-B6oPg0BZ.js +0 -1
  124. package/web/assets/CloudMessagingPage-C5fwVe-F.js +0 -2
  125. package/web/assets/DashboardPage-9RV7sx3e.js +0 -1
  126. package/web/assets/DirectoryPickerDialog-C06BXyfJ.js +0 -1
  127. package/web/assets/EnvironmentForm-CAvDoira.js +0 -1
  128. package/web/assets/EnvironmentFormPage-BmAxhN-m.js +0 -1
  129. package/web/assets/EnvironmentListPage-B8uATPBI.js +0 -1
  130. package/web/assets/KanbanBoardPage-CQsOkRUf.js +0 -4
  131. package/web/assets/KanbanListPage-CWZqkjD6.js +0 -1
  132. package/web/assets/LaunchProjectPage-saSmC7Pr.js +0 -1
  133. package/web/assets/LaunchServicesPage-BkKyLMEz.js +0 -1
  134. package/web/assets/LaunchServicesPage-DoLDPqQq.css +0 -1
  135. package/web/assets/LogViewer-CZBYkH9J.js +0 -3
  136. package/web/assets/OrgKeyPrompt-DzQ7pwbs.js +0 -1
  137. package/web/assets/ProcessControls-BEeoNlNV.js +0 -1
  138. package/web/assets/ProcessControls-BlpnVylq.css +0 -1
  139. package/web/assets/ProcessDetailPage-CQgu5uKm.js +0 -1
  140. package/web/assets/ProcessMetrics-Crlfkelj.js +0 -1
  141. package/web/assets/ProjectCreateDialog-BolrhRD-.js +0 -1
  142. package/web/assets/ProjectPublishDialog-DsZNWrfz.js +0 -1
  143. package/web/assets/ScenarioEditorPage-MIAGh2us.js +0 -14
  144. package/web/assets/SendToChatDialog-BxWsyv29.js +0 -1
  145. package/web/assets/ServiceControlsBar-DqDPAZt7.js +0 -1
  146. package/web/assets/ServiceDetailPage-hkSAzZ-l.js +0 -2
  147. package/web/assets/ServiceFormPage-DXqhqXg8.js +0 -1
  148. package/web/assets/SettingsPage-DS2YhMIM.js +0 -2086
  149. package/web/assets/UnlockPage-s8SgVcKk.js +0 -1
  150. package/web/assets/VaultMigrationPage-s0b44MDM.js +0 -1
  151. package/web/assets/WikiView-DtGwIt_Q.js +0 -1
  152. package/web/assets/cloud-chat.store-b-BHGz7I.js +0 -1
  153. package/web/assets/editor.store-DCAZSeVG.js +0 -1
  154. package/web/assets/floating-ui.dom-DWhsZyqT.js +0 -1
  155. package/web/assets/i18n-D0afQEGs.js +0 -1
  156. package/web/assets/index-D8VRbyoP.js +0 -309
  157. package/web/assets/index-DsezNbSM.css +0 -1
  158. package/web/assets/modal-qYgTMkYb.js +0 -5
  159. package/web/assets/scenario.store-YWHL2_wu.js +0 -7
  160. package/web/assets/settings-scope-Bv7QGPrt.js +0 -1
  161. package/web/assets/settings.store-bEsB7oKb.js +0 -1
  162. package/web/assets/src--GO-VSJ0.js +0 -5
  163. package/web/assets/src-C-D_y7ou.js +0 -1
  164. package/web/assets/useEnvVarAutocomplete-BqGTODUv.js +0 -1
  165. package/web/assets/useProjectCatalog-yocjIKt6.js +0 -1
  166. package/web/assets/vue-draggable-plus-BHsveB8w.css +0 -1
  167. package/web/assets/vue-draggable-plus-DX4rTBiu.js +0 -1
  168. /package/{agent-manager-R7BPQO6D.js.map → agent-manager-46C4NIQ2.js.map} +0 -0
  169. /package/{chat-LPML22J5.js.map → chat-CMNDMXIP.js.map} +0 -0
  170. /package/{companion-W3UMZWGH.js.map → companion-XKMNRIJB.js.map} +0 -0
  171. /package/{install-gate-PVMGJDWE.js.map → install-gate-PWPGC63Z.js.map} +0 -0
@@ -23,6 +23,12 @@ interface RuneyaMcpEnv {
23
23
  */
24
24
  RUNEYA_PROJECT_ID?: string;
25
25
  RUNEYA_ORG_ID?: string;
26
+ /**
27
+ * L'identifiant du lancement, posé par un runner qui attend que ce serveur
28
+ * soit initialisé avant d'écrire le prompt. Le serveur MCP le renvoie à
29
+ * Runeya (`mcpReady.signal`) dès que le CLI a fini l'initialisation.
30
+ */
31
+ RUNEYA_MCP_READY_ID?: string;
26
32
  }
27
33
  /**
28
34
  * Chemin du point d'entrée du serveur MCP, à lancer avec `node`.
@@ -28,7 +28,8 @@ function pickEnv(env) {
28
28
  ...env.RUNEYA_BASE_URL ? { RUNEYA_BASE_URL: env.RUNEYA_BASE_URL } : {},
29
29
  ...env.RUNEYA_API_TOKEN ? { RUNEYA_API_TOKEN: env.RUNEYA_API_TOKEN } : {},
30
30
  ...env.RUNEYA_PROJECT_ID ? { RUNEYA_PROJECT_ID: env.RUNEYA_PROJECT_ID } : {},
31
- ...env.RUNEYA_ORG_ID ? { RUNEYA_ORG_ID: env.RUNEYA_ORG_ID } : {}
31
+ ...env.RUNEYA_ORG_ID ? { RUNEYA_ORG_ID: env.RUNEYA_ORG_ID } : {},
32
+ ...env.RUNEYA_MCP_READY_ID ? { RUNEYA_MCP_READY_ID: env.RUNEYA_MCP_READY_ID } : {}
32
33
  };
33
34
  }
34
35
  function runeyaMcpConfig(env) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/launch.ts"],"sourcesContent":["import { fileURLToPath } from 'node:url';\nimport { createRequire } from 'node:module';\nimport { existsSync } from 'node:fs';\n\n/**\n * Comment brancher le serveur MCP Runeya sur un CLI d'IA.\n *\n * Runeya n'installe rien dans la configuration de la machine : il passe sa\n * config MCP en ligne de commande, au moment où il lance lui-même le CLI. Le\n * `~/.claude.json` ou le `~/.codex/config.toml` de l'utilisateur reste intact,\n * et un CLI lancé à la main depuis un terminal ne voit pas ce serveur.\n *\n * Chaque CLI a sa syntaxe — d'où ce module, seule source de vérité partagée par\n * les deux points de lancement (l'agent, et le serveur en mode local).\n */\n\n/** Variables d'environnement que le serveur MCP attend pour joindre Runeya. */\nexport interface RuneyaMcpEnv {\n RUNEYA_BASE_URL?: string;\n RUNEYA_API_TOKEN?: string;\n /**\n * Le projet et l'organisation de la conversation qui lance ce CLI, s'il y en a.\n *\n * Le serveur MCP en fait le défaut des tools qui acceptent un `projectId`,\n * `orgId` ou `organizationId` : sans projet, `list_services` rend toute la\n * machine ; sans organisation, les recherches Kanban ne savent pas quel\n * compte cloud interroger.\n */\n RUNEYA_PROJECT_ID?: string;\n RUNEYA_ORG_ID?: string;\n}\n\n/**\n * Chemin du point d'entrée du serveur MCP, à lancer avec `node`.\n *\n * Ne PAS se fier à `import.meta.url` pour viser `./index.js` : ce module est\n * bundlé dans l'agent et dans le serveur (tsup y bundle les paquets @runeya\n * via `noExternal`), donc\n * `import.meta.url` y désigne le bundle hôte, pas ce paquet. On résout donc le\n * paquet, puis on sonde les emplacements de la version packagée, où les liens\n * symboliques de l'espace de travail n'existent plus.\n */\nexport function resolveMcpServerPath(): string {\n try {\n const req = createRequire(import.meta.url);\n return req.resolve('@runeya/packages-mcp-server');\n } catch { /* pas de node_modules résolvable : on sonde le disque */ }\n\n const candidates = [\n // Build packagé du CLI : dist/agent/index.js et dist/index.js côtoient\n // dist/mcp-server/, copié là par le post-build.\n new URL('../mcp-server/index.js', import.meta.url),\n new URL('./mcp-server/index.js', import.meta.url),\n // Monorepo, depuis un dist d'app.\n new URL('../../../packages/mcp-server/dist/index.js', import.meta.url),\n new URL('../../../../packages/mcp-server/dist/index.js', import.meta.url),\n ];\n for (const c of candidates) {\n const p = fileURLToPath(c);\n if (existsSync(p)) return p;\n }\n throw new Error('Could not locate @runeya/packages-mcp-server (built dist not found)');\n}\n\n/** Ne garde que les variables renseignées : une valeur vide n'aide personne. */\nfunction pickEnv(env: RuneyaMcpEnv): Record<string, string> {\n return {\n ...(env.RUNEYA_BASE_URL ? { RUNEYA_BASE_URL: env.RUNEYA_BASE_URL } : {}),\n ...(env.RUNEYA_API_TOKEN ? { RUNEYA_API_TOKEN: env.RUNEYA_API_TOKEN } : {}),\n ...(env.RUNEYA_PROJECT_ID ? { RUNEYA_PROJECT_ID: env.RUNEYA_PROJECT_ID } : {}),\n ...(env.RUNEYA_ORG_ID ? { RUNEYA_ORG_ID: env.RUNEYA_ORG_ID } : {}),\n };\n}\n\n/**\n * La config MCP de Runeya, au format `mcpServers` attendu par `--mcp-config`.\n *\n * Seul endroit du dépôt où ce JSON se fabrique. `chat.ts` en tenait deux copies\n * qui résolvaient le chemin avec `import.meta.url` — le piège que\n * `resolveMcpServerPath()` documente juste au-dessus : bundlées dans l'app\n * hôte, elles visaient un fichier qui n'existe pas, et le CLI démarrait sans\n * les tools Runeya, en silence.\n */\nexport function runeyaMcpConfig(env: RuneyaMcpEnv): string {\n return JSON.stringify({\n mcpServers: {\n runeya: {\n command: 'node',\n args: [resolveMcpServerPath()],\n env: pickEnv(env),\n },\n },\n });\n}\n\n/**\n * Arguments `--mcp-config` pour le CLI `claude`, qui attend du JSON.\n *\n * Volontairement non strict : le CLI démarre aussi les serveurs MCP de la\n * machine. Cela coûte quelques secondes par lancement, mais l'utilisateur garde\n * ses propres outils.\n */\nexport function claudeMcpArgs(env: RuneyaMcpEnv): string[] {\n return ['--mcp-config', runeyaMcpConfig(env)];\n}\n\n/**\n * Arguments `-c` pour le CLI `codex`, qui attend du TOML.\n *\n * Codex n'a pas d'équivalent de `--mcp-config` : il expose des surcharges de\n * configuration en TOML (`-c chemin.pointé=valeur`), à placer AVANT la\n * sous-commande. Une table inline décrit le serveur en une seule surcharge.\n */\nexport function codexMcpArgs(env: RuneyaMcpEnv): string[] {\n const fields = [\n `command=${tomlString('node')}`,\n `args=[${tomlString(resolveMcpServerPath())}]`,\n ];\n\n const entries = Object.entries(pickEnv(env));\n if (entries.length > 0) {\n const inline = entries.map(([k, v]) => `${k}=${tomlString(v)}`).join(',');\n fields.push(`env={${inline}}`);\n }\n\n return ['-c', `mcp_servers.runeya={${fields.join(',')}}`];\n}\n\n/**\n * Les arguments à passer à un `claude` que Runeya lance avec son MCP.\n *\n * Si le serveur interne est introuvable, `claude` chargerait l'entrée `runeya`\n * de `~/.claude.json`, le MCP externe, qui demande un appairage au premier\n * appel d'outil. Ses outils sont alors interdits. `--settings` prend une seule\n * valeur : `--disallowedTools`, variadique, avalerait l'argument suivant.\n */\nexport function claudeRuneyaMcpArgs(\n env: RuneyaMcpEnv,\n build: (env: RuneyaMcpEnv) => string[] = claudeMcpArgs,\n warn: (message: string) => void = console.warn,\n): string[] {\n try {\n return build(env);\n } catch (err) {\n warn(`[claude] Failed to resolve MCP server path: ${(err as Error).message}`);\n return ['--settings', JSON.stringify({ permissions: { deny: ['mcp__runeya'] } })];\n }\n}\n\n/**\n * Les surcharges `-c` à passer à tout `codex` que Runeya lance.\n *\n * Avec un jeton, le serveur interne remplace l'entrée `runeya` de l'utilisateur.\n * Sans jeton, ou si le serveur interne est introuvable, cette entrée est\n * désactivée : c'est le MCP externe (`runeya mcp`), qui demanderait alors un\n * appairage dans l'interface pour une session lancée par Runeya lui-même.\n */\nexport function codexRuneyaMcpArgs(\n env: RuneyaMcpEnv,\n build: (env: RuneyaMcpEnv) => string[] = codexMcpArgs,\n warn: (message: string) => void = console.warn,\n): string[] {\n const disabled = ['-c', 'mcp_servers.runeya.enabled=false'];\n if (!env.RUNEYA_API_TOKEN) return disabled;\n try {\n return build(env);\n } catch (err) {\n warn(`[codex] Failed to resolve MCP server path: ${(err as Error).message}`);\n return disabled;\n }\n}\n\n/**\n * Chaîne TOML de base : seuls la contre-oblique et le guillemet doivent être\n * échappés. Les caractères de contrôle, eux, sont interdits par le format — un\n * chemin ou un jeton qui en contiendrait casserait la config en silence.\n */\nfunction tomlString(value: string): string {\n const escaped = value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/[\\u0000-\\u001f\\u007f]/g, (c) => `\\\\u${c.charCodeAt(0).toString(16).padStart(4, '0')}`);\n return `\"${escaped}\"`;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/launch.ts"],"sourcesContent":["import { fileURLToPath } from 'node:url';\nimport { createRequire } from 'node:module';\nimport { existsSync } from 'node:fs';\n\n/**\n * Comment brancher le serveur MCP Runeya sur un CLI d'IA.\n *\n * Runeya n'installe rien dans la configuration de la machine : il passe sa\n * config MCP en ligne de commande, au moment où il lance lui-même le CLI. Le\n * `~/.claude.json` ou le `~/.codex/config.toml` de l'utilisateur reste intact,\n * et un CLI lancé à la main depuis un terminal ne voit pas ce serveur.\n *\n * Chaque CLI a sa syntaxe — d'où ce module, seule source de vérité partagée par\n * les deux points de lancement (l'agent, et le serveur en mode local).\n */\n\n/** Variables d'environnement que le serveur MCP attend pour joindre Runeya. */\nexport interface RuneyaMcpEnv {\n RUNEYA_BASE_URL?: string;\n RUNEYA_API_TOKEN?: string;\n /**\n * Le projet et l'organisation de la conversation qui lance ce CLI, s'il y en a.\n *\n * Le serveur MCP en fait le défaut des tools qui acceptent un `projectId`,\n * `orgId` ou `organizationId` : sans projet, `list_services` rend toute la\n * machine ; sans organisation, les recherches Kanban ne savent pas quel\n * compte cloud interroger.\n */\n RUNEYA_PROJECT_ID?: string;\n RUNEYA_ORG_ID?: string;\n /**\n * L'identifiant du lancement, posé par un runner qui attend que ce serveur\n * soit initialisé avant d'écrire le prompt. Le serveur MCP le renvoie à\n * Runeya (`mcpReady.signal`) dès que le CLI a fini l'initialisation.\n */\n RUNEYA_MCP_READY_ID?: string;\n}\n\n/**\n * Chemin du point d'entrée du serveur MCP, à lancer avec `node`.\n *\n * Ne PAS se fier à `import.meta.url` pour viser `./index.js` : ce module est\n * bundlé dans l'agent et dans le serveur (tsup y bundle les paquets @runeya\n * via `noExternal`), donc\n * `import.meta.url` y désigne le bundle hôte, pas ce paquet. On résout donc le\n * paquet, puis on sonde les emplacements de la version packagée, où les liens\n * symboliques de l'espace de travail n'existent plus.\n */\nexport function resolveMcpServerPath(): string {\n try {\n const req = createRequire(import.meta.url);\n return req.resolve('@runeya/packages-mcp-server');\n } catch { /* pas de node_modules résolvable : on sonde le disque */ }\n\n const candidates = [\n // Build packagé du CLI : dist/agent/index.js et dist/index.js côtoient\n // dist/mcp-server/, copié là par le post-build.\n new URL('../mcp-server/index.js', import.meta.url),\n new URL('./mcp-server/index.js', import.meta.url),\n // Monorepo, depuis un dist d'app.\n new URL('../../../packages/mcp-server/dist/index.js', import.meta.url),\n new URL('../../../../packages/mcp-server/dist/index.js', import.meta.url),\n ];\n for (const c of candidates) {\n const p = fileURLToPath(c);\n if (existsSync(p)) return p;\n }\n throw new Error('Could not locate @runeya/packages-mcp-server (built dist not found)');\n}\n\n/** Ne garde que les variables renseignées : une valeur vide n'aide personne. */\nfunction pickEnv(env: RuneyaMcpEnv): Record<string, string> {\n return {\n ...(env.RUNEYA_BASE_URL ? { RUNEYA_BASE_URL: env.RUNEYA_BASE_URL } : {}),\n ...(env.RUNEYA_API_TOKEN ? { RUNEYA_API_TOKEN: env.RUNEYA_API_TOKEN } : {}),\n ...(env.RUNEYA_PROJECT_ID ? { RUNEYA_PROJECT_ID: env.RUNEYA_PROJECT_ID } : {}),\n ...(env.RUNEYA_ORG_ID ? { RUNEYA_ORG_ID: env.RUNEYA_ORG_ID } : {}),\n ...(env.RUNEYA_MCP_READY_ID ? { RUNEYA_MCP_READY_ID: env.RUNEYA_MCP_READY_ID } : {}),\n };\n}\n\n/**\n * La config MCP de Runeya, au format `mcpServers` attendu par `--mcp-config`.\n *\n * Seul endroit du dépôt où ce JSON se fabrique. `chat.ts` en tenait deux copies\n * qui résolvaient le chemin avec `import.meta.url` — le piège que\n * `resolveMcpServerPath()` documente juste au-dessus : bundlées dans l'app\n * hôte, elles visaient un fichier qui n'existe pas, et le CLI démarrait sans\n * les tools Runeya, en silence.\n */\nexport function runeyaMcpConfig(env: RuneyaMcpEnv): string {\n return JSON.stringify({\n mcpServers: {\n runeya: {\n command: 'node',\n args: [resolveMcpServerPath()],\n env: pickEnv(env),\n },\n },\n });\n}\n\n/**\n * Arguments `--mcp-config` pour le CLI `claude`, qui attend du JSON.\n *\n * Volontairement non strict : le CLI démarre aussi les serveurs MCP de la\n * machine. Cela coûte quelques secondes par lancement, mais l'utilisateur garde\n * ses propres outils.\n */\nexport function claudeMcpArgs(env: RuneyaMcpEnv): string[] {\n return ['--mcp-config', runeyaMcpConfig(env)];\n}\n\n/**\n * Arguments `-c` pour le CLI `codex`, qui attend du TOML.\n *\n * Codex n'a pas d'équivalent de `--mcp-config` : il expose des surcharges de\n * configuration en TOML (`-c chemin.pointé=valeur`), à placer AVANT la\n * sous-commande. Une table inline décrit le serveur en une seule surcharge.\n */\nexport function codexMcpArgs(env: RuneyaMcpEnv): string[] {\n const fields = [\n `command=${tomlString('node')}`,\n `args=[${tomlString(resolveMcpServerPath())}]`,\n ];\n\n const entries = Object.entries(pickEnv(env));\n if (entries.length > 0) {\n const inline = entries.map(([k, v]) => `${k}=${tomlString(v)}`).join(',');\n fields.push(`env={${inline}}`);\n }\n\n return ['-c', `mcp_servers.runeya={${fields.join(',')}}`];\n}\n\n/**\n * Les arguments à passer à un `claude` que Runeya lance avec son MCP.\n *\n * Si le serveur interne est introuvable, `claude` chargerait l'entrée `runeya`\n * de `~/.claude.json`, le MCP externe, qui demande un appairage au premier\n * appel d'outil. Ses outils sont alors interdits. `--settings` prend une seule\n * valeur : `--disallowedTools`, variadique, avalerait l'argument suivant.\n */\nexport function claudeRuneyaMcpArgs(\n env: RuneyaMcpEnv,\n build: (env: RuneyaMcpEnv) => string[] = claudeMcpArgs,\n warn: (message: string) => void = console.warn,\n): string[] {\n try {\n return build(env);\n } catch (err) {\n warn(`[claude] Failed to resolve MCP server path: ${(err as Error).message}`);\n return ['--settings', JSON.stringify({ permissions: { deny: ['mcp__runeya'] } })];\n }\n}\n\n/**\n * Les surcharges `-c` à passer à tout `codex` que Runeya lance.\n *\n * Avec un jeton, le serveur interne remplace l'entrée `runeya` de l'utilisateur.\n * Sans jeton, ou si le serveur interne est introuvable, cette entrée est\n * désactivée : c'est le MCP externe (`runeya mcp`), qui demanderait alors un\n * appairage dans l'interface pour une session lancée par Runeya lui-même.\n */\nexport function codexRuneyaMcpArgs(\n env: RuneyaMcpEnv,\n build: (env: RuneyaMcpEnv) => string[] = codexMcpArgs,\n warn: (message: string) => void = console.warn,\n): string[] {\n const disabled = ['-c', 'mcp_servers.runeya.enabled=false'];\n if (!env.RUNEYA_API_TOKEN) return disabled;\n try {\n return build(env);\n } catch (err) {\n warn(`[codex] Failed to resolve MCP server path: ${(err as Error).message}`);\n return disabled;\n }\n}\n\n/**\n * Chaîne TOML de base : seuls la contre-oblique et le guillemet doivent être\n * échappés. Les caractères de contrôle, eux, sont interdits par le format — un\n * chemin ou un jeton qui en contiendrait casserait la config en silence.\n */\nfunction tomlString(value: string): string {\n const escaped = value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/[\\u0000-\\u001f\\u007f]/g, (c) => `\\\\u${c.charCodeAt(0).toString(16).padStart(4, '0')}`);\n return `\"${escaped}\"`;\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runeya/runeya",
3
- "version": "2.0.146",
3
+ "version": "2.0.148",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "runeya": "./index.js"
@@ -0,0 +1,23 @@
1
+ import {
2
+ LocalProjectCloudLinkedError,
3
+ LocalProjectExistsError,
4
+ LocalProjectInMachineRootError,
5
+ LocalProjectNotFoundError,
6
+ LocalProjectRefusedError,
7
+ projectStore
8
+ } from "./chunk-7QXP4FXD.js";
9
+ import "./chunk-4D3GCBPO.js";
10
+ import "./chunk-DFPZ4MTI.js";
11
+ import "./chunk-OZBSOSAS.js";
12
+ import "./chunk-4LJQIQMN.js";
13
+ import "./chunk-VPSQJOSN.js";
14
+ import "./chunk-MZSDTA4A.js";
15
+ export {
16
+ LocalProjectCloudLinkedError,
17
+ LocalProjectExistsError,
18
+ LocalProjectInMachineRootError,
19
+ LocalProjectNotFoundError,
20
+ LocalProjectRefusedError,
21
+ projectStore
22
+ };
23
+ //# sourceMappingURL=project-store-FLXTAD3J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,3 +1,6 @@
1
+ import {
2
+ signalMcpReady
3
+ } from "./chunk-DA2DZBTL.js";
1
4
  import {
2
5
  ALLOWED_MIME_TYPES,
3
6
  APP_VERSION_HEADER,
@@ -28,11 +31,8 @@ import {
28
31
  cloudFetch2,
29
32
  cloudSessionStore,
30
33
  createContext,
31
- environmentOverridesStore,
32
- environmentResolver,
33
34
  executeKanbanBoardCommands,
34
35
  executeKanbanCommands,
35
- filterEnvForAi,
36
36
  generateLlmsTxt,
37
37
  getActiveProvider,
38
38
  getAllowedServiceIds,
@@ -40,6 +40,7 @@ import {
40
40
  getDeviceName,
41
41
  imageStorageService,
42
42
  isShareable,
43
+ kanbanContextFor,
43
44
  kanbanStore,
44
45
  logParserStore,
45
46
  maskApiKey,
@@ -57,6 +58,7 @@ import {
57
58
  resolveEffectiveAgentId,
58
59
  resolveServiceVariables,
59
60
  router,
61
+ runeyaMcpConfig,
60
62
  scenarioRunStore,
61
63
  scenarioStore,
62
64
  serviceRouter,
@@ -65,25 +67,16 @@ import {
65
67
  soleAccountScope,
66
68
  startCliSession,
67
69
  vaultOfProject
68
- } from "./chunk-SEPAURTQ.js";
69
- import "./chunk-6IBPK6UE.js";
70
- import {
71
- settingsManager
72
- } from "./chunk-NPMSBYXC.js";
70
+ } from "./chunk-2NE52CL5.js";
73
71
  import {
74
72
  CONVERSATIONS_DIRNAME,
75
- LocalProjectRefusedError,
76
73
  activeSessionRegistry,
77
74
  companionCreateDefaults,
78
75
  companionDefaultPrompt,
79
76
  companionSettings,
80
77
  conversationStore,
81
- ensureDataGitignore,
82
78
  generateJwtSecret,
83
79
  getJwtSecretGeneratedAt,
84
- holdsRuneyaProject,
85
- projectPathStore,
86
- projectStore,
87
80
  resolveAgentCwd,
88
81
  resolveConversationCwd,
89
82
  resolveWorkspaceCwd,
@@ -94,11 +87,36 @@ import {
94
87
  stopClaudeTranscriptWatcher,
95
88
  stopCodexTranscriptWatcher,
96
89
  verifyJwt
97
- } from "./chunk-UD42LACH.js";
90
+ } from "./chunk-JNK6H5KH.js";
91
+ import "./chunk-6IBPK6UE.js";
92
+ import {
93
+ LocalProjectRefusedError,
94
+ ensureDataGitignore,
95
+ holdsRuneyaProject,
96
+ projectPathStore,
97
+ projectStore
98
+ } from "./chunk-7QXP4FXD.js";
99
+ import {
100
+ environmentOverridesStore,
101
+ environmentResolver,
102
+ filterEnvForAi
103
+ } from "./chunk-WDHLEO5S.js";
98
104
  import {
99
105
  agentManager,
100
106
  agentSpawner,
101
107
  agentStore,
108
+ killInstance,
109
+ listInstances,
110
+ registerInstance,
111
+ restartInstance,
112
+ scheduleSelfRestart,
113
+ traefikManager,
114
+ unregisterInstance
115
+ } from "./chunk-5XG3X2TM.js";
116
+ import {
117
+ serviceStore
118
+ } from "./chunk-4D3GCBPO.js";
119
+ import {
102
120
  clearDetached,
103
121
  clearEncryptionKey,
104
122
  clearLocalRemoval,
@@ -117,23 +135,15 @@ import {
117
135
  isEncryptedValue,
118
136
  isLocallyRemoved,
119
137
  isVaultLocked,
120
- killInstance,
121
- listInstances,
122
138
  loadFromEnv,
123
139
  markVaultLocked,
124
140
  onVaultUnlocked,
125
141
  projectKey,
126
- registerInstance,
127
- restartInstance,
128
- scheduleSelfRestart,
129
- serviceStore,
130
142
  setEncryptionKey,
131
143
  setEncryptionKeyInMemory,
132
144
  setPendingLegacyKey,
133
- stableEncryptValue,
134
- traefikManager,
135
- unregisterInstance
136
- } from "./chunk-KV4GJKXU.js";
145
+ stableEncryptValue
146
+ } from "./chunk-DFPZ4MTI.js";
137
147
  import {
138
148
  decryptValueWith,
139
149
  encryptValueWith,
@@ -141,6 +151,9 @@ import {
141
151
  resolveCliInvocation,
142
152
  whichCommand
143
153
  } from "./chunk-OZBSOSAS.js";
154
+ import {
155
+ settingsManager
156
+ } from "./chunk-NPMSBYXC.js";
144
157
  import {
145
158
  atomicWriteSecure,
146
159
  renameWithRetry,
@@ -1559,12 +1572,26 @@ async function resolveTarget(processId, fallbackAgentId) {
1559
1572
  const service = await serviceStore.get(processId) ?? null;
1560
1573
  const agentId = (service ? await resolveEffectiveAgentId(service) : null) ?? fallbackAgentId ?? null;
1561
1574
  if (!agentId) {
1575
+ throw new TRPCError5({ code: "BAD_REQUEST", message: "NO_AGENT_FOR_SERVICE" });
1576
+ }
1577
+ return { agentId, service };
1578
+ }
1579
+ function isAgentUnreachable(err) {
1580
+ const e = err;
1581
+ if (!e) return false;
1582
+ if (e.cause?.code === "ECONNREFUSED" || e.cause?.code === "ECONNRESET" || e.cause?.code === "EHOSTUNREACH") return true;
1583
+ if (e.message === "fetch failed" || e.name === "TypeError" || e.name === "TimeoutError") return true;
1584
+ return /^Agent \S+ (not found|not connected)/.test(e.message ?? "");
1585
+ }
1586
+ async function callAgent(fn, fallbackMessage) {
1587
+ try {
1588
+ return await fn();
1589
+ } catch (err) {
1562
1590
  throw new TRPCError5({
1563
- code: "BAD_REQUEST",
1564
- message: "No agent assigned to this service. Set an agent on the service or on the active environment."
1591
+ code: "INTERNAL_SERVER_ERROR",
1592
+ message: isAgentUnreachable(err) ? "AGENT_UNREACHABLE" : err?.message ?? fallbackMessage
1565
1593
  });
1566
1594
  }
1567
- return { agentId, service };
1568
1595
  }
1569
1596
  async function assertEnvironmentComplete(service) {
1570
1597
  if (!service) return;
@@ -1603,26 +1630,17 @@ async function startProcess(processId, fallbackAgentId) {
1603
1630
  const { agentId, service } = await resolveTarget(processId, fallbackAgentId);
1604
1631
  await assertEnvironmentComplete(service);
1605
1632
  await deployBefore(processId, agentId, service, "start");
1606
- let result;
1607
- try {
1608
- result = await agentManager.agentMutation(agentId, "process.start", { id: processId });
1609
- } catch (err) {
1610
- const err_ = err;
1611
- const isFetchError = err_?.cause?.code === "ECONNREFUSED" || err_?.message === "fetch failed" || err_?.name === "TypeError";
1612
- throw new TRPCError5({
1613
- code: "INTERNAL_SERVER_ERROR",
1614
- message: isFetchError ? `Cannot reach agent \u2014 make sure the agent is running` : err_?.message ?? "Failed to start process"
1615
- });
1616
- }
1633
+ const result = await callAgent(
1634
+ () => agentManager.agentMutation(agentId, "process.start", { id: processId }),
1635
+ "Failed to start process"
1636
+ );
1617
1637
  await auditService.log({ userId: "local", action: "start", entityType: "process", entityId: processId, metadata: { agentId } });
1618
1638
  return { ...result, agentId };
1619
1639
  }
1620
1640
  async function stopProcess(processId, agentId) {
1621
- const result = await agentManager.agentMutation(
1622
- agentId,
1623
- "process.stop",
1624
- { id: processId },
1625
- AGENT_STOP_FETCH_TIMEOUT
1641
+ const result = await callAgent(
1642
+ () => agentManager.agentMutation(agentId, "process.stop", { id: processId }, AGENT_STOP_FETCH_TIMEOUT),
1643
+ "Failed to stop process"
1626
1644
  );
1627
1645
  await auditService.log({ userId: "local", action: "stop", entityType: "process", entityId: processId, metadata: { agentId } });
1628
1646
  return { ...result, agentId };
@@ -1636,7 +1654,10 @@ async function restartProcess(processId, fallbackAgentId) {
1636
1654
  console.debug("[process-control] Stop before restart ignored (process not found on agent?):", err.message);
1637
1655
  }
1638
1656
  await deployBefore(processId, agentId, service, "restart");
1639
- const result = await agentManager.agentMutation(agentId, "process.start", { id: processId });
1657
+ const result = await callAgent(
1658
+ () => agentManager.agentMutation(agentId, "process.start", { id: processId }),
1659
+ "Failed to restart process"
1660
+ );
1640
1661
  await auditService.log({ userId: "local", action: "restart", entityType: "process", entityId: processId, metadata: { agentId } });
1641
1662
  return { ...result, agentId };
1642
1663
  }
@@ -4585,6 +4606,39 @@ function createNodeRunnerState(aiCli) {
4585
4606
  isResume: false
4586
4607
  };
4587
4608
  }
4609
+ async function nodeRuneyaAccess(conversationId) {
4610
+ const apiBaseUrl = `http://localhost:${env.PORT}`;
4611
+ const apiToken = await signJwt();
4612
+ const conv = await conversationStore.get(conversationId);
4613
+ const ref = conv ? await conversationStore.projectRefOf(conv) : null;
4614
+ let injectedEnv;
4615
+ if (ref?.id) {
4616
+ try {
4617
+ const { projectStore: projectStore2 } = await import("./project-store-FLXTAD3J.js");
4618
+ const { environmentResolver: environmentResolver2 } = await import("./environment-resolver-ZDTF3MHI.js");
4619
+ const project = await projectStore2.get(ref.orgId ? { id: ref.id, orgId: ref.orgId } : ref.id);
4620
+ if (project?.activeEnvironmentId) {
4621
+ const injected = await environmentResolver2.resolveAiInjectedEnv(project.activeEnvironmentId);
4622
+ if (Object.keys(injected).length > 0) injectedEnv = injected;
4623
+ }
4624
+ } catch (err) {
4625
+ console.warn("[scenario-runner] injected env unavailable:", err.message);
4626
+ }
4627
+ }
4628
+ return {
4629
+ apiBaseUrl,
4630
+ apiToken,
4631
+ mcpConfig: runeyaMcpConfig({
4632
+ RUNEYA_BASE_URL: apiBaseUrl,
4633
+ RUNEYA_API_TOKEN: apiToken,
4634
+ ...ref?.id ? { RUNEYA_PROJECT_ID: ref.id } : {},
4635
+ ...ref?.orgId ? { RUNEYA_ORG_ID: ref.orgId } : {}
4636
+ }),
4637
+ ...ref?.id ? { projectId: ref.id } : {},
4638
+ ...ref?.orgId ? { orgId: ref.orgId } : {},
4639
+ ...injectedEnv ? { injectedEnv } : {}
4640
+ };
4641
+ }
4588
4642
  async function runNodeCall(conversationId, node, systemContext, userMessage, runOverrides, signal, publish2, onDelta, runnerStates, label = "call", readme) {
4589
4643
  publish2({ type: "node_prompt", nodeId: node.id, label, systemContext, userMessage });
4590
4644
  const { aiCli, model } = resolveNodeExecutionConfig(node, runOverrides);
@@ -4609,6 +4663,10 @@ async function runNodeCall(conversationId, node, systemContext, userMessage, run
4609
4663
  persistTimer = null;
4610
4664
  }
4611
4665
  };
4666
+ const access3 = await nodeRuneyaAccess(conversationId).catch((err) => {
4667
+ console.warn("[scenario-runner] node runs without Runeya tools:", err.message);
4668
+ return { apiBaseUrl: "", apiToken: "" };
4669
+ });
4612
4670
  while (true) {
4613
4671
  const turnStart = Date.now();
4614
4672
  const result = await state.runner.run({
@@ -4623,8 +4681,7 @@ async function runNodeCall(conversationId, node, systemContext, userMessage, run
4623
4681
  prompt: currentPrompt,
4624
4682
  isResume: state.isResume,
4625
4683
  systemContext,
4626
- apiBaseUrl: "",
4627
- apiToken: "",
4684
+ ...access3,
4628
4685
  model,
4629
4686
  effort: "normal",
4630
4687
  signal,
@@ -4796,6 +4853,18 @@ async function runScenario(conversationId, scenarioId, userRequest, runOverrides
4796
4853
  })();
4797
4854
  const leader = scenario.nodes.find((p) => p.id === scenario.leaderId);
4798
4855
  if (!leader) throw new Error("Scenario has no leader");
4856
+ const nodeRequest = userRequest + await (async () => {
4857
+ const conv = await conversationStore.get(conversationId);
4858
+ if (!conv?.kanbanCardId) return "";
4859
+ const ref = await conversationStore.projectRefOf(conv);
4860
+ return kanbanContextFor(conv, {
4861
+ ...ref?.id ? { projectId: ref.id } : {},
4862
+ ...ref?.orgId ? { orgId: ref.orgId } : {}
4863
+ });
4864
+ })().catch((err) => {
4865
+ console.warn("[scenario-runner] card context unavailable:", err.message);
4866
+ return "";
4867
+ });
4799
4868
  const byParent = /* @__PURE__ */ new Map();
4800
4869
  const nodesById = new Map(scenario.nodes.map((p) => [p.id, p]));
4801
4870
  const outputs = /* @__PURE__ */ new Map();
@@ -4851,7 +4920,7 @@ async function runScenario(conversationId, scenarioId, userRequest, runOverrides
4851
4920
  await li("\u25B6\uFE0F", `**${leader.label}** \u2014 started`);
4852
4921
  try {
4853
4922
  const systemPrompt = buildSystemPrompt(leader, scenario);
4854
- const userMsg = buildUserMessage(leader, scenario, userRequest, null, false, true);
4923
+ const userMsg = buildUserMessage(leader, scenario, nodeRequest, null, false, true);
4855
4924
  const out = await runNodeCall(conversationId, leader, systemPrompt, userMsg, runOverrides, signal, publish2, (delta) => {
4856
4925
  publish2({ type: "node_delta", nodeId: leader.id, text: delta });
4857
4926
  }, runnerStates, "dispatch", readme);
@@ -4882,7 +4951,7 @@ async function runScenario(conversationId, scenarioId, userRequest, runOverrides
4882
4951
  if (hasUnknown) await li("\u26A0\uFE0F", `Unknown node(s) named by ${leader.label}: ${leaderResult.unknownNames.join(", ")}. Retrying.`);
4883
4952
  else if (hasMissingAssignments) await li("\u26A0\uFE0F", `Missing assignments for ${leaderResult.missingAssignments.join(", ")} from ${leader.label}. Retrying.`);
4884
4953
  else await li("\u26A0\uFE0F", `No explicit assignees parsed for ${leader.label}. Retrying once to force explicit selection.`);
4885
- const retryUserMsg = hasMissingAssignments ? buildMissingAssignmentsRetryMessage(leader, leaderResult.missingAssignments, out) : buildDelegationRetryMessage(leader, directReports, userRequest, out);
4954
+ const retryUserMsg = hasMissingAssignments ? buildMissingAssignmentsRetryMessage(leader, leaderResult.missingAssignments, out) : buildDelegationRetryMessage(leader, directReports, nodeRequest, out);
4886
4955
  runnerStates.delete(leader.id);
4887
4956
  const retryOut = await runNodeCall(conversationId, leader, systemPrompt, retryUserMsg, runOverrides, signal, publish2, (delta) => {
4888
4957
  publish2({ type: "node_delta", nodeId: leader.id, text: delta });
@@ -4983,7 +5052,7 @@ ${leaderErrorOutput}` });
4983
5052
  if (hasUnknown) await li("\u26A0\uFE0F", `Unknown node(s) named by ${node.label}: ${nodeResult.unknownNames.join(", ")}. Retrying.`);
4984
5053
  else if (hasMissingAssignments) await li("\u26A0\uFE0F", `Missing assignments for ${nodeResult.missingAssignments.join(", ")} from ${node.label}. Retrying.`);
4985
5054
  else await li("\u26A0\uFE0F", `No explicit assignees parsed for ${node.label}. Retrying once to force explicit selection.`);
4986
- const retryUserMsg = hasMissingAssignments ? buildMissingAssignmentsRetryMessage(node, nodeResult.missingAssignments, out) : buildDelegationRetryMessage(node, directReports, userRequest, out);
5055
+ const retryUserMsg = hasMissingAssignments ? buildMissingAssignmentsRetryMessage(node, nodeResult.missingAssignments, out) : buildDelegationRetryMessage(node, directReports, nodeRequest, out);
4987
5056
  runnerStates.delete(node.id);
4988
5057
  const retryOut = await runNodeCall(conversationId, node, systemPrompt, retryUserMsg, runOverrides, signal, publish2, (delta) => {
4989
5058
  publish2({ type: "node_delta", nodeId: node.id, text: delta });
@@ -5109,7 +5178,7 @@ ${outputs.get(node.id) ?? ""}`.trim();
5109
5178
  await li("\u267B\uFE0F", `**${node.label}** \u2014 restored from previous run`);
5110
5179
  firstPassResult = { finalOutput: cachedOut, assignedReports: result.selected, assignments: result.assignments };
5111
5180
  } else {
5112
- const initialUserMsg = buildUserMessage(node, scenario, userRequest, managerOutput, false, false);
5181
+ const initialUserMsg = buildUserMessage(node, scenario, nodeRequest, managerOutput, false, false, new Map(outputs));
5113
5182
  firstPassResult = await runDelegationPass(node, initialUserMsg, "(execution)");
5114
5183
  }
5115
5184
  let { finalOutput, assignedReports, assignments } = firstPassResult;
@@ -5136,7 +5205,7 @@ ${reportOut}
5136
5205
  const reviewUserMsg = buildManagerReviewMessage(
5137
5206
  node,
5138
5207
  getDirectReports(scenario.nodes, node.id),
5139
- userRequest,
5208
+ nodeRequest,
5140
5209
  finalOutput,
5141
5210
  childReportsSection
5142
5211
  );
@@ -5202,7 +5271,7 @@ ${reportOut}
5202
5271
  try {
5203
5272
  const parentOutput = node.parentIds[0] ? outputs.get(node.parentIds[0]) ?? null : null;
5204
5273
  const systemPrompt = buildSystemPrompt(node, scenario);
5205
- const userMsg = buildUserMessage(node, scenario, userRequest, parentOutput, false, false, new Map(outputs));
5274
+ const userMsg = buildUserMessage(node, scenario, nodeRequest, parentOutput, false, false, new Map(outputs));
5206
5275
  const out = await runNodeCall(conversationId, node, systemPrompt, userMsg, runOverrides, signal, publish2, (delta) => {
5207
5276
  publish2({ type: "node_delta", nodeId: node.id, text: delta });
5208
5277
  }, runnerStates, "(topological)", readme);
@@ -5254,7 +5323,7 @@ ${reportOut}
5254
5323
  const leaderReviewMsg = buildManagerReviewMessage(
5255
5324
  leader,
5256
5325
  getDirectReports(scenario.nodes, leader.id),
5257
- userRequest,
5326
+ nodeRequest,
5258
5327
  leaderCurrentOutput,
5259
5328
  leaderChildReportsSection
5260
5329
  );
@@ -5287,7 +5356,7 @@ ${reportOut}
5287
5356
  await li("\u25B6\uFE0F", `**${leader.label}** synthesis \u2014 started`);
5288
5357
  try {
5289
5358
  const systemPrompt = buildSystemPrompt(leader, scenario);
5290
- const userMsg = buildUserMessage(leader, scenario, userRequest, null, true, false, outputs);
5359
+ const userMsg = buildUserMessage(leader, scenario, nodeRequest, null, true, false, outputs);
5291
5360
  let summary = "";
5292
5361
  summary = await runNodeCall(conversationId, leader, systemPrompt, userMsg, runOverrides, signal, publish2, (delta) => {
5293
5362
  publish2({ type: "node_delta", nodeId: `${leader.id}:synthesis`, text: delta });
@@ -5438,7 +5507,7 @@ var scenarioRouter = router({
5438
5507
  isPublished: input.isPublished ?? false,
5439
5508
  createdAt: now,
5440
5509
  updatedAt: now
5441
- }));
5510
+ }, await scopeOf2(input)));
5442
5511
  }),
5443
5512
  update: protectedProcedure.input(z16.object({
5444
5513
  id: Id128Schema,
@@ -5484,7 +5553,8 @@ var scenarioRouter = router({
5484
5553
  orgId: z16.string().max(128).nullable().optional(),
5485
5554
  resume: z16.boolean().optional()
5486
5555
  })).subscription(async function* ({ input, signal }) {
5487
- const scenario = await scenarioStore.get(input.scenarioId, await scopeOf2(input));
5556
+ const vault = await scopeOf2(input);
5557
+ const scenario = await scenarioStore.get(input.scenarioId, vault);
5488
5558
  if (!scenario) throw new TRPCError14({ code: "NOT_FOUND", message: "Scenario not found" });
5489
5559
  const canStart = input.userRequest.trim().length > 0 || !!input.resume;
5490
5560
  if (!isScenarioRunning(input.conversationId) && canStart) {
@@ -5496,7 +5566,7 @@ var scenarioRouter = router({
5496
5566
  runnerOverride: input.runnerOverride,
5497
5567
  modelOverride: input.modelOverride,
5498
5568
  agentId: input.agentId,
5499
- orgId: input.orgId
5569
+ orgId: vault ?? null
5500
5570
  }, !!input.resume);
5501
5571
  await new Promise((r) => setTimeout(r, 10));
5502
5572
  }
@@ -6054,7 +6124,7 @@ import { TRPCError as TRPCError18 } from "@trpc/server";
6054
6124
 
6055
6125
  // ../server/src/services/ai-client-mcp.ts
6056
6126
  import { execFile as execFile4 } from "child_process";
6057
- import { existsSync as existsSync2 } from "fs";
6127
+ import { existsSync as existsSync2, readdirSync } from "fs";
6058
6128
  import { mkdir as mkdir5, readFile as readFile4, realpath } from "fs/promises";
6059
6129
  import { homedir as homedir3 } from "os";
6060
6130
  import { dirname as dirname4, join as join7 } from "path";
@@ -6075,9 +6145,21 @@ function vscodeUserDir(home) {
6075
6145
  if (process.platform === "win32") return join7(process.env["APPDATA"] ?? join7(home, "AppData", "Roaming"), "Code", "User");
6076
6146
  return join7(home, ".config", "Code", "User");
6077
6147
  }
6078
- function claudeDesktopDir(home) {
6079
- if (process.platform === "darwin") return join7(home, "Library", "Application Support", "Claude");
6080
- if (process.platform === "win32") return join7(process.env["APPDATA"] ?? join7(home, "AppData", "Roaming"), "Claude");
6148
+ function listDir(dir) {
6149
+ try {
6150
+ return readdirSync(dir);
6151
+ } catch {
6152
+ return [];
6153
+ }
6154
+ }
6155
+ function claudeDesktopDir(home, platform = process.platform, vars = process.env, exists4 = existsSync2, list = listDir) {
6156
+ if (platform === "darwin") return join7(home, "Library", "Application Support", "Claude");
6157
+ if (platform === "win32") {
6158
+ const packages = join7(vars["LOCALAPPDATA"] ?? join7(home, "AppData", "Local"), "Packages");
6159
+ const store = list(packages).filter((name) => name.startsWith("Claude_")).map((name) => join7(packages, name, "LocalCache", "Roaming", "Claude")).find(exists4);
6160
+ if (store) return store;
6161
+ return join7(vars["APPDATA"] ?? join7(home, "AppData", "Roaming"), "Claude");
6162
+ }
6081
6163
  return join7(home, ".config", "Claude");
6082
6164
  }
6083
6165
  var AI_CLIENTS = [
@@ -9308,6 +9390,15 @@ var desktopRouter = router({
9308
9390
  })
9309
9391
  });
9310
9392
 
9393
+ // ../server/src/trpc/routers/mcp-ready.ts
9394
+ import { z as z30 } from "zod";
9395
+ var mcpReadyRouter = router({
9396
+ signal: protectedProcedure.input(z30.object({ id: z30.string().min(1).max(128) })).mutation(({ input }) => {
9397
+ signalMcpReady(input.id);
9398
+ return { ok: true };
9399
+ })
9400
+ });
9401
+
9311
9402
  // ../server/src/trpc/router.ts
9312
9403
  var appRouter = router({
9313
9404
  health: healthRouter,
@@ -9316,6 +9407,7 @@ var appRouter = router({
9316
9407
  changelog: changelogRouter,
9317
9408
  diagnostics: diagnosticsRouter,
9318
9409
  mcpPairing: mcpPairingRouter,
9410
+ mcpReady: mcpReadyRouter,
9319
9411
  aiClients: aiClientsRouter,
9320
9412
  project: projectRouter,
9321
9413
  service: serviceRouter,
@@ -11544,7 +11636,7 @@ async function createLocalServer() {
11544
11636
  ]);
11545
11637
  console.log("[server] Shutdown complete");
11546
11638
  };
11547
- const { initCompanion } = await import("./companion-W3UMZWGH.js");
11639
+ const { initCompanion } = await import("./companion-XKMNRIJB.js");
11548
11640
  initCompanion();
11549
11641
  return { app, server, wss, shutdown };
11550
11642
  }
@@ -12000,4 +12092,4 @@ export {
12000
12092
  stopProcess,
12001
12093
  userPrefix
12002
12094
  };
12003
- //# sourceMappingURL=src-LEDGW5KP.js.map
12095
+ //# sourceMappingURL=src-I5TPC6GW.js.map