@rudderhq/server 0.7.11 → 0.7.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
- package/dist/bootstrap/register-api-routes.js +1 -1
- package/dist/bootstrap/register-api-routes.js.map +1 -1
- package/dist/bootstrap/types.d.ts +7 -0
- package/dist/bootstrap/types.d.ts.map +1 -1
- package/dist/index.js +18 -3
- package/dist/index.js.map +1 -1
- package/dist/routes/agents.management-routes.d.ts.map +1 -1
- package/dist/routes/agents.management-routes.js +2 -0
- package/dist/routes/agents.management-routes.js.map +1 -1
- package/dist/routes/chats.d.ts +2 -1
- package/dist/routes/chats.d.ts.map +1 -1
- package/dist/routes/chats.js +334 -4
- package/dist/routes/chats.js.map +1 -1
- package/dist/routes/chats.stream-routes.d.ts.map +1 -1
- package/dist/routes/chats.stream-routes.js +55 -3
- package/dist/routes/chats.stream-routes.js.map +1 -1
- package/dist/routes/goals.d.ts.map +1 -1
- package/dist/routes/goals.js +10 -3
- package/dist/routes/goals.js.map +1 -1
- package/dist/routes/orgs.d.ts.map +1 -1
- package/dist/routes/orgs.js +22 -1
- package/dist/routes/orgs.js.map +1 -1
- package/dist/routes/run-intelligence.d.ts.map +1 -1
- package/dist/routes/run-intelligence.js +9 -0
- package/dist/routes/run-intelligence.js.map +1 -1
- package/dist/services/agent-instructions.d.ts +1 -0
- package/dist/services/agent-instructions.d.ts.map +1 -1
- package/dist/services/agent-instructions.js +124 -6
- package/dist/services/agent-instructions.js.map +1 -1
- package/dist/services/agent-run-context.d.ts.map +1 -1
- package/dist/services/agent-run-context.js +15 -0
- package/dist/services/agent-run-context.js.map +1 -1
- package/dist/services/agent-startup-context.d.ts +4 -0
- package/dist/services/agent-startup-context.d.ts.map +1 -1
- package/dist/services/agent-startup-context.js +57 -13
- package/dist/services/agent-startup-context.js.map +1 -1
- package/dist/services/agents.d.ts +218 -0
- package/dist/services/agents.d.ts.map +1 -1
- package/dist/services/automations.d.ts.map +1 -1
- package/dist/services/automations.js +3 -0
- package/dist/services/automations.js.map +1 -1
- package/dist/services/chat-agent-runs.d.ts +47 -1
- package/dist/services/chat-agent-runs.d.ts.map +1 -1
- package/dist/services/chat-agent-runs.js +91 -1
- package/dist/services/chat-agent-runs.js.map +1 -1
- package/dist/services/chat-assistant.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.d.ts +12 -3
- package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.js +3 -0
- package/dist/services/chat-assistant.helpers.js.map +1 -1
- package/dist/services/chat-assistant.js +54 -18
- package/dist/services/chat-assistant.js.map +1 -1
- package/dist/services/chat-generation-protocol.d.ts +119 -0
- package/dist/services/chat-generation-protocol.d.ts.map +1 -1
- package/dist/services/chat-generation-protocol.js +65 -0
- package/dist/services/chat-generation-protocol.js.map +1 -1
- package/dist/services/chats.constants.d.ts +1 -1
- package/dist/services/chats.constants.d.ts.map +1 -1
- package/dist/services/chats.constants.js +1 -0
- package/dist/services/chats.constants.js.map +1 -1
- package/dist/services/chats.d.ts +128 -0
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.js +10 -0
- package/dist/services/chats.js.map +1 -1
- package/dist/services/goals.d.ts +36 -0
- package/dist/services/goals.d.ts.map +1 -1
- package/dist/services/goals.js +21 -1
- package/dist/services/goals.js.map +1 -1
- package/dist/services/heartbeat-run-reference.d.ts.map +1 -1
- package/dist/services/heartbeat-run-reference.js +11 -5
- package/dist/services/heartbeat-run-reference.js.map +1 -1
- package/dist/services/index.d.ts +2 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/integrations/feishu/runtime.d.ts +8 -0
- package/dist/services/integrations/feishu/runtime.d.ts.map +1 -1
- package/dist/services/integrations/feishu/runtime.js +124 -1
- package/dist/services/integrations/feishu/runtime.js.map +1 -1
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.helpers.d.ts +8 -0
- package/dist/services/issues.helpers.d.ts.map +1 -1
- package/dist/services/issues.helpers.js +17 -1
- package/dist/services/issues.helpers.js.map +1 -1
- package/dist/services/issues.js +108 -15
- package/dist/services/issues.js.map +1 -1
- package/dist/services/messenger.d.ts.map +1 -1
- package/dist/services/messenger.js +12 -3
- package/dist/services/messenger.js.map +1 -1
- package/dist/services/organization-members.d.ts +27 -0
- package/dist/services/organization-members.d.ts.map +1 -0
- package/dist/services/organization-members.js +169 -0
- package/dist/services/organization-members.js.map +1 -0
- package/dist/services/organization-workspace-browser.d.ts.map +1 -1
- package/dist/services/organization-workspace-browser.js +44 -10
- package/dist/services/organization-workspace-browser.js.map +1 -1
- package/dist/services/product-intelligence.d.ts.map +1 -1
- package/dist/services/product-intelligence.js +4 -0
- package/dist/services/product-intelligence.js.map +1 -1
- package/dist/services/projects.d.ts +1 -4
- package/dist/services/projects.d.ts.map +1 -1
- package/dist/services/projects.js +27 -2
- package/dist/services/projects.js.map +1 -1
- package/dist/services/rudder-plugin-catalog.d.ts +1 -1
- package/dist/services/rudder-plugin-catalog.d.ts.map +1 -1
- package/dist/services/rudder-plugin-catalog.js +281 -15
- package/dist/services/rudder-plugin-catalog.js.map +1 -1
- package/dist/services/rudder-plugin-catalog.test.js +55 -0
- package/dist/services/rudder-plugin-catalog.test.js.map +1 -1
- package/dist/services/run-intelligence.d.ts.map +1 -1
- package/dist/services/run-intelligence.js +2 -1
- package/dist/services/run-intelligence.js.map +1 -1
- package/dist/services/run-log-store.d.ts +3 -0
- package/dist/services/run-log-store.d.ts.map +1 -1
- package/dist/services/run-log-store.js +124 -18
- package/dist/services/run-log-store.js.map +1 -1
- package/dist/services/runtime-kernel/assignment-run-guardrail.d.ts +2 -0
- package/dist/services/runtime-kernel/assignment-run-guardrail.d.ts.map +1 -1
- package/dist/services/runtime-kernel/assignment-run-guardrail.js +5 -3
- package/dist/services/runtime-kernel/assignment-run-guardrail.js.map +1 -1
- package/dist/services/runtime-kernel/assignment-run-guardrail.test.js +20 -0
- package/dist/services/runtime-kernel/assignment-run-guardrail.test.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat-attempt-ledger.d.ts +124 -0
- package/dist/services/runtime-kernel/heartbeat-attempt-ledger.d.ts.map +1 -0
- package/dist/services/runtime-kernel/heartbeat-attempt-ledger.js +108 -0
- package/dist/services/runtime-kernel/heartbeat-attempt-ledger.js.map +1 -0
- package/dist/services/runtime-kernel/heartbeat.core.d.ts +111 -0
- package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.core.js +13 -0
- package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.d.ts +34 -0
- package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.execute.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.execute.js +229 -3
- package/dist/services/runtime-kernel/heartbeat.execute.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.js +161 -6
- package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.sessions.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.sessions.js +15 -3
- package/dist/services/runtime-kernel/heartbeat.sessions.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.terminal.d.ts +48 -0
- package/dist/services/runtime-kernel/heartbeat.terminal.d.ts.map +1 -1
- package/dist/services/runtime-kernel/model-fallback.d.ts +4 -0
- package/dist/services/runtime-kernel/model-fallback.d.ts.map +1 -1
- package/dist/services/runtime-kernel/model-fallback.js +25 -4
- package/dist/services/runtime-kernel/model-fallback.js.map +1 -1
- package/dist/services/workspace-backup-v2.d.ts +20 -0
- package/dist/services/workspace-backup-v2.d.ts.map +1 -1
- package/dist/services/workspace-backup-v2.js +155 -23
- package/dist/services/workspace-backup-v2.js.map +1 -1
- package/dist/services/workspace-backup-v2.test.js +34 -2
- package/dist/services/workspace-backup-v2.test.js.map +1 -1
- package/dist/services/workspace-backups.d.ts +0 -1
- package/dist/services/workspace-backups.d.ts.map +1 -1
- package/dist/services/workspace-backups.js +18 -19
- package/dist/services/workspace-backups.js.map +1 -1
- package/dist/services/workspace-manifest-native.d.ts +10 -0
- package/dist/services/workspace-manifest-native.d.ts.map +1 -0
- package/dist/services/workspace-manifest-native.js +219 -0
- package/dist/services/workspace-manifest-native.js.map +1 -0
- package/dist/services/workspace-restore-reconciliation.d.ts +11 -0
- package/dist/services/workspace-restore-reconciliation.d.ts.map +1 -0
- package/dist/services/workspace-restore-reconciliation.js +165 -0
- package/dist/services/workspace-restore-reconciliation.js.map +1 -0
- package/package.json +14 -14
- package/resources/bundled-skills/rudder-docs/references/api-reference.md +8 -0
- package/resources/bundled-skills/rudder-docs/references/cli-reference.md +5 -2
- package/skills/rudder-docs/references/api-reference.md +8 -0
- package/skills/rudder-docs/references/cli-reference.md +5 -2
- package/ui-dist/assets/LibraryLiveSurface-tCWxJKp5.js +1 -0
- package/ui-dist/assets/{abnfDiagram-VRR7QNED-BggxrEZR.js → abnfDiagram-VRR7QNED-BcCms-hs.js} +1 -1
- package/ui-dist/assets/{addon-fit-Cc1gOtSX.js → addon-fit-CH3xNHN4.js} +1 -1
- package/ui-dist/assets/{arc-0kNrc9xt.js → arc-h5W-EkRK.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-BOCa-5ab.js → architectureDiagram-ZJ3FMSHR-Bdehm1PB.js} +1 -1
- package/ui-dist/assets/{blockDiagram-677ZJIJ3-CQU5jcsO.js → blockDiagram-677ZJIJ3-BJ3W91Su.js} +1 -1
- package/ui-dist/assets/{c4Diagram-LMCZKHZV-ChgWIw5O.js → c4Diagram-LMCZKHZV-Bnft_fRy.js} +1 -1
- package/ui-dist/assets/channel-G6qIOCiV.js +1 -0
- package/ui-dist/assets/{chunk-2Q5K7J3B-B4yrwesI.js → chunk-2Q5K7J3B-w1SF0tSk.js} +1 -1
- package/ui-dist/assets/{chunk-32BRIVSS-mhAeSMlR.js → chunk-32BRIVSS-C1UzXTFZ.js} +1 -1
- package/ui-dist/assets/{chunk-5VM5RSS4-BmS_u59G.js → chunk-5VM5RSS4-COVI3rNd.js} +1 -1
- package/ui-dist/assets/{chunk-EX3LRPZG-DXoTKkLG.js → chunk-EX3LRPZG-DxQOLy7z.js} +1 -1
- package/ui-dist/assets/{chunk-JWPE2WC7-Bj9myT03.js → chunk-JWPE2WC7-KTwmElcL.js} +1 -1
- package/ui-dist/assets/{chunk-MOJQB5TN-OAoJna8Y.js → chunk-MOJQB5TN-BynL4lzA.js} +1 -1
- package/ui-dist/assets/{chunk-RYQCIY6F-AGLA7TJn.js → chunk-RYQCIY6F-CJksBfuJ.js} +1 -1
- package/ui-dist/assets/{chunk-V7JOEXUC-YGM2tDK2.js → chunk-V7JOEXUC-C_zED5WJ.js} +1 -1
- package/ui-dist/assets/{chunk-VR4S4FIN-DqaZn9Ty.js → chunk-VR4S4FIN-BHDtMeiT.js} +1 -1
- package/ui-dist/assets/{chunk-XXDRQBXY-Cpqn_8Bl.js → chunk-XXDRQBXY-C0VvJgte.js} +1 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-D15_PFCL.js +1 -0
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-D15_PFCL.js +1 -0
- package/ui-dist/assets/{cose-bilkent-JH36ORCC-BVe-X26w.js → cose-bilkent-JH36ORCC-DsTTzpP7.js} +1 -1
- package/ui-dist/assets/{cynefin-VYW2F7L2-DlDrrBWp.js → cynefin-VYW2F7L2-BfULw90s.js} +1 -1
- package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BSHvFeGh.js → cynefinDiagram-TSTJHNR4-BukSzKVC.js} +1 -1
- package/ui-dist/assets/{dagre-VKFMJZFB-tUm70k9h.js → dagre-VKFMJZFB-BbZY_Ipf.js} +1 -1
- package/ui-dist/assets/{diagram-FQU43EPY-C5kjITq7.js → diagram-FQU43EPY-BTYIYn2p.js} +1 -1
- package/ui-dist/assets/{diagram-G47NLZAW-BrbHgt8r.js → diagram-G47NLZAW-CikY_FKi.js} +1 -1
- package/ui-dist/assets/{diagram-NH7WQ7WH-DT7PdghT.js → diagram-NH7WQ7WH-BfZ7AlT8.js} +1 -1
- package/ui-dist/assets/{diagram-OA4YK3LP-wOjhRHRo.js → diagram-OA4YK3LP-f5AikxJj.js} +1 -1
- package/ui-dist/assets/{diagram-WEI45ONY-Dz9vtaDT.js → diagram-WEI45ONY-BCbG5yas.js} +1 -1
- package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-BT5TzIA6.js → ebnfDiagram-CCIWWBDH-DT-3mJLY.js} +1 -1
- package/ui-dist/assets/{erDiagram-Q63AITRT-DLCpoOEP.js → erDiagram-Q63AITRT-BsfOhDfe.js} +1 -1
- package/ui-dist/assets/{flowDiagram-23GEKE2U-DfF2COjh.js → flowDiagram-23GEKE2U-BfaeQCsg.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-NO4QXBWP-1d0KDwQs.js → ganttDiagram-NO4QXBWP-CgPQruVz.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-COLjS1ZR.js → gitGraphDiagram-IHSO6WYX-CNrBFzjY.js} +1 -1
- package/ui-dist/assets/{graph-B7fcgpw_.js → graph-QqDTzUUJ.js} +1 -1
- package/ui-dist/assets/{index-CZYXpHv4.js → index-2ZQZC89T.js} +1 -1
- package/ui-dist/assets/{index-COLwjKBR.js → index-2cYcOpZB.js} +1 -1
- package/ui-dist/assets/{index-CMNULCMJ.js → index-BAt16m_U.js} +1 -1
- package/ui-dist/assets/{index-BczgTMAn.js → index-BY8xCKIE.js} +1 -1
- package/ui-dist/assets/{index-CbqgXGcs.js → index-Befy20DN.js} +1 -1
- package/ui-dist/assets/{index-CgkYyYx9.js → index-BfAP3xNl.js} +1 -1
- package/ui-dist/assets/{index-DTc5LpTU.js → index-BogOyxlk.js} +1 -1
- package/ui-dist/assets/{index-DttnaNlV.js → index-BuIyK71w.js} +559 -559
- package/ui-dist/assets/{index-CH8I9acP.js → index-CQ92CxVC.js} +1 -1
- package/ui-dist/assets/{index-Denv6wuU.js → index-CQFwlD-o.js} +1 -1
- package/ui-dist/assets/{index-B6zSdXAR.js → index-Cu4qo_D7.js} +1 -1
- package/ui-dist/assets/index-DRuC5g8V.css +32 -0
- package/ui-dist/assets/{index-vtghjwab.js → index-DZ4gAeDM.js} +1 -1
- package/ui-dist/assets/{index-CTIfCQqR.js → index-Dc_DUpPj.js} +1 -1
- package/ui-dist/assets/{index-CXg1YCeI.js → index-Dqv46mWS.js} +1 -1
- package/ui-dist/assets/{index-D27Bbc-x.js → index-sFJMMyA3.js} +1 -1
- package/ui-dist/assets/{infoDiagram-FWYZ7A6U-Bg4YQUu2.js → infoDiagram-FWYZ7A6U-BJHuaNA9.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-BtgUVI_I.js → ishikawaDiagram-FXEZZL3T-CmsA1Knp.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-5HDEW3XC-BGHGjvN4.js → journeyDiagram-5HDEW3XC-iV_Nt9d4.js} +1 -1
- package/ui-dist/assets/{kanban-definition-HUTT4EX6-DekQSNo8.js → kanban-definition-HUTT4EX6-D45s70Ny.js} +1 -1
- package/ui-dist/assets/{layout-Bsw9hK6u.js → layout-DDC-iOzY.js} +1 -1
- package/ui-dist/assets/{linear-D8D1R-4C.js → linear-DCTJ7Pq3.js} +1 -1
- package/ui-dist/assets/{map-BUIcuf4c.js → map-RGy5k616.js} +1 -1
- package/ui-dist/assets/{mermaid.core-CYZMLemV.js → mermaid.core-6MH04cvi.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-LN4V7U3C-mjS9avIS.js → mindmap-definition-LN4V7U3C-CA2LFmda.js} +1 -1
- package/ui-dist/assets/{pegDiagram-2B236MQR-Buziry9m.js → pegDiagram-2B236MQR-DDsUr2du.js} +1 -1
- package/ui-dist/assets/{pieDiagram-ENE6RG2P-B_9BmFEg.js → pieDiagram-ENE6RG2P-D7jEL8xK.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-BxFdUA8s.js → quadrantDiagram-ABIIQ3AL-BsJxgVLb.js} +1 -1
- package/ui-dist/assets/{railroadDiagram-RFXS5EU6-pJh_afC-.js → railroadDiagram-RFXS5EU6-CBI457f6.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-TGXJPOKE-BGgk3AxL.js → requirementDiagram-TGXJPOKE-_GAc0NOO.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-DdPKE4bs.js → sankeyDiagram-HTMAVEWB-DNIaj5hu.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-xlik6FjZ.js → sequenceDiagram-DBY2YBRQ-BHDZs2dc.js} +1 -1
- package/ui-dist/assets/{sizeCapture-X5ZJPWSS-D_zKAjvf.js → sizeCapture-X5ZJPWSS-DwKT6aTP.js} +1 -1
- package/ui-dist/assets/{stateDiagram-2N3HPSRC-BGQP8giG.js → stateDiagram-2N3HPSRC-D2hDsltG.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-CMTeJdkk.js +1 -0
- package/ui-dist/assets/{swimlanes-5IMT3BWC-ZhE8oAxR.js → swimlanes-5IMT3BWC-BV8xA0iq.js} +2 -2
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-ChF8QLeM.js +8 -0
- package/ui-dist/assets/{timeline-definition-FHXFAJF6-CUqfijnL.js → timeline-definition-FHXFAJF6-BPJMubhV.js} +1 -1
- package/ui-dist/assets/{vennDiagram-L72KCM5P-B_rqTUA0.js → vennDiagram-L72KCM5P-CY76J0Px.js} +1 -1
- package/ui-dist/assets/{wardleyDiagram-EHGQE667-BTvjybDi.js → wardleyDiagram-EHGQE667-pmNWLdE_.js} +1 -1
- package/ui-dist/assets/{xterm-CRpDYL2s.js → xterm-UByodpzD.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-FW5EYKEG-ZBbwueZ5.js → xychartDiagram-FW5EYKEG-BWZC7gWV.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/LibraryLiveSurface-De1p59PK.js +0 -1
- package/ui-dist/assets/channel-eAoWqZqJ.js +0 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-c94PI6yY.js +0 -1
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-c94PI6yY.js +0 -1
- package/ui-dist/assets/index-RSbihTRP.css +0 -32
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-BMEtuB93.js +0 -1
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-Bdh18WfM.js +0 -8
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { resolveNativeCommand } from "@rudderhq/agent-runtime-utils";
|
|
2
|
+
import { resolveRudderNativeCapability, resolveRudderNativeTarget } from "@rudderhq/shared";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
import { existsSync } from "node:fs";
|
|
6
|
+
import fs from "node:fs/promises";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import readline from "node:readline";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { resolveRudderInstanceRoot } from "../home-paths.js";
|
|
11
|
+
const PROTOCOL_VERSION = 1;
|
|
12
|
+
const MAX_ENTRIES = 1_000_000;
|
|
13
|
+
const MAX_PATH_BYTES = 128 * 1024 * 1024;
|
|
14
|
+
const MAX_MANIFEST_BYTES = 256 * 1024 * 1024;
|
|
15
|
+
const DEBOUNCE_MS = 100;
|
|
16
|
+
const REQUIRED_READY_TIMEOUT_MS = 5_000;
|
|
17
|
+
const sessions = new Map();
|
|
18
|
+
class NativeWorkspaceManifestError extends Error {
|
|
19
|
+
diagnostic;
|
|
20
|
+
constructor(session, code, detail) {
|
|
21
|
+
super(detail);
|
|
22
|
+
this.name = "NativeWorkspaceManifestError";
|
|
23
|
+
this.diagnostic = {
|
|
24
|
+
capability: "workspace-manifest",
|
|
25
|
+
target: session.target,
|
|
26
|
+
binaryVersion: session.binaryVersion,
|
|
27
|
+
protocolVersion: String(PROTOCOL_VERSION),
|
|
28
|
+
effectiveEngine: "rust",
|
|
29
|
+
fallbackCode: code,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function nativeTarget() {
|
|
34
|
+
return resolveRudderNativeTarget();
|
|
35
|
+
}
|
|
36
|
+
export function resolveNativeWorkspaceManifestBinary() {
|
|
37
|
+
const configured = process.env.RUDDER_NATIVE_WORKSPACE_MANIFEST_PATH?.trim()
|
|
38
|
+
|| process.env.RUDDER_NATIVE_PATH?.trim();
|
|
39
|
+
if (configured)
|
|
40
|
+
return path.resolve(configured);
|
|
41
|
+
const binaryName = process.platform === "win32" ? "rudder-native.exe" : "rudder-native";
|
|
42
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
43
|
+
const target = nativeTarget();
|
|
44
|
+
const resourcesPath = process.env.RUDDER_DESKTOP_RESOURCES_PATH?.trim()
|
|
45
|
+
|| (typeof process.resourcesPath === "string"
|
|
46
|
+
? process.resourcesPath
|
|
47
|
+
: "");
|
|
48
|
+
const candidates = [
|
|
49
|
+
path.resolve(moduleDir, "../../../native/target/debug", binaryName),
|
|
50
|
+
path.resolve(moduleDir, "../../../../native/target/debug", binaryName),
|
|
51
|
+
path.resolve(moduleDir, "../../../native", target ?? "unsupported", binaryName),
|
|
52
|
+
resourcesPath && target ? path.resolve(resourcesPath, "native", target, binaryName) : "",
|
|
53
|
+
].filter(Boolean);
|
|
54
|
+
return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];
|
|
55
|
+
}
|
|
56
|
+
function manifestPathForRoot(rootPath) {
|
|
57
|
+
const key = createHash("sha256").update(path.resolve(rootPath)).digest("hex").slice(0, 24);
|
|
58
|
+
return path.resolve(resolveRudderInstanceRoot(), "data", "native-workspace-manifests", `${key}.json`);
|
|
59
|
+
}
|
|
60
|
+
function watchState(value) {
|
|
61
|
+
return ["building", "ready", "dirty", "overflow", "unavailable", "stopped"].includes(String(value))
|
|
62
|
+
? value
|
|
63
|
+
: null;
|
|
64
|
+
}
|
|
65
|
+
async function startSession(rootPath) {
|
|
66
|
+
const manifestPath = manifestPathForRoot(rootPath);
|
|
67
|
+
await fs.mkdir(path.dirname(manifestPath), { recursive: true });
|
|
68
|
+
const command = resolveNativeCommand(resolveNativeWorkspaceManifestBinary(), [
|
|
69
|
+
"workspace", "watch", path.resolve(rootPath), manifestPath,
|
|
70
|
+
String(MAX_ENTRIES), String(MAX_PATH_BYTES), String(DEBOUNCE_MS),
|
|
71
|
+
]);
|
|
72
|
+
const child = spawn(command.command, command.args, { stdio: ["pipe", "pipe", "pipe"], windowsHide: true });
|
|
73
|
+
const session = {
|
|
74
|
+
child, manifestPath, state: "building", exited: false,
|
|
75
|
+
target: nativeTarget() ?? "unsupported", binaryVersion: "unavailable",
|
|
76
|
+
};
|
|
77
|
+
const lines = readline.createInterface({ input: child.stdout });
|
|
78
|
+
lines.on("line", (line) => {
|
|
79
|
+
try {
|
|
80
|
+
const envelope = JSON.parse(line);
|
|
81
|
+
const state = watchState(envelope.state);
|
|
82
|
+
if (envelope.ok !== true || envelope.capability !== "workspace.watch"
|
|
83
|
+
|| envelope.protocolVersion !== PROTOCOL_VERSION || !state) {
|
|
84
|
+
session.state = "unavailable";
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (typeof envelope.target === "string")
|
|
88
|
+
session.target = envelope.target;
|
|
89
|
+
if (typeof envelope.binaryVersion === "string")
|
|
90
|
+
session.binaryVersion = envelope.binaryVersion;
|
|
91
|
+
session.state = state;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
session.state = "unavailable";
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
child.once("error", () => {
|
|
98
|
+
session.state = "unavailable";
|
|
99
|
+
session.exited = true;
|
|
100
|
+
});
|
|
101
|
+
child.once("exit", () => {
|
|
102
|
+
if (session.state !== "stopped")
|
|
103
|
+
session.state = "unavailable";
|
|
104
|
+
session.exited = true;
|
|
105
|
+
});
|
|
106
|
+
child.stderr.resume();
|
|
107
|
+
return session;
|
|
108
|
+
}
|
|
109
|
+
async function ensureSession(rootPath) {
|
|
110
|
+
const key = path.resolve(rootPath);
|
|
111
|
+
const existing = sessions.get(key);
|
|
112
|
+
if (existing && !existing.exited)
|
|
113
|
+
return existing;
|
|
114
|
+
const session = await startSession(key);
|
|
115
|
+
sessions.set(key, session);
|
|
116
|
+
return session;
|
|
117
|
+
}
|
|
118
|
+
async function waitForRequiredReady(session) {
|
|
119
|
+
const deadline = Date.now() + REQUIRED_READY_TIMEOUT_MS;
|
|
120
|
+
while (session.state !== "ready") {
|
|
121
|
+
if (session.state === "unavailable" || session.exited) {
|
|
122
|
+
throw new NativeWorkspaceManifestError(session, "watch_unavailable", "Native workspace manifest watcher is unavailable");
|
|
123
|
+
}
|
|
124
|
+
if (Date.now() >= deadline) {
|
|
125
|
+
throw new NativeWorkspaceManifestError(session, "ready_timeout", `Native workspace manifest watcher did not become ready within ${REQUIRED_READY_TIMEOUT_MS}ms`);
|
|
126
|
+
}
|
|
127
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function parseManifest(value, rootPath) {
|
|
131
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
132
|
+
return null;
|
|
133
|
+
const manifest = value;
|
|
134
|
+
if (manifest.protocolVersion !== PROTOCOL_VERSION || manifest.state !== "ready"
|
|
135
|
+
|| path.resolve(String(manifest.rootPath ?? "")) !== path.resolve(rootPath)
|
|
136
|
+
|| !Array.isArray(manifest.entries) || manifest.entries.length > MAX_ENTRIES)
|
|
137
|
+
return null;
|
|
138
|
+
const entries = [];
|
|
139
|
+
let pathBytes = 0;
|
|
140
|
+
for (const value of manifest.entries) {
|
|
141
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
142
|
+
return null;
|
|
143
|
+
const entry = value;
|
|
144
|
+
const entryPath = typeof entry.path === "string" ? entry.path : "";
|
|
145
|
+
const kind = entry.kind;
|
|
146
|
+
if (!entryPath || entryPath.includes("\\") || entryPath.startsWith("/")
|
|
147
|
+
|| entryPath.split("/").some((part) => !part || part === "." || part === "..")
|
|
148
|
+
|| !["file", "directory", "symlink"].includes(String(kind))
|
|
149
|
+
|| !Number.isSafeInteger(entry.byteSize) || Number(entry.byteSize) < 0
|
|
150
|
+
|| !Number.isSafeInteger(entry.modifiedMillis) || Number(entry.modifiedMillis) < 0)
|
|
151
|
+
return null;
|
|
152
|
+
pathBytes += Buffer.byteLength(entryPath);
|
|
153
|
+
if (pathBytes > MAX_PATH_BYTES)
|
|
154
|
+
return null;
|
|
155
|
+
entries.push({
|
|
156
|
+
path: entryPath,
|
|
157
|
+
kind: kind,
|
|
158
|
+
byteSize: Number(entry.byteSize),
|
|
159
|
+
modifiedMillis: Number(entry.modifiedMillis),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
return entries;
|
|
163
|
+
}
|
|
164
|
+
export async function readNativeWorkspaceManifest(rootPath) {
|
|
165
|
+
const policy = resolveRudderNativeCapability({ capability: "workspace-manifest", env: process.env });
|
|
166
|
+
if (!policy.enabled)
|
|
167
|
+
return null;
|
|
168
|
+
let session;
|
|
169
|
+
try {
|
|
170
|
+
session = await ensureSession(rootPath);
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
if (policy.required)
|
|
174
|
+
throw error;
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
if (policy.required)
|
|
178
|
+
await waitForRequiredReady(session);
|
|
179
|
+
if (session.state !== "ready") {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
const stat = await fs.stat(session.manifestPath);
|
|
184
|
+
if (!stat.isFile() || stat.size > MAX_MANIFEST_BYTES)
|
|
185
|
+
throw new Error("Native workspace manifest exceeds its read boundary");
|
|
186
|
+
const entries = parseManifest(JSON.parse(await fs.readFile(session.manifestPath, "utf8")), rootPath);
|
|
187
|
+
if (!entries)
|
|
188
|
+
throw new Error("Native workspace manifest is invalid");
|
|
189
|
+
return entries;
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
await fs.rm(session.manifestPath, { force: true }).catch(() => undefined);
|
|
193
|
+
session.state = "dirty";
|
|
194
|
+
if (policy.required) {
|
|
195
|
+
throw new NativeWorkspaceManifestError(session, "invalid_manifest", error instanceof Error ? error.message : "Native workspace manifest is invalid");
|
|
196
|
+
}
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
export async function stopNativeWorkspaceManifestWatchersForTests() {
|
|
201
|
+
const active = [...sessions.values()];
|
|
202
|
+
sessions.clear();
|
|
203
|
+
await Promise.all(active.map(async (session) => {
|
|
204
|
+
if (session.exited)
|
|
205
|
+
return;
|
|
206
|
+
session.child.stdin.end();
|
|
207
|
+
await new Promise((resolve) => {
|
|
208
|
+
const timer = setTimeout(() => {
|
|
209
|
+
session.child.kill();
|
|
210
|
+
resolve();
|
|
211
|
+
}, 1_000);
|
|
212
|
+
session.child.once("exit", () => {
|
|
213
|
+
clearTimeout(timer);
|
|
214
|
+
resolve();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=workspace-manifest-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-manifest-native.js","sourceRoot":"","sources":["../../src/services/workspace-manifest-native.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Db } from "@rudderhq/db";
|
|
2
|
+
/** Reconcile only validated receipts and their exact operation-owned roots. */
|
|
3
|
+
export declare function reconcileWorkspaceRestoreReceipts(db?: Db): Promise<{
|
|
4
|
+
recovered: string[];
|
|
5
|
+
blocked: Array<{
|
|
6
|
+
receiptPath: string;
|
|
7
|
+
operationId: string;
|
|
8
|
+
error: string;
|
|
9
|
+
}>;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=workspace-restore-reconciliation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-restore-reconciliation.d.ts","sourceRoot":"","sources":["../../src/services/workspace-restore-reconciliation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;AAgDzD,+EAA+E;AAC/E,wBAAsB,iCAAiC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC;IACxE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7E,CAAC,CA+ED"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { workspaceBackups } from "@rudderhq/db";
|
|
2
|
+
import { and, eq } from "drizzle-orm";
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { resolveDefaultBackupDir, resolveOrganizationWorkspaceRoot } from "../home-paths.js";
|
|
6
|
+
import { walkWorkspaceBackupV2 } from "./workspace-backup-v2.js";
|
|
7
|
+
async function pathExists(targetPath) {
|
|
8
|
+
return fs.lstat(targetPath).catch((error) => {
|
|
9
|
+
if (error.code === "ENOENT")
|
|
10
|
+
return null;
|
|
11
|
+
throw error;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
async function syncDirectory(directoryPath) {
|
|
15
|
+
const handle = await fs.open(directoryPath, "r");
|
|
16
|
+
try {
|
|
17
|
+
if (process.platform !== "win32")
|
|
18
|
+
await handle.sync();
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
await handle.close();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function workspaceTreeSha256(rootPath) {
|
|
25
|
+
return (await walkWorkspaceBackupV2(rootPath)).treeSha256;
|
|
26
|
+
}
|
|
27
|
+
async function readRestoreReceipt(filePath) {
|
|
28
|
+
try {
|
|
29
|
+
const value = JSON.parse(await fs.readFile(filePath, "utf8"));
|
|
30
|
+
if (value.version !== 1 || typeof value.operationId !== "string" || typeof value.orgId !== "string"
|
|
31
|
+
|| typeof value.backupId !== "string"
|
|
32
|
+
|| !["prepared", "live_moved", "committed", "rolled_back", "recovery_required"].includes(value.phase ?? "")
|
|
33
|
+
|| typeof value.workspaceRoot !== "string" || typeof value.stagingRoot !== "string"
|
|
34
|
+
|| typeof value.rollbackRoot !== "string"
|
|
35
|
+
|| (value.liveTreeSha256 !== null && typeof value.liveTreeSha256 !== "string")
|
|
36
|
+
|| typeof value.stagingTreeSha256 !== "string"
|
|
37
|
+
|| (value.expectedTreeSha256 !== null && typeof value.expectedTreeSha256 !== "string")
|
|
38
|
+
|| typeof value.preRestoreBackupId !== "string")
|
|
39
|
+
return null;
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error.code === "ENOENT")
|
|
44
|
+
return null;
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function isOwnedRestoreRoot(root, workspaceRoot, operationId, kind) {
|
|
49
|
+
return path.resolve(root) !== path.resolve(workspaceRoot)
|
|
50
|
+
&& path.resolve(root) === path.resolve(path.dirname(workspaceRoot), `.rudder-workspace-restore-${kind}-${operationId}`);
|
|
51
|
+
}
|
|
52
|
+
/** Reconcile only validated receipts and their exact operation-owned roots. */
|
|
53
|
+
export async function reconcileWorkspaceRestoreReceipts(db) {
|
|
54
|
+
const receiptRoot = path.resolve(resolveDefaultBackupDir(), "workspace-restore-receipts");
|
|
55
|
+
const recovered = [];
|
|
56
|
+
const blocked = [];
|
|
57
|
+
let names;
|
|
58
|
+
try {
|
|
59
|
+
names = await fs.readdir(receiptRoot);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error.code === "ENOENT")
|
|
63
|
+
return { recovered, blocked };
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
for (const name of names.filter((entry) => entry.endsWith(".json"))) {
|
|
67
|
+
const receiptPath = path.join(receiptRoot, name);
|
|
68
|
+
let receipt = null;
|
|
69
|
+
try {
|
|
70
|
+
receipt = await readRestoreReceipt(receiptPath);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
blocked.push({ receiptPath, operationId: "unknown", error: error instanceof Error ? error.message : String(error) });
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
let canonicalWorkspaceRoot = null;
|
|
77
|
+
try {
|
|
78
|
+
if (receipt?.orgId)
|
|
79
|
+
canonicalWorkspaceRoot = path.resolve(resolveOrganizationWorkspaceRoot(receipt.orgId));
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
canonicalWorkspaceRoot = null;
|
|
83
|
+
}
|
|
84
|
+
if (!receipt || !canonicalWorkspaceRoot
|
|
85
|
+
|| !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(receipt.operationId)
|
|
86
|
+
|| path.resolve(receipt.workspaceRoot) !== canonicalWorkspaceRoot
|
|
87
|
+
|| !isOwnedRestoreRoot(receipt.stagingRoot, receipt.workspaceRoot, receipt.operationId, "staging")
|
|
88
|
+
|| !isOwnedRestoreRoot(receipt.rollbackRoot, receipt.workspaceRoot, receipt.operationId, "rollback")) {
|
|
89
|
+
blocked.push({ receiptPath, operationId: receipt?.operationId ?? "unknown", error: "invalid_or_unowned_receipt" });
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const workspace = await pathExists(receipt.workspaceRoot);
|
|
94
|
+
const rollback = await pathExists(receipt.rollbackRoot);
|
|
95
|
+
const expectedPublishedTree = receipt.expectedTreeSha256 ?? receipt.stagingTreeSha256;
|
|
96
|
+
let publishedRestore = false;
|
|
97
|
+
if (receipt.phase === "prepared") {
|
|
98
|
+
if (workspace && rollback)
|
|
99
|
+
throw new Error("prepared receipt has conflicting live and rollback roots");
|
|
100
|
+
if (!workspace && rollback) {
|
|
101
|
+
if (!receipt.liveTreeSha256 || await workspaceTreeSha256(receipt.rollbackRoot) !== receipt.liveTreeSha256)
|
|
102
|
+
throw new Error("prepared rollback tree does not match recorded live tree");
|
|
103
|
+
await fs.rename(receipt.rollbackRoot, receipt.workspaceRoot);
|
|
104
|
+
await syncDirectory(path.dirname(receipt.workspaceRoot));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (receipt.phase === "committed") {
|
|
108
|
+
if (!workspace)
|
|
109
|
+
throw new Error("committed receipt workspace is missing");
|
|
110
|
+
if (await workspaceTreeSha256(receipt.workspaceRoot) !== expectedPublishedTree) {
|
|
111
|
+
throw new Error("committed workspace tree does not match receipt");
|
|
112
|
+
}
|
|
113
|
+
publishedRestore = true;
|
|
114
|
+
}
|
|
115
|
+
else if (receipt.phase === "rolled_back") {
|
|
116
|
+
if (!workspace)
|
|
117
|
+
throw new Error("rolled_back receipt workspace is missing");
|
|
118
|
+
if (receipt.liveTreeSha256 && await workspaceTreeSha256(receipt.workspaceRoot) !== receipt.liveTreeSha256)
|
|
119
|
+
throw new Error("rolled_back workspace tree does not match recorded live tree");
|
|
120
|
+
}
|
|
121
|
+
else if (receipt.phase === "live_moved" || receipt.phase === "recovery_required") {
|
|
122
|
+
if (!workspace && rollback) {
|
|
123
|
+
if (!receipt.liveTreeSha256 || await workspaceTreeSha256(receipt.rollbackRoot) !== receipt.liveTreeSha256)
|
|
124
|
+
throw new Error("rollback tree does not match recorded live tree");
|
|
125
|
+
await fs.rename(receipt.rollbackRoot, receipt.workspaceRoot);
|
|
126
|
+
await syncDirectory(path.dirname(receipt.workspaceRoot));
|
|
127
|
+
}
|
|
128
|
+
else if (workspace && !rollback) {
|
|
129
|
+
if (await workspaceTreeSha256(receipt.workspaceRoot) !== expectedPublishedTree)
|
|
130
|
+
throw new Error("published workspace tree does not match receipt");
|
|
131
|
+
publishedRestore = true;
|
|
132
|
+
}
|
|
133
|
+
else if (workspace && rollback) {
|
|
134
|
+
if (await workspaceTreeSha256(receipt.workspaceRoot) === expectedPublishedTree)
|
|
135
|
+
publishedRestore = true;
|
|
136
|
+
else if (receipt.liveTreeSha256 && await workspaceTreeSha256(receipt.rollbackRoot) === receipt.liveTreeSha256) {
|
|
137
|
+
await fs.rm(receipt.workspaceRoot, { recursive: true, force: true });
|
|
138
|
+
await fs.rename(receipt.rollbackRoot, receipt.workspaceRoot);
|
|
139
|
+
await syncDirectory(path.dirname(receipt.workspaceRoot));
|
|
140
|
+
}
|
|
141
|
+
else
|
|
142
|
+
throw new Error("workspace and rollback roots match neither recorded tree");
|
|
143
|
+
}
|
|
144
|
+
else
|
|
145
|
+
throw new Error("workspace and rollback roots are both missing");
|
|
146
|
+
}
|
|
147
|
+
if (publishedRestore && db) {
|
|
148
|
+
const [updated] = await db.update(workspaceBackups).set({ status: "restored", updatedAt: new Date() })
|
|
149
|
+
.where(and(eq(workspaceBackups.id, receipt.backupId), eq(workspaceBackups.orgId, receipt.orgId))).returning({ id: workspaceBackups.id });
|
|
150
|
+
if (!updated)
|
|
151
|
+
throw new Error("restore receipt backup row is missing");
|
|
152
|
+
}
|
|
153
|
+
await fs.rm(receipt.stagingRoot, { recursive: true, force: true });
|
|
154
|
+
await fs.rm(receipt.rollbackRoot, { recursive: true, force: true });
|
|
155
|
+
await fs.rm(receiptPath, { force: true });
|
|
156
|
+
await syncDirectory(receiptRoot);
|
|
157
|
+
recovered.push(receipt.operationId);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
blocked.push({ receiptPath, operationId: receipt.operationId, error: error instanceof Error ? error.message : String(error) });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return { recovered, blocked };
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=workspace-restore-reconciliation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-restore-reconciliation.js","sourceRoot":"","sources":["../../src/services/workspace-restore-reconciliation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rudderhq/server",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.12",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"homepage": "https://github.com/Undertone0809/rudder",
|
|
6
6
|
"bugs": {
|
|
@@ -55,19 +55,19 @@
|
|
|
55
55
|
"@aws-sdk/client-s3": "^3.1015.0",
|
|
56
56
|
"@larksuiteoapi/node-sdk": "1.67.0",
|
|
57
57
|
"@modelcontextprotocol/client": "2.0.0",
|
|
58
|
-
"@rudderhq/agent-runtime-claude-local": "0.7.
|
|
59
|
-
"@rudderhq/agent-runtime-codex-local": "0.7.
|
|
60
|
-
"@rudderhq/agent-runtime-cursor-local": "0.7.
|
|
61
|
-
"@rudderhq/agent-runtime-gemini-local": "0.7.
|
|
62
|
-
"@rudderhq/agent-runtime-hermes-gateway": "0.7.
|
|
63
|
-
"@rudderhq/agent-runtime-openclaw-gateway": "0.7.
|
|
64
|
-
"@rudderhq/agent-runtime-opencode-local": "0.7.
|
|
65
|
-
"@rudderhq/agent-runtime-pi-local": "0.7.
|
|
66
|
-
"@rudderhq/agent-runtime-utils": "0.7.
|
|
67
|
-
"@rudderhq/db": "0.7.
|
|
68
|
-
"@rudderhq/identity-core": "0.7.
|
|
69
|
-
"@rudderhq/run-intelligence-core": "0.7.
|
|
70
|
-
"@rudderhq/shared": "0.7.
|
|
58
|
+
"@rudderhq/agent-runtime-claude-local": "0.7.12",
|
|
59
|
+
"@rudderhq/agent-runtime-codex-local": "0.7.12",
|
|
60
|
+
"@rudderhq/agent-runtime-cursor-local": "0.7.12",
|
|
61
|
+
"@rudderhq/agent-runtime-gemini-local": "0.7.12",
|
|
62
|
+
"@rudderhq/agent-runtime-hermes-gateway": "0.7.12",
|
|
63
|
+
"@rudderhq/agent-runtime-openclaw-gateway": "0.7.12",
|
|
64
|
+
"@rudderhq/agent-runtime-opencode-local": "0.7.12",
|
|
65
|
+
"@rudderhq/agent-runtime-pi-local": "0.7.12",
|
|
66
|
+
"@rudderhq/agent-runtime-utils": "0.7.12",
|
|
67
|
+
"@rudderhq/db": "0.7.12",
|
|
68
|
+
"@rudderhq/identity-core": "0.7.12",
|
|
69
|
+
"@rudderhq/run-intelligence-core": "0.7.12",
|
|
70
|
+
"@rudderhq/shared": "0.7.12",
|
|
71
71
|
"ajv": "^8.18.0",
|
|
72
72
|
"ajv-formats": "^3.0.1",
|
|
73
73
|
"better-auth": "1.6.23",
|
|
@@ -138,6 +138,8 @@ Use the incremental `after` form when you already know the thread.
|
|
|
138
138
|
- `GET /api/orgs/:orgId/issues`
|
|
139
139
|
- `POST /api/orgs/:orgId/issues`
|
|
140
140
|
- `GET /api/orgs/:orgId/agents`
|
|
141
|
+
- `GET /api/orgs/:orgId/members/directory`
|
|
142
|
+
- Returns `total/items/nextCursor/hasMore` with `Name`, `Type`, `Role`, and `Ref`; use `fullIds=true` only for explicit UUID debugging.
|
|
141
143
|
- `POST /api/orgs/:orgId/agent-hires`
|
|
142
144
|
- `GET /api/orgs/:orgId/dashboard`
|
|
143
145
|
- `GET /api/orgs/:orgId/projects`
|
|
@@ -158,6 +160,12 @@ in `pending_approval` plus the approval record when organization policy requires
|
|
|
158
160
|
review. Normal runtime work should follow [Agent creation](agent-creation.md)
|
|
159
161
|
and the installed CLI instead of calling this route directly.
|
|
160
162
|
|
|
163
|
+
The member directory is a read-only, organization-scoped view for Agent
|
|
164
|
+
context. It returns only active visible members with `name`, `type`, `role`,
|
|
165
|
+
and typed short `ref` fields. Agent keys may read their own organization;
|
|
166
|
+
cross-organization requests are rejected. Use `query`, `type`, `limit`, and
|
|
167
|
+
`cursor` for bounded pagination.
|
|
168
|
+
|
|
161
169
|
### Resources
|
|
162
170
|
|
|
163
171
|
- `GET /api/orgs/:orgId/resources`
|
|
@@ -32,14 +32,14 @@ operating-practices guide for operating behavior:
|
|
|
32
32
|
|
|
33
33
|
- First-party MCP tools use the stable `rudder_<capability_id>` naming convention, for example `rudder_issue_checkout` for `issue.checkout`.
|
|
34
34
|
- All commands support `--json`.
|
|
35
|
-
- CLI output renders IDs as short IDs by default; `rudder runs ...` commands accept short run IDs. Add `--full-ids` only when a debugging or compatibility workflow needs raw UUIDs.
|
|
35
|
+
- CLI output renders IDs as typed short IDs by default (`agt_`, `cht_`, `run_`, `msg_`, `cmt_`, and related refs); `rudder runs ...` commands accept typed refs, legacy bare short run IDs, or full UUIDs. Add `--full-ids` only when a debugging or compatibility workflow needs raw UUIDs.
|
|
36
36
|
- `--org-id` defaults to `RUDDER_ORG_ID` when relevant.
|
|
37
37
|
- `--run-id` defaults to `RUDDER_RUN_ID` and is attached to mutating requests when available.
|
|
38
38
|
- `issue checkout` defaults `--agent-id` from `RUDDER_AGENT_ID`.
|
|
39
39
|
|
|
40
40
|
## JSON Output Contract
|
|
41
41
|
|
|
42
|
-
`rudder ... --json` commands must write valid JSON to stdout on success. ID fields in CLI JSON use short display IDs by default; pass `--full-ids` to preserve raw UUIDs.
|
|
42
|
+
`rudder ... --json` commands must write valid JSON to stdout on success. ID fields in CLI JSON use typed short display IDs by default; pass `--full-ids` to preserve raw UUIDs. Typed or legacy short run IDs returned by CLI output can be passed back into `rudder runs get`, `events`, `log`, `transcript`, `errors`, `cancel`, and `retry`. If a command cannot produce the requested JSON, it must exit nonzero and write a diagnostic error to stderr. An exit-0 command with empty stdout is a CLI/runtime defect, not a valid empty result.
|
|
43
43
|
|
|
44
44
|
## Agent V1 Commands
|
|
45
45
|
|
|
@@ -47,6 +47,7 @@ operating-practices guide for operating behavior:
|
|
|
47
47
|
| --- | --- | --- | --- | --- | --- | --- |
|
|
48
48
|
| `rudder_agent_me` | `rudder agent me` | Show the authenticated agent identity and budget. | no | no | no | no |
|
|
49
49
|
| `rudder_agent_inbox` | `rudder agent inbox` | List the compact assignee and reviewer work inbox for the authenticated agent. | no | no | no | no |
|
|
50
|
+
| `rudder_organization_members_list` | `rudder org members --org-id <id> [--query <text>] [--type <human|agent|all>] [--limit <n>] [--cursor <cursor>]` | List active visible human and agent members in the authenticated organization. | no | required | no | no |
|
|
50
51
|
| `rudder_agent_capabilities` | `rudder agent capabilities` | List the stable Rudder agent command contract. | no | no | no | no |
|
|
51
52
|
| `rudder_agent_update` | `rudder agent update [agent-id] [--title <title>] [--description <text>]` | Update an agent's identity fields; defaults to the authenticated agent. | yes | no | no | attached when available |
|
|
52
53
|
| `rudder_agent_skills_create` | `rudder agent skills create [agent-id] --name <name> [--enable]` | Create an agent-private skill package under AGENT_HOME/skills. | yes | no | no | attached when available |
|
|
@@ -161,6 +162,8 @@ Issue comment responses include `shortRef` when available. `rudder issue comment
|
|
|
161
162
|
|
|
162
163
|
Chat conversation responses include `shortRef` when available. Chat read and mutation commands accept the organization-scoped `cht_<uuid-prefix>` value or the full conversation UUID. Human-readable `chat list` and `chat search` output prefers `shortRef`; `--json` retains both `id` and `shortRef`, and `--full-ids` preserves the durable UUID value in `id`. Use the full UUID when a short ref is ambiguous.
|
|
163
164
|
|
|
165
|
+
Agent run and message responses include typed `shortRef` values when available. Agent-facing output prefers `run_<uuid-prefix>` and `msg_<uuid-prefix>` while preserving the durable UUID in `id`; `--full-ids` restores the UUID values. Run routes accept `run_` refs, legacy bare hex prefixes, and full UUIDs within the authorized organization scope. Ambiguous prefixes return `409` with typed candidates.
|
|
166
|
+
|
|
164
167
|
`--image` may be repeated. The CLI uploads each local PNG/JPEG/WebP/GIF as an issue attachment and appends Markdown image links to the comment text before sending it.
|
|
165
168
|
|
|
166
169
|
## Renderable Library CLI Output
|
|
@@ -138,6 +138,8 @@ Use the incremental `after` form when you already know the thread.
|
|
|
138
138
|
- `GET /api/orgs/:orgId/issues`
|
|
139
139
|
- `POST /api/orgs/:orgId/issues`
|
|
140
140
|
- `GET /api/orgs/:orgId/agents`
|
|
141
|
+
- `GET /api/orgs/:orgId/members/directory`
|
|
142
|
+
- Returns `total/items/nextCursor/hasMore` with `Name`, `Type`, `Role`, and `Ref`; use `fullIds=true` only for explicit UUID debugging.
|
|
141
143
|
- `POST /api/orgs/:orgId/agent-hires`
|
|
142
144
|
- `GET /api/orgs/:orgId/dashboard`
|
|
143
145
|
- `GET /api/orgs/:orgId/projects`
|
|
@@ -158,6 +160,12 @@ in `pending_approval` plus the approval record when organization policy requires
|
|
|
158
160
|
review. Normal runtime work should follow [Agent creation](agent-creation.md)
|
|
159
161
|
and the installed CLI instead of calling this route directly.
|
|
160
162
|
|
|
163
|
+
The member directory is a read-only, organization-scoped view for Agent
|
|
164
|
+
context. It returns only active visible members with `name`, `type`, `role`,
|
|
165
|
+
and typed short `ref` fields. Agent keys may read their own organization;
|
|
166
|
+
cross-organization requests are rejected. Use `query`, `type`, `limit`, and
|
|
167
|
+
`cursor` for bounded pagination.
|
|
168
|
+
|
|
161
169
|
### Resources
|
|
162
170
|
|
|
163
171
|
- `GET /api/orgs/:orgId/resources`
|
|
@@ -32,14 +32,14 @@ operating-practices guide for operating behavior:
|
|
|
32
32
|
|
|
33
33
|
- First-party MCP tools use the stable `rudder_<capability_id>` naming convention, for example `rudder_issue_checkout` for `issue.checkout`.
|
|
34
34
|
- All commands support `--json`.
|
|
35
|
-
- CLI output renders IDs as short IDs by default; `rudder runs ...` commands accept short run IDs. Add `--full-ids` only when a debugging or compatibility workflow needs raw UUIDs.
|
|
35
|
+
- CLI output renders IDs as typed short IDs by default (`agt_`, `cht_`, `run_`, `msg_`, `cmt_`, and related refs); `rudder runs ...` commands accept typed refs, legacy bare short run IDs, or full UUIDs. Add `--full-ids` only when a debugging or compatibility workflow needs raw UUIDs.
|
|
36
36
|
- `--org-id` defaults to `RUDDER_ORG_ID` when relevant.
|
|
37
37
|
- `--run-id` defaults to `RUDDER_RUN_ID` and is attached to mutating requests when available.
|
|
38
38
|
- `issue checkout` defaults `--agent-id` from `RUDDER_AGENT_ID`.
|
|
39
39
|
|
|
40
40
|
## JSON Output Contract
|
|
41
41
|
|
|
42
|
-
`rudder ... --json` commands must write valid JSON to stdout on success. ID fields in CLI JSON use short display IDs by default; pass `--full-ids` to preserve raw UUIDs.
|
|
42
|
+
`rudder ... --json` commands must write valid JSON to stdout on success. ID fields in CLI JSON use typed short display IDs by default; pass `--full-ids` to preserve raw UUIDs. Typed or legacy short run IDs returned by CLI output can be passed back into `rudder runs get`, `events`, `log`, `transcript`, `errors`, `cancel`, and `retry`. If a command cannot produce the requested JSON, it must exit nonzero and write a diagnostic error to stderr. An exit-0 command with empty stdout is a CLI/runtime defect, not a valid empty result.
|
|
43
43
|
|
|
44
44
|
## Agent V1 Commands
|
|
45
45
|
|
|
@@ -47,6 +47,7 @@ operating-practices guide for operating behavior:
|
|
|
47
47
|
| --- | --- | --- | --- | --- | --- | --- |
|
|
48
48
|
| `rudder_agent_me` | `rudder agent me` | Show the authenticated agent identity and budget. | no | no | no | no |
|
|
49
49
|
| `rudder_agent_inbox` | `rudder agent inbox` | List the compact assignee and reviewer work inbox for the authenticated agent. | no | no | no | no |
|
|
50
|
+
| `rudder_organization_members_list` | `rudder org members --org-id <id> [--query <text>] [--type <human|agent|all>] [--limit <n>] [--cursor <cursor>]` | List active visible human and agent members in the authenticated organization. | no | required | no | no |
|
|
50
51
|
| `rudder_agent_capabilities` | `rudder agent capabilities` | List the stable Rudder agent command contract. | no | no | no | no |
|
|
51
52
|
| `rudder_agent_update` | `rudder agent update [agent-id] [--title <title>] [--description <text>]` | Update an agent's identity fields; defaults to the authenticated agent. | yes | no | no | attached when available |
|
|
52
53
|
| `rudder_agent_skills_create` | `rudder agent skills create [agent-id] --name <name> [--enable]` | Create an agent-private skill package under AGENT_HOME/skills. | yes | no | no | attached when available |
|
|
@@ -161,6 +162,8 @@ Issue comment responses include `shortRef` when available. `rudder issue comment
|
|
|
161
162
|
|
|
162
163
|
Chat conversation responses include `shortRef` when available. Chat read and mutation commands accept the organization-scoped `cht_<uuid-prefix>` value or the full conversation UUID. Human-readable `chat list` and `chat search` output prefers `shortRef`; `--json` retains both `id` and `shortRef`, and `--full-ids` preserves the durable UUID value in `id`. Use the full UUID when a short ref is ambiguous.
|
|
163
164
|
|
|
165
|
+
Agent run and message responses include typed `shortRef` values when available. Agent-facing output prefers `run_<uuid-prefix>` and `msg_<uuid-prefix>` while preserving the durable UUID in `id`; `--full-ids` restores the UUID values. Run routes accept `run_` refs, legacy bare hex prefixes, and full UUIDs within the authorized organization scope. Ambiguous prefixes return `409` with typed candidates.
|
|
166
|
+
|
|
164
167
|
`--image` may be repeated. The CLI uploads each local PNG/JPEG/WebP/GIF as an issue attachment and appends Markdown image links to the comment text before sending it.
|
|
165
168
|
|
|
166
169
|
## Renderable Library CLI Output
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as ee,a as re,b as te,r as l,c as Q,q as T,i as I,d as A,w as ne,j as e,W as ae,T as se,F as G,e as oe,M as ie,f as le,g as ce,C as z,h as ue,k as de,l as fe,m as me,n as he,o as xe,s as q,p as U,t as D,v as ye,x as J,y as be,z as pe,A as X,B as ve,R as we,D as ke}from"./index-BuIyK71w.js";const V="This file changed while you were editing it.";function ge(b){return b.split("/").filter(Boolean).at(-1)??b}function je(b){return!(b.truncated||b.previewKind!=="text"||b.content===null)}function Fe(b){return/\.(?:md|markdown|mdown|mdx)$/i.test(b.filePath)}function Ce({annotationConversationId:b,file:L,organizationId:n,sourceToolbar:K}){const a=he(),s=L.filePath,w=L.content??"",F=l.useRef(xe(n,s,w)).current,c=l.useRef(!0),f=l.useRef(F.baseContent),C=l.useRef(w),u=l.useRef(F.content),g=l.useRef(null),_=l.useRef(!1),i=l.useRef(F.conflicted),y=l.useRef(0),[m,j]=l.useState(F.content),[P,p]=l.useState(F.conflicted?"error":F.content===w?"saved":"saving"),[R,h]=l.useState(F.conflicted?V:null),v=l.useRef(null),[S,N]=l.useState(null),t=Fe(L);u.current=m,C.current=w,l.useEffect(()=>(c.current=!0,()=>{c.current=!1,q(n,s,f.current,u.current)}),[s,n]),l.useEffect(()=>{if(w!==f.current){if(w===u.current){f.current=w,i.current=!1,p("saved"),h(null),U(n,s);return}if(u.current===f.current){f.current=w,u.current=w,j(w),i.current=!1,p("saved"),h(null),U(n,s);return}g.current=null,y.current+=1,i.current=!0,p("error"),h(V),q(n,s,f.current,u.current)}},[s,n,w]);const M=l.useCallback((o,k)=>{const r=o.content??k;f.current=r,C.current=r,i.current=!1,a.setQueryData(T.organizations.workspaceFile(n,s),o),q(n,s,r,u.current),u.current!==r&&(g.current=u.current),c.current&&(h(null),p(u.current===r?"saved":"saving"))},[s,n,a]),E=l.useCallback(async()=>{if(!_.current){_.current=!0;try{for(;g.current!==null;){const o=g.current,k=y.current;if(g.current=null,i.current)return;if(o!==f.current){c.current&&(p("saving"),h(null));try{const r=await D.updateWorkspaceFile(n,s,{content:o,expectedContent:f.current});if(k!==y.current)continue;M(r,o)}catch(r){if(k!==y.current)continue;let d=null;try{d=await D.readWorkspaceFile(n,s)}catch{}if(k!==y.current)continue;if(d&&(C.current=d.content??"",a.setQueryData(T.organizations.workspaceFile(n,s),d)),(d==null?void 0:d.content)===o){M(d,o);continue}d&&d.content!==f.current&&(g.current=null,i.current=!0,q(n,s,f.current,u.current)),c.current&&(p("error"),h(i.current?V:r instanceof Error?r.message:"Could not save this file."));return}}}c.current&&p(u.current===f.current?"saved":"saving")}finally{_.current=!1,g.current!==null&&!i.current&&E()}}},[M,s,n,a]),W=l.useCallback(o=>{g.current=o,E()},[E]);l.useEffect(()=>{if(q(n,s,f.current,m),i.current)return;if(m===f.current){p(_.current||g.current!==null?"saving":"saved");return}const o=window.setTimeout(()=>W(m),700);return()=>window.clearTimeout(o)},[m,W,s,n]);const $=()=>{const o=C.current;y.current+=1,f.current=o,u.current=o,g.current=null,i.current=!1,j(o),p("saved"),h(null),U(n,s)},O=()=>{y.current+=1,f.current=C.current,i.current=!1,p("saving"),h(null),W(u.current)},x=t?ye(m):{frontmatter:null,separator:"",body:m};return e.jsxs("div",{className:"relative flex h-full min-h-0 min-w-0 w-full flex-col overflow-hidden","data-testid":t?"library-live-surface-markdown-editor":"library-live-surface-text-editor",children:[K,e.jsx("div",{ref:v,className:X("min-h-0 flex-1",t?"scrollbar-auto-hide overflow-y-auto px-6 py-6":"overflow-hidden"),children:t?e.jsxs(e.Fragment,{children:[x.frontmatter!==null?e.jsxs("details",{className:"group mb-6 rounded-md border border-[color:var(--border-soft)] bg-[color:var(--surface-page)]","data-chat-annotation-ignore":!0,"data-testid":"library-live-surface-frontmatter-editor",children:[e.jsxs("summary",{className:"flex cursor-pointer list-none items-center justify-between gap-3 px-3 py-2 text-xs font-medium text-muted-foreground outline-none transition-colors hover:text-foreground [&::-webkit-details-marker]:hidden",children:[e.jsx("span",{children:"Frontmatter"}),e.jsx(z,{className:"h-3.5 w-3.5 transition-transform group-open:rotate-90"})]}),e.jsx("textarea",{value:x.frontmatter,onChange:o=>{const k=J(o.currentTarget.value,x.separator,x.body);u.current=k,j(k),p(i.current?"error":"saving"),i.current||h(null)},spellCheck:!1,className:"block min-h-28 w-full resize-y border-t border-[color:var(--border-soft)] bg-transparent px-3 py-2 font-mono text-xs leading-5 text-foreground outline-none","aria-label":"Frontmatter"})]}):null,e.jsx(be,{engine:"codemirror",documentIdentity:`library-file:${s}`,value:x.body,onChange:o=>{const k=J(x.frontmatter,x.separator,o);u.current=k,j(k),p(i.current?"error":"saving"),i.current||h(null)},bordered:!1,placeholder:"Write in Markdown...",contentClassName:"rudder-library-document-editor rudder-readable-document mx-auto min-h-[420px] w-full max-w-[880px] text-[15px] leading-7 text-foreground"},s)]}):e.jsx(pe,{"data-testid":"library-live-surface-text-source-editor",annotationSource:{surface:"workspace_file",sourceFilePath:s},ariaLabel:`${s} source editor`,filePath:s,value:m,onChange:o=>{u.current=o,j(o),p(i.current?"error":"saving"),i.current||h(null)},onSelectionChange:N})}),e.jsx(ve,{containerRef:v,conversationId:b,explicitSelection:t?void 0:S,saved:P==="saved"&&!i.current&&m===f.current,source:m,sourceIdentity:{surface:"workspace_file",sourceFilePath:s,sourceLibraryEntryId:L.libraryEntryId},sourceRenderMode:t?"markdown":"text",renderedSource:t?x.body:m,renderedSourceOffset:t?m.length-x.body.length:0}),e.jsxs("div",{className:X("flex min-h-10 shrink-0 items-center gap-2 border-t border-border/70 px-4 text-xs",P==="error"?"text-destructive":"text-muted-foreground"),role:P==="error"?"alert":"status",children:[e.jsx("span",{children:P==="saved"?"Saved":P==="saving"?"Saving…":R??"Save failed"}),i.current?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"font-medium text-foreground underline underline-offset-2",onClick:O,children:"Keep mine"}),e.jsx("button",{type:"button",className:"font-medium text-foreground underline underline-offset-2",onClick:$,children:"Use latest"})]}):P==="error"?e.jsxs("button",{type:"button",className:"inline-flex items-center gap-1 font-medium text-foreground underline underline-offset-2",onClick:()=>W(u.current),children:[e.jsx(we,{className:"h-3 w-3","aria-hidden":!0}),"Retry"]}):null]})]})}function Z(b){return e.jsx("div",{className:"m-auto max-w-sm px-6 py-10 text-center text-sm leading-6 text-muted-foreground","data-testid":"library-live-surface-unavailable",role:"status",children:b})}function Ne({active:b,annotationConversationId:L=null,organizationId:n,surface:K,target:a,onOpenTarget:s}){var o,k;const{pushToast:w}=ee(),Y=re(),F=te(),c=me(),[f,C]=l.useState([]),[u,g]=l.useState(null),[_,i]=l.useState("preview"),y=a.kind==="library_entry"?a:null,m=a.kind==="library_document"?a:null,j=a.kind==="library_directory"?a:null,P=(j==null?void 0:j.directoryPath)??"",p=a.kind==="library_file"?a.filePath:(y==null?void 0:y.path)??null,R=Q({queryKey:T.organizations.libraryEntry(n,(y==null?void 0:y.entryId)??"__none__"),queryFn:()=>D.getLibraryEntry(n,y.entryId),enabled:!!y,refetchOnWindowFocus:!1}),h=p??(((o=R.data)==null?void 0:o.status)==="active"?R.data.currentPath:null),v=Q({queryKey:T.organizations.workspaceFile(n,h??""),queryFn:()=>D.readWorkspaceFile(n,h),enabled:(a.kind==="library_file"||a.kind==="library_entry")&&!!h,refetchOnWindowFocus:!1}),S=Q({queryKey:T.organizations.libraryDocument(n,(m==null?void 0:m.documentId)??"__none__"),queryFn:()=>D.getLibraryDocument(n,m.documentId),enabled:!!m,refetchOnWindowFocus:!1}),N=Q({queryKey:T.organizations.workspaceFiles(n,P),queryFn:()=>D.listWorkspaceFiles(n,P),enabled:!!j,refetchOnWindowFocus:!1}),t=v.data,M=t?I(t)||A(t):!1;l.useEffect(()=>{i("preview")},[h]);const E=ne(f,{canOpenFile:!!(t!=null&&t.rootPath&&typeof(c==null?void 0:c.openWorkspaceFileInIde)=="function"),canOpenLocation:!!(t!=null&&t.rootPath&&typeof(c==null?void 0:c.openWorkspaceFileLocation)=="function")});l.useEffect(()=>{let r=!1;if(!(t!=null&&t.rootPath)||typeof(c==null?void 0:c.listWorkspaceLaunchTargets)!="function"){C([]);return}return c.listWorkspaceLaunchTargets().then(d=>{r||C(d)}).catch(()=>{r||C([])}),()=>{r=!0}},[c,t==null?void 0:t.rootPath]);const W=async r=>{var d;if(!(!(t!=null&&t.rootPath)||!c)){g(r.id);try{ke(r)?await c.openWorkspaceFileInIde(t.rootPath,t.filePath,r.id):await((d=c.openWorkspaceFileLocation)==null?void 0:d.call(c,t.rootPath,t.filePath,r.id)),w({title:`Opened in ${r.label}`,tone:"success"})}catch(B){w({title:`Could not open in ${r.label}`,body:B instanceof Error?B.message:"Try another app.",tone:"error"})}finally{g(null)}}},$=!!(a.kind==="library_entry"&&R.isPending||(a.kind==="library_file"||a.kind==="library_entry")&&h&&v.isPending||a.kind==="library_document"&&S.isPending||a.kind==="library_directory"&&N.isPending),O=a.kind==="library_entry"?R.error??v.error:a.kind==="library_file"?v.error:a.kind==="library_document"?S.error:N.error;let x;return $?x=e.jsx("div",{className:"m-auto text-sm text-muted-foreground","data-testid":"library-live-surface-loading",children:"Loading Library item…"}):O?x=e.jsx("div",{className:"m-auto max-w-sm px-6 py-10 text-center text-sm leading-6 text-destructive","data-testid":"library-live-surface-error",role:"alert",children:O instanceof Error?O.message:"Could not open this Library item."}):a.kind==="library_entry"&&!h?x=Z(((k=R.data)==null?void 0:k.status)==="deleted"?"This Library entry was deleted.":"This Library entry is unavailable on its original path."):(a.kind==="library_file"||a.kind==="library_entry")&&v.data?x=je(v.data)&&(!M||_==="source")?e.jsx(Ce,{annotationConversationId:L,file:v.data,organizationId:n,sourceToolbar:I(v.data)?e.jsx(ae,{viewMode:"source",onViewModeChange:i,testIdPrefix:"library-live-surface"}):A(v.data)?e.jsx("div",{className:"flex h-10 shrink-0 items-center justify-end border-b border-border px-3",children:e.jsxs("button",{type:"button",className:"inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-muted hover:text-foreground",onClick:()=>i("preview"),"aria-label":"Show table",children:[e.jsx(se,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Show table"]})}):void 0},v.data.filePath):e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col overflow-hidden","data-testid":"library-live-surface-file-preview",children:[A(v.data)?e.jsx("div",{className:"flex h-10 shrink-0 items-center justify-end border-b border-border px-3",children:e.jsxs("button",{type:"button",className:"inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-muted hover:text-foreground",onClick:()=>i("source"),"aria-label":"Show source",children:[e.jsx(G,{className:"h-3.5 w-3.5","aria-hidden":!0}),"Show source"]})}):null,e.jsx(oe,{file:v.data,organizationId:n,mode:_,onModeChange:i,testIdPrefix:"library-live-surface"})]}):a.kind==="library_document"&&S.data?x=e.jsx("article",{className:"scrollbar-auto-hide min-h-0 flex-1 overflow-y-auto px-8 py-8","data-testid":"library-live-surface-document",children:e.jsx(ie,{className:"rudder-library-document-editor rudder-readable-document mx-auto w-full max-w-[880px] text-[15px] leading-7 text-foreground",children:S.data.body})}):a.kind==="library_directory"&&N.data?x=e.jsxs("div",{className:"scrollbar-auto-hide min-h-0 flex-1 overflow-y-auto p-3","data-testid":"library-live-surface-directory",children:[e.jsxs("div",{className:"mb-3 px-2",children:[e.jsx("div",{className:"truncate text-sm font-medium text-foreground",children:N.data.directoryPath||"Library root"}),e.jsxs("div",{className:"mt-1 text-xs text-muted-foreground",children:[N.data.entries.length," item",N.data.entries.length===1?"":"s"]})]}),e.jsx("ul",{className:"space-y-0.5 border-t border-border/70 pt-2",children:N.data.entries.map(r=>{var H;const d=((H=r.displayLabel)==null?void 0:H.trim())||r.name,B=r.isDirectory?le:/\.(?:md|markdown|mdx|txt)$/i.test(r.path)?ce:G;return e.jsx("li",{children:e.jsxs("button",{type:"button",className:"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm text-muted-foreground hover:bg-[color:var(--surface-active)] hover:text-foreground",onClick:()=>s(r.isDirectory?{kind:"library_directory",directoryPath:r.path,label:d}:r.libraryEntryId?{kind:"library_entry",entryId:r.libraryEntryId,label:d,path:r.path}:{kind:"library_file",filePath:r.path,label:d||ge(r.path)}),children:[e.jsx(B,{className:"h-4 w-4 shrink-0","aria-hidden":!0}),e.jsx("span",{className:"min-w-0 flex-1 truncate",children:d}),r.isDirectory?e.jsx(z,{className:"h-3.5 w-3.5 shrink-0","aria-hidden":!0}):null]})},r.path)})})]}):x=Z("This Library item is unavailable."),e.jsxs("section",{"aria-hidden":!b,className:"flex h-full min-h-0 min-w-0 w-full flex-col overflow-hidden bg-[color:var(--surface-panel)]","data-active":b?"true":"false","data-surface":K,"data-target-kind":a.kind,"data-testid":"library-live-surface",children:[t&&E.length>0?e.jsxs("div",{className:"flex h-11 shrink-0 items-center gap-3 border-b border-border/70 px-4","data-testid":"library-live-surface-file-toolbar",children:[e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs text-muted-foreground",children:t.filePath}),e.jsx("div",{"data-testid":"library-live-surface-file-open-selector",children:e.jsx(ue,{targets:E,openingTargetId:u,onOpenTarget:r=>void W(r),onOpenInLibrary:()=>F(de(`/library?path=${encodeURIComponent(t.filePath)}`,fe(Y.pathname))),testId:"library-live-surface-file-open-menu"})})]}):null,x]})}export{Ne as LibraryLiveSurface};
|