You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(vscode): add workflow lanes, provider management and skill commands (#22)
## Related Issue
No issue — the problems were found while using the extension. They are
described below.
## Problem
Several unrelated defects in the VS Code extension and one naming
problem in the engine:
- **Workflow lanes** attributed every DynamicWorkflow step to the parent
agent, so a lane's progress bar tracked the wrong work, and a finished
lane still rendered a gap because its bar was drawn relative to the
busiest agent.
- **`/yolo` did not survive re-attach.** The global `yoloMode` setting
overrode the session's own mode every time a session attached or
resumed, the code meant to persist the mode called
`session.updateMetadata`, which does not exist on the SDK, and the
extension carried a legacy two-flag (`yolo` + `afk`) model in front of
the engine's three-value `PermissionMode`.
- **Skills never appeared in the slash menu.** `getSlashCommands` called
`harness.listWorkspaceSkills`, which is not a method on the harness; the
optional call swallowed it and returned an empty list. Commands were
also fetched once, before any session existed, and built-in skills were
only routable under a `skill:` prefix.
- **The slash menu ignored what was typed.** A query was matched against
command descriptions as a subsequence, so the letters of `research` were
found scattered through nearly every description and the list came back
unfiltered — typing appeared only to move a highlight that never left
the first row.
- **A managed provider was reported as broken.** A provider that
authenticates over OAuth is required by the config schema to carry no
`apiKey`, but the providers list flagged that as "No key configured" in
red.
- **The managed provider was named after this product.** It
authenticates against `auth.kimi.com` and serves models from
`api.kimi.com`, yet registered itself as `managed:pythinker-code` and
installed `pythinker-code/*` model aliases. In a client that talks to
several providers that reads as a first-party service rather than the
one it is.
- **Ten test assertions were failing** across six TUI suites for a
single reason (see below).
## What changed
**Extension**
- Lanes attribute steps to their own subagent, and a finished lane
always renders full.
- Permission handling moved onto the engine's `PermissionMode` (`manual`
/ `auto` / `yolo`). The legacy flag-pair shim is deleted. A stored
session mode is now authoritative; the global setting only seeds a
session that has never recorded one, and applies to open sessions on an
explicit change. The sensitive-file and git-control-path policies
deliberately keep running ahead of yolo-approve.
- Skills come from `session.listSkills()` and are re-broadcast when a
session is created or resumed. Built-in skills keep their bare name. The
catalog-to-slash-command projection moved into the SDK so the CLI and
the extension share one implementation.
- Slash matching is ranked and limited to the command name — a
description is prose, and matching it surfaced commands unrelated to the
query. It stays forgiving about skipped letters and dropped separators,
and the selection resets when the query changes.
- New Providers modal for adding and removing providers, backed by the
same `config.toml` the CLI reads. The import routine it shares with the
CLI moved into the SDK so both preserve existing defaults identically.
- Reverted the periwinkle `--primary` to the neutral token and
introduced a separate `--brand` accent, so accent surfaces no longer
re-tint body chrome.
**Engine**
- The managed provider is now `managed:kimi-code`, with `kimi-code/*`
aliases and credentials under `oauth/kimi-code`. Its name also stops
being redeclared as a bare literal in four places and comes from the
single exported constant. This is a breaking change for an existing
config: previous entries are not rewritten, so signing in again
provisions the provider under its current name.
**Tests**
- The SGR pattern used to strip colour from rendered frames matched the
`[0;…m` tail but not the ESC byte introducing it, leaving a stray
control character between styled spans. Any assertion spanning two spans
could never match — `Search: cwd` and `Kimi K2 Kimi ← current` each had
an invisible escape in the middle. Fixing the pattern clears all ten
failures.
## Checklist
- [x] I have read the
[CONTRIBUTING](https://github.com/Pythoughts-labs/pythinker-code/blob/main/CONTRIBUTING.md)
document.
- [x] I have linked a related issue, or explained the problem above.
- [x] I have added tests that prove my feature works.
- [x] Ran `gen-changesets` skill, or this PR needs no changeset.
- [x] Ran `gen-docs` skill, or this PR needs no doc update.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **New Features**
- Added richer subagent/workflow visualization with per-lane progress,
statuses, durations, and result summaries.
- Added provider management for viewing, adding, configuring, and
removing model providers.
- Added persistent permission modes, workspace skill discovery, improved
slash-command matching and insertion, and extension release tooling.
- **Bug Fixes**
- Fixed subagent identity, status routing, replay handling, and
batch-abort reporting.
- Improved initial TUI rendering and publishing retries.
- **Style**
- Updated branding, download badges, interface colors, and welcome-logo
animation.
- **Changes**
- Renamed the managed provider experience to Kimi Code.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Name the managed OAuth provider after the platform that serves it. It is reached over `auth.kimi.com` and `api.kimi.com`, but it was registered as `managed:pythinker-code`, which read as a first-party service in a client that talks to several providers. The provider id is now `managed:kimi-code`, its models are aliased `kimi-code/*`, and its credentials are stored under `oauth/kimi-code`.
7
+
8
+
This is a breaking change for an existing config: the previous entries are not rewritten, so run `pythinker login` once to provision the managed provider under its current name, then remove the stale `managed:pythinker-code` entry.
Add an SDK routine that imports a catalog provider and its models into the persisted config, and use it for the CLI provider import so both entry points preserve existing defaults the same way.
Show the assistant logo beside replies without breaking the step timeline, complete a picked slash command in the input instead of sending it on its own, ship a decodable Marketplace icon, and retry transient registry failures when publishing.
0 commit comments