mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
Every logged non-user user/message collapsed into one identical 「上下文注入」 row, and mid-turn steering rendered in exactly the bubble a turn-opening prompt uses, so the transcript could not say what had been added or which message interrupted a running turn. TranscriptAdapter and the history fold now attach a provenance view to each context node, computed by contextProvenance() from the durable source alone: a role (inject, or recall for a cross-session snapshot) and a producer name read out of the log — instruction paths for workspace-instructions, session titles for session-reference, the plugin id for a plugin source, and the bare kind for any other. No client-side table of producer names, so a renamed or newly mounted producer stays identifiable without a client release and a foreign log projects like a live one. ContextInjectionRow titles itself from the role and shows the name beside it; MessageItem captions durable and pending steering bubbles. The caption reverses one clause of the no-interjection-chrome decision, which removed it because the composer could not steer; composer steering shipped afterwards without amending that note, so this change supplies the product decision its reintroduction clause required and corrects the stale facts left in it. Fixes #1291
66 lines
3.1 KiB
TypeScript
66 lines
3.1 KiB
TypeScript
/**
|
||
* Context provenance projection: the role and producer name a transcript row
|
||
* shows for one logged non-user message, read from the durable source alone.
|
||
*/
|
||
|
||
import { describe, expect, it } from 'vitest'
|
||
import { contextProvenance } from '../src/client/sessions/context-provenance.ts'
|
||
|
||
describe('contextProvenance', () => {
|
||
it('names a plugin producer by its logged plugin id', () => {
|
||
expect(contextProvenance({ kind: 'plugin', plugin: 'dsh-tool-skill' }))
|
||
.toEqual({ role: 'inject', label: 'dsh-tool-skill' })
|
||
})
|
||
|
||
it('names workspace instructions by the files they reconciled, deduplicated in first-seen order', () => {
|
||
expect(contextProvenance({
|
||
kind: 'workspace-instructions',
|
||
baseline: true,
|
||
changes: [
|
||
{ action: 'set', scope: '. |