Skip to content

Releases: GooDAnDReaDY/dsh-time-machine

v0.1.31 [DSH v0.2.1-rc.2]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 22 Oct 16:13

Security

  • Canonical DSH session authentication & fail-closed LAN guard (#99): Integrated getConnection(ctx) and delegated request verification to DSH core service connection.requestRejection(request) across all 7 HTTP web routes (/snapshots, /diff, /create, /delete, /prune, /rollback, /rollback-file) and the plugin updater (lib/updater.js). Unauthenticated LAN clients and reverse-proxy requests lacking DSH session authentication are rejected with HTTP 401 Unauthorized / 403 Forbidden fail-closed, preventing unauthorized remote execution of snapshot rollback, deletion, pruning, creation, and inspection.
  • Fail-closed network boundary when auth service is absent (#99): In environments where the DSH connection service is not registered, all non-loopback requests from LAN or WAN are rejected with HTTP 401 Unauthorized, eliminating the possibility of spoofing Origin, Host, or Sec-Fetch-Site headers to bypass guards.

Added

  • Authentication & session verification test suite (#99): Added comprehensive test coverage in test/http-updater-routes.test.mjs verifying getConnection(ctx) context resolution, assertTrustedSettingsRequest auth status matrix (401/403/fail-closed/admitted), mutating route protection against unauthenticated LAN callers, and updater rejection gating. Total test count expanded to 82 passing tests.

Verification

  • Unit tests: 82/82 passed (100% pass rate).
  • Preflight: FAIL=0, WARN=3.
  • Tested and verified on DeepSeek Harness production environment.

Provenance

  • Gitea commit: 3d5accb497fb0407b8799beebe012b9711d6ed25
  • Mirror commit: 24e1749f66f14568ad2e6861c0c7b426547792cd

v0.1.30 [DSH v0.2.1-rc.2]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 19 Oct 07:43

Fixed

  • Lossless JSON compliance in non-git workspaces (#96, GitHub #8): Fixed an issue where time_machine_* tools (time_machine_checkpoint_create, time_machine_checkpoint_list, etc.) failed with value is not lossless JSON when executed in a workspace without an initialized Git repository. In ShadowSnapshotEngine (lib/snapshot.js), cwd property is now omitted when hasGit is false instead of being assigned undefined.
  • Eliminated explicit undefined in rollback results (#96): In _doRollbackSnapshot, preRollbackId and preRollbackSnapshot are now conditionally attached only when a pre-rollback checkpoint actually exists, preventing undefined property values from breaking lossless JSON serialization.

Added

  • Comprehensive lossless JSON regression tests (#96): Added unit test suite in test/dsh-time-machine.test.mjs verifying strict lossless JSON round-tripping for non-git checkpoint creation, list operations, and selective rollbacks, expanding the test suite to 78 passing tests.

Verification

  • Unit tests: 78/78 passed (100% pass rate).
  • Preflight: FAIL=0.
  • Tested and verified on DeepSeek Harness production environment.

v0.1.29

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 15 Oct 14:42

Security

  • Strict rollback workspace validation (#93): rollbackSnapshot and rollbackFile in ShadowSnapshotEngine now strictly validate any caller-supplied cwd against the snapshot's recorded workspace (snap.cwd). If a foreign or mismatched directory is supplied, the operation immediately aborts with Target workspace mismatch, preventing execution of git read-tree, checkout-index, and git clean -fd in arbitrary repositories on disk.
  • Enforce private network subnet check on Origin auth (#93): isTrustedSettingsRequest now explicitly verifies that the remote client connection originates from loopback (127.0.0.1, ::1) or private RFC1918 subnets (192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12). Inbound requests from public WAN addresses are rejected with 403 Forbidden even if Host and Origin headers match.

Added

  • Regression test coverage (#93): Added unit tests for foreign cwd rejection in test/dsh-time-machine.test.mjs and WAN IP rejection in test/http-updater-routes.test.mjs, expanding the test suite to 77 passing tests.

Changed

  • Pinned npm registry in publishConfig (#93): Explicitly configured registry: "https://registry.npmjs.org/" in package.json publishConfig.

Verification

  • Unit tests: 77/77 passed (100% pass rate).
  • Preflight: FAIL=0.
  • Verified on DSH test server and production environments.

v0.1.28

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 09 Oct 09:06

Security

  • Sanitize HTTP Host header and reject header spoofing (#82): isTrustedSettingsRequest strictly inspects the verified Host header, eliminating trust in spoofable X-Forwarded-Host. Requests without origin/referer headers are now strictly restricted to loopback addresses, preventing LAN clients from bypassing CSRF protection.

Added

  • Automatic pre-rollback snapshot protection (#81): rollbackSnapshot now automatically creates a pre-rollback checkpoint before executing destructive git clean -fd and index resets. Both modified and untracked files are preserved, returning preRollbackId in the response and surfacing recovery notices in the web interface.
  • Comprehensive test suite (#84): Added test/http-updater-routes.test.mjs providing exhaustive coverage for writeJson, readBody, the complete CSRF vector matrix, updater semver/security validation, and mutating web routes (405 Method Not Allowed, 403 Forbidden, 400 Bad Request). Total test count expanded to 76 tests.

Changed

  • Unified plugin logging (#77): Passed ctx.logger into ShadowSnapshotEngine and migrated all 18 host-side diagnostic warnings and errors from raw console.* to structured plugin logging.
  • Package distribution files (#83): Added localized README.zh.md and README.ru.md documentation files to the npm package files declaration.
  • Repository cleanup (#85): Removed extraneous = artifact file from the Git repository root.

Verification

  • Unit tests: 76/76 passed (100% pass rate).
  • Preflight: FAIL=0.
  • Verified on DSH 0.2.0-rc.2 test server and confirmed web endpoints (GET /dsh-time-machine/snapshots HTTP 200).

v0.1.27

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 06 Oct 22:37

Fixed

  • Tool calls without cwd / sessionId now reliably resolve active workspaces (#7):
    • In tool calls such as time_machine_checkpoint_create or time_machine_file_rollback where LLMs or clients omit cwd or sessionId, the plugin now resolves workspace paths via execution.agent.session, execution.agent.workspace, session event history, and active workspace tracking, eliminating silent fallbacks to process root and memory-only degradation.
    • Snapshots now track their originating workspace (snap.cwd), so rollback, diff, and delete operations automatically resolve the correct target workspace even when callers omit the workspace path.
  • Explicit warning on memory-only checkpoints: Added diagnostic feedback (warning: "Target path is not a Git repository...") when manual checkpoints fall back to memory-only mode.
  • Support volatile config accessors on initialization: Wrapped plugin config resolution with plainConfig to handle volatile boxed accessors in DSH core.

Verification

  • Unit tests: 64/64 passed (100% pass rate).
  • Preflight: FAIL=0.
  • Verified on DSH 0.2.0-rc.2 test server and confirmed web endpoints (GET /dsh-time-machine/snapshots HTTP 200).

v0.1.26

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 03 Oct 16:39

Fixed

  • Silent degradation to memory-only snapshots on DSH 0.2.0-rc.2 (#7): cwdOf() now resolves workspaces across kernel variations by checking ctx.workspaceRegistry (.current, .active, .list), session.workspace.path, and execution.path/execution.workspacePath.
  • Explicit warning when snapshot target is not a Git repository: Prevents silent degradation to memory-only snapshots without diagnostic feedback when auto-snapshots run outside a Git workspace.
  • Rollback file index cleanup: Added explicit Git staging index reset (git reset HEAD -- <path>) following file rollbacks so files do not remain staged in the index.

Verification

  • Unit tests: 63/63 passed (100% pass rate).
  • Preflight: FAIL=0.
  • Tested on DSH 0.2.0-rc.2 test server and verified web endpoints (GET /dsh-time-machine/snapshots HTTP 200).

v0.1.25

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 30 Sep 20:14

Fixed

  • Crash on startup and first turn on DSH 0.1.7+/0.2.0 due to DataCloneError (#6): volatile schema fields in config are passed into apply(ctx, config) as accessor objects with get() functions. Calling structuredClone(config) threw DataCloneError, preventing engine.setMax from applying and crashing the host turn on turn/start. Volatile accessors are now safely unwrapped with plainConfig before schema evaluation.

Verification

  • Unit tests: 61/61 passed (100% pass rate).
  • Preflight: FAIL=0.
  • Tested on DSH 0.2.0-rc.2 test server and production contours.

v0.1.22

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 26 Sep 18:48

Security

  • Strict path traversal and symlink escape protection in selective rollback: rollbackFile now strictly rejects absolute paths, .. directory traversal attempts, and symlink escapes outside the repository workspace before invoking Git checkout or unlinking files (#65).
  • Hardened HTTP trust validation against same-site requests: isTrustedSettingsRequest now categorically rejects sec-fetch-site: same-site requests, enforces verified Origin or Referer headers matching the server Host for all non-loopback clients, and restricts unauthenticated requests strictly to local loopback (#38).

v0.1.21

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 23 Sep 15:53

Security

  • Hardened HTTP settings & web routes validation: improved isTrustedSettingsRequest to reject Sec-Fetch-Site: cross-site, validated Origin/Referer headers against Host and X-Forwarded-Host, and removed unverified token fallbacks. Added isTrustedSettingsRequest protection to GET /dsh-time-machine/snapshots and GET /dsh-time-machine/diff (#59, #60).

Fixed

  • Cleanup orphaned indices in non-git directories: cleanupOrphanedIndices now safely verifies whether the working directory is a git repository before invoking git rev-parse --git-dir, preventing fatal git errors during startup in non-git directories (#57, #61).
  • Descriptive rollback errors without git commit: rollbackSnapshot and rollbackFile now fail with an explicit error if a target snapshot lacks an associated git commit, avoiding false success (#58).
  • Session snapshot limits on turn end: event listener for turn/end now respects the configured maxSnapshots limit instead of truncating history to 3 snapshots (#56).

Performance

  • Optimized snapshot creation: added skipIfNoChanges fast check using git status --porcelain and HEAD verification to avoid redundant git add -A and object writes on clean trees, plus label newline sanitization (#55).

Release

  • Canonical GitHub mirror publishing script: added executable scripts/publish-github.sh with --check dry-run and sanitized tree packaging for mirror synchronization (#53).

v0.1.20

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 19 Sep 22:25

Full Changelog: v0.1.18...v0.1.20