Skip to content

Releases

v0.11.2 — fix postinstall failing on a fresh install

Choose a tag to compare

@Mlte0907 Mlte0907 released this 29 Sep 09:50

Fixes a hard install failure that only appears on a first install of the github: dependency.

The failure

node_modules/dsh-teams-x postinstall$ node scripts/postinstall-check.mjs
Error: Cannot find module '.../node_modules/dsh-teams-x/scripts/postinstall-check.mjs'
[ELIFECYCLE] Command failed with exit code 1

package.json points postinstall at scripts/postinstall-check.mjs, but the files whitelist never included scripts/. pnpm applies files to git-hosted dependencies too, so the installed tree is assets, cordis.patch.yml, lib, LICENSE, package.json, README.md, README_ZH.md — with no scripts/ — and Node cannot load the module at all.

The check is defeated by its own absence: the script's docblock says it is "best effort — never fails the install", yet a missing script fails the install outright.

The fix

Adds only scripts/postinstall-check.mjs to files. The prepublish-only clean-build.mjs runs from the repository at publish time and does not belong in the tarball.

Verification

Packed, extracted to a clean directory, and ran the postinstall from there:

  • bundles present → prints [dsh-teams-x] plugin bundles present, exit 0
  • lib/ removed → prints the missing-build-output pointer, still exit 0, honouring its promise not to fail an install

Reproduced before the fix by running the postinstall from the installed directory, which gave the same MODULE_NOT_FOUND.

Why this was not caught on the development machine

Existing installs here did not surface it because pnpm records the package as already built in node_modules/.modules.yaml and skips build scripts on re-install. The failure only appears on a genuinely first install — which is exactly the path everyone else takes.

v0.11.1 — fix silently dropped status in update_task

Choose a tag to compare

@Mlte0907 Mlte0907 released this 29 Sep 09:32

Fixes a silent data-loss bug reported by a member subagent during a live run.

The bug

Calling teamsx_update_task with status and progress in the same invocation wrote the progress note but left the status untouched — and reported no error. The tool echoed the unchanged status, so a response like Task t1 attempt 1 → claimed read like success.

The progress branch in src/tools.ts appended the note, persisted, and returned unconditionally. The actual transition lived further down and was only reachable when progress === undefined.

This deadlocks the ordinary member flow. A member that marks work in_progress with a progress note sees nothing happen; the follow-up attempt to jump straight to completed is then rejected by the claimed-cannot-jump rule, which presents as a scheduler malfunction rather than a dropped write.

The fix

The progress branch returns early only when the same call carries neither status nor output, so a note on its own keeps its exact previous behaviour and timeline shape. Otherwise it falls through: the note is already on the task, and the main path persists it together with the transition.

The quality gate and transition validation still apply. Verified that evaluateQualityCompletion passes through when status is undefined (quality.ts:299, :306), so a pure note is never rejected by routing it through the main path.

The progress parameter description previously read "WITHOUT changing status" — which contradicted the merged semantics and invited exactly the two-call pattern that failed silently.

Verification

Regression tests B8a–B8e: a combined call returns the new status, persists the transition, and lands the note in progressLog; a note on its own changes no status and adds no extra task-updated timeline entry.

Negative control: with the previous lib/tools.js restored, B8a and B8b fail with got claimed while B8c passes — the same signature the member reported, reproduced from the shipped artifact.

247/247 functional tests, tsc clean on both compiler faces, verify:flow and the client bundle smoke test green.

v0.11.0 — restore member-transcript navigation

Choose a tag to compare

@Mlte0907 Mlte0907 released this 29 Sep 09:04

Fixes the dead member-navigation path reported as a known issue in v0.10.3.

Two independent causes, both predating 0.2.0-rc.1

1. The navigation methods no longer exist on ISessions. open, openSubagent, and refreshSubagents were all removed — navigation belongs to the view owner (packages/api/session-controller/src/client/contract/sessions.ts:49-51). The old feature-detect guard was therefore always true, so every member click fell into sessions.open(childSessionId) and threw a TypeError.

Member navigation now goes through the view owner: the plugin injects uiWorkspace and calls uiWorkspace.openSession(address). Cold subagents are absent from the ordinary session list, so the selection carries the durable direct-parent address — reusing one the client runtime already retained when it belongs to this captain.

2. The module could not load at all. The dynamic import('./session-navigation.ts') compiled to a synchronous require("./session-navigation-2QJqPWyL.cjs"), but the host serves relative chunks only as require.async under the name client.<name>.js (CLIENT_CHUNK, packages/client/modules/src/client/system.ts:335). That name fails both the client. prefix and the .js extension, and the rejection was swallowed into a single console.warn. The import is now static, so no sibling chunk is emitted, and the orphaned lib/session-navigation-2QJqPWyL.cjs(.map) is deleted.

Also in this release

  • ActivityPanel's sessions prop was declared but never read (navigation went through openMember) — removed rather than retyped.
  • The client face now imports the host's real UiWorkspace and SubagentAddress types instead of hand-rolled structural ones. That self-declared typing is exactly what let the removed-API drift pass tsc unnoticed; dsh-client-ui-workspace gains a devDependencies link and a peerDependencies entry so future drift is caught.

Verification

  • 5/5 regression tests against the shipped lib/client/session-navigation.js: constructs the address when none is retained, reuses a retained address from this captain, ignores a retained address owned by a different parent, works when the runtime exposes no address reader, and touches none of the removed ISessions methods.
  • tsc clean on both compiler faces against 0.2.0-rc.1 host types.
  • 242/242 functional tests, verify:flow, client bundle smoke.
  • The built bundle contains no relative require and no reference to openSubagent / refreshSubagents / sessions.open(.

Not verified: a live browser click-through of a member row. The activity panel gates on captainSessionId === sessionId and fetches its state only at mount, so the E2E harness could not drive a member click against a stubbed endpoint. The fix is verified at the unit and bundle level, not by an observed click.

v0.10.4 — fix halted-card warn token for DSH 0.2.0-rc.1

Choose a tag to compare

@Mlte0907 Mlte0907 released this 29 Sep 08:33

Follow-up to v0.10.3, found by inspecting the bundle actually being served.

The "halted" badge on the in-chat team card referenced --dsw-alias-state-warning-primary, a variable the host does not define. The host ships --dsw-alias-state-warn-primary (packages/client/ui-theme/src/styles/design-platform.css:257). The badge was therefore always falling through to its hardcoded #f5a623 fallback, which reads too bright in dark themes.

ActivityPanel.module.css already used the correct name — this aligns the card to the same token instead of carrying two spellings of one colour. The same stale token was fixed in dsh-remote-x 0.3.1.

Rebuilt lib/ at the original /tmp/opencode/teamsx-build path so the CSS-module hashes are unchanged and the artifact diff is the single line. Smoke test and 242/242 functional tests green.

v0.10.3 — align to DeepSeek Harness 0.2.0-rc.1

Choose a tag to compare

@Mlte0907 Mlte0907 released this 29 Sep 08:06

Aligns the plugin's declared host contract with DeepSeek Harness 0.2.0-rc.1.

Fixed

  • peerDependencies now declare >=0.2.0-rc.1 for all twelve @deepseek-ai/dsh-* peers (were >=0.1.2-alpha.2 / >=0.1.5-rc.1). Under semver's prerelease rule a prerelease only satisfies a range whose comparator shares its [major, minor, patch] tuple, so every old range evaluated false against 0.2.0-rc.1 — the manifest misdeclared its host and would fail auto-install-peers on profiles using pnpm's default setting.
  • sidebar.right.pane.tab guide entries carry the required id (SidebarRightGuideEntry.id, ui-sidebar-right/src/client/tab-registry.ts:66).
  • Closed a type-check blind spot: @deepseek-ai/dsh-client-ui-sidebar-right was the only @deepseek-ai dependency with no devDependencies link, so the client face had been compiling against the published 0.1.5-rc.1 types instead of the host's 0.2.0-rc.1 — which is exactly why the missing guide id went unnoticed. It now links to the host checkout, and peerDependenciesMeta.optional was added (it was the one peer of sixteen missing it).
  • package.json description and both READMEs now name 0.2.0-rc.1.

Verified against the 0.2.0-rc.1 tree

tsc clean on both compiler faces · 242/242 functional tests · verify:flow · client bundle smoke test. The substantive surface is unchanged there: the teamsx_* tool contracts, all host and client services, all five UI slots, the sidebar-right tab registry, the commandUi popupSelect contribution, and the DOM hooks all still exist with the shapes the plugin expects.

lib/ is rebuilt at the original /tmp/opencode/teamsx-build path so lightningcss reproduces the committed class hashes — the artifact diff is the fix alone, not a hash reshuffle.

Known issues (both predate this release, not introduced here)

  • Member navigation is dead. Clicking a member name does nothing, for two independent reasons: (a) tsdown.config.ts compiles the session-navigation.ts dynamic import into a synchronous require("./session-navigation-*.cjs"), but the host only serves relative chunks as require.async under the name client.<name>.js; (b) even if it loaded, the chunk calls sessions.openSubagent / refreshSubagents / open, all removed — navigation now belongs to view owners. Everything else (tools, badge, panel, cards, /teamsx command) works, which is why it goes unnoticed.
  • compat.ts reads child descriptors through the host's deprecated Session.ownEvents(). Still functional; the non-deprecated path is the async sessionQuery + subagentCatalog projection.

TeamsX v0.2.2

Choose a tag to compare

@Mlte0907 Mlte0907 released this 11 Sep 14:38

TeamsX v0.2.2

v0.2.2 streamlines the desktop entry points and re-anchors the badge dropdown panel.

🗑 Removed (desktop, by product decision)

Left sidebar panel-icon entry

The TeamsX button on the sidebar's panel-icon row (sidebar.panellist) and the main-column panel it opened are gone. The desktop UI now offers exactly two paths into the team activity — the session-header badge dropdown and the right Sidebar tab — instead of three redundant ones. Mobile is unaffected (the right Sidebar tab is the full-width drawer there).

🔧 Fixed

Badge dropdown panel placement (desktop)

The badge sits mid-header, so anchoring the 400px panel by its right edge pushed the card into the content area's top-left corner — visually detached from the badge and covering the transcript. The panel now anchors to the badge's left edge and opens rightward, clamped to stay inside the viewport on narrow desktops. The redundant elementFromPoint cover-probe loop is removed with it.

🎨 UI polish (carried over)

  • SVG icon components replace inline glyphs (refresh/close/pause actions)
  • Task status text is color-coded (success green / failure red / running blue / blocked yellow)
  • Empty state rendered as a dashed placeholder card

Install

Registry (recommended) — download dsh-teams-x-0.2.2.tgz below, then:

dsh plugin --profile web add /path/to/dsh-teams-x-0.2.2.tgz

From source:

git clone --branch v0.2.2 https://github.com/Mlte0907/dsh-teams-x.git
cd dsh-teams-x && pnpm install && pnpm build
dsh plugin --profile web add .

TeamsX v0.2.0

Choose a tag to compare

@Mlte0907 Mlte0907 released this 07 Sep 14:18

TeamsX v0.2.0

v0.2 brings three roadmap features plus in-chat conversation cards — all guarded by the functional suite grown from 143 to 173 cases.

✨ New features

Team templates (profiles)

Configure named templates once, then teamsx_create with profile=<name> in the description seeds the roster and task DAG automatically.

teams-x:
  profiles:
    researcher:
      members:
        - name: researcher
          provider: xianyu
          model: MiniMax-M2.7
      tasks:
        - id: r1
          subject: Research goal

Web plan editor

Staged plans are now editable in the activity panel: member rows (role / provider / model) and task rows (subject / assignee / dependencies) with inline inputs, add/remove with restore, and one atomic batch save. Server-side whitelist rejects unknown operations before they can reach the batch runner.

Automatic repair loop

When a review/requirements task finishes failed with needs_revision/reject plus findings, the scheduler derives a repair task (depends on the failed task, round + 1). Loop stops at the round cap (default 3) or via autoDerive: false.

In-chat conversation card

All 11 teamsx/* session events fold into a single keyed chat node per team — roster rows (active members open their transcript), task digest, lifecycle badges. Zero host changes: uses the same plugin view channel as ui-workflow-run, feature-detected with graceful fallback to the header panel.

/teamsx slash command

Type /teamsx in the composer to expand the team panel.

Verification

  • pnpm verify: typecheck(host+client) + build + smoke(incl. card SSR) + flow + 173/173 cases + icons
  • Real-session smoke: profile seeding, repair derivation, plan editing round-trip persisted to disk

Full changelog: v0.1.0...v0.2.0

TeamsX v0.1.0

Choose a tag to compare

@Mlte0907 Mlte0907 released this 06 Sep 18:56

TeamsX v0.1.0 — first public release

Turn one DeepSeek Harness session into a coordinated multi-agent team: a captain spawns durable member subagents, breaks a goal into a dependency-aware task DAG, and coordinates through direct mailbox messages — with a live all-SVG activity panel.

Highlights

  • 13 teamsx_* tools — create (staged two-phase plan or automatic), member lifecycle, task claim/update/reassign with attempt-id capabilities, mailboxes, status snapshot, halt/resume, archive-on-delete.
  • Staged plan review — approval=required keeps members unspawned until the user explicitly approves the roster + DAG; atomic batch plan revision via teamsx_edit_plan.
  • Quality gates (v0.1) — requirements/implementation/verification/review/repair/integration task contracts: objective + acceptance criteria, verify commands, in-scope path audit (changedPaths classification; .env, id_rsa*, secrets/ excluded even when declared).
  • Durable mailboxes — JSONL per-agent inboxes; live steer for an online captain, wake for members, lease-based retry (60 s) for offline recipients; malformed-line tolerance with per-line warnings.
  • State layer — team.json + reverse index (index.json) with self-healing full-scan rebuild; per-team lock queues; atomic same-dir temp-file writes; tolerant reload of hand-edited/legacy records with loud structural-corruption diagnostics.
  • All-SVG activity panel — theme-token colors, DAG depth lanes, mobile drawer; authenticated web routes (401/403/503 gate) for member pause and staged-plan actions.
  • Compat layer — every host API touchpoint isolated in src/compat.ts (capability detection across harness drift points).

Verification

  • pnpm verify — typecheck (host + client), build, client smoke, state-flow verification, 143-case functional suite (team management, permissions, data sync, mailbox, events, error handling, compat, performance, security, view isolation), icon-asset sync.
  • CI runs the runtime face on GitHub Actions against a fresh harness checkout.

Install

dsh plugin --profile web add <path-to-dsh-teams-x>
# or from the npm tarball
npm pack dsh-teams-x@0.1.0

See README for the tool reference, the staged-plan walkthrough, and the verification commands.