@skaile/workspaces 0.12.2 → 0.14.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 (106) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/asset-manager/index.js +4 -6
  3. package/dist/asset-manager/installer.js +1 -2
  4. package/dist/asset-manager/src/index.d.ts +1 -2
  5. package/dist/asset-manager/src/index.d.ts.map +1 -1
  6. package/dist/asset-manager/src/{scaffold/layers/agents.d.ts → install-agent.d.ts} +11 -33
  7. package/dist/asset-manager/src/install-agent.d.ts.map +1 -0
  8. package/dist/base-assets/connectors/deploy.js +2 -2
  9. package/dist/base-assets/connectors/devserver.js +2 -2
  10. package/dist/base-assets/connectors/flow/adapter.js +2 -2
  11. package/dist/base-assets/connectors/flow/run-flow.js +3 -3
  12. package/dist/base-assets/connectors/flow.js +2 -2
  13. package/dist/base-assets/connectors/git.js +2 -2
  14. package/dist/base-assets/connectors/gmail.js +2 -2
  15. package/dist/base-assets/connectors/googledrive/driver.d.ts +47 -0
  16. package/dist/base-assets/connectors/googledrive/driver.d.ts.map +1 -0
  17. package/dist/base-assets/connectors/googledrive.js +20 -0
  18. package/dist/base-assets/connectors/googledrive.js.map +1 -0
  19. package/dist/base-assets/connectors/local.js +2 -2
  20. package/dist/base-assets/connectors/mattermost.js +2 -2
  21. package/dist/base-assets/connectors/memory.js +2 -2
  22. package/dist/base-assets/connectors/minio.js +2 -2
  23. package/dist/base-assets/connectors/postgres.js +2 -2
  24. package/dist/base-assets/connectors/redis.js +2 -2
  25. package/dist/base-assets/connectors/s3.js +2 -2
  26. package/dist/base-assets/connectors/sharepoint/driver.d.ts.map +1 -1
  27. package/dist/base-assets/connectors/sharepoint.js +2 -2
  28. package/dist/base-assets/connectors/sqlite.js +2 -2
  29. package/dist/base-assets/connectors/static-server.js +2 -2
  30. package/dist/base-assets/connectors/tunnel.js +2 -2
  31. package/dist/base-assets/connectors/webdav/driver.d.ts.map +1 -1
  32. package/dist/base-assets/connectors/webdav.js +2 -2
  33. package/dist/base-assets/connectors/xstate-store.js +2 -2
  34. package/dist/base-assets/connectors/xstate.js +2 -2
  35. package/dist/base-assets/connectors/yjs.js +2 -2
  36. package/dist/{chunk-M2NLRGIX.js → chunk-4GEVGRWB.js} +159 -6
  37. package/dist/chunk-4GEVGRWB.js.map +1 -0
  38. package/dist/{chunk-EARKGKKB.js → chunk-7R4WLTZW.js} +5 -5
  39. package/dist/{chunk-EARKGKKB.js.map → chunk-7R4WLTZW.js.map} +1 -1
  40. package/dist/{chunk-UTKGPNLV.js → chunk-DN5476SV.js} +5 -5
  41. package/dist/{chunk-UTKGPNLV.js.map → chunk-DN5476SV.js.map} +1 -1
  42. package/dist/{chunk-Z5PO7ZVP.js → chunk-G7O7WDXX.js} +2 -2
  43. package/dist/{chunk-Z5PO7ZVP.js.map → chunk-G7O7WDXX.js.map} +1 -1
  44. package/dist/{chunk-EAJKY27M.js → chunk-HSOEX3TA.js} +250 -92
  45. package/dist/chunk-HSOEX3TA.js.map +1 -0
  46. package/dist/{chunk-DDVKNST3.js → chunk-OIFGKFZY.js} +3 -3
  47. package/dist/{chunk-DDVKNST3.js.map → chunk-OIFGKFZY.js.map} +1 -1
  48. package/dist/chunk-QAVZOJCV.js +72 -0
  49. package/dist/chunk-QAVZOJCV.js.map +1 -0
  50. package/dist/cli/index.js +93 -33
  51. package/dist/cli/index.js.map +1 -1
  52. package/dist/connectors/index.js +2 -2
  53. package/dist/connectors/rclone-config.js +1 -1
  54. package/dist/connectors/src/connector-registry.d.ts.map +1 -1
  55. package/dist/connectors/src/fleet-utils.d.ts +35 -0
  56. package/dist/connectors/src/fleet-utils.d.ts.map +1 -0
  57. package/dist/connectors/src/index.d.ts +2 -1
  58. package/dist/connectors/src/index.d.ts.map +1 -1
  59. package/dist/connectors/src/rclone-config/googledrive.d.ts +59 -0
  60. package/dist/connectors/src/rclone-config/googledrive.d.ts.map +1 -0
  61. package/dist/connectors/src/rclone-config/index.d.ts +1 -0
  62. package/dist/connectors/src/rclone-config/index.d.ts.map +1 -1
  63. package/dist/connectors/src/rclone-config/onedrive.d.ts +1 -0
  64. package/dist/connectors/src/rclone-config/onedrive.d.ts.map +1 -1
  65. package/dist/connectors/src/rclone-config/sanitize.d.ts +9 -0
  66. package/dist/connectors/src/rclone-config/sanitize.d.ts.map +1 -0
  67. package/dist/connectors/src/rclone-config/webdav.d.ts +1 -0
  68. package/dist/connectors/src/rclone-config/webdav.d.ts.map +1 -1
  69. package/dist/runner/index.js +5 -5
  70. package/dist/sdk/asset-manager.js +4 -6
  71. package/dist/sdk/index.js +5 -5
  72. package/dist/sdk/runner.js +5 -5
  73. package/dist/tui/index.js +5 -5
  74. package/dist/workspace-plugin/index.js +1 -1
  75. package/package.json +7 -7
  76. package/dist/asset-manager/scaffold.js +0 -18
  77. package/dist/asset-manager/scaffold.js.map +0 -1
  78. package/dist/asset-manager/src/scaffold/index.d.ts +0 -19
  79. package/dist/asset-manager/src/scaffold/index.d.ts.map +0 -1
  80. package/dist/asset-manager/src/scaffold/layers/agents.d.ts.map +0 -1
  81. package/dist/asset-manager/src/scaffold/layers/base.d.ts +0 -17
  82. package/dist/asset-manager/src/scaffold/layers/base.d.ts.map +0 -1
  83. package/dist/asset-manager/src/scaffold/layers/connectors.d.ts +0 -18
  84. package/dist/asset-manager/src/scaffold/layers/connectors.d.ts.map +0 -1
  85. package/dist/asset-manager/src/scaffold/layers/container.d.ts +0 -16
  86. package/dist/asset-manager/src/scaffold/layers/container.d.ts.map +0 -1
  87. package/dist/asset-manager/src/scaffold/layers/driver-target.d.ts +0 -17
  88. package/dist/asset-manager/src/scaffold/layers/driver-target.d.ts.map +0 -1
  89. package/dist/asset-manager/src/scaffold/layers/hooks.d.ts +0 -22
  90. package/dist/asset-manager/src/scaffold/layers/hooks.d.ts.map +0 -1
  91. package/dist/asset-manager/src/scaffold/layers/skills.d.ts +0 -31
  92. package/dist/asset-manager/src/scaffold/layers/skills.d.ts.map +0 -1
  93. package/dist/asset-manager/src/scaffold/layers/template.d.ts +0 -16
  94. package/dist/asset-manager/src/scaffold/layers/template.d.ts.map +0 -1
  95. package/dist/asset-manager/src/scaffold/scaffolder.d.ts +0 -77
  96. package/dist/asset-manager/src/scaffold/scaffolder.d.ts.map +0 -1
  97. package/dist/asset-manager/src/scaffold/types.d.ts +0 -241
  98. package/dist/asset-manager/src/scaffold/types.d.ts.map +0 -1
  99. package/dist/chunk-DIKFRNCS.js +0 -195
  100. package/dist/chunk-DIKFRNCS.js.map +0 -1
  101. package/dist/chunk-EAJKY27M.js.map +0 -1
  102. package/dist/chunk-GCRKAFH7.js +0 -40
  103. package/dist/chunk-GCRKAFH7.js.map +0 -1
  104. package/dist/chunk-M2NLRGIX.js.map +0 -1
  105. package/dist/chunk-YHXBQLXX.js +0 -546
  106. package/dist/chunk-YHXBQLXX.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { resolveAuthRef, resolveAuth } from './chunk-W75ASXH4.js';
2
2
  import { RcloneProcessManager, ensureDirMode, PortPool } from './chunk-6MB7CRME.js';
3
- import { renderWebDAVConfig, renderOneDriveConfig } from './chunk-GCRKAFH7.js';
3
+ import { renderWebDAVConfig, renderOneDriveConfig, renderGoogleDriveConfig } from './chunk-QAVZOJCV.js';
4
4
  import { computeFlowStateFromSnapshots } from './chunk-ICS76R4T.js';
5
5
  import { renderStimulusPrompt } from './chunk-GZWJGNNN.js';
6
6
  import { computeStimulus } from './chunk-FVTV7M76.js';
@@ -9,13 +9,13 @@ import { createLogger } from './chunk-24UIWON4.js';
9
9
  import { existsSync, mkdirSync, renameSync, writeFileSync, readFileSync, cpSync, statSync, createReadStream, readdirSync, openSync, writeSync, closeSync, chmodSync } from 'fs';
10
10
  import { join, dirname, resolve, sep, relative } from 'path';
11
11
  import { execFile, execSync } from 'child_process';
12
- import { stat, readdir } from 'fs/promises';
13
12
  import { promisify } from 'util';
14
13
  import { createServer } from 'http';
15
14
  import mime from 'mime';
16
15
  import * as zNS from 'zod';
17
16
  import { createRequire } from 'module';
18
17
  import { pathToFileURL } from 'url';
18
+ import { stat, readdir } from 'fs/promises';
19
19
  import chokidar from 'chokidar';
20
20
 
21
21
  // connectors/src/connector-base.ts
@@ -854,8 +854,8 @@ var GitConnector = class extends AbstractConnector {
854
854
  generateCommitMessage(mountPath) {
855
855
  try {
856
856
  git("add -A", mountPath);
857
- const stat3 = git("diff --cached --stat", mountPath);
858
- const lines = stat3.split("\n").filter((l) => l.includes("|"));
857
+ const stat2 = git("diff --cached --stat", mountPath);
858
+ const lines = stat2.split("\n").filter((l) => l.includes("|"));
859
859
  if (lines.length === 0) return "skaile: auto-save";
860
860
  const files = lines.map((l) => l.split("|")[0].trim());
861
861
  if (files.length === 1) return `Update ${files[0]}`;
@@ -1054,32 +1054,6 @@ var S3Connector = class extends AbstractConnector {
1054
1054
  function createConnector4(sdkOverride) {
1055
1055
  return new S3Connector(sdkOverride);
1056
1056
  }
1057
- function isFleetManaged(connectorId) {
1058
- const raw = process.env.SKAILE_FLEET_MANAGED_MOUNTS ?? "";
1059
- if (raw.length === 0) return false;
1060
- return raw.split(",").map((s) => s.trim()).filter((s) => s.length > 0).includes(connectorId);
1061
- }
1062
- async function ensureFleetMounted(dir, log) {
1063
- const deadline = Date.now() + 3e3;
1064
- let lastErr = null;
1065
- while (Date.now() < deadline) {
1066
- try {
1067
- const st = await stat(dir);
1068
- if (!st.isDirectory()) {
1069
- throw new Error(`fleet mountpoint ${dir} is not a directory`);
1070
- }
1071
- await readdir(dir);
1072
- log.info("fleet bind mount verified", { dir });
1073
- return;
1074
- } catch (err) {
1075
- lastErr = err;
1076
- await new Promise((resolve5) => setTimeout(resolve5, 100));
1077
- }
1078
- }
1079
- throw new Error(
1080
- `fleet mount ${dir} not ready after 3s \u2014 check SKAILE_FLEET_MANAGED_MOUNTS env var and host bind: ${lastErr instanceof Error ? lastErr.message : String(lastErr)}`
1081
- );
1082
- }
1083
1057
  var CACHE_BASE = "/var/cache/skaile";
1084
1058
  var ALLOWED_VENDORS = /* @__PURE__ */ new Set([
1085
1059
  "nextcloud",
@@ -1250,32 +1224,8 @@ async function obscurePassword(plain) {
1250
1224
  );
1251
1225
  }
1252
1226
  }
1253
- function isFleetManaged2(connectorId) {
1254
- const raw = process.env.SKAILE_FLEET_MANAGED_MOUNTS ?? "";
1255
- if (raw.length === 0) return false;
1256
- return raw.split(",").map((s) => s.trim()).filter((s) => s.length > 0).includes(connectorId);
1257
- }
1258
- async function ensureFleetMounted2(dir, log) {
1259
- const deadline = Date.now() + 3e3;
1260
- let lastErr = null;
1261
- while (Date.now() < deadline) {
1262
- try {
1263
- const st = await stat(dir);
1264
- if (!st.isDirectory()) {
1265
- throw new Error(`fleet mountpoint ${dir} is not a directory`);
1266
- }
1267
- await readdir(dir);
1268
- log.info("fleet bind mount verified", { dir });
1269
- return;
1270
- } catch (err) {
1271
- lastErr = err;
1272
- await new Promise((resolve5) => setTimeout(resolve5, 100));
1273
- }
1274
- }
1275
- throw new Error(
1276
- `fleet mount ${dir} not ready after 3s \u2014 check SKAILE_FLEET_MANAGED_MOUNTS env var and host bind: ${lastErr instanceof Error ? lastErr.message : String(lastErr)}`
1277
- );
1278
- }
1227
+
1228
+ // base-assets/connectors/sharepoint/driver.ts
1279
1229
  var CACHE_BASE2 = "/var/cache/skaile";
1280
1230
  var SharePointConnector = class extends AbstractConnector {
1281
1231
  name = "sharepoint";
@@ -1295,12 +1245,12 @@ var SharePointConnector = class extends AbstractConnector {
1295
1245
  this.log.info("mount called", {
1296
1246
  optionKeys: opts ? Object.keys(opts) : []
1297
1247
  });
1298
- if (isFleetManaged2(declaration.id)) {
1248
+ if (isFleetManaged(declaration.id)) {
1299
1249
  this.log.info("mount handled by host fleet \u2014 skipping in-container rclone spawn", {
1300
1250
  connectorId: declaration.id,
1301
1251
  targetDir
1302
1252
  });
1303
- await ensureFleetMounted2(targetDir, this.log);
1253
+ await ensureFleetMounted(targetDir, this.log);
1304
1254
  const fleetState = {
1305
1255
  rcloneHandle: null,
1306
1256
  fleetManaged: true
@@ -1318,7 +1268,7 @@ var SharePointConnector = class extends AbstractConnector {
1318
1268
  );
1319
1269
  }
1320
1270
  const basePath = String(opts?.basePath ?? "").replace(/^\/+|\/+$/g, "");
1321
- const auth = parseAuthBlob(resolveAuth(declaration.auth, secrets));
1271
+ const auth = parseAuthBlob(resolveAuth(declaration.auth, secrets), this.log);
1322
1272
  if (!auth.accessToken) {
1323
1273
  throw new Error("SharePoint connector requires auth token (e.g. auth: env:SHAREPOINT_TOKEN)");
1324
1274
  }
@@ -1408,7 +1358,7 @@ var SharePointConnector = class extends AbstractConnector {
1408
1358
  function createConnector6() {
1409
1359
  return new SharePointConnector();
1410
1360
  }
1411
- function parseAuthBlob(raw) {
1361
+ function parseAuthBlob(raw, log) {
1412
1362
  const empty = {
1413
1363
  accessToken: "",
1414
1364
  refreshToken: null,
@@ -1431,7 +1381,10 @@ function parseAuthBlob(raw) {
1431
1381
  clientId: parsed.clientId ?? null,
1432
1382
  clientSecret: parsed.clientSecret ?? null
1433
1383
  };
1434
- } catch {
1384
+ } catch (err) {
1385
+ log?.warn("auth blob starts with '{' but is not valid JSON \u2014 treating as raw token", {
1386
+ error: err instanceof Error ? err.message : String(err)
1387
+ });
1435
1388
  return { ...empty, accessToken: raw };
1436
1389
  }
1437
1390
  }
@@ -1442,6 +1395,182 @@ function buildRemotePath(folderPath, basePath) {
1442
1395
  return joined.length > 0 ? `/${joined}` : "/";
1443
1396
  }
1444
1397
 
1398
+ // base-assets/connectors/googledrive/driver.ts
1399
+ var CACHE_BASE3 = "/var/cache/skaile";
1400
+ var ALLOWED_SCOPES = /* @__PURE__ */ new Set([
1401
+ "drive",
1402
+ "drive.readonly",
1403
+ "drive.file",
1404
+ "drive.appfolder",
1405
+ "drive.metadata.readonly"
1406
+ ]);
1407
+ var GoogleDriveConnector = class extends AbstractConnector {
1408
+ name = "googledrive";
1409
+ rclone = new RcloneProcessManager();
1410
+ filesystem = {
1411
+ sync: (handle, options) => {
1412
+ return this._sync(handle, options);
1413
+ }
1414
+ };
1415
+ async connect(declaration, ctx) {
1416
+ const targetDir = ctx.mountTarget;
1417
+ if (!targetDir) {
1418
+ throw new Error("GoogleDriveConnector requires ctx.mountTarget to be set by the manager");
1419
+ }
1420
+ const secrets = ctx.secrets;
1421
+ const opts = declaration.options;
1422
+ this.log.info("mount called", {
1423
+ optionKeys: opts ? Object.keys(opts) : []
1424
+ });
1425
+ if (isFleetManaged(declaration.id)) {
1426
+ this.log.info("mount handled by host fleet \u2014 skipping in-container rclone spawn", {
1427
+ connectorId: declaration.id,
1428
+ targetDir
1429
+ });
1430
+ await ensureFleetMounted(targetDir, this.log);
1431
+ const fleetState = {
1432
+ rcloneHandle: null,
1433
+ fleetManaged: true
1434
+ };
1435
+ return this.makeHandle(declaration, fleetState, targetDir);
1436
+ }
1437
+ const scopeRaw = opts?.scope !== void 0 ? String(opts.scope) : "drive";
1438
+ if (!ALLOWED_SCOPES.has(scopeRaw)) {
1439
+ throw new Error(
1440
+ `Google Drive connector: invalid scope "${scopeRaw}" (allowed: ${[...ALLOWED_SCOPES].join(", ")})`
1441
+ );
1442
+ }
1443
+ const scope = scopeRaw;
1444
+ const auth = parseAuthBlob2(resolveAuth(declaration.auth, secrets), this.log);
1445
+ if (!auth.accessToken && !auth.serviceAccountFile) {
1446
+ throw new Error(
1447
+ "Google Drive connector requires auth token or serviceAccountFile (e.g. auth: env:GDRIVE_TOKEN)"
1448
+ );
1449
+ }
1450
+ const rootFolderId = opts?.rootFolderId !== void 0 ? String(opts.rootFolderId) : null;
1451
+ const teamDrive = opts?.teamDrive !== void 0 ? String(opts.teamDrive) : null;
1452
+ const basePath = String(opts?.basePath ?? "").replace(/^\/+|\/+$/g, "");
1453
+ const remoteName = `skaile-${declaration.id}`;
1454
+ const remotePath = basePath.length > 0 ? `/${basePath}` : "/";
1455
+ const remote = `${remoteName}:${remotePath}`;
1456
+ const cacheDir = `${CACHE_BASE3}/${declaration.id}`;
1457
+ const vfsCacheMode = declaration.access === "read-only" ? "minimal" : "full";
1458
+ this.log.info("mount params resolved", {
1459
+ scope,
1460
+ remote,
1461
+ cacheDir,
1462
+ vfsCacheMode,
1463
+ hasRefresh: auth.refreshToken !== null,
1464
+ hasServiceAccount: auth.serviceAccountFile !== null,
1465
+ teamDrive
1466
+ });
1467
+ const rcloneConfig = renderGoogleDriveConfig({
1468
+ remoteName,
1469
+ accessToken: auth.accessToken,
1470
+ refreshToken: auth.refreshToken,
1471
+ expiresAtMs: auth.expiresAtMs,
1472
+ clientId: auth.clientId,
1473
+ clientSecret: auth.clientSecret,
1474
+ scope,
1475
+ rootFolderId,
1476
+ teamDrive,
1477
+ serviceAccountFile: auth.serviceAccountFile
1478
+ });
1479
+ await ensureDirMode(CACHE_BASE3, this.log);
1480
+ await ensureDirMode(cacheDir, this.log);
1481
+ await ensureDirMode(targetDir, this.log);
1482
+ const cacheMaxSize = opts?.cacheMaxSize !== void 0 ? String(opts.cacheMaxSize) : void 0;
1483
+ const cacheMaxAge = opts?.cacheMaxAge !== void 0 ? String(opts.cacheMaxAge) : void 0;
1484
+ const rcloneHandle = await this.rclone.spawn({
1485
+ mountId: declaration.id,
1486
+ driverName: "googledrive",
1487
+ mountPoint: targetDir,
1488
+ cacheDir,
1489
+ rcloneConfig,
1490
+ remote,
1491
+ vfsCacheMode,
1492
+ ...cacheMaxSize !== void 0 ? { cacheMaxSize } : {},
1493
+ ...cacheMaxAge !== void 0 ? { cacheMaxAge } : {},
1494
+ log: this.log
1495
+ });
1496
+ this.log.info("mount ready", { pid: rcloneHandle.pid });
1497
+ const state = { rcloneHandle };
1498
+ return this.makeHandle(declaration, state, targetDir);
1499
+ }
1500
+ async disconnect(handle) {
1501
+ const s = handle.state;
1502
+ if (s.fleetManaged || !s.rcloneHandle) return;
1503
+ await this.rclone.stop(s.rcloneHandle, { graceMs: 3e4 });
1504
+ }
1505
+ async _sync(handle, options) {
1506
+ const s = handle.state;
1507
+ if (s.fleetManaged || !s.rcloneHandle) {
1508
+ options?.onSyncStatus?.({
1509
+ phase: "initial_sync_complete",
1510
+ totalFiles: 0,
1511
+ downloadedFiles: 0,
1512
+ stubFiles: 0,
1513
+ message: "fleet-managed mount \u2014 flush handled by host"
1514
+ });
1515
+ return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };
1516
+ }
1517
+ await this.rclone.flush(s.rcloneHandle);
1518
+ options?.onSyncStatus?.({
1519
+ phase: "initial_sync_complete",
1520
+ totalFiles: 0,
1521
+ downloadedFiles: 0,
1522
+ stubFiles: 0,
1523
+ message: "rclone flush complete"
1524
+ });
1525
+ return { filesWritten: 0, filesDeleted: 0, bytesTransferred: 0 };
1526
+ }
1527
+ async onHibernate(handle) {
1528
+ const s = handle.state;
1529
+ if (s.fleetManaged) return "flushed";
1530
+ await this._sync(handle);
1531
+ return "flushed";
1532
+ }
1533
+ async onSessionClose(handle) {
1534
+ const s = handle.state;
1535
+ if (s.fleetManaged) return "flushed";
1536
+ await this._sync(handle);
1537
+ return "flushed";
1538
+ }
1539
+ };
1540
+ function createConnector7() {
1541
+ return new GoogleDriveConnector();
1542
+ }
1543
+ function parseAuthBlob2(raw, log) {
1544
+ const empty = {
1545
+ accessToken: "",
1546
+ refreshToken: null,
1547
+ expiresAtMs: null,
1548
+ clientId: null,
1549
+ clientSecret: null,
1550
+ serviceAccountFile: null
1551
+ };
1552
+ if (!raw) return empty;
1553
+ if (!raw.startsWith("{")) {
1554
+ return { ...empty, accessToken: raw };
1555
+ }
1556
+ try {
1557
+ const parsed = JSON.parse(raw);
1558
+ return {
1559
+ accessToken: parsed.accessToken ?? "",
1560
+ refreshToken: parsed.refreshToken ?? null,
1561
+ expiresAtMs: parsed.expiresAt ?? null,
1562
+ clientId: parsed.clientId ?? null,
1563
+ clientSecret: parsed.clientSecret ?? null,
1564
+ serviceAccountFile: parsed.serviceAccountFile ?? null
1565
+ };
1566
+ } catch (err) {
1567
+ log?.warn("auth blob starts with '{' but is not valid JSON \u2014 treating as raw token", {
1568
+ error: err instanceof Error ? err.message : String(err)
1569
+ });
1570
+ return { ...empty, accessToken: raw };
1571
+ }
1572
+ }
1573
+
1445
1574
  // base-assets/connectors/memory/adapter.ts
1446
1575
  var MemoryConnector = class extends AbstractConnector {
1447
1576
  name = "memory";
@@ -1591,7 +1720,7 @@ function matchGlob(str, pattern) {
1591
1720
  const regex = new RegExp(`^${pattern.replace(/\*/g, ".*").replace(/\?/g, ".")}$`);
1592
1721
  return regex.test(str);
1593
1722
  }
1594
- function createConnector7() {
1723
+ function createConnector8() {
1595
1724
  return new MemoryConnector();
1596
1725
  }
1597
1726
 
@@ -1856,7 +1985,7 @@ var PostgresConnector = class extends AbstractConnector {
1856
1985
  }
1857
1986
  }
1858
1987
  };
1859
- function createConnector8() {
1988
+ function createConnector9() {
1860
1989
  return new PostgresConnector();
1861
1990
  }
1862
1991
 
@@ -2114,7 +2243,7 @@ var RedisConnector = class extends AbstractConnector {
2114
2243
  }
2115
2244
  }
2116
2245
  };
2117
- function createConnector9() {
2246
+ function createConnector10() {
2118
2247
  return new RedisConnector();
2119
2248
  }
2120
2249
  var SQLiteConnector = class extends AbstractConnector {
@@ -2352,7 +2481,7 @@ var SQLiteConnector = class extends AbstractConnector {
2352
2481
  }
2353
2482
  }
2354
2483
  };
2355
- function createConnector10() {
2484
+ function createConnector11() {
2356
2485
  return new SQLiteConnector();
2357
2486
  }
2358
2487
 
@@ -2603,7 +2732,7 @@ var MinIOConnector = class extends AbstractConnector {
2603
2732
  }
2604
2733
  }
2605
2734
  };
2606
- function createConnector11() {
2735
+ function createConnector12() {
2607
2736
  return new MinIOConnector();
2608
2737
  }
2609
2738
  var XStateConnector = class extends AbstractConnector {
@@ -2906,7 +3035,7 @@ var XStateConnector = class extends AbstractConnector {
2906
3035
  return [...names];
2907
3036
  }
2908
3037
  };
2909
- function createConnector12() {
3038
+ function createConnector13() {
2910
3039
  return new XStateConnector();
2911
3040
  }
2912
3041
 
@@ -3155,7 +3284,7 @@ var XStateStoreConnector = class extends AbstractConnector {
3155
3284
  if (s.history.length > 500) s.history = s.history.slice(-500);
3156
3285
  }
3157
3286
  };
3158
- function createConnector13() {
3287
+ function createConnector14() {
3159
3288
  return new XStateStoreConnector();
3160
3289
  }
3161
3290
 
@@ -3445,7 +3574,7 @@ var YjsConnector = class extends AbstractConnector {
3445
3574
  if (s.history.length > 500) s.history = s.history.slice(-500);
3446
3575
  }
3447
3576
  };
3448
- function createConnector14() {
3577
+ function createConnector15() {
3449
3578
  return new YjsConnector();
3450
3579
  }
3451
3580
 
@@ -3652,7 +3781,7 @@ var GmailConnector = class extends AbstractConnector {
3652
3781
  return Buffer.from(message).toString("base64url");
3653
3782
  }
3654
3783
  };
3655
- function createConnector15() {
3784
+ function createConnector16() {
3656
3785
  return new GmailConnector();
3657
3786
  }
3658
3787
 
@@ -4029,7 +4158,7 @@ var MattermostConnector = class extends AbstractConnector {
4029
4158
  return res.json();
4030
4159
  }
4031
4160
  };
4032
- function createConnector16() {
4161
+ function createConnector17() {
4033
4162
  return new MattermostConnector();
4034
4163
  }
4035
4164
 
@@ -4464,7 +4593,7 @@ function instanceToStatus(inst) {
4464
4593
  uptime_ms: Date.now() - new Date(inst.startedAt).getTime()
4465
4594
  };
4466
4595
  }
4467
- function createConnector17() {
4596
+ function createConnector18() {
4468
4597
  return new DevServerConnector();
4469
4598
  }
4470
4599
  var DEFAULT_PORT_RANGE = [14e3, 14099];
@@ -4708,7 +4837,7 @@ function instanceToStatus2(instance) {
4708
4837
  uptime_ms: Date.now() - new Date(instance.startedAt).getTime()
4709
4838
  };
4710
4839
  }
4711
- function createConnector18() {
4840
+ function createConnector19() {
4712
4841
  return new StaticServerConnector();
4713
4842
  }
4714
4843
 
@@ -4936,7 +5065,7 @@ async function spawnNgrokTunnel(port) {
4936
5065
  proc.kill();
4937
5066
  throw new Error("ngrok: timed out");
4938
5067
  }
4939
- function createConnector19() {
5068
+ function createConnector20() {
4940
5069
  return new TunnelConnector();
4941
5070
  }
4942
5071
  var DeployConnector = class extends AbstractConnector {
@@ -5162,7 +5291,7 @@ var DeployConnector = class extends AbstractConnector {
5162
5291
  };
5163
5292
  }
5164
5293
  };
5165
- function createConnector20() {
5294
+ function createConnector21() {
5166
5295
  return new DeployConnector();
5167
5296
  }
5168
5297
 
@@ -5196,21 +5325,22 @@ function registerBuiltinConnectors() {
5196
5325
  registerConnector("s3", () => createConnector4());
5197
5326
  registerConnector("webdav", () => createConnector5());
5198
5327
  registerConnector("sharepoint", () => createConnector6());
5199
- registerConnector("memory", () => createConnector7());
5200
- registerConnector("postgres", () => createConnector8());
5201
- registerConnector("redis", () => createConnector9());
5202
- registerConnector("sqlite", () => createConnector10());
5203
- registerConnector("minio", () => createConnector11());
5328
+ registerConnector("googledrive", () => createConnector7());
5329
+ registerConnector("memory", () => createConnector8());
5330
+ registerConnector("postgres", () => createConnector9());
5331
+ registerConnector("redis", () => createConnector10());
5332
+ registerConnector("sqlite", () => createConnector11());
5333
+ registerConnector("minio", () => createConnector12());
5204
5334
  registerConnector("flow", () => createConnector());
5205
- registerConnector("xstate", () => createConnector12());
5206
- registerConnector("xstate-store", () => createConnector13());
5207
- registerConnector("yjs", () => createConnector14());
5208
- registerConnector("devserver", () => createConnector17());
5209
- registerConnector("static", () => createConnector18());
5210
- registerConnector("tunnel", () => createConnector19());
5211
- registerConnector("deploy", () => createConnector20());
5212
- registerConnector("gmail", () => createConnector15());
5213
- registerConnector("mattermost", () => createConnector16());
5335
+ registerConnector("xstate", () => createConnector13());
5336
+ registerConnector("xstate-store", () => createConnector14());
5337
+ registerConnector("yjs", () => createConnector15());
5338
+ registerConnector("devserver", () => createConnector18());
5339
+ registerConnector("static", () => createConnector19());
5340
+ registerConnector("tunnel", () => createConnector20());
5341
+ registerConnector("deploy", () => createConnector21());
5342
+ registerConnector("gmail", () => createConnector16());
5343
+ registerConnector("mattermost", () => createConnector17());
5214
5344
  }
5215
5345
 
5216
5346
  // connectors/src/connector-types.ts
@@ -6613,6 +6743,34 @@ function isPackageResolvable(pkg, projectDir) {
6613
6743
  function findMissingPackages(packages, projectDir) {
6614
6744
  return packages.filter((p) => !isPackageResolvable(p, projectDir));
6615
6745
  }
6746
+ function isFleetManaged(connectorId) {
6747
+ const raw = process.env.SKAILE_FLEET_MANAGED_MOUNTS ?? "";
6748
+ if (raw.length === 0) return false;
6749
+ return raw.split(",").map((segment) => segment.trim()).filter((segment) => segment.length > 0).includes(connectorId);
6750
+ }
6751
+ async function ensureFleetMounted(dir, log, options) {
6752
+ const timeoutMs = options?.timeoutMs ?? 3e3;
6753
+ const pollIntervalMs = options?.pollIntervalMs ?? 100;
6754
+ const deadline = Date.now() + timeoutMs;
6755
+ let lastErr = null;
6756
+ while (Date.now() < deadline) {
6757
+ try {
6758
+ const st = await stat(dir);
6759
+ if (!st.isDirectory()) {
6760
+ throw new Error(`fleet mountpoint ${dir} is not a directory`);
6761
+ }
6762
+ await readdir(dir);
6763
+ log.info("fleet bind mount verified", { dir });
6764
+ return;
6765
+ } catch (err) {
6766
+ lastErr = err;
6767
+ await new Promise((resolve5) => setTimeout(resolve5, pollIntervalMs));
6768
+ }
6769
+ }
6770
+ throw new Error(
6771
+ `fleet mount ${dir} not ready after ${timeoutMs}ms \u2014 check SKAILE_FLEET_MANAGED_MOUNTS env var and host bind: ${lastErr instanceof Error ? lastErr.message : String(lastErr)}`
6772
+ );
6773
+ }
6616
6774
  function globToMatcher(pattern) {
6617
6775
  const segmentMatch = pattern.match(/^\*\*\/([^*/?]+)\/\*\*$/);
6618
6776
  if (segmentMatch) {
@@ -7723,6 +7881,6 @@ function createConnector() {
7723
7881
  return new FlowAdapter();
7724
7882
  }
7725
7883
 
7726
- export { AbstractConnector, ConnectorFieldMissingError, ConnectorManager, ConnectorStartupError, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, LocalConnector, LogBuffer, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, PostgresConnector, RedisConnector, S3Connector, SQLiteConnector, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, YjsConnector, atomicReplaceCredential, buildConnectorPromptSection, buildSdkConnectorTools, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector20, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createFsWatcher, createWorktree, defaultSpawn, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isPackageResolvable, listConnectors, listWorktrees, registerBuiltinConnectors, registerConnector, removeMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock };
7727
- //# sourceMappingURL=chunk-EAJKY27M.js.map
7728
- //# sourceMappingURL=chunk-EAJKY27M.js.map
7884
+ export { AbstractConnector, ConnectorFieldMissingError, ConnectorManager, ConnectorStartupError, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, PostgresConnector, RedisConnector, S3Connector, SQLiteConnector, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, YjsConnector, atomicReplaceCredential, buildConnectorPromptSection, buildSdkConnectorTools, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector20, createConnector21, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createFsWatcher, createWorktree, defaultSpawn, ensureFleetMounted, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, parseAuthBlob2 as parseAuthBlob, registerBuiltinConnectors, registerConnector, removeMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock };
7885
+ //# sourceMappingURL=chunk-HSOEX3TA.js.map
7886
+ //# sourceMappingURL=chunk-HSOEX3TA.js.map