{"version":3,"sources":["../src/utils.ts","../src/skills/loader.ts","../src/config/loader.ts","../src/index.ts","../src/skills/resolver.ts","../src/session/manager.ts","../src/hooks/system-prompt.ts","../src/hooks/chat-message.ts","../src/hooks/tool-execute.ts","../src/hooks/lifecycle.ts","../src/tools/loaded-skills.ts","../src/hooks/index.ts"],"names":["join","existsSync","readFileSync","homedir","dirname","mkdirSync","writeFileSync","extname","event","filterSkillsByTokenBudget"],"mappings":"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","file":"index.cjs","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\n\nexport function estimateTokens(text: string): number {\n  return Math.ceil(text.length / 4)\n}\n\nexport function matchGlobPattern(filePath: string, pattern: string): boolean {\n  let regexPattern = pattern\n    .replace(/\\*\\*\\//g, \"\\x00DOUBLESTARSLASH\\x00\")\n    .replace(/\\*\\*/g, \"\\x00DOUBLESTAR\\x00\")\n    .replace(/\\*/g, \"\\x00SINGLESTAR\\x00\")\n    .replace(/\\?/g, \"\\x00QUESTION\\x00\")\n  \n  regexPattern = regexPattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n  \n  regexPattern = regexPattern\n    .replace(/\\x00DOUBLESTARSLASH\\x00/g, \"(?:[^/]+/)*\")\n    .replace(/\\x00DOUBLESTAR\\x00/g, \".*\")\n    .replace(/\\x00SINGLESTAR\\x00/g, \"[^/]*\")\n    .replace(/\\x00QUESTION\\x00/g, \"[^/]\")\n\n  const regex = new RegExp(`^${regexPattern}$`)\n  return regex.test(filePath)\n}\n\nexport function matchesAnyPattern(\n  filePath: string,\n  patterns: string[]\n): boolean {\n  return patterns.some((pattern) => matchGlobPattern(filePath, pattern))\n}\n\nexport function checkCondition(\n  condition: { fileExists?: string; packageHasDependency?: string; envVar?: string },\n  projectDir: string\n): boolean {\n  if (condition.fileExists) {\n    const fullPath = join(projectDir, condition.fileExists)\n    if (!existsSync(fullPath)) return false\n  }\n\n  if (condition.packageHasDependency) {\n    const packageJsonPath = join(projectDir, \"package.json\")\n    if (!existsSync(packageJsonPath)) return false\n\n    try {\n      const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"))\n      const deps = {\n        ...packageJson.dependencies,\n        ...packageJson.devDependencies,\n        ...packageJson.peerDependencies,\n      }\n      if (!deps[condition.packageHasDependency]) return false\n    } catch {\n      return false\n    }\n  }\n\n  if (condition.envVar) {\n    if (!process.env[condition.envVar]) return false\n  }\n\n  return true\n}\n\nexport function extractKeywords(text: string): string[] {\n  const words = text.toLowerCase().match(/\\b[a-z]{3,}\\b/g) ?? []\n  return [...new Set(words)]\n}\n\nexport function textContainsKeyword(text: string, keywords: string[]): boolean {\n  const lowerText = text.toLowerCase()\n  return keywords.some((kw) => lowerText.includes(kw.toLowerCase()))\n}\n\nexport function minifyContent(text: string): string {\n  return text\n    .replace(/<!--[\\s\\S]*?-->/g, \"\")\n    .replace(/^---\\s*\\n[\\s\\S]*?\\n---\\s*\\n?/, \"\")\n    .replace(/[ \\t]+$/gm, \"\")\n    .replace(/\\n{3,}/g, \"\\n\\n\")\n    .replace(/[ \\t]{2,}/g, \" \")\n    .replace(/^\\n+/, \"\")\n    .replace(/\\n+$/, \"\")\n}\n\nexport function minifyContentAggressive(text: string): string {\n  let result = text\n    .replace(/<!--[\\s\\S]*?-->/g, \"\")\n    .replace(/^---\\s*\\n[\\s\\S]*?\\n---\\s*\\n?/, \"\")\n\n  result = result.replace(/^(#{1,6})\\s+(.+)$/gm, (_, _hashes, title) => `[${title.toUpperCase()}]`)\n\n  result = result.replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\")\n  result = result.replace(/\\*([^*]+)\\*/g, \"$1\")\n  result = result.replace(/__([^_]+)__/g, \"$1\")\n  result = result.replace(/(?<=\\s|^)_([^_\\s]+)_(?=\\s|$|[.,;:!?])/gm, \"$1\")\n\n  result = result.replace(/```\\w*\\n([\\s\\S]*?)```/g, (_, code) => {\n    return code\n      .split(\"\\n\")\n      .map((line: string) => line.trim())\n      .filter((line: string) => line.length > 0)\n      .join(\"|\")\n  })\n\n  result = result.replace(/^[-*+]\\s+(.+)$/gm, \"|$1\")\n  result = result.replace(/^\\d+\\.\\s+(.+)$/gm, \"|$1\")\n\n  result = result.replace(/(\\|\\S[^|]*)\\n(\\|)/g, \"$1$2\")\n\n  result = result.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\")\n\n  result = result\n    .replace(/[ \\t]+$/gm, \"\")\n    .replace(/\\n{3,}/g, \"\\n\")\n    .replace(/[ \\t]{2,}/g, \" \")\n    .replace(/^\\n+/, \"\")\n    .replace(/\\n+$/, \"\")\n\n  result = result.replace(\n    /\\b(MANDATORY|FORBIDDEN|CRITICAL|NEVER|ALWAYS|MUST|REQUIRED)\\b/g,\n    \">>>$1<<<\"\n  )\n\n  return result\n}\n","import { existsSync, readFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { homedir } from \"node:os\"\nimport type { ParsedSkill, SkillSettings, MinificationLevel } from \"../types.js\"\nimport { estimateTokens, minifyContent, minifyContentAggressive } from \"../utils.js\"\n\nconst SKILL_FILENAME = \"SKILL.md\"\n\nconst SKILL_SEARCH_PATHS = [\n  (dir: string) => join(dir, \".opencode\", \"skills\"),\n  (dir: string) => join(dir, \".claude\", \"skills\"),\n  () => join(homedir(), \".config\", \"opencode\", \"skills\"),\n  () => join(homedir(), \".claude\", \"skills\"),\n]\n\nfunction findSkillFile(skillName: string, projectDir: string): string | null {\n  for (const getPath of SKILL_SEARCH_PATHS) {\n    const skillDir = getPath(projectDir)\n    const skillPath = join(skillDir, skillName, SKILL_FILENAME)\n\n    if (existsSync(skillPath)) {\n      return skillPath\n    }\n  }\n  return null\n}\n\ninterface FrontmatterData {\n  name?: string\n  description?: string\n  summary?: string\n}\n\nfunction parseFrontmatter(content: string): FrontmatterData {\n  const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---/)\n  if (!frontmatterMatch?.[1]) {\n    return {}\n  }\n\n  const frontmatter = frontmatterMatch[1]\n  const result: FrontmatterData = {}\n\n  const nameMatch = frontmatter.match(/^name:\\s*(.+)$/m)\n  if (nameMatch?.[1]) {\n    result.name = nameMatch[1].trim()\n  }\n\n  const descMatch = frontmatter.match(/^description:\\s*(.+)$/m)\n  if (descMatch?.[1]) {\n    result.description = descMatch[1].trim()\n  }\n\n  const summaryMatch = frontmatter.match(/^summary:\\s*(.+)$/m)\n  if (summaryMatch?.[1]) {\n    result.summary = summaryMatch[1].trim()\n  }\n\n  return result\n}\n\nfunction extractAutoSummary(content: string, maxLength: number = 500): string {\n  const withoutFrontmatter = content.replace(/^---\\s*\\n[\\s\\S]*?\\n---\\s*\\n?/, \"\")\n  \n  const firstSection = withoutFrontmatter.split(/\\n##\\s/)[0] ?? \"\"\n  const cleaned = firstSection\n    .replace(/^#\\s+.+\\n?/, \"\")\n    .replace(/\\n+/g, \" \")\n    .trim()\n\n  if (cleaned.length <= maxLength) return cleaned\n  return cleaned.slice(0, maxLength).replace(/\\s+\\S*$/, \"\") + \"...\"\n}\n\nexport function loadSkill(skillName: string, projectDir: string): ParsedSkill | null {\n  const filePath = findSkillFile(skillName, projectDir)\n\n  if (!filePath) {\n    return null\n  }\n\n  try {\n    const content = readFileSync(filePath, \"utf-8\")\n    const { name, description, summary } = parseFrontmatter(content)\n\n    return {\n      name: name ?? skillName,\n      description: description ?? \"\",\n      summary: summary ?? extractAutoSummary(content),\n      content,\n      filePath,\n      tokenCount: estimateTokens(content),\n    }\n  } catch {\n    return null\n  }\n}\n\nexport function loadSkills(skillNames: string[], projectDir: string): ParsedSkill[] {\n  if (!Array.isArray(skillNames)) {\n    return []\n  }\n\n  const skills: ParsedSkill[] = []\n\n  for (const name of skillNames) {\n    const skill = loadSkill(name, projectDir)\n    if (skill) {\n      skills.push(skill)\n    }\n  }\n\n  return skills\n}\n\nexport interface FormatOptions {\n  useSummaries?: boolean\n  useMinification?: boolean | MinificationLevel\n  skillSettings?: Record<string, SkillSettings>\n}\n\nfunction applyMinification(content: string, level: boolean | MinificationLevel): string {\n  if (!level) return content\n  if (level === \"aggressive\") return minifyContentAggressive(content)\n  return minifyContent(content)\n}\n\nexport function formatSkillsForInjection(\n  skills: ParsedSkill[],\n  options: boolean | FormatOptions = false\n): string {\n  if (!Array.isArray(skills) || skills.length === 0) {\n    return \"\"\n  }\n\n  const opts: FormatOptions = typeof options === \"boolean\" \n    ? { useSummaries: options } \n    : options\n  \n  const globalUseSummaries = opts.useSummaries ?? false\n  const minificationLevel = opts.useMinification ?? false\n  const skillSettings = opts.skillSettings ?? {}\n\n  const isAggressive = minificationLevel === \"aggressive\"\n\n  const parts = skills.map((skill) => {\n    const perSkillSetting = skillSettings[skill.name]?.useSummary\n    const shouldUseSummary = perSkillSetting ?? globalUseSummaries\n    let content = shouldUseSummary && skill.summary ? skill.summary : skill.content\n    content = applyMinification(content, minificationLevel)\n    \n    if (isAggressive) {\n      return `[SKILL:${skill.name}]|${content.replace(/\\n/g, \"|\")}`\n    }\n    return `<preloaded-skill name=\"${skill.name}\">\\n${content}\\n</preloaded-skill>`\n  })\n\n  if (isAggressive) {\n    return `[SKILLS]|${parts.join(\"|[END]|\")}`\n  }\n\n  return `<preloaded-skills>\nThe following skills have been automatically loaded for this session:\n\n${parts.join(\"\\n\\n\")}\n</preloaded-skills>`\n}\n\nexport function calculateTotalTokens(skills: ParsedSkill[]): number {\n  return skills.reduce((sum, skill) => sum + skill.tokenCount, 0)\n}\n\nexport function filterSkillsByTokenBudget(\n  skills: ParsedSkill[],\n  maxTokens: number\n): ParsedSkill[] {\n  const result: ParsedSkill[] = []\n  let totalTokens = 0\n\n  for (const skill of skills) {\n    if (totalTokens + skill.tokenCount <= maxTokens) {\n      result.push(skill)\n      totalTokens += skill.tokenCount\n    }\n  }\n\n  return result\n}\n","import { existsSync, readFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { homedir } from \"node:os\"\nimport type {\n  PreloadSkillsConfig,\n  ConditionalSkill,\n  SkillSettings,\n  InjectionMethod,\n} from \"../types.js\"\n\nconst CONFIG_FILENAME = \"preload-skills.json\"\n\nexport const DEFAULT_CONFIG: PreloadSkillsConfig = {\n  skills: [],\n  fileTypeSkills: {},\n  agentSkills: {},\n  pathPatterns: {},\n  contentTriggers: {},\n  groups: {},\n  conditionalSkills: [],\n  skillSettings: {},\n  injectionMethod: \"systemPrompt\",\n  maxTokens: undefined,\n  useSummaries: false,\n  useMinification: false,\n  showToasts: false,\n  enableTools: true,\n  analytics: false,\n  persistAfterCompaction: true,\n  debug: false,\n}\n\nfunction findConfigFile(projectDir: string): string | null {\n  const locations = [\n    join(projectDir, \".opencode\", CONFIG_FILENAME),\n    join(projectDir, CONFIG_FILENAME),\n    join(homedir(), \".config\", \"opencode\", CONFIG_FILENAME),\n  ]\n\n  for (const path of locations) {\n    if (existsSync(path)) {\n      return path\n    }\n  }\n  return null\n}\n\nfunction parseStringArrayRecord(raw: unknown): Record<string, string[]> {\n  if (!raw || typeof raw !== \"object\") return {}\n\n  const result: Record<string, string[]> = {}\n  for (const [key, value] of Object.entries(raw)) {\n    if (Array.isArray(value)) {\n      result[key] = value.filter((v) => typeof v === \"string\")\n    }\n  }\n  return result\n}\n\nfunction parseConditionalSkills(raw: unknown): ConditionalSkill[] {\n  if (!Array.isArray(raw)) return []\n\n  return raw.filter(\n    (item): item is ConditionalSkill =>\n      typeof item === \"object\" &&\n      item !== null &&\n      typeof item.skill === \"string\" &&\n      typeof item.if === \"object\"\n  )\n}\n\nfunction parseSkillSettings(raw: unknown): Record<string, SkillSettings> {\n  if (!raw || typeof raw !== \"object\") return {}\n\n  const result: Record<string, SkillSettings> = {}\n  for (const [skillName, settings] of Object.entries(raw)) {\n    if (typeof settings === \"object\" && settings !== null) {\n      const parsed: SkillSettings = {}\n      if (\"useSummary\" in settings && typeof settings.useSummary === \"boolean\") {\n        parsed.useSummary = settings.useSummary\n      }\n      if (Object.keys(parsed).length > 0) {\n        result[skillName] = parsed\n      }\n    }\n  }\n  return result\n}\n\nfunction loadConfigFile(projectDir: string): Partial<PreloadSkillsConfig> {\n  const configPath = findConfigFile(projectDir)\n  if (!configPath) {\n    return {}\n  }\n\n  try {\n    const content = readFileSync(configPath, \"utf-8\")\n    const parsed = JSON.parse(content) as Record<string, unknown>\n\n    const config: Partial<PreloadSkillsConfig> = {\n      skills: Array.isArray(parsed.skills) ? parsed.skills : [],\n      fileTypeSkills: parseStringArrayRecord(parsed.fileTypeSkills),\n      agentSkills: parseStringArrayRecord(parsed.agentSkills),\n      pathPatterns: parseStringArrayRecord(parsed.pathPatterns),\n      contentTriggers: parseStringArrayRecord(parsed.contentTriggers),\n      groups: parseStringArrayRecord(parsed.groups),\n      conditionalSkills: parseConditionalSkills(parsed.conditionalSkills),\n      skillSettings: parseSkillSettings(parsed.skillSettings),\n    }\n\n    if (typeof parsed.maxTokens === \"number\") {\n      config.maxTokens = parsed.maxTokens\n    }\n    if (typeof parsed.useSummaries === \"boolean\") {\n      config.useSummaries = parsed.useSummaries\n    }\n    if (typeof parsed.useMinification === \"boolean\") {\n      config.useMinification = parsed.useMinification\n    }\n    if (typeof parsed.showToasts === \"boolean\") {\n      config.showToasts = parsed.showToasts\n    }\n    if (typeof parsed.enableTools === \"boolean\") {\n      config.enableTools = parsed.enableTools\n    }\n    if (typeof parsed.analytics === \"boolean\") {\n      config.analytics = parsed.analytics\n    }\n    if (typeof parsed.persistAfterCompaction === \"boolean\") {\n      config.persistAfterCompaction = parsed.persistAfterCompaction\n    }\n    if (typeof parsed.debug === \"boolean\") {\n      config.debug = parsed.debug\n    }\n    if (parsed.injectionMethod === \"systemPrompt\" || parsed.injectionMethod === \"chatMessage\") {\n      config.injectionMethod = parsed.injectionMethod as InjectionMethod\n    }\n\n    return config\n  } catch {\n    return {}\n  }\n}\n\nexport function loadConfig(projectDir: string): PreloadSkillsConfig {\n  const fileConfig = loadConfigFile(projectDir)\n  return {\n    ...DEFAULT_CONFIG,\n    ...fileConfig,\n  }\n}\n","import type { Plugin, PluginInput } from \"@opencode-ai/plugin\"\nimport type { PreloadSkillsConfig, ParsedSkill, PluginContext, Logger, ToastFn } from \"./types.js\"\nimport { loadConfig } from \"./config/loader.js\"\nimport { loadSkills, formatSkillsForInjection, calculateTotalTokens } from \"./skills/loader.js\"\nimport { SkillResolverImpl, resolveSkillGroups } from \"./skills/resolver.js\"\nimport { SessionManagerImpl } from \"./session/manager.js\"\nimport { createHooks } from \"./hooks\"\nimport { checkCondition } from \"./utils.js\"\n\nexport type { PreloadSkillsConfig, ParsedSkill }\nexport { loadSkills, formatSkillsForInjection }\n\nfunction resolveConditionalSkills(config: PreloadSkillsConfig, projectDir: string): string[] {\n  if (!config.conditionalSkills?.length) return []\n\n  const resolved: string[] = []\n  for (const { skill, if: condition } of config.conditionalSkills) {\n    if (checkCondition(condition, projectDir)) {\n      resolved.push(skill)\n    }\n  }\n\n  return resolved\n}\n\nexport const PreloadSkillsPlugin: Plugin = async (ctx: PluginInput) => {\n  const config = loadConfig(ctx.directory)\n\n  const log: Logger = (level, message, extra) => {\n    if (level === \"debug\" && !config.debug) return\n\n    ctx.client.app.log({\n      body: {\n        service: \"preload-skills\",\n        level,\n        message,\n        extra,\n      },\n    })\n  }\n\n  const allInitialSkillNames = [\n    ...config.skills,\n    ...resolveConditionalSkills(config, ctx.directory),\n  ]\n\n  const resolvedInitialNames = resolveSkillGroups(allInitialSkillNames, config.groups ?? {})\n  let initialSkills = loadSkills(resolvedInitialNames, ctx.directory)\n  let initialTokensUsed = calculateTotalTokens(initialSkills)\n\n  if (config.maxTokens && initialTokensUsed > config.maxTokens) {\n    const { filterSkillsByTokenBudget } = await import(\"./skills/loader.js\")\n    initialSkills = filterSkillsByTokenBudget(initialSkills, config.maxTokens)\n    initialTokensUsed = calculateTotalTokens(initialSkills)\n  }\n\n  const initialFormattedContent = formatSkillsForInjection(initialSkills, {\n    useSummaries: config.useSummaries,\n    useMinification: config.useMinification,\n    skillSettings: config.skillSettings,\n  })\n\n  if (initialSkills.length > 0) {\n    const loadedNames = initialSkills.map((s) => s.name)\n    const missingNames = allInitialSkillNames.filter(\n      (s) => !loadedNames.includes(s) && !s.startsWith(\"@\")\n    )\n\n    log(\"info\", `Loaded ${initialSkills.length} initial skills`, {\n      loaded: loadedNames,\n      tokens: initialTokensUsed,\n      missing: missingNames.length > 0 ? missingNames : undefined,\n    })\n  }\n\n  const hasTriggeredSkills =\n    Object.keys(config.fileTypeSkills ?? {}).length > 0 ||\n    Object.keys(config.agentSkills ?? {}).length > 0 ||\n    Object.keys(config.pathPatterns ?? {}).length > 0 ||\n    Object.keys(config.contentTriggers ?? {}).length > 0\n\n  if (allInitialSkillNames.length === 0 && !hasTriggeredSkills) {\n    log(\"warn\", \"No skills configured. Create .opencode/preload-skills.json\")\n  }\n\n  const sessionManager = new SessionManagerImpl(\n    config,\n    ctx.directory,\n    log,\n    new Set(initialSkills.map((s) => s.name)),\n    initialTokensUsed\n  )\n\n  for (const skill of initialSkills) {\n    sessionManager.cacheSkill(skill)\n  }\n\n  const skillResolver = new SkillResolverImpl(config, ctx.directory)\n\n  const toast: ToastFn = (message, variant = \"info\") => {\n    if (!config.showToasts) return\n    ctx.client.tui.showToast({\n      body: { message, variant, duration: 3000 },\n    })\n  }\n\n  const pluginContext: PluginContext = {\n    config,\n    projectDir: ctx.directory,\n    log,\n    toast,\n    sessionManager,\n    skillResolver,\n    initialSkills,\n    initialFormattedContent,\n    initialTokensUsed,\n  }\n\n  return createHooks(pluginContext)\n}\n\nexport default PreloadSkillsPlugin\n","import type {\n  PreloadSkillsConfig,\n  ParsedSkill,\n  SkillResolver,\n  LoadSkillsResult,\n  TriggerType,\n} from \"../types.js\"\nimport { loadSkills, filterSkillsByTokenBudget, calculateTotalTokens } from \"./loader.js\"\nimport { matchGlobPattern } from \"../utils.js\"\n\nexport function getSkillsForExtension(\n  ext: string,\n  fileTypeSkills: Record<string, string[]>\n): string[] {\n  const skills: string[] = []\n\n  for (const [pattern, skillNames] of Object.entries(fileTypeSkills)) {\n    const extensions = pattern.split(\",\").map((e) => e.trim().toLowerCase())\n    if (extensions.includes(ext.toLowerCase())) {\n      skills.push(...skillNames)\n    }\n  }\n\n  return [...new Set(skills)]\n}\n\nexport function getSkillsForPath(\n  filePath: string,\n  pathPatterns: Record<string, string[]>\n): string[] {\n  const skills: string[] = []\n\n  for (const [pattern, skillNames] of Object.entries(pathPatterns)) {\n    if (matchGlobPattern(filePath, pattern)) {\n      skills.push(...skillNames)\n    }\n  }\n\n  return [...new Set(skills)]\n}\n\nexport function resolveSkillGroups(\n  skillNames: string[],\n  groups: Record<string, string[]>\n): string[] {\n  const resolved: string[] = []\n\n  for (const name of skillNames) {\n    if (name.startsWith(\"@\") && groups[name.slice(1)]) {\n      resolved.push(...groups[name.slice(1)]!)\n    } else {\n      resolved.push(name)\n    }\n  }\n\n  return [...new Set(resolved)]\n}\n\nexport class SkillResolverImpl implements SkillResolver {\n  private readonly skillCache = new Map<string, ParsedSkill>()\n\n  constructor(\n    private readonly config: PreloadSkillsConfig,\n    private readonly projectDir: string\n  ) {}\n\n  getSkillsForExtension(ext: string): string[] {\n    return getSkillsForExtension(ext, this.config.fileTypeSkills ?? {})\n  }\n\n  getSkillsForPath(filePath: string): string[] {\n    return getSkillsForPath(filePath, this.config.pathPatterns ?? {})\n  }\n\n  resolveGroups(skillNames: string[]): string[] {\n    return resolveSkillGroups(skillNames, this.config.groups ?? {})\n  }\n\n  loadWithBudget(\n    skillNames: string[],\n    currentTokens: number,\n    _sessionId: string,\n    _triggerType: TriggerType\n  ): LoadSkillsResult {\n    const resolved = this.resolveGroups(skillNames)\n    let skills = loadSkills(resolved, this.projectDir)\n\n    for (const skill of skills) {\n      this.skillCache.set(skill.name, skill)\n    }\n\n    if (this.config.maxTokens) {\n      const remainingBudget = this.config.maxTokens - currentTokens\n      skills = filterSkillsByTokenBudget(skills, remainingBudget)\n    }\n\n    return {\n      skills,\n      tokensUsed: calculateTotalTokens(skills),\n    }\n  }\n\n  getCachedSkill(name: string): ParsedSkill | undefined {\n    return this.skillCache.get(name)\n  }\n\n  cacheSkill(skill: ParsedSkill): void {\n    this.skillCache.set(skill.name, skill)\n  }\n}\n","import { existsSync, writeFileSync, mkdirSync } from \"node:fs\"\nimport { join, dirname } from \"node:path\"\nimport type {\n  SessionState,\n  ParsedSkill,\n  AnalyticsData,\n  TriggerType,\n  PreloadSkillsConfig,\n  Logger,\n  SessionManager,\n} from \"../types.js\"\n\nconst ANALYTICS_FILENAME = \"preload-skills-analytics.json\"\n\nexport class SessionManagerImpl implements SessionManager {\n  private readonly sessions = new Map<string, SessionState>()\n  private readonly analytics = new Map<string, AnalyticsData>()\n  private readonly pendingSkills = new Map<string, ParsedSkill[]>()\n  private readonly pendingFilePaths = new Map<string, string>()\n  private readonly skillCache = new Map<string, ParsedSkill>()\n\n  constructor(\n    private readonly config: PreloadSkillsConfig,\n    private readonly projectDir: string,\n    private readonly log: Logger,\n    private readonly initialSkillNames: Set<string>,\n    private readonly initialTokensUsed: number\n  ) {}\n\n  getState(sessionId: string): SessionState {\n    if (!this.sessions.has(sessionId)) {\n      this.sessions.set(sessionId, {\n        initialSkillsInjected: false,\n        loadedSkills: new Set(this.initialSkillNames),\n        totalTokensUsed: this.initialTokensUsed,\n      })\n    }\n    return this.sessions.get(sessionId)!\n  }\n\n  queueSkills(sessionId: string, skills: ParsedSkill[], triggerType: TriggerType): void {\n    const state = this.getState(sessionId)\n    const newSkills = skills.filter(s => !state.loadedSkills.has(s.name))\n\n    if (newSkills.length === 0) return\n\n    let tokensAdded = 0\n    for (const skill of newSkills) {\n      state.loadedSkills.add(skill.name)\n      this.skillCache.set(skill.name, skill)\n      tokensAdded += skill.tokenCount\n      this.trackUsage(sessionId, skill.name, triggerType)\n    }\n    state.totalTokensUsed += tokensAdded\n\n    const existing = this.pendingSkills.get(sessionId) ?? []\n    this.pendingSkills.set(sessionId, [...existing, ...newSkills])\n\n    this.log(\"debug\", `Queued ${triggerType} skills for injection`, {\n      sessionId,\n      skills: newSkills.map(s => s.name),\n      tokens: tokensAdded,\n    })\n  }\n\n  getPendingSkills(sessionId: string): ParsedSkill[] {\n    return this.pendingSkills.get(sessionId) ?? []\n  }\n\n  clearPendingSkills(sessionId: string): void {\n    this.pendingSkills.delete(sessionId)\n  }\n\n  getAllLoadedSkills(sessionId: string): ParsedSkill[] {\n    const state = this.sessions.get(sessionId)\n    if (!state) return []\n\n    const skills: ParsedSkill[] = []\n    for (const name of state.loadedSkills) {\n      const skill = this.skillCache.get(name)\n      if (skill) skills.push(skill)\n    }\n    return skills\n  }\n\n  getCachedSkill(name: string): ParsedSkill | undefined {\n    return this.skillCache.get(name)\n  }\n\n  cacheSkill(skill: ParsedSkill): void {\n    this.skillCache.set(skill.name, skill)\n  }\n\n  trackFilePath(callId: string, filePath: string): void {\n    this.pendingFilePaths.set(callId, filePath)\n  }\n\n  getFilePath(callId: string): string | undefined {\n    return this.pendingFilePaths.get(callId)\n  }\n\n  clearFilePath(callId: string): void {\n    this.pendingFilePaths.delete(callId)\n  }\n\n  cleanup(sessionId: string): void {\n    this.sessions.delete(sessionId)\n    this.pendingSkills.delete(sessionId)\n    this.analytics.delete(sessionId)\n    this.log(\"debug\", \"Cleaned up session state\", { sessionId })\n    this.saveAnalytics()\n  }\n\n  private trackUsage(sessionId: string, skillName: string, triggerType: TriggerType): void {\n    if (!this.config.analytics) return\n\n    if (!this.analytics.has(sessionId)) {\n      this.analytics.set(sessionId, {\n        sessionId,\n        skillUsage: new Map(),\n      })\n    }\n\n    const data = this.analytics.get(sessionId)!\n    const now = Date.now()\n\n    if (data.skillUsage.has(skillName)) {\n      const stats = data.skillUsage.get(skillName)!\n      stats.loadCount++\n      stats.lastLoaded = now\n    } else {\n      data.skillUsage.set(skillName, {\n        skillName,\n        loadCount: 1,\n        triggerType,\n        firstLoaded: now,\n        lastLoaded: now,\n      })\n    }\n\n    this.saveAnalytics()\n  }\n\n  saveAnalytics(): void {\n    if (!this.config.analytics) return\n\n    try {\n      const analyticsPath = join(this.projectDir, \".opencode\", ANALYTICS_FILENAME)\n      const dir = dirname(analyticsPath)\n      if (!existsSync(dir)) {\n        mkdirSync(dir, { recursive: true })\n      }\n\n      const serializable: Record<string, unknown> = {}\n      for (const [sessionId, data] of this.analytics) {\n        serializable[sessionId] = {\n          sessionId: data.sessionId,\n          skillUsage: Object.fromEntries(data.skillUsage),\n        }\n      }\n\n      writeFileSync(analyticsPath, JSON.stringify(serializable, null, 2))\n    } catch {\n      this.log(\"warn\", \"Failed to save analytics\")\n    }\n  }\n\n  markInitialSkillsInjected(sessionId: string): void {\n    const state = this.getState(sessionId)\n    state.initialSkillsInjected = false\n  }\n}\n","import type { Model } from \"@opencode-ai/sdk\"\nimport type { PluginContext, ParsedSkill } from \"../types.js\"\nimport { formatSkillsForInjection } from \"../skills/loader.js\"\n\ninterface SystemPromptInput {\n  sessionID?: string\n  model: Model\n}\n\ninterface SystemPromptOutput {\n  system: string[]\n}\n\nexport function createSystemPromptHook(ctx: PluginContext) {\n  const { config, sessionManager, initialSkills, log, toast } = ctx\n\n  return async (input: SystemPromptInput, output: SystemPromptOutput): Promise<void> => {\n    if (!input.sessionID) return\n\n    const state = sessionManager.getState(input.sessionID)\n    const skillsToInject: ParsedSkill[] = []\n\n    if (initialSkills.length > 0) {\n      skillsToInject.push(...initialSkills)\n    }\n\n    for (const name of state.loadedSkills) {\n      const skill = sessionManager.getCachedSkill(name)\n      if (skill && !skillsToInject.find((s) => s.name === name)) {\n        skillsToInject.push(skill)\n      }\n    }\n\n    const pending = sessionManager.getPendingSkills(input.sessionID)\n    if (pending && pending.length > 0) {\n      for (const skill of pending) {\n        if (!skillsToInject.find((s) => s.name === skill.name)) {\n          skillsToInject.push(skill)\n        }\n      }\n      sessionManager.clearPendingSkills(input.sessionID)\n    }\n\n    if (skillsToInject.length > 0) {\n      const formatted = formatSkillsForInjection(skillsToInject, {\n        useSummaries: config.useSummaries,\n        useMinification: config.useMinification,\n        skillSettings: config.skillSettings,\n      })\n      output.system.push(formatted)\n\n      if (!state.initialSkillsInjected && initialSkills.length > 0) {\n        state.initialSkillsInjected = true\n        const names = initialSkills.map((s) => s.name)\n        log(\"info\", \"Injected skills into system prompt\", {\n          sessionID: input.sessionID,\n          skills: names,\n        })\n        toast(`Loaded ${names.length} skill${names.length === 1 ? \"\" : \"s\"}: ${names.join(\", \")}`)\n      }\n\n      if (pending && pending.length > 0) {\n        const pendingNames = pending.map((s) => s.name)\n        toast(`Triggered skill${pendingNames.length === 1 ? \"\" : \"s\"}: ${pendingNames.join(\", \")}`)\n      }\n    }\n  }\n}\n","import type { UserMessage, Part } from \"@opencode-ai/sdk\"\nimport type { PluginContext } from \"../types.js\"\nimport { formatSkillsForInjection } from \"../skills/loader.js\"\nimport { textContainsKeyword } from \"../utils.js\"\n\ninterface ChatMessageInput {\n  sessionID: string\n  agent?: string\n}\n\ninterface ChatMessageOutput {\n  message: UserMessage\n  parts: Part[]\n}\n\nexport function createChatMessageHook(ctx: PluginContext) {\n  const { config, sessionManager, skillResolver, initialSkills, initialFormattedContent, log, toast } = ctx\n  const useSystemPromptInjection = config.injectionMethod === \"systemPrompt\"\n\n  return async (input: ChatMessageInput, output: ChatMessageOutput): Promise<void> => {\n    if (!input.sessionID) return\n\n    const state = sessionManager.getState(input.sessionID)\n    const firstTextPart = output.parts.find((p) => p.type === \"text\")\n    if (!firstTextPart || !(\"text\" in firstTextPart)) return\n\n    const messageText = firstTextPart.text\n\n    if (input.agent && config.agentSkills?.[input.agent]) {\n      const result = skillResolver.loadWithBudget(\n        config.agentSkills[input.agent]!,\n        state.totalTokensUsed,\n        input.sessionID,\n        \"agent\"\n      )\n      if (result.skills.length > 0) {\n        sessionManager.queueSkills(input.sessionID, result.skills, \"agent\")\n      }\n    }\n\n    if (config.contentTriggers) {\n      for (const [keyword, skillNames] of Object.entries(config.contentTriggers)) {\n        if (textContainsKeyword(messageText, [keyword])) {\n          const result = skillResolver.loadWithBudget(\n            skillNames,\n            state.totalTokensUsed,\n            input.sessionID,\n            \"content\"\n          )\n          if (result.skills.length > 0) {\n            sessionManager.queueSkills(input.sessionID, result.skills, \"content\")\n          }\n        }\n      }\n    }\n\n    if (!useSystemPromptInjection) {\n      const contentToInject: string[] = []\n\n      if (!state.initialSkillsInjected && initialFormattedContent) {\n        contentToInject.push(initialFormattedContent)\n        state.initialSkillsInjected = true\n        const names = initialSkills.map((s) => s.name)\n        log(\"info\", \"Injected initial preloaded skills\", {\n          sessionID: input.sessionID,\n          skills: names,\n        })\n        toast(`Loaded ${names.length} skill${names.length === 1 ? \"\" : \"s\"}: ${names.join(\", \")}`)\n      }\n\n      const pending = sessionManager.getPendingSkills(input.sessionID)\n      if (pending && pending.length > 0) {\n        const formatted = formatSkillsForInjection(pending, {\n          useSummaries: config.useSummaries,\n          useMinification: config.useMinification,\n          skillSettings: config.skillSettings,\n        })\n        if (formatted) {\n          contentToInject.push(formatted)\n          const pendingNames = pending.map((s) => s.name)\n          log(\"info\", \"Injected triggered skills\", {\n            sessionID: input.sessionID,\n            skills: pendingNames,\n          })\n          toast(`Triggered skill${pendingNames.length === 1 ? \"\" : \"s\"}: ${pendingNames.join(\", \")}`)\n        }\n        sessionManager.clearPendingSkills(input.sessionID)\n      }\n\n      if (contentToInject.length > 0) {\n        firstTextPart.text = `${contentToInject.join(\"\\n\\n\")}\\n\\n---\\n\\n${firstTextPart.text}`\n      }\n    }\n  }\n}\n","import { extname } from \"node:path\"\nimport type { PluginContext } from \"../types.js\"\n\nconst FILE_TOOLS = [\"read\", \"edit\", \"write\", \"glob\", \"grep\"]\n\ninterface ToolExecuteInput {\n  tool: string\n  sessionID: string\n  callID: string\n}\n\ninterface ToolExecuteBeforeOutput {\n  args: Record<string, unknown>\n}\n\ninterface ToolExecuteAfterOutput {\n  title: string\n  output: string\n  metadata: unknown\n}\n\nfunction getFilePathFromArgs(args: Record<string, unknown>): string | null {\n  if (typeof args.filePath === \"string\") return args.filePath\n  if (typeof args.path === \"string\") return args.path\n  if (typeof args.file === \"string\") return args.file\n  return null\n}\n\nexport function createToolExecuteHooks(ctx: PluginContext) {\n  const { config, sessionManager, skillResolver, log } = ctx\n\n  const before = async (\n    input: ToolExecuteInput,\n    output: ToolExecuteBeforeOutput\n  ): Promise<void> => {\n    if (!FILE_TOOLS.includes(input.tool)) return\n\n    const filePath = getFilePathFromArgs(output.args)\n    if (filePath) {\n      sessionManager.trackFilePath(input.callID, filePath)\n      log(\"debug\", \"Captured file path from tool\", {\n        tool: input.tool,\n        callID: input.callID,\n        filePath,\n      })\n    }\n  }\n\n  const after = async (\n    input: ToolExecuteInput,\n    _output: ToolExecuteAfterOutput\n  ): Promise<void> => {\n    if (!FILE_TOOLS.includes(input.tool)) return\n    if (!input.sessionID) return\n\n    const filePath = sessionManager.getFilePath(input.callID)\n    sessionManager.clearFilePath(input.callID)\n\n    if (!filePath) {\n      log(\"debug\", \"No file path found for tool call\", {\n        tool: input.tool,\n        callID: input.callID,\n      })\n      return\n    }\n\n    const state = sessionManager.getState(input.sessionID)\n    const ext = extname(filePath)\n\n    log(\"debug\", \"Processing file access\", {\n      tool: input.tool,\n      filePath,\n      extension: ext,\n    })\n\n    if (ext && config.fileTypeSkills) {\n      const extSkillNames = skillResolver.getSkillsForExtension(ext)\n      if (extSkillNames.length > 0) {\n        log(\"debug\", \"Found skills for extension\", { ext, skills: extSkillNames })\n        const result = skillResolver.loadWithBudget(\n          extSkillNames,\n          state.totalTokensUsed,\n          input.sessionID,\n          \"fileType\"\n        )\n        if (result.skills.length > 0) {\n          sessionManager.queueSkills(input.sessionID, result.skills, \"fileType\")\n        }\n      }\n    }\n\n    if (config.pathPatterns) {\n      const pathSkillNames = skillResolver.getSkillsForPath(filePath)\n      if (pathSkillNames.length > 0) {\n        log(\"debug\", \"Found skills for path pattern\", { filePath, skills: pathSkillNames })\n        const result = skillResolver.loadWithBudget(\n          pathSkillNames,\n          state.totalTokensUsed,\n          input.sessionID,\n          \"path\"\n        )\n        if (result.skills.length > 0) {\n          sessionManager.queueSkills(input.sessionID, result.skills, \"path\")\n        }\n      }\n    }\n  }\n\n  return { before, after }\n}\n","import type { Event } from \"@opencode-ai/sdk\"\nimport type { PluginContext } from \"../types.js\"\nimport { formatSkillsForInjection } from \"../skills/loader.js\"\n\ninterface CompactingInput {\n  sessionID: string\n}\n\ninterface CompactingOutput {\n  context: string[]\n  prompt?: string\n}\n\ninterface EventInput {\n  event: Event\n}\n\nexport function createLifecycleHooks(ctx: PluginContext) {\n  const { config, sessionManager, log } = ctx\n\n  const compacting = async (\n    input: CompactingInput,\n    output: CompactingOutput\n  ): Promise<void> => {\n    if (!config.persistAfterCompaction) return\n\n    const allLoadedSkills = sessionManager.getAllLoadedSkills(input.sessionID)\n    if (allLoadedSkills.length === 0) return\n\n    const formatted = formatSkillsForInjection(allLoadedSkills, {\n      useSummaries: config.useSummaries,\n      useMinification: config.useMinification,\n      skillSettings: config.skillSettings,\n    })\n\n    output.context.push(\n      `## Preloaded Skills\\n\\nThe following skills were loaded during this session and should persist:\\n\\n${formatted}`\n    )\n\n    sessionManager.markInitialSkillsInjected(input.sessionID)\n\n    log(\"info\", \"Added all loaded skills to compaction context\", {\n      sessionID: input.sessionID,\n      skillCount: allLoadedSkills.length,\n    })\n\n    sessionManager.saveAnalytics()\n  }\n\n  const event = async ({ event }: EventInput): Promise<void> => {\n    if (event.type === \"session.deleted\" && \"sessionID\" in event.properties) {\n      const sessionID = event.properties.sessionID as string\n      sessionManager.cleanup(sessionID)\n    }\n  }\n\n  return { compacting, event }\n}\n","import type { ToolContext } from \"@opencode-ai/plugin\"\nimport type { SessionManager, ToastFn } from \"../types.js\"\n\ninterface SkillInfo {\n  name: string\n  description: string\n  tokens: number\n}\n\nfunction formatSkillTable(skills: SkillInfo[]): string {\n  const totalTokens = skills.reduce((sum, s) => sum + s.tokens, 0)\n  const lines = skills.map(\n    (s) => `- **${s.name}** (${s.tokens} tokens) — ${s.description}`\n  )\n\n  return [\n    `**${skills.length} skill${skills.length === 1 ? \"\" : \"s\"} loaded** (${totalTokens} total tokens)`,\n    \"\",\n    ...lines,\n  ].join(\"\\n\")\n}\n\nfunction formatToast(skills: SkillInfo[], tokensUsed: number): string {\n  const lines = skills.map((s) => `• ${s.name} (${s.tokens} tok)`)\n  return [\n    `${skills.length} skill${skills.length === 1 ? \"\" : \"s\"} loaded (${tokensUsed} tokens):`,\n    ...lines,\n  ].join(\"\\n\")\n}\n\nexport function createLoadedSkillsTool(sessionManager: SessionManager, toast: ToastFn) {\n  return {\n    description:\n      \"List all preloaded skills for the current session — names, descriptions, and token counts.\",\n    args: {},\n    async execute(_args: Record<string, never>, context: ToolContext) {\n      const state = sessionManager.getState(context.sessionID)\n      const skills = sessionManager.getAllLoadedSkills(context.sessionID)\n\n      if (skills.length === 0) {\n        return \"No skills currently loaded for this session.\"\n      }\n\n      const skillInfos: SkillInfo[] = skills.map((skill) => ({\n        name: skill.name,\n        description: skill.description,\n        tokens: skill.tokenCount,\n      }))\n\n      toast(formatToast(skillInfos, state.totalTokensUsed), \"success\")\n\n      return [\n        formatSkillTable(skillInfos),\n        \"\",\n        `Token budget: ${state.totalTokensUsed} used`,\n      ].join(\"\\n\")\n    },\n  }\n}\n","import type { PluginContext } from \"../types.js\"\nimport { createSystemPromptHook } from \"./system-prompt.js\"\nimport { createChatMessageHook } from \"./chat-message.js\"\nimport { createToolExecuteHooks } from \"./tool-execute.js\"\nimport { createLifecycleHooks } from \"./lifecycle.js\"\nimport { createLoadedSkillsTool } from \"../tools/loaded-skills.js\"\n\nexport function createHooks(ctx: PluginContext): Record<string, unknown> {\n  const { before, after } = createToolExecuteHooks(ctx)\n  const { compacting, event } = createLifecycleHooks(ctx)\n  const useSystemPromptInjection = ctx.config.injectionMethod === \"systemPrompt\"\n  const enableTools = ctx.config.enableTools !== false\n\n  return {\n    ...(useSystemPromptInjection && {\n      \"experimental.chat.system.transform\": createSystemPromptHook(ctx),\n    }),\n    \"chat.message\": createChatMessageHook(ctx),\n    \"tool.execute.before\": before,\n    \"tool.execute.after\": after,\n    \"experimental.session.compacting\": compacting,\n    event,\n    ...(enableTools && {\n      tool: {\n        loaded_skills: createLoadedSkillsTool(ctx.sessionManager, ctx.toast),\n      },\n    }),\n  }\n}\n"]}