@skaile/workspaces 0.37.0 → 0.39.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 (73) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/asset-manager/index.js +1 -1
  3. package/dist/{chunk-3HR6IN5B.js → chunk-CMZWYMGD.js} +44 -15
  4. package/dist/chunk-CMZWYMGD.js.map +1 -0
  5. package/dist/{chunk-ZSFWJAFD.js → chunk-FZL6QOM7.js} +3 -3
  6. package/dist/{chunk-ZSFWJAFD.js.map → chunk-FZL6QOM7.js.map} +1 -1
  7. package/dist/{chunk-CCQ3EMJT.js → chunk-LJIE3PGF.js} +2 -2
  8. package/dist/{chunk-CCQ3EMJT.js.map → chunk-LJIE3PGF.js.map} +1 -1
  9. package/dist/{chunk-XT6AZWK3.js → chunk-P7CIT445.js} +18 -2
  10. package/dist/chunk-P7CIT445.js.map +1 -0
  11. package/dist/{chunk-DAEYSPOC.js → chunk-W23HDR6W.js} +117 -37
  12. package/dist/chunk-W23HDR6W.js.map +1 -0
  13. package/dist/{chunk-CC5ZHSHJ.js → chunk-WLWHOA3S.js} +81 -5
  14. package/dist/chunk-WLWHOA3S.js.map +1 -0
  15. package/dist/{chunk-RNFNWOKZ.js → chunk-WVWX76IB.js} +2 -2
  16. package/dist/{chunk-RNFNWOKZ.js.map → chunk-WVWX76IB.js.map} +1 -1
  17. package/dist/cli/index.js +7 -7
  18. package/dist/connectors/config.js +1 -1
  19. package/dist/connectors/index.js +3 -3
  20. package/dist/connectors/rclone.js +1 -1
  21. package/dist/connectors/src/config.d.ts +3 -1
  22. package/dist/connectors/src/config.d.ts.map +1 -1
  23. package/dist/connectors/src/connector-manager.d.ts +1 -1
  24. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  25. package/dist/connectors/src/connector-types.d.ts +5 -1
  26. package/dist/connectors/src/connector-types.d.ts.map +1 -1
  27. package/dist/connectors/src/index.d.ts +1 -0
  28. package/dist/connectors/src/index.d.ts.map +1 -1
  29. package/dist/connectors/src/materialized-connectors.d.ts +8 -0
  30. package/dist/connectors/src/materialized-connectors.d.ts.map +1 -0
  31. package/dist/connectors/src/rclone-process-manager.d.ts.map +1 -1
  32. package/dist/factory-assets/connectors/deploy.js +3 -3
  33. package/dist/factory-assets/connectors/devserver.js +3 -3
  34. package/dist/factory-assets/connectors/flow/adapter.js +3 -3
  35. package/dist/factory-assets/connectors/flow/run-flow.js +4 -4
  36. package/dist/factory-assets/connectors/flow.js +3 -3
  37. package/dist/factory-assets/connectors/git/driver.d.ts +3 -0
  38. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
  39. package/dist/factory-assets/connectors/git.js +3 -3
  40. package/dist/factory-assets/connectors/gmail.js +3 -3
  41. package/dist/factory-assets/connectors/googledrive.js +3 -3
  42. package/dist/factory-assets/connectors/local.js +3 -3
  43. package/dist/factory-assets/connectors/mattermost.js +3 -3
  44. package/dist/factory-assets/connectors/memory.js +3 -3
  45. package/dist/factory-assets/connectors/minio.js +3 -3
  46. package/dist/factory-assets/connectors/postgres/adapter.d.ts.map +1 -1
  47. package/dist/factory-assets/connectors/postgres.js +3 -3
  48. package/dist/factory-assets/connectors/s3.js +3 -3
  49. package/dist/factory-assets/connectors/sharepoint.js +3 -3
  50. package/dist/factory-assets/connectors/sqlite.js +3 -3
  51. package/dist/factory-assets/connectors/static-server.js +3 -3
  52. package/dist/factory-assets/connectors/tunnel.js +3 -3
  53. package/dist/factory-assets/connectors/webdav.js +3 -3
  54. package/dist/factory-assets/connectors/xstate-store.js +3 -3
  55. package/dist/factory-assets/connectors/xstate.js +3 -3
  56. package/dist/runner/index.js +5 -5
  57. package/dist/runner/src/resource-handler.d.ts +6 -0
  58. package/dist/runner/src/resource-handler.d.ts.map +1 -1
  59. package/dist/runner/src/runner-capabilities.d.ts +8 -0
  60. package/dist/runner/src/runner-capabilities.d.ts.map +1 -1
  61. package/dist/runner/src/serve.d.ts.map +1 -1
  62. package/dist/runner/src/session-resource-handlers.d.ts +25 -12
  63. package/dist/runner/src/session-resource-handlers.d.ts.map +1 -1
  64. package/dist/sdk/asset-manager.js +1 -1
  65. package/dist/sdk/index.js +5 -5
  66. package/dist/sdk/runner.js +5 -5
  67. package/dist/tui/index.js +5 -5
  68. package/dist/workspace-plugin/index.js +1 -1
  69. package/package.json +1 -1
  70. package/dist/chunk-3HR6IN5B.js.map +0 -1
  71. package/dist/chunk-CC5ZHSHJ.js.map +0 -1
  72. package/dist/chunk-DAEYSPOC.js.map +0 -1
  73. package/dist/chunk-XT6AZWK3.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,49 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.39.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#152](https://github.com/skaile-ai/workspaces/pull/152) [`630af66`](https://github.com/skaile-ai/workspaces/commit/630af66a84918830e86ca643b9a2320e259bea33) Thanks [@peteralbert](https://github.com/peteralbert)! - Backend-auth materialized connectors now authenticate end-to-end, off-disk. The credential is delivered through the in-memory `session_init` channel — `cmd.credentials.connectors[<id>]` at boot/wake and a new optional `runner.attach_instance.preMintedToken` on live-attach — and staged into `PreMintedSecretProvider` under `connector:<id>`. Tool-face connectors now receive the wrapped token mediator (previously filesystem-face only), so a tool-face connector (e.g. postgres) resolves its `auth: backend` credential via `ctx.tokenMediator`. The connector secret is no longer read from `.instance.json` (`readResolvedConnectorSecret` removed) — credentials never touch disk.
8
+
9
+ ### Patch Changes
10
+
11
+ - [#150](https://github.com/skaile-ai/workspaces/pull/150) [`e0cc721`](https://github.com/skaile-ai/workspaces/commit/e0cc7211c01dd96893d00c163ad799e2c744a098) Thanks [@Frozen666](https://github.com/Frozen666)! - fix(git-connector): publish session branch to origin on create (B-142)
12
+
13
+ A non-main git session created its session branch locally but never pushed it,
14
+ so peers and other sessions couldn't see the branch until a clean
15
+ hibernate/close (and never with the default `pushAfterCommit=false`). Add a
16
+ `lifecycle.publishOnCreate` flag (default `true`) that best-effort
17
+ `push -u origin <branch>` on the branch-creation paths only (not reuse-local or
18
+ checkout-from-origin), swallowing failures so `connect` never fails; the
19
+ lifecycle push hooks remain the backstop.
20
+
21
+ - [#149](https://github.com/skaile-ai/workspaces/pull/149) [`3c604d0`](https://github.com/skaile-ai/workspaces/commit/3c604d0725299f257ad0753760bea14d2ca4c87d) Thanks [@Frozen666](https://github.com/Frozen666)! - fix(runner): strip stale tail after `</html>` in mount HTML reads
22
+
23
+ A writable rclone mount can serve a non-truncated VFS cache item — a clean
24
+ document followed by the leftover tail of an older, longer version of the same
25
+ file (which carries its own duplicate closing tags). The mount read now truncates
26
+ `text/html` content at the first `</html>`, so neither the workspace HTML preview
27
+ nor the agent sees the garbled trailing fragment. Mitigation for the SharePoint
28
+ preview corruption; the underlying rclone VFS cause is tracked separately.
29
+
30
+ ## 0.38.0
31
+
32
+ ### Minor Changes
33
+
34
+ - [#147](https://github.com/skaile-ai/workspaces/pull/147) [`9a77b0c`](https://github.com/skaile-ai/workspaces/commit/9a77b0c3f6c6d3ff24245e778efbf75e432b7976) Thanks [@peteralbert](https://github.com/peteralbert)! - feat(connectors): wire library-assigned connectors to the runtime (Phase 2.5).
35
+
36
+ Materialized `.skaile/assets/connector/<name>/CONNECTOR.md` projections are now
37
+ derived into ConnectorDeclarations at boot (`loadConnectorDeclarations` merges
38
+ them alongside `skaile.yaml` connectors), and `runner.attach_instance` supports
39
+ `kind: "connector"` (materialize-then-attach-by-ref → `ConnectorManager.connect`).
40
+ Symmetric with the MCP live-attach path. Connectors stay first-party (driver
41
+ resolved by name).
42
+
43
+ ### Patch Changes
44
+
45
+ - [#146](https://github.com/skaile-ai/workspaces/pull/146) [`0b8edfd`](https://github.com/skaile-ai/workspaces/commit/0b8edfd530a27b7f08cea7899b384f97edbc4dde) Thanks [@peteralbert](https://github.com/peteralbert)! - rclone fleet hardening: spawn the rclone rc server with `--rc-no-auth` (loopback-only) so the flush-before-stop `POST /vfs/refresh` no longer 403s — graceful stop drains the write-back cache instead of leaving it poisoned. Surface non-retryable `itemNotFound` upload failures immediately via the existing stuck-upload signal (the remote target is gone; retrying can never land). Create `.skaile/fleet-health/` group-writable + setgid (`0o2770`) so the platform backend can write the verdict flag the runner reads.
46
+
3
47
  ## 0.37.0
4
48
 
5
49
  ### Minor Changes
@@ -1,4 +1,4 @@
1
- export { AssetManager, parseCanonicalLockKey } from '../chunk-RNFNWOKZ.js';
1
+ export { AssetManager, parseCanonicalLockKey } from '../chunk-WVWX76IB.js';
2
2
  export { createScaffold, deployAll, installAgent, removeAsset } from '../chunk-4A2LAEX6.js';
3
3
  import '../chunk-FBIQ4QPF.js';
4
4
  import '../chunk-CFCSDZYF.js';
@@ -1,6 +1,6 @@
1
1
  import { renderGoogleDriveConfig, renderOneDriveConfig, renderWebDAVConfig } from './chunk-OVRSNIKJ.js';
2
- import { resolveAuthRef, resolveAuth, resolveMountCredentialString, resolveMountCredential } from './chunk-CC5ZHSHJ.js';
3
- import { PortPool, createFsWatcher, RcloneProcessManager, ensureDirMode } from './chunk-XT6AZWK3.js';
2
+ import { resolveAuthRef, resolveAuth, resolveMountCredentialString, resolveMountCredential } from './chunk-WLWHOA3S.js';
3
+ import { PortPool, createFsWatcher, RcloneProcessManager, ensureDirMode } from './chunk-P7CIT445.js';
4
4
  import { pluginRegistry } from './chunk-6E6PKKAD.js';
5
5
  import { computeFlowStateFromSnapshots } from './chunk-X46FY45B.js';
6
6
  import { renderStimulusPrompt } from './chunk-DEYYRFQU.js';
@@ -722,7 +722,8 @@ var LEGACY_DEFAULTS = {
722
722
  mergeOnClose: true,
723
723
  pushOnClose: true,
724
724
  autoCommitIdleMs: 3e4,
725
- pushAfterCommit: false
725
+ pushAfterCommit: false,
726
+ publishOnCreate: true
726
727
  }
727
728
  };
728
729
  var MODE_DEFAULTS = {
@@ -773,7 +774,8 @@ function parseLifecycleConfig(opts, defaults) {
773
774
  mergeOnClose: Boolean(raw.mergeOnClose ?? defaults.mergeOnClose),
774
775
  pushOnClose: Boolean(raw.pushOnClose ?? defaults.pushOnClose),
775
776
  autoCommitIdleMs: Number(raw.autoCommitIdleMs ?? defaults.autoCommitIdleMs),
776
- pushAfterCommit: Boolean(raw.pushAfterCommit ?? defaults.pushAfterCommit)
777
+ pushAfterCommit: Boolean(raw.pushAfterCommit ?? defaults.pushAfterCommit),
778
+ publishOnCreate: Boolean(raw.publishOnCreate ?? defaults.publishOnCreate)
777
779
  };
778
780
  }
779
781
  function resolveGitConfig(args) {
@@ -969,22 +971,40 @@ var GitConnector = class extends AbstractConnector {
969
971
  if (!isValidGitRefOrSha(sessionBranch)) {
970
972
  throw new Error(`Git connector: invalid session branch name "${sessionBranch}"`);
971
973
  }
974
+ let created = false;
972
975
  if (localBranchExists(sessionBranch, targetDir)) {
973
976
  git(`checkout ${sessionBranch}`, targetDir);
974
977
  this.log.info("reusing existing local session branch", { sessionBranch });
975
978
  } else {
979
+ let originHasBranch = false;
976
980
  try {
977
981
  git(`rev-parse --verify origin/${sessionBranch}`, targetDir);
978
- git(`checkout -B ${sessionBranch} origin/${sessionBranch}`, targetDir);
982
+ originHasBranch = true;
979
983
  } catch {
980
- if (!this.branchFromRef(session, sessionBranch, targetDir)) {
981
- git(`checkout -b ${sessionBranch}`, targetDir);
982
- }
984
+ }
985
+ if (originHasBranch) {
986
+ git(`checkout -B ${sessionBranch} origin/${sessionBranch}`, targetDir);
987
+ } else if (!this.branchFromRef(session, sessionBranch, targetDir)) {
988
+ git(`checkout -b ${sessionBranch}`, targetDir);
989
+ created = true;
990
+ } else {
991
+ created = true;
983
992
  }
984
993
  }
985
994
  syncSubmodules(targetDir);
986
995
  state.activeBranch = sessionBranch;
987
996
  this.log.info("session branch checked out", { sessionBranch });
997
+ if (created && state.lifecycle.publishOnCreate) {
998
+ try {
999
+ git(`push -u origin ${sessionBranch}`, targetDir, 6e4);
1000
+ this.log.info("published new session branch", { sessionBranch });
1001
+ } catch (err) {
1002
+ this.log.warn("publish-on-create push failed; deferring to lifecycle push", {
1003
+ sessionBranch,
1004
+ error: err instanceof Error ? err.message : String(err)
1005
+ });
1006
+ }
1007
+ }
988
1008
  }
989
1009
  /**
990
1010
  * Attempt to create `sessionBranch` anchored on `session.fromRef`. Returns
@@ -3069,7 +3089,16 @@ var PostgresConnector = class extends AbstractConnector {
3069
3089
  }
3070
3090
  async connect(declaration, ctx) {
3071
3091
  const started = Date.now();
3072
- const dsn = ctx.resolvedFields?.dsn ?? resolveAuth(declaration.auth, ctx.secrets) ?? String(declaration.options?.dsn ?? "");
3092
+ let dsn = ctx.resolvedFields?.dsn ?? String(declaration.options?.dsn ?? "");
3093
+ if (!dsn && declaration.auth === "backend" && ctx.tokenMediator) {
3094
+ const mint = await ctx.tokenMediator({ connectorId: declaration.id, reason: "initial" });
3095
+ if (mint.ok) dsn = mint.token;
3096
+ else
3097
+ throw new Error(
3098
+ `PostgresAdapter '${declaration.id}': backend credential ${mint.code} \u2014 ${mint.message}`
3099
+ );
3100
+ }
3101
+ if (!dsn) dsn = resolveAuth(declaration.auth, ctx.secrets) ?? "";
3073
3102
  if (!dsn) {
3074
3103
  this.log.error("connect failed: missing dsn", void 0);
3075
3104
  throw new Error("PostgresAdapter requires auth (connection string) or options.dsn");
@@ -5811,10 +5840,11 @@ var ConnectorManager = class {
5811
5840
  async buildConnectContext(declaration, connector) {
5812
5841
  const ctx = {
5813
5842
  secrets: this.chain ?? this.secrets,
5814
- tokenMediator: void 0,
5843
+ // Both filesystem and tool faces use this for the auth: backend initial-mint path.
5844
+ tokenMediator: this.buildWrappedMediator(),
5815
5845
  abortSignal: this.disposeController.signal
5816
5846
  };
5817
- if (this.chain && connector.describeFields) {
5847
+ if (this.chain && connector.describeFields && declaration.auth !== "backend") {
5818
5848
  const fields = connector.describeFields();
5819
5849
  ctx.resolvedFields = await resolveFields(declaration, fields, this.chain);
5820
5850
  }
@@ -5822,7 +5852,6 @@ var ConnectorManager = class {
5822
5852
  const absPath = this.resolveMountTarget(declaration);
5823
5853
  if (!existsSync(absPath)) mkdirSync(absPath, { recursive: true });
5824
5854
  ctx.mountTarget = absPath;
5825
- ctx.tokenMediator = this.buildWrappedMediator();
5826
5855
  }
5827
5856
  return ctx;
5828
5857
  }
@@ -5856,7 +5885,7 @@ var ConnectorManager = class {
5856
5885
  * 1. Resolves the `Connector` from the registry (or catalog).
5857
5886
  * 2. Calls `setLogger` when available.
5858
5887
  * 3. Resolves fields via `describeFields()` + secret chain.
5859
- * 4. For filesystem-face connectors: allocates mount-target dir, wraps mediator.
5888
+ * 4. For filesystem-face connectors: allocates mount-target dir.
5860
5889
  * 5. Calls `connector.connect(decl, ctx)`.
5861
5890
  * 6. Tracks in the active map; emits `onStatusChange`.
5862
5891
  *
@@ -8387,5 +8416,5 @@ function createConnector() {
8387
8416
  }
8388
8417
 
8389
8418
  export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, ConnectorFieldMissingError, ConnectorManager, ConnectorStartupError, DEFAULT_REACTIVE_COOLDOWN_MS, DeployConnector, DevServerConnector, FleetHealthGate, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, NOT_READY_SENTINEL, PROACTIVE_RCLONE_REFRESH_MARGIN_MS, PostgresConnector, RoMountPlaceholderBarrier, S3Connector, SQLiteConnector, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, __test, atomicReplaceCredential, buildConnectorPromptSection, buildSdkConnectorTools, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createRcloneTokenRefresh, createWorktree, defaultMountPlaceholderBarrier, defaultSpawn, ensureFleetMounted, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, probeFleetHealth, registerBuiltinConnectors, removeMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock };
8390
- //# sourceMappingURL=chunk-3HR6IN5B.js.map
8391
- //# sourceMappingURL=chunk-3HR6IN5B.js.map
8419
+ //# sourceMappingURL=chunk-CMZWYMGD.js.map
8420
+ //# sourceMappingURL=chunk-CMZWYMGD.js.map