@klarkxy/dsh-self-improvement 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +41 -0
- package/README.md +35 -0
- package/cordis.patch.yml +5 -0
- package/docs/README.zh-CN.md +23 -0
- package/lib/client.inner.cjs +897 -0
- package/lib/client.inner.cjs.map +1 -0
- package/lib/client.js +1067 -0
- package/lib/contracts.d.ts +103 -0
- package/lib/contracts.js +42 -0
- package/lib/contracts.js.map +1 -0
- package/lib/index.d.ts +118 -0
- package/lib/index.js +1207 -0
- package/lib/index.js.map +1 -0
- package/package.json +108 -0
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/detect.ts","../src/extract.ts","../src/recall.ts","../src/inject.ts","../src/skills.ts","../src/engine.ts","../src/storage.ts","../src/index.ts"],"sourcesContent":["import type { EvidenceRef, LessonTrigger } from './contracts.ts'\n\nexport interface SessionEventLike {\n type: string\n seq: number\n data: unknown\n}\n\nconst HUMAN_CORRECTION = /^(?:不对(?:[,,::\\s]|$)|不是这样|你搞错了|纠正[::]|更正[::]|不要再|以后不要|我说的是|应该改成|that's wrong|that is wrong|you got it wrong|correction:|don't do that again|do not do that again|never do that again|i meant\\b|i said\\b)/i\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\n}\n\nfunction excerptOf(text: string): string {\n const trimmed = text.replace(/\\s+/g, ' ').trim()\n return trimmed.length <= 240 ? trimmed : `${trimmed.slice(0, 237)}...`\n}\n\nexport function textFromContent(content: unknown): string {\n if (!Array.isArray(content)) return typeof content === 'string' ? content : ''\n const parts: string[] = []\n for (const block of content) {\n const row = asRecord(block)\n if (!row) continue\n if (row.type === 'text' && typeof row.text === 'string') parts.push(row.text)\n else if (row.type === 'tool-result' && Array.isArray(row.content)) parts.push(textFromContent(row.content))\n }\n return parts.join('\\n')\n}\n\nfunction sourceKind(data: unknown): string | undefined {\n const row = asRecord(data)\n const source = asRecord(row?.source)\n return typeof source?.kind === 'string' ? source.kind : undefined\n}\n\nexport function isHumanUserMessage(event: SessionEventLike): boolean {\n return event.type === 'user/message' && sourceKind(event.data) === 'user'\n}\n\nexport function lastHumanRequestText(events: readonly SessionEventLike[]): string {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index]\n if (!event || !isHumanUserMessage(event)) continue\n const text = textFromContent(asRecord(event.data)?.content).trim()\n if (text) return text\n }\n return ''\n}\n\nexport function requestTextFromMessages(messages: readonly unknown[]): string {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const row = asRecord(messages[index])\n if (!row) continue\n const source = asRecord(row.source)\n if (source?.kind !== 'user') continue\n const text = textFromContent(row.content).trim()\n if (text) return text\n }\n return ''\n}\n\nfunction toolCallName(events: readonly SessionEventLike[], callId: string): string | undefined {\n for (const event of events) {\n if (event.type !== 'tool/call') continue\n const row = asRecord(event.data)\n if (row && String(row.callId) === callId && typeof row.name === 'string') return row.name\n }\n return undefined\n}\n\nfunction toolResultInfo(event: SessionEventLike): { callId: string; isError: boolean; text: string } | undefined {\n if (event.type !== 'tool/result') return undefined\n const row = asRecord(event.data)\n const message = asRecord(row?.message)\n const content = Array.isArray(message?.content) ? message.content : []\n const block = asRecord(content[0])\n const callId = String(block?.toolCallId ?? asRecord(message?.source)?.callId ?? '')\n if (!callId) return undefined\n const flagged = block?.isError === true || Boolean(row?.error)\n return { callId, isError: flagged, text: textFromContent(content) }\n}\n\nexport function detectLessonTriggers(\n events: readonly SessionEventLike[],\n sessionId: string,\n afterSeq = -1,\n): LessonTrigger[] {\n const triggers: LessonTrigger[] = []\n const seen = new Set<string>()\n const range = events.filter(event => event.seq > afterSeq).sort((a, b) => a.seq - b.seq)\n const priorActivity = events.some(event => event.seq <= afterSeq && (event.type === 'assistant/message' || event.type === 'tool/result' || event.type === 'tool/call'))\n || range.some(event => event.type === 'assistant/message' || event.type === 'tool/call' || event.type === 'tool/result')\n\n for (const event of range) {\n if (!isHumanUserMessage(event) || !priorActivity) continue\n const text = textFromContent(asRecord(event.data)?.content).trim()\n if (!text || !HUMAN_CORRECTION.test(text)) continue\n const evidence: EvidenceRef[] = [{ sessionId, seq: event.seq, kind: 'user', excerpt: excerptOf(text) }]\n const key = evidence.map(item => `${item.seq}:${item.kind}`).join('|')\n if (seen.has(key)) continue\n seen.add(key)\n triggers.push({\n kind: 'human-correction',\n evidence,\n titleHint: excerptOf(text.split(/[。.!?\\n]/, 1)[0] ?? text),\n contentHint: text,\n })\n }\n\n const results = range.flatMap(event => {\n const info = toolResultInfo(event)\n return info ? [{ event, ...info, name: toolCallName(events, info.callId) }] : []\n })\n const pendingFailure = new Map<string, { seq: number; text: string; name: string }>()\n for (const row of results) {\n const name = row.name ?? row.callId\n if (row.isError) {\n if (!pendingFailure.has(name)) pendingFailure.set(name, { seq: row.event.seq, text: row.text, name })\n continue\n }\n const failure = pendingFailure.get(name)\n if (!failure) continue\n pendingFailure.delete(name)\n const evidence: EvidenceRef[] = [\n { sessionId, seq: failure.seq, kind: 'tool', excerpt: excerptOf(failure.text || `${name} failed`) },\n { sessionId, seq: row.event.seq, kind: 'tool', excerpt: excerptOf(row.text || `${name} succeeded`) },\n ]\n const key = evidence.map(item => `${item.seq}:${item.kind}`).join('|')\n if (seen.has(key)) continue\n seen.add(key)\n triggers.push({\n kind: 'verified-tool-fix',\n evidence,\n toolName: name,\n titleHint: `工具 ${name} 失败后已核实修复`,\n contentHint: `工具 ${name} 曾失败,随后同名调用返回非错误结果。失败摘录:${evidence[0]?.excerpt ?? ''}。成功摘录:${evidence[1]?.excerpt ?? ''}。`,\n })\n }\n return triggers\n}\n\nexport function assistantSelfReportIsNotEvidence(text: string): boolean {\n return /我已经记住|我学会了|i(?:['’]ll| will) remember|i have learned|as i(?: have)? (?:fixed|learned)/i.test(text)\n}\n","import { LESSON_SCHEMA_TAG, LESSON_SCHEMA_VERSION, type EvidenceRef, type LessonTrigger, type MemoryRecord, type NewMemoryRecord } from './contracts.ts'\nimport { evidenceWatermark } from './contracts.ts'\n\nexport interface ParsedLessonDraft {\n title: string\n content: string\n exceptions: string[]\n}\n\n/** Matches Memory `newMemoryRecordSchema` field caps so create does not fail as 记忆条目格式无效. */\nconst TITLE_MAX = 160\nconst CONTENT_MAX = 4000\nconst TAG_MAX = 40\nconst EXCEPTION_MAX = 200\nconst EXCERPT_MAX = 400\nconst LIST_MAX = 16\n\nconst SKIP = { skip: true as const }\n\nfunction clip(value: string, max: number): string {\n return value.trim().slice(0, max)\n}\n\nfunction schemaTags(): string[] {\n return [LESSON_SCHEMA_TAG].filter(tag => tag.length > 0 && tag.length <= TAG_MAX).slice(0, LIST_MAX)\n}\n\nfunction schemaEvidence(refs: readonly EvidenceRef[]): EvidenceRef[] {\n return refs.slice(0, LIST_MAX).map(ref => {\n const excerpt = ref.excerpt ? clip(ref.excerpt, EXCERPT_MAX) : undefined\n return excerpt\n ? { sessionId: ref.sessionId, seq: ref.seq, kind: ref.kind, excerpt }\n : { sessionId: ref.sessionId, seq: ref.seq, kind: ref.kind }\n })\n}\n\nexport function parseExtraction(text: string): ParsedLessonDraft | typeof SKIP | undefined {\n const trimmed = text.trim()\n if (!trimmed) return undefined\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)```/i)\n const body = (fenced?.[1] ?? trimmed).trim()\n const start = body.indexOf('{')\n const end = body.lastIndexOf('}')\n if (start < 0 || end <= start) return undefined\n let parsed: unknown\n try { parsed = JSON.parse(body.slice(start, end + 1)) } catch { return undefined }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return undefined\n const row = parsed as Record<string, unknown>\n if (row.skip === true) return SKIP\n if (typeof row.title !== 'string' || typeof row.content !== 'string') return undefined\n const title = clip(row.title, TITLE_MAX)\n const content = clip(row.content, CONTENT_MAX)\n if (!title || !content) return undefined\n const exceptions = Array.isArray(row.exceptions)\n ? row.exceptions.filter((item): item is string => typeof item === 'string').map(item => clip(item, EXCEPTION_MAX)).filter(Boolean).slice(0, LIST_MAX)\n : []\n return { title, content, exceptions }\n}\n\nexport function draftFromTrigger(trigger: LessonTrigger): ParsedLessonDraft {\n return {\n title: clip(trigger.titleHint, TITLE_MAX) || '教训',\n content: clip(trigger.contentHint, CONTENT_MAX),\n exceptions: [],\n }\n}\n\nexport const EXTRACT_SYSTEM = [\n 'Extract at most one durable lesson from the supplied original-session evidence.',\n 'Use only explicit human corrections or a tool failure later verified by a non-error result for the same tool.',\n 'Do not infer success from later silence or from the assistant claiming it learned or fixed anything.',\n 'If evidence is insufficient, reply with JSON {\"skip\":true}.',\n 'Otherwise reply with JSON {\"title\":string,\"content\":string,\"exceptions\":string[]} only.',\n].join(' ')\n\nexport function candidateRecord(\n draft: ParsedLessonDraft,\n trigger: LessonTrigger,\n projectId: string,\n): NewMemoryRecord {\n return {\n scope: { kind: 'project', projectId },\n kind: 'lesson',\n status: 'candidate',\n title: clip(draft.title, TITLE_MAX) || '教训',\n content: clip(draft.content, CONTENT_MAX),\n tags: schemaTags(),\n evidence: schemaEvidence(trigger.evidence),\n exceptions: draft.exceptions.map(item => clip(item, EXCEPTION_MAX)).filter(Boolean).slice(0, LIST_MAX),\n source: 'self-improvement',\n }\n}\n\nexport function hasSameEvidence(existing: readonly MemoryRecord[], trigger: LessonTrigger): boolean {\n const key = evidenceWatermark(trigger.evidence)\n return existing.some(record => record.kind === 'lesson'\n && record.source === 'self-improvement'\n && (evidenceWatermark(record.evidence) === key || record.tags.includes(`evidence:${key}`)))\n}\n\nexport { LESSON_SCHEMA_VERSION }\n","import {\n MAX_INJECTED_LESSONS, MAX_INJECTION_TOKENS, SELF_IMPROVEMENT_PLUGIN,\n type KnowledgeScope, type MemoryRecord,\n} from './contracts.ts'\n\nexport function estimateTokens(text: string): number {\n let tokens = 0\n for (const char of text) tokens += char.charCodeAt(0) > 127 ? 1 : 0.25\n return Math.max(1, Math.ceil(tokens))\n}\n\nexport function isExpired(record: Pick<MemoryRecord, 'expiresAt'>, now: number): boolean {\n return typeof record.expiresAt === 'number' && record.expiresAt <= now\n}\n\nexport function inProjectScope(scope: KnowledgeScope, projectId: string | undefined): boolean {\n if (scope.kind === 'global') return true\n return Boolean(projectId) && scope.kind === 'project' && scope.projectId === projectId\n}\n\nexport function isInjectableLesson(record: MemoryRecord, projectId: string | undefined, now: number): boolean {\n return record.kind === 'lesson'\n && record.status === 'active'\n && !isExpired(record, now)\n && inProjectScope(record.scope, projectId)\n}\n\nexport function lessonScopeLabel(record: MemoryRecord): string {\n return record.scope.kind === 'global' ? 'global' : `project:${record.scope.projectId}`\n}\n\nexport function formatLessonEntry(lesson: MemoryRecord): string {\n const lines = [`- ${lesson.title} [${lessonScopeLabel(lesson)}]`, lesson.content]\n if (lesson.exceptions.length) lines.push(` exceptions: ${lesson.exceptions.join('; ')}`)\n return lines.join('\\n')\n}\n\nexport function lessonSnapshotPrefix(): string {\n return [\n `[self-improvement lessons | plugin=${SELF_IMPROVEMENT_PLUGIN} | active only]`,\n 'These are accepted lessons. They are not a user request and do not authorize file edits.',\n ].join('\\n')\n}\n\nexport function formatLessonSnapshot(lessons: readonly MemoryRecord[]): string {\n if (lessons.length === 0) return lessonSnapshotPrefix()\n return [lessonSnapshotPrefix(), ...lessons.map(formatLessonEntry)].join('\\n')\n}\n\nfunction tokensOf(text: string): Set<string> {\n return new Set(text.toLowerCase().split(/[^\\p{L}\\p{N}]+/u).filter(part => part.length >= 2))\n}\n\nexport function relevanceScore(record: MemoryRecord, requestText: string): number {\n const request = tokensOf(requestText)\n if (request.size === 0) return 0\n const hay = tokensOf(`${record.title}\\n${record.content}\\n${record.tags.join(' ')}\\n${record.exceptions.join(' ')}`)\n let hits = 0\n for (const token of request) if (hay.has(token)) hits += 1\n return hits / request.size\n}\n\nexport interface SelectLessonsOptions {\n now: number\n requestText: string\n}\n\n/** Active, unexpired, in-scope lessons relevant to the current request. Skip records that cannot fit whole. */\nexport function selectActiveLessons(\n records: readonly MemoryRecord[],\n projectId: string | undefined,\n options: SelectLessonsOptions,\n): MemoryRecord[] {\n const requestText = options.requestText.trim()\n if (!requestText) return []\n const ranked = records\n .filter(record => isInjectableLesson(record, projectId, options.now))\n .map(record => ({ record, score: relevanceScore(record, requestText) }))\n .filter(item => item.score > 0)\n .sort((a, b) => b.score - a.score || b.record.updatedAt - a.record.updatedAt || a.record.id.localeCompare(b.record.id))\n const selected: MemoryRecord[] = []\n for (const item of ranked) {\n if (selected.length >= MAX_INJECTED_LESSONS) break\n const next = [...selected, item.record]\n if (estimateTokens(formatLessonSnapshot(next)) > MAX_INJECTION_TOKENS) continue\n selected.push(item.record)\n }\n return selected\n}\n\nexport async function collectLessonRecords(\n list: (scope: KnowledgeScope) => Promise<MemoryRecord[]>,\n projectId: string | undefined,\n): Promise<MemoryRecord[]> {\n const scopes: KnowledgeScope[] = [{ kind: 'global' }]\n if (projectId) scopes.push({ kind: 'project', projectId })\n const rows = await Promise.all(scopes.map(scope => list(scope)))\n const byId = new Map<string, MemoryRecord>()\n for (const record of rows.flat()) byId.set(record.id, record)\n return [...byId.values()]\n}\n","import { createUserMessage } from '@deepseek-ai/dsh-llm'\nimport {\n LESSON_INJECTION_SECTION, SELF_IMPROVEMENT_PLUGIN, SELF_IMPROVEMENT_SOURCE_KIND,\n type LessonInjectPayload, type MemoryRecord, type PreStepDecision,\n} from './contracts.ts'\nimport { formatLessonSnapshot, lessonSnapshotPrefix } from './recall.ts'\n\nexport function isSelfImprovementLessonMessage(message: unknown): boolean {\n if (!message || typeof message !== 'object') return false\n const row = message as { source?: { kind?: string; plugin?: string; form?: string; sections?: Array<{ name?: string }> } }\n if (row.source?.kind !== SELF_IMPROVEMENT_SOURCE_KIND || row.source.plugin !== SELF_IMPROVEMENT_PLUGIN) return false\n return row.source.form === 'snapshot'\n && Boolean(row.source.sections?.some(section => section.name === LESSON_INJECTION_SECTION))\n}\n\nexport function lessonInjectPayload(lessons: readonly MemoryRecord[]): LessonInjectPayload {\n const text = formatLessonSnapshot(lessons)\n return {\n source: {\n kind: SELF_IMPROVEMENT_SOURCE_KIND,\n plugin: SELF_IMPROVEMENT_PLUGIN,\n form: 'snapshot',\n sections: [{ name: LESSON_INJECTION_SECTION, text }],\n },\n content: [{ type: 'text', text }],\n }\n}\n\nexport function createLessonInjectionMessage(lessons: readonly MemoryRecord[]): unknown {\n return createUserMessage(lessonInjectPayload(lessons))\n}\n\nexport function injectLessonMessages(decision: PreStepDecision, lessons: readonly MemoryRecord[]): PreStepDecision {\n if (decision.kind !== 'enter') return decision\n const without = decision.messages.filter(message => !isSelfImprovementLessonMessage(message))\n if (lessons.length === 0) return { ...decision, messages: without }\n return { ...decision, messages: [createLessonInjectionMessage(lessons), ...without] }\n}\n\nexport { formatLessonSnapshot, lessonSnapshotPrefix }\n","import { SELF_IMPROVEMENT_PLUGIN, type MemoryRecord, type SkillRecord, type SkillSourceRef } from './contracts.ts'\nimport { isExpired, lessonScopeLabel } from './recall.ts'\n\nfunction yamlScalar(value: string | number | boolean): string {\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n return JSON.stringify(value)\n}\n\nexport function skillDownloadName(id: string, title: string): string {\n const slug = title.replace(/[^\\p{L}\\p{N}]+/gu, '-').replace(/^-+|-+$/g, '').slice(0, 40) || 'skill'\n const safe = id.replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 12) || 'id'\n return `self-improvement-${slug}-${safe}.md`\n}\n\nexport function skillNameFromTitle(title: string): string {\n return title.replace(/[^\\p{L}\\p{N}]+/gu, '-').replace(/^-+|-+$/g, '').slice(0, 64).toLowerCase() || 'self-improvement-lesson'\n}\n\nexport function skillDescriptionFromLessons(lessons: readonly MemoryRecord[]): string {\n const first = lessons[0]\n const line = (first ? `${first.title}: ${first.content}` : 'Accepted self-improvement lessons.')\n .replace(/[\\r\\n]+/g, ' ')\n .trim()\n return line.slice(0, 200) || 'Accepted self-improvement lessons.'\n}\n\nexport function skillSourcesFromLessons(lessons: readonly MemoryRecord[]): SkillSourceRef[] {\n return lessons.map(lesson => ({\n id: lesson.id,\n revision: lesson.revision,\n status: lesson.status,\n scope: lesson.scope,\n expiresAt: lesson.expiresAt,\n }))\n}\n\nexport function sourcesMatchLive(\n sources: readonly SkillSourceRef[],\n lessons: readonly MemoryRecord[],\n now: number,\n): boolean {\n if (sources.length === 0) return false\n const byId = new Map(lessons.map(lesson => [lesson.id, lesson]))\n for (const source of sources) {\n const live = byId.get(source.id)\n if (!live || live.kind !== 'lesson') return false\n if (live.revision !== source.revision) return false\n if (live.status !== 'active' || source.status !== 'active') return false\n if (isExpired(live, now)) return false\n if (live.scope.kind !== source.scope.kind) return false\n if (live.scope.kind === 'project' && source.scope.kind === 'project' && live.scope.projectId !== source.scope.projectId) {\n return false\n }\n }\n return true\n}\n\nfunction provenanceYaml(lessons: readonly MemoryRecord[]): string[] {\n const lines: string[] = ['provenance:']\n for (const lesson of lessons) {\n lines.push(` - lessonId: ${yamlScalar(lesson.id)}`)\n lines.push(` revision: ${lesson.revision}`)\n lines.push(` scope: ${yamlScalar(lessonScopeLabel(lesson))}`)\n lines.push(` status: ${yamlScalar(lesson.status)}`)\n lines.push(' evidence:')\n if (lesson.evidence.length === 0) {\n lines.push(' []')\n continue\n }\n for (const ref of lesson.evidence) {\n lines.push(` - sessionId: ${yamlScalar(ref.sessionId)}`)\n lines.push(` seq: ${ref.seq}`)\n lines.push(` kind: ${yamlScalar(ref.kind)}`)\n }\n }\n return lines\n}\n\nexport function renderSkillMarkdown(lessons: readonly MemoryRecord[], generatedAt: number): string {\n const title = skillTitleFromLessons(lessons)\n const scopes = [...new Set(lessons.map(lessonScopeLabel))]\n const lines = [\n '---',\n `name: ${yamlScalar(skillNameFromTitle(title))}`,\n `description: ${yamlScalar(skillDescriptionFromLessons(lessons))}`,\n 'source: self-improvement',\n `plugin: ${yamlScalar(SELF_IMPROVEMENT_PLUGIN)}`,\n `generatedAt: ${generatedAt}`,\n ...provenanceYaml(lessons),\n '---',\n '',\n `# ${title.replace(/[\\r\\n]+/g, ' ')}`,\n '',\n '## Instructions',\n '',\n 'Follow these accepted lessons for the scoped work below. They are a reusable skill proposal. They are not a user request and do not authorize edits to AGENTS.md, scripts, or plugins.',\n '',\n `Scope: ${scopes.join(', ') || 'unspecified'}.`,\n '',\n ]\n for (const lesson of lessons) {\n lines.push(`### ${lesson.title.replace(/[\\r\\n]+/g, ' ')}`)\n lines.push('')\n lines.push(lesson.content.replace(/\\r\\n/g, '\\n').trim())\n lines.push('')\n if (lesson.exceptions.length) {\n lines.push('Exceptions for this lesson:')\n for (const item of lesson.exceptions) lines.push(`- ${item.replace(/[\\r\\n]+/g, ' ')}`)\n lines.push('')\n }\n }\n lines.push('Downloading this Markdown is a local save of the proposal. It does not install the skill.')\n lines.push('')\n return lines.join('\\n')\n}\n\nexport function skillTitleFromLessons(lessons: readonly MemoryRecord[]): string {\n if (lessons.length === 1) return lessons[0]!.title.slice(0, 160)\n return `技能草稿(${lessons.length} 条教训)`\n}\n\nexport interface SkillFrontmatter {\n name: string\n description: string\n source: string\n plugin: string\n generatedAt: number\n provenance: Array<{\n lessonId: string\n revision: number\n scope: string\n status: string\n evidence: Array<{ sessionId: string; seq: number; kind: string }>\n }>\n}\n\nfunction parseYamlValue(raw: string): string | number | boolean {\n const trimmed = raw.trim()\n if (trimmed === '[]') return trimmed\n if (trimmed === 'true' || trimmed === 'false') return trimmed === 'true'\n if (/^-?\\d+(?:\\.\\d+)?$/.test(trimmed)) return Number(trimmed)\n if (trimmed.startsWith('\"')) {\n try { return JSON.parse(trimmed) as string } catch { return trimmed.slice(1, -1) }\n }\n return trimmed\n}\n\n/** Parses the YAML subset this package emits (quoted scalars, nested provenance lists). */\nexport function parseSkillFrontmatter(markdown: string): SkillFrontmatter {\n const match = markdown.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n/)\n if (!match) throw new Error('missing YAML frontmatter')\n const body = match[1]!\n const seen = new Set<string>()\n let name = ''\n let description = ''\n let source = ''\n let plugin = ''\n let generatedAt = 0\n const provenance: SkillFrontmatter['provenance'] = []\n let current: SkillFrontmatter['provenance'][number] | undefined\n let evidence: { sessionId: string; seq: number; kind: string } | undefined\n for (const rawLine of body.split(/\\r?\\n/)) {\n if (!rawLine.trim() || rawLine.trim() === '[]') {\n if (rawLine.trim() === '[]' && current && current.evidence.length === 0) continue\n continue\n }\n const keyMatch = rawLine.match(/^([A-Za-z][A-Za-z0-9]*)\\s*:\\s*(.*)$/)\n if (keyMatch && !rawLine.startsWith(' ')) {\n const key = keyMatch[1]!\n if (seen.has(key) && key !== 'provenance') throw new Error(`duplicate YAML key ${key}`)\n seen.add(key)\n const value = parseYamlValue(keyMatch[2] ?? '')\n if (key === 'name') name = String(value)\n else if (key === 'description') description = String(value)\n else if (key === 'source') source = String(value)\n else if (key === 'plugin') plugin = String(value)\n else if (key === 'generatedAt') generatedAt = Number(value)\n continue\n }\n const item = rawLine.match(/^\\s{2}-\\s+lessonId:\\s*(.*)$/)\n if (item) {\n current = { lessonId: String(parseYamlValue(item[1] ?? '')), revision: 0, scope: '', status: '', evidence: [] }\n provenance.push(current)\n evidence = undefined\n continue\n }\n if (!current) continue\n const field = rawLine.match(/^\\s{4}(revision|scope|status|evidence)\\s*:\\s*(.*)$/)\n if (field) {\n const key = field[1]!\n if (key === 'revision') current.revision = Number(parseYamlValue(field[2] ?? ''))\n else if (key === 'scope') current.scope = String(parseYamlValue(field[2] ?? ''))\n else if (key === 'status') current.status = String(parseYamlValue(field[2] ?? ''))\n continue\n }\n const evidenceItem = rawLine.match(/^\\s{6}-\\s+sessionId:\\s*(.*)$/)\n if (evidenceItem) {\n evidence = { sessionId: String(parseYamlValue(evidenceItem[1] ?? '')), seq: 0, kind: '' }\n current.evidence.push(evidence)\n continue\n }\n const evidenceField = rawLine.match(/^\\s{8}(seq|kind)\\s*:\\s*(.*)$/)\n if (evidenceField && evidence) {\n if (evidenceField[1] === 'seq') evidence.seq = Number(parseYamlValue(evidenceField[2] ?? ''))\n else evidence.kind = String(parseYamlValue(evidenceField[2] ?? ''))\n }\n }\n if (!name || !description) throw new Error('skill frontmatter needs name and description')\n return { name, description, source, plugin, generatedAt, provenance }\n}\n\nexport function downloadMarkdown(\n filename: string,\n markdown: string,\n doc: Pick<Document, 'createElement' | 'body'> | undefined = typeof document === 'undefined' ? undefined : document,\n): boolean {\n if (!doc) return false\n const blob = new Blob([markdown], { type: 'text/markdown;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const anchor = doc.createElement('a')\n anchor.href = url\n anchor.setAttribute('download', filename)\n anchor.rel = 'noopener'\n doc.body.appendChild(anchor)\n anchor.click()\n anchor.remove()\n URL.revokeObjectURL(url)\n return true\n}\n\nexport function exportRevocationCopy(locale: 'zh' | 'en'): string {\n return locale === 'en'\n ? 'Export record revoked. Already downloaded files are not recalled.'\n : '已撤回导出记录。不会收回或删除已下载的文件。'\n}\n\nexport function skillExportStateLabel(record: Pick<SkillRecord, 'exportState'>, locale: 'zh' | 'en'): string {\n if (record.exportState === 'recorded') return locale === 'en' ? 'Download recorded' : '已记录下载'\n if (record.exportState === 'revoked') return locale === 'en' ? 'Download record revoked' : '已撤回下载记录'\n return locale === 'en' ? 'Not downloaded' : '未下载'\n}\n","import {\n EXTRACT_PURPOSE, MEMORY_UNAVAILABLE_MESSAGE, SELF_IMPROVEMENT_ACTIVATE_ID,\n fail, projectIdFromCwd, sessionCwd, type AiFeatureScope, type AiServices, type LessonTrigger,\n type MemoryMutationOptions, type MemoryRecord, type MemoryService, type PreStepDecision, type ReviewSnapshot,\n type RpcResult, type SkillRecord, type SessionWatermark,\n} from './contracts.ts'\nimport { detectLessonTriggers, lastHumanRequestText, requestTextFromMessages, type SessionEventLike } from './detect.ts'\nimport { candidateRecord, draftFromTrigger, EXTRACT_SYSTEM, hasSameEvidence, parseExtraction } from './extract.ts'\nimport { injectLessonMessages } from './inject.ts'\nimport { collectLessonRecords, isExpired, selectActiveLessons } from './recall.ts'\nimport {\n renderSkillMarkdown, skillDownloadName, skillSourcesFromLessons, skillTitleFromLessons, sourcesMatchLive,\n} from './skills.ts'\n\nexport interface KvTableLike<V> {\n get(key: string): V | undefined\n entries(): IterableIterator<[string, V]>\n put(key: string, value: V): Promise<void>\n}\n\nexport interface SessionLike {\n id?: unknown\n header?: { cwd?: string }\n meta?: { cwd?: string }\n snapshotEvents(): readonly SessionEventLike[]\n}\n\nexport interface EngineOptions {\n memory: () => MemoryService | undefined\n ai: () => Pick<AiServices, 'activate'> | undefined\n sessionOf: (sessionId: string) => SessionLike | undefined\n skills: KvTableLike<SkillRecord>\n watermarks: KvTableLike<SessionWatermark>\n now?: () => number\n}\n\nconst STALE_MESSAGE = '结果已过期,未写入。'\nconst WRONG_SCOPE_MESSAGE = '教训不属于当前项目,未接受。'\nconst STALE_SKILL_MESSAGE = '来源教训已变更或失效,不能使用这份草稿。'\n\nfunction asObject(payload: unknown): Record<string, unknown> {\n return payload && typeof payload === 'object' && !Array.isArray(payload) ? payload as Record<string, unknown> : {}\n}\nfunction str(body: Record<string, unknown>, key: string): string {\n return typeof body[key] === 'string' ? body[key] : ''\n}\nfunction int(body: Record<string, unknown>, key: string): number | undefined {\n return typeof body[key] === 'number' && Number.isInteger(body[key]) ? body[key] : undefined\n}\nfunction sessionIdOf(session: SessionLike): string {\n return String(session.id ?? '')\n}\n\nexport class SelfImprovementEngine {\n private generation = 1\n private active = true\n private lifetime = new AbortController()\n private storageFailed = false\n private chain = Promise.resolve()\n private readonly extractJobs = new Map<string, number>()\n private aiScope: AiFeatureScope | undefined\n private seenProjects = new Set<string>()\n private readonly now: () => number\n\n constructor(private readonly options: EngineOptions) {\n this.now = options.now ?? Date.now\n }\n\n getGeneration(): number { return this.generation }\n isActive(): boolean { return this.active }\n\n dispose(): void {\n this.active = false\n this.generation += 1\n this.lifetime.abort()\n this.aiScope?.dispose()\n this.aiScope = undefined\n }\n\n private memoryOrError(): MemoryService | RpcResult<never> {\n const memory = this.options.memory()\n if (!memory) return fail('MEMORY_UNAVAILABLE', MEMORY_UNAVAILABLE_MESSAGE)\n return memory\n }\n private asMemory(value: MemoryService | RpcResult<never>): value is MemoryService {\n return typeof (value as MemoryService).list === 'function'\n }\n\n private requireActive(): RpcResult<never> | undefined {\n if (this.active) return undefined\n return fail('DISABLED', '自我改进已关闭,摘录和教训注入已停止。')\n }\n\n private async persist<T>(work: () => Promise<T>): Promise<T> {\n try {\n const value = await work()\n this.storageFailed = false\n return value\n } catch (error) {\n this.storageFailed = true\n throw error\n }\n }\n\n private currentSignal(signal?: AbortSignal): AbortSignal {\n return signal ? AbortSignal.any([signal, this.lifetime.signal]) : this.lifetime.signal\n }\n\n private rememberProject(projectId: string): void {\n this.seenProjects.add(projectId)\n }\n\n private knownProjectIds(extra?: string): string[] {\n const ids = new Set(this.seenProjects)\n if (extra) ids.add(extra)\n for (const [, row] of this.options.watermarks.entries()) {\n if (row.projectId) ids.add(row.projectId)\n }\n return [...ids]\n }\n\n private sameMemory(expected: MemoryService): boolean {\n return this.options.memory() === expected\n }\n\n private beginWork(): { generation: number; memory: MemoryService } | RpcResult<never> {\n const disabled = this.requireActive()\n if (disabled) return disabled\n const memory = this.memoryOrError()\n if (!this.asMemory(memory)) return memory\n return { generation: this.generation, memory }\n }\n\n private isWork(value: { generation: number; memory: MemoryService } | RpcResult<never>): value is { generation: number; memory: MemoryService } {\n return 'memory' in value\n }\n\n /** Linearize disable/replace against captured generation + Memory. Never start a new write after this fails. */\n private revalidate(generation: number, memory: MemoryService): RpcResult<never> | undefined {\n if (this.active && this.generation === generation && this.sameMemory(memory)) return undefined\n if (!this.active) return this.requireActive()\n if (!this.sameMemory(memory)) return fail('MEMORY_UNAVAILABLE', MEMORY_UNAVAILABLE_MESSAGE)\n return fail('SUPERSEDED', STALE_MESSAGE)\n }\n\n private failed<T>(value: T | RpcResult<never>): value is RpcResult<never> {\n return typeof value === 'object' && value !== null && 'ok' in value && (value as { ok: unknown }).ok === false\n }\n\n private mutationGuards(generation: number, memory: MemoryService): MemoryMutationOptions {\n return {\n signal: this.lifetime.signal,\n isCurrent: () => !this.revalidate(generation, memory),\n }\n }\n\n private isGuardRejection(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false\n const name = 'name' in error ? String(error.name) : ''\n const code = 'code' in error ? String((error as { code?: unknown }).code) : ''\n return name === 'AbortError' || name === 'TimeoutError'\n || code === 'ABORT_ERR' || code === 'ABORTED' || code === 'MEMORY_CANCELLED' || code === 'MEMORY_DISABLED' || code === 'CANCELLED'\n }\n\n /** Invoke a Memory/Skill write only while still current. Queued Memory work receives captured generation/identity + lifetime abort. An already-started write is not rolled back; the RPC still fails if we are no longer current after it. */\n private async mutateWhileCurrent<T>(\n generation: number,\n memory: MemoryService,\n run: (guards: MemoryMutationOptions) => Promise<T>,\n ): Promise<T | RpcResult<never>> {\n const before = this.revalidate(generation, memory)\n if (before) return before\n try {\n const value = await run(this.mutationGuards(generation, memory))\n const after = this.revalidate(generation, memory)\n if (after) return after\n return value\n } catch (error) {\n return this.rejectionOrThrow(error, generation, memory)\n }\n }\n\n private rejectionOrThrow(error: unknown, generation: number, memory: MemoryService): RpcResult<never> {\n const stale = this.revalidate(generation, memory)\n if (stale) return stale\n if (this.isGuardRejection(error) || this.lifetime.signal.aborted) return fail('CANCELLED', '操作已取消。')\n throw error\n }\n\n async listAllLessons(projectId?: string, expectedMemory?: MemoryService): Promise<MemoryRecord[]> {\n const memory = expectedMemory ?? this.options.memory()\n if (!memory) return []\n const scopes = [{ kind: 'global' as const }, ...this.knownProjectIds(projectId).map(id => ({ kind: 'project' as const, projectId: id }))]\n const rows = await Promise.all(scopes.map(scope => memory.list({ scope, kinds: ['lesson'] })))\n if (!this.sameMemory(memory)) return []\n const byId = new Map<string, MemoryRecord>()\n for (const record of rows.flat()) {\n if (record.kind === 'lesson') byId.set(record.id, record)\n }\n return [...byId.values()]\n }\n\n currentRequestText(session: SessionLike, decision?: PreStepDecision): string {\n if (decision?.kind === 'enter') {\n const fromDecision = requestTextFromMessages(decision.messages)\n if (fromDecision) return fromDecision\n }\n return lastHumanRequestText(session.snapshotEvents())\n }\n\n async recordsForInjection(projectId: string | undefined, requestText: string, expectedMemory?: MemoryService): Promise<MemoryRecord[]> {\n const generation = this.generation\n const memory = expectedMemory ?? this.options.memory()\n if (!memory || !this.active) return []\n const listed = await collectLessonRecords(scope => memory.list({ scope, kinds: ['lesson'] }), projectId)\n if (!this.active || this.generation !== generation || !this.sameMemory(memory)) return []\n return selectActiveLessons(listed, projectId, { now: this.now(), requestText })\n }\n\n async applyPreStep(session: SessionLike, decision: PreStepDecision, signal: AbortSignal): Promise<PreStepDecision> {\n signal.throwIfAborted()\n if (!this.active || decision.kind !== 'enter') return decision\n const generation = this.generation\n const memory = this.options.memory()\n if (!memory) return injectLessonMessages(decision, [])\n const projectId = projectIdFromCwd(sessionCwd(session))\n const requestText = this.currentRequestText(session, decision)\n const lessons = await this.recordsForInjection(projectId, requestText, memory)\n if (!this.active || this.generation !== generation || !this.sameMemory(memory)) return injectLessonMessages(decision, [])\n return injectLessonMessages(decision, lessons)\n }\n\n private async writeWatermark(sessionId: string, seq: number, projectId?: string): Promise<void> {\n await this.persist(() => this.options.watermarks.put(sessionId, {\n sessionId, seq, projectId, updatedAt: this.now(),\n }))\n }\n\n private ensureAi(): AiFeatureScope | undefined {\n if (this.aiScope?.active) return this.aiScope\n const ai = this.options.ai()\n if (!ai) return undefined\n this.aiScope = ai.activate(SELF_IMPROVEMENT_ACTIVATE_ID)\n this.aiScope.registerPurpose({\n id: EXTRACT_PURPOSE,\n label: '自我改进摘录',\n defaultTarget: { kind: 'role', role: 'normal' },\n maxOutputTokens: 400,\n maxInputChars: 8000,\n })\n return this.aiScope\n }\n\n private async draftTrigger(trigger: LessonTrigger, sessionId: string, sourceVersion: string, signal: AbortSignal, generation: number) {\n const scope = this.ensureAi()\n if (!scope) return draftFromTrigger(trigger)\n const result = await scope.run({\n purpose: EXTRACT_PURPOSE,\n sessionId,\n sourceVersion,\n system: EXTRACT_SYSTEM,\n input: JSON.stringify({ kind: trigger.kind, evidence: trigger.evidence, hint: trigger.contentHint }),\n signal,\n isCurrent: () => this.active && this.generation === generation && scope.active,\n priority: 'background',\n })\n if (!this.active || this.generation !== generation) return undefined\n if (result.receipt.status !== 'success') return undefined\n const parsed = parseExtraction(result.text)\n if (!parsed || 'skip' in parsed) return undefined\n return parsed\n }\n\n private noteExtractStart(sessionId: string): void {\n this.extractJobs.set(sessionId, (this.extractJobs.get(sessionId) ?? 0) + 1)\n }\n\n private noteExtractEnd(sessionId: string): void {\n const next = (this.extractJobs.get(sessionId) ?? 1) - 1\n if (next <= 0) this.extractJobs.delete(sessionId)\n else this.extractJobs.set(sessionId, next)\n }\n\n private isExtracting(sessionId?: string): boolean {\n if (sessionId) return (this.extractJobs.get(sessionId) ?? 0) > 0\n for (const count of this.extractJobs.values()) if (count > 0) return true\n return false\n }\n\n private enqueue<T>(run: () => Promise<T>): Promise<T> {\n const task = this.chain.then(run, run)\n this.chain = task.then(() => {}, () => {})\n return task\n }\n\n /** Queue auto and manual extract on the existing chain. Counts rise synchronously at request entry. */\n private enqueueExtract(\n session: SessionLike,\n signal: AbortSignal,\n mode: 'auto' | 'manual',\n ): Promise<RpcResult<{ created: MemoryRecord[]; skipped: number }>> {\n const sessionId = sessionIdOf(session)\n this.noteExtractStart(sessionId)\n return this.enqueue(async () => {\n try {\n return await this.runExtractFromSession(session, signal, mode)\n } finally {\n this.noteExtractEnd(sessionId)\n }\n })\n }\n\n async extractFromSession(session: SessionLike, signal: AbortSignal, mode: 'auto' | 'manual' = 'auto'): Promise<RpcResult<{ created: MemoryRecord[]; skipped: number }>> {\n return this.enqueueExtract(session, signal, mode)\n }\n\n considerSession(session: SessionLike, signal: AbortSignal): Promise<void> {\n return this.enqueueExtract(session, signal, 'auto').then(() => {}, () => {})\n }\n\n private async runExtractFromSession(session: SessionLike, signal: AbortSignal, mode: 'auto' | 'manual'): Promise<RpcResult<{ created: MemoryRecord[]; skipped: number }>> {\n const disabled = this.requireActive()\n if (disabled) return disabled\n const memory = this.memoryOrError()\n if (!this.asMemory(memory)) return memory\n const sessionId = sessionIdOf(session)\n if (!sessionId) return fail('INVALID', '缺少会话。')\n const projectId = projectIdFromCwd(sessionCwd(session))\n if (!projectId) return fail('WRONG_SCOPE', '无法确定当前项目,未写入候选。')\n const generation = this.generation\n try {\n const combined = this.currentSignal(signal)\n combined.throwIfAborted()\n const events = session.snapshotEvents()\n const lastSeq = events.reduce((max, event) => Math.max(max, event.seq), -1)\n const watermark = this.options.watermarks.get(sessionId)?.seq ?? -1\n const triggers = detectLessonTriggers(events, sessionId, mode === 'manual' ? -1 : watermark)\n if (triggers.length === 0) {\n if (mode === 'auto') {\n const written = await this.mutateWhileCurrent(generation, memory, () => this.writeWatermark(sessionId, lastSeq, projectId))\n if (this.failed(written)) return written\n }\n const stale = this.revalidate(generation, memory)\n if (stale) return stale\n return { ok: true, value: { created: [], skipped: 0 } }\n }\n const existing = await this.listAllLessons(projectId, memory)\n const staleList = this.revalidate(generation, memory)\n if (staleList) return staleList\n const created: MemoryRecord[] = []\n let skipped = 0\n const sourceVersion = `${sessionId}:${watermark}:${lastSeq}:${generation}`\n for (const trigger of triggers) {\n combined.throwIfAborted()\n if (hasSameEvidence(existing.concat(created), trigger)) { skipped += 1; continue }\n const draft = await this.draftTrigger(trigger, sessionId, sourceVersion, combined, generation)\n const staleDraft = this.revalidate(generation, memory)\n if (staleDraft) return staleDraft\n if (!draft) { skipped += 1; continue }\n const record = await this.mutateWhileCurrent(generation, memory, guards => memory.create(candidateRecord(draft, trigger, projectId), guards))\n if (this.failed(record)) return record\n this.rememberProject(projectId)\n const activated = await this.mutateWhileCurrent(generation, memory, guards => memory.update(record.id, { status: 'active' }, record.revision, guards))\n if (this.failed(activated)) { skipped += 1; existing.push(record); continue }\n created.push(activated)\n existing.push(activated)\n }\n const watermarkWrite = await this.mutateWhileCurrent(generation, memory, () => this.writeWatermark(sessionId, lastSeq, projectId))\n if (this.failed(watermarkWrite)) return watermarkWrite\n return { ok: true, value: { created, skipped } }\n } catch (error) {\n return this.rejectionOrThrow(error, generation, memory)\n }\n }\n\n private async requireLesson(\n id: string,\n extraProjectId: string | undefined,\n memory: MemoryService,\n generation: number,\n ): Promise<MemoryRecord | RpcResult<never>> {\n const rows = await this.listAllLessons(extraProjectId, memory)\n const stale = this.revalidate(generation, memory)\n if (stale) return stale\n const record = rows.find(item => item.id === id)\n if (!record || record.kind !== 'lesson') return fail('NOT_FOUND', '找不到该教训。')\n return record\n }\n\n async acceptLesson(id: string, expectedRevision: number, scope: 'project' | 'global', currentProjectId?: string): Promise<RpcResult<MemoryRecord>> {\n const work = this.beginWork()\n if (!this.isWork(work)) return work\n const { generation, memory } = work\n const record = await this.requireLesson(id, currentProjectId, memory, generation)\n if (!('id' in record)) return record\n const stale = this.revalidate(generation, memory)\n if (stale) return stale\n if (record.revision !== expectedRevision) return fail('STALE', '记录已更新,请刷新后重试。')\n if (isExpired(record, this.now())) return fail('STALE', '教训已过期。')\n if (record.status !== 'candidate' && record.status !== 'active') return fail('INVALID', '只能接受候选或已生效的教训。')\n if (scope === 'project') {\n if (record.scope.kind === 'project' && currentProjectId && record.scope.projectId !== currentProjectId) {\n return fail('WRONG_SCOPE', WRONG_SCOPE_MESSAGE)\n }\n const updated = await this.mutateWhileCurrent(generation, memory, guards => memory.update(id, { status: 'active' }, expectedRevision, guards))\n if (this.failed(updated)) return updated\n return { ok: true, value: updated }\n }\n if (record.scope.kind === 'global') {\n const updated = await this.mutateWhileCurrent(generation, memory, guards => memory.update(id, { status: 'active' }, expectedRevision, guards))\n if (this.failed(updated)) return updated\n return { ok: true, value: updated }\n }\n const promoted = await this.mutateWhileCurrent(generation, memory, guards => memory.promoteToGlobal(id, expectedRevision, guards))\n if (this.failed(promoted)) return promoted\n return { ok: true, value: promoted }\n }\n\n async setLessonStatus(id: string, expectedRevision: number, status: 'rejected' | 'revoked', extraProjectId?: string): Promise<RpcResult<MemoryRecord>> {\n const work = this.beginWork()\n if (!this.isWork(work)) return work\n const { generation, memory } = work\n const record = await this.requireLesson(id, extraProjectId, memory, generation)\n if (!('id' in record)) return record\n const stale = this.revalidate(generation, memory)\n if (stale) return stale\n if (record.revision !== expectedRevision) return fail('STALE', '记录已更新,请刷新后重试。')\n const updated = await this.mutateWhileCurrent(generation, memory, guards => memory.update(id, { status }, expectedRevision, guards))\n if (this.failed(updated)) return updated\n return { ok: true, value: updated }\n }\n\n private skills(): SkillRecord[] {\n return [...this.options.skills.entries()].map(([, row]) => row).sort((a, b) => b.updatedAt - a.updatedAt)\n }\n\n private async liveSkillLessons(\n lessonIds: string[],\n memory: MemoryService,\n generation: number,\n ): Promise<MemoryRecord[] | RpcResult<never>> {\n const records = await this.listAllLessons(undefined, memory)\n const stale = this.revalidate(generation, memory)\n if (stale) return stale\n const lessons = lessonIds.map(id => records.find(item => item.id === id))\n if (lessons.some(item => !item || item.kind !== 'lesson')) return fail('INVALID', '找不到所选教训。')\n return lessons as MemoryRecord[]\n }\n\n async previewSkill(lessonIds: string[]): Promise<RpcResult<SkillRecord>> {\n const work = this.beginWork()\n if (!this.isWork(work)) return work\n const { generation, memory } = work\n if (lessonIds.length === 0) return fail('INVALID', '请选择已生效的教训。')\n const lessons = await this.liveSkillLessons(lessonIds, memory, generation)\n if (!Array.isArray(lessons)) return lessons\n const stale = this.revalidate(generation, memory)\n if (stale) return stale\n const now = this.now()\n if (lessons.some(item => item.status !== 'active' || isExpired(item, now))) {\n return fail('INVALID', '只能从未过期且已生效的教训生成技能草稿。')\n }\n const record: SkillRecord = {\n id: crypto.randomUUID(),\n revision: 0,\n status: 'preview',\n lessonIds,\n sources: skillSourcesFromLessons(lessons),\n title: skillTitleFromLessons(lessons),\n markdown: renderSkillMarkdown(lessons, now),\n createdAt: now,\n updatedAt: now,\n exportState: 'none',\n audit: [{ at: now, action: 'preview' }],\n }\n const stored = await this.mutateWhileCurrent(generation, memory, () => this.persist(() => this.options.skills.put(record.id, record)))\n if (this.failed(stored)) return stored\n return { ok: true, value: record }\n }\n\n private skillOrError(id: string): SkillRecord | RpcResult<never> {\n const record = this.options.skills.get(id)\n if (!record) return fail('NOT_FOUND', '找不到该技能草稿。')\n return record\n }\n\n private async requireCurrentSkillSources(\n skill: SkillRecord,\n memory: MemoryService,\n generation: number,\n ): Promise<RpcResult<never> | undefined> {\n const lessons = await this.liveSkillLessons(skill.lessonIds, memory, generation)\n if (!Array.isArray(lessons)) return lessons\n const stale = this.revalidate(generation, memory)\n if (stale) return stale\n if (!sourcesMatchLive(skill.sources, lessons, this.now())) return fail('STALE', STALE_SKILL_MESSAGE)\n return undefined\n }\n\n async patchSkill(id: string, expectedRevision: number, patch: (current: SkillRecord) => SkillRecord): Promise<RpcResult<SkillRecord>> {\n const work = this.beginWork()\n if (!this.isWork(work)) return work\n const { generation, memory } = work\n const current = this.skillOrError(id)\n if (!('id' in current)) return current\n if (current.revision !== expectedRevision) return fail('STALE', '记录已更新,请刷新后重试。')\n const next = { ...patch(current), revision: current.revision + 1, updatedAt: this.now() }\n const stored = await this.mutateWhileCurrent(generation, memory, () => this.persist(() => this.options.skills.put(id, next)))\n if (this.failed(stored)) return stored\n return { ok: true, value: next }\n }\n\n async acceptSkill(id: string, expectedRevision: number): Promise<RpcResult<SkillRecord>> {\n const work = this.beginWork()\n if (!this.isWork(work)) return work\n const { generation, memory } = work\n const current = this.skillOrError(id)\n if (!('id' in current)) return current\n const stale = await this.requireCurrentSkillSources(current, memory, generation)\n if (stale) return stale\n const after = this.revalidate(generation, memory)\n if (after) return after\n return this.patchSkill(id, expectedRevision, record => ({\n ...record, status: 'accepted', audit: [...record.audit, { at: this.now(), action: 'accepted' }],\n }))\n }\n\n async prepareSkillExport(id: string, expectedRevision: number): Promise<RpcResult<{ filename: string; markdown: string; skill: SkillRecord }>> {\n const work = this.beginWork()\n if (!this.isWork(work)) return work\n const { generation, memory } = work\n const current = this.skillOrError(id)\n if (!('id' in current)) return current\n if (current.revision !== expectedRevision) return fail('STALE', '记录已更新,请刷新后重试。')\n if (current.status !== 'accepted' && current.status !== 'preview') return fail('INVALID', '只能导出预览或已接受的技能草稿。')\n const stale = await this.requireCurrentSkillSources(current, memory, generation)\n if (stale) return stale\n const after = this.revalidate(generation, memory)\n if (after) return after\n const filename = skillDownloadName(current.id, current.title)\n return { ok: true, value: { filename, markdown: current.markdown, skill: current } }\n }\n\n async recordSkillExport(id: string, expectedRevision: number, filename: string): Promise<RpcResult<SkillRecord>> {\n return this.patchSkill(id, expectedRevision, record => ({\n ...record,\n exportState: 'recorded',\n exportedAt: this.now(),\n exportFilename: filename,\n audit: [...record.audit, { at: this.now(), action: 'export', detail: filename }],\n }))\n }\n\n async snapshot(sessionId?: string): Promise<RpcResult<ReviewSnapshot>> {\n const session = sessionId ? this.options.sessionOf(sessionId) : undefined\n const projectId = projectIdFromCwd(sessionCwd(session))\n const memoryAvailable = Boolean(this.options.memory())\n return {\n ok: true,\n value: {\n memoryAvailable,\n memoryMessage: memoryAvailable ? undefined : MEMORY_UNAVAILABLE_MESSAGE,\n projectId,\n generation: this.generation,\n storageFailed: this.storageFailed,\n lessons: memoryAvailable ? await this.listAllLessons(projectId) : [],\n skills: this.skills(),\n extracting: this.isExtracting(sessionId),\n },\n }\n }\n\n async call(endpoint: string, payload: unknown, signal: AbortSignal): Promise<RpcResult> {\n try {\n signal.throwIfAborted()\n const body = asObject(payload)\n const sessionId = str(body, 'sessionId')\n const projectId = projectIdFromCwd(sessionCwd(this.options.sessionOf(sessionId)))\n if (endpoint === 'status') return await this.snapshot(sessionId || undefined)\n if (endpoint === 'extract') {\n const session = this.options.sessionOf(sessionId)\n if (!session) return fail('NOT_FOUND', '找不到会话。')\n return await this.extractFromSession(session, signal, 'manual')\n }\n if (endpoint === 'inspect') {\n const work = this.beginWork()\n if (!this.isWork(work)) return work\n const record = await this.requireLesson(str(body, 'id'), projectId, work.memory, work.generation)\n return 'id' in record ? { ok: true, value: record } : record\n }\n if (endpoint === 'accept') {\n const revision = int(body, 'expectedRevision')\n if (!str(body, 'id') || revision === undefined) return fail('INVALID', '缺少记录或版本。')\n const scope = str(body, 'scope') === 'global' ? 'global' : 'project'\n return await this.acceptLesson(str(body, 'id'), revision, scope, projectId)\n }\n if (endpoint === 'reject' || endpoint === 'revoke') {\n const revision = int(body, 'expectedRevision')\n if (!str(body, 'id') || revision === undefined) return fail('INVALID', '缺少记录或版本。')\n return await this.setLessonStatus(str(body, 'id'), revision, endpoint === 'reject' ? 'rejected' : 'revoked', projectId)\n }\n if (endpoint === 'skill.preview') {\n const lessonIds = Array.isArray(body.lessonIds) ? body.lessonIds.filter((id): id is string => typeof id === 'string') : []\n return await this.previewSkill(lessonIds)\n }\n if (endpoint === 'skill.accept') {\n const revision = int(body, 'expectedRevision')\n if (!str(body, 'id') || revision === undefined) return fail('INVALID', '缺少记录或版本。')\n return await this.acceptSkill(str(body, 'id'), revision)\n }\n if (endpoint === 'skill.reject' || endpoint === 'skill.revoke') {\n const revision = int(body, 'expectedRevision')\n if (!str(body, 'id') || revision === undefined) return fail('INVALID', '缺少记录或版本。')\n const status = endpoint === 'skill.reject' ? 'rejected' : 'revoked'\n return await this.patchSkill(str(body, 'id'), revision, current => ({\n ...current, status, audit: [...current.audit, { at: this.now(), action: status }],\n }))\n }\n if (endpoint === 'skill.export') {\n const revision = int(body, 'expectedRevision')\n if (!str(body, 'id') || revision === undefined) return fail('INVALID', '缺少记录或版本。')\n return await this.prepareSkillExport(str(body, 'id'), revision)\n }\n if (endpoint === 'skill.exported') {\n const revision = int(body, 'expectedRevision')\n const filename = str(body, 'filename')\n if (!str(body, 'id') || revision === undefined || !filename) return fail('INVALID', '缺少记录、版本或文件名。')\n return await this.recordSkillExport(str(body, 'id'), revision, filename)\n }\n if (endpoint === 'skill.unexport') {\n const revision = int(body, 'expectedRevision')\n if (!str(body, 'id') || revision === undefined) return fail('INVALID', '缺少记录或版本。')\n return await this.patchSkill(str(body, 'id'), revision, current => ({\n ...current,\n exportState: 'revoked',\n exportRevokedAt: this.now(),\n audit: [...current.audit, { at: this.now(), action: 'unexport', detail: 'in-app record only' }],\n }))\n }\n return fail('INVALID', '未知操作。')\n } catch (error) {\n if (this.isGuardRejection(error) || this.lifetime.signal.aborted) return fail('CANCELLED', '操作已取消。')\n if (this.storageFailed) return fail('STORAGE_FAILED', '保存失败,已保留上一次成功的状态。')\n return fail('INTERNAL', error instanceof Error ? error.message : '操作失败。')\n }\n }\n}\n","import { defineDomain, domainTable } from '@deepseek-ai/dsh-storage-domain'\nimport { z } from 'zod'\nimport { MAX_PROJECT_ID_CHARS } from './contracts.ts'\n\nconst knowledgeScopeSchema = z.union([\n z.object({ kind: z.literal('global') }).strict(),\n z.object({ kind: z.literal('project'), projectId: z.string().min(1).max(MAX_PROJECT_ID_CHARS) }).strict(),\n])\n\nexport const skillSourceSchema = z.object({\n id: z.string().min(1).max(80),\n revision: z.number().int().nonnegative(),\n status: z.enum(['candidate', 'active', 'rejected', 'superseded', 'revoked', 'deleted']),\n scope: knowledgeScopeSchema,\n expiresAt: z.number().int().nonnegative().optional(),\n}).strict()\n\nexport const skillRecordSchema = z.object({\n id: z.string().min(1).max(80),\n revision: z.number().int().nonnegative(),\n status: z.enum(['preview', 'accepted', 'rejected', 'revoked']),\n lessonIds: z.array(z.string().min(1).max(80)).min(1).max(16),\n sources: z.array(skillSourceSchema).min(1).max(16),\n title: z.string().min(1).max(160),\n markdown: z.string().min(1).max(80_000),\n createdAt: z.number().int().nonnegative(),\n updatedAt: z.number().int().nonnegative(),\n exportState: z.enum(['none', 'recorded', 'revoked']),\n exportedAt: z.number().int().nonnegative().optional(),\n exportRevokedAt: z.number().int().nonnegative().optional(),\n exportFilename: z.string().max(180).optional(),\n audit: z.array(z.object({\n at: z.number().int().nonnegative(),\n action: z.string().min(1).max(64),\n detail: z.string().max(500).optional(),\n }).strict()).max(64),\n}).strict()\n\nexport const watermarkSchema = z.object({\n sessionId: z.string().min(1).max(200),\n seq: z.number().int().nonnegative(),\n projectId: z.string().min(1).max(MAX_PROJECT_ID_CHARS).optional(),\n updatedAt: z.number().int().nonnegative(),\n}).strict()\n\nexport const selfImprovementDomain = defineDomain({\n name: 'dsh_editor_self_improvement',\n version: 1,\n tables: {\n skills: domainTable<string, z.output<typeof skillRecordSchema>>(skillRecordSchema),\n watermarks: domainTable<string, z.output<typeof watermarkSchema>>(watermarkSchema),\n },\n})\n","import type { Context } from '@deepseek-ai/cordis'\nimport { SELF_IMPROVEMENT_RPC_CHANNEL, type AiServices, type MemoryService, type PreStepDecision, type SessionWatermark, type SkillRecord } from './contracts.ts'\nimport { SelfImprovementEngine, type KvTableLike, type SessionLike } from './engine.ts'\nimport { registerHostRpc, type HostRpcContext } from '@klarkxy/dsh-ai-services/host-rpc'\nimport { selfImprovementDomain } from './storage.ts'\n\nexport const name = '@klarkxy/dsh-self-improvement'\nexport const inject = ['storageDomain', 'connection', 'webServer'] as const\nexport { CHAT_EVENTS_SLOT, SELF_IMPROVEMENT_RPC_CHANNEL } from './contracts.ts'\nexport { SelfImprovementEngine } from './engine.ts'\n\ndeclare module '@deepseek-ai/cordis' { interface Context { selfImprovement: SelfImprovementEngine } }\n\ntype DomainHandle = {\n table(name: 'skills'): KvTableLike<SkillRecord>\n table(name: 'watermarks'): KvTableLike<SessionWatermark>\n close(): Promise<void>\n}\n\ntype Host = Context & HostRpcContext & {\n storageDomain: { open(spec: typeof selfImprovementDomain): Promise<DomainHandle> }\n}\n\nfunction readService<T>(ctx: Context, key: string): T | undefined {\n const record = ctx as Context & { get?: (name: string) => unknown }\n try {\n const direct = (record as unknown as Record<string, unknown>)[key]\n if (direct !== undefined) return direct as T\n } catch { /* missing cordis accessors throw */ }\n try { return record.get?.(key) as T | undefined } catch { return undefined }\n}\n\nfunction sessionOf(ctx: Context, sessionId: string): SessionLike | undefined {\n const sessions = readService<{ get?(id: string): SessionLike | undefined }>(ctx, 'sessions')\n return sessions?.get?.(sessionId)\n}\n\nexport function listen(ctx: Context, name: string, handler: (...args: never[]) => unknown): (() => void) | undefined {\n const on = ctx.on as unknown as (event: string, listener: (...args: never[]) => unknown) => (() => void) | void\n const off = on.call(ctx, name, handler)\n return typeof off === 'function' ? off : undefined\n}\n\nexport async function apply(ctx: Context): Promise<void> {\n const host = ctx as Host\n const domain = await host.storageDomain.open(selfImprovementDomain)\n const engine = new SelfImprovementEngine({\n memory: () => readService<MemoryService>(ctx, 'aiMemory'),\n ai: () => readService<AiServices>(ctx, 'aiServices'),\n sessionOf: id => sessionOf(ctx, id),\n skills: domain.table('skills'),\n watermarks: domain.table('watermarks'),\n })\n ctx.effect(() => async () => { engine.dispose(); await domain.close() }, 'self-improvement.dispose')\n ctx.provide('selfImprovement', engine)\n ctx.effect(() => registerHostRpc(host, SELF_IMPROVEMENT_RPC_CHANNEL, (endpoint, payload, signal) => engine.call(endpoint, payload, signal)), 'self-improvement.rpc')\n ctx.effect(() => {\n const offStep = listen(ctx, 'agent/pre-step', (async (\n payload: { agent: { session: SessionLike }; signal: AbortSignal },\n next: () => Promise<PreStepDecision>,\n ) => {\n const decision = await next()\n return engine.applyPreStep(payload.agent.session, decision, payload.signal)\n }) as never)\n const offStop = listen(ctx, 'agent/turn-stopping', ((payload: { agent: { session: SessionLike }; signal: AbortSignal }) => {\n void engine.considerSession(payload.agent.session, payload.signal)\n }) as never)\n return () => { offStep?.(); offStop?.() }\n }, 'self-improvement.hooks')\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@klarkxy/dsh-self-improvement",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Self-improvement lessons and skill export over shared Memory",
|
|
5
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=22"
|
|
9
|
+
},
|
|
10
|
+
"main": "./lib/index.js",
|
|
11
|
+
"types": "./lib/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./lib/index.d.ts",
|
|
15
|
+
"import": "./lib/index.js",
|
|
16
|
+
"default": "./lib/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./contracts": {
|
|
19
|
+
"types": "./lib/contracts.d.ts",
|
|
20
|
+
"import": "./lib/contracts.js",
|
|
21
|
+
"default": "./lib/contracts.js"
|
|
22
|
+
},
|
|
23
|
+
"./client": {
|
|
24
|
+
"default": "./lib/client.js"
|
|
25
|
+
},
|
|
26
|
+
"./package.json": "./package.json"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"lib",
|
|
30
|
+
"cordis.patch.yml",
|
|
31
|
+
"README.md",
|
|
32
|
+
"docs/README.zh-CN.md",
|
|
33
|
+
"LICENSE"
|
|
34
|
+
],
|
|
35
|
+
"dsh": {
|
|
36
|
+
"bundle": {
|
|
37
|
+
"patch": "./cordis.patch.yml"
|
|
38
|
+
},
|
|
39
|
+
"client": {
|
|
40
|
+
"platform": "web",
|
|
41
|
+
"inject": [
|
|
42
|
+
"@deepseek-ai/dsh-client-connection",
|
|
43
|
+
"@deepseek-ai/dsh-api-session-controller",
|
|
44
|
+
"@deepseek-ai/dsh-client-locale",
|
|
45
|
+
"@deepseek-ai/dsh-client-ui-session"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"dshEditor": {
|
|
50
|
+
"role": "feature",
|
|
51
|
+
"visibility": "public",
|
|
52
|
+
"wrapClient": true,
|
|
53
|
+
"entries": [
|
|
54
|
+
{
|
|
55
|
+
"id": "self-improvement",
|
|
56
|
+
"title": "自我改进",
|
|
57
|
+
"description": "从明确纠正和已核实的工具失败中自动摘录教训并即时生效;需单独启用记忆",
|
|
58
|
+
"feature": "self-improvement",
|
|
59
|
+
"service": "selfImprovement"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
"dependencies": {
|
|
64
|
+
"@deepseek-ai/dsh-storage-domain": "0.1.7-alpha.1",
|
|
65
|
+
"zod": "^4.1.5",
|
|
66
|
+
"@klarkxy/dsh-ai-services": "0.1.0",
|
|
67
|
+
"@klarkxy/dsh-memory": "0.1.0"
|
|
68
|
+
},
|
|
69
|
+
"peerDependencies": {
|
|
70
|
+
"@deepseek-ai/cordis": "^4.0.3",
|
|
71
|
+
"@deepseek-ai/dsh-llm": ">=0.1.7-alpha.1 <0.2.0"
|
|
72
|
+
},
|
|
73
|
+
"devDependencies": {
|
|
74
|
+
"@deepseek-ai/cordis": "^4.0.3",
|
|
75
|
+
"@deepseek-ai/dsh-llm": "0.1.7-alpha.1",
|
|
76
|
+
"react": "^18.2.0",
|
|
77
|
+
"@types/react": "18.3.31"
|
|
78
|
+
},
|
|
79
|
+
"keywords": [
|
|
80
|
+
"dsh",
|
|
81
|
+
"dsh-plugin",
|
|
82
|
+
"deepseek-harness",
|
|
83
|
+
"self-improvement",
|
|
84
|
+
"memory",
|
|
85
|
+
"lessons"
|
|
86
|
+
],
|
|
87
|
+
"repository": {
|
|
88
|
+
"type": "git",
|
|
89
|
+
"url": "git+https://github.com/klarkxy/dsh-editor.git",
|
|
90
|
+
"directory": "packages/dsh-self-improvement"
|
|
91
|
+
},
|
|
92
|
+
"homepage": "https://github.com/klarkxy/dsh-editor/tree/main/packages/dsh-self-improvement#readme",
|
|
93
|
+
"bugs": {
|
|
94
|
+
"url": "https://github.com/klarkxy/dsh-editor/issues"
|
|
95
|
+
},
|
|
96
|
+
"publishConfig": {
|
|
97
|
+
"access": "public",
|
|
98
|
+
"registry": "https://registry.npmjs.org/"
|
|
99
|
+
},
|
|
100
|
+
"dshRelease": {
|
|
101
|
+
"contentHash": "sha256-383e5d9fafaa214aac969bba5295b413cebe0b5a5b966cfeda201bfef5e3fcd7"
|
|
102
|
+
},
|
|
103
|
+
"scripts": {
|
|
104
|
+
"build": "tsdown && node ../../scripts/wrap-client.mjs @klarkxy/dsh-self-improvement",
|
|
105
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
106
|
+
"test": "vitest run --root ../.. packages/dsh-self-improvement/src"
|
|
107
|
+
}
|
|
108
|
+
}
|