@runeya/runeya 2.0.146 → 2.0.147
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 +10 -4
- package/agent/index.js.map +1 -1
- package/{agent-manager-R7BPQO6D.js → agent-manager-46C4NIQ2.js} +4 -2
- package/{chat-LPML22J5.js → chat-CMNDMXIP.js} +9 -5
- package/{chunk-SEPAURTQ.js → chunk-2NE52CL5.js} +156 -923
- package/chunk-2NE52CL5.js.map +1 -0
- package/chunk-4D3GCBPO.js +462 -0
- package/chunk-4D3GCBPO.js.map +1 -0
- package/{chunk-KV4GJKXU.js → chunk-5XG3X2TM.js} +27 -1479
- package/chunk-5XG3X2TM.js.map +1 -0
- package/chunk-7QXP4FXD.js +969 -0
- package/chunk-7QXP4FXD.js.map +1 -0
- package/chunk-DA2DZBTL.js +43 -0
- package/chunk-DA2DZBTL.js.map +1 -0
- package/chunk-DFPZ4MTI.js +1041 -0
- package/chunk-DFPZ4MTI.js.map +1 -0
- package/{chunk-UD42LACH.js → chunk-JNK6H5KH.js} +164 -1007
- package/chunk-JNK6H5KH.js.map +1 -0
- package/chunk-WDHLEO5S.js +809 -0
- package/chunk-WDHLEO5S.js.map +1 -0
- package/{companion-W3UMZWGH.js → companion-XKMNRIJB.js} +8 -3
- package/environment-resolver-ZDTF3MHI.js +18 -0
- package/environment-resolver-ZDTF3MHI.js.map +1 -0
- package/index.js +7 -7
- package/{install-gate-PVMGJDWE.js → install-gate-OJJEUU4E.js} +2 -2
- package/mcp-ready-TAPBAOZY.js +9 -0
- package/mcp-ready-TAPBAOZY.js.map +1 -0
- package/mcp-server/index.js +24 -0
- package/mcp-server/index.js.map +1 -1
- package/mcp-server/launch.d.ts +6 -0
- package/mcp-server/launch.js +2 -1
- package/mcp-server/launch.js.map +1 -1
- package/package.json +1 -1
- package/project-store-FLXTAD3J.js +23 -0
- package/project-store-FLXTAD3J.js.map +1 -0
- package/{src-LEDGW5KP.js → src-KWO3CKZU.js} +139 -59
- package/src-KWO3CKZU.js.map +1 -0
- package/web/assets/{AgentScalarChatInterface.vue-BYszptaB.js → AgentScalarChatInterface.vue-DKBinB_l.js} +2 -2
- package/web/assets/AgentTerminalPage-CixU7x6O.js +1 -0
- package/web/assets/AiChatModals-BvGUd-QD.css +1 -0
- package/web/assets/AiChatModals-C-hXImkO.js +4 -0
- package/web/assets/AppLayout-At9wk0sx.js +1 -0
- package/web/assets/{AppLayout-tsw5Ow0w.css → AppLayout-BlhwflMq.css} +1 -1
- package/web/assets/AuditPage-BkqbHxjY.js +1 -0
- package/web/assets/CloudAccountPage-D5C2SCS9.js +1 -0
- package/web/assets/CloudMessagingPage-Bi57GGHO.js +2 -0
- package/web/assets/DashboardPage-dEQop9ql.js +1 -0
- package/web/assets/DirectoryPickerDialog-DIMSeDhw.js +1 -0
- package/web/assets/{EditorIcon-CypGLV6w.js → EditorIcon-W3Szca4J.js} +1 -1
- package/web/assets/EnvironmentForm-C5emavNh.js +1 -0
- package/web/assets/EnvironmentFormPage-BIoy8fsW.js +1 -0
- package/web/assets/EnvironmentListPage-BDYeh7XF.js +1 -0
- package/web/assets/{FlagChip-R_T5qYpL.js → FlagChip-DPtIBCjQ.js} +1 -1
- package/web/assets/KanbanBoardPage-BlCcjBwV.js +4 -0
- package/web/assets/KanbanListPage-DbXONxfC.js +1 -0
- package/web/assets/LaunchProjectPage-Cg92hHwQ.js +1 -0
- package/web/assets/LaunchServicesPage-CO8gOB9D.js +1 -0
- package/web/assets/LaunchServicesPage-h5o3zLcy.css +1 -0
- package/web/assets/{LaunchShell-DUrSunB4.js → LaunchShell-CDb21ihZ.js} +1 -1
- package/web/assets/LogViewer-DsusKk2b.js +3 -0
- package/web/assets/OrgKeyPrompt-CX9K7r9I.js +1 -0
- package/web/assets/ProcessControls-B7hWVqiR.css +1 -0
- package/web/assets/ProcessControls-TEZutuxq.js +1 -0
- package/web/assets/ProcessDetailPage-Cj23FECq.js +1 -0
- package/web/assets/ProcessMetrics-1P6iE2Il.js +1 -0
- package/web/assets/ProjectCreateDialog-D3aMWKfw.js +1 -0
- package/web/assets/{ProjectLocationGate-DhMVdIjN.js → ProjectLocationGate-DU0Jj8Nw.js} +1 -1
- package/web/assets/ProjectPublishDialog-D7sNKei3.js +1 -0
- package/web/assets/{RandomJobTestPage-BUS2Ty6-.js → RandomJobTestPage-DQUMRHyf.js} +1 -1
- package/web/assets/{ScenarioEditorPage-vMoRt0Qn.css → ScenarioEditorPage-BSjSX4bw.css} +1 -1
- package/web/assets/ScenarioEditorPage-DvCdcY9m.js +14 -0
- package/web/assets/SendToChatDialog-BdWKjYmv.js +1 -0
- package/web/assets/ServiceControlsBar-B_J5m-Kc.js +1 -0
- package/web/assets/ServiceDetailPage-DhJcjFfY.js +2 -0
- package/web/assets/{ServiceDetailPage-COdaCZ6r.css → ServiceDetailPage-DnSf5cm9.css} +1 -1
- package/web/assets/ServiceFormPage-fp8NCHSv.js +1 -0
- package/web/assets/{SettingsPage-4pKUgKPm.css → SettingsPage-NH2fQap4.css} +1 -1
- package/web/assets/SettingsPage-s28BodWe.js +2086 -0
- package/web/assets/UnlockPage-BXXIPHW_.js +1 -0
- package/web/assets/VaultMigrationPage-BfNuKtkJ.js +1 -0
- package/web/assets/{VersionBadge-BmArk24p.js → VersionBadge-CW7czacg.js} +1 -1
- package/web/assets/{WikiPage-DADu8WUA.js → WikiPage-BiwpCM3E.js} +1 -1
- package/web/assets/WikiView-CMch_06Z.js +1 -0
- package/web/assets/{add-scalar-classes-dWEWPlFD.js → add-scalar-classes-Ckanjq1h.js} +14 -14
- package/web/assets/{agent.store-CKLAkF9a.js → agent.store-piokQ9Dt.js} +1 -1
- package/web/assets/{auth-Cg9BWTfK.js → auth-BT_jf-5e.js} +2 -2
- package/web/assets/cloud-chat.store-CDKh4tIy.js +1 -0
- package/web/assets/{cloud-client-D_zCiW0s.js → cloud-client-CzPdZLDq.js} +2 -2
- package/web/assets/{cloud-session-DOaDpZTy.js → cloud-session-BYfn6YM4.js} +2 -2
- package/web/assets/floating-ui.dom-DF3oyfHd.js +1 -0
- package/web/assets/i18n-D0FT7rCj.js +1 -0
- package/web/assets/index-3LTzgeU-.css +1 -0
- package/web/assets/index-Ci2CNnit.js +309 -0
- package/web/assets/modal-iRaP1izE.js +5 -0
- package/web/assets/notification.store-CvvuTBVz.js +1 -0
- package/web/assets/{project-launch.store-y7JBMNiE.js → project-launch.store-CTmbl8UY.js} +1 -1
- package/web/assets/{project.store-DGJr0Qr9.js → project.store-CNC6_4r4.js} +1 -1
- package/web/assets/runtime-dom.esm-bundler-CyEVRK6B.js +1 -0
- package/web/assets/scenario.store-BIFQPXgl.js +7 -0
- package/web/assets/{service.store-5jWsJxPx.js → service.store-B40U4QzI.js} +1 -1
- package/web/assets/settings-scope-CyWMCjRY.js +1 -0
- package/web/assets/settings.store-Dw6bAoWE.js +1 -0
- package/web/assets/{src-Dnwk6NpV.js → src-CrNi4Pjg.js} +3 -3
- package/web/assets/src-DIBHat7I.js +3 -0
- package/web/assets/src-DtCW_XCh.js +1 -0
- package/web/assets/{trpc-Drabzwpd.js → trpc-BAZGRZBD.js} +3 -3
- package/web/assets/{useCloudOrg-BAQEtFPl.js → useCloudOrg-EnXFBwt1.js} +1 -1
- package/web/assets/useEnvVarAutocomplete-BxJh2Lw0.js +1 -0
- package/web/assets/useProjectCatalog-BrvUGv9A.js +1 -0
- package/web/assets/{useProjectCloudOrg-CEN9-_OA.js → useProjectCloudOrg-Czxlg00k.js} +1 -1
- package/web/assets/{useServiceUrlHost-BuoPEXZX.js → useServiceUrlHost-Szz9y3rh.js} +1 -1
- package/web/assets/vue-i18n-o7yraQpR.js +3 -0
- package/web/index.html +21 -21
- package/chunk-KV4GJKXU.js.map +0 -1
- package/chunk-SEPAURTQ.js.map +0 -1
- package/chunk-UD42LACH.js.map +0 -1
- package/src-LEDGW5KP.js.map +0 -1
- package/web/assets/AgentTerminalPage-C3TJ1NL9.js +0 -1
- package/web/assets/AiChatModals-D3scRE3S.js +0 -4
- package/web/assets/AiChatModals-EfRuvId7.css +0 -1
- package/web/assets/AppLayout-BMQUjPKe.js +0 -1
- package/web/assets/AuditPage-CKcExBws.js +0 -1
- package/web/assets/CloudAccountPage-B6oPg0BZ.js +0 -1
- package/web/assets/CloudMessagingPage-C5fwVe-F.js +0 -2
- package/web/assets/DashboardPage-9RV7sx3e.js +0 -1
- package/web/assets/DirectoryPickerDialog-C06BXyfJ.js +0 -1
- package/web/assets/EnvironmentForm-CAvDoira.js +0 -1
- package/web/assets/EnvironmentFormPage-BmAxhN-m.js +0 -1
- package/web/assets/EnvironmentListPage-B8uATPBI.js +0 -1
- package/web/assets/KanbanBoardPage-CQsOkRUf.js +0 -4
- package/web/assets/KanbanListPage-CWZqkjD6.js +0 -1
- package/web/assets/LaunchProjectPage-saSmC7Pr.js +0 -1
- package/web/assets/LaunchServicesPage-BkKyLMEz.js +0 -1
- package/web/assets/LaunchServicesPage-DoLDPqQq.css +0 -1
- package/web/assets/LogViewer-CZBYkH9J.js +0 -3
- package/web/assets/OrgKeyPrompt-DzQ7pwbs.js +0 -1
- package/web/assets/ProcessControls-BEeoNlNV.js +0 -1
- package/web/assets/ProcessControls-BlpnVylq.css +0 -1
- package/web/assets/ProcessDetailPage-CQgu5uKm.js +0 -1
- package/web/assets/ProcessMetrics-Crlfkelj.js +0 -1
- package/web/assets/ProjectCreateDialog-BolrhRD-.js +0 -1
- package/web/assets/ProjectPublishDialog-DsZNWrfz.js +0 -1
- package/web/assets/ScenarioEditorPage-MIAGh2us.js +0 -14
- package/web/assets/SendToChatDialog-BxWsyv29.js +0 -1
- package/web/assets/ServiceControlsBar-DqDPAZt7.js +0 -1
- package/web/assets/ServiceDetailPage-hkSAzZ-l.js +0 -2
- package/web/assets/ServiceFormPage-DXqhqXg8.js +0 -1
- package/web/assets/SettingsPage-DS2YhMIM.js +0 -2086
- package/web/assets/UnlockPage-s8SgVcKk.js +0 -1
- package/web/assets/VaultMigrationPage-s0b44MDM.js +0 -1
- package/web/assets/WikiView-DtGwIt_Q.js +0 -1
- package/web/assets/cloud-chat.store-b-BHGz7I.js +0 -1
- package/web/assets/editor.store-DCAZSeVG.js +0 -1
- package/web/assets/floating-ui.dom-DWhsZyqT.js +0 -1
- package/web/assets/i18n-D0afQEGs.js +0 -1
- package/web/assets/index-D8VRbyoP.js +0 -309
- package/web/assets/index-DsezNbSM.css +0 -1
- package/web/assets/modal-qYgTMkYb.js +0 -5
- package/web/assets/scenario.store-YWHL2_wu.js +0 -7
- package/web/assets/settings-scope-Bv7QGPrt.js +0 -1
- package/web/assets/settings.store-bEsB7oKb.js +0 -1
- package/web/assets/src--GO-VSJ0.js +0 -5
- package/web/assets/src-C-D_y7ou.js +0 -1
- package/web/assets/useEnvVarAutocomplete-BqGTODUv.js +0 -1
- package/web/assets/useProjectCatalog-yocjIKt6.js +0 -1
- package/web/assets/vue-draggable-plus-BHsveB8w.css +0 -1
- package/web/assets/vue-draggable-plus-DX4rTBiu.js +0 -1
- /package/{agent-manager-R7BPQO6D.js.map → agent-manager-46C4NIQ2.js.map} +0 -0
- /package/{chat-LPML22J5.js.map → chat-CMNDMXIP.js.map} +0 -0
- /package/{companion-W3UMZWGH.js.map → companion-XKMNRIJB.js.map} +0 -0
- /package/{install-gate-PVMGJDWE.js.map → install-gate-OJJEUU4E.js.map} +0 -0
package/mcp-server/launch.d.ts
CHANGED
|
@@ -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`.
|
package/mcp-server/launch.js
CHANGED
|
@@ -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) {
|
package/mcp-server/launch.js.map
CHANGED
|
@@ -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":";AAAA,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB;
|
|
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
|
@@ -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-
|
|
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-
|
|
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
|
-
|
|
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: "
|
|
1564
|
-
message:
|
|
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
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
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
|
|
1622
|
-
agentId,
|
|
1623
|
-
"process
|
|
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
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
|
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:
|
|
5569
|
+
orgId: vault ?? null
|
|
5500
5570
|
}, !!input.resume);
|
|
5501
5571
|
await new Promise((r) => setTimeout(r, 10));
|
|
5502
5572
|
}
|
|
@@ -9308,6 +9378,15 @@ var desktopRouter = router({
|
|
|
9308
9378
|
})
|
|
9309
9379
|
});
|
|
9310
9380
|
|
|
9381
|
+
// ../server/src/trpc/routers/mcp-ready.ts
|
|
9382
|
+
import { z as z30 } from "zod";
|
|
9383
|
+
var mcpReadyRouter = router({
|
|
9384
|
+
signal: protectedProcedure.input(z30.object({ id: z30.string().min(1).max(128) })).mutation(({ input }) => {
|
|
9385
|
+
signalMcpReady(input.id);
|
|
9386
|
+
return { ok: true };
|
|
9387
|
+
})
|
|
9388
|
+
});
|
|
9389
|
+
|
|
9311
9390
|
// ../server/src/trpc/router.ts
|
|
9312
9391
|
var appRouter = router({
|
|
9313
9392
|
health: healthRouter,
|
|
@@ -9316,6 +9395,7 @@ var appRouter = router({
|
|
|
9316
9395
|
changelog: changelogRouter,
|
|
9317
9396
|
diagnostics: diagnosticsRouter,
|
|
9318
9397
|
mcpPairing: mcpPairingRouter,
|
|
9398
|
+
mcpReady: mcpReadyRouter,
|
|
9319
9399
|
aiClients: aiClientsRouter,
|
|
9320
9400
|
project: projectRouter,
|
|
9321
9401
|
service: serviceRouter,
|
|
@@ -11544,7 +11624,7 @@ async function createLocalServer() {
|
|
|
11544
11624
|
]);
|
|
11545
11625
|
console.log("[server] Shutdown complete");
|
|
11546
11626
|
};
|
|
11547
|
-
const { initCompanion } = await import("./companion-
|
|
11627
|
+
const { initCompanion } = await import("./companion-XKMNRIJB.js");
|
|
11548
11628
|
initCompanion();
|
|
11549
11629
|
return { app, server, wss, shutdown };
|
|
11550
11630
|
}
|
|
@@ -12000,4 +12080,4 @@ export {
|
|
|
12000
12080
|
stopProcess,
|
|
12001
12081
|
userPrefix
|
|
12002
12082
|
};
|
|
12003
|
-
//# sourceMappingURL=src-
|
|
12083
|
+
//# sourceMappingURL=src-KWO3CKZU.js.map
|