Commit e8628d1
promote: dev → main (Phase 1 reasoning, telemetry rebrand, qwen-logger nuke) — bumps to v0.28.0 (#169)
* fix(core): preserve tool history when building no-tools requests
/recap (and any other caller without tools, e.g. /btw) was sending an
empty conversation to the model. The no-tools branch in pipeline
buildRequest dropped every assistant turn with tool_calls and every
tool-role message wholesale, so in tool-heavy sessions the recap saw
only bare user prompts and hallucinated context.
- generateRecap now passes tools: [] so the strip path doesn't fire,
matching cc-2.18's awaySummary pattern.
- pipeline.ts no-tools branch now flattens instead of dropping: keeps
assistant prose content and removes only the tool_calls field; tool
results become [tool result] assistant notes truncated at 2000 chars.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(ci): release.yml now fires on auto-release/v* PRs (#160)
auto-release.yml opens version-bump PRs from `auto-release/v*` branches
into main, but release.yml's job gate only matched `head.ref == 'dev'`.
Result: every auto-release PR was merging cleanly but skipping publish
(v0.26.25 had to be dispatched manually). This adds the auto-release/*
prefix to the gate and refreshes the stale top-of-file comment.
Co-authored-by: Automaker <automaker@localhost>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore: release v0.26.26 (#161)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(telemetry,ui): reasoning span attribute + collapsed thought summary (Phase 1 of #162) (#165)
* feat(core): preserve task plan state in compaction summaries (#163)
* feat(core): preserve task plan state in compaction summaries
When context compaction fires, the agent loses awareness of its task plan
(completed, in-progress, pending work) and may re-plan already-done tasks.
Add extractTaskPlanSummary() that queries the TaskStore and produces a
structured <task-plan> XML section with status markers ([x], [~], [ ],
[-], [!]), priority labels, and parent-child indentation. Extend
compactMessages() to accept an optional taskStore and append the plan
to the compaction summary. Wire the TaskStore into agent-core at the
compaction call site.
Backward compatible: existing callers without taskStore remain unaffected.
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
* fix: add error handling and recursive nesting to compaction task plan
Address PR feedback from CodeRabbit:
- Wrap extractTaskPlanSummary call in try/catch so TaskStore
failures don't break compaction
- Replace flat 2-level subtask rendering with recursive renderTask()
that supports arbitrary nesting depth
- Add tests for multi-level nesting and error fallback
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
---------
Co-authored-by: Automaker <automaker@localhost>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
* feat(telemetry,ui): capture reasoning on Langfuse span and collapse thoughts post-stream
Phase 1 of the reasoning coordination tracked in #162. Captures
delta.reasoning_content / delta.reasoning across stream chunks and surfaces
it as gen_ai.response.thinking on the gen_ai chat span (gated on logPrompts,
matching the completion event policy). Always emits gen_ai.usage.thinking_tokens
when usage exposes it. Non-streaming responses get the same treatment by
inspecting {thought:true} parts on the response — and the completion event no
longer double-counts thoughts as content.
Renders gemini_thought items as a compact "▸ thinking (N chars)" summary once
the stream finalizes (live streaming render unchanged). Full text remains in
ChatRecord, ACP agent_thought_chunk notifications, and Langfuse for downstream
investigation. An in-TUI expand affordance is a follow-up.
Once homelab-iac#31 (EMIT_REASONING_CONTENT) flips on, this also covers
vLLM-served models that previously lost their <think> blocks at the gateway.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Automaker <automaker@localhost>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore: release v0.26.27 (#166)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* chore(telemetry): rebrand to proto-cli, nuke qwen-logger Alibaba RUM ping (#167)
* chore(telemetry): rebrand qwen-code identifiers to proto-cli
Aligns telemetry / public-facing identifiers with the actual product
name. Verified against the Langfuse instance: new spans land with
service.name=proto-cli on scope=proto.openai-pipeline; existing
proto.* tracers (proto.llm, proto.turn, proto.tools, proto.harness,
etc.) were already correct.
Changes:
- SERVICE_NAME: qwen-code → proto-cli (resource attribute, the marquee
label in Langfuse's service column)
- All EVENT_* constants: qwen-code.* → proto.* (matches the existing
proto.harness.* convention already in this file)
- pipeline.ts tracer: qwen-code.openai-pipeline → proto.openai-pipeline
(one straggler vs. the 9 other proto.* tracers in core/)
- types.ts event.name literals (PromptSuggestion, Speculation):
qwen-code.* → proto.*
- acpAgent.ts agentInfo.name: qwen-code → proto-cli (visible to ACP
clients like Zed when listing agents)
- marketplace.ts User-Agent: qwen-code → proto-cli (extension fetch
identifier sent to api.github.com / raw.githubusercontent.com)
Out of scope (deliberately):
- packages/core/src/telemetry/qwen-logger/* — separate analytics ping
to gb4w8c3ygj-default-sea.rum.aliyuncs.com (Alibaba RUM, the
upstream Qwen team's endpoint). Should be disabled rather than
rebranded; tracking separately.
- DEFAULT_SERVICE_NAME='qwen-code-oauth' in mcp/token-storage —
renaming would orphan existing keychain entries.
- Misc qwen-code-* file paths, tmp dir names, sandbox image tag,
test fixtures — not telemetry / not user-visible labels.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(telemetry): remove qwen-logger Alibaba RUM ping; keep useful events on Langfuse
The qwen-logger system shipped usage telemetry to a fixed Alibaba RUM
endpoint (gb4w8c3ygj-default-sea.rum.aliyuncs.com) — the upstream Qwen
Code team's analytics pipeline. We don't operate that endpoint, the
data isn't visible to us, and it labelled traffic as qwen-code-cli /
qwen-code@${version}. Confirmed unused on our deployment; nuking.
What's removed:
- packages/core/src/telemetry/qwen-logger/ (entire directory: logger,
event-types, tests)
- packages/core/src/telemetry/integration.test.circular.ts (was a
qwen-logger-specific circular-reference proxy-agent test, no longer
applicable)
- ~30 QwenLogger.getInstance(config)?.logXxxEvent(event) callsites in
loggers.ts
- QwenLogger exports from telemetry/index.ts and core/index.ts
- QwenLogger spies and assertions in config.test.ts and the
describe('logHookCall', ...) block in loggers.test.ts that was
exclusively QwenLogger-shaped
What's kept and rerouted to OTel/Langfuse:
- HookCallEvent type and the logHookCall function — hook execution
data is genuinely useful telemetry (which hook fired, success,
duration, exit code, captured stdout/stderr, error). Now emits a
proto.hook_call OTel log record via logs.getLogger(SERVICE_NAME)
instead of the Alibaba ping. Existing call site in
hookEventHandler.ts:619 still fires per hook execution.
- LoopDetectionDisabledEvent likewise: was an empty no-op after the
qwen-logger pull; rerouted to a proto.loop_detection_disabled OTel
log record so the signal still reaches Langfuse.
- New tests in loggers.test.ts assert OTel emission shape for
logHookCall (success, error, sdk-not-initialized branches).
Renamed (per "all not used" — no existing keychain entries to
invalidate):
- DEFAULT_SERVICE_NAME 'qwen-code-oauth' → 'proto-cli-oauth'
- FORCE_ENCRYPTED_FILE_ENV_VAR 'QWEN_CODE_…' → 'PROTO_CLI_…'
- file-token-storage encryption salt prefix and scrypt key seed
switched to proto-cli; only invalidates non-existent tokens
Verified live: kimi-k2.6 turn through the rebuilt CLI lands a Langfuse
trace with service=proto-cli, scope=proto.openai-pipeline,
gen_ai.response.thinking present. No outbound traffic to aliyuncs.com.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Automaker <automaker@localhost>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore: release v0.26.28 (#168)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: Automaker <automaker@localhost>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>1 parent 244cf48 commit e8628d1
29 files changed
Lines changed: 757 additions & 2531 deletions
File tree
- .github/workflows
- packages
- cli
- src
- acp-integration
- ui/components/messages
- core
- src
- config
- core
- openaiContentGenerator
- extension
- hooks
- mcp/token-storage
- telemetry
- qwen-logger
- test-utils
- web-templates
- webui
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
7 | | - | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
8 | 11 | | |
9 | 12 | | |
10 | 13 | | |
| |||
24 | 27 | | |
25 | 28 | | |
26 | 29 | | |
27 | | - | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
28 | 34 | | |
29 | 35 | | |
30 | 36 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
| 23 | + | |
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
40 | | - | |
| 40 | + | |
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
159 | 159 | | |
160 | 160 | | |
161 | 161 | | |
162 | | - | |
| 162 | + | |
163 | 163 | | |
164 | 164 | | |
165 | 165 | | |
| |||
Lines changed: 73 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
Lines changed: 56 additions & 21 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
227 | 227 | | |
228 | 228 | | |
229 | 229 | | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
230 | 250 | | |
231 | 251 | | |
232 | 252 | | |
233 | 253 | | |
234 | 254 | | |
235 | | - | |
236 | | - | |
237 | | - | |
238 | | - | |
239 | | - | |
240 | | - | |
241 | | - | |
242 | | - | |
243 | | - | |
244 | | - | |
245 | | - | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
246 | 271 | | |
247 | 272 | | |
248 | 273 | | |
249 | 274 | | |
250 | 275 | | |
251 | 276 | | |
252 | | - | |
253 | | - | |
254 | | - | |
255 | | - | |
256 | | - | |
257 | | - | |
258 | | - | |
259 | | - | |
260 | | - | |
261 | | - | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
17 | 16 | | |
18 | 17 | | |
19 | 18 | | |
| |||
235 | 234 | | |
236 | 235 | | |
237 | 236 | | |
238 | | - | |
239 | | - | |
240 | | - | |
241 | 237 | | |
242 | 238 | | |
243 | 239 | | |
| |||
635 | 631 | | |
636 | 632 | | |
637 | 633 | | |
638 | | - | |
639 | | - | |
640 | | - | |
641 | | - | |
642 | | - | |
643 | | - | |
644 | | - | |
645 | | - | |
646 | | - | |
647 | | - | |
648 | 634 | | |
649 | 635 | | |
650 | 636 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
146 | 146 | | |
147 | 147 | | |
148 | 148 | | |
149 | | - | |
150 | 149 | | |
151 | 150 | | |
152 | 151 | | |
| |||
0 commit comments