Skip to content

feat: index 千问办公 (Qwen Work) and Qoder IDE task transcripts - #81

Open
245678000000 wants to merge 2 commits into
iAmCorey:mainfrom
245678000000:feat/qwenwork-qoder-tasks
Open

245678000000 wants to merge 2 commits into
iAmCorey:mainfrom
245678000000:feat/qwenwork-qoder-tasks

Conversation

@245678000000

Copy link
Copy Markdown

Summary

千问办公 (Qwen Work, QwenWorkCN.app, Alibaba's desktop agent) runs the Qoder engine and writes Qoder CLI-format transcripts to ~/.qwenworkcn/projects. Wake didn't know about it, so none of those sessions showed up. Qoder IDE / Qoder CN task ("Quest") transcripts were also missing: they live one level deeper, in ~/.qoder/projects/<key>/transcript/.

千问办公 as a Qoder twin (same pattern as WorkBuddy ↔ CodeBuddy):

  • QoderAdapter now carries its AgentId; new AgentId::QwenWork (qwenwork, shown as 千问办公, which is the app's display name in every locale it ships).
  • Two instances, Kilo-style: qwenwork() reads ~/.qwenworkcn/projects, and qwenwork_legacy() reads ~/.qoderworkcn/projects, which its predecessor QoderWork CN left behind. 千问办公 migrated those sessions into its own folder (the migrated project dirs are still named -…-qoderworkcn-workspace-…). A session in both is de-duplicated with dedup_rank, and the current folder's copy wins.
  • Prompts: every user row starts with a <system-reminder> text block (timezone, available tools), so is_injected_user_content folded the whole prompt into Meta. The engine also saves what the user typed in humanInput.text, and the parser now shows that. For older rows without humanInput, only the injected text block is folded and the typed block shows as usual. This part is shared with Qoder CLI.
  • Titles: the app's own chat name isn't in the transcript, and last-prompt is just the latest turn ("继续", "好"). 千问办公 sessions therefore take the first prompt, with the skill-picker preamble ("This request must be fulfilled using the "x" skill…") reduced to the skill name and <user-pasted-*> placeholders stripped. Qoder CLI keeps its existing order.
  • Background runs: the engine writes its memory-compaction (Target file this round: MEMORY.md / USER.md) and command-safety (# Input\nCommand: …) runs as ordinary session files. They're skipped at enumeration (both list_session_files and file_ref), based on a bounded 16 KB read of the file head, in the spirit of the Codex internal-thread filter. If the head can't be read or has no user row, the file is kept.
  • No CLI, so no Open In. Remote sync layout for .qwenworkcn/projects; user skills at ~/.qwenworkcn/skills; brand icon from the app bundle; series color darkened from the brand green #00CB5E to #0B8A4C (ΔE00 6.1 → 14.1 from Qoder's green).

Qoder IDE / Qoder CN task transcripts:

  • projects/<key>/transcript/task-*.session.execution.jsonl are listed and watched.
  • These rows have no parentUuid / active-leaf, so when no row carries a parent key the file order is the conversation.
  • progress / session_meta rows are known metadata.
  • The <key>/<id>/ tool-results sidecar is included in session_paths.

Notes for review

  • I appended QwenWork at the end of AgentId because the comment asks to confirm sidebar positions with you. Move it wherever you like.
  • Qoder task transcripts still show under "Qoder CLI". Renaming that display name felt like your call.
  • Format checked against real data on my machine (千问办公 1.4.0, Qoder CN 0.4.11). From 105 + 26 local session files, Wake indexes 79 千问办公 sessions (plus 27 sub-agents) with 0 unknown lines, after removing the 18 migrated duplicates and 34 background runs. Qoder goes from 1 to 7 sessions. Test fixtures are synthetic.

Tests

  • New adapter_contracts::qwenwork_is_a_qoder_twin: roots, dedup rank, humanInput vs injected block, title choice, skipped background runs, no resume target.
  • New adapter_contracts::qoder_task_transcripts_are_sessions: listing, file_ref, linear parse with tool output and thinking, sidecar in session_paths.
  • DEFAULT_INSTANCES +1 for the second 千问办公 source; stage_dir_fixtures stages the Qoder fixture as .qwenworkcn so remote_sync covers the new layout.
  • cargo test -p wake-core: 505 passed, 0 failed. cargo fmt --all --check clean. cargo build -p wake --release and scripts/make-app.sh succeed, and I'm running the resulting app.
  • Not run locally: cargo test -p wake (out of disk space). CI will cover it.

🤖 Generated with Claude Code

千问办公 (QwenWorkCN.app) runs the Qoder engine and writes Qoder CLI-format
transcripts to ~/.qwenworkcn/projects. Its predecessor QoderWork CN left
~/.qoderworkcn/projects, which is read as a second source; the copy in the
current folder wins de-duplication.

- QoderAdapter becomes agent-aware (twin pattern, like WorkBuddy/CodeBuddy):
  new AgentId::QwenWork with qwenwork() and qwenwork_legacy() instances
- Show humanInput.text (what the user typed) instead of letting the
  <system-reminder> block the app prepends hide the whole prompt; for older
  rows without humanInput, only the injected text block is folded away
- Title 千问办公 sessions by the first prompt; last-prompt is just the latest
  turn ("继续")
- Skip the engine's background runs (memory compaction "Target file this
  round:", command checks "# Input\nCommand:") at enumeration, from a bounded
  read of the file head
- Read Qoder IDE / Qoder CN task transcripts in
  projects/<key>/transcript/*.jsonl (no parentUuid / active-leaf: file order
  is the conversation); their tool-result sidecar is deleted with them
- Wire QwenWork into remote sync, skills, terminal (no CLI, no Open In),
  theme color, brand icon, docs and the website agent list

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 25, 2026

Copy link
Copy Markdown

@245678000000 is attempting to deploy a commit to the corey's projects Team on Vercel.

A member of the Team first needs to authorize it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant