Commit Graph
419 Commits
Author SHA1 Message Date
bowenliang123 59cd1be501 feat(client): expand the plugin settings card on the Open-in-Settings jump
The settings shell keeps its open/section state in private component
state and offers no plugin-facing open face, but the card registered on
settings.plugin.item is ours. After the jump's settings-trigger click
survives, it raises a short-lived in-bundle expand request; the card
consumes it on mount and lands open, scrolled into view. Degraded jumps
raise no request, and the request expires in 5s, so no stale signal
surfaces on a later manual visit.
2026-08-29 13:32:09 +08:00
bowenliang123 4f89f9ebc0 docs: optimize sceenshots 2026-08-29 13:09:40 +08:00
bowenliang123 7a232454fb doc: restore agent-nework screenshot 2026-08-29 13:09:02 +08:00
bowenliang123 5f2fc9a265 release: v0.38.1 2026-08-29 12:23:41 +08:00
bowenliang123 368d2c9d9b docs(readme): rewrite usage guide with a concise card-by-card structure
- Lead with a three-entry table (Context tab, /context command, settings)
  and a card-to-question table for the dashboard.
- One section per card with a fresh screenshot and short bullets; keep
  the interesting bits (step brief, compaction marks, Delta mode, tool
  source chips, image payloads, vs-previous-turn diff, agent network).
- Trim wording by ~40% and add a short 'Good to know' block.
2026-08-29 12:20:04 +08:00
bowenliang123 c136e6e0db docs(screenshots): refresh README screenshots from live sessions
- Re-capture all dashboard cards at a larger viewport: overview, current
  context, trend, delta mode, events (with a compaction), file activity,
  agent network (with subagents), browser tools/filter/result, image
  payload, /context entry + modal, and the settings card.
- Drop superseded shots: context-browser.png, context-browser-search.png,
  history-detail.png.
2026-08-29 12:19:54 +08:00
bowenliang123 a53bace57c fix(scripts): count the assistant-actions slot in the bundle smoke 2026-08-29 10:46:48 +08:00
bowenliang123 bd24a7b474 docs(AGENTS): update README.md guidelines for embedding images 2026-08-29 10:43:25 +08:00
bowenliang123 1c45bc2bab release: v0.38.0 2026-08-29 10:35:10 +08:00
bowenliang123 8aec839816 feat(context): draw card and control edges with the border-l2 token
Also: settings entry copy polish (reworded descriptions, unbolded row
value) and AGENTS.md adds style tokens to the harness reuse guidance.
2026-08-29 10:32:43 +08:00
bowenliang123 b3746a5340 docs(AGENTS): update testing instructions to require combined linting, testing, and building command 2026-08-29 09:55:26 +08:00
bowenliang123 0090fa3a57 feat(plugin-info): add a settings entry below the GitHub row
The harness settings panel keeps its open state inside the shell
component and exposes no plugin-facing open face, so the entry drives
the real chrome best-effort: click the sidebar's dialog trigger, then
the Plugins section nav row (matched by its shipped en/zh labels).
Every step is individually guarded - a shell without a matching
trigger or section degrades the whole jump to a silent no-op, and no
path can throw into the render.
2026-08-29 09:54:24 +08:00
bowenliang123 bc6f2f160a docs(AGENTS): remove mandatory pre-step section from code exploration protocol 2026-08-29 09:48:53 +08:00
bowenliang123 520e3445d9 docs(readme): describe the four-card stats head row 2026-08-29 09:22:10 +08:00
bowenliang123 5f9bc0d2dc feat(context): split the stats board into context/timing/token cards
The host fold derives whole-session timing totals from the durable
step/tool lifecycle (step/start -> assistant/message -> step/end;
tool/call -> tool/result by callId): step wall time, the model-call
slice, and per-call tool durations with a bounded per-name tally
(stateVersion 11; cached rows refold from the log).

The head row becomes four equal cards: an eight-cell context grid
(shape stats, event tally, cost estimate with its rate tooltip), a
token ring around the cache-hit share, and a timing ring splitting
model calls vs tool runs. Legend rows pair each donut slice with
its label, quantity, and share - no bars; the ring center type
scales with the ring so it never touches the stroke. Wire guards,
i18n, styles, and hostile-input test fixtures included.
2026-08-29 09:22:09 +08:00
bowenliang123 e9b6d70330 docs(AGENTS): clarify mandatory pre-step for code analysis and exploration 2026-08-29 02:19:35 +08:00
bowenliang123 15e35028d7 docs(AGENTS): emphasize the importance of updating the coding agent's to-do list during all phases of work 2026-08-29 02:18:08 +08:00
bowenliang123 5b6d27047f docs(AGENTS): update 2026-08-29 02:13:06 +08:00
bowenliang123 6654954236 feat(browser): open the lone row with a single-item category
Every one-item category (not just system) now auto-expands its only row
when the category opens, so one click lands on the content directly:
the lone tool schema and the lone surface node join the system prompt.
Multi-item categories keep opening collapsed.
2026-08-29 02:12:27 +08:00
bowenliang123 55b9e786f2 docs(AGENTS): update code exploration instructions for clarity and mandatory steps 2026-08-29 02:04:36 +08:00
bowenliang123 e9f54420ce docs(AGENTS): update code exploration instructions for clarity and mandatory steps 2026-08-29 02:00:53 +08:00
bowenliang123 fb40ec9d99 docs(AGENTS): update code graph exploration commands in documentation 2026-08-29 01:55:20 +08:00
bowenliang123 1686022ce2 docs(AGENTS): update code graph exploration commands in documentation 2026-08-29 01:53:28 +08:00
bowenliang123 0c8312763e feat(client): jump from a chat reply to its turn in the Context tab
Add an icon to each finalized reply's assistant-actions row that opens
the Context tab pinned to that reply's turn: the click resolves the
reply's request seq off the served node seat, records it in a per-session
relay, and activates the tab; the view consumes the relay once its
projection data is in, flips the trend chart to turn bars, pins and
centers the turn's aggregate, and resets the shared scroller. Every hop
degrades quietly (unknown seat, unresolvable seq, missing tab, hostile
nodes, aged-out turn).
2026-08-29 01:44:51 +08:00
bowenliang123 84d4f57a6f docs(AGENTS): add instructions for exploring and syncing the code graph 2026-08-29 01:42:12 +08:00
bowenliang123 4a9a95e4f7 feat: add .gitignore to exclude CodeGraph data files 2026-08-29 01:33:23 +08:00
bowenliang123 86333a80d5 feat(client): link the trend card highlights to the shared category hover
Hovering a category in the Context browser (or the overview legend/bar)
now lights that category across the trend card: the matching segment in
EVERY chart bar (total and delta modes), the detail panel's composition
bar, and its per-category rows.

The chart highlight rides a plain container attribute (`data-catdim`) +
static per-segment `data-cat` keys, so the dim/brighten pairing is pure
CSS and the memoized bars never re-render on a cross-card hover. The
detail bar mirrors the key one-way with its tooltip off (a cross-card
hover must not float a second tip), and the detail rows reuse the
legend-chip idiom: tinted background, bold label, ring on the color dot.
The overview's 'free' key stays filtered, as in the browser's live link.
2026-08-29 00:53:48 +08:00
bowenliang123 de4d6f327a build: kill previous watch instance when starting pnpm watch
Track the tsdown watcher pid in .tmp/watch.pid; a new watch kills the
previous instance first and the pid file is cleaned up on exit.
2026-08-29 00:46:32 +08:00
bowenliang123 48e5efa7b3 docs(AGENTS): add instructions for updating dependencies after git pull 2026-08-28 23:18:15 +08:00
bowenliang123 73141fb53d docs(AGENTS): update compatibility section to include support for dsh 0.1.2-alpha1+ 2026-08-28 23:16:16 +08:00
bowenliang123 6d17588a56 release: v0.37.0 2026-08-28 22:32:46 +08:00
bowenliang123 1dab8dcdbf build: track the 0.1.2 client module graph
Drop the deleted `@deepseek-ai/dsh-client-runtime` from dsh.client.inject
and remove the preloaded-client-externals channel that died with it; mirror
0.1.2's platform module table (+ dsh-client-store) in the client bundle's
purity gate; widen the dsh peer ranges to >=0.1.0-rc.7 so 0.1.2 prereleases
resolve; pin the devDependency types to the newest published surface
(0.1.1-rc.2); the bundle smoke's fake ctx now honors inject callbacks.
2026-08-28 22:32:31 +08:00
bowenliang123 7b61d5ddc7 feat(browser): dual-face compatibility across the dsh 0.1.1/0.1.2 seams (#26)
0.1.2 rewrote the client composition and the history transport; every seam
this plugin touches now resolves by feature detection and degrades visibly
instead of erroring:

- history reads: `remote.session.page` (0.1.2; the inclusive cut
  `throughSeq` pinned to the target seq) over `connection.api.sessions.history`
  (0.1.1); both served envelopes unwrap ({ok,value} and {result:{ok,value}});
  packed chunk-row records skip (final events always ride verbatim); a
  malformed payload rejects into the retryable state instead of claiming
  absence.
- conversation join: `useChat` (ChatSnapshot.legacy.nodes) over the session
  snapshot's top-level `nodes`, both seats invoked in a stable hook order —
  fixes the empty File Activity card on 0.1.2 (#26).
- image loading: `uiConversation.imageUrl` (0.1.2) over
  `conversation.resolveImage` (0.1.1); absent faces degrade the cards to
  metadata-only.
- `/context` command: waits for the `inputTriggers` service (ctx.inject)
  instead of racing module arrival order, which 0.1.2's finer modules broke;
  the modal resolves `sessions` at close time for the same reason.

Absent faces drop features (static out-of-window hints, no command) — the
tab and the modal never render an error page.
2026-08-28 22:32:19 +08:00
bowenliang123 6e46d65d69 refactor(host): mirror both projection unit contracts across registry generations
The session-projection contract drifted again in 0.1.1/0.1.2: the unit-key
constraint moved from SessionProjectionMap to SessionProjectionStateMap, the
pre-0.1.1 `schema`/`view` fields left the published definition, the wired
register overload now demands `wire` PRESENT, and 0.1.2 widened `init` to
`init(header: SessionHeader)`. The dual-contract definition is therefore
mirrored locally in full (ProjectionDefinitionV1 + V2) instead of Pick-ing
from the installed dts, the plugin keys merge into BOTH type maps, and the
zero-argument init satisfies every supported registry — one definition
object still installs unchanged from 0.1.0-rc.7 through 0.1.2-alpha.1.
2026-08-28 22:32:19 +08:00
bowenliang123 d25d44aff1 fix(host): keep undefined-valued scalars off the wire view (#29, #30)
model/provider/contextWindow now join the served snapshot by conditional
spread: an unknown value leaves the key ABSENT instead of materializing an
`undefined`-valued property. The harness's lossless-JSON pipeline rejects
such a view whole — on 0.1.2 that fails every projection push for the
session (the fresh-blank-session breakage reported in #29/#30; the same
property discipline the persisted state has held since stateVersion 10).
Guarded by plain-JSON view assertions over both the unknown and the known
model shapes.
2026-08-28 22:32:01 +08:00
bowenliang123 201151793b docs: add note about gh cli installation and configuration 2026-08-28 20:35:03 +08:00
bowenliang123 83bc071338 feat(browser): number the lines of the raw text view
Each source line becomes a block span whose counter-fed ::before sits
in a narrow left gutter; pseudo content never reaches the clipboard and
user-select none keeps it that way, so copying the body still yields
the exact source. Interior empty lines keep their height, a trailing
newline adds no row, and soft-wrapped continuations align at the
content column.
2026-08-28 12:15:40 +08:00
bowenliang123 65db2a3b66 fix(browser): keep authored newlines breaking exactly once in markdown cards
e4eddbf dropped the card-level pre-line, which stopped the doubled
breaks but also collapsed bare soft newlines into spaces. The renderer
bakes soft breaks into paragraph text and pairs every hard break's <br>
with a '\n', so scoping pre-line to paragraphs and hiding those <br>s
makes every authored newline render exactly one line break while block
separators still collapse at the container's normal white-space.
2026-08-28 12:15:40 +08:00
bowenliang123 e4eddbf3f2 style(browser): stop markdown detail cards from doubling line breaks
The shared MarkdownText pipeline emits cosmetic newline text nodes
between blocks and after each <br>, designed to collapse under the
default white-space. The card's pre-line made every one of them
visible, so hard breaks rendered twice and block gaps stacked an
anonymous blank line on top of the paragraph margins.
2026-08-28 11:47:59 +08:00
bowenliang123 06d1a5df7c release: v0.36.0 2026-08-28 10:17:15 +08:00
bowenliang123 3862a48e47 docs: showcase the browser row filters and tool source chips
Two live screenshots: the tool-schema category with per-plugin source
chips and its filter/sort toolbar, and tool results narrowed by a
text filter — embedded next to the attribution and filter bullets.
2026-08-28 10:17:04 +08:00
bowenliang123 8a5f1e0b02 style(i18n): per-category placeholders for the row filter
Each category's filter box now names what it scans — message text
(user), injected context (inject), reply or calls (assistant), tool
or arguments (tool results) — instead of one generic "filter by
text". The tools category keeps its existing placeholder.
2026-08-28 10:08:56 +08:00
bowenliang123 093dd9f69e refactor(browser): a shared row filter across every category
The tools' text filter generalizes into the browser-wide row lens: a
shared RowToolbar (input plus an optional control group) now filters
the four message categories too — user, inject, assistant, and tool
results — matching each row's tag and preview text exactly as shown
(call breadcrumbs and call-args summaries included; full bodies stay
out of scope, they load on demand).

The node-list branch splits into a derive pass (each row's tag +
preview facts, computed once) and a filtered render pass, and the
query is a lens on the OPEN category: opening a different one resets
it while step picks keep it. System stays searchless (one row) and
sort stays tools-only (reading order is meaningful for messages).
2026-08-28 10:07:21 +08:00
bowenliang123 d6cd02acad feat(browser): filter and sort the tool-schema rows
The tools category gains a local view state: a text filter scanning
each row's name, producer description, plugin chip, and raw parameter
JSON (a hostile schema degrades to no matchable text), plus a
size/name sort toggle — size (token price, mirroring the overview's
Top chips) stays the default, name gives lookup. The toolbar stays
mounted on an empty match so the filter can always be cleared, and
both survive step picks so one lens compares epochs.

Reuse the FileCard's control idiom: the search input and toolbar
share the lc-fa-search/lc-fa-ctl rules under browser-scoped names.
2026-08-28 09:58:13 +08:00
3244ff29a9 feat: tool plugin source attribution in the Context browser (#25)
Tool-schema rows in the Context browser carry a best-effort source tag
for the registering plugin, recovered without a harness change:

- a harness-logged `plugin` field passes through verbatim (future-proof);
- MCP-proxied tools resolve `mcp:<server>` from their public names;
- shipped first-party tools resolve from a pinned package map;
- a live `tools.register()` hook (cordis `internal/get` reader slot,
  with a caller-package stack fallback for local-link installs) tags
  third-party, agent-scoped, and dynamic registrations, and peels a
  prior incarnation's wrapper on reload;
- tools already registered when the plugin mounts render a localized
  "unknown plugin" tag explaining the boot-order gap.

Priority: `mcp:<server>` > live record > pinned map > unknown. The
chip rides the shared tag frame tinted with the brand badge tokens.

Rebased onto v0.35.0 with maintainer review fixes; the attribution
priority and reload-safety rework and the chip theming are described
in the PR review comment.

Co-authored-by: Nwflower <1679659@qq.com>
Co-authored-by: bowenliang123 <liang.bowen.123@qq.com>
2026-08-28 09:50:10 +08:00
bowenliang123 ef97842129 release: v0.35.0 2026-08-28 03:11:27 +08:00
bowenliang123 15ae3b96c3 feat(files): open files on the system; display workspace paths relative
The File Activity card gains two affordances, both resolved from the
client ctx and degraded per-host:

- Workspace-relative display: paths inside the session's cwd (read off
  the session-list row) shorten to a './'-relative form; absolute paths
  outside the workspace, Windows drive paths, and already-'.'-relative
  paths keep their verbatim form. Path search matches the display form.
- System open: when the host description advertises canOpenPath and the
  connection api exposes host.openPath, a file name opens on the user's
  system (fire-and-forget, failures stay silent); otherwise it renders
  inert. A pathless search books its pattern as a display-only pattern
  row — never relativized, never openable — including nested Code-Mode
  searches, which previously leaked the pattern into a resolvable path.

workspaceOf and canOpenPathsOf re-prove every field and bound hostile
snapshots (a throw on call or property access degrades to undefined).
Component specs for the card are restored and extended for the new
props; the fold gains a pattern-row case for nested searches.
2026-08-28 03:11:23 +08:00
bowenliang123 059c85a54c feat(files): show each read's line footprint; op times on the right
Reads now carry their line footprint in the op log, in a third color
next to the +/- deltas: `>>30` for the exact window read off the
result's presentation meta (hover names the line range), degrading to
`≈80` estimated from the limit argument when no meta survived — and
staying silent for an unbounded read, which names no footprint. Nested
PTC reads estimate the same way.

The op timestamp moved from the leading column to the right edge,
mirroring the file row above it.
2026-08-28 01:27:42 +08:00
bowenliang123 2fa032d077 style(ui): draw the disclosure chevrons in CSS
The ▸ glyph sits off-center in its box, so the 90° rotation wobbled, and
at small sizes it read thin and cramped. The chevron is now a bordered
box rotated -45°↔45° — it spins about its true center, stays crisp at
any zoom, and takes the lighter tertiary label color with a little more
room before the icon.
2026-08-28 01:27:42 +08:00
bowenliang123 891c847f13 feat(files): render code files as language letter badges
Code files showed the same 🧩 puzzle piece. They now render as compact
letter badges over their language's GitHub-Linguist color — TS, TSX,
JS, PY, GO, RS, JAVA-equivalent short labels capped at three
characters — with the text color chosen per fill luminance (near-black
on the light shades, white elsewhere). Non-code files keep their emoji
glyphs (config, data, markdown, logs, sheets, documents, archives,
fonts, media), and each row's hover title names the resolved bucket in
both locales.

The icon column is a fixed-width flex cell so emoji rows and badge
rows align on the same path edge, with the chevron pulled in to keep
the left cluster tight. Test-file detection drops the .spec. form
(dot-delimited .test. and the underscore forms stay).
2026-08-28 01:03:28 +08:00