Commit graph

32 commits

Author SHA1 Message Date
LiangshouX
755a3cc26c docs(dsh): move environment setup into dedicated guides
The two READMEs keep a short introduction to the Environment tab and link
to docs/environment.md / docs/environment_ZH.md, which now carry the
setup and troubleshooting detail: Python and conda discovery plus the
recommendation rule, dependency installation, .env validation and
clearing, connection testing, the detached service lifetime, platform
support and the failure modes of each step.

The version lists include 0.2.2-alpha.2 and note that current DSH needs
Node 24.9 or newer. The package now ships docs/ as well, so the guide
travels with the published plugin.
2026-10-28 17:10:30 +08:00
LiangshouX
7584495744 fix(dsh): probe from the Host and bound every process lifetime
Local now means the DSH Host everywhere. The tab no longer fetches the
service URL from the browser: the hero reads the same Host probe the
service card uses, and a remote endpoint is probed through a new
remeEnv/health method, so a browser on another machine cannot disagree
with the Host. The wire namespace, method parameter convention and
service keys are unchanged.

Process lifetimes are explicit and documented in the manager. Python
probes and reme-ai checks stay bounded one-shot commands. pip installs
live in the manager's registry, keep the interpreter locked between a
cancel request and the actual exit, and are stopped by dispose() when
the plugin unloads. The ReMe service stays detached on purpose: it must
outlive DSH, so it is not handed to DSH's subprocess provider, which
kills its children on Host exit; it is stopped only through the
ownership-checked adapter in service.ts.

That adapter now verifies identity before reporting or stopping a
service: the recorded endpoint must match, the pid must be alive, and
its image must still be Python or reme, which protects against pid
reuse. A launch is recorded only after the OS acknowledged the spawn,
and a spawn failure returns an error instead of an unhandled event.
Starts are serialized and re-check the phase inside the lock, so two
requests cannot spawn two services. Health answers are validated, so a
generic HTTP server answering 200 with '{}' is no longer reported as a
running ReMe service, and authToken now rides the Authorization header
of both the client requests and the Host probe.

.env merging rewrites every occurrence of a key (parsing keeps the last
one), keeps the file's line ending, and validates the merged file rather
than just the submitted values.
2026-10-28 17:10:30 +08:00
LiangshouX
291c9c34bc refactor(dsh): split the environment tab into per-section modules
The tab was one 2,213-line component with 27 state hooks. It is now one
module per step, and each step owns the asynchronous state it shows:

  client/tab.tsx         layout, hero, the settings reads
  client/python.tsx      usePython + the interpreter section
  client/dependency.tsx  useDependency + the reme-ai section
  client/workspace.tsx   useWorkspace + the .env section
  client/service.tsx     useService/useHealth + the service section
  client/presentation   shared badges, tags and field frames
  client/rpc.ts          the remeEnv calls and their response guards
  client/locales.ts      the tab's copy
  client/styles.ts       the tab's CSS

The .env controls now come from one field table, and the stylesheet split
keeps the tab's CSS next to the tab.

State is keyed where the review asked for it: install progress carries the
job id it polls and cancels, workspace drafts and in-flight saves carry the
workspace they were typed for, and a check result only shows for the
interpreter it belongs to. Drafts also distinguish untouched fields from
explicit clears, so emptying a non-secret field now clears it on disk. The
memory settings draft parser no longer carries the environment fields
through, since saving only writes this page's FIELDS list.
2026-10-28 17:10:30 +08:00
LiangshouX
6261018436 refactor(dsh): collect environment management under src/environment
Move the Host modules out of src/pyenv and the tab out of src/client so
the feature has one boundary:

  src/environment/types.ts        browser-safe RPC contract
  src/environment/host/*.ts       detection, install, service, workspace
  src/environment/client/*        the Environment tab
  src/environment/host/gateway    remeEnv RPC surface
  src/environment/host/manager    the operations the gateway exposes

The cross-boundary shapes (detection, reme-ai check, install job, .env
summary, service state) now live in one browser-safe module instead of
being pulled from Host modules that import node built-ins; Host-only
shapes stay beside the code that owns them. src/index.ts registers the
gateway and manager, src/client/index.tsx mounts the tab. The wire
namespace, method names and service keys are unchanged.
2026-10-28 17:10:27 +08:00
LiangshouX
11d2e90be7 chore(dsh): target DSH 0.2.2-alpha.2
Add the current DSH release to the peer ranges and to the package
compatibility matrix (cordis 4.0.6-alpha.1, loader 1.0.7-alpha.1,
schemastery 3.18.6-alpha.1), which needs Node 24.9 or newer.

The packaged-plugin check now launches the npm CLI through node using
the npm_execpath npm exports, so it also runs on Windows where npm is
npm.cmd and execFile cannot start it.
2026-10-28 17:10:23 +08:00
LiangshouX
2c5f6033c2 test(dsh): stub the health probe in the environment tab test
The tab renders a hero from /health_check on mount. The test asserted the ready state, which only held while a local ReMe service was running, so it failed on CI runners. Replace global fetch with a canned health response for the duration of each test.
2026-10-28 12:58:12 +08:00
LiangshouX
fa77fd649a docs(dsh): format README tables with prettier
Table column padding in both READMEs did not match prettier's output, so the plugin CI format check failed. Content is unchanged.
2026-10-28 12:58:12 +08:00
LiangshouX
0d9598e7c8 feat(dsh): restructure the environment tab for scanability
The environment tab rendered as one flat column: five identical headings,
every detected interpreter in one long list, and the whole .env form
always expanded. That reads like prose and grows without bound on
machines with dozens of conda environments.

- Lead with a status hero (endpoint, service/Python/ReMe chips, retest and
  rescan) so the current state is readable at a glance.
- Turn the four remaining groups into numbered cards with a status pill in
  the header, so setup order and per-step state are obvious.
- Show only the interpreter in use, then reveal the rest on demand:
  search box, six rows per page, and a show-all toggle.
- Collapse the .env editor behind a summary line (path + model).
- Explain the "recommended" marker through a tooltip; the flag now also
  distinguishes an outdated reme-ai (amber) from a current one.
- Expose versionOk on the detection probe so the client can tone the tag
  without importing host-only modules.
- Add a react-test-renderer suite covering the hero, card count, collapsed
  list, pagination and interpreter selection.
2026-10-27 20:20:02 +08:00
LiangshouX
80ce19645e fix(dsh): mount the environment gateway under its own service key
TypertRemoteService registers itself under the constructor key, so
`super(ctx, remeEnv)` collided with the already-provided `remeEnv`
manager: the gateway plugin failed activation (its async rejection was
logged only), leaving every /api/remeEnv/* call with HTTP 404.

Register the service as `remeEnvGateway` and keep the wire namespace
`remeEnv`, which is what the client calls. Add a real-cordis regression
test that mounts the gateway inside the same isolated realm and asserts
the binding, the namespace, and the SRC-parsed `input` parameter.

Also show the interpreter hint on detection failure so an empty list
never leaves the tab without guidance.
2026-10-27 19:56:45 +08:00
LiangshouX
5d3b4fe31f docs(dsh): document the environment management tab
Describe the five Environment sections, the .env and EMBEDDING_API_KEY
contracts, local service control semantics, and the optional authToken
field in both READMEs.
2026-10-27 19:05:04 +08:00
LiangshouX
80a310cf9e feat(dsh): start and stop the local ReMe service
- service status combines a direct /health_check probe with port probing:
  running (managed or foreign), port conflict, or stopped
- start composes `reme start` with an absolute workspace_dir and
  service.host/port, runs it detached inside the workspace (so ReMe's
  .env discovery works), injects UTF-8 and NO_PROXY, disables the rich
  logo, and only passes jobs.dream_cron.enabled=false on reme >= 0.4.1
- the plugin records the PID and launch arguments in service.json, so
  stop can tree-kill the managed process; foreign instances are shown
  but not touched
- serviceLog exposes the workspace log tail for start-failure diagnosis
- optional autoStart setting starts a stopped local service when DSH
  boots, using the selected interpreter (or the detected suggestion)

Real-machine check: started ReMe 0.4.0.9 on port 2334 in a temp
workspace, observed running/managed with the recorded PID, then
stopped it and confirmed the port was released.
2026-10-27 19:05:04 +08:00
LiangshouX
db985b3625 feat(dsh): manage ReMe .env settings from the Environment tab
- read the workspace .env as a masked projection: non-secret values are
  editable, API keys return only •••• plus their last four characters
- merge edits into the existing file, preserving comments, ordering and
  unknown variables; validate the effective file so an untouched real
  key still satisfies the LLM requirement
- require a non-empty EMBEDDING_API_KEY (EMPTY placeholder fills in on
  first save), because ReMe 0.4.0.x aborts startup without one
- test the configured LLM endpoint from inside the workspace with the
  selected interpreter, classifying 401/404/network failures
- add the remeWorkspaceDir setting (empty means ~/.reme) consumed by
  the .env editor and later service management

Real-machine check: masked read leaks no secret, temp-workspace write
is idempotent and rejects an empty embedding key, and the LLM probe
against the local ~/.reme/.env returned HTTP 200.
2026-10-27 18:48:55 +08:00
LiangshouX
ad9a4c2888 feat(dsh): check and install reme-ai from the Environment tab
- check reme-ai version, the [core] AgentScope import and the reme CLI
  for the selected interpreter; an outdated install is flagged instead
  of treated as ready
- one-click pip install of reme-ai[core] as a Host job: per-job log file,
  2s log-tail polling, cancel, and running-job restore after a page
  reload; the optional mirror overrides pip only for that run
- interpreter detection now probes reme-ai per environment, so the
  suggestion prefers a named conda env with a usable reme (an outdated
  reme no longer outranks a ready environment)
- fix: DSH exposes these Remote methods in SRC mode, which parses the
  method source; every method takes one plain `input` identifier
  parameter (no defaults or destructuring) and the client sends
  `{ args: { input } }`
2026-10-27 18:41:38 +08:00
LiangshouX
6f1ecf06aa feat(dsh): add Environment tab with local Python detection
Adds a read-only Environment tab to the ReMe Memory settings card so
users can see why the ReMe service is unreachable before touching a
terminal:

- discover local Python interpreters via the PEP 514 registry, py
  launcher, PATH and conda (base + named envs), then verify every
  candidate by actually running it
- classify origins (conda base/env, python.org, Microsoft Store, venv,
  system PATH), drop Store alias stubs, and suggest a preferred
  interpreter (Python >= 3.11, named conda envs first)
- expose detection to the browser through a new remeEnv host gateway
  (TypertRemoteService) and render it with a connection health check
- config gains optional authToken and pythonPath fields with unchanged
  defaults; existing memory settings keep their behavior

Parsing is fixture-tested against real tool output on Windows (GBK
codepages, localized reg labels, missing py launcher) and Linux.
2026-10-27 16:57:36 +08:00
jinliyl
55fdad94d0
fix(dsh): preserve outbox order and redact whitespace in credentials (#657) 2026-10-22 11:21:37 +08:00
jinliyl
a4f606c6a8
fix(dsh): recover memory backlogs and protect endpoint credentials (#653)
* fix(dsh): recover memory backlogs and protect endpoint credentials

* fix(dsh): address outbox and idempotency review findings
2026-10-21 18:58:29 +08:00
jinliyl
638c81e88e
chore: release 0.4.2.0 and simplify publishing workflows (#631)
Some checks failed
CI / Python tests / Unit Tests - py3.14 (push) Has been cancelled
CI / Windows / CLI smoke - py3.11 (push) Has been cancelled
Security / CodeQL / Analyze python (push) Has been cancelled
CI / ReMe Studio / Studio checks (push) Has been cancelled
Security / CodeQL / Analyze javascript-typescript (push) Has been cancelled
CI / Python quality / Pre-commit (push) Has been cancelled
CI / DSH plugin / Validate DSH plugin (push) Has been cancelled
CI / OpenClaw plugin / Validate OpenClaw plugin (push) Has been cancelled
CI / Python packages / Build and verify distributions (push) Has been cancelled
CI / Python quality / GitHub Actions (push) Has been cancelled
CI / Python tests / Unit Tests - py3.11 (push) Has been cancelled
CI / Python tests / Unit Tests - py3.12 (push) Has been cancelled
CI / Python tests / Unit Tests - py3.13 (push) Has been cancelled
CI and Release / Docker / Build and test / amd64 (push) Has been cancelled
CI and Release / Docker / Build and test / arm64 (push) Has been cancelled
CI and Release / Docker / Publish multi-platform tags (push) Has been cancelled
* chore: release 0.4.2.0 and derive publish versions from source

* chore(dsh): prepare 0.1.3 for the next iteration
2026-10-16 16:53:52 +08:00
jinliyl
e478b68085
fix(dsh): support 0.2.0 RC and current Harness settings (#629) 2026-10-16 11:32:38 +08:00
Sen Huang
749c653f23
feat(integrations): add automatic memory plugins for Claude Code and Codex (#575)
* feat(integrations): add native Claude Code and Codex memory plugins

* docs(integrations): make plugin installation the coding agent entry point

* feat(integrations): configure plugin connections from user settings

* refactor(codex): use MCP tools and native plugin settings

* fix(codex): restore plugin hooks on current runtimes

* docs(codex): expand setup guide and reserve screenshot slots

* feat(codex): add configurable memory consolidation and status

* feat(codex): merge connection checks into a tabbed status app

* docs(codex): diagnose blocked status panel sandbox loading

* fix(codex): simplify status panel layout for narrow cards

* docs(codex): focus guides on connecting and using ReMe

* docs(codex): specify validated CLI and desktop version requirements

* feat(codex): add ReMe branding to plugin icons

* docs(codex): prepare manual screenshot workflow

* fix(codex): simplify ReMe status layout and activity

* docs(codex): explain Hook loading and local project context

* fix(codex): keep status refresh clear of host close control

* fix(codex): retain status resources for active MCP connections

* docs(codex): add real desktop screenshots to usage guides

* fix(integrations): address memory capture and consolidation review

* fix(codex): preserve capture endpoint during background delivery
2026-10-12 20:12:47 +08:00
jinliyl
81c16d3e2c
feat(jobs): add a unified enabled switch for all job types (#580)
* feat(jobs): allow disabling cron schedules independently

* refactor(jobs): unify job activation with enabled flag
2026-09-30 18:30:36 +08:00
jinliyl
67135cfc57
fix(dsh): support DeepSeek Harness 0.1.7-rc.2 (#571)
* fix(dsh): support DeepSeek Harness 0.1.7-rc.2

* fix(dsh): preserve settings and validate live configuration

* fix(dsh): recognize legacy ReMe guidance on resumed sessions

* fix(dsh): keep live settings schema browser compatible

* fix(dsh): preserve exact host validation with serializable forms
2026-09-30 14:53:42 +08:00
jinliyl
5231f3970c
fix(hermes): preserve profile context and reset invalid provider state (#554)
Some checks failed
CI / Python packages / Build and verify distributions (push) Has been cancelled
CI / Python quality / GitHub Actions (push) Has been cancelled
CI / Python quality / Pre-commit (push) Has been cancelled
CI / Python tests / Unit Tests - py3.11 (push) Has been cancelled
CI / Python tests / Unit Tests - py3.12 (push) Has been cancelled
CI / Python tests / Unit Tests - py3.13 (push) Has been cancelled
CI / Python tests / Unit Tests - py3.14 (push) Has been cancelled
CI / Windows / CLI smoke - py3.11 (push) Has been cancelled
Deploy / Documentation / Build documentation (push) Has been cancelled
Security / CodeQL / Analyze javascript-typescript (push) Has been cancelled
Security / CodeQL / Analyze python (push) Has been cancelled
Deploy / Documentation / deploy (push) Has been cancelled
* Fix Hermes provider profile thread compatibility and reinitialization

* docs(hermes): clarify compatibility checks were manual
2026-09-16 16:01:15 +08:00
jinliyl
dab56fc794
chore: bump ReMe and OpenClaw versions (#549) 2026-09-15 18:29:25 +08:00
jinliyl
d67f1490f5
fix(dsh): support latest host prerelease (#548) 2026-09-15 13:31:45 +08:00
jinliyl
fd6337fe42
docs: refresh agent integration guides (#545)
Some checks are pending
CI / OpenClaw plugin / Validate OpenClaw plugin (push) Waiting to run
CI / Python tests / Unit Tests - py3.12 (push) Waiting to run
CI / Python tests / Unit Tests - py3.13 (push) Waiting to run
CI / Python tests / Unit Tests - py3.14 (push) Waiting to run
CI / Windows / CLI smoke - py3.11 (push) Waiting to run
Deploy / Documentation / Build documentation (push) Waiting to run
Deploy / Documentation / deploy (push) Blocked by required conditions
Security / CodeQL / Analyze javascript-typescript (push) Waiting to run
CI / DSH plugin / Validate DSH plugin (push) Waiting to run
CI / Python packages / Build and verify distributions (push) Waiting to run
CI / Python quality / GitHub Actions (push) Waiting to run
CI / Python quality / Pre-commit (push) Waiting to run
CI / Python tests / Unit Tests - py3.11 (push) Waiting to run
Security / CodeQL / Analyze python (push) Waiting to run
* docs: refresh agent integration guides

* docs: clarify Claude Code transcript access
2026-09-14 17:55:08 +08:00
jinliyl
4f7c8786e3
fix(integrations): correct Hermes plugin version (#543) 2026-09-14 13:03:00 +08:00
jinliyl
6cb81e7921
refactor(integrations): split TypeScript host plugins (#536)
* refactor(integrations): split TypeScript host plugins

* feat(integrations): refresh host compatibility and status UI

* fix(openclaw): secure status diagnostics
2026-09-11 13:06:02 +08:00
jinliyl
1be61b1e4c
feat(integrations): add dual-mode Hermes memory provider (#533)
* feat(integrations): add dual-mode Hermes memory provider

* style(integrations): apply repository formatting

* fix(integrations): address Hermes provider review

* fix(integrations): bound embedded recall startup cleanup

* fix(integrations): finish embedded application cleanup

* docs(integrations): expand Hermes verification guide
2026-09-11 12:25:18 +08:00
jinliyl
3d2ecc60d2
feat(service): expose MCP through HTTP backend (#498)
* feat(service): expose MCP through HTTP backend

Serve JSON/SSE job endpoints and streamable HTTP MCP from one FastAPI application, sharing the same jobs and application lifecycle. Preserve the standalone MCP backend, add configurable MCP HTTP settings, update startup metadata and integration docs, and cover routing, lifecycle, configuration, and compatibility behavior with unit tests.

* fix(service): preserve MCP request protections

Route the exact MCP path through the complete FastMCP ASGI application so its middleware and state remain active. Reject non-literal MCP paths and validate reserved Job conflicts before tolerant service registration. Add regression coverage for middleware preservation, route syntax, and startup failure.

* fix(service): reject encoded MCP paths

Reject percent signs in mcp_path so ASGI path decoding cannot turn an accepted configuration into an unreachable route. Cover encoded slash, space, and double-encoded slash inputs.
2026-08-27 17:23:11 +08:00
jinliyl
ef3f99f019
refactor(packaging): reorganize published packages (#495)
* refactor(packaging): reorganize published packages

* fix(packaging): install AgentScope extra in wheel smoke

* docs: align package guides and documentation site

* ci(workflow): add core dependency verification step in Python package build

- Add a workflow step to verify released core dependencies by installing the wheel with core extras
- Assert the presence of the static index.html file to ensure proper package contents
- Create and use a temporary virtual environment for isolation during verification
- Keep existing artifacts upload step intact and conditional on inputs.upload_artifacts flag

* fix(ci): update package installation dependencies in Windows workflow

- Change pip install from editable reme_studio and core to only dev and as extras
- Remove installation of reme_studio and core to streamline dependency setup
- Ensure Windows CI uses the correct extras for testing environment

* fix(tests): add missing commas in toml file reads in package version tests

- Added trailing commas in the tomllib.loads calls for auto-fin and daily_paper configs
- Ensured consistent syntax to prevent potential tuple misinterpretation
- Improved readability and correctness of the test setup code

* fix(packaging): protect qwenpaw releases and test Studio health
2026-08-27 14:02:09 +08:00
jinliyl
8416fd3ac9
feat: add unified TypeScript agent integrations (#483)
* feat: add unified TypeScript agent integrations

* fix: normalize endpoints without regex backtracking

* fix: address TypeScript integration review feedback

* fix: preserve original OpenClaw prompts

* fix: bound pending OpenClaw prompts
2026-08-21 13:57:14 +08:00
jinliyl
f5ec230fef
feat: add DSH memory integration and organize extensions (#461)
* feat: add DSH memory integration and organize extensions

* fix: support newer DSH release candidates

* fix: address DSH integration review feedback

* fix: handle DSH cross-day retry edge cases
2026-08-20 15:31:51 +08:00