@skaile/workspaces 0.28.1 → 0.29.1

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 (64) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/asset-manager/index.js +1 -1
  3. package/dist/{chunk-FBVUGRTU.js → chunk-72IA6BTP.js} +3 -3
  4. package/dist/{chunk-FBVUGRTU.js.map → chunk-72IA6BTP.js.map} +1 -1
  5. package/dist/{chunk-DGM74UP4.js → chunk-CMG3GJ6B.js} +35 -3
  6. package/dist/chunk-CMG3GJ6B.js.map +1 -0
  7. package/dist/{chunk-U5L6F5NZ.js → chunk-DVMSGGCM.js} +2 -2
  8. package/dist/{chunk-U5L6F5NZ.js.map → chunk-DVMSGGCM.js.map} +1 -1
  9. package/dist/{chunk-UAW7VRAL.js → chunk-LD4QIVBY.js} +2 -2
  10. package/dist/{chunk-UAW7VRAL.js.map → chunk-LD4QIVBY.js.map} +1 -1
  11. package/dist/{chunk-BSVLAHHH.js → chunk-MLJKA3S6.js} +118 -13
  12. package/dist/chunk-MLJKA3S6.js.map +1 -0
  13. package/dist/{chunk-XHBPQ7QP.js → chunk-OTFG5Q7H.js} +85 -46
  14. package/dist/chunk-OTFG5Q7H.js.map +1 -0
  15. package/dist/cli/index.js +6 -6
  16. package/dist/connectors/config.js +1 -1
  17. package/dist/connectors/index.js +2 -2
  18. package/dist/connectors/src/config.d.ts +46 -1
  19. package/dist/connectors/src/config.d.ts.map +1 -1
  20. package/dist/connectors/src/index.d.ts +1 -1
  21. package/dist/connectors/src/index.d.ts.map +1 -1
  22. package/dist/factory-assets/connectors/deploy.js +2 -2
  23. package/dist/factory-assets/connectors/devserver.js +2 -2
  24. package/dist/factory-assets/connectors/flow/adapter.js +2 -2
  25. package/dist/factory-assets/connectors/flow/run-flow.js +3 -3
  26. package/dist/factory-assets/connectors/flow.js +2 -2
  27. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
  28. package/dist/factory-assets/connectors/git.js +2 -2
  29. package/dist/factory-assets/connectors/gmail.js +2 -2
  30. package/dist/factory-assets/connectors/googledrive/driver.d.ts +0 -12
  31. package/dist/factory-assets/connectors/googledrive/driver.d.ts.map +1 -1
  32. package/dist/factory-assets/connectors/googledrive.js +2 -2
  33. package/dist/factory-assets/connectors/local.js +2 -2
  34. package/dist/factory-assets/connectors/mattermost.js +2 -2
  35. package/dist/factory-assets/connectors/memory.js +2 -2
  36. package/dist/factory-assets/connectors/minio.js +2 -2
  37. package/dist/factory-assets/connectors/postgres.js +2 -2
  38. package/dist/factory-assets/connectors/s3.js +2 -2
  39. package/dist/factory-assets/connectors/sharepoint/driver.d.ts.map +1 -1
  40. package/dist/factory-assets/connectors/sharepoint.js +2 -2
  41. package/dist/factory-assets/connectors/sqlite.js +2 -2
  42. package/dist/factory-assets/connectors/static-server.js +2 -2
  43. package/dist/factory-assets/connectors/tunnel.js +2 -2
  44. package/dist/factory-assets/connectors/webdav/driver.d.ts +2 -0
  45. package/dist/factory-assets/connectors/webdav/driver.d.ts.map +1 -1
  46. package/dist/factory-assets/connectors/webdav.js +2 -2
  47. package/dist/factory-assets/connectors/xstate-store.js +2 -2
  48. package/dist/factory-assets/connectors/xstate.js +2 -2
  49. package/dist/runner/index.js +4 -4
  50. package/dist/runner/src/capability-roundtrip.d.ts +23 -0
  51. package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
  52. package/dist/runner/src/runner-capabilities.d.ts.map +1 -1
  53. package/dist/runner/src/serve.d.ts.map +1 -1
  54. package/dist/runner/src/session-resource-handlers.d.ts +23 -0
  55. package/dist/runner/src/session-resource-handlers.d.ts.map +1 -0
  56. package/dist/sdk/asset-manager.js +1 -1
  57. package/dist/sdk/index.js +4 -4
  58. package/dist/sdk/runner.js +4 -4
  59. package/dist/tui/index.js +4 -4
  60. package/dist/workspace-plugin/index.js +1 -1
  61. package/package.json +1 -1
  62. package/dist/chunk-BSVLAHHH.js.map +0 -1
  63. package/dist/chunk-DGM74UP4.js.map +0 -1
  64. package/dist/chunk-XHBPQ7QP.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { renderWebDAVConfig, renderOneDriveConfig, renderGoogleDriveConfig } from './chunk-OVRSNIKJ.js';
2
- import { resolveAuthRef, resolveAuth } from './chunk-DGM74UP4.js';
2
+ import { resolveAuthRef, resolveAuth, resolveMountCredentialString } from './chunk-CMG3GJ6B.js';
3
3
  import { createFsWatcher, RcloneProcessManager, ensureDirMode, PortPool } from './chunk-QMONOHXT.js';
4
4
  import { pluginRegistry } from './chunk-6E6PKKAD.js';
5
5
  import { computeFlowStateFromSnapshots } from './chunk-W7W66MDZ.js';
@@ -103,6 +103,14 @@ function hasChanges(cwd) {
103
103
  const status = git("status --porcelain", cwd);
104
104
  return status.length > 0;
105
105
  }
106
+ function localBranchExists(branch, cwd) {
107
+ try {
108
+ git(`rev-parse --verify --quiet refs/heads/${branch}`, cwd);
109
+ return true;
110
+ } catch {
111
+ return false;
112
+ }
113
+ }
106
114
  function isDirEmpty(dir) {
107
115
  try {
108
116
  return readdirSync(dir).length === 0;
@@ -203,37 +211,42 @@ var GitConnector = class extends AbstractConnector {
203
211
  if (!isValidGitRefOrSha(sessionBranch)) {
204
212
  throw new Error(`Git connector: invalid session branch name "${sessionBranch}"`);
205
213
  }
206
- try {
207
- git(`rev-parse --verify origin/${sessionBranch}`, targetDir);
208
- git(`checkout -B ${sessionBranch} origin/${sessionBranch}`, targetDir);
209
- } catch {
210
- let anchored = false;
211
- if (session.fromRef) {
212
- if (!isValidGitRefOrSha(session.fromRef)) {
213
- this.log.warn("fromRef rejected by refname validation, falling back to base branch", {
214
- sessionBranch,
215
- fromRef: session.fromRef
216
- });
217
- } else {
218
- try {
219
- git(`fetch origin ${session.fromRef}`, targetDir);
220
- git(`checkout -b ${sessionBranch} FETCH_HEAD`, targetDir);
221
- anchored = true;
222
- this.log.info("session branch created from fromRef", {
214
+ if (localBranchExists(sessionBranch, targetDir)) {
215
+ git(`checkout ${sessionBranch}`, targetDir);
216
+ this.log.info("reusing existing local session branch", { sessionBranch });
217
+ } else {
218
+ try {
219
+ git(`rev-parse --verify origin/${sessionBranch}`, targetDir);
220
+ git(`checkout -B ${sessionBranch} origin/${sessionBranch}`, targetDir);
221
+ } catch {
222
+ let anchored = false;
223
+ if (session.fromRef) {
224
+ if (!isValidGitRefOrSha(session.fromRef)) {
225
+ this.log.warn("fromRef rejected by refname validation, falling back to base branch", {
223
226
  sessionBranch,
224
227
  fromRef: session.fromRef
225
228
  });
226
- } catch (err) {
227
- this.log.warn("fromRef fetch failed, falling back to base branch", {
228
- sessionBranch,
229
- fromRef: session.fromRef,
230
- error: err instanceof Error ? err.message : String(err)
231
- });
229
+ } else {
230
+ try {
231
+ git(`fetch origin ${session.fromRef}`, targetDir);
232
+ git(`checkout -b ${sessionBranch} FETCH_HEAD`, targetDir);
233
+ anchored = true;
234
+ this.log.info("session branch created from fromRef", {
235
+ sessionBranch,
236
+ fromRef: session.fromRef
237
+ });
238
+ } catch (err) {
239
+ this.log.warn("fromRef fetch failed, falling back to base branch", {
240
+ sessionBranch,
241
+ fromRef: session.fromRef,
242
+ error: err instanceof Error ? err.message : String(err)
243
+ });
244
+ }
232
245
  }
233
246
  }
234
- }
235
- if (!anchored) {
236
- git(`checkout -b ${sessionBranch}`, targetDir);
247
+ if (!anchored) {
248
+ git(`checkout -b ${sessionBranch}`, targetDir);
249
+ }
237
250
  }
238
251
  }
239
252
  syncSubmodules(targetDir);
@@ -1192,7 +1205,10 @@ var S3Connector = class extends AbstractConnector {
1192
1205
  function createConnector4(sdkOverride) {
1193
1206
  return new S3Connector(sdkOverride);
1194
1207
  }
1195
- var CACHE_BASE = "/var/cache/skaile";
1208
+ var DEFAULT_CACHE_BASE = "/var/cache/skaile";
1209
+ function cacheBase() {
1210
+ return process.env.SKAILE_RCLONE_CACHE_BASE ?? DEFAULT_CACHE_BASE;
1211
+ }
1196
1212
  var ALLOWED_VENDORS = /* @__PURE__ */ new Set([
1197
1213
  "nextcloud",
1198
1214
  "owncloud",
@@ -1202,6 +1218,13 @@ var ALLOWED_VENDORS = /* @__PURE__ */ new Set([
1202
1218
  ]);
1203
1219
  var execFileP = promisify(execFile);
1204
1220
  var WebDAVConnector = class extends AbstractConnector {
1221
+ // Injectable so tests can stub the `rclone obscure` shell-out; production
1222
+ // wires the real binary via createConnector().
1223
+ constructor(obscure = obscurePassword) {
1224
+ super();
1225
+ this.obscure = obscure;
1226
+ }
1227
+ obscure;
1205
1228
  name = "webdav";
1206
1229
  rclone = new RcloneProcessManager();
1207
1230
  filesystem = {
@@ -1216,6 +1239,7 @@ var WebDAVConnector = class extends AbstractConnector {
1216
1239
  throw new Error("WebDAVConnector requires ctx.mountTarget to be set by the manager");
1217
1240
  }
1218
1241
  const secrets = ctx.secrets;
1242
+ const tokenMediator = ctx.tokenMediator;
1219
1243
  const opts = declaration.options;
1220
1244
  this.log.info("mount called", {
1221
1245
  optionKeys: opts ? Object.keys(opts) : [],
@@ -1246,11 +1270,12 @@ var WebDAVConnector = class extends AbstractConnector {
1246
1270
  const vendor = vendorRaw;
1247
1271
  const basePath = String(opts?.basePath ?? "").replace(/^\/+|\/+$/g, "");
1248
1272
  const remotePath = basePath.length > 0 ? `/${basePath}` : "/";
1249
- const auth = parseAuth(resolveAuth(declaration.auth, secrets));
1250
- const obscuredPassword = auth.password ? await obscurePassword(auth.password) : null;
1273
+ const auth = parseAuth(await resolveMountCredentialString(declaration, secrets, tokenMediator));
1274
+ const obscuredPassword = auth.password ? await this.obscure(auth.password) : null;
1251
1275
  const remoteName = `skaile-${declaration.id}`;
1252
1276
  const remote = `${remoteName}:${remotePath}`;
1253
- const cacheDir = `${CACHE_BASE}/${declaration.id}`;
1277
+ const base = cacheBase();
1278
+ const cacheDir = `${base}/${declaration.id}`;
1254
1279
  const vfsCacheMode = declaration.access === "read-only" ? "minimal" : "full";
1255
1280
  this.log.info("mount params resolved", {
1256
1281
  url,
@@ -1268,7 +1293,7 @@ var WebDAVConnector = class extends AbstractConnector {
1268
1293
  obscuredPassword,
1269
1294
  bearerToken: auth.bearerToken
1270
1295
  });
1271
- await ensureDirMode(CACHE_BASE, this.log);
1296
+ await ensureDirMode(base, this.log);
1272
1297
  await ensureDirMode(cacheDir, this.log);
1273
1298
  await ensureDirMode(targetDir, this.log);
1274
1299
  const cacheMaxSize = opts?.cacheMaxSize !== void 0 ? String(opts.cacheMaxSize) : void 0;
@@ -1367,9 +1392,9 @@ async function obscurePassword(plain) {
1367
1392
  }
1368
1393
 
1369
1394
  // factory-assets/connectors/sharepoint/driver.ts
1370
- var DEFAULT_CACHE_BASE = "/var/cache/skaile";
1371
- function cacheBase() {
1372
- return process.env.SKAILE_RCLONE_CACHE_BASE ?? DEFAULT_CACHE_BASE;
1395
+ var DEFAULT_CACHE_BASE2 = "/var/cache/skaile";
1396
+ function cacheBase2() {
1397
+ return process.env.SKAILE_RCLONE_CACHE_BASE ?? DEFAULT_CACHE_BASE2;
1373
1398
  }
1374
1399
  var SharePointConnector = class extends AbstractConnector {
1375
1400
  name = "sharepoint";
@@ -1386,6 +1411,7 @@ var SharePointConnector = class extends AbstractConnector {
1386
1411
  throw new Error("SharePointConnector requires ctx.mountTarget to be set by the manager");
1387
1412
  }
1388
1413
  const secrets = ctx.secrets;
1414
+ const tokenMediator = ctx.tokenMediator;
1389
1415
  const opts = declaration.options;
1390
1416
  this.log.info("mount called", {
1391
1417
  optionKeys: opts ? Object.keys(opts) : []
@@ -1413,14 +1439,19 @@ var SharePointConnector = class extends AbstractConnector {
1413
1439
  );
1414
1440
  }
1415
1441
  const basePath = String(opts?.basePath ?? "").replace(/^\/+|\/+$/g, "");
1416
- const auth = parseAuthBlob(resolveAuth(declaration.auth, secrets), this.log);
1442
+ const auth = parseAuthBlob(
1443
+ await resolveMountCredentialString(declaration, secrets, tokenMediator),
1444
+ this.log
1445
+ );
1417
1446
  if (!auth.accessToken) {
1418
- throw new Error("SharePoint connector requires auth token (e.g. auth: env:SHAREPOINT_TOKEN)");
1447
+ throw new Error(
1448
+ "SharePoint connector: no access token resolved. Use 'auth: backend' (platform) or 'auth: env:SHAREPOINT_TOKEN' (standalone)."
1449
+ );
1419
1450
  }
1420
1451
  const remoteName = `skaile-${declaration.id}`;
1421
1452
  const remotePath = buildRemotePath(folderPath, basePath);
1422
1453
  const remote = `${remoteName}:${remotePath}`;
1423
- const base = cacheBase();
1454
+ const base = cacheBase2();
1424
1455
  const cacheDir = `${base}/${declaration.id}`;
1425
1456
  const vfsCacheMode = declaration.access === "read-only" ? "minimal" : "full";
1426
1457
  this.log.info("mount params resolved", {
@@ -1552,7 +1583,10 @@ function buildRemotePath(folderPath, basePath) {
1552
1583
  }
1553
1584
 
1554
1585
  // factory-assets/connectors/googledrive/driver.ts
1555
- var CACHE_BASE2 = "/var/cache/skaile";
1586
+ var DEFAULT_CACHE_BASE3 = "/var/cache/skaile";
1587
+ function cacheBase3() {
1588
+ return process.env.SKAILE_RCLONE_CACHE_BASE ?? DEFAULT_CACHE_BASE3;
1589
+ }
1556
1590
  var ALLOWED_SCOPES = /* @__PURE__ */ new Set([
1557
1591
  "drive",
1558
1592
  "drive.readonly",
@@ -1575,6 +1609,7 @@ var GoogleDriveConnector = class extends AbstractConnector {
1575
1609
  throw new Error("GoogleDriveConnector requires ctx.mountTarget to be set by the manager");
1576
1610
  }
1577
1611
  const secrets = ctx.secrets;
1612
+ const tokenMediator = ctx.tokenMediator;
1578
1613
  const opts = declaration.options;
1579
1614
  this.log.info("mount called", {
1580
1615
  optionKeys: opts ? Object.keys(opts) : []
@@ -1598,10 +1633,13 @@ var GoogleDriveConnector = class extends AbstractConnector {
1598
1633
  );
1599
1634
  }
1600
1635
  const scope = scopeRaw;
1601
- const auth = parseAuthBlob2(resolveAuth(declaration.auth, secrets), this.log);
1636
+ const auth = parseAuthBlob2(
1637
+ await resolveMountCredentialString(declaration, secrets, tokenMediator),
1638
+ this.log
1639
+ );
1602
1640
  if (!auth.accessToken && !auth.serviceAccountFile) {
1603
1641
  throw new Error(
1604
- "Google Drive connector requires auth token or serviceAccountFile (e.g. auth: env:GDRIVE_TOKEN)"
1642
+ "Google Drive connector: no access token or serviceAccountFile resolved. Use 'auth: backend' (platform) or 'auth: env:GDRIVE_TOKEN' (standalone)."
1605
1643
  );
1606
1644
  }
1607
1645
  const rootFolderId = opts?.rootFolderId !== void 0 ? String(opts.rootFolderId) : null;
@@ -1610,7 +1648,8 @@ var GoogleDriveConnector = class extends AbstractConnector {
1610
1648
  const remoteName = `skaile-${declaration.id}`;
1611
1649
  const remotePath = basePath.length > 0 ? `/${basePath}` : "/";
1612
1650
  const remote = `${remoteName}:${remotePath}`;
1613
- const cacheDir = `${CACHE_BASE2}/${declaration.id}`;
1651
+ const base = cacheBase3();
1652
+ const cacheDir = `${base}/${declaration.id}`;
1614
1653
  const vfsCacheMode = declaration.access === "read-only" ? "minimal" : "full";
1615
1654
  this.log.info("mount params resolved", {
1616
1655
  scope,
@@ -1633,7 +1672,7 @@ var GoogleDriveConnector = class extends AbstractConnector {
1633
1672
  teamDrive,
1634
1673
  serviceAccountFile: auth.serviceAccountFile
1635
1674
  });
1636
- await ensureDirMode(CACHE_BASE2, this.log);
1675
+ await ensureDirMode(base, this.log);
1637
1676
  await ensureDirMode(cacheDir, this.log);
1638
1677
  await ensureDirMode(targetDir, this.log);
1639
1678
  const cacheMaxSize = opts?.cacheMaxSize !== void 0 ? String(opts.cacheMaxSize) : void 0;
@@ -7795,6 +7834,6 @@ function createConnector() {
7795
7834
  return new FlowAdapter();
7796
7835
  }
7797
7836
 
7798
- export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, ConnectorFieldMissingError, ConnectorManager, ConnectorStartupError, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, NOT_READY_SENTINEL, PostgresConnector, RoMountPlaceholderBarrier, S3Connector, SQLiteConnector, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, atomicReplaceCredential, buildConnectorPromptSection, buildSdkConnectorTools, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createWorktree, defaultMountPlaceholderBarrier, defaultSpawn, ensureFleetMounted, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, parseAuthBlob2 as parseAuthBlob, registerBuiltinConnectors, removeMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock };
7799
- //# sourceMappingURL=chunk-XHBPQ7QP.js.map
7800
- //# sourceMappingURL=chunk-XHBPQ7QP.js.map
7837
+ export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, ConnectorFieldMissingError, ConnectorManager, ConnectorStartupError, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, NOT_READY_SENTINEL, PostgresConnector, RoMountPlaceholderBarrier, S3Connector, SQLiteConnector, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, atomicReplaceCredential, buildConnectorPromptSection, buildSdkConnectorTools, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createWorktree, defaultMountPlaceholderBarrier, defaultSpawn, ensureFleetMounted, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, registerBuiltinConnectors, removeMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock };
7838
+ //# sourceMappingURL=chunk-OTFG5Q7H.js.map
7839
+ //# sourceMappingURL=chunk-OTFG5Q7H.js.map