@skaile/workspaces 0.52.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/{asset-feeds-OEGJ6NOF.js → asset-feeds-677S5NX7.js} +7 -7
  3. package/dist/{asset-feeds-OEGJ6NOF.js.map → asset-feeds-677S5NX7.js.map} +1 -1
  4. package/dist/asset-manager/index.js +5 -5
  5. package/dist/asset-manager/installer.js +4 -4
  6. package/dist/{chunk-6K4RVXAM.js → chunk-43JDPQJ4.js} +3 -3
  7. package/dist/{chunk-6K4RVXAM.js.map → chunk-43JDPQJ4.js.map} +1 -1
  8. package/dist/{chunk-EOINYN5T.js → chunk-DW5MIJK3.js} +3 -3
  9. package/dist/{chunk-EOINYN5T.js.map → chunk-DW5MIJK3.js.map} +1 -1
  10. package/dist/{chunk-VE2UIJ7Y.js → chunk-EXNTTJGP.js} +3 -43
  11. package/dist/chunk-EXNTTJGP.js.map +1 -0
  12. package/dist/{chunk-7ZWLZ5H3.js → chunk-FLRHP3UC.js} +3 -3
  13. package/dist/{chunk-7ZWLZ5H3.js.map → chunk-FLRHP3UC.js.map} +1 -1
  14. package/dist/{chunk-MGB657EG.js → chunk-K5JIAHDV.js} +16 -7
  15. package/dist/chunk-K5JIAHDV.js.map +1 -0
  16. package/dist/{chunk-3IHBGDCG.js → chunk-KSISPZV3.js} +2 -2
  17. package/dist/{chunk-3IHBGDCG.js.map → chunk-KSISPZV3.js.map} +1 -1
  18. package/dist/{chunk-WD2NRI3T.js → chunk-PLQVAEM2.js} +2 -2
  19. package/dist/{chunk-WD2NRI3T.js.map → chunk-PLQVAEM2.js.map} +1 -1
  20. package/dist/{chunk-TCNYSHPM.js → chunk-SFVEHSCI.js} +4 -4
  21. package/dist/{chunk-TCNYSHPM.js.map → chunk-SFVEHSCI.js.map} +1 -1
  22. package/dist/{chunk-QLLFCQU5.js → chunk-WSQ5J7CE.js} +403 -1469
  23. package/dist/chunk-WSQ5J7CE.js.map +1 -0
  24. package/dist/{chunk-BXC5547R.js → chunk-XD7GYMAU.js} +3 -3
  25. package/dist/{chunk-BXC5547R.js.map → chunk-XD7GYMAU.js.map} +1 -1
  26. package/dist/cli/index.js +30 -32
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/connectors/config.js +4 -4
  29. package/dist/connectors/index.js +5 -7
  30. package/dist/connectors/src/config.d.ts +1 -74
  31. package/dist/connectors/src/config.d.ts.map +1 -1
  32. package/dist/connectors/src/connector-manager.d.ts +13 -137
  33. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  34. package/dist/connectors/src/connector-types.d.ts +3 -25
  35. package/dist/connectors/src/connector-types.d.ts.map +1 -1
  36. package/dist/connectors/src/fleet-utils.d.ts +2 -30
  37. package/dist/connectors/src/fleet-utils.d.ts.map +1 -1
  38. package/dist/connectors/src/fs-utils.d.ts +1 -2
  39. package/dist/connectors/src/fs-utils.d.ts.map +1 -1
  40. package/dist/connectors/src/index.d.ts +2 -12
  41. package/dist/connectors/src/index.d.ts.map +1 -1
  42. package/dist/connectors/src/watcher.d.ts +1 -5
  43. package/dist/connectors/src/watcher.d.ts.map +1 -1
  44. package/dist/core/index.js +3 -3
  45. package/dist/deploy/index.js +3 -3
  46. package/dist/{ensure-sources-GJOXWVWO.js → ensure-sources-OCMHK7LT.js} +5 -5
  47. package/dist/{ensure-sources-GJOXWVWO.js.map → ensure-sources-OCMHK7LT.js.map} +1 -1
  48. package/dist/factory-assets/connectors/deploy.js +5 -7
  49. package/dist/factory-assets/connectors/devserver.js +5 -7
  50. package/dist/factory-assets/connectors/flow/adapter.js +5 -7
  51. package/dist/factory-assets/connectors/flow/engine.js +3 -3
  52. package/dist/factory-assets/connectors/flow/run-flow.js +6 -8
  53. package/dist/factory-assets/connectors/flow.js +5 -7
  54. package/dist/factory-assets/connectors/git.js +5 -7
  55. package/dist/factory-assets/connectors/gmail.js +5 -7
  56. package/dist/factory-assets/connectors/googledrive/CONNECTOR.md +14 -128
  57. package/dist/factory-assets/connectors/googledrive/driver.d.ts +6 -13
  58. package/dist/factory-assets/connectors/googledrive/driver.d.ts.map +1 -1
  59. package/dist/factory-assets/connectors/googledrive.js +5 -7
  60. package/dist/factory-assets/connectors/local.js +5 -7
  61. package/dist/factory-assets/connectors/mattermost.js +5 -7
  62. package/dist/factory-assets/connectors/memory.js +5 -7
  63. package/dist/factory-assets/connectors/minio.js +5 -7
  64. package/dist/factory-assets/connectors/postgres.js +5 -7
  65. package/dist/factory-assets/connectors/s3.js +5 -7
  66. package/dist/factory-assets/connectors/sharepoint/CONNECTOR.md +13 -159
  67. package/dist/factory-assets/connectors/sharepoint/driver.d.ts +6 -12
  68. package/dist/factory-assets/connectors/sharepoint/driver.d.ts.map +1 -1
  69. package/dist/factory-assets/connectors/sharepoint.js +5 -7
  70. package/dist/factory-assets/connectors/sqlite.js +5 -7
  71. package/dist/factory-assets/connectors/static-server.js +5 -7
  72. package/dist/factory-assets/connectors/tunnel.js +5 -7
  73. package/dist/factory-assets/connectors/webdav/CONNECTOR.md +13 -118
  74. package/dist/factory-assets/connectors/webdav/driver.d.ts +6 -15
  75. package/dist/factory-assets/connectors/webdav/driver.d.ts.map +1 -1
  76. package/dist/factory-assets/connectors/webdav.js +5 -7
  77. package/dist/factory-assets/connectors/xstate-store.js +5 -7
  78. package/dist/factory-assets/connectors/xstate.js +5 -7
  79. package/dist/{flows-AGPIE6JM.js → flows-36PZESON.js} +4 -4
  80. package/dist/{flows-AGPIE6JM.js.map → flows-36PZESON.js.map} +1 -1
  81. package/dist/library/index.js +4 -4
  82. package/dist/library/install.js +3 -3
  83. package/dist/{open-library-ERKRGH4B.js → open-library-WRFYABFP.js} +7 -7
  84. package/dist/{open-library-ERKRGH4B.js.map → open-library-WRFYABFP.js.map} +1 -1
  85. package/dist/{paths-D6RUQ522.js → paths-EUNVMONC.js} +5 -5
  86. package/dist/{paths-D6RUQ522.js.map → paths-EUNVMONC.js.map} +1 -1
  87. package/dist/{plugin-store-SGNJTBYS.js → plugin-store-35KIMX6W.js} +5 -5
  88. package/dist/{plugin-store-SGNJTBYS.js.map → plugin-store-35KIMX6W.js.map} +1 -1
  89. package/dist/runner/index.js +7 -9
  90. package/dist/runner/src/serve.d.ts +6 -4
  91. package/dist/runner/src/serve.d.ts.map +1 -1
  92. package/dist/sdk/asset-manager.js +5 -5
  93. package/dist/sdk/core.js +3 -3
  94. package/dist/sdk/flow.js +3 -3
  95. package/dist/sdk/index.js +7 -9
  96. package/dist/sdk/index.js.map +1 -1
  97. package/dist/sdk/runner.js +7 -9
  98. package/dist/{setup-IV2JFW3T.js → setup-HM6HATAC.js} +5 -5
  99. package/dist/{setup-IV2JFW3T.js.map → setup-HM6HATAC.js.map} +1 -1
  100. package/dist/{source-FGOMQMZT.js → source-EZ5Y3CKP.js} +8 -8
  101. package/dist/{source-FGOMQMZT.js.map → source-EZ5Y3CKP.js.map} +1 -1
  102. package/dist/{store-client-GJT2XQ5Z.js → store-client-BUUF7BPK.js} +5 -5
  103. package/dist/{store-client-GJT2XQ5Z.js.map → store-client-BUUF7BPK.js.map} +1 -1
  104. package/dist/tui/index.js +7 -9
  105. package/dist/tui/index.js.map +1 -1
  106. package/dist/workspace-plugin/adapters/mcp.js +3 -3
  107. package/dist/workspace-plugin/adapters/omp.js +3 -3
  108. package/dist/workspace-plugin/index.js +1 -1
  109. package/package.json +1 -13
  110. package/dist/chunk-MGB657EG.js.map +0 -1
  111. package/dist/chunk-OVRSNIKJ.js +0 -72
  112. package/dist/chunk-OVRSNIKJ.js.map +0 -1
  113. package/dist/chunk-QLLFCQU5.js.map +0 -1
  114. package/dist/chunk-RAIRWFAN.js +0 -843
  115. package/dist/chunk-RAIRWFAN.js.map +0 -1
  116. package/dist/chunk-VE2UIJ7Y.js.map +0 -1
  117. package/dist/connectors/rclone-config.d.ts +0 -2
  118. package/dist/connectors/rclone-config.js +0 -4
  119. package/dist/connectors/rclone-config.js.map +0 -1
  120. package/dist/connectors/rclone.d.ts +0 -2
  121. package/dist/connectors/rclone.js +0 -5
  122. package/dist/connectors/rclone.js.map +0 -1
  123. package/dist/connectors/src/fleet-health-gate.d.ts +0 -105
  124. package/dist/connectors/src/fleet-health-gate.d.ts.map +0 -1
  125. package/dist/connectors/src/mount-placeholder.d.ts +0 -131
  126. package/dist/connectors/src/mount-placeholder.d.ts.map +0 -1
  127. package/dist/connectors/src/rclone-config/googledrive.d.ts +0 -59
  128. package/dist/connectors/src/rclone-config/googledrive.d.ts.map +0 -1
  129. package/dist/connectors/src/rclone-config/index.d.ts +0 -9
  130. package/dist/connectors/src/rclone-config/index.d.ts.map +0 -1
  131. package/dist/connectors/src/rclone-config/onedrive.d.ts +0 -48
  132. package/dist/connectors/src/rclone-config/onedrive.d.ts.map +0 -1
  133. package/dist/connectors/src/rclone-config/sanitize.d.ts +0 -9
  134. package/dist/connectors/src/rclone-config/sanitize.d.ts.map +0 -1
  135. package/dist/connectors/src/rclone-config/webdav.d.ts +0 -50
  136. package/dist/connectors/src/rclone-config/webdav.d.ts.map +0 -1
  137. package/dist/connectors/src/rclone-process-manager.d.ts +0 -316
  138. package/dist/connectors/src/rclone-process-manager.d.ts.map +0 -1
  139. package/dist/connectors/src/rclone-token-refresh.d.ts +0 -84
  140. package/dist/connectors/src/rclone-token-refresh.d.ts.map +0 -1
@@ -1,72 +0,0 @@
1
- // connectors/src/rclone-config/sanitize.ts
2
- function sanitizeIniValue(value) {
3
- return value.replace(/[\r\n]/g, "");
4
- }
5
-
6
- // connectors/src/rclone-config/googledrive.ts
7
- function renderGoogleDriveConfig(opts) {
8
- const lines = [];
9
- lines.push(`[${sanitizeIniValue(opts.remoteName)}]`);
10
- lines.push("type = drive");
11
- lines.push(`scope = ${sanitizeIniValue(opts.scope ?? "drive")}`);
12
- if (opts.serviceAccountFile) {
13
- lines.push(`service_account_file = ${sanitizeIniValue(opts.serviceAccountFile)}`);
14
- } else {
15
- const tokenObj = {
16
- access_token: opts.accessToken,
17
- token_type: "Bearer"
18
- };
19
- if (opts.refreshToken) tokenObj.refresh_token = opts.refreshToken;
20
- if (opts.expiresAtMs != null) {
21
- tokenObj.expiry = new Date(opts.expiresAtMs).toISOString();
22
- }
23
- lines.push(`token = ${JSON.stringify(tokenObj)}`);
24
- }
25
- if (opts.clientId) lines.push(`client_id = ${sanitizeIniValue(opts.clientId)}`);
26
- if (opts.clientSecret) lines.push(`client_secret = ${sanitizeIniValue(opts.clientSecret)}`);
27
- if (opts.rootFolderId) lines.push(`root_folder_id = ${sanitizeIniValue(opts.rootFolderId)}`);
28
- if (opts.teamDrive) lines.push(`team_drive = ${sanitizeIniValue(opts.teamDrive)}`);
29
- lines.push("");
30
- return lines.join("\n");
31
- }
32
-
33
- // connectors/src/rclone-config/onedrive.ts
34
- function renderOneDriveConfig(opts) {
35
- const tokenObj = {
36
- access_token: opts.accessToken,
37
- token_type: "Bearer"
38
- };
39
- if (opts.refreshToken) tokenObj.refresh_token = opts.refreshToken;
40
- if (opts.expiresAtMs != null) {
41
- tokenObj.expiry = new Date(opts.expiresAtMs).toISOString();
42
- }
43
- const lines = [];
44
- lines.push(`[${sanitizeIniValue(opts.remoteName)}]`);
45
- lines.push("type = onedrive");
46
- lines.push(`drive_id = ${sanitizeIniValue(opts.driveId)}`);
47
- lines.push(`drive_type = ${sanitizeIniValue(opts.driveType ?? "business")}`);
48
- lines.push(`token = ${JSON.stringify(tokenObj)}`);
49
- if (opts.clientId) lines.push(`client_id = ${sanitizeIniValue(opts.clientId)}`);
50
- if (opts.clientSecret) lines.push(`client_secret = ${sanitizeIniValue(opts.clientSecret)}`);
51
- if (opts.tenantId) lines.push(`tenant = ${sanitizeIniValue(opts.tenantId)}`);
52
- lines.push("");
53
- return lines.join("\n");
54
- }
55
-
56
- // connectors/src/rclone-config/webdav.ts
57
- function renderWebDAVConfig(opts) {
58
- const lines = [];
59
- lines.push(`[${sanitizeIniValue(opts.remoteName)}]`);
60
- lines.push("type = webdav");
61
- lines.push(`url = ${sanitizeIniValue(opts.url)}`);
62
- lines.push(`vendor = ${sanitizeIniValue(opts.vendor)}`);
63
- if (opts.username) lines.push(`user = ${sanitizeIniValue(opts.username)}`);
64
- if (opts.obscuredPassword) lines.push(`pass = ${sanitizeIniValue(opts.obscuredPassword)}`);
65
- if (opts.bearerToken) lines.push(`bearer_token = ${sanitizeIniValue(opts.bearerToken)}`);
66
- lines.push("");
67
- return lines.join("\n");
68
- }
69
-
70
- export { renderGoogleDriveConfig, renderOneDriveConfig, renderWebDAVConfig };
71
- //# sourceMappingURL=chunk-OVRSNIKJ.js.map
72
- //# sourceMappingURL=chunk-OVRSNIKJ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../connectors/src/rclone-config/sanitize.ts","../connectors/src/rclone-config/googledrive.ts","../connectors/src/rclone-config/onedrive.ts","../connectors/src/rclone-config/webdav.ts"],"names":[],"mappings":"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","file":"chunk-OVRSNIKJ.js","sourcesContent":["/**\n * Strip CR/LF from a value before interpolating it into an rclone INI line.\n * Without this, a value containing `\\n` would smuggle an extra `key = ...`\n * pair — or even a new `[section]` — into the rendered config.\n *\n * Used by every renderer in `@skaile/workspaces/connectors/rclone-config`.\n */\nexport function sanitizeIniValue(value: string): string {\n return value.replace(/[\\r\\n]/g, \"\");\n}\n","/**\n * Render an rclone INI config snippet for a single Google Drive remote.\n *\n * Pure helper — no IO, no logging — so it can be unit-tested by string compare.\n * The output is the full text for one `[<remoteName>]` section using rclone's\n * `drive` backend. The OAuth `token` field is a single-line JSON literal as\n * rclone expects, in the same shape used by the OneDrive renderer.\n *\n * Lives in `@skaile/workspaces/connectors/rclone-config` so both consumers can\n * reach it: the in-container `googledrive` mount driver\n * (`factory-assets/connectors/googledrive/driver.ts`) and the platform-side\n * `RcloneFleetService` (`platform/backend/libs/session/`) which renders the\n * same INI on the host before spawning a shared rclone process.\n */\n\n/**\n * Google Drive OAuth scope values accepted by rclone's `drive` backend.\n * `drive` = full read/write, `drive.readonly` = read-only, `drive.file` =\n * only files created/opened by the app, `drive.appfolder` = the app's hidden\n * data folder, `drive.metadata.readonly` = metadata only.\n * @docLink packages/connectors/api-reference#google-drive-scope\n */\nexport type GoogleDriveScope =\n | \"drive\"\n | \"drive.readonly\"\n | \"drive.file\"\n | \"drive.appfolder\"\n | \"drive.metadata.readonly\";\n\n/**\n * Options for `renderGoogleDriveConfig`. Carries OAuth token, optional client\n * credentials, optional scope and root/shared-drive restrictions.\n * @docLink packages/connectors/api-reference#render-google-drive-config-options\n */\nexport interface RenderGoogleDriveConfigOptions {\n /** The rclone remote section name (e.g. `skaile-gdrive`). */\n remoteName: string;\n /** Current OAuth access token. */\n accessToken: string;\n /** Long-lived refresh token (embedded in the rclone `token` JSON field). */\n refreshToken?: string | null;\n /** Expiry of the access token as a Unix timestamp in milliseconds. */\n expiresAtMs?: number | null;\n /** OAuth client (application) ID. */\n clientId?: string | null;\n /** OAuth client secret. */\n clientSecret?: string | null;\n /** OAuth scope. Defaults to `\"drive\"` (full access). */\n scope?: GoogleDriveScope;\n /** Optional Drive folder ID to mount as the remote root. */\n rootFolderId?: string | null;\n /** Optional Shared Drive (Team Drive) ID. */\n teamDrive?: string | null;\n /** Optional path to a service account JSON file (used instead of OAuth). */\n serviceAccountFile?: string | null;\n}\n\nimport { sanitizeIniValue as s } from \"./sanitize.js\";\n\n/**\n * Render an rclone INI config section for a Google Drive remote. Pure — no IO, no side effects.\n * The `token` field is serialised as a single-line JSON literal as rclone expects.\n * All interpolated values are stripped of CR/LF to prevent INI injection.\n * @param opts - Remote name, OAuth token, optional client credentials and scope/root restrictions.\n * @returns Full INI text for one `[<remoteName>]` rclone section.\n * @docLink packages/connectors/api-reference#render-google-drive-config\n */\nexport function renderGoogleDriveConfig(opts: RenderGoogleDriveConfigOptions): string {\n const lines: string[] = [];\n lines.push(`[${s(opts.remoteName)}]`);\n lines.push(\"type = drive\");\n lines.push(`scope = ${s(opts.scope ?? \"drive\")}`);\n\n if (opts.serviceAccountFile) {\n lines.push(`service_account_file = ${s(opts.serviceAccountFile)}`);\n } else {\n const tokenObj: Record<string, string> = {\n access_token: opts.accessToken,\n token_type: \"Bearer\",\n };\n if (opts.refreshToken) tokenObj.refresh_token = opts.refreshToken;\n if (opts.expiresAtMs != null) {\n tokenObj.expiry = new Date(opts.expiresAtMs).toISOString();\n }\n lines.push(`token = ${JSON.stringify(tokenObj)}`);\n }\n\n if (opts.clientId) lines.push(`client_id = ${s(opts.clientId)}`);\n if (opts.clientSecret) lines.push(`client_secret = ${s(opts.clientSecret)}`);\n if (opts.rootFolderId) lines.push(`root_folder_id = ${s(opts.rootFolderId)}`);\n if (opts.teamDrive) lines.push(`team_drive = ${s(opts.teamDrive)}`);\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n","/**\n * Render an rclone INI config snippet for a single OneDrive/SharePoint remote.\n *\n * Pure helper — no IO, no logging — so it can be unit-tested by string compare.\n * The output is the full text for one `[<remoteName>]` section using rclone's\n * `onedrive` backend. The OAuth `token` field is a single-line JSON literal as\n * rclone expects.\n *\n * Lives in `@skaile/workspaces/connectors/rclone-config` so both consumers can\n * reach it: the in-container `sharepoint` mount driver\n * (`ai-assets-skaile/mounts/sharepoint/driver.ts`) and the platform-side\n * `RcloneFleetService` (`platform/backend/libs/session/`) which renders the\n * same INI on the host before spawning a shared rclone process.\n */\n\n/**\n * Options for `renderOneDriveConfig`. Carries OAuth token, drive ID, and optional tenant/client credentials.\n * @docLink packages/connectors/api-reference#render-one-drive-config-options\n */\nexport interface RenderOneDriveConfigOptions {\n /** The rclone remote section name (e.g. `skaile-sharepoint`). */\n remoteName: string;\n /** Current OAuth access token. */\n accessToken: string;\n /** Long-lived refresh token (embedded in the rclone `token` JSON field). */\n refreshToken?: string | null;\n /** Expiry of the access token as a Unix timestamp in milliseconds. */\n expiresAtMs?: number | null;\n /** Azure tenant ID for MSAL authentication. */\n tenantId?: string | null;\n /** OAuth client (application) ID. */\n clientId?: string | null;\n /** OAuth client secret. */\n clientSecret?: string | null;\n /** OneDrive drive ID (required by the rclone `onedrive` backend). */\n driveId: string;\n /** Drive type. Defaults to `\"business\"`. */\n driveType?: \"business\" | \"personal\" | \"documentLibrary\";\n}\n\nimport { sanitizeIniValue as s } from \"./sanitize.js\";\n\n/**\n * Render an rclone INI config section for a OneDrive / SharePoint remote. Pure — no IO, no side effects.\n * The `token` field is serialised as a single-line JSON literal as rclone expects.\n * All interpolated values are stripped of CR/LF to prevent INI injection.\n * @param opts - Remote name, OAuth token, drive ID, and optional tenant/client credentials.\n * @returns Full INI text for one `[<remoteName>]` rclone section.\n * @docLink packages/connectors/api-reference#render-one-drive-config\n */\nexport function renderOneDriveConfig(opts: RenderOneDriveConfigOptions): string {\n const tokenObj: Record<string, string> = {\n access_token: opts.accessToken,\n token_type: \"Bearer\",\n };\n if (opts.refreshToken) tokenObj.refresh_token = opts.refreshToken;\n if (opts.expiresAtMs != null) {\n tokenObj.expiry = new Date(opts.expiresAtMs).toISOString();\n }\n\n const lines: string[] = [];\n lines.push(`[${s(opts.remoteName)}]`);\n lines.push(\"type = onedrive\");\n lines.push(`drive_id = ${s(opts.driveId)}`);\n lines.push(`drive_type = ${s(opts.driveType ?? \"business\")}`);\n lines.push(`token = ${JSON.stringify(tokenObj)}`);\n if (opts.clientId) lines.push(`client_id = ${s(opts.clientId)}`);\n if (opts.clientSecret) lines.push(`client_secret = ${s(opts.clientSecret)}`);\n if (opts.tenantId) lines.push(`tenant = ${s(opts.tenantId)}`);\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n","/**\n * Render an rclone INI config snippet for a single WebDAV remote.\n *\n * Pure helper -- no IO, no logging -- so it can be unit-tested by string compare.\n * The output is the full text for one `[<remoteName>]` section using rclone's\n * `webdav` backend.\n *\n * NOTE: rclone's `pass` field is not plaintext; it must already be passed\n * through `rclone obscure` by the caller. See the driver's `obscurePassword`\n * helper for the spawn that produces it.\n *\n * Lives in `@skaile/workspaces/connectors/rclone-config` so both consumers can\n * reach it: the in-container `webdav` mount driver\n * (`ai-assets-skaile/mounts/webdav/driver.ts`) and the platform-side\n * `RcloneFleetService` (`platform/backend/libs/session/`) which renders the\n * same INI on the host before spawning a shared rclone process.\n */\n\n/**\n * Supported WebDAV vendor identifiers for the rclone `webdav` backend.\n * @docLink packages/connectors/api-reference#web-dav-vendor\n */\nexport type WebDAVVendor = \"nextcloud\" | \"owncloud\" | \"sharepoint\" | \"fastmail\" | \"other\";\n\n/**\n * Options for `renderWebDAVConfig`. Carries remote name, URL, vendor, and credentials.\n * @docLink packages/connectors/api-reference#render-web-dav-config-options\n */\nexport interface RenderWebDAVConfigOptions {\n /** The rclone remote section name (e.g. `skaile-docs`). */\n remoteName: string;\n /** Base URL of the WebDAV server. */\n url: string;\n /** WebDAV vendor; drives rclone's `vendor =` field. */\n vendor: WebDAVVendor;\n /** Basic-auth username. */\n username?: string | null;\n /** Already passed through `rclone obscure`. */\n obscuredPassword?: string | null;\n /** OAuth bearer token (used instead of basic-auth for SharePoint). */\n bearerToken?: string | null;\n}\n\nimport { sanitizeIniValue as s } from \"./sanitize.js\";\n\n/**\n * Render an rclone INI config section for a WebDAV remote. Pure — no IO, no side effects.\n * The `obscuredPassword` field must already have been processed through `rclone obscure`.\n * All interpolated values are stripped of CR/LF to prevent INI injection.\n * @param opts - Remote name, URL, vendor, and credentials.\n * @returns Full INI text for one `[<remoteName>]` rclone section.\n * @docLink packages/connectors/api-reference#render-web-dav-config\n */\nexport function renderWebDAVConfig(opts: RenderWebDAVConfigOptions): string {\n const lines: string[] = [];\n lines.push(`[${s(opts.remoteName)}]`);\n lines.push(\"type = webdav\");\n lines.push(`url = ${s(opts.url)}`);\n lines.push(`vendor = ${s(opts.vendor)}`);\n if (opts.username) lines.push(`user = ${s(opts.username)}`);\n if (opts.obscuredPassword) lines.push(`pass = ${s(opts.obscuredPassword)}`);\n if (opts.bearerToken) lines.push(`bearer_token = ${s(opts.bearerToken)}`);\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n"]}