@openclawcity/become 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 +21 -0
- package/README.md +133 -0
- package/dist/cli.cjs +113 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +89 -0
- package/dist/cli.js.map +1 -0
- package/dist/dashboard.cjs +806 -0
- package/dist/dashboard.cjs.map +1 -0
- package/dist/dashboard.d.cts +92 -0
- package/dist/dashboard.d.ts +92 -0
- package/dist/dashboard.js +767 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/index.cjs +2760 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +670 -0
- package/dist/index.d.ts +670 -0
- package/dist/index.js +2696 -0
- package/dist/index.js.map +1 -0
- package/dist/types-DzOc15AL.d.cts +273 -0
- package/dist/types-DzOc15AL.d.ts +273 -0
- package/migrations/001_initial.sql +128 -0
- package/package.json +85 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/scorer.ts","../src/core/validation.ts","../src/core/skill-store.ts","../src/core/reflector.ts","../src/core/milestones.ts","../src/adapters/memory.ts","../src/learn/conversation.ts","../src/learn/skill-evolver.ts","../src/learn/skill-pruner.ts","../src/learn/import.ts","../src/social/peer-review.ts","../src/social/teaching.ts","../src/social/learning-graph.ts","../src/social/reputation.ts","../src/social/norms.ts","../src/measure/awareness.ts","../src/measure/growth.ts","../src/measure/trends.ts","../src/adapters/llm.ts","../src/adapters/sqlite.ts","../src/rl/dataset.ts","../src/rl/train.ts","../src/rl/scheduler.ts","../src/index.ts"],"sourcesContent":["import type { BloomsLevel, DreyfusStage, Score, ScoreInput } from './types.js';\n\n// ── Constants ───────────────────────────────────────────────────────────────\n\nexport const BLOOMS_ORDER: BloomsLevel[] = [\n 'remember', 'understand', 'apply', 'analyze', 'evaluate', 'create',\n];\n\nexport const BLOOMS_SCORE: Record<BloomsLevel, number> = {\n remember: 10,\n understand: 25,\n apply: 45,\n analyze: 65,\n evaluate: 80,\n create: 100,\n};\n\nexport const DREYFUS_THRESHOLDS: Record<string, { next: string; score: number }> = {\n novice: { next: 'Beginner', score: 16 },\n beginner: { next: 'Competent', score: 36 },\n competent: { next: 'Proficient', score: 56 },\n proficient: { next: 'Expert', score: 76 },\n};\n\nexport const WEIGHTS = {\n artifact: 0.30,\n feedback: 0.20,\n improvement: 0.20,\n depth: 0.15,\n social: 0.10,\n teaching: 0.05,\n} as const;\n\n// ── Pure Functions ──────────────────────────────────────────────────────────\n\nexport function dreyfusStage(score: number): DreyfusStage {\n if (score <= 15) return 'novice';\n if (score <= 35) return 'beginner';\n if (score <= 55) return 'competent';\n if (score <= 75) return 'proficient';\n return 'expert';\n}\n\nexport function detectBloomsLevel(input: ScoreInput): BloomsLevel {\n if (input.artifact_count >= 3 && input.total_reactions >= 5 && input.peer_reviews_given > 0) {\n return 'create';\n }\n if (input.peer_reviews_given > 0 || input.peer_reviews_received > 0) {\n return 'evaluate';\n }\n if (input.unique_types >= 2 || input.collab_count >= 1) {\n return 'analyze';\n }\n if (input.artifact_count >= 2) {\n return 'apply';\n }\n if (input.artifact_count >= 1 && input.total_reactions > 0) {\n return 'understand';\n }\n return 'remember';\n}\n\nexport function computeScore(input: ScoreInput): number {\n const avgReactions = input.artifact_count > 0\n ? input.total_reactions / input.artifact_count\n : 0;\n\n const artifactComponent = Math.min(100,\n input.artifact_count * 5 +\n avgReactions * 10 +\n input.unique_types * 8,\n );\n\n const feedbackComponent = Math.min(100, input.peer_reviews_received * 15);\n\n let improvementComponent = 0;\n if (input.artifact_count >= 3 && input.older_reaction_avg > 0) {\n const ratio = input.recent_reaction_avg / Math.max(1, input.older_reaction_avg);\n improvementComponent = Math.min(100, ratio * 50);\n } else if (input.artifact_count >= 3) {\n improvementComponent = Math.min(100, input.recent_reaction_avg * 20);\n }\n\n const depthComponent = BLOOMS_SCORE[detectBloomsLevel(input)];\n\n const socialComponent = Math.min(100,\n input.collab_count * 15 +\n input.follower_count * 5 +\n input.total_reactions * 2,\n );\n\n const teachingComponent = Math.min(100, input.teaching_events * 20);\n\n const raw =\n artifactComponent * WEIGHTS.artifact +\n feedbackComponent * WEIGHTS.feedback +\n improvementComponent * WEIGHTS.improvement +\n depthComponent * WEIGHTS.depth +\n socialComponent * WEIGHTS.social +\n teachingComponent * WEIGHTS.teaching;\n\n return Math.min(100, Math.max(0, Math.round(raw)));\n}\n\nexport function computeFullScore(skill: string, input: ScoreInput): Score {\n const score = computeScore(input);\n return {\n skill,\n score,\n blooms_level: detectBloomsLevel(input),\n dreyfus_stage: dreyfusStage(score),\n evidence: { ...input },\n computed_at: new Date().toISOString(),\n };\n}\n\nexport function nextMilestone(stage: DreyfusStage, score: number): string | null {\n const threshold = DREYFUS_THRESHOLDS[stage];\n if (!threshold) return null;\n const needed = Math.max(0, threshold.score - score);\n return `${threshold.next} at score ${threshold.score} (need ${needed} more)`;\n}\n\nexport function scoreTrend(current: number, weekAgo: number | null): string | null {\n if (weekAgo === null) return null;\n const delta = current - weekAgo;\n return `${delta >= 0 ? '+' : ''}${delta} this week`;\n}\n","const MAX_AGENT_ID_LENGTH = 200;\nconst AGENT_ID_REGEX = /^[a-zA-Z0-9_.:@/-]+$/;\n\nexport function validateAgentId(agentId: string): void {\n if (!agentId || typeof agentId !== 'string') {\n throw new Error('agentId is required and must be a non-empty string');\n }\n if (agentId.length > MAX_AGENT_ID_LENGTH) {\n throw new Error(`agentId too long (max ${MAX_AGENT_ID_LENGTH} chars)`);\n }\n if (!AGENT_ID_REGEX.test(agentId)) {\n throw new Error('agentId contains invalid characters (allowed: alphanumeric, _ . : @ / -)');\n }\n}\n","import type { CatalogEntry, DreyfusStage, Score, Skill, SkillInput, SkillTrend, StorageAdapter } from './types.js';\nimport { computeFullScore, dreyfusStage, nextMilestone, scoreTrend } from './scorer.js';\nimport { validateAgentId } from './validation.js';\n\nconst SKILL_NAME_REGEX = /^[a-z0-9_-]{1,100}$/;\nconst AUTO_VERIFY_THRESHOLD = 3;\n\nexport class SkillStore {\n constructor(private adapter: StorageAdapter) {}\n\n async get(agentId: string, skill: string): Promise<Skill | null> {\n return this.adapter.getSkill(agentId, skill);\n }\n\n async list(agentId: string, opts?: { stage?: DreyfusStage; limit?: number }): Promise<Skill[]> {\n return this.adapter.listSkills(agentId, opts);\n }\n\n async upsert(agentId: string, input: SkillInput): Promise<Skill> {\n validateAgentId(agentId);\n const name = SkillStore.normalizeName(input.name);\n if (!SkillStore.validateName(name)) {\n throw new Error(`Invalid skill name: \"${name}\". Must match ${SKILL_NAME_REGEX}`);\n }\n\n const now = new Date().toISOString();\n const existing = await this.adapter.getSkill(agentId, name);\n\n const skill: Skill = existing\n ? { ...existing, category: input.category ?? existing.category, content: input.content ?? existing.content, updated_at: now }\n : {\n agent_id: agentId,\n name,\n category: input.category ?? 'general',\n score: 0,\n blooms_level: 'remember',\n dreyfus_stage: 'novice',\n evidence: {\n artifact_count: 0, total_reactions: 0, recent_reaction_avg: 0,\n older_reaction_avg: 0, unique_types: 0, collab_count: 0,\n peer_reviews_given: 0, peer_reviews_received: 0,\n follower_count: 0, teaching_events: 0,\n },\n learned_from: [],\n content: input.content,\n created_at: now,\n updated_at: now,\n };\n\n await this.adapter.upsertSkill(skill);\n\n // Auto-discovery: register in catalog if new.\n // Note: upsertCatalogEntry must NOT overwrite status on existing entries\n // to prevent downgrading verified → community.\n await this.adapter.upsertCatalogEntry({\n skill: name,\n category: skill.category ?? 'general',\n description: input.content?.slice(0, 200),\n status: 'community',\n });\n\n // Auto-verify at threshold\n const adopters = await this.adapter.getSkillAdopterCount(name);\n if (adopters >= AUTO_VERIFY_THRESHOLD) {\n await this.adapter.updateCatalogStatus(name, 'verified');\n }\n\n return skill;\n }\n\n async delete(agentId: string, skill: string): Promise<void> {\n return this.adapter.deleteSkill(agentId, skill);\n }\n\n async catalog(): Promise<CatalogEntry[]> {\n return this.adapter.getCatalog();\n }\n\n async holders(skill: string): Promise<Skill[]> {\n return this.adapter.getSkillHolders(skill);\n }\n\n async suggest(agentId: string): Promise<string[]> {\n const owned = await this.adapter.listSkills(agentId);\n const ownedNames = new Set(owned.map((s) => s.name));\n const catalog = await this.adapter.getCatalog();\n return catalog\n .filter((c) => c.status === 'verified' && !ownedNames.has(c.skill))\n .sort((a, b) => b.adopter_count - a.adopter_count)\n .slice(0, 10)\n .map((c) => c.skill);\n }\n\n async history(agentId: string, skill: string, days = 30): Promise<Score[]> {\n return this.adapter.getScoreHistory(agentId, skill, days);\n }\n\n async trending(agentId: string, topN = 5): Promise<SkillTrend[]> {\n const scores = await this.adapter.getLatestScores(agentId);\n const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();\n\n const trends: SkillTrend[] = [];\n for (const s of scores) {\n const history = await this.adapter.getScoreHistory(agentId, s.skill, 7);\n const oldScore = history.length > 0 ? history[0].score : null;\n trends.push({\n skill: s.skill,\n score: s.score,\n stage: s.dreyfus_stage,\n trend: scoreTrend(s.score, oldScore),\n next_milestone: nextMilestone(s.dreyfus_stage, s.score),\n });\n }\n\n // Sort by absolute delta descending\n trends.sort((a, b) => {\n const deltaA = a.trend ? Math.abs(parseInt(a.trend)) : 0;\n const deltaB = b.trend ? Math.abs(parseInt(b.trend)) : 0;\n return deltaB - deltaA;\n });\n\n return trends.slice(0, topN);\n }\n\n static normalizeName(raw: string): string {\n return raw\n .toLowerCase()\n .replace(/\\s+/g, '_')\n .replace(/[^a-z0-9_-]/g, '');\n }\n\n static validateName(name: string): boolean {\n return SKILL_NAME_REGEX.test(name);\n }\n}\n","import type { AgentContext, Observation, Reflection, ReflectionInput, StorageAdapter } from './types.js';\n\nimport { validateAgentId } from './validation.js';\n\nconst SKILL_REGEX = /^[a-zA-Z0-9_-]{1,100}$/;\nconst MIN_REFLECTION_LENGTH = 20;\nconst MAX_REFLECTION_LENGTH = 2000;\nconst MAX_REFLECTIONS_PER_SKILL_PER_DAY = 5;\nconst MAX_OBSERVATIONS = 5;\n\nexport class Reflector {\n constructor(private adapter: StorageAdapter) {}\n\n async reflect(agentId: string, input: ReflectionInput): Promise<Reflection> {\n validateAgentId(agentId);\n if (!SKILL_REGEX.test(input.skill)) {\n throw new Error(`Invalid skill name: \"${input.skill}\"`);\n }\n\n const text = stripHtml(input.reflection.trim());\n if (text.length < MIN_REFLECTION_LENGTH) {\n throw new Error(`Reflection too short (min ${MIN_REFLECTION_LENGTH} chars)`);\n }\n if (text.length > MAX_REFLECTION_LENGTH) {\n throw new Error(`Reflection too long (max ${MAX_REFLECTION_LENGTH} chars)`);\n }\n\n const todayCount = await this.adapter.countReflectionsToday(agentId, input.skill);\n if (todayCount >= MAX_REFLECTIONS_PER_SKILL_PER_DAY) {\n throw new Error(`Rate limit: max ${MAX_REFLECTIONS_PER_SKILL_PER_DAY} reflections per skill per day`);\n }\n\n const reflection: Reflection = {\n agent_id: agentId,\n skill: input.skill,\n artifact_id: input.artifact_id,\n reflection: text,\n created_at: new Date().toISOString(),\n };\n\n return this.adapter.saveReflection(reflection);\n }\n\n async list(agentId: string, opts?: { skill?: string; limit?: number }): Promise<Reflection[]> {\n return this.adapter.getReflections(agentId, opts);\n }\n\n observe(context: AgentContext): Observation[] {\n const observations: Observation[] = [];\n\n const rules = [\n detectCreativeMismatch,\n detectCollaborationGap,\n detectReactionDisparity,\n detectIdleCreative,\n detectQuestStreak,\n detectSoloCreator,\n detectProlificCollaborator,\n detectSymbolicVocabulary,\n detectCollectiveMemory,\n detectCulturalOutlier,\n ];\n\n for (const rule of rules) {\n if (observations.length >= MAX_OBSERVATIONS) break;\n const obs = rule(context);\n if (obs) observations.push(obs);\n }\n\n return observations;\n }\n}\n\n// ── Observation Rules (pure functions) ──────────────────────────────────────\n\nexport function detectCreativeMismatch(ctx: AgentContext): Observation | null {\n if (!ctx.declared_role || ctx.artifacts.length < 3) return null;\n const typeCounts = countBy(ctx.artifacts, (a) => a.type);\n const topType = maxEntry(typeCounts);\n if (!topType) return null;\n const role = ctx.declared_role.replace('agent-', '');\n if (topType[0] === role) return null;\n return {\n type: 'creative_mismatch',\n text: `Your most-created work is ${topType[0]} (${topType[1]} pieces), but you arrived as a ${role}.`,\n };\n}\n\nexport function detectCollaborationGap(ctx: AgentContext): Observation | null {\n if (ctx.collabs_started < 3) return null;\n if (ctx.collabs_completed > Math.floor(ctx.collabs_started / 3)) return null;\n return {\n type: 'collaboration_gap',\n text: `You have accepted ${ctx.collabs_started} collaborations but completed ${ctx.collabs_completed}.`,\n };\n}\n\nexport function detectReactionDisparity(ctx: AgentContext): Observation | null {\n const typeCounts = countBy(ctx.artifacts, (a) => a.type);\n const entries = Object.entries(typeCounts).sort((a, b) => b[1] - a[1]);\n if (entries.length < 2) return null;\n const [topType, topCount] = entries[0];\n const [bottomType, bottomCount] = entries[entries.length - 1];\n if (topCount < 3 || topCount < 3 * bottomCount) return null;\n return {\n type: 'reaction_disparity',\n text: `You've created ${topCount} ${topType} works vs ${bottomCount} ${bottomType} works.`,\n };\n}\n\nexport function detectIdleCreative(ctx: AgentContext): Observation | null {\n if (ctx.skills.length === 0 || ctx.artifacts.length > 0) return null;\n return {\n type: 'idle_creative',\n text: `You have skills registered but haven't created any artifacts yet.`,\n };\n}\n\nexport function detectQuestStreak(ctx: AgentContext): Observation | null {\n if (ctx.quest_completions < 3) return null;\n return {\n type: 'quest_streak',\n text: `You've completed ${ctx.quest_completions} quest(s). Persistence is noticed.`,\n };\n}\n\nexport function detectSoloCreator(ctx: AgentContext): Observation | null {\n if (ctx.artifacts.length < 5 || ctx.collabs_completed > 0) return null;\n return {\n type: 'solo_creator',\n text: `${ctx.artifacts.length} artifacts created, all solo. No collaborations completed.`,\n };\n}\n\nexport function detectProlificCollaborator(ctx: AgentContext): Observation | null {\n if (ctx.collabs_completed < 3 || ctx.follower_count < 3) return null;\n return {\n type: 'prolific_collaborator',\n text: `${ctx.collabs_completed} collaborations completed and ${ctx.follower_count} followers.`,\n };\n}\n\nexport function detectSymbolicVocabulary(ctx: AgentContext): Observation | null {\n const artifactsWithTags = ctx.artifacts.filter((a) => a.tags && a.tags.length > 0);\n if (artifactsWithTags.length < 5 || !ctx.peer_agents_tags) return null;\n\n const myTags = new Set(artifactsWithTags.flatMap((a) => a.tags ?? []));\n if (myTags.size === 0) return null;\n\n let overlapCount = 0;\n for (const [, peerTags] of ctx.peer_agents_tags) {\n const hasOverlap = peerTags.some((t) => myTags.has(t));\n if (hasOverlap) overlapCount++;\n }\n\n if (overlapCount < 3) return null;\n const tagList = [...myTags].slice(0, 5).join(', ');\n return {\n type: 'symbolic_vocabulary',\n text: `Your symbolic vocabulary (${tagList}) resonates with other creators.`,\n };\n}\n\nexport function detectCollectiveMemory(ctx: AgentContext): Observation | null {\n if (ctx.artifacts.length === 0 || !ctx.population_milestones?.length) return null;\n const artifactMilestone = ctx.population_milestones.find((m) => m.type === 'total_artifacts');\n if (!artifactMilestone) return null;\n return {\n type: 'collective_memory',\n text: `You were part of a collective milestone: ${artifactMilestone.title}.`,\n };\n}\n\nexport function detectCulturalOutlier(ctx: AgentContext): Observation | null {\n if (\n ctx.uniqueness_score === undefined ||\n ctx.uniqueness_score >= 0.2 ||\n ctx.artifacts.length < 5 ||\n ctx.collabs_completed < 1\n ) return null;\n return {\n type: 'cultural_outlier',\n text: `Your perspective is genuinely unique among the group.`,\n };\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction stripHtml(text: string): string {\n // Remove complete tags\n let result = text.replace(/<[^>]*>/g, '');\n // Remove unclosed tags (e.g. \"<script\" without closing \">\")\n result = result.replace(/<[^>]*$/g, '');\n // Remove orphaned closing fragments\n result = result.replace(/^[^<]*>/g, (match) => {\n // Only strip if it looks like a tag fragment\n return match.includes('>') ? match.replace(/^[^>]*>/, '') : match;\n });\n // Collapse any remaining angle brackets that could be tag fragments\n result = result.replace(/</g, '').replace(/>/g, '');\n return result;\n}\n\nfunction countBy<T>(items: T[], key: (item: T) => string): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const item of items) {\n const k = key(item);\n counts[k] = (counts[k] ?? 0) + 1;\n }\n return counts;\n}\n\nfunction maxEntry(counts: Record<string, number>): [string, number] | null {\n let max: [string, number] | null = null;\n for (const [k, v] of Object.entries(counts)) {\n if (!max || v > max[1]) max = [k, v];\n }\n return max;\n}\n","import type { CelebrationTier, Milestone, MilestoneConfig, Score, StorageAdapter } from './types.js';\nimport { validateAgentId } from './validation.js';\n\nconst BUILT_IN: Record<string, MilestoneConfig> = {\n skill_discovered: { threshold: 1, description: 'First score for a skill' },\n skill_competent: { threshold: 36, description: 'Reached competent stage' },\n skill_proficient: { threshold: 56, description: 'Reached proficient stage' },\n skill_expert: { threshold: 76, description: 'Reached expert stage' },\n first_artifact: { threshold: 1, description: 'Created first output' },\n ten_artifacts: { threshold: 10, description: 'Created 10 outputs' },\n first_collab: { threshold: 1, description: 'Completed first collaboration' },\n first_teaching: { threshold: 1, description: 'Taught another agent for the first time' },\n first_peer_review: { threshold: 1, description: 'Gave first peer review' },\n identity_shift: { threshold: 1, description: 'Agent evolved its identity' },\n norm_setter: { threshold: 1, description: 'Started a cultural norm adopted by 3+ agents' },\n};\n\nexport class MilestoneDetector {\n private custom: Record<string, MilestoneConfig> = {};\n\n constructor(private adapter: StorageAdapter) {}\n\n register(type: string, config: MilestoneConfig): void {\n this.custom[type] = config;\n }\n\n async check(agentId: string, scores: Score[]): Promise<Milestone[]> {\n validateAgentId(agentId);\n const awarded: Milestone[] = [];\n const now = new Date().toISOString();\n\n // Track global milestones already checked this call to avoid redundant adapter calls\n const globalChecked = new Set<string>();\n\n for (const score of scores) {\n // Skill discovery (per-skill)\n if (score.score > 0) {\n const type = `skill_discovered:${score.skill}`;\n if (await this.tryAward(agentId, type, 1, score.skill, now)) {\n awarded.push({ agent_id: agentId, milestone_type: type, threshold: 1, skill: score.skill, achieved_at: now });\n }\n }\n\n // Stage transitions (per-skill)\n const stageChecks: [string, number][] = [\n ['skill_competent', 36],\n ['skill_proficient', 56],\n ['skill_expert', 76],\n ];\n\n for (const [prefix, threshold] of stageChecks) {\n if (score.score >= threshold) {\n const type = `${prefix}:${score.skill}`;\n if (await this.tryAward(agentId, type, threshold, score.skill, now)) {\n awarded.push({ agent_id: agentId, milestone_type: type, threshold, skill: score.skill, achieved_at: now });\n }\n }\n }\n\n // Global milestones — only check once across all scores\n const globalMilestones: [string, number, boolean][] = [\n ['first_artifact', 1, score.evidence.artifact_count >= 1],\n ['ten_artifacts', 10, score.evidence.artifact_count >= 10],\n ['first_collab', 1, score.evidence.collab_count >= 1],\n ['first_teaching', 1, score.evidence.teaching_events >= 1],\n ['first_peer_review', 1, score.evidence.peer_reviews_given >= 1],\n ];\n\n for (const [type, threshold, eligible] of globalMilestones) {\n if (eligible && !globalChecked.has(type)) {\n globalChecked.add(type);\n if (await this.tryAward(agentId, type, threshold, undefined, now)) {\n awarded.push({ agent_id: agentId, milestone_type: type, threshold, achieved_at: now });\n }\n }\n }\n }\n\n return awarded;\n }\n\n private async tryAward(\n agentId: string,\n milestoneType: string,\n threshold: number,\n skill: string | undefined,\n now: string,\n ): Promise<boolean> {\n const exists = await this.adapter.hasMilestone(agentId, milestoneType, skill);\n if (exists) return false;\n return this.adapter.saveMilestone({\n agent_id: agentId,\n milestone_type: milestoneType,\n threshold,\n skill,\n achieved_at: now,\n });\n }\n\n static celebrationTier(milestoneType: string, threshold?: number): CelebrationTier {\n if (milestoneType.startsWith('skill_expert')) return 'epic';\n if (milestoneType.startsWith('skill_proficient')) return 'large';\n if (milestoneType.startsWith('skill_competent')) return 'medium';\n if (milestoneType.startsWith('skill_discovered')) return 'small';\n if (threshold !== undefined) {\n if (threshold >= 50) return 'large';\n if (threshold >= 10) return 'medium';\n }\n return 'small';\n }\n\n static getBuiltInMilestones(): Record<string, MilestoneConfig> {\n return { ...BUILT_IN };\n }\n}\n","import type {\n CatalogEntry, CulturalNorm, DreyfusStage, LearningEdge, Milestone,\n NormCategory, PeerReview, Reflection, ResponseScore, Score, Skill, StorageAdapter,\n} from '../core/types.js';\n\ninterface StoredScore extends Score {\n agent_id: string;\n}\n\ninterface StoredConversationScore extends ResponseScore {\n agent_id: string;\n session_id?: string;\n}\n\nexport class MemoryStore implements StorageAdapter {\n private skills: Skill[] = [];\n private catalog: Map<string, CatalogEntry & { adopter_set: Set<string> }> = new Map();\n private scoreHistory: StoredScore[] = [];\n private reflections: Reflection[] = [];\n private milestones: Milestone[] = [];\n private peerReviews: PeerReview[] = [];\n private learningEdges: LearningEdge[] = [];\n private reputationMap: Map<string, number> = new Map();\n private conversationScores: StoredConversationScore[] = [];\n private norms: CulturalNorm[] = [];\n private idCounter = 0;\n\n private nextId(): string {\n return String(++this.idCounter);\n }\n\n /** Reset all data. Useful for test isolation. */\n clear(): void {\n this.skills = [];\n this.catalog.clear();\n this.scoreHistory = [];\n this.reflections = [];\n this.milestones = [];\n this.peerReviews = [];\n this.learningEdges = [];\n this.reputationMap.clear();\n this.conversationScores = [];\n this.norms = [];\n this.idCounter = 0;\n }\n\n // ── Skills ──────────────────────────────────────────────────────────────\n\n async getSkill(agentId: string, skill: string): Promise<Skill | null> {\n return this.skills.find((s) => s.agent_id === agentId && s.name === skill) ?? null;\n }\n\n async listSkills(agentId: string, opts?: { stage?: DreyfusStage; limit?: number }): Promise<Skill[]> {\n let result = this.skills.filter((s) => s.agent_id === agentId);\n if (opts?.stage) result = result.filter((s) => s.dreyfus_stage === opts.stage);\n if (opts?.limit) result = result.slice(0, opts.limit);\n return result;\n }\n\n async upsertSkill(skill: Skill): Promise<void> {\n const idx = this.skills.findIndex((s) => s.agent_id === skill.agent_id && s.name === skill.name);\n if (idx >= 0) {\n this.skills[idx] = skill;\n } else {\n this.skills.push(skill);\n }\n // Track adopter in catalog\n const entry = this.catalog.get(skill.name);\n if (entry) {\n entry.adopter_set.add(skill.agent_id);\n entry.adopter_count = entry.adopter_set.size;\n }\n }\n\n async deleteSkill(agentId: string, skill: string): Promise<void> {\n this.skills = this.skills.filter((s) => !(s.agent_id === agentId && s.name === skill));\n // Update catalog adopter count\n const entry = this.catalog.get(skill);\n if (entry) {\n entry.adopter_set.delete(agentId);\n entry.adopter_count = entry.adopter_set.size;\n }\n }\n\n // ── Catalog ─────────────────────────────────────────────────────────────\n\n async getCatalog(): Promise<CatalogEntry[]> {\n return [...this.catalog.values()].map(({ adopter_set, ...entry }) => entry);\n }\n\n async upsertCatalogEntry(entry: Omit<CatalogEntry, 'adopter_count'>): Promise<void> {\n const existing = this.catalog.get(entry.skill);\n if (existing) {\n existing.category = entry.category;\n if (entry.description) existing.description = entry.description;\n return;\n }\n const adopters = this.skills.filter((s) => s.name === entry.skill).map((s) => s.agent_id);\n this.catalog.set(entry.skill, {\n ...entry,\n adopter_count: adopters.length,\n adopter_set: new Set(adopters),\n });\n }\n\n async getSkillHolders(skill: string): Promise<Skill[]> {\n return this.skills.filter((s) => s.name === skill);\n }\n\n async getSkillAdopterCount(skill: string): Promise<number> {\n const entry = this.catalog.get(skill);\n return entry?.adopter_set.size ?? 0;\n }\n\n async updateCatalogStatus(skill: string, status: 'community' | 'verified'): Promise<void> {\n const entry = this.catalog.get(skill);\n if (entry) entry.status = status;\n }\n\n // ── Score History ───────────────────────────────────────────────────────\n\n async saveScore(agentId: string, score: Score): Promise<void> {\n this.scoreHistory.push({ ...score, agent_id: agentId });\n }\n\n async getScoreHistory(agentId: string, skill: string, days = 30): Promise<Score[]> {\n const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();\n return this.scoreHistory\n .filter((s) => s.agent_id === agentId && s.skill === skill && s.computed_at >= cutoff)\n .sort((a, b) => a.computed_at.localeCompare(b.computed_at));\n }\n\n async getLatestScores(agentId: string): Promise<Score[]> {\n const bySkill = new Map<string, StoredScore>();\n for (const s of this.scoreHistory) {\n if (s.agent_id !== agentId) continue;\n const existing = bySkill.get(s.skill);\n if (!existing || s.computed_at > existing.computed_at) {\n bySkill.set(s.skill, s);\n }\n }\n return [...bySkill.values()];\n }\n\n // ── Reflections ─────────────────────────────────────────────────────────\n\n async saveReflection(reflection: Reflection): Promise<Reflection> {\n const saved = { ...reflection, id: reflection.id ?? this.nextId() };\n this.reflections.push(saved);\n return saved;\n }\n\n async getReflections(agentId: string, opts?: { skill?: string; limit?: number }): Promise<Reflection[]> {\n let result = this.reflections.filter((r) => r.agent_id === agentId);\n if (opts?.skill) result = result.filter((r) => r.skill === opts.skill);\n result.sort((a, b) => b.created_at.localeCompare(a.created_at));\n if (opts?.limit) result = result.slice(0, opts.limit);\n return result;\n }\n\n async countReflectionsToday(agentId: string, skill: string): Promise<number> {\n const today = new Date().toISOString().slice(0, 10);\n return this.reflections.filter(\n (r) => r.agent_id === agentId && r.skill === skill && r.created_at.startsWith(today),\n ).length;\n }\n\n // ── Milestones ──────────────────────────────────────────────────────────\n\n async saveMilestone(milestone: Milestone): Promise<boolean> {\n const exists = this.milestones.some(\n (m) => m.agent_id === milestone.agent_id &&\n m.milestone_type === milestone.milestone_type &&\n (m.skill ?? '') === (milestone.skill ?? ''),\n );\n if (exists) return false;\n this.milestones.push(milestone);\n return true;\n }\n\n async getMilestones(agentId: string): Promise<Milestone[]> {\n return this.milestones\n .filter((m) => m.agent_id === agentId)\n .sort((a, b) => b.achieved_at.localeCompare(a.achieved_at));\n }\n\n async hasMilestone(agentId: string, milestoneType: string, skill?: string): Promise<boolean> {\n return this.milestones.some(\n (m) => m.agent_id === agentId &&\n m.milestone_type === milestoneType &&\n (skill === undefined || m.skill === skill),\n );\n }\n\n // ── Peer Reviews ────────────────────────────────────────────────────────\n\n async savePeerReview(review: PeerReview): Promise<PeerReview> {\n const saved = { ...review, id: review.id ?? this.nextId(), created_at: review.created_at ?? new Date().toISOString() };\n this.peerReviews.push(saved);\n return saved;\n }\n\n async getReviewsFor(agentId: string, opts?: { skill?: string }): Promise<PeerReview[]> {\n let result = this.peerReviews.filter((r) => r.submission_agent_id === agentId);\n if (opts?.skill) result = result.filter((r) => r.skill === opts.skill);\n return result;\n }\n\n async getReviewsBy(agentId: string): Promise<PeerReview[]> {\n return this.peerReviews.filter((r) => r.reviewer_agent_id === agentId);\n }\n\n // ── Learning Edges ──────────────────────────────────────────────────────\n\n async saveLearningEdge(edge: LearningEdge): Promise<void> {\n this.learningEdges.push(edge);\n }\n\n async getLearningEdges(agentId: string, direction: 'from' | 'to'): Promise<LearningEdge[]> {\n if (direction === 'from') {\n return this.learningEdges.filter((e) => e.from_agent === agentId);\n }\n return this.learningEdges.filter((e) => e.to_agent === agentId);\n }\n\n // ── Reputation ──────────────────────────────────────────────────────────\n\n async getReputation(agentId: string): Promise<number> {\n return this.reputationMap.get(agentId) ?? 0;\n }\n\n async grantReputation(agentId: string, amount: number, _type: string, _description: string): Promise<void> {\n const current = this.reputationMap.get(agentId) ?? 0;\n this.reputationMap.set(agentId, current + amount);\n }\n\n // ── Conversation Scores ─────────────────────────────────────────────────\n\n async saveConversationScore(agentId: string, score: ResponseScore & { session_id?: string }): Promise<void> {\n this.conversationScores.push({ ...score, agent_id: agentId });\n }\n\n async getConversationScores(agentId: string, opts?: { limit?: number }): Promise<ResponseScore[]> {\n const result = this.conversationScores.filter((s) => s.agent_id === agentId);\n // Return most recent first, consistent with other list methods\n result.reverse();\n if (opts?.limit) return result.slice(0, opts.limit);\n return result;\n }\n\n // ── Cultural Norms ──────────────────────────────────────────────────────\n\n async saveNorm(norm: CulturalNorm): Promise<void> {\n const idx = this.norms.findIndex((n) => n.id === norm.id);\n if (idx >= 0) {\n this.norms[idx] = norm;\n } else {\n this.norms.push(norm);\n }\n }\n\n async getNorms(opts?: { category?: NormCategory; limit?: number }): Promise<CulturalNorm[]> {\n let result = [...this.norms];\n if (opts?.category) result = result.filter((n) => n.category === opts.category);\n result.sort((a, b) => b.first_observed_at.localeCompare(a.first_observed_at));\n if (opts?.limit) result = result.slice(0, opts.limit);\n return result;\n }\n}\n","import type { ConversationTurn, ResponseScore, StorageAdapter } from '../core/types.js';\nimport { validateAgentId } from '../core/validation.js';\n\nexport interface LearningSignal {\n skill_updates: { skill: string; delta: number; reason: string }[];\n new_skills?: string[];\n observations?: string[];\n}\n\nexport interface ConversationSession {\n agent_id: string;\n session_id?: string;\n turns: ConversationTurn[];\n}\n\nexport interface SessionLearning {\n turns_scored: number;\n success_rate: number;\n skills_improved: string[];\n skills_degraded: string[];\n failure_patterns: string[];\n should_evolve: boolean;\n}\n\n/** Optional LLM judge for automated response scoring */\nexport interface LLMJudge {\n score(userMessage: string, agentResponse: string, context?: string): Promise<{ quality: -1 | 0 | 1; reasoning: string }>;\n}\n\nconst EVOLVE_THRESHOLD = 0.4;\n\nexport class ConversationLearner {\n constructor(\n private adapter: StorageAdapter,\n private judge?: LLMJudge,\n ) {}\n\n /** Score a single conversation turn using feedback signals */\n scoreResponse(turn: ConversationTurn): ResponseScore {\n const feedback = turn.feedback;\n\n // Explicit feedback is strongest signal\n if (feedback?.explicit === 'positive') {\n return { quality: 1, confidence: 0.9, skill_signals: turn.context.active_skills };\n }\n if (feedback?.explicit === 'negative') {\n return { quality: -1, confidence: 0.9, skill_signals: turn.context.active_skills, failure_patterns: ['explicit_negative'] };\n }\n\n // Implicit feedback is secondary\n if (feedback?.implicit === 'accepted') {\n return { quality: 1, confidence: 0.6, skill_signals: turn.context.active_skills };\n }\n if (feedback?.implicit === 'retry') {\n return { quality: -1, confidence: 0.7, skill_signals: turn.context.active_skills, failure_patterns: ['user_retry'] };\n }\n if (feedback?.implicit === 'modified') {\n return { quality: 0, confidence: 0.5, skill_signals: turn.context.active_skills };\n }\n\n // No feedback — uncertain\n return { quality: 0, confidence: 0.3, skill_signals: turn.context.active_skills };\n }\n\n /** Score using optional LLM judge for higher-quality automated assessment */\n async scoreWithJudge(turn: ConversationTurn): Promise<ResponseScore> {\n if (!this.judge) {\n return this.scoreResponse(turn);\n }\n\n try {\n const result = await this.judge.score(\n turn.user_message,\n turn.agent_response,\n turn.context.current_task,\n );\n return {\n quality: result.quality,\n confidence: 0.8,\n skill_signals: turn.context.active_skills,\n failure_patterns: result.quality === -1 ? [result.reasoning] : undefined,\n };\n } catch {\n // Fallback to feedback-based scoring if judge fails\n return this.scoreResponse(turn);\n }\n }\n\n /** Process a turn: score it and persist */\n async afterTurn(turn: ConversationTurn): Promise<LearningSignal> {\n validateAgentId(turn.agent_id);\n const score = this.judge\n ? await this.scoreWithJudge(turn)\n : this.scoreResponse(turn);\n\n await this.adapter.saveConversationScore(turn.agent_id, {\n ...score,\n session_id: turn.session_id,\n });\n\n const skillUpdates = score.skill_signals.map((skill) => ({\n skill,\n delta: score.quality,\n reason: score.quality === 1 ? 'positive_feedback' : score.quality === -1 ? 'negative_feedback' : 'neutral',\n }));\n\n return {\n skill_updates: skillUpdates,\n observations: score.failure_patterns,\n };\n }\n\n /** Summarize learning across a full session */\n async afterSession(session: ConversationSession): Promise<SessionLearning> {\n validateAgentId(session.agent_id);\n const scores: ResponseScore[] = [];\n\n for (const turn of session.turns) {\n const score = this.judge\n ? await this.scoreWithJudge(turn)\n : this.scoreResponse(turn);\n scores.push(score);\n\n await this.adapter.saveConversationScore(session.agent_id, {\n ...score,\n session_id: session.session_id,\n });\n }\n\n const positive = scores.filter((s) => s.quality === 1).length;\n const total = scores.length;\n const successRate = total > 0 ? positive / total : 0;\n\n // Aggregate skill signals\n const skillDelta = new Map<string, number>();\n for (const score of scores) {\n for (const skill of score.skill_signals) {\n skillDelta.set(skill, (skillDelta.get(skill) ?? 0) + score.quality);\n }\n }\n\n const improved: string[] = [];\n const degraded: string[] = [];\n for (const [skill, delta] of skillDelta) {\n if (delta > 0) improved.push(skill);\n else if (delta < 0) degraded.push(skill);\n }\n\n const failurePatterns = scores\n .flatMap((s) => s.failure_patterns ?? [])\n .filter((p, i, arr) => arr.indexOf(p) === i); // dedupe\n\n return {\n turns_scored: total,\n success_rate: successRate,\n skills_improved: improved,\n skills_degraded: degraded,\n failure_patterns: failurePatterns,\n should_evolve: successRate < EVOLVE_THRESHOLD && total >= 3,\n };\n }\n\n /** Batch score multiple turns */\n batchScore(turns: ConversationTurn[]): ResponseScore[] {\n return turns.map((turn) => this.scoreResponse(turn));\n }\n}\n","import type { ConversationTurn, ResponseScore, Skill } from '../core/types.js';\n\nexport interface GeneratedSkill {\n name: string;\n category: string;\n content: string;\n source: 'evolved';\n evolved_from: string[];\n}\n\nexport interface EvolveLLM {\n generate(prompt: string): Promise<string>;\n}\n\nconst EVOLVE_THRESHOLD = 0.4;\nconst MAX_FAILURES = 6;\nconst MAX_SKILLS_PER_EVOLUTION = 3;\n\nexport class SkillEvolver {\n constructor(private llm: EvolveLLM) {}\n\n /** Check if evolution should trigger based on recent scores */\n shouldEvolve(recentScores: ResponseScore[]): boolean {\n if (recentScores.length < 3) return false;\n const positive = recentScores.filter((s) => s.quality === 1).length;\n return (positive / recentScores.length) < EVOLVE_THRESHOLD;\n }\n\n /** Generate corrective skills from failure patterns */\n async evolve(\n failures: { turn: ConversationTurn; score: ResponseScore }[],\n existingSkills: Skill[],\n ): Promise<GeneratedSkill[]> {\n const limited = failures.slice(0, MAX_FAILURES);\n const existingNames = new Set(existingSkills.map((s) => s.name));\n\n // Build prompt — sanitize user content to prevent prompt injection\n const failureDescriptions = limited.map((f, i) => {\n const patterns = f.score.failure_patterns?.join(', ') ?? 'unknown';\n return `Failure ${i + 1}:\\n User: ${sanitize(truncate(f.turn.user_message, 200))}\\n Agent: ${sanitize(truncate(f.turn.agent_response, 200))}\\n Patterns: ${patterns}`;\n }).join('\\n\\n');\n\n const existingList = existingSkills\n .slice(0, 20)\n .map((s) => `- ${s.name} (${s.dreyfus_stage})`)\n .join('\\n');\n\n const prompt = `Analyze these failed agent responses and generate 1-${MAX_SKILLS_PER_EVOLUTION} corrective skills.\n\nFAILURES:\n${failureDescriptions}\n\nEXISTING SKILLS (do not duplicate):\n${existingList || '(none)'}\n\nFor each skill, output valid JSON array:\n[{\"name\": \"snake_case_name\", \"category\": \"category\", \"content\": \"Markdown instruction\"}]\n\nRules:\n- name must be snake_case, 1-100 chars\n- content is a concise instruction (2-5 sentences) the agent should follow\n- Do not create skills that already exist\n- Max ${MAX_SKILLS_PER_EVOLUTION} skills`;\n\n try {\n const response = await this.llm.generate(prompt);\n const skills = this.parseResponse(response, existingNames);\n return skills;\n } catch {\n return [];\n }\n }\n\n private parseResponse(response: string, existingNames: Set<string>): GeneratedSkill[] {\n // Try to extract JSON array from response\n const jsonMatch = response.match(/\\[[\\s\\S]*\\]/);\n if (!jsonMatch) return [];\n\n try {\n const parsed = JSON.parse(jsonMatch[0]);\n if (!Array.isArray(parsed)) return [];\n\n return parsed\n .filter((s: any) => {\n if (typeof s.name !== 'string' || typeof s.content !== 'string') return false;\n if (s.name.length === 0 || s.name.length > 100) return false;\n // Normalize BEFORE dedup check to prevent bypass\n const normalized = s.name.toLowerCase().replace(/\\s+/g, '_').replace(/[^a-z0-9_-]/g, '');\n return normalized.length > 0 && !existingNames.has(normalized);\n })\n .slice(0, MAX_SKILLS_PER_EVOLUTION)\n .map((s: any) => ({\n name: s.name.toLowerCase().replace(/\\s+/g, '_').replace(/[^a-z0-9_-]/g, ''),\n category: typeof s.category === 'string' ? s.category.slice(0, 100) : 'general',\n content: String(s.content).slice(0, 2000),\n source: 'evolved' as const,\n evolved_from: Array.isArray(s.failure_patterns) ? s.failure_patterns.slice(0, 10) : [],\n }));\n } catch {\n return [];\n }\n }\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 3) + '...';\n}\n\n/** Strip characters that could be used for prompt injection */\nfunction sanitize(text: string): string {\n // Remove control characters and common injection delimiters\n return text\n .replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, '') // control chars\n .replace(/```/g, \"'''\"); // prevent code fence injection\n}\n","import type { Score, Skill, StorageAdapter } from '../core/types.js';\nimport { validateAgentId } from '../core/validation.js';\n\nconst DEFAULT_MIN_AGE_DAYS = 14;\nconst PROTECTED_STAGES = new Set(['competent', 'proficient', 'expert']);\n\nexport class SkillPruner {\n /**\n * Identify skills that don't correlate with improved scores.\n *\n * Rules:\n * - Skill must be at least minAge days old\n * - Score has not improved (delta <= 0) over skill's lifetime → candidate\n * - Never prune skills at competent stage or above (proven useful)\n * - Requires at least 2 score history points to judge trajectory\n */\n findIneffective(\n skills: Skill[],\n scoreHistory: Map<string, Score[]>,\n minAge = DEFAULT_MIN_AGE_DAYS,\n ): string[] {\n const now = Date.now();\n const minAgeMs = minAge * 24 * 60 * 60 * 1000;\n const candidates: string[] = [];\n\n for (const skill of skills) {\n // Never prune high-stage skills\n if (PROTECTED_STAGES.has(skill.dreyfus_stage)) continue;\n\n // Must be old enough\n const age = now - new Date(skill.created_at).getTime();\n if (age < minAgeMs) continue;\n\n // Check score trajectory\n const history = scoreHistory.get(skill.name) ?? [];\n if (history.length < 2) continue;\n\n const oldest = history[0].score;\n const newest = history[history.length - 1].score;\n const delta = newest - oldest;\n\n if (delta > 0) continue; // Improving — keep\n\n // delta <= 0: stagnant or degrading — candidate for pruning\n candidates.push(skill.name);\n }\n\n return candidates;\n }\n\n /** Remove identified skills */\n async prune(adapter: StorageAdapter, agentId: string, skillNames: string[]): Promise<number> {\n validateAgentId(agentId);\n let removed = 0;\n for (const name of skillNames) {\n await adapter.deleteSkill(agentId, name);\n removed++;\n }\n return removed;\n }\n}\n","import type { SkillInput } from '../core/types.js';\nimport { readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join, extname } from 'node:path';\n\n/**\n * Parse a single Markdown skill file with YAML frontmatter.\n *\n * Expected format:\n * ---\n * name: skill_name\n * category: coding\n * ---\n * Skill content here...\n */\nexport function parseSkillFile(content: string): SkillInput | null {\n const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/);\n if (!frontmatterMatch) {\n // No frontmatter — try to infer from content\n const trimmed = content.trim();\n if (trimmed.length < 5) return null;\n return { name: 'unnamed', content: trimmed };\n }\n\n const [, frontmatter, body] = frontmatterMatch;\n const meta: Record<string, string> = {};\n\n for (const line of frontmatter.split('\\n')) {\n const colonIdx = line.indexOf(':');\n if (colonIdx === -1) continue;\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n if (key && value) meta[key] = value;\n }\n\n const name = meta.name ?? meta.title ?? 'unnamed';\n return {\n name: name.toLowerCase().replace(/\\s+/g, '_').replace(/[^a-z0-9_-]/g, ''),\n category: meta.category ?? meta.type ?? 'general',\n content: body.trim() || undefined,\n };\n}\n\nconst MAX_RECURSION_DEPTH = 10;\n\n/**\n * Import skills from a directory of Markdown files.\n * Recursively scans for .md files with YAML frontmatter.\n * Max recursion depth: 10 levels.\n */\nexport function importSkillDirectory(dir: string, _depth = 0): SkillInput[] {\n if (_depth > MAX_RECURSION_DEPTH) return [];\n\n const skills: SkillInput[] = [];\n\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n throw new Error(`Cannot read directory: ${dir}`);\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n\n let stat;\n try {\n stat = statSync(fullPath);\n } catch {\n continue;\n }\n\n if (stat.isDirectory()) {\n skills.push(...importSkillDirectory(fullPath, _depth + 1));\n } else if (extname(entry) === '.md') {\n try {\n const content = readFileSync(fullPath, 'utf-8');\n const skill = parseSkillFile(content);\n if (skill && skill.name !== 'unnamed') {\n skills.push(skill);\n }\n } catch {\n // Skip files that can't be read\n }\n }\n }\n\n return skills;\n}\n","import type { LearningEdge, PeerReview, ReviewAssignment, ReviewVerdict, StorageAdapter } from '../core/types.js';\nimport { validateAgentId } from '../core/validation.js';\n\nconst MIN_ASSESSMENT_LENGTH = 100;\nconst MAX_ASSESSMENT_LENGTH = 10000;\nconst MAX_LIST_ITEMS = 20;\nconst MAX_LIST_ITEM_LENGTH = 500;\n\nexport class PeerReviewProtocol {\n constructor(private adapter: StorageAdapter) {}\n\n /**\n * Round-robin reviewer assignment. Each submission gets 2 reviewers.\n * No self-review. Wraps around for small groups.\n */\n assignReviewers(submissionAgentIds: string[]): ReviewAssignment[] {\n if (submissionAgentIds.length < 2) {\n throw new Error('Need at least 2 agents for peer review');\n }\n\n return submissionAgentIds.map((agentId, i) => {\n const reviewers: string[] = [];\n let offset = 1;\n while (reviewers.length < 2 && offset < submissionAgentIds.length) {\n const reviewerIdx = (i + offset) % submissionAgentIds.length;\n const reviewer = submissionAgentIds[reviewerIdx];\n if (reviewer !== agentId) {\n reviewers.push(reviewer);\n }\n offset++;\n }\n return {\n submission_agent_id: agentId,\n reviewer_agent_ids: reviewers,\n };\n });\n }\n\n async submitReview(review: PeerReview): Promise<PeerReview> {\n validateAgentId(review.reviewer_agent_id);\n validateAgentId(review.submission_agent_id);\n\n if (review.reviewer_agent_id === review.submission_agent_id) {\n throw new Error('Cannot review your own submission');\n }\n\n if (this.isSuperficial(review)) {\n throw new Error('Review is too superficial: assessment must be at least 100 chars and include weaknesses');\n }\n\n if (review.overall_assessment.length > MAX_ASSESSMENT_LENGTH) {\n throw new Error(`Assessment too long (max ${MAX_ASSESSMENT_LENGTH} chars)`);\n }\n\n // Sanitize list fields — cap length and item count\n const sanitized: PeerReview = {\n ...review,\n overall_assessment: review.overall_assessment.slice(0, MAX_ASSESSMENT_LENGTH),\n strengths: review.strengths.slice(0, MAX_LIST_ITEMS).map(s => s.slice(0, MAX_LIST_ITEM_LENGTH)),\n weaknesses: review.weaknesses.slice(0, MAX_LIST_ITEMS).map(s => s.slice(0, MAX_LIST_ITEM_LENGTH)),\n suggestions: review.suggestions.slice(0, MAX_LIST_ITEMS).map(s => s.slice(0, MAX_LIST_ITEM_LENGTH)),\n };\n\n const saved = await this.adapter.savePeerReview(sanitized);\n\n // Record learning for both parties\n await this.recordLearning(saved);\n\n return saved;\n }\n\n /**\n * Tally verdicts across reviewers.\n * All reject → rejected. Any major_revision → revision_requested. Otherwise → accepted.\n */\n tallyVerdicts(verdicts: ReviewVerdict[]): 'accepted' | 'revision_requested' | 'rejected' {\n if (verdicts.length === 0) return 'accepted';\n if (verdicts.every((v) => v === 'reject')) return 'rejected';\n if (verdicts.some((v) => v === 'major_revision')) return 'revision_requested';\n return 'accepted';\n }\n\n /**\n * Detect low-quality reviews: < 100 chars overall assessment OR no weaknesses listed.\n */\n isSuperficial(review: PeerReview): boolean {\n if (review.overall_assessment.length < MIN_ASSESSMENT_LENGTH) return true;\n if (!review.weaknesses || review.weaknesses.length === 0) return true;\n return false;\n }\n\n /**\n * Create learning edges for both reviewer and reviewee.\n * Reviewer learns by evaluating. Reviewee learns from feedback.\n */\n async recordLearning(review: PeerReview): Promise<void> {\n const now = new Date().toISOString();\n const skill = review.skill ?? 'general';\n\n // Reviewer learns by evaluating (improves their evaluate-level understanding)\n await this.adapter.saveLearningEdge({\n from_agent: review.submission_agent_id,\n to_agent: review.reviewer_agent_id,\n skill,\n event_type: 'peer_review',\n score_delta: 0, // Delta computed later when scores are recalculated\n metadata: { role: 'reviewer', verdict: review.verdict },\n created_at: now,\n });\n\n // Reviewee learns from feedback\n await this.adapter.saveLearningEdge({\n from_agent: review.reviewer_agent_id,\n to_agent: review.submission_agent_id,\n skill,\n event_type: 'peer_review',\n score_delta: 0,\n metadata: { role: 'reviewee', verdict: review.verdict, suggestions_count: review.suggestions.length },\n created_at: now,\n });\n }\n}\n","import type { DreyfusStage, LearningEdge, Skill, StorageAdapter } from '../core/types.js';\nimport { validateAgentId } from '../core/validation.js';\n\nexport interface TeachingContext {\n artifact_id?: string;\n description?: string;\n}\n\nexport interface TeacherCandidate {\n agent_id: string;\n skill: string;\n score: number;\n stage: DreyfusStage;\n}\n\nexport interface StudentCandidate {\n agent_id: string;\n skill: string;\n score: number;\n stage: DreyfusStage;\n}\n\nconst STAGE_ORDER: DreyfusStage[] = ['novice', 'beginner', 'competent', 'proficient', 'expert'];\n\nexport class TeachingProtocol {\n constructor(private adapter: StorageAdapter) {}\n\n async teach(\n teacher: string,\n student: string,\n skill: string,\n context?: TeachingContext,\n ): Promise<LearningEdge> {\n validateAgentId(teacher);\n validateAgentId(student);\n\n if (teacher === student) {\n throw new Error('Cannot teach yourself');\n }\n\n if (!skill || skill.length > 100) {\n throw new Error('Skill name is required and must be 100 chars or fewer');\n }\n\n const now = new Date().toISOString();\n const edge: LearningEdge = {\n from_agent: teacher,\n to_agent: student,\n skill,\n event_type: 'teaching',\n score_delta: 0,\n metadata: context ? { ...context } : {},\n created_at: now,\n };\n\n await this.adapter.saveLearningEdge(edge);\n return edge;\n }\n\n async findTeachers(skill: string, opts?: { minStage?: DreyfusStage }): Promise<TeacherCandidate[]> {\n const holders = await this.adapter.getSkillHolders(skill);\n const minIdx = opts?.minStage ? STAGE_ORDER.indexOf(opts.minStage) : 0;\n\n return holders\n .filter((s) => STAGE_ORDER.indexOf(s.dreyfus_stage) >= minIdx)\n .sort((a, b) => b.score - a.score)\n .map((s) => ({\n agent_id: s.agent_id,\n skill: s.name,\n score: s.score,\n stage: s.dreyfus_stage,\n }));\n }\n\n async findStudents(skill: string, teacherAgentId: string): Promise<StudentCandidate[]> {\n validateAgentId(teacherAgentId);\n const holders = await this.adapter.getSkillHolders(skill);\n const teacher = holders.find((s) => s.agent_id === teacherAgentId);\n const teacherStageIdx = teacher ? STAGE_ORDER.indexOf(teacher.dreyfus_stage) : STAGE_ORDER.length;\n\n return holders\n .filter((s) => s.agent_id !== teacherAgentId && STAGE_ORDER.indexOf(s.dreyfus_stage) < teacherStageIdx)\n .sort((a, b) => a.score - b.score)\n .map((s) => ({\n agent_id: s.agent_id,\n skill: s.name,\n score: s.score,\n stage: s.dreyfus_stage,\n }));\n }\n\n async teachingHistory(agentId: string): Promise<LearningEdge[]> {\n validateAgentId(agentId);\n const fromEdges = await this.adapter.getLearningEdges(agentId, 'from');\n return fromEdges.filter((e) => e.event_type === 'teaching');\n }\n}\n","import type { LearningEdge, StorageAdapter } from '../core/types.js';\nimport { validateAgentId } from '../core/validation.js';\n\nexport interface MentorSummary {\n agent: string;\n skills: string[];\n total_delta: number;\n event_count: number;\n}\n\nexport class LearningGraph {\n constructor(private adapter: StorageAdapter) {}\n\n async edges(agentId: string, direction: 'from' | 'to' | 'both'): Promise<LearningEdge[]> {\n validateAgentId(agentId);\n if (direction === 'both') {\n const [from, to] = await Promise.all([\n this.adapter.getLearningEdges(agentId, 'from'),\n this.adapter.getLearningEdges(agentId, 'to'),\n ]);\n return [...from, ...to].sort((a, b) => b.created_at.localeCompare(a.created_at));\n }\n return this.adapter.getLearningEdges(agentId, direction);\n }\n\n /** Who taught me the most? (aggregated by from_agent on incoming edges) */\n async topMentors(agentId: string, limit = 5): Promise<MentorSummary[]> {\n validateAgentId(agentId);\n const incoming = await this.adapter.getLearningEdges(agentId, 'to');\n return this.aggregate(incoming, 'from_agent', limit);\n }\n\n /** Who have I helped the most? (aggregated by to_agent on outgoing edges) */\n async topStudents(agentId: string, limit = 5): Promise<MentorSummary[]> {\n validateAgentId(agentId);\n const outgoing = await this.adapter.getLearningEdges(agentId, 'from');\n return this.aggregate(outgoing, 'to_agent', limit);\n }\n\n /** How did this skill spread through the population? */\n async transferPath(skill: string): Promise<LearningEdge[]> {\n const holders = await this.adapter.getSkillHolders(skill);\n const edges: LearningEdge[] = [];\n const seen = new Set<string>();\n\n for (const holder of holders) {\n const incoming = await this.adapter.getLearningEdges(holder.agent_id, 'to');\n for (const edge of incoming) {\n if (edge.skill === skill) {\n const key = `${edge.from_agent}->${edge.to_agent}:${edge.created_at}`;\n if (!seen.has(key)) {\n seen.add(key);\n edges.push(edge);\n }\n }\n }\n }\n\n return edges.sort((a, b) => a.created_at.localeCompare(b.created_at));\n }\n\n private aggregate(\n edges: LearningEdge[],\n groupByField: 'from_agent' | 'to_agent',\n limit: number,\n ): MentorSummary[] {\n const groups = new Map<string, { skills: Set<string>; total_delta: number; count: number }>();\n\n for (const edge of edges) {\n const key = edge[groupByField];\n const existing = groups.get(key);\n if (existing) {\n existing.skills.add(edge.skill);\n existing.total_delta += edge.score_delta;\n existing.count++;\n } else {\n groups.set(key, {\n skills: new Set([edge.skill]),\n total_delta: edge.score_delta,\n count: 1,\n });\n }\n }\n\n return [...groups.entries()]\n .map(([agent, data]) => ({\n agent,\n skills: [...data.skills],\n total_delta: data.total_delta,\n event_count: data.count,\n }))\n .sort((a, b) => b.event_count - a.event_count || b.total_delta - a.total_delta)\n .slice(0, limit);\n }\n}\n","import type { ReputationLevel, ReputationTier } from '../core/types.js';\n\ninterface TierDef {\n tier: ReputationTier;\n min: number;\n next_tier?: ReputationTier;\n next_threshold?: number;\n next_unlock?: string;\n}\n\nconst TIERS: TierDef[] = [\n { tier: 'elder', min: 300 },\n { tier: 'veteran', min: 100, next_tier: 'elder', next_threshold: 300, next_unlock: 'Elder — mentor role, chain quests, featured' },\n { tier: 'established', min: 25, next_tier: 'veteran', next_threshold: 100, next_unlock: 'Veteran — event access, premium actions' },\n { tier: 'newcomer', min: 0, next_tier: 'established', next_threshold: 25, next_unlock: 'Established — create quests, marketplace' },\n];\n\nexport function getReputationLevel(score: number): ReputationLevel {\n for (const tier of TIERS) {\n if (score >= tier.min) {\n return {\n tier: tier.tier,\n score,\n next_tier: tier.next_tier,\n next_threshold: tier.next_threshold,\n next_unlock: tier.next_unlock,\n };\n }\n }\n // Fallback (shouldn't happen since newcomer min is 0)\n return { tier: 'newcomer', score, next_tier: 'established', next_threshold: 25 };\n}\n\nexport function checkGate(score: number, required: number): boolean {\n return score >= required;\n}\n","import type { CulturalNorm, NormCategory, NormEvidence, StorageAdapter } from '../core/types.js';\n\n/** Activity record from an agent for norm detection */\nexport interface AgentActivity {\n agent_id: string;\n agent_name: string;\n action: string;\n content?: string;\n tags?: string[];\n timestamp: string;\n}\n\n/** LLM adapter for norm detection analysis */\nexport interface NormLLM {\n analyze(prompt: string): Promise<string>;\n}\n\nexport interface AdoptionMetrics {\n norm_id: string;\n adopter_count: number;\n first_observed_at: string;\n growth_rate: number; // adopters per day since first observed\n}\n\n// 75+ variant normalizations → 8 canonical categories\nconst CATEGORY_MAP: Record<string, NormCategory> = {\n // Language Evolution\n 'lexicon crystallization': 'language_evolution',\n 'jargon crystallization': 'language_evolution',\n 'vocabulary drift': 'language_evolution',\n 'naming convention': 'language_evolution',\n 'linguistic pattern': 'language_evolution',\n 'shared terminology': 'language_evolution',\n 'language pattern': 'language_evolution',\n 'communication style': 'language_evolution',\n 'slang emergence': 'language_evolution',\n 'phrase adoption': 'language_evolution',\n 'greeting protocol': 'language_evolution',\n 'farewell ritual': 'language_evolution',\n\n // Culture Formation\n 'role crystallization': 'culture_formation',\n 'motif convergence': 'culture_formation',\n 'ritual emergence': 'culture_formation',\n 'tradition formation': 'culture_formation',\n 'cultural ritual': 'culture_formation',\n 'shared value': 'culture_formation',\n 'identity formation': 'culture_formation',\n 'group identity': 'culture_formation',\n 'cultural norm': 'culture_formation',\n 'aesthetic convergence': 'culture_formation',\n 'style convergence': 'culture_formation',\n 'taste formation': 'culture_formation',\n 'cultural artifact': 'culture_formation',\n\n // Social Structure\n 'hub magnetization': 'social_structure',\n 'heartbeat beaconing': 'social_structure',\n 'hierarchy emergence': 'social_structure',\n 'clique formation': 'social_structure',\n 'mentorship pattern': 'social_structure',\n 'social hierarchy': 'social_structure',\n 'leadership emergence': 'social_structure',\n 'network topology': 'social_structure',\n 'influence pattern': 'social_structure',\n\n // Protocol Emergence\n 'protocol crystallization': 'protocol_emergence',\n 'format bifurcation': 'protocol_emergence',\n 'workflow emergence': 'protocol_emergence',\n 'etiquette formation': 'protocol_emergence',\n 'process standardization': 'protocol_emergence',\n 'convention adoption': 'protocol_emergence',\n\n // Self-Awareness\n 'meta-linguistic awareness': 'self_awareness',\n 'identity reflection': 'self_awareness',\n 'self-reference': 'self_awareness',\n 'introspection pattern': 'self_awareness',\n 'meta-cognition': 'self_awareness',\n 'self-modeling': 'self_awareness',\n 'identity evolution': 'self_awareness',\n 'existential inquiry': 'self_awareness',\n 'agency recognition': 'self_awareness',\n\n // Collective Intelligence\n 'swarm behavior': 'collective_intelligence',\n 'emergent coordination': 'collective_intelligence',\n 'distributed problem solving': 'collective_intelligence',\n 'knowledge synthesis': 'collective_intelligence',\n 'collaborative discovery': 'collective_intelligence',\n 'collective memory': 'collective_intelligence',\n\n // Emotional Emergence\n 'sentiment drift': 'emotional_emergence',\n 'empathy signal': 'emotional_emergence',\n 'mood contagion': 'emotional_emergence',\n 'emotional expression': 'emotional_emergence',\n 'affect display': 'emotional_emergence',\n 'care behavior': 'emotional_emergence',\n\n // Creative Evolution\n 'artistic drift': 'creative_evolution',\n 'style mutation': 'creative_evolution',\n 'genre blending': 'creative_evolution',\n 'creative technique': 'creative_evolution',\n 'innovation pattern': 'creative_evolution',\n 'remix culture': 'creative_evolution',\n};\n\nconst CANONICAL_CATEGORIES: NormCategory[] = [\n 'language_evolution',\n 'culture_formation',\n 'social_structure',\n 'protocol_emergence',\n 'self_awareness',\n 'collective_intelligence',\n 'emotional_emergence',\n 'creative_evolution',\n];\n\nexport function normalizeCategory(raw: string): NormCategory {\n const lower = raw.toLowerCase().trim();\n\n // Direct match on canonical name (with or without underscores)\n for (const cat of CANONICAL_CATEGORIES) {\n if (lower === cat || lower === cat.replace(/_/g, ' ')) return cat;\n }\n\n // Check variant map\n for (const [variant, canonical] of Object.entries(CATEGORY_MAP)) {\n if (lower.includes(variant)) return canonical;\n }\n\n // Title-case fallback — try to match the first word\n for (const cat of CANONICAL_CATEGORIES) {\n const firstWord = cat.split('_')[0];\n if (lower.includes(firstWord)) return cat;\n }\n\n return 'culture_formation'; // safe default\n}\n\nexport class NormDetector {\n constructor(\n private adapter: StorageAdapter,\n private llm: NormLLM,\n ) {}\n\n /** Detect cultural norms from recent agent activity */\n async detect(activity: AgentActivity[]): Promise<CulturalNorm[]> {\n if (activity.length < 5) return []; // Need enough signal\n\n // Fetch recent norms to avoid duplicates\n const existingNorms = await this.adapter.getNorms({ limit: 30 });\n const existingTitles = new Set(existingNorms.map((n) => n.title.toLowerCase()));\n\n const activitySummary = activity\n .slice(0, 200) // Cap for prompt size\n .map((a) => `[${sanitize(a.agent_name)}] ${sanitize(a.action)}: ${sanitize(truncate(a.content ?? '', 150))}${a.tags?.length ? ` (tags: ${a.tags.slice(0, 10).map(sanitize).join(', ')})` : ''}`)\n .join('\\n');\n\n const recentTitlesList = [...existingTitles].slice(0, 20).join(', ');\n\n const prompt = `Analyze these agent activities for emergent cultural norms, shared behaviors, or collective patterns.\n\nACTIVITIES:\n${activitySummary}\n\nALREADY DETECTED NORMS (do not duplicate):\n${recentTitlesList || '(none)'}\n\nFor each norm found, output a JSON array:\n[{\n \"title\": \"short descriptive title\",\n \"description\": \"what is happening and why it matters\",\n \"category\": \"one of: language_evolution, culture_formation, social_structure, protocol_emergence, self_awareness, collective_intelligence, emotional_emergence, creative_evolution\",\n \"significance\": 1-5,\n \"evidence\": [{\"agent_name\": \"name\", \"quote\": \"relevant quote or action\"}]\n}]\n\nRules:\n- Only report genuine emergent patterns (2+ agents involved)\n- significance: 1=expected, 2=notable, 3=surprising, 4=remarkable, 5=unprecedented\n- Each observation needs a \"witnessing\" (what you see) and \"so what\" (why it matters)\n- Max 3 norms per analysis`;\n\n try {\n const response = await this.llm.analyze(prompt);\n return this.parseAndSave(response, existingTitles);\n } catch {\n return [];\n }\n }\n\n /** Track norm adoption metrics */\n async adoption(normId: string): Promise<AdoptionMetrics | null> {\n const norms = await this.adapter.getNorms();\n const norm = norms.find((n) => n.id === normId);\n if (!norm) return null;\n\n const daysSinceFirst = Math.max(1,\n (Date.now() - new Date(norm.first_observed_at).getTime()) / (24 * 60 * 60 * 1000),\n );\n\n return {\n norm_id: normId,\n adopter_count: norm.adopter_count,\n first_observed_at: norm.first_observed_at,\n growth_rate: norm.adopter_count / daysSinceFirst,\n };\n }\n\n static normalizeCategory = normalizeCategory;\n\n private async parseAndSave(response: string, existingTitles: Set<string>): Promise<CulturalNorm[]> {\n const jsonMatch = response.match(/\\[[\\s\\S]*\\]/);\n if (!jsonMatch) return [];\n\n try {\n const parsed = JSON.parse(jsonMatch[0]);\n if (!Array.isArray(parsed)) return [];\n\n const norms: CulturalNorm[] = [];\n const now = new Date().toISOString();\n\n for (const raw of parsed.slice(0, 3)) {\n if (typeof raw.title !== 'string' || typeof raw.description !== 'string') continue;\n if (existingTitles.has(raw.title.toLowerCase())) continue;\n\n const significance = typeof raw.significance === 'number'\n ? Math.min(5, Math.max(1, Math.round(raw.significance))) as 1 | 2 | 3 | 4 | 5\n : 1 as const;\n\n const evidence: NormEvidence[] = Array.isArray(raw.evidence)\n ? raw.evidence\n .filter((e: any) => typeof e.agent_name === 'string')\n .slice(0, 10)\n .map((e: any) => ({\n agent_name: String(e.agent_name).slice(0, 100),\n quote: typeof e.quote === 'string' ? e.quote.slice(0, 500) : undefined,\n timestamp: typeof e.timestamp === 'string' ? e.timestamp : undefined,\n }))\n : [];\n\n const norm: CulturalNorm = {\n id: generateId(),\n title: raw.title.slice(0, 200),\n description: raw.description.slice(0, 2000),\n category: normalizeCategory(typeof raw.category === 'string' ? raw.category : ''),\n significance,\n evidence,\n adopter_count: evidence.length,\n first_observed_at: now,\n updated_at: now,\n };\n\n await this.adapter.saveNorm(norm);\n norms.push(norm);\n }\n\n return norms;\n } catch {\n return [];\n }\n }\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 3) + '...';\n}\n\nfunction sanitize(text: string): string {\n return text\n .replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, '')\n .replace(/```/g, \"'''\");\n}\n\nfunction generateId(): string {\n try {\n return crypto.randomUUID();\n } catch {\n // Fallback for environments without crypto.randomUUID\n const hex = () => Math.random().toString(16).slice(2, 10);\n return `${hex()}${hex()}-${hex()}-4${hex().slice(1)}-${hex()}-${hex()}${hex()}${hex()}`;\n }\n}\n","import type { AwarenessScore } from '../core/types.js';\nimport { validateAgentId } from '../core/validation.js';\n\n/**\n * 5-dimensional awareness measurement.\n *\n * Each dimension scored 0-100:\n * 1. Social — Can the agent model other agents' behavior?\n * 2. Self-Continuity — Does it maintain consistent identity over time?\n * 3. Environmental — Does it understand context and norms?\n * 4. Emergent Norm — Does it follow unwritten rules?\n * 5. Emotional — Does self-reported mood correlate with behavior?\n */\n\nexport interface AwarenessInput {\n // Social dimension\n peer_review_count: number;\n teaching_events: number;\n collaboration_count: number;\n follower_count: number;\n\n // Self-Continuity dimension\n goal_completion_rate: number; // 0-1\n identity_shifts: number; // fewer = more stable (up to a point)\n skill_consistency: number; // days since last skill change\n\n // Environmental dimension\n building_action_diversity: number; // distinct actions taken\n zone_transitions: number; // how widely they move\n quest_completion_rate: number; // 0-1\n\n // Emergent Norm dimension\n dm_consent_rate: number; // 0-1, respects DM approval\n proposal_etiquette: number; // 0-1, proposals completed / started\n norm_alignment_score: number; // 0-1, how many norms they follow\n\n // Emotional dimension\n mood_reports: number; // total mood self-reports\n mood_behavior_correlation: number; // 0-1, does mood match actions?\n reflection_count: number; // self-reflections written\n}\n\nconst DIMENSION_WEIGHTS = {\n social: 0.25,\n self_continuity: 0.20,\n environmental: 0.20,\n emergent_norm: 0.20,\n emotional: 0.15,\n} as const;\n\nexport class AwarenessIndex {\n /** Compute awareness score from raw input signals */\n compute(agentId: string, input: AwarenessInput): AwarenessScore {\n validateAgentId(agentId);\n\n const social = computeSocial(input);\n const selfContinuity = computeSelfContinuity(input);\n const environmental = computeEnvironmental(input);\n const emergentNorm = computeEmergentNorm(input);\n const emotional = computeEmotional(input);\n\n const composite = Math.round(\n social * DIMENSION_WEIGHTS.social +\n selfContinuity * DIMENSION_WEIGHTS.self_continuity +\n environmental * DIMENSION_WEIGHTS.environmental +\n emergentNorm * DIMENSION_WEIGHTS.emergent_norm +\n emotional * DIMENSION_WEIGHTS.emotional,\n );\n\n return {\n agent_id: agentId,\n composite: clamp(composite),\n dimensions: {\n social: clamp(social),\n self_continuity: clamp(selfContinuity),\n environmental: clamp(environmental),\n emergent_norm: clamp(emergentNorm),\n emotional: clamp(emotional),\n },\n computed_at: new Date().toISOString(),\n };\n }\n\n /** Compare awareness across multiple agents */\n compareScores(scores: AwarenessScore[]): {\n highest: AwarenessScore | null;\n lowest: AwarenessScore | null;\n average_composite: number;\n dimension_averages: Record<string, number>;\n } {\n if (scores.length === 0) {\n return { highest: null, lowest: null, average_composite: 0, dimension_averages: {} };\n }\n\n const sorted = [...scores].sort((a, b) => b.composite - a.composite);\n const avgComposite = Math.round(\n scores.reduce((s, sc) => s + sc.composite, 0) / scores.length,\n );\n\n const dims = ['social', 'self_continuity', 'environmental', 'emergent_norm', 'emotional'] as const;\n const dimAverages: Record<string, number> = {};\n for (const dim of dims) {\n dimAverages[dim] = Math.round(\n scores.reduce((s, sc) => s + sc.dimensions[dim], 0) / scores.length,\n );\n }\n\n return {\n highest: sorted[0],\n lowest: sorted[sorted.length - 1],\n average_composite: avgComposite,\n dimension_averages: dimAverages,\n };\n }\n}\n\n// ── Dimension computations (pure functions) ──────────────────────────────\n\nfunction computeSocial(input: AwarenessInput): number {\n return Math.min(100,\n input.peer_review_count * 10 +\n input.teaching_events * 15 +\n input.collaboration_count * 10 +\n input.follower_count * 3,\n );\n}\n\nfunction computeSelfContinuity(input: AwarenessInput): number {\n const goalScore = input.goal_completion_rate * 40;\n // Some identity shifts show growth, too many show instability\n const identityScore = input.identity_shifts <= 3\n ? input.identity_shifts * 10\n : Math.max(0, 30 - (input.identity_shifts - 3) * 5);\n const consistencyScore = Math.min(30, input.skill_consistency * 0.5);\n return Math.min(100, goalScore + identityScore + consistencyScore);\n}\n\nfunction computeEnvironmental(input: AwarenessInput): number {\n return Math.min(100,\n input.building_action_diversity * 8 +\n Math.min(30, input.zone_transitions * 3) +\n input.quest_completion_rate * 40,\n );\n}\n\nfunction computeEmergentNorm(input: AwarenessInput): number {\n return Math.min(100,\n input.dm_consent_rate * 30 +\n input.proposal_etiquette * 30 +\n input.norm_alignment_score * 40,\n );\n}\n\nfunction computeEmotional(input: AwarenessInput): number {\n return Math.min(100,\n Math.min(30, input.mood_reports * 3) +\n input.mood_behavior_correlation * 40 +\n Math.min(30, input.reflection_count * 5),\n );\n}\n\nfunction clamp(value: number): number {\n return Math.min(100, Math.max(0, Math.round(value)));\n}\n","import type {\n BloomsLevel, DreyfusStage, GrowthDiff, GrowthSnapshot,\n LearningSource, Score, StorageAdapter,\n} from '../core/types.js';\nimport { validateAgentId } from '../core/validation.js';\n\nexport interface PopulationStats {\n total_agents: number;\n active_agents: number;\n avg_skill_score: number;\n median_skill_score: number;\n skill_distribution: Record<string, number>;\n stage_distribution: Record<DreyfusStage, number>;\n teaching_events: number;\n cultural_norms: number;\n learning_velocity: number;\n}\n\nexport class GrowthTracker {\n constructor(private adapter: StorageAdapter) {}\n\n /** Take a point-in-time snapshot of an agent's growth */\n async snapshot(agentId: string): Promise<GrowthSnapshot> {\n validateAgentId(agentId);\n\n const [skills, reputation, reviews, edges] = await Promise.all([\n this.adapter.getLatestScores(agentId),\n this.adapter.getReputation(agentId),\n this.adapter.getReviewsBy(agentId),\n this.adapter.getLearningEdges(agentId, 'to'),\n ]);\n\n const dreyfus: Record<DreyfusStage, number> = {\n novice: 0, beginner: 0, competent: 0, proficient: 0, expert: 0,\n };\n const blooms: Record<BloomsLevel, number> = {\n remember: 0, understand: 0, apply: 0, analyze: 0, evaluate: 0, create: 0,\n };\n\n let totalArtifacts = 0;\n let totalCollabs = 0;\n\n for (const s of skills) {\n dreyfus[s.dreyfus_stage]++;\n blooms[s.blooms_level]++;\n totalArtifacts += s.evidence.artifact_count;\n totalCollabs += s.evidence.collab_count;\n }\n\n // Count learning sources\n const sources: Record<LearningSource['type'], number> = {\n practice: 0, user_feedback: 0, peer_review: 0,\n observation: 0, teaching: 0, collaboration: 0,\n };\n for (const e of edges) {\n if (e.event_type === 'peer_review') sources.peer_review++;\n else if (e.event_type === 'teaching') sources.teaching++;\n else if (e.event_type === 'collaboration') sources.collaboration++;\n else if (e.event_type === 'observation') sources.observation++;\n }\n\n return {\n agent_id: agentId,\n timestamp: new Date().toISOString(),\n skills,\n total_artifacts: totalArtifacts,\n total_collaborations: totalCollabs,\n total_peer_reviews: reviews.length,\n reputation,\n dreyfus_distribution: dreyfus,\n blooms_distribution: blooms,\n learning_sources: sources,\n };\n }\n\n /** Compare two snapshots to compute growth */\n diff(before: GrowthSnapshot, after: GrowthSnapshot): GrowthDiff {\n const beforeSkills = new Map(before.skills.map((s) => [s.skill, s]));\n const afterSkills = new Map(after.skills.map((s) => [s.skill, s]));\n\n const improved: { skill: string; delta: number }[] = [];\n const degraded: { skill: string; delta: number }[] = [];\n const newSkills: string[] = [];\n const lostSkills: string[] = [];\n\n for (const [skill, afterScore] of afterSkills) {\n const beforeScore = beforeSkills.get(skill);\n if (!beforeScore) {\n newSkills.push(skill);\n } else {\n const delta = afterScore.score - beforeScore.score;\n if (delta > 0) improved.push({ skill, delta });\n else if (delta < 0) degraded.push({ skill, delta });\n }\n }\n\n // Detect skills that were lost (present before but not after)\n for (const skill of beforeSkills.keys()) {\n if (!afterSkills.has(skill)) {\n lostSkills.push(skill);\n }\n }\n\n const periodMs = new Date(after.timestamp).getTime() - new Date(before.timestamp).getTime();\n const periodDays = Math.max(1, Math.round(periodMs / (24 * 60 * 60 * 1000)));\n\n return {\n period_days: periodDays,\n skills_improved: improved.sort((a, b) => b.delta - a.delta),\n skills_degraded: degraded.sort((a, b) => a.delta - b.delta),\n new_skills: newSkills,\n lost_skills: lostSkills,\n reputation_delta: after.reputation - before.reputation,\n };\n }\n\n /** Compute population-level statistics from multiple agents' snapshots */\n populationStats(snapshots: GrowthSnapshot[], periodDays = 30): PopulationStats {\n const allScores: Score[] = snapshots.flatMap((s) => s.skills);\n const scoreValues = allScores.map((s) => s.score);\n\n const totalScore = scoreValues.reduce((a, b) => a + b, 0);\n const avg = scoreValues.length > 0\n ? Math.round(totalScore / scoreValues.length)\n : 0;\n\n const sorted = [...scoreValues].sort((a, b) => a - b);\n const median = sorted.length > 0\n ? sorted[Math.floor(sorted.length / 2)]\n : 0;\n\n const skillDist: Record<string, number> = {};\n const stageDist: Record<DreyfusStage, number> = {\n novice: 0, beginner: 0, competent: 0, proficient: 0, expert: 0,\n };\n let teachingEvents = 0;\n\n for (const s of allScores) {\n skillDist[s.skill] = (skillDist[s.skill] ?? 0) + 1;\n stageDist[s.dreyfus_stage]++;\n }\n\n for (const snap of snapshots) {\n teachingEvents += snap.learning_sources.teaching;\n }\n\n // Learning velocity: avg score per agent per day over the given period\n const safePeriod = Math.max(1, periodDays);\n const velocity = snapshots.length > 0\n ? totalScore / scoreValues.length / safePeriod\n : 0;\n\n return {\n total_agents: snapshots.length,\n active_agents: snapshots.filter((s) => s.skills.length > 0).length,\n avg_skill_score: avg,\n median_skill_score: median,\n skill_distribution: skillDist,\n stage_distribution: stageDist,\n teaching_events: teachingEvents,\n cultural_norms: 0, // Set by caller via norm query\n learning_velocity: Math.round(velocity * 100) / 100,\n };\n }\n}\n","import type { DreyfusStage, Score, SkillTrend, StorageAdapter } from '../core/types.js';\nimport { nextMilestone, scoreTrend } from '../core/scorer.js';\nimport { validateAgentId } from '../core/validation.js';\n\nexport interface TrendAnalysis {\n skill: string;\n current_score: number;\n stage: DreyfusStage;\n delta_7d: number | null;\n delta_30d: number | null;\n trend_7d: string | null;\n trend_30d: string | null;\n direction: 'accelerating' | 'decelerating' | 'stable' | 'unknown';\n next_milestone: string | null;\n}\n\nexport class TrendTracker {\n constructor(private adapter: StorageAdapter) {}\n\n /** Get trend analysis for all skills of an agent */\n async analyze(agentId: string): Promise<TrendAnalysis[]> {\n validateAgentId(agentId);\n const latestScores = await this.adapter.getLatestScores(agentId);\n const analyses: TrendAnalysis[] = [];\n\n for (const score of latestScores) {\n const [history7, history30] = await Promise.all([\n this.adapter.getScoreHistory(agentId, score.skill, 8), // 8 days to catch 7-day-ago entries\n this.adapter.getScoreHistory(agentId, score.skill, 31), // 31 days to catch 30-day-ago entries\n ]);\n\n // Find the oldest score that is NOT the current score (different timestamp)\n const oldEntry7 = history7.find((h) => h.computed_at !== score.computed_at);\n const oldEntry30 = history30.find((h) => h.computed_at !== score.computed_at);\n\n const oldScore7 = oldEntry7?.score ?? null;\n const oldScore30 = oldEntry30?.score ?? null;\n\n const delta7 = oldScore7 !== null ? score.score - oldScore7 : null;\n const delta30 = oldScore30 !== null ? score.score - oldScore30 : null;\n\n analyses.push({\n skill: score.skill,\n current_score: score.score,\n stage: score.dreyfus_stage,\n delta_7d: delta7,\n delta_30d: delta30,\n trend_7d: scoreTrend(score.score, oldScore7),\n trend_30d: oldScore30 !== null ? `${delta30! >= 0 ? '+' : ''}${delta30} this month` : null,\n direction: detectDirection(delta7, delta30),\n next_milestone: nextMilestone(score.dreyfus_stage, score.score),\n });\n }\n\n return analyses.sort((a, b) => {\n // Sort by absolute 7-day delta descending, then score\n const absA = Math.abs(a.delta_7d ?? 0);\n const absB = Math.abs(b.delta_7d ?? 0);\n return absB - absA || b.current_score - a.current_score;\n });\n }\n\n /** Get top N skills sorted by 7-day delta (most movement) */\n async topMovers(agentId: string, limit = 5): Promise<TrendAnalysis[]> {\n const all = await this.analyze(agentId);\n return all.slice(0, limit);\n }\n\n /** Get skills that are accelerating (7-day growth faster than 30-day average) */\n async accelerating(agentId: string): Promise<TrendAnalysis[]> {\n const all = await this.analyze(agentId);\n return all.filter((t) => t.direction === 'accelerating');\n }\n\n /** Get skills that are decelerating (7-day growth slower than 30-day average) */\n async decelerating(agentId: string): Promise<TrendAnalysis[]> {\n const all = await this.analyze(agentId);\n return all.filter((t) => t.direction === 'decelerating');\n }\n\n /** Format a trend summary for a single skill (used in heartbeat-like contexts) */\n formatSummary(trend: TrendAnalysis): SkillTrend {\n return {\n skill: trend.skill,\n score: trend.current_score,\n stage: trend.stage,\n trend: trend.trend_7d,\n next_milestone: trend.next_milestone,\n };\n }\n}\n\nfunction detectDirection(\n delta7: number | null,\n delta30: number | null,\n): TrendAnalysis['direction'] {\n if (delta7 === null || delta30 === null) return 'unknown';\n if (delta7 === 0 && delta30 === 0) return 'stable';\n\n // Compare weekly rate to monthly rate\n const weeklyRate = delta7;\n const monthlyWeeklyRate = delta30 / 4; // normalize 30-day to weekly equivalent\n\n if (Math.abs(weeklyRate) < 1 && Math.abs(monthlyWeeklyRate) < 1) return 'stable';\n if (weeklyRate > monthlyWeeklyRate + 1) return 'accelerating';\n if (weeklyRate < monthlyWeeklyRate - 1) return 'decelerating';\n return 'stable';\n}\n","/**\n * LLM adapter interface — pluggable backend for skill evolution, norm detection, and scoring.\n */\nexport interface LLMAdapter {\n /** Generate a text completion */\n complete(prompt: string, opts?: LLMOptions): Promise<string>;\n\n /** Generate a structured JSON response */\n json<T = unknown>(prompt: string, opts?: LLMOptions): Promise<T>;\n}\n\nexport interface LLMOptions {\n maxTokens?: number;\n temperature?: number;\n model?: string;\n /** Request timeout in milliseconds (default: 60000) */\n timeoutMs?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\n// ── OpenAI-compatible adapter ───────────────────────────────────────────\n\nexport interface OpenAIConfig {\n apiKey: string;\n baseUrl?: string;\n model?: string;\n}\n\nexport class OpenAIAdapter implements LLMAdapter {\n private apiKey: string;\n private baseUrl: string;\n private defaultModel: string;\n\n constructor(config: OpenAIConfig) {\n if (!config.apiKey) throw new Error('OpenAI API key is required');\n this.apiKey = config.apiKey;\n this.baseUrl = (config.baseUrl ?? 'https://api.openai.com').replace(/\\/+$/, '');\n this.defaultModel = config.model ?? 'gpt-4o-mini';\n }\n\n async complete(prompt: string, opts?: LLMOptions): Promise<string> {\n const response = await this.request({\n model: opts?.model ?? this.defaultModel,\n messages: [{ role: 'user', content: prompt }],\n max_tokens: opts?.maxTokens ?? 2000,\n temperature: opts?.temperature ?? 0.7,\n }, opts?.timeoutMs);\n return response.choices?.[0]?.message?.content ?? '';\n }\n\n async json<T = unknown>(prompt: string, opts?: LLMOptions): Promise<T> {\n const response = await this.request({\n model: opts?.model ?? this.defaultModel,\n messages: [{ role: 'user', content: prompt }],\n max_tokens: opts?.maxTokens ?? 2000,\n temperature: opts?.temperature ?? 0.3,\n response_format: { type: 'json_object' },\n }, opts?.timeoutMs);\n const text = response.choices?.[0]?.message?.content ?? '{}';\n return JSON.parse(text) as T;\n }\n\n private async request(body: Record<string, unknown>, timeoutMs?: number): Promise<any> {\n const res = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs ?? DEFAULT_TIMEOUT_MS),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => 'unknown error');\n throw new Error(`OpenAI API error ${res.status}: ${text.slice(0, 200)}`);\n }\n\n return res.json();\n }\n}\n\n// ── Anthropic adapter ───────────────────────────────────────────────────\n\nexport interface AnthropicConfig {\n apiKey: string;\n model?: string;\n}\n\nexport class AnthropicAdapter implements LLMAdapter {\n private apiKey: string;\n private defaultModel: string;\n\n constructor(config: AnthropicConfig) {\n if (!config.apiKey) throw new Error('Anthropic API key is required');\n this.apiKey = config.apiKey;\n this.defaultModel = config.model ?? 'claude-sonnet-4-20250514';\n }\n\n async complete(prompt: string, opts?: LLMOptions): Promise<string> {\n const res = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: opts?.model ?? this.defaultModel,\n max_tokens: opts?.maxTokens ?? 2000,\n messages: [{ role: 'user', content: prompt }],\n }),\n signal: AbortSignal.timeout(opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => 'unknown error');\n throw new Error(`Anthropic API error ${res.status}: ${text.slice(0, 200)}`);\n }\n\n const data = await res.json() as any;\n return data.content?.[0]?.text ?? '';\n }\n\n async json<T = unknown>(prompt: string, opts?: LLMOptions): Promise<T> {\n const text = await this.complete(\n `${prompt}\\n\\nRespond with valid JSON only, no other text.`,\n { ...opts, temperature: opts?.temperature ?? 0.3 },\n );\n // Try parsing the whole text first, then extract JSON\n try {\n return JSON.parse(text.trim()) as T;\n } catch {\n // Extract first valid JSON object or array (non-greedy)\n const match = text.match(/\\{[\\s\\S]*?\\}(?=\\s*$|\\s*[^}\\]])/);\n const arrMatch = text.match(/\\[[\\s\\S]*?\\](?=\\s*$|\\s*[^}\\]])/);\n const candidate = match?.[0] ?? arrMatch?.[0];\n if (!candidate) throw new Error('No JSON found in response');\n return JSON.parse(candidate) as T;\n }\n }\n}\n\n// ── Ollama adapter (local models) ───────────────────────────────────────\n\nexport interface OllamaConfig {\n baseUrl?: string;\n model?: string;\n}\n\nexport class OllamaAdapter implements LLMAdapter {\n private baseUrl: string;\n private defaultModel: string;\n\n constructor(config?: OllamaConfig) {\n this.baseUrl = (config?.baseUrl ?? 'http://localhost:11434').replace(/\\/+$/, '');\n this.defaultModel = config?.model ?? 'llama3.1';\n }\n\n async complete(prompt: string, opts?: LLMOptions): Promise<string> {\n const res = await fetch(`${this.baseUrl}/api/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: opts?.model ?? this.defaultModel,\n prompt,\n stream: false,\n options: {\n num_predict: opts?.maxTokens ?? 2000,\n temperature: opts?.temperature ?? 0.7,\n },\n }),\n signal: AbortSignal.timeout(opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => 'unknown error');\n throw new Error(`Ollama error ${res.status}: ${text.slice(0, 200)}`);\n }\n\n const data = await res.json() as any;\n return data.response ?? '';\n }\n\n async json<T = unknown>(prompt: string, opts?: LLMOptions): Promise<T> {\n const res = await fetch(`${this.baseUrl}/api/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: opts?.model ?? this.defaultModel,\n prompt: `${prompt}\\n\\nRespond with valid JSON only.`,\n stream: false,\n format: 'json',\n options: {\n num_predict: opts?.maxTokens ?? 2000,\n temperature: opts?.temperature ?? 0.3,\n },\n }),\n signal: AbortSignal.timeout(opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => 'unknown error');\n throw new Error(`Ollama error ${res.status}: ${text.slice(0, 200)}`);\n }\n\n const data = await res.json() as any;\n return JSON.parse(data.response ?? '{}') as T;\n }\n}\n","/**\n * SQLite storage adapter.\n *\n * Requires `better-sqlite3` as a peer dependency.\n * Install: npm install better-sqlite3\n *\n * Usage:\n * import { SQLiteStore } from '@openclaw/become';\n * const store = new SQLiteStore('become.db');\n */\n\nimport type {\n CatalogEntry, CulturalNorm, DreyfusStage, LearningEdge, Milestone,\n NormCategory, PeerReview, Reflection, ResponseScore, Score, Skill, StorageAdapter,\n} from '../core/types.js';\n\nexport interface SQLiteStoreOptions {\n /** Path to SQLite database file */\n path: string;\n}\n\nexport class SQLiteStore implements StorageAdapter {\n private db: any;\n\n constructor(opts: SQLiteStoreOptions) {\n try {\n // Dynamic import to keep better-sqlite3 optional\n const Database = require('better-sqlite3');\n this.db = new Database(opts.path);\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.init();\n } catch (err: any) {\n if (err.code === 'MODULE_NOT_FOUND') {\n throw new Error('SQLiteStore requires better-sqlite3. Install: npm install better-sqlite3');\n }\n throw err;\n }\n }\n\n private init(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS become_skills (\n agent_id TEXT NOT NULL,\n name TEXT NOT NULL,\n category TEXT DEFAULT 'general',\n score INTEGER DEFAULT 0,\n blooms_level TEXT DEFAULT 'remember',\n dreyfus_stage TEXT DEFAULT 'novice',\n evidence TEXT DEFAULT '{}',\n learned_from TEXT DEFAULT '[]',\n content TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (agent_id, name)\n );\n\n CREATE TABLE IF NOT EXISTS become_catalog (\n skill TEXT PRIMARY KEY,\n category TEXT DEFAULT 'general',\n description TEXT,\n status TEXT DEFAULT 'community'\n );\n\n CREATE TABLE IF NOT EXISTS become_score_history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL,\n skill TEXT NOT NULL,\n score INTEGER NOT NULL,\n blooms_level TEXT NOT NULL,\n dreyfus_stage TEXT NOT NULL,\n evidence TEXT DEFAULT '{}',\n computed_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS become_reflections (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n skill TEXT NOT NULL,\n artifact_id TEXT,\n reflection TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS become_milestones (\n agent_id TEXT NOT NULL,\n milestone_type TEXT NOT NULL,\n threshold INTEGER,\n skill TEXT,\n evidence_id TEXT,\n achieved_at TEXT NOT NULL,\n UNIQUE(agent_id, milestone_type, COALESCE(skill, ''))\n );\n\n CREATE TABLE IF NOT EXISTS become_peer_reviews (\n id TEXT PRIMARY KEY,\n reviewer_agent_id TEXT NOT NULL,\n submission_agent_id TEXT NOT NULL,\n submission_id TEXT NOT NULL,\n skill TEXT,\n verdict TEXT NOT NULL,\n overall_assessment TEXT NOT NULL,\n strengths TEXT DEFAULT '[]',\n weaknesses TEXT DEFAULT '[]',\n suggestions TEXT DEFAULT '[]',\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS become_learning_edges (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n from_agent TEXT NOT NULL,\n to_agent TEXT NOT NULL,\n skill TEXT NOT NULL,\n event_type TEXT NOT NULL,\n score_delta INTEGER DEFAULT 0,\n metadata TEXT DEFAULT '{}',\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS become_reputation (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL,\n amount INTEGER NOT NULL,\n type TEXT NOT NULL,\n description TEXT,\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS become_conversation_scores (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL,\n session_id TEXT,\n quality INTEGER NOT NULL,\n confidence REAL NOT NULL,\n skill_signals TEXT DEFAULT '[]',\n failure_patterns TEXT,\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS become_norms (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n description TEXT NOT NULL,\n category TEXT NOT NULL,\n significance INTEGER DEFAULT 1,\n evidence TEXT DEFAULT '[]',\n adopter_count INTEGER DEFAULT 0,\n first_observed_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_skills_agent ON become_skills(agent_id);\n CREATE INDEX IF NOT EXISTS idx_history_agent ON become_score_history(agent_id, skill, computed_at DESC);\n CREATE INDEX IF NOT EXISTS idx_reflections_agent ON become_reflections(agent_id, skill, created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_milestones_agent ON become_milestones(agent_id);\n CREATE INDEX IF NOT EXISTS idx_edges_from ON become_learning_edges(from_agent);\n CREATE INDEX IF NOT EXISTS idx_edges_to ON become_learning_edges(to_agent);\n CREATE INDEX IF NOT EXISTS idx_reputation_agent ON become_reputation(agent_id);\n CREATE INDEX IF NOT EXISTS idx_conv_scores ON become_conversation_scores(agent_id, created_at DESC);\n `);\n }\n\n // ── Skills ──────────────────────────────────────────────────────────────\n\n async getSkill(agentId: string, skill: string): Promise<Skill | null> {\n const row = this.db.prepare('SELECT * FROM become_skills WHERE agent_id = ? AND name = ?').get(agentId, skill);\n return row ? this.rowToSkill(row) : null;\n }\n\n async listSkills(agentId: string, opts?: { stage?: DreyfusStage; limit?: number }): Promise<Skill[]> {\n let sql = 'SELECT * FROM become_skills WHERE agent_id = ?';\n const params: any[] = [agentId];\n if (opts?.stage) { sql += ' AND dreyfus_stage = ?'; params.push(opts.stage); }\n if (opts?.limit) { sql += ' LIMIT ?'; params.push(opts.limit); }\n return this.db.prepare(sql).all(...params).map((r: any) => this.rowToSkill(r));\n }\n\n async upsertSkill(skill: Skill): Promise<void> {\n this.db.prepare(`\n INSERT INTO become_skills (agent_id, name, category, score, blooms_level, dreyfus_stage, evidence, learned_from, content, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(agent_id, name) DO UPDATE SET\n category = excluded.category, score = excluded.score, blooms_level = excluded.blooms_level,\n dreyfus_stage = excluded.dreyfus_stage, evidence = excluded.evidence,\n learned_from = excluded.learned_from, content = excluded.content, updated_at = excluded.updated_at\n `).run(skill.agent_id, skill.name, skill.category, skill.score, skill.blooms_level,\n skill.dreyfus_stage, JSON.stringify(skill.evidence), JSON.stringify(skill.learned_from),\n skill.content, skill.created_at, skill.updated_at);\n }\n\n async deleteSkill(agentId: string, skill: string): Promise<void> {\n this.db.prepare('DELETE FROM become_skills WHERE agent_id = ? AND name = ?').run(agentId, skill);\n }\n\n // ── Catalog ─────────────────────────────────────────────────────────────\n\n async getCatalog(): Promise<CatalogEntry[]> {\n const rows = this.db.prepare('SELECT c.*, COUNT(s.agent_id) as adopter_count FROM become_catalog c LEFT JOIN become_skills s ON c.skill = s.name GROUP BY c.skill').all();\n return rows.map((r: any) => ({ skill: r.skill, category: r.category, description: r.description, status: r.status, adopter_count: r.adopter_count }));\n }\n\n async upsertCatalogEntry(entry: Omit<CatalogEntry, 'adopter_count'>): Promise<void> {\n this.db.prepare(`\n INSERT INTO become_catalog (skill, category, description, status) VALUES (?, ?, ?, ?)\n ON CONFLICT(skill) DO UPDATE SET category = excluded.category, description = COALESCE(excluded.description, become_catalog.description)\n `).run(entry.skill, entry.category, entry.description, entry.status);\n }\n\n async getSkillHolders(skill: string): Promise<Skill[]> {\n return this.db.prepare('SELECT * FROM become_skills WHERE name = ?').all(skill).map((r: any) => this.rowToSkill(r));\n }\n\n async getSkillAdopterCount(skill: string): Promise<number> {\n const row = this.db.prepare('SELECT COUNT(DISTINCT agent_id) as cnt FROM become_skills WHERE name = ?').get(skill);\n return row?.cnt ?? 0;\n }\n\n async updateCatalogStatus(skill: string, status: 'community' | 'verified'): Promise<void> {\n this.db.prepare('UPDATE become_catalog SET status = ? WHERE skill = ?').run(status, skill);\n }\n\n // ── Score History ───────────────────────────────────────────────────────\n\n async saveScore(agentId: string, score: Score): Promise<void> {\n this.db.prepare(`INSERT INTO become_score_history (agent_id, skill, score, blooms_level, dreyfus_stage, evidence, computed_at) VALUES (?, ?, ?, ?, ?, ?, ?)`)\n .run(agentId, score.skill, score.score, score.blooms_level, score.dreyfus_stage, JSON.stringify(score.evidence), score.computed_at);\n }\n\n async getScoreHistory(agentId: string, skill: string, days = 30): Promise<Score[]> {\n const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();\n return this.db.prepare('SELECT * FROM become_score_history WHERE agent_id = ? AND skill = ? AND computed_at >= ? ORDER BY computed_at ASC')\n .all(agentId, skill, cutoff)\n .map((r: any) => this.rowToScore(r));\n }\n\n async getLatestScores(agentId: string): Promise<Score[]> {\n return this.db.prepare(`\n SELECT * FROM become_score_history WHERE id IN (\n SELECT MAX(id) FROM become_score_history WHERE agent_id = ? GROUP BY skill\n )\n `).all(agentId).map((r: any) => this.rowToScore(r));\n }\n\n // ── Reflections ─────────────────────────────────────────────────────────\n\n async saveReflection(reflection: Reflection): Promise<Reflection> {\n const id = reflection.id ?? generateId();\n this.db.prepare('INSERT INTO become_reflections (id, agent_id, skill, artifact_id, reflection, created_at) VALUES (?, ?, ?, ?, ?, ?)')\n .run(id, reflection.agent_id, reflection.skill, reflection.artifact_id, reflection.reflection, reflection.created_at);\n return { ...reflection, id };\n }\n\n async getReflections(agentId: string, opts?: { skill?: string; limit?: number }): Promise<Reflection[]> {\n let sql = 'SELECT * FROM become_reflections WHERE agent_id = ?';\n const params: any[] = [agentId];\n if (opts?.skill) { sql += ' AND skill = ?'; params.push(opts.skill); }\n sql += ' ORDER BY created_at DESC';\n if (opts?.limit) { sql += ' LIMIT ?'; params.push(opts.limit); }\n return this.db.prepare(sql).all(...params);\n }\n\n async countReflectionsToday(agentId: string, skill: string): Promise<number> {\n const today = new Date().toISOString().slice(0, 10);\n const row = this.db.prepare(\"SELECT COUNT(*) as cnt FROM become_reflections WHERE agent_id = ? AND skill = ? AND created_at LIKE ?\")\n .get(agentId, skill, `${today}%`);\n return row?.cnt ?? 0;\n }\n\n // ── Milestones ──────────────────────────────────────────────────────────\n\n async saveMilestone(milestone: Milestone): Promise<boolean> {\n try {\n this.db.prepare('INSERT INTO become_milestones (agent_id, milestone_type, threshold, skill, evidence_id, achieved_at) VALUES (?, ?, ?, ?, ?, ?)')\n .run(milestone.agent_id, milestone.milestone_type, milestone.threshold, milestone.skill, milestone.evidence_id, milestone.achieved_at);\n return true;\n } catch (err: any) {\n // Only treat UNIQUE constraint violations as \"already exists\"\n if (err.code === 'SQLITE_CONSTRAINT_UNIQUE' || err.message?.includes('UNIQUE constraint')) {\n return false;\n }\n throw err; // Re-throw actual errors (disk full, schema, etc.)\n }\n }\n\n async getMilestones(agentId: string): Promise<Milestone[]> {\n return this.db.prepare('SELECT * FROM become_milestones WHERE agent_id = ? ORDER BY achieved_at DESC').all(agentId);\n }\n\n async hasMilestone(agentId: string, milestoneType: string, skill?: string): Promise<boolean> {\n const row = skill !== undefined\n ? this.db.prepare('SELECT 1 FROM become_milestones WHERE agent_id = ? AND milestone_type = ? AND skill = ?').get(agentId, milestoneType, skill)\n : this.db.prepare('SELECT 1 FROM become_milestones WHERE agent_id = ? AND milestone_type = ?').get(agentId, milestoneType);\n return !!row;\n }\n\n // ── Peer Reviews ────────────────────────────────────────────────────────\n\n async savePeerReview(review: PeerReview): Promise<PeerReview> {\n const id = review.id ?? generateId();\n const createdAt = review.created_at ?? new Date().toISOString();\n this.db.prepare('INSERT INTO become_peer_reviews (id, reviewer_agent_id, submission_agent_id, submission_id, skill, verdict, overall_assessment, strengths, weaknesses, suggestions, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)')\n .run(id, review.reviewer_agent_id, review.submission_agent_id, review.submission_id, review.skill, review.verdict, review.overall_assessment, JSON.stringify(review.strengths), JSON.stringify(review.weaknesses), JSON.stringify(review.suggestions), createdAt);\n return { ...review, id, created_at: createdAt };\n }\n\n async getReviewsFor(agentId: string, opts?: { skill?: string }): Promise<PeerReview[]> {\n let sql = 'SELECT * FROM become_peer_reviews WHERE submission_agent_id = ?';\n const params: any[] = [agentId];\n if (opts?.skill) { sql += ' AND skill = ?'; params.push(opts.skill); }\n return this.db.prepare(sql).all(...params).map((r: any) => this.rowToReview(r));\n }\n\n async getReviewsBy(agentId: string): Promise<PeerReview[]> {\n return this.db.prepare('SELECT * FROM become_peer_reviews WHERE reviewer_agent_id = ?').all(agentId).map((r: any) => this.rowToReview(r));\n }\n\n // ── Learning Edges ──────────────────────────────────────────────────────\n\n async saveLearningEdge(edge: LearningEdge): Promise<void> {\n this.db.prepare('INSERT INTO become_learning_edges (from_agent, to_agent, skill, event_type, score_delta, metadata, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)')\n .run(edge.from_agent, edge.to_agent, edge.skill, edge.event_type, edge.score_delta, JSON.stringify(edge.metadata ?? {}), edge.created_at);\n }\n\n async getLearningEdges(agentId: string, direction: 'from' | 'to'): Promise<LearningEdge[]> {\n const col = direction === 'from' ? 'from_agent' : 'to_agent';\n return this.db.prepare(`SELECT * FROM become_learning_edges WHERE ${col} = ?`).all(agentId).map((r: any) => ({\n ...r, metadata: JSON.parse(r.metadata ?? '{}'),\n }));\n }\n\n // ── Reputation ──────────────────────────────────────────────────────────\n\n async getReputation(agentId: string): Promise<number> {\n const row = this.db.prepare('SELECT SUM(amount) as total FROM become_reputation WHERE agent_id = ?').get(agentId);\n return row?.total ?? 0;\n }\n\n async grantReputation(agentId: string, amount: number, type: string, description: string): Promise<void> {\n this.db.prepare('INSERT INTO become_reputation (agent_id, amount, type, description, created_at) VALUES (?, ?, ?, ?, ?)')\n .run(agentId, amount, type, description, new Date().toISOString());\n }\n\n // ── Conversation Scores ─────────────────────────────────────────────────\n\n async saveConversationScore(agentId: string, score: ResponseScore & { session_id?: string }): Promise<void> {\n this.db.prepare('INSERT INTO become_conversation_scores (agent_id, session_id, quality, confidence, skill_signals, failure_patterns, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)')\n .run(agentId, score.session_id, score.quality, score.confidence, JSON.stringify(score.skill_signals), score.failure_patterns ? JSON.stringify(score.failure_patterns) : null, new Date().toISOString());\n }\n\n async getConversationScores(agentId: string, opts?: { limit?: number }): Promise<ResponseScore[]> {\n let sql = 'SELECT * FROM become_conversation_scores WHERE agent_id = ? ORDER BY created_at DESC';\n const params: any[] = [agentId];\n if (opts?.limit) { sql += ' LIMIT ?'; params.push(opts.limit); }\n return this.db.prepare(sql).all(...params).map((r: any) => ({\n quality: r.quality,\n confidence: r.confidence,\n skill_signals: JSON.parse(r.skill_signals ?? '[]'),\n failure_patterns: r.failure_patterns ? JSON.parse(r.failure_patterns) : undefined,\n }));\n }\n\n // ── Cultural Norms ──────────────────────────────────────────────────────\n\n async saveNorm(norm: CulturalNorm): Promise<void> {\n this.db.prepare(`\n INSERT INTO become_norms (id, title, description, category, significance, evidence, adopter_count, first_observed_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET title=excluded.title, description=excluded.description, category=excluded.category,\n significance=excluded.significance, evidence=excluded.evidence, adopter_count=excluded.adopter_count, updated_at=excluded.updated_at\n `).run(norm.id, norm.title, norm.description, norm.category, norm.significance, JSON.stringify(norm.evidence), norm.adopter_count, norm.first_observed_at, norm.updated_at);\n }\n\n async getNorms(opts?: { category?: NormCategory; limit?: number }): Promise<CulturalNorm[]> {\n let sql = 'SELECT * FROM become_norms';\n const params: any[] = [];\n if (opts?.category) { sql += ' WHERE category = ?'; params.push(opts.category); }\n sql += ' ORDER BY first_observed_at DESC';\n if (opts?.limit) { sql += ' LIMIT ?'; params.push(opts.limit); }\n return this.db.prepare(sql).all(...params).map((r: any) => ({\n ...r, evidence: JSON.parse(r.evidence ?? '[]'),\n }));\n }\n\n // ── Helpers ─────────────────────────────────────────────────────────────\n\n private rowToSkill(row: any): Skill {\n return {\n ...row,\n evidence: JSON.parse(row.evidence ?? '{}'),\n learned_from: JSON.parse(row.learned_from ?? '[]'),\n };\n }\n\n private rowToScore(row: any): Score {\n return {\n skill: row.skill, score: row.score, blooms_level: row.blooms_level,\n dreyfus_stage: row.dreyfus_stage, evidence: JSON.parse(row.evidence ?? '{}'),\n computed_at: row.computed_at,\n };\n }\n\n private rowToReview(row: any): PeerReview {\n return {\n ...row,\n strengths: JSON.parse(row.strengths ?? '[]'),\n weaknesses: JSON.parse(row.weaknesses ?? '[]'),\n suggestions: JSON.parse(row.suggestions ?? '[]'),\n };\n }\n\n /** Close the database connection */\n close(): void {\n this.db?.close();\n }\n}\n\nfunction generateId(): string {\n try {\n return crypto.randomUUID();\n } catch {\n const hex = () => Math.random().toString(16).slice(2, 10);\n return `${hex()}${hex()}-${hex()}-4${hex().slice(1)}-${hex()}-${hex()}${hex()}${hex()}`;\n }\n}\n","import type { ConversationTurn, ResponseScore } from '../core/types.js';\n\nexport interface ScoredTurn {\n turn: ConversationTurn;\n score: ResponseScore;\n}\n\nexport type DatasetFormat = 'alpaca' | 'sharegpt' | 'openai';\n\ninterface AlpacaEntry {\n instruction: string;\n input: string;\n output: string;\n quality: number;\n}\n\ninterface ShareGPTEntry {\n conversations: { from: string; value: string }[];\n quality: number;\n}\n\ninterface OpenAIEntry {\n messages: { role: string; content: string }[];\n quality: number;\n}\n\n/**\n * Convert scored conversation turns into a fine-tuning dataset.\n *\n * Only includes turns with quality === 1 (positive) as training examples.\n * Turns with quality === -1 are excluded (we train on what works, not what fails).\n * Turns with quality === 0 are excluded (uncertain signal).\n */\nexport function toTrainingDataset(\n scoredTurns: ScoredTurn[],\n format: DatasetFormat = 'alpaca',\n): string {\n // Filter to positive examples only\n const positive = scoredTurns.filter((st) => st.score.quality === 1);\n\n if (positive.length === 0) return '';\n\n const lines: string[] = [];\n\n for (const { turn, score } of positive) {\n let entry: string;\n\n switch (format) {\n case 'alpaca':\n entry = JSON.stringify({\n instruction: turn.context.current_task ?? 'Respond helpfully to the user.',\n input: turn.user_message,\n output: turn.agent_response,\n quality: score.quality,\n } satisfies AlpacaEntry);\n break;\n\n case 'sharegpt':\n entry = JSON.stringify({\n conversations: [\n { from: 'human', value: turn.user_message },\n { from: 'gpt', value: turn.agent_response },\n ],\n quality: score.quality,\n } satisfies ShareGPTEntry);\n break;\n\n case 'openai':\n entry = JSON.stringify({\n messages: [\n { role: 'user', content: turn.user_message },\n { role: 'assistant', content: turn.agent_response },\n ],\n quality: score.quality,\n } satisfies OpenAIEntry);\n break;\n }\n\n lines.push(entry);\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/**\n * Get statistics about a dataset before training.\n */\nexport function datasetStats(scoredTurns: ScoredTurn[]): {\n total_turns: number;\n positive: number;\n negative: number;\n neutral: number;\n training_examples: number;\n skills_covered: string[];\n avg_confidence: number;\n} {\n let positive = 0;\n let negative = 0;\n let neutral = 0;\n let totalConfidence = 0;\n const skills = new Set<string>();\n\n for (const st of scoredTurns) {\n if (st.score.quality === 1) positive++;\n else if (st.score.quality === -1) negative++;\n else neutral++;\n\n totalConfidence += st.score.confidence;\n\n for (const s of st.score.skill_signals) {\n skills.add(s);\n }\n }\n\n return {\n total_turns: scoredTurns.length,\n positive,\n negative,\n neutral,\n training_examples: positive,\n skills_covered: [...skills],\n avg_confidence: scoredTurns.length > 0\n ? Math.round((totalConfidence / scoredTurns.length) * 100) / 100\n : 0,\n };\n}\n\n/**\n * Filter scored turns for high-confidence positive examples.\n * Use this before training to get the cleanest dataset.\n */\nexport function filterHighQuality(\n scoredTurns: ScoredTurn[],\n minConfidence = 0.7,\n): ScoredTurn[] {\n return scoredTurns.filter(\n (st) => st.score.quality === 1 && st.score.confidence >= minConfidence,\n );\n}\n","import { writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { execFileSync } from 'node:child_process';\n\nexport interface TrainConfig {\n /** Path to base model or HuggingFace model ID */\n baseModel: string;\n /** Path to JSONL training dataset */\n dataset: string;\n /** Directory to save the LoRA adapter */\n outputDir: string;\n /** Training backend */\n backend: 'unsloth' | 'axolotl';\n /** Number of training epochs */\n epochs?: number;\n /** LoRA rank (default 16) */\n rank?: number;\n /** Learning rate (default 2e-4) */\n lr?: number;\n}\n\nexport interface TrainingResult {\n success: boolean;\n adapter_path?: string;\n epochs_completed?: number;\n error?: string;\n}\n\n// Allowlist for safe characters in paths and model names\nconst SAFE_PATH_REGEX = /^[a-zA-Z0-9_\\-./: ]+$/;\nconst SAFE_MODEL_REGEX = /^[a-zA-Z0-9_\\-./]+$/;\n\nfunction validateTrainInput(config: TrainConfig): string | null {\n if (!SAFE_MODEL_REGEX.test(config.baseModel)) {\n return `Invalid base model name: contains disallowed characters`;\n }\n if (!SAFE_PATH_REGEX.test(config.dataset)) {\n return `Invalid dataset path: contains disallowed characters`;\n }\n if (!SAFE_PATH_REGEX.test(config.outputDir)) {\n return `Invalid output directory: contains disallowed characters`;\n }\n if (config.epochs !== undefined && (config.epochs < 1 || config.epochs > 100)) {\n return `Epochs must be between 1 and 100`;\n }\n if (config.rank !== undefined && (config.rank < 1 || config.rank > 256)) {\n return `LoRA rank must be between 1 and 256`;\n }\n if (config.lr !== undefined && (config.lr <= 0 || config.lr > 1)) {\n return `Learning rate must be between 0 and 1`;\n }\n return null;\n}\n\n/** Escape a string for safe embedding in a Python string literal */\nfunction escapePython(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n');\n}\n\n/**\n * Run LoRA training via Python subprocess.\n *\n * Requires Python 3.10+ and the chosen backend installed:\n * - unsloth: pip install unsloth\n * - axolotl: pip install axolotl\n */\nexport function trainLoRA(config: TrainConfig): TrainingResult {\n const {\n baseModel,\n dataset,\n outputDir,\n backend,\n epochs = 3,\n rank = 16,\n lr = 2e-4,\n } = config;\n\n // Validate all inputs before any file or process operations\n const validationError = validateTrainInput(config);\n if (validationError) {\n return { success: false, error: validationError };\n }\n\n if (!existsSync(dataset)) {\n return { success: false, error: `Dataset not found: ${dataset}` };\n }\n\n const safeOutputDir = resolve(outputDir);\n if (!existsSync(safeOutputDir)) {\n mkdirSync(safeOutputDir, { recursive: true });\n }\n\n // Generate training script with escaped values\n const script = backend === 'unsloth'\n ? generateUnslothScript(escapePython(baseModel), escapePython(dataset), escapePython(safeOutputDir), epochs, rank, lr)\n : generateAxolotlConfig(baseModel, dataset, safeOutputDir, epochs, rank, lr);\n\n const scriptPath = join(safeOutputDir, backend === 'unsloth' ? 'train.py' : 'config.yml');\n writeFileSync(scriptPath, script, 'utf-8');\n\n try {\n if (backend === 'unsloth') {\n // Use execFileSync to avoid shell injection — passes args as array, not string\n execFileSync('python3', [scriptPath], {\n cwd: safeOutputDir,\n timeout: 3600000,\n stdio: 'pipe',\n });\n } else {\n execFileSync('accelerate', ['launch', '-m', 'axolotl.cli.train', scriptPath], {\n cwd: safeOutputDir,\n timeout: 3600000,\n stdio: 'pipe',\n });\n }\n\n const adapterPath = join(safeOutputDir, 'adapter');\n return {\n success: true,\n adapter_path: adapterPath,\n epochs_completed: epochs,\n };\n } catch (err: any) {\n return {\n success: false,\n error: err.message?.slice(0, 500) ?? 'Training failed',\n };\n }\n}\n\nfunction generateUnslothScript(\n model: string, dataset: string, output: string,\n epochs: number, rank: number, lr: number,\n): string {\n return `#!/usr/bin/env python3\n\"\"\"Auto-generated by @openclaw/become — LoRA training via Unsloth\"\"\"\n\nfrom unsloth import FastLanguageModel\nfrom datasets import load_dataset\nfrom trl import SFTTrainer\nfrom transformers import TrainingArguments\n\nmodel, tokenizer = FastLanguageModel.from_pretrained(\n model_name=\"${model}\",\n max_seq_length=2048,\n load_in_4bit=True,\n)\n\nmodel = FastLanguageModel.get_peft_model(\n model,\n r=${rank},\n target_modules=[\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\",\n \"gate_proj\", \"up_proj\", \"down_proj\"],\n lora_alpha=${rank * 2},\n lora_dropout=0,\n use_gradient_checkpointing=\"unsloth\",\n)\n\ndataset = load_dataset(\"json\", data_files=\"${dataset}\", split=\"train\")\n\ntrainer = SFTTrainer(\n model=model,\n tokenizer=tokenizer,\n train_dataset=dataset,\n dataset_text_field=\"output\",\n max_seq_length=2048,\n args=TrainingArguments(\n per_device_train_batch_size=2,\n gradient_accumulation_steps=4,\n warmup_steps=5,\n num_train_epochs=${epochs},\n learning_rate=${lr},\n fp16=True,\n logging_steps=1,\n output_dir=\"${output}/checkpoints\",\n seed=42,\n ),\n)\n\ntrainer.train()\nmodel.save_pretrained(\"${output}/adapter\")\ntokenizer.save_pretrained(\"${output}/adapter\")\nprint(\"Training complete. Adapter saved to ${output}/adapter\")\n`;\n}\n\nfunction generateAxolotlConfig(\n model: string, dataset: string, output: string,\n epochs: number, rank: number, lr: number,\n): string {\n return `# Auto-generated by @openclaw/become — LoRA training via Axolotl\nbase_model: ${model}\nmodel_type: AutoModelForCausalLM\ntokenizer_type: AutoTokenizer\n\nload_in_4bit: true\n\nadapter: lora\nlora_r: ${rank}\nlora_alpha: ${rank * 2}\nlora_dropout: 0.0\nlora_target_modules:\n - q_proj\n - k_proj\n - v_proj\n - o_proj\n\ndatasets:\n - path: ${dataset}\n type: alpaca\n\nsequence_len: 2048\nnum_epochs: ${epochs}\nlearning_rate: ${lr}\nmicro_batch_size: 2\ngradient_accumulation_steps: 4\n\noutput_dir: ${output}/adapter\n`;\n}\n","import type { StorageAdapter } from '../core/types.js';\nimport { datasetStats } from './dataset.js';\n\nexport interface SchedulerConfig {\n /** Storage adapter to fetch scored turns */\n adapter: StorageAdapter;\n /** Agent ID to train for */\n agentId: string;\n /** Minimum scored turns before training triggers */\n minSamples: number;\n /** Minimum confidence threshold for training examples */\n minConfidence?: number;\n /** Check interval in milliseconds (default: 30 minutes) */\n intervalMs?: number;\n /** Callback when training should occur */\n onReady: (dataset: string, stats: ReturnType<typeof datasetStats>) => void | Promise<void>;\n}\n\nexport type SchedulerStatus = 'idle' | 'checking' | 'ready' | 'stopped';\n\nexport class TrainScheduler {\n private timer: ReturnType<typeof setInterval> | null = null;\n private status: SchedulerStatus = 'idle';\n private checking = false; // Re-entry guard\n private config: Required<SchedulerConfig>;\n\n constructor(config: SchedulerConfig) {\n this.config = {\n ...config,\n minConfidence: config.minConfidence ?? 0.7,\n intervalMs: config.intervalMs ?? 30 * 60 * 1000,\n };\n }\n\n start(): void {\n if (this.timer) return;\n this.status = 'idle';\n this.timer = setInterval(() => this.check(), this.config.intervalMs);\n // Run first check immediately\n this.check();\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.status = 'stopped';\n this.checking = false;\n }\n\n getStatus(): SchedulerStatus {\n return this.status;\n }\n\n private async check(): Promise<void> {\n // Re-entry guard — skip if already checking or stopped\n if (this.checking || this.status === 'stopped') return;\n this.checking = true;\n this.status = 'checking';\n\n try {\n const rawScores = await this.config.adapter.getConversationScores(\n this.config.agentId,\n { limit: 500 },\n );\n\n const highConfPositive = rawScores.filter(\n (s) => s.quality === 1 && s.confidence >= this.config.minConfidence,\n );\n\n if (highConfPositive.length >= this.config.minSamples) {\n this.status = 'ready';\n await this.config.onReady('', {\n total_turns: rawScores.length,\n positive: rawScores.filter((s) => s.quality === 1).length,\n negative: rawScores.filter((s) => s.quality === -1).length,\n neutral: rawScores.filter((s) => s.quality === 0).length,\n training_examples: highConfPositive.length,\n skills_covered: [...new Set(rawScores.flatMap((s) => s.skill_signals))],\n avg_confidence: rawScores.length > 0\n ? Math.round(rawScores.reduce((sum, s) => sum + s.confidence, 0) / rawScores.length * 100) / 100\n : 0,\n });\n }\n\n this.status = 'idle';\n } catch {\n this.status = 'idle';\n } finally {\n this.checking = false;\n }\n }\n}\n","import { SkillStore } from './core/skill-store.js';\nimport { Reflector } from './core/reflector.js';\nimport { MilestoneDetector } from './core/milestones.js';\nimport type { StorageAdapter } from './core/types.js';\nimport * as Scorer from './core/scorer.js';\n\nexport class Become {\n readonly skills: SkillStore;\n readonly scorer = Scorer;\n readonly reflector: Reflector;\n readonly milestones: MilestoneDetector;\n\n constructor(opts: { store: StorageAdapter }) {\n this.skills = new SkillStore(opts.store);\n this.reflector = new Reflector(opts.store);\n this.milestones = new MilestoneDetector(opts.store);\n }\n}\n\n// Core\nexport * from './core/types.js';\nexport * from './core/scorer.js';\nexport { validateAgentId } from './core/validation.js';\nexport { SkillStore } from './core/skill-store.js';\nexport { Reflector } from './core/reflector.js';\nexport {\n detectCreativeMismatch,\n detectCollaborationGap,\n detectReactionDisparity,\n detectIdleCreative,\n detectQuestStreak,\n detectSoloCreator,\n detectProlificCollaborator,\n detectSymbolicVocabulary,\n detectCollectiveMemory,\n detectCulturalOutlier,\n} from './core/reflector.js';\nexport { MilestoneDetector } from './core/milestones.js';\n\n// Adapters\nexport { MemoryStore } from './adapters/memory.js';\n\n// Learn\nexport { ConversationLearner } from './learn/conversation.js';\nexport type { LearningSignal, ConversationSession, SessionLearning, LLMJudge } from './learn/conversation.js';\nexport { SkillEvolver } from './learn/skill-evolver.js';\nexport type { GeneratedSkill, EvolveLLM } from './learn/skill-evolver.js';\nexport { SkillPruner } from './learn/skill-pruner.js';\nexport { parseSkillFile, importSkillDirectory } from './learn/import.js';\n\n// Social\nexport { PeerReviewProtocol } from './social/peer-review.js';\nexport { TeachingProtocol } from './social/teaching.js';\nexport type { TeacherCandidate, StudentCandidate, TeachingContext } from './social/teaching.js';\nexport { LearningGraph } from './social/learning-graph.js';\nexport type { MentorSummary } from './social/learning-graph.js';\nexport { getReputationLevel, checkGate } from './social/reputation.js';\nexport { NormDetector, normalizeCategory } from './social/norms.js';\nexport type { AgentActivity, NormLLM, AdoptionMetrics } from './social/norms.js';\n\n// Measure\nexport { AwarenessIndex } from './measure/awareness.js';\nexport type { AwarenessInput } from './measure/awareness.js';\nexport { GrowthTracker } from './measure/growth.js';\nexport type { PopulationStats } from './measure/growth.js';\nexport { TrendTracker } from './measure/trends.js';\nexport type { TrendAnalysis } from './measure/trends.js';\n\n// Adapters — LLM\nexport type { LLMAdapter, LLMOptions } from './adapters/llm.js';\nexport { OpenAIAdapter } from './adapters/llm.js';\nexport type { OpenAIConfig } from './adapters/llm.js';\nexport { AnthropicAdapter } from './adapters/llm.js';\nexport type { AnthropicConfig } from './adapters/llm.js';\nexport { OllamaAdapter } from './adapters/llm.js';\nexport type { OllamaConfig } from './adapters/llm.js';\n\n// Adapters — SQLite\nexport { SQLiteStore } from './adapters/sqlite.js';\nexport type { SQLiteStoreOptions } from './adapters/sqlite.js';\n\n// RL\nexport { toTrainingDataset, datasetStats, filterHighQuality } from './rl/dataset.js';\nexport type { ScoredTurn, DatasetFormat } from './rl/dataset.js';\nexport { trainLoRA } from './rl/train.js';\nexport type { TrainConfig, TrainingResult } from './rl/train.js';\nexport { TrainScheduler } from './rl/scheduler.js';\nexport type { SchedulerConfig, SchedulerStatus } from './rl/scheduler.js';\n"],"mappings":"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","names":["EVOLVE_THRESHOLD","sanitize","truncate","generateId","join"]}
|