@greppleai/grip 0.1.6 → 0.1.7

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.
Files changed (76) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +1 -1
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +2 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/core/agent-session.d.ts +11 -1
  7. package/dist/core/agent-session.d.ts.map +1 -1
  8. package/dist/core/agent-session.js +172 -2
  9. package/dist/core/agent-session.js.map +1 -1
  10. package/dist/core/compaction/compaction.d.ts.map +1 -1
  11. package/dist/core/compaction/compaction.js +9 -2
  12. package/dist/core/compaction/compaction.js.map +1 -1
  13. package/dist/core/extensions/runner.d.ts +3 -0
  14. package/dist/core/extensions/runner.d.ts.map +1 -1
  15. package/dist/core/extensions/runner.js +22 -0
  16. package/dist/core/extensions/runner.js.map +1 -1
  17. package/dist/core/extensions/types.d.ts +21 -1
  18. package/dist/core/extensions/types.d.ts.map +1 -1
  19. package/dist/core/extensions/types.js.map +1 -1
  20. package/dist/core/instruction-resource-loader.d.ts +1 -0
  21. package/dist/core/instruction-resource-loader.d.ts.map +1 -1
  22. package/dist/core/instruction-resource-loader.js +2 -1
  23. package/dist/core/instruction-resource-loader.js.map +1 -1
  24. package/dist/core/messages.d.ts.map +1 -1
  25. package/dist/core/messages.js +30 -1
  26. package/dist/core/messages.js.map +1 -1
  27. package/dist/core/skills.d.ts.map +1 -1
  28. package/dist/core/skills.js +3 -2
  29. package/dist/core/skills.js.map +1 -1
  30. package/dist/core/system-prompt.d.ts +1 -1
  31. package/dist/core/system-prompt.d.ts.map +1 -1
  32. package/dist/core/system-prompt.js +3 -2
  33. package/dist/core/system-prompt.js.map +1 -1
  34. package/dist/core/tools/bash.d.ts +1 -0
  35. package/dist/core/tools/bash.d.ts.map +1 -1
  36. package/dist/core/tools/bash.js +26 -23
  37. package/dist/core/tools/bash.js.map +1 -1
  38. package/dist/core/tools/operations.d.ts +6 -0
  39. package/dist/core/tools/operations.d.ts.map +1 -1
  40. package/dist/core/tools/operations.js +28 -4
  41. package/dist/core/tools/operations.js.map +1 -1
  42. package/dist/index.d.ts +1 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/main.d.ts.map +1 -1
  46. package/dist/main.js +8 -3
  47. package/dist/main.js.map +1 -1
  48. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  49. package/dist/modes/interactive/components/footer.js +7 -1
  50. package/dist/modes/interactive/components/footer.js.map +1 -1
  51. package/dist/modes/interactive/interactive-mode.d.ts +0 -1
  52. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  53. package/dist/modes/interactive/interactive-mode.js +25 -23
  54. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  55. package/dist/package-manager-cli.d.ts.map +1 -1
  56. package/dist/package-manager-cli.js +33 -2
  57. package/dist/package-manager-cli.js.map +1 -1
  58. package/dist/utils/binary-self-update.d.ts +25 -0
  59. package/dist/utils/binary-self-update.d.ts.map +1 -0
  60. package/dist/utils/binary-self-update.js +159 -0
  61. package/dist/utils/binary-self-update.js.map +1 -0
  62. package/dist/utils/directory-completions.d.ts +8 -0
  63. package/dist/utils/directory-completions.d.ts.map +1 -1
  64. package/dist/utils/directory-completions.js +42 -1
  65. package/dist/utils/directory-completions.js.map +1 -1
  66. package/docs/extensions.md +31 -1
  67. package/docs/sandbox.md +2 -2
  68. package/docs/sessions.md +1 -1
  69. package/docs/skills.md +4 -4
  70. package/docs/usage.md +1 -1
  71. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  72. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  73. package/examples/extensions/sandbox/package.json +1 -1
  74. package/examples/extensions/with-deps/package.json +1 -1
  75. package/npm-shrinkwrap.json +12 -12
  76. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"instruction-resource-loader.js","sourceRoot":"","sources":["../../src/core/instruction-resource-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Dirent, existsSync, readdirSync, readFileSync, type Stats, statSync } from \"node:fs\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport ignore from \"ignore\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../config.ts\";\nimport { parseFrontmatter } from \"../utils/frontmatter.ts\";\nimport { canonicalizePath, resolvePath } from \"../utils/paths.ts\";\nimport type { ResourceCollision, ResourceDiagnostic } from \"./diagnostics.ts\";\nimport {\n\tdirnamePortablePath,\n\tjoinPortablePath,\n\tnormalizePortablePath,\n\ttype PortablePathFlavor,\n\tpathComparisonValue,\n\trelativePortablePath,\n\trelativeWithin,\n\tresolvePortablePath,\n} from \"./lsp/portable-path.ts\";\nimport { createSyntheticSourceInfo, type SourceInfo } from \"./source-info.ts\";\nimport type { ToolFileStat, ToolOperations } from \"./tools/operations.ts\";\n\nconst MAX_NAME_LENGTH = 64;\nconst MAX_DESCRIPTION_LENGTH = 1024;\nconst IGNORE_FILE_NAMES = [\".gitignore\", \".ignore\", \".fdignore\"];\n\ntype ConfiguredResourceSource = \"user\" | \"project\" | \"path\";\ntype ResourceSource = ConfiguredResourceSource | string;\n\nexport interface InstructionResourceFrontmatter {\n\tname?: string;\n\tdescription?: string;\n\ttools?: string | string[];\n\t\"disable-model-invocation\"?: boolean;\n\t[key: string]: unknown;\n}\n\nexport interface InstructionResource {\n\tname: string;\n\tdescription: string;\n\tfilePath: string;\n\tbaseDir: string;\n\tsourceInfo: SourceInfo;\n\tdisableModelInvocation: boolean;\n\ttools?: string[];\n\tcontent?: string;\n}\n\nexport interface InstructionResourceLoadResult<TResource extends InstructionResource> {\n\tresources: TResource[];\n\tdiagnostics: ResourceDiagnostic[];\n}\n\nexport interface InstructionResourceDirectoryOptions {\n\t/** Directory to scan for instruction resources. */\n\tdir: string;\n\t/** Source identifier for these instruction resources. */\n\tsource: string;\n}\ninterface LocalResourceTraversal<TResource extends InstructionResource> {\n\tentries: Dirent[];\n\tdir: string;\n\tsource: string;\n\tincludeRootFiles: boolean;\n\tignoreMatcher: ignore.Ignore;\n\trootDir: string;\n\tresources: TResource[];\n\tdiagnostics: ResourceDiagnostic[];\n}\n\ninterface BackendResourceTraversal<TResource extends InstructionResource> {\n\tentries: string[];\n\toperations: ToolOperations;\n\tdir: string;\n\tsource: string;\n\tincludeRootFiles: boolean;\n\tignoreMatcher: ignore.Ignore;\n\trootDir: string;\n\tresources: TResource[];\n\tdiagnostics: ResourceDiagnostic[];\n}\n\ninterface InstructionResourceParseResult<TResource extends InstructionResource> {\n\tresource: TResource | null;\n\tdiagnostics: ResourceDiagnostic[];\n}\n\ninterface InstructionResourcePromptFormatOptions {\n\tintro: string[];\n\tcontainerTag: string;\n\titemTag: string;\n}\n\nexport interface InstructionResourceLoaderOptions {\n\tcwd: string;\n\tagentDir: string;\n\tresourcePaths: string[];\n\tincludeDefaults: boolean;\n}\n\nexport interface InstructionResourceLoaderWithOperationsOptions extends InstructionResourceLoaderOptions {\n\toperations: ToolOperations;\n}\n\nexport interface InstructionResourceLoaderConfig {\n\tresourceType: ResourceCollision[\"resourceType\"];\n\tdefaultDirectoryName: string;\n\trootFileName: string;\n}\n\nfunction toPosixPath(path: string): string {\n\treturn path.split(sep).join(\"/\");\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n\tconst trimmed = line.trim();\n\tif (!trimmed) return null;\n\tif (trimmed.startsWith(\"#\") && !trimmed.startsWith(\"\\\\#\")) return null;\n\n\tlet pattern = line;\n\tlet negated = false;\n\tif (pattern.startsWith(\"!\")) {\n\t\tnegated = true;\n\t\tpattern = pattern.slice(1);\n\t} else if (pattern.startsWith(\"\\\\!\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\tif (pattern.startsWith(\"/\")) pattern = pattern.slice(1);\n\n\tconst prefixed = prefix ? `${prefix}${pattern}` : pattern;\n\treturn negated ? `!${prefixed}` : prefixed;\n}\n\nfunction validateName(name: string): string[] {\n\tconst errors: string[] = [];\n\tif (name.length > MAX_NAME_LENGTH) {\n\t\terrors.push(`name exceeds ${MAX_NAME_LENGTH} characters (${name.length})`);\n\t}\n\tif (!/^[a-z0-9-]+$/.test(name)) {\n\t\terrors.push(\"name contains invalid characters (must be lowercase a-z, 0-9, hyphens only)\");\n\t}\n\tif (name.startsWith(\"-\") || name.endsWith(\"-\")) {\n\t\terrors.push(\"name must not start or end with a hyphen\");\n\t}\n\tif (name.includes(\"--\")) {\n\t\terrors.push(\"name must not contain consecutive hyphens\");\n\t}\n\treturn errors;\n}\n\nfunction validateDescription(description: string | undefined): string[] {\n\tif (!description || description.trim() === \"\") return [\"description is required\"];\n\tif (description.length > MAX_DESCRIPTION_LENGTH) {\n\t\treturn [`description exceeds ${MAX_DESCRIPTION_LENGTH} characters (${description.length})`];\n\t}\n\treturn [];\n}\n\nfunction normalizeFrontmatterTools(value: unknown): string[] {\n\tconst raw = Array.isArray(value) ? value : typeof value === \"string\" ? value.split(/[\\s,]+/) : [];\n\tconst tools: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const entry of raw) {\n\t\tif (typeof entry !== \"string\") continue;\n\t\tconst trimmed = entry.trim();\n\t\tif (trimmed.length > 0 && !seen.has(trimmed)) {\n\t\t\tseen.add(trimmed);\n\t\t\ttools.push(trimmed);\n\t\t}\n\t}\n\treturn tools;\n}\n\nfunction createResourceSourceInfo(filePath: string, baseDir: string, source: ResourceSource): SourceInfo {\n\tswitch (source) {\n\t\tcase \"user\":\n\t\t\treturn createSyntheticSourceInfo(filePath, { source: \"local\", scope: \"user\", baseDir });\n\t\tcase \"project\":\n\t\t\treturn createSyntheticSourceInfo(filePath, { source: \"local\", scope: \"project\", baseDir });\n\t\tcase \"path\":\n\t\t\treturn createSyntheticSourceInfo(filePath, { source: \"local\", baseDir });\n\t\tdefault:\n\t\t\treturn createSyntheticSourceInfo(filePath, { source, baseDir });\n\t}\n}\n\nfunction isUnderPath(target: string, root: string): boolean {\n\tconst normalizedRoot = resolve(root);\n\tif (target === normalizedRoot) return true;\n\tconst prefix = normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`;\n\treturn target.startsWith(prefix);\n}\n\nasync function backendPathExists(operations: ToolOperations, path: string): Promise<boolean> {\n\ttry {\n\t\tawait operations.access(path, \"exists\");\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport abstract class InstructionResourceLoader<\n\tTResource extends InstructionResource,\n\tTFrontmatter extends InstructionResourceFrontmatter,\n> {\n\tprivate resourceType: ResourceCollision[\"resourceType\"];\n\tprivate defaultDirectoryName: string;\n\tprivate rootFileName: string;\n\n\tconstructor(config: InstructionResourceLoaderConfig) {\n\t\tthis.resourceType = config.resourceType;\n\t\tthis.defaultDirectoryName = config.defaultDirectoryName;\n\t\tthis.rootFileName = config.rootFileName;\n\t}\n\n\tprotected abstract createResource(resource: InstructionResource, frontmatter: TFrontmatter): TResource;\n\n\tprotected loadResourcesFromDir(dir: string, source: string): InstructionResourceLoadResult<TResource> {\n\t\treturn this.loadResourcesFromDirInternal(dir, source, true);\n\t}\n\n\tprivate loadResourcesFromConfiguredPath(\n\t\tresolvedPath: string,\n\t\tsource: ConfiguredResourceSource,\n\t): InstructionResourceLoadResult<TResource> {\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\treturn {\n\t\t\t\tresources: [],\n\t\t\t\tdiagnostics: [{ type: \"warning\", message: `${this.resourceType} path does not exist`, path: resolvedPath }],\n\t\t\t};\n\t\t}\n\t\ttry {\n\t\t\tconst stats = statSync(resolvedPath);\n\t\t\tif (stats.isDirectory()) return this.loadResourcesFromDirInternal(resolvedPath, source, true);\n\t\t\tif (!stats.isFile() || !resolvedPath.endsWith(\".md\")) {\n\t\t\t\treturn {\n\t\t\t\t\tresources: [],\n\t\t\t\t\tdiagnostics: [\n\t\t\t\t\t\t{ type: \"warning\", message: `${this.resourceType} path is not a markdown file`, path: resolvedPath },\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst result = this.loadResourceFromFile(resolvedPath, source);\n\t\t\treturn { resources: result.resource ? [result.resource] : [], diagnostics: result.diagnostics };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tresources: [],\n\t\t\t\tdiagnostics: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : `failed to read ${this.resourceType} path`,\n\t\t\t\t\t\tpath: resolvedPath,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t}\n\n\tprotected loadResources(options: InstructionResourceLoaderOptions): InstructionResourceLoadResult<TResource> {\n\t\tconst resolvedCwd = resolvePath(options.cwd);\n\t\tconst resolvedAgentDir = resolvePath(options.agentDir ?? getAgentDir());\n\t\tconst resourceMap = new Map<string, TResource>();\n\t\tconst realPathSet = new Set<string>();\n\t\tconst allDiagnostics: ResourceDiagnostic[] = [];\n\t\tconst collisionDiagnostics: ResourceDiagnostic[] = [];\n\n\t\tconst addResources = (result: InstructionResourceLoadResult<TResource>): void => {\n\t\t\tallDiagnostics.push(...result.diagnostics);\n\t\t\tfor (const resource of result.resources) {\n\t\t\t\tconst realPath = canonicalizePath(resource.filePath);\n\t\t\t\tif (realPathSet.has(realPath)) continue;\n\t\t\t\tconst existing = resourceMap.get(resource.name);\n\t\t\t\tif (existing) {\n\t\t\t\t\tcollisionDiagnostics.push(this.createCollisionDiagnostic(resource, existing));\n\t\t\t\t} else {\n\t\t\t\t\tresourceMap.set(resource.name, resource);\n\t\t\t\t\trealPathSet.add(realPath);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (options.includeDefaults) {\n\t\t\taddResources(\n\t\t\t\tthis.loadResourcesFromDirInternal(join(resolvedAgentDir, this.defaultDirectoryName), \"user\", true),\n\t\t\t);\n\t\t\taddResources(\n\t\t\t\tthis.loadResourcesFromDirInternal(\n\t\t\t\t\tresolve(resolvedCwd, CONFIG_DIR_NAME, this.defaultDirectoryName),\n\t\t\t\t\t\"project\",\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tconst userDir = join(resolvedAgentDir, this.defaultDirectoryName);\n\t\tconst projectDir = resolve(resolvedCwd, CONFIG_DIR_NAME, this.defaultDirectoryName);\n\t\tconst getSource = (resolvedPath: string): ConfiguredResourceSource => {\n\t\t\tif (!options.includeDefaults) {\n\t\t\t\tif (isUnderPath(resolvedPath, userDir)) return \"user\";\n\t\t\t\tif (isUnderPath(resolvedPath, projectDir)) return \"project\";\n\t\t\t}\n\t\t\treturn \"path\";\n\t\t};\n\n\t\tfor (const rawPath of options.resourcePaths) {\n\t\t\tconst resolvedPath = resolvePath(rawPath, resolvedCwd, { trim: true });\n\t\t\taddResources(this.loadResourcesFromConfiguredPath(resolvedPath, getSource(resolvedPath)));\n\t\t}\n\n\t\treturn {\n\t\t\tresources: Array.from(resourceMap.values()),\n\t\t\tdiagnostics: [...allDiagnostics, ...collisionDiagnostics],\n\t\t};\n\t}\n\n\tprivate async loadResourcesFromConfiguredPathWithOperations(\n\t\toperations: ToolOperations,\n\t\tresolvedPath: string,\n\t\tsource: ConfiguredResourceSource,\n\t): Promise<InstructionResourceLoadResult<TResource>> {\n\t\tif (!(await backendPathExists(operations, resolvedPath))) {\n\t\t\treturn {\n\t\t\t\tresources: [],\n\t\t\t\tdiagnostics: [{ type: \"warning\", message: `${this.resourceType} path does not exist`, path: resolvedPath }],\n\t\t\t};\n\t\t}\n\t\ttry {\n\t\t\tconst stats = await operations.stat(resolvedPath);\n\t\t\tif (stats.isDirectory()) {\n\t\t\t\treturn this.loadResourcesFromDirInternalWithOperations(operations, resolvedPath, source, true);\n\t\t\t}\n\t\t\tif (!stats.isFile() || !resolvedPath.endsWith(\".md\")) {\n\t\t\t\treturn {\n\t\t\t\t\tresources: [],\n\t\t\t\t\tdiagnostics: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\t\t\tmessage: `${this.resourceType} path is not a markdown file`,\n\t\t\t\t\t\t\tpath: resolvedPath,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst result = await this.loadResourceFromFileWithOperations(operations, resolvedPath, source);\n\t\t\treturn { resources: result.resource ? [result.resource] : [], diagnostics: result.diagnostics };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tresources: [],\n\t\t\t\tdiagnostics: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : `failed to read ${this.resourceType} path`,\n\t\t\t\t\t\tpath: resolvedPath,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t}\n\n\tprotected async loadResourcesWithOperations(\n\t\toptions: InstructionResourceLoaderWithOperationsOptions,\n\t): Promise<InstructionResourceLoadResult<TResource>> {\n\t\tconst backend = options.operations.getBackendInfo?.();\n\t\tconst pathFlavor = backend?.type === \"remote\" && backend.configured ? backend.workspace.pathFlavor : undefined;\n\t\tconst resolvedCwd = resolvePortablePath(options.operations.cwd, options.cwd);\n\t\tconst resolvedAgentDir = normalizePortablePath(options.agentDir ?? getAgentDir(), pathFlavor);\n\t\tconst resourceMap = new Map<string, TResource>();\n\t\tconst pathSet = new Set<string>();\n\t\tconst allDiagnostics: ResourceDiagnostic[] = [];\n\t\tconst collisionDiagnostics: ResourceDiagnostic[] = [];\n\n\t\tconst addResources = (result: InstructionResourceLoadResult<TResource>): void => {\n\t\t\tallDiagnostics.push(...result.diagnostics);\n\t\t\tfor (const resource of result.resources) {\n\t\t\t\tconst canonicalPath = pathComparisonValue(resource.filePath, pathFlavor);\n\t\t\t\tif (pathSet.has(canonicalPath)) continue;\n\t\t\t\tconst existing = resourceMap.get(resource.name);\n\t\t\t\tif (existing) {\n\t\t\t\t\tcollisionDiagnostics.push(this.createCollisionDiagnostic(resource, existing));\n\t\t\t\t} else {\n\t\t\t\t\tresourceMap.set(resource.name, resource);\n\t\t\t\t\tpathSet.add(canonicalPath);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (options.includeDefaults) {\n\t\t\taddResources(\n\t\t\t\tawait this.loadResourcesFromDirInternalWithOperations(\n\t\t\t\t\toptions.operations,\n\t\t\t\t\tjoinPortablePath(resolvedAgentDir, this.defaultDirectoryName),\n\t\t\t\t\t\"user\",\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t);\n\t\t\taddResources(\n\t\t\t\tawait this.loadResourcesFromDirInternalWithOperations(\n\t\t\t\t\toptions.operations,\n\t\t\t\t\tjoinPortablePath(resolvedCwd, CONFIG_DIR_NAME, this.defaultDirectoryName),\n\t\t\t\t\t\"project\",\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tconst userDir = joinPortablePath(resolvedAgentDir, this.defaultDirectoryName);\n\t\tconst projectDir = joinPortablePath(resolvedCwd, CONFIG_DIR_NAME, this.defaultDirectoryName);\n\t\tconst getSource = (resolvedPath: string): ConfiguredResourceSource => {\n\t\t\tif (!options.includeDefaults) {\n\t\t\t\tif (relativeWithin(userDir, resolvedPath) !== undefined) return \"user\";\n\t\t\t\tif (relativeWithin(projectDir, resolvedPath) !== undefined) return \"project\";\n\t\t\t}\n\t\t\treturn \"path\";\n\t\t};\n\n\t\tfor (const rawPath of options.resourcePaths) {\n\t\t\tconst resolvedPath = resolvePortablePath(resolvedCwd, rawPath.trim());\n\t\t\taddResources(\n\t\t\t\tawait this.loadResourcesFromConfiguredPathWithOperations(\n\t\t\t\t\toptions.operations,\n\t\t\t\t\tresolvedPath,\n\t\t\t\t\tgetSource(resolvedPath),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tresources: Array.from(resourceMap.values()),\n\t\t\tdiagnostics: [...allDiagnostics, ...collisionDiagnostics],\n\t\t};\n\t}\n\n\tprivate createCollisionDiagnostic(resource: TResource, existing: TResource): ResourceDiagnostic {\n\t\treturn {\n\t\t\ttype: \"collision\",\n\t\t\tmessage: `name \"${resource.name}\" collision`,\n\t\t\tpath: resource.filePath,\n\t\t\tcollision: {\n\t\t\t\tresourceType: this.resourceType,\n\t\t\t\tname: resource.name,\n\t\t\t\twinnerPath: existing.filePath,\n\t\t\t\tloserPath: resource.filePath,\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate addIgnoreRules(ig: ignore.Ignore, dir: string, rootDir: string): void {\n\t\tconst relativeDir = relative(rootDir, dir);\n\t\tconst prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : \"\";\n\t\tfor (const filename of IGNORE_FILE_NAMES) {\n\t\t\tconst ignorePath = join(dir, filename);\n\t\t\tif (!existsSync(ignorePath)) continue;\n\t\t\ttry {\n\t\t\t\tconst patterns = readFileSync(ignorePath, \"utf-8\")\n\t\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t\t.map((line) => prefixIgnorePattern(line, prefix))\n\t\t\t\t\t.filter((line): line is string => Boolean(line));\n\t\t\t\tif (patterns.length > 0) ig.add(patterns);\n\t\t\t} catch {}\n\t\t}\n\t}\n\n\tprivate async addIgnoreRulesWithOperations(\n\t\toperations: ToolOperations,\n\t\tig: ignore.Ignore,\n\t\tdir: string,\n\t\trootDir: string,\n\t): Promise<void> {\n\t\tconst relativeDir = relativePortablePath(rootDir, dir);\n\t\tconst prefix = relativeDir && relativeDir !== \".\" ? `${relativeDir.replace(/\\\\/g, \"/\")}/` : \"\";\n\t\tfor (const filename of IGNORE_FILE_NAMES) {\n\t\t\tconst ignorePath = joinPortablePath(dir, filename);\n\t\t\tif (!(await backendPathExists(operations, ignorePath))) continue;\n\t\t\ttry {\n\t\t\t\tconst patterns = (await operations.readFile(ignorePath))\n\t\t\t\t\t.toString(\"utf-8\")\n\t\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t\t.map((line) => prefixIgnorePattern(line, prefix))\n\t\t\t\t\t.filter((line): line is string => Boolean(line));\n\t\t\t\tif (patterns.length > 0) ig.add(patterns);\n\t\t\t} catch {}\n\t\t}\n\t}\n\n\tprivate getLocalResourceEntry(entry: Dirent, fullPath: string): Dirent | Stats | undefined {\n\t\tif (!entry.isSymbolicLink()) return entry;\n\t\ttry {\n\t\t\treturn statSync(fullPath);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate loadRootResourceFromEntries(\n\t\tentries: Dirent[],\n\t\tdir: string,\n\t\tsource: string,\n\t\tignoreMatcher: ignore.Ignore,\n\t\trootDir: string,\n\t): InstructionResourceLoadResult<TResource> | undefined {\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.name !== this.rootFileName) continue;\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tconst resourceEntry = this.getLocalResourceEntry(entry, fullPath);\n\t\t\tif (!resourceEntry?.isFile() || ignoreMatcher.ignores(toPosixPath(relative(rootDir, fullPath)))) continue;\n\t\t\tconst result = this.loadResourceFromFile(fullPath, source);\n\t\t\treturn { resources: result.resource ? [result.resource] : [], diagnostics: result.diagnostics };\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate loadNestedResourceEntry(entry: Dirent, context: LocalResourceTraversal<TResource>): void {\n\t\tif (entry.name.startsWith(\".\") || entry.name === \"node_modules\") return;\n\t\tconst fullPath = join(context.dir, entry.name);\n\t\tconst resourceEntry = this.getLocalResourceEntry(entry, fullPath);\n\t\tif (!resourceEntry) return;\n\t\tconst relativePath = toPosixPath(relative(context.rootDir, fullPath));\n\t\tif (context.ignoreMatcher.ignores(resourceEntry.isDirectory() ? `${relativePath}/` : relativePath)) return;\n\t\tif (resourceEntry.isDirectory()) {\n\t\t\tconst nested = this.loadResourcesFromDirInternal(\n\t\t\t\tfullPath,\n\t\t\t\tcontext.source,\n\t\t\t\tfalse,\n\t\t\t\tcontext.ignoreMatcher,\n\t\t\t\tcontext.rootDir,\n\t\t\t);\n\t\t\tcontext.resources.push(...nested.resources);\n\t\t\tcontext.diagnostics.push(...nested.diagnostics);\n\t\t\treturn;\n\t\t}\n\t\tif (!resourceEntry.isFile() || !context.includeRootFiles || !entry.name.endsWith(\".md\")) return;\n\t\tconst result = this.loadResourceFromFile(fullPath, context.source);\n\t\tif (result.resource) context.resources.push(result.resource);\n\t\tcontext.diagnostics.push(...result.diagnostics);\n\t}\n\n\tprivate loadNestedResourcesFromEntries(context: LocalResourceTraversal<TResource>): void {\n\t\tfor (const entry of context.entries) this.loadNestedResourceEntry(entry, context);\n\t}\n\n\tprivate loadResourcesFromDirInternal(\n\t\tdir: string,\n\t\tsource: string,\n\t\tincludeRootFiles: boolean,\n\t\tignoreMatcher?: ignore.Ignore,\n\t\trootDir?: string,\n\t): InstructionResourceLoadResult<TResource> {\n\t\tconst resources: TResource[] = [];\n\t\tconst diagnostics: ResourceDiagnostic[] = [];\n\t\tif (!existsSync(dir)) return { resources, diagnostics };\n\n\t\tconst root = rootDir ?? dir;\n\t\tconst ig = ignoreMatcher ?? ignore();\n\t\tthis.addIgnoreRules(ig, dir, root);\n\t\ttry {\n\t\t\tconst entries = readdirSync(dir, { withFileTypes: true });\n\t\t\tconst rootResource = this.loadRootResourceFromEntries(entries, dir, source, ig, root);\n\t\t\tif (rootResource) return rootResource;\n\t\t\tthis.loadNestedResourcesFromEntries({\n\t\t\t\tentries,\n\t\t\t\tdir,\n\t\t\t\tsource,\n\t\t\t\tincludeRootFiles,\n\t\t\t\tignoreMatcher: ig,\n\t\t\t\trootDir: root,\n\t\t\t\tresources,\n\t\t\t\tdiagnostics,\n\t\t\t});\n\t\t} catch {}\n\t\treturn { resources, diagnostics };\n\t}\n\n\tprivate async getBackendResourceEntry(\n\t\toperations: ToolOperations,\n\t\tfullPath: string,\n\t): Promise<ToolFileStat | undefined> {\n\t\ttry {\n\t\t\treturn await operations.stat(fullPath);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate async loadRootResourceWithOperations(\n\t\tcontext: BackendResourceTraversal<TResource>,\n\t): Promise<InstructionResourceLoadResult<TResource> | undefined> {\n\t\tfor (const name of context.entries) {\n\t\t\tif (name !== this.rootFileName) continue;\n\t\t\tconst fullPath = joinPortablePath(context.dir, name);\n\t\t\tconst resourceEntry = await this.getBackendResourceEntry(context.operations, fullPath);\n\t\t\tif (\n\t\t\t\t!resourceEntry?.isFile() ||\n\t\t\t\tcontext.ignoreMatcher.ignores(relativePortablePath(context.rootDir, fullPath).replace(/\\\\/g, \"/\"))\n\t\t\t)\n\t\t\t\tcontinue;\n\t\t\tconst result = await this.loadResourceFromFileWithOperations(context.operations, fullPath, context.source);\n\t\t\treturn { resources: result.resource ? [result.resource] : [], diagnostics: result.diagnostics };\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async loadNestedResourceWithOperations(\n\t\tname: string,\n\t\tcontext: BackendResourceTraversal<TResource>,\n\t): Promise<void> {\n\t\tif (name.startsWith(\".\") || name === \"node_modules\") return;\n\t\tconst fullPath = joinPortablePath(context.dir, name);\n\t\tconst resourceEntry = await this.getBackendResourceEntry(context.operations, fullPath);\n\t\tif (!resourceEntry) return;\n\t\tconst relativePath = relativePortablePath(context.rootDir, fullPath).replace(/\\\\/g, \"/\");\n\t\tif (context.ignoreMatcher.ignores(resourceEntry.isDirectory() ? `${relativePath}/` : relativePath)) return;\n\t\tif (resourceEntry.isDirectory()) {\n\t\t\tconst nested = await this.loadResourcesFromDirInternalWithOperations(\n\t\t\t\tcontext.operations,\n\t\t\t\tfullPath,\n\t\t\t\tcontext.source,\n\t\t\t\tfalse,\n\t\t\t\tcontext.ignoreMatcher,\n\t\t\t\tcontext.rootDir,\n\t\t\t);\n\t\t\tcontext.resources.push(...nested.resources);\n\t\t\tcontext.diagnostics.push(...nested.diagnostics);\n\t\t\treturn;\n\t\t}\n\t\tif (!resourceEntry.isFile() || !context.includeRootFiles || !name.endsWith(\".md\")) return;\n\t\tconst result = await this.loadResourceFromFileWithOperations(context.operations, fullPath, context.source);\n\t\tif (result.resource) context.resources.push(result.resource);\n\t\tcontext.diagnostics.push(...result.diagnostics);\n\t}\n\n\tprivate async loadNestedResourcesWithOperations(context: BackendResourceTraversal<TResource>): Promise<void> {\n\t\tfor (const name of context.entries) await this.loadNestedResourceWithOperations(name, context);\n\t}\n\n\tprivate async loadResourcesFromDirInternalWithOperations(\n\t\toperations: ToolOperations,\n\t\tdir: string,\n\t\tsource: string,\n\t\tincludeRootFiles: boolean,\n\t\tignoreMatcher?: ignore.Ignore,\n\t\trootDir?: string,\n\t): Promise<InstructionResourceLoadResult<TResource>> {\n\t\tconst resources: TResource[] = [];\n\t\tconst diagnostics: ResourceDiagnostic[] = [];\n\t\tif (!(await backendPathExists(operations, dir))) return { resources, diagnostics };\n\n\t\tconst root = rootDir ?? dir;\n\t\tconst ig = ignoreMatcher ?? ignore();\n\t\tawait this.addIgnoreRulesWithOperations(operations, ig, dir, root);\n\t\ttry {\n\t\t\tconst context: BackendResourceTraversal<TResource> = {\n\t\t\t\tentries: await operations.readdir(dir),\n\t\t\t\toperations,\n\t\t\t\tdir,\n\t\t\t\tsource,\n\t\t\t\tincludeRootFiles,\n\t\t\t\tignoreMatcher: ig,\n\t\t\t\trootDir: root,\n\t\t\t\tresources,\n\t\t\t\tdiagnostics,\n\t\t\t};\n\t\t\tconst rootResource = await this.loadRootResourceWithOperations(context);\n\t\t\tif (rootResource) return rootResource;\n\t\t\tawait this.loadNestedResourcesWithOperations(context);\n\t\t} catch {}\n\t\treturn { resources, diagnostics };\n\t}\n\n\tprivate loadResourceFromFile(filePath: string, source: string): InstructionResourceParseResult<TResource> {\n\t\ttry {\n\t\t\treturn this.parseResource(readFileSync(filePath, \"utf-8\"), filePath, source);\n\t\t} catch (error) {\n\t\t\treturn this.createParseError(error, filePath);\n\t\t}\n\t}\n\n\tprivate async loadResourceFromFileWithOperations(\n\t\toperations: ToolOperations,\n\t\tfilePath: string,\n\t\tsource: string,\n\t): Promise<InstructionResourceParseResult<TResource>> {\n\t\ttry {\n\t\t\tconst backend = operations.getBackendInfo?.();\n\t\t\tconst pathFlavor = backend?.type === \"remote\" && backend.configured ? backend.workspace.pathFlavor : undefined;\n\t\t\treturn this.parseResource(\n\t\t\t\t(await operations.readFile(filePath)).toString(\"utf-8\"),\n\t\t\t\tfilePath,\n\t\t\t\tsource,\n\t\t\t\tpathFlavor,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treturn this.createParseError(error, filePath);\n\t\t}\n\t}\n\n\tprivate parseResource(\n\t\trawContent: string,\n\t\tfilePath: string,\n\t\tsource: string,\n\t\tpathFlavor?: PortablePathFlavor,\n\t): InstructionResourceParseResult<TResource> {\n\t\tconst diagnostics: ResourceDiagnostic[] = [];\n\t\tconst { frontmatter } = parseFrontmatter<TFrontmatter>(rawContent);\n\t\tfor (const error of validateDescription(frontmatter.description)) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: error, path: filePath });\n\t\t}\n\t\tif (!frontmatter.name || frontmatter.name.trim() === \"\") {\n\t\t\tdiagnostics.push({ type: \"warning\", message: \"name is required\", path: filePath });\n\t\t}\n\t\tconst name = frontmatter.name;\n\t\tif (name) {\n\t\t\tfor (const error of validateName(name)) {\n\t\t\t\tdiagnostics.push({ type: \"warning\", message: error, path: filePath });\n\t\t\t}\n\t\t}\n\t\tif (!name || !frontmatter.description || frontmatter.description.trim() === \"\") {\n\t\t\treturn { resource: null, diagnostics };\n\t\t}\n\t\tconst baseDir = pathFlavor ? dirnamePortablePath(filePath, pathFlavor) : dirname(filePath);\n\t\tconst resource: InstructionResource = {\n\t\t\tname,\n\t\t\tdescription: frontmatter.description,\n\t\t\tfilePath,\n\t\t\tbaseDir,\n\t\t\tsourceInfo: createResourceSourceInfo(filePath, baseDir, source),\n\t\t\tdisableModelInvocation: frontmatter[\"disable-model-invocation\"] === true,\n\t\t\ttools: normalizeFrontmatterTools(frontmatter.tools),\n\t\t};\n\t\treturn { resource: this.createResource(resource, frontmatter), diagnostics };\n\t}\n\n\tprivate createParseError(error: unknown, filePath: string): InstructionResourceParseResult<TResource> {\n\t\treturn {\n\t\t\tresource: null,\n\t\t\tdiagnostics: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\tmessage: error instanceof Error ? error.message : `failed to parse ${this.resourceType} file`,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n}\n\nexport function formatInstructionResourcesForPrompt(\n\tresources: InstructionResource[],\n\toptions: InstructionResourcePromptFormatOptions,\n): string {\n\tconst visibleResources = resources.filter((resource) => !resource.disableModelInvocation);\n\tif (visibleResources.length === 0) return \"\";\n\n\tconst [firstIntroLine = \"\", ...remainingIntroLines] = options.intro;\n\tconst lines = [`\\n\\n${firstIntroLine}`, ...remainingIntroLines, \"\", `<${options.containerTag}>`];\n\tfor (const resource of visibleResources) {\n\t\tlines.push(` <${options.itemTag}>`);\n\t\tlines.push(` <name>${escapeXml(resource.name)}</name>`);\n\t\tlines.push(` <description>${escapeXml(resource.description)}</description>`);\n\t\tlines.push(` <location>${escapeXml(resource.filePath)}</location>`);\n\t\tlines.push(` </${options.itemTag}>`);\n\t}\n\tlines.push(`</${options.containerTag}>`);\n\treturn lines.join(\"\\n\");\n}\n\nfunction escapeXml(value: string): string {\n\treturn value\n\t\t.replace(/&/g, \"&amp;\")\n\t\t.replace(/</g, \"&lt;\")\n\t\t.replace(/>/g, \"&gt;\")\n\t\t.replace(/\"/g, \"&quot;\")\n\t\t.replace(/'/g, \"&apos;\");\n}\n"]}
1
+ {"version":3,"file":"instruction-resource-loader.js","sourceRoot":"","sources":["../../src/core/instruction-resource-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Dirent, existsSync, readdirSync, readFileSync, type Stats, statSync } from \"node:fs\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport ignore from \"ignore\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../config.ts\";\nimport { parseFrontmatter } from \"../utils/frontmatter.ts\";\nimport { canonicalizePath, resolvePath } from \"../utils/paths.ts\";\nimport type { ResourceCollision, ResourceDiagnostic } from \"./diagnostics.ts\";\nimport {\n\tdirnamePortablePath,\n\tjoinPortablePath,\n\tnormalizePortablePath,\n\ttype PortablePathFlavor,\n\tpathComparisonValue,\n\trelativePortablePath,\n\trelativeWithin,\n\tresolvePortablePath,\n} from \"./lsp/portable-path.ts\";\nimport { createSyntheticSourceInfo, type SourceInfo } from \"./source-info.ts\";\nimport type { ToolFileStat, ToolOperations } from \"./tools/operations.ts\";\n\nconst MAX_NAME_LENGTH = 64;\nconst MAX_DESCRIPTION_LENGTH = 1024;\nconst IGNORE_FILE_NAMES = [\".gitignore\", \".ignore\", \".fdignore\"];\n\ntype ConfiguredResourceSource = \"user\" | \"project\" | \"path\";\ntype ResourceSource = ConfiguredResourceSource | string;\n\nexport interface InstructionResourceFrontmatter {\n\tname?: string;\n\tdescription?: string;\n\ttools?: string | string[];\n\t\"disable-model-invocation\"?: boolean;\n\t[key: string]: unknown;\n}\n\nexport interface InstructionResource {\n\tname: string;\n\tdescription: string;\n\tfilePath: string;\n\tbaseDir: string;\n\tsourceInfo: SourceInfo;\n\tdisableModelInvocation: boolean;\n\ttools?: string[];\n\tcontent?: string;\n}\n\nexport interface InstructionResourceLoadResult<TResource extends InstructionResource> {\n\tresources: TResource[];\n\tdiagnostics: ResourceDiagnostic[];\n}\n\nexport interface InstructionResourceDirectoryOptions {\n\t/** Directory to scan for instruction resources. */\n\tdir: string;\n\t/** Source identifier for these instruction resources. */\n\tsource: string;\n}\ninterface LocalResourceTraversal<TResource extends InstructionResource> {\n\tentries: Dirent[];\n\tdir: string;\n\tsource: string;\n\tincludeRootFiles: boolean;\n\tignoreMatcher: ignore.Ignore;\n\trootDir: string;\n\tresources: TResource[];\n\tdiagnostics: ResourceDiagnostic[];\n}\n\ninterface BackendResourceTraversal<TResource extends InstructionResource> {\n\tentries: string[];\n\toperations: ToolOperations;\n\tdir: string;\n\tsource: string;\n\tincludeRootFiles: boolean;\n\tignoreMatcher: ignore.Ignore;\n\trootDir: string;\n\tresources: TResource[];\n\tdiagnostics: ResourceDiagnostic[];\n}\n\ninterface InstructionResourceParseResult<TResource extends InstructionResource> {\n\tresource: TResource | null;\n\tdiagnostics: ResourceDiagnostic[];\n}\n\ninterface InstructionResourcePromptFormatOptions {\n\tintro: string[];\n\tcontainerTag: string;\n\titemTag: string;\n\tincludeLocation?: boolean;\n}\n\nexport interface InstructionResourceLoaderOptions {\n\tcwd: string;\n\tagentDir: string;\n\tresourcePaths: string[];\n\tincludeDefaults: boolean;\n}\n\nexport interface InstructionResourceLoaderWithOperationsOptions extends InstructionResourceLoaderOptions {\n\toperations: ToolOperations;\n}\n\nexport interface InstructionResourceLoaderConfig {\n\tresourceType: ResourceCollision[\"resourceType\"];\n\tdefaultDirectoryName: string;\n\trootFileName: string;\n}\n\nfunction toPosixPath(path: string): string {\n\treturn path.split(sep).join(\"/\");\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n\tconst trimmed = line.trim();\n\tif (!trimmed) return null;\n\tif (trimmed.startsWith(\"#\") && !trimmed.startsWith(\"\\\\#\")) return null;\n\n\tlet pattern = line;\n\tlet negated = false;\n\tif (pattern.startsWith(\"!\")) {\n\t\tnegated = true;\n\t\tpattern = pattern.slice(1);\n\t} else if (pattern.startsWith(\"\\\\!\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\tif (pattern.startsWith(\"/\")) pattern = pattern.slice(1);\n\n\tconst prefixed = prefix ? `${prefix}${pattern}` : pattern;\n\treturn negated ? `!${prefixed}` : prefixed;\n}\n\nfunction validateName(name: string): string[] {\n\tconst errors: string[] = [];\n\tif (name.length > MAX_NAME_LENGTH) {\n\t\terrors.push(`name exceeds ${MAX_NAME_LENGTH} characters (${name.length})`);\n\t}\n\tif (!/^[a-z0-9-]+$/.test(name)) {\n\t\terrors.push(\"name contains invalid characters (must be lowercase a-z, 0-9, hyphens only)\");\n\t}\n\tif (name.startsWith(\"-\") || name.endsWith(\"-\")) {\n\t\terrors.push(\"name must not start or end with a hyphen\");\n\t}\n\tif (name.includes(\"--\")) {\n\t\terrors.push(\"name must not contain consecutive hyphens\");\n\t}\n\treturn errors;\n}\n\nfunction validateDescription(description: string | undefined): string[] {\n\tif (!description || description.trim() === \"\") return [\"description is required\"];\n\tif (description.length > MAX_DESCRIPTION_LENGTH) {\n\t\treturn [`description exceeds ${MAX_DESCRIPTION_LENGTH} characters (${description.length})`];\n\t}\n\treturn [];\n}\n\nfunction normalizeFrontmatterTools(value: unknown): string[] {\n\tconst raw = Array.isArray(value) ? value : typeof value === \"string\" ? value.split(/[\\s,]+/) : [];\n\tconst tools: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const entry of raw) {\n\t\tif (typeof entry !== \"string\") continue;\n\t\tconst trimmed = entry.trim();\n\t\tif (trimmed.length > 0 && !seen.has(trimmed)) {\n\t\t\tseen.add(trimmed);\n\t\t\ttools.push(trimmed);\n\t\t}\n\t}\n\treturn tools;\n}\n\nfunction createResourceSourceInfo(filePath: string, baseDir: string, source: ResourceSource): SourceInfo {\n\tswitch (source) {\n\t\tcase \"user\":\n\t\t\treturn createSyntheticSourceInfo(filePath, { source: \"local\", scope: \"user\", baseDir });\n\t\tcase \"project\":\n\t\t\treturn createSyntheticSourceInfo(filePath, { source: \"local\", scope: \"project\", baseDir });\n\t\tcase \"path\":\n\t\t\treturn createSyntheticSourceInfo(filePath, { source: \"local\", baseDir });\n\t\tdefault:\n\t\t\treturn createSyntheticSourceInfo(filePath, { source, baseDir });\n\t}\n}\n\nfunction isUnderPath(target: string, root: string): boolean {\n\tconst normalizedRoot = resolve(root);\n\tif (target === normalizedRoot) return true;\n\tconst prefix = normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`;\n\treturn target.startsWith(prefix);\n}\n\nasync function backendPathExists(operations: ToolOperations, path: string): Promise<boolean> {\n\ttry {\n\t\tawait operations.access(path, \"exists\");\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport abstract class InstructionResourceLoader<\n\tTResource extends InstructionResource,\n\tTFrontmatter extends InstructionResourceFrontmatter,\n> {\n\tprivate resourceType: ResourceCollision[\"resourceType\"];\n\tprivate defaultDirectoryName: string;\n\tprivate rootFileName: string;\n\n\tconstructor(config: InstructionResourceLoaderConfig) {\n\t\tthis.resourceType = config.resourceType;\n\t\tthis.defaultDirectoryName = config.defaultDirectoryName;\n\t\tthis.rootFileName = config.rootFileName;\n\t}\n\n\tprotected abstract createResource(resource: InstructionResource, frontmatter: TFrontmatter): TResource;\n\n\tprotected loadResourcesFromDir(dir: string, source: string): InstructionResourceLoadResult<TResource> {\n\t\treturn this.loadResourcesFromDirInternal(dir, source, true);\n\t}\n\n\tprivate loadResourcesFromConfiguredPath(\n\t\tresolvedPath: string,\n\t\tsource: ConfiguredResourceSource,\n\t): InstructionResourceLoadResult<TResource> {\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\treturn {\n\t\t\t\tresources: [],\n\t\t\t\tdiagnostics: [{ type: \"warning\", message: `${this.resourceType} path does not exist`, path: resolvedPath }],\n\t\t\t};\n\t\t}\n\t\ttry {\n\t\t\tconst stats = statSync(resolvedPath);\n\t\t\tif (stats.isDirectory()) return this.loadResourcesFromDirInternal(resolvedPath, source, true);\n\t\t\tif (!stats.isFile() || !resolvedPath.endsWith(\".md\")) {\n\t\t\t\treturn {\n\t\t\t\t\tresources: [],\n\t\t\t\t\tdiagnostics: [\n\t\t\t\t\t\t{ type: \"warning\", message: `${this.resourceType} path is not a markdown file`, path: resolvedPath },\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst result = this.loadResourceFromFile(resolvedPath, source);\n\t\t\treturn { resources: result.resource ? [result.resource] : [], diagnostics: result.diagnostics };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tresources: [],\n\t\t\t\tdiagnostics: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : `failed to read ${this.resourceType} path`,\n\t\t\t\t\t\tpath: resolvedPath,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t}\n\n\tprotected loadResources(options: InstructionResourceLoaderOptions): InstructionResourceLoadResult<TResource> {\n\t\tconst resolvedCwd = resolvePath(options.cwd);\n\t\tconst resolvedAgentDir = resolvePath(options.agentDir ?? getAgentDir());\n\t\tconst resourceMap = new Map<string, TResource>();\n\t\tconst realPathSet = new Set<string>();\n\t\tconst allDiagnostics: ResourceDiagnostic[] = [];\n\t\tconst collisionDiagnostics: ResourceDiagnostic[] = [];\n\n\t\tconst addResources = (result: InstructionResourceLoadResult<TResource>): void => {\n\t\t\tallDiagnostics.push(...result.diagnostics);\n\t\t\tfor (const resource of result.resources) {\n\t\t\t\tconst realPath = canonicalizePath(resource.filePath);\n\t\t\t\tif (realPathSet.has(realPath)) continue;\n\t\t\t\tconst existing = resourceMap.get(resource.name);\n\t\t\t\tif (existing) {\n\t\t\t\t\tcollisionDiagnostics.push(this.createCollisionDiagnostic(resource, existing));\n\t\t\t\t} else {\n\t\t\t\t\tresourceMap.set(resource.name, resource);\n\t\t\t\t\trealPathSet.add(realPath);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (options.includeDefaults) {\n\t\t\taddResources(\n\t\t\t\tthis.loadResourcesFromDirInternal(join(resolvedAgentDir, this.defaultDirectoryName), \"user\", true),\n\t\t\t);\n\t\t\taddResources(\n\t\t\t\tthis.loadResourcesFromDirInternal(\n\t\t\t\t\tresolve(resolvedCwd, CONFIG_DIR_NAME, this.defaultDirectoryName),\n\t\t\t\t\t\"project\",\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tconst userDir = join(resolvedAgentDir, this.defaultDirectoryName);\n\t\tconst projectDir = resolve(resolvedCwd, CONFIG_DIR_NAME, this.defaultDirectoryName);\n\t\tconst getSource = (resolvedPath: string): ConfiguredResourceSource => {\n\t\t\tif (!options.includeDefaults) {\n\t\t\t\tif (isUnderPath(resolvedPath, userDir)) return \"user\";\n\t\t\t\tif (isUnderPath(resolvedPath, projectDir)) return \"project\";\n\t\t\t}\n\t\t\treturn \"path\";\n\t\t};\n\n\t\tfor (const rawPath of options.resourcePaths) {\n\t\t\tconst resolvedPath = resolvePath(rawPath, resolvedCwd, { trim: true });\n\t\t\taddResources(this.loadResourcesFromConfiguredPath(resolvedPath, getSource(resolvedPath)));\n\t\t}\n\n\t\treturn {\n\t\t\tresources: Array.from(resourceMap.values()),\n\t\t\tdiagnostics: [...allDiagnostics, ...collisionDiagnostics],\n\t\t};\n\t}\n\n\tprivate async loadResourcesFromConfiguredPathWithOperations(\n\t\toperations: ToolOperations,\n\t\tresolvedPath: string,\n\t\tsource: ConfiguredResourceSource,\n\t): Promise<InstructionResourceLoadResult<TResource>> {\n\t\tif (!(await backendPathExists(operations, resolvedPath))) {\n\t\t\treturn {\n\t\t\t\tresources: [],\n\t\t\t\tdiagnostics: [{ type: \"warning\", message: `${this.resourceType} path does not exist`, path: resolvedPath }],\n\t\t\t};\n\t\t}\n\t\ttry {\n\t\t\tconst stats = await operations.stat(resolvedPath);\n\t\t\tif (stats.isDirectory()) {\n\t\t\t\treturn this.loadResourcesFromDirInternalWithOperations(operations, resolvedPath, source, true);\n\t\t\t}\n\t\t\tif (!stats.isFile() || !resolvedPath.endsWith(\".md\")) {\n\t\t\t\treturn {\n\t\t\t\t\tresources: [],\n\t\t\t\t\tdiagnostics: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\t\t\tmessage: `${this.resourceType} path is not a markdown file`,\n\t\t\t\t\t\t\tpath: resolvedPath,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst result = await this.loadResourceFromFileWithOperations(operations, resolvedPath, source);\n\t\t\treturn { resources: result.resource ? [result.resource] : [], diagnostics: result.diagnostics };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tresources: [],\n\t\t\t\tdiagnostics: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : `failed to read ${this.resourceType} path`,\n\t\t\t\t\t\tpath: resolvedPath,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t}\n\n\tprotected async loadResourcesWithOperations(\n\t\toptions: InstructionResourceLoaderWithOperationsOptions,\n\t): Promise<InstructionResourceLoadResult<TResource>> {\n\t\tconst backend = options.operations.getBackendInfo?.();\n\t\tconst pathFlavor = backend?.type === \"remote\" && backend.configured ? backend.workspace.pathFlavor : undefined;\n\t\tconst resolvedCwd = resolvePortablePath(options.operations.cwd, options.cwd);\n\t\tconst resolvedAgentDir = normalizePortablePath(options.agentDir ?? getAgentDir(), pathFlavor);\n\t\tconst resourceMap = new Map<string, TResource>();\n\t\tconst pathSet = new Set<string>();\n\t\tconst allDiagnostics: ResourceDiagnostic[] = [];\n\t\tconst collisionDiagnostics: ResourceDiagnostic[] = [];\n\n\t\tconst addResources = (result: InstructionResourceLoadResult<TResource>): void => {\n\t\t\tallDiagnostics.push(...result.diagnostics);\n\t\t\tfor (const resource of result.resources) {\n\t\t\t\tconst canonicalPath = pathComparisonValue(resource.filePath, pathFlavor);\n\t\t\t\tif (pathSet.has(canonicalPath)) continue;\n\t\t\t\tconst existing = resourceMap.get(resource.name);\n\t\t\t\tif (existing) {\n\t\t\t\t\tcollisionDiagnostics.push(this.createCollisionDiagnostic(resource, existing));\n\t\t\t\t} else {\n\t\t\t\t\tresourceMap.set(resource.name, resource);\n\t\t\t\t\tpathSet.add(canonicalPath);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (options.includeDefaults) {\n\t\t\taddResources(\n\t\t\t\tawait this.loadResourcesFromDirInternalWithOperations(\n\t\t\t\t\toptions.operations,\n\t\t\t\t\tjoinPortablePath(resolvedAgentDir, this.defaultDirectoryName),\n\t\t\t\t\t\"user\",\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t);\n\t\t\taddResources(\n\t\t\t\tawait this.loadResourcesFromDirInternalWithOperations(\n\t\t\t\t\toptions.operations,\n\t\t\t\t\tjoinPortablePath(resolvedCwd, CONFIG_DIR_NAME, this.defaultDirectoryName),\n\t\t\t\t\t\"project\",\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tconst userDir = joinPortablePath(resolvedAgentDir, this.defaultDirectoryName);\n\t\tconst projectDir = joinPortablePath(resolvedCwd, CONFIG_DIR_NAME, this.defaultDirectoryName);\n\t\tconst getSource = (resolvedPath: string): ConfiguredResourceSource => {\n\t\t\tif (!options.includeDefaults) {\n\t\t\t\tif (relativeWithin(userDir, resolvedPath) !== undefined) return \"user\";\n\t\t\t\tif (relativeWithin(projectDir, resolvedPath) !== undefined) return \"project\";\n\t\t\t}\n\t\t\treturn \"path\";\n\t\t};\n\n\t\tfor (const rawPath of options.resourcePaths) {\n\t\t\tconst resolvedPath = resolvePortablePath(resolvedCwd, rawPath.trim());\n\t\t\taddResources(\n\t\t\t\tawait this.loadResourcesFromConfiguredPathWithOperations(\n\t\t\t\t\toptions.operations,\n\t\t\t\t\tresolvedPath,\n\t\t\t\t\tgetSource(resolvedPath),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tresources: Array.from(resourceMap.values()),\n\t\t\tdiagnostics: [...allDiagnostics, ...collisionDiagnostics],\n\t\t};\n\t}\n\n\tprivate createCollisionDiagnostic(resource: TResource, existing: TResource): ResourceDiagnostic {\n\t\treturn {\n\t\t\ttype: \"collision\",\n\t\t\tmessage: `name \"${resource.name}\" collision`,\n\t\t\tpath: resource.filePath,\n\t\t\tcollision: {\n\t\t\t\tresourceType: this.resourceType,\n\t\t\t\tname: resource.name,\n\t\t\t\twinnerPath: existing.filePath,\n\t\t\t\tloserPath: resource.filePath,\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate addIgnoreRules(ig: ignore.Ignore, dir: string, rootDir: string): void {\n\t\tconst relativeDir = relative(rootDir, dir);\n\t\tconst prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : \"\";\n\t\tfor (const filename of IGNORE_FILE_NAMES) {\n\t\t\tconst ignorePath = join(dir, filename);\n\t\t\tif (!existsSync(ignorePath)) continue;\n\t\t\ttry {\n\t\t\t\tconst patterns = readFileSync(ignorePath, \"utf-8\")\n\t\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t\t.map((line) => prefixIgnorePattern(line, prefix))\n\t\t\t\t\t.filter((line): line is string => Boolean(line));\n\t\t\t\tif (patterns.length > 0) ig.add(patterns);\n\t\t\t} catch {}\n\t\t}\n\t}\n\n\tprivate async addIgnoreRulesWithOperations(\n\t\toperations: ToolOperations,\n\t\tig: ignore.Ignore,\n\t\tdir: string,\n\t\trootDir: string,\n\t): Promise<void> {\n\t\tconst relativeDir = relativePortablePath(rootDir, dir);\n\t\tconst prefix = relativeDir && relativeDir !== \".\" ? `${relativeDir.replace(/\\\\/g, \"/\")}/` : \"\";\n\t\tfor (const filename of IGNORE_FILE_NAMES) {\n\t\t\tconst ignorePath = joinPortablePath(dir, filename);\n\t\t\tif (!(await backendPathExists(operations, ignorePath))) continue;\n\t\t\ttry {\n\t\t\t\tconst patterns = (await operations.readFile(ignorePath))\n\t\t\t\t\t.toString(\"utf-8\")\n\t\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t\t.map((line) => prefixIgnorePattern(line, prefix))\n\t\t\t\t\t.filter((line): line is string => Boolean(line));\n\t\t\t\tif (patterns.length > 0) ig.add(patterns);\n\t\t\t} catch {}\n\t\t}\n\t}\n\n\tprivate getLocalResourceEntry(entry: Dirent, fullPath: string): Dirent | Stats | undefined {\n\t\tif (!entry.isSymbolicLink()) return entry;\n\t\ttry {\n\t\t\treturn statSync(fullPath);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate loadRootResourceFromEntries(\n\t\tentries: Dirent[],\n\t\tdir: string,\n\t\tsource: string,\n\t\tignoreMatcher: ignore.Ignore,\n\t\trootDir: string,\n\t): InstructionResourceLoadResult<TResource> | undefined {\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.name !== this.rootFileName) continue;\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tconst resourceEntry = this.getLocalResourceEntry(entry, fullPath);\n\t\t\tif (!resourceEntry?.isFile() || ignoreMatcher.ignores(toPosixPath(relative(rootDir, fullPath)))) continue;\n\t\t\tconst result = this.loadResourceFromFile(fullPath, source);\n\t\t\treturn { resources: result.resource ? [result.resource] : [], diagnostics: result.diagnostics };\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate loadNestedResourceEntry(entry: Dirent, context: LocalResourceTraversal<TResource>): void {\n\t\tif (entry.name.startsWith(\".\") || entry.name === \"node_modules\") return;\n\t\tconst fullPath = join(context.dir, entry.name);\n\t\tconst resourceEntry = this.getLocalResourceEntry(entry, fullPath);\n\t\tif (!resourceEntry) return;\n\t\tconst relativePath = toPosixPath(relative(context.rootDir, fullPath));\n\t\tif (context.ignoreMatcher.ignores(resourceEntry.isDirectory() ? `${relativePath}/` : relativePath)) return;\n\t\tif (resourceEntry.isDirectory()) {\n\t\t\tconst nested = this.loadResourcesFromDirInternal(\n\t\t\t\tfullPath,\n\t\t\t\tcontext.source,\n\t\t\t\tfalse,\n\t\t\t\tcontext.ignoreMatcher,\n\t\t\t\tcontext.rootDir,\n\t\t\t);\n\t\t\tcontext.resources.push(...nested.resources);\n\t\t\tcontext.diagnostics.push(...nested.diagnostics);\n\t\t\treturn;\n\t\t}\n\t\tif (!resourceEntry.isFile() || !context.includeRootFiles || !entry.name.endsWith(\".md\")) return;\n\t\tconst result = this.loadResourceFromFile(fullPath, context.source);\n\t\tif (result.resource) context.resources.push(result.resource);\n\t\tcontext.diagnostics.push(...result.diagnostics);\n\t}\n\n\tprivate loadNestedResourcesFromEntries(context: LocalResourceTraversal<TResource>): void {\n\t\tfor (const entry of context.entries) this.loadNestedResourceEntry(entry, context);\n\t}\n\n\tprivate loadResourcesFromDirInternal(\n\t\tdir: string,\n\t\tsource: string,\n\t\tincludeRootFiles: boolean,\n\t\tignoreMatcher?: ignore.Ignore,\n\t\trootDir?: string,\n\t): InstructionResourceLoadResult<TResource> {\n\t\tconst resources: TResource[] = [];\n\t\tconst diagnostics: ResourceDiagnostic[] = [];\n\t\tif (!existsSync(dir)) return { resources, diagnostics };\n\n\t\tconst root = rootDir ?? dir;\n\t\tconst ig = ignoreMatcher ?? ignore();\n\t\tthis.addIgnoreRules(ig, dir, root);\n\t\ttry {\n\t\t\tconst entries = readdirSync(dir, { withFileTypes: true });\n\t\t\tconst rootResource = this.loadRootResourceFromEntries(entries, dir, source, ig, root);\n\t\t\tif (rootResource) return rootResource;\n\t\t\tthis.loadNestedResourcesFromEntries({\n\t\t\t\tentries,\n\t\t\t\tdir,\n\t\t\t\tsource,\n\t\t\t\tincludeRootFiles,\n\t\t\t\tignoreMatcher: ig,\n\t\t\t\trootDir: root,\n\t\t\t\tresources,\n\t\t\t\tdiagnostics,\n\t\t\t});\n\t\t} catch {}\n\t\treturn { resources, diagnostics };\n\t}\n\n\tprivate async getBackendResourceEntry(\n\t\toperations: ToolOperations,\n\t\tfullPath: string,\n\t): Promise<ToolFileStat | undefined> {\n\t\ttry {\n\t\t\treturn await operations.stat(fullPath);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate async loadRootResourceWithOperations(\n\t\tcontext: BackendResourceTraversal<TResource>,\n\t): Promise<InstructionResourceLoadResult<TResource> | undefined> {\n\t\tfor (const name of context.entries) {\n\t\t\tif (name !== this.rootFileName) continue;\n\t\t\tconst fullPath = joinPortablePath(context.dir, name);\n\t\t\tconst resourceEntry = await this.getBackendResourceEntry(context.operations, fullPath);\n\t\t\tif (\n\t\t\t\t!resourceEntry?.isFile() ||\n\t\t\t\tcontext.ignoreMatcher.ignores(relativePortablePath(context.rootDir, fullPath).replace(/\\\\/g, \"/\"))\n\t\t\t)\n\t\t\t\tcontinue;\n\t\t\tconst result = await this.loadResourceFromFileWithOperations(context.operations, fullPath, context.source);\n\t\t\treturn { resources: result.resource ? [result.resource] : [], diagnostics: result.diagnostics };\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async loadNestedResourceWithOperations(\n\t\tname: string,\n\t\tcontext: BackendResourceTraversal<TResource>,\n\t): Promise<void> {\n\t\tif (name.startsWith(\".\") || name === \"node_modules\") return;\n\t\tconst fullPath = joinPortablePath(context.dir, name);\n\t\tconst resourceEntry = await this.getBackendResourceEntry(context.operations, fullPath);\n\t\tif (!resourceEntry) return;\n\t\tconst relativePath = relativePortablePath(context.rootDir, fullPath).replace(/\\\\/g, \"/\");\n\t\tif (context.ignoreMatcher.ignores(resourceEntry.isDirectory() ? `${relativePath}/` : relativePath)) return;\n\t\tif (resourceEntry.isDirectory()) {\n\t\t\tconst nested = await this.loadResourcesFromDirInternalWithOperations(\n\t\t\t\tcontext.operations,\n\t\t\t\tfullPath,\n\t\t\t\tcontext.source,\n\t\t\t\tfalse,\n\t\t\t\tcontext.ignoreMatcher,\n\t\t\t\tcontext.rootDir,\n\t\t\t);\n\t\t\tcontext.resources.push(...nested.resources);\n\t\t\tcontext.diagnostics.push(...nested.diagnostics);\n\t\t\treturn;\n\t\t}\n\t\tif (!resourceEntry.isFile() || !context.includeRootFiles || !name.endsWith(\".md\")) return;\n\t\tconst result = await this.loadResourceFromFileWithOperations(context.operations, fullPath, context.source);\n\t\tif (result.resource) context.resources.push(result.resource);\n\t\tcontext.diagnostics.push(...result.diagnostics);\n\t}\n\n\tprivate async loadNestedResourcesWithOperations(context: BackendResourceTraversal<TResource>): Promise<void> {\n\t\tfor (const name of context.entries) await this.loadNestedResourceWithOperations(name, context);\n\t}\n\n\tprivate async loadResourcesFromDirInternalWithOperations(\n\t\toperations: ToolOperations,\n\t\tdir: string,\n\t\tsource: string,\n\t\tincludeRootFiles: boolean,\n\t\tignoreMatcher?: ignore.Ignore,\n\t\trootDir?: string,\n\t): Promise<InstructionResourceLoadResult<TResource>> {\n\t\tconst resources: TResource[] = [];\n\t\tconst diagnostics: ResourceDiagnostic[] = [];\n\t\tif (!(await backendPathExists(operations, dir))) return { resources, diagnostics };\n\n\t\tconst root = rootDir ?? dir;\n\t\tconst ig = ignoreMatcher ?? ignore();\n\t\tawait this.addIgnoreRulesWithOperations(operations, ig, dir, root);\n\t\ttry {\n\t\t\tconst context: BackendResourceTraversal<TResource> = {\n\t\t\t\tentries: await operations.readdir(dir),\n\t\t\t\toperations,\n\t\t\t\tdir,\n\t\t\t\tsource,\n\t\t\t\tincludeRootFiles,\n\t\t\t\tignoreMatcher: ig,\n\t\t\t\trootDir: root,\n\t\t\t\tresources,\n\t\t\t\tdiagnostics,\n\t\t\t};\n\t\t\tconst rootResource = await this.loadRootResourceWithOperations(context);\n\t\t\tif (rootResource) return rootResource;\n\t\t\tawait this.loadNestedResourcesWithOperations(context);\n\t\t} catch {}\n\t\treturn { resources, diagnostics };\n\t}\n\n\tprivate loadResourceFromFile(filePath: string, source: string): InstructionResourceParseResult<TResource> {\n\t\ttry {\n\t\t\treturn this.parseResource(readFileSync(filePath, \"utf-8\"), filePath, source);\n\t\t} catch (error) {\n\t\t\treturn this.createParseError(error, filePath);\n\t\t}\n\t}\n\n\tprivate async loadResourceFromFileWithOperations(\n\t\toperations: ToolOperations,\n\t\tfilePath: string,\n\t\tsource: string,\n\t): Promise<InstructionResourceParseResult<TResource>> {\n\t\ttry {\n\t\t\tconst backend = operations.getBackendInfo?.();\n\t\t\tconst pathFlavor = backend?.type === \"remote\" && backend.configured ? backend.workspace.pathFlavor : undefined;\n\t\t\treturn this.parseResource(\n\t\t\t\t(await operations.readFile(filePath)).toString(\"utf-8\"),\n\t\t\t\tfilePath,\n\t\t\t\tsource,\n\t\t\t\tpathFlavor,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treturn this.createParseError(error, filePath);\n\t\t}\n\t}\n\n\tprivate parseResource(\n\t\trawContent: string,\n\t\tfilePath: string,\n\t\tsource: string,\n\t\tpathFlavor?: PortablePathFlavor,\n\t): InstructionResourceParseResult<TResource> {\n\t\tconst diagnostics: ResourceDiagnostic[] = [];\n\t\tconst { frontmatter } = parseFrontmatter<TFrontmatter>(rawContent);\n\t\tfor (const error of validateDescription(frontmatter.description)) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: error, path: filePath });\n\t\t}\n\t\tif (!frontmatter.name || frontmatter.name.trim() === \"\") {\n\t\t\tdiagnostics.push({ type: \"warning\", message: \"name is required\", path: filePath });\n\t\t}\n\t\tconst name = frontmatter.name;\n\t\tif (name) {\n\t\t\tfor (const error of validateName(name)) {\n\t\t\t\tdiagnostics.push({ type: \"warning\", message: error, path: filePath });\n\t\t\t}\n\t\t}\n\t\tif (!name || !frontmatter.description || frontmatter.description.trim() === \"\") {\n\t\t\treturn { resource: null, diagnostics };\n\t\t}\n\t\tconst baseDir = pathFlavor ? dirnamePortablePath(filePath, pathFlavor) : dirname(filePath);\n\t\tconst resource: InstructionResource = {\n\t\t\tname,\n\t\t\tdescription: frontmatter.description,\n\t\t\tfilePath,\n\t\t\tbaseDir,\n\t\t\tsourceInfo: createResourceSourceInfo(filePath, baseDir, source),\n\t\t\tdisableModelInvocation: frontmatter[\"disable-model-invocation\"] === true,\n\t\t\ttools: normalizeFrontmatterTools(frontmatter.tools),\n\t\t};\n\t\treturn { resource: this.createResource(resource, frontmatter), diagnostics };\n\t}\n\n\tprivate createParseError(error: unknown, filePath: string): InstructionResourceParseResult<TResource> {\n\t\treturn {\n\t\t\tresource: null,\n\t\t\tdiagnostics: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\tmessage: error instanceof Error ? error.message : `failed to parse ${this.resourceType} file`,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n}\n\nexport function formatInstructionResourcesForPrompt(\n\tresources: InstructionResource[],\n\toptions: InstructionResourcePromptFormatOptions,\n): string {\n\tconst visibleResources = resources.filter((resource) => !resource.disableModelInvocation);\n\tif (visibleResources.length === 0) return \"\";\n\n\tconst [firstIntroLine = \"\", ...remainingIntroLines] = options.intro;\n\tconst lines = [`\\n\\n${firstIntroLine}`, ...remainingIntroLines, \"\", `<${options.containerTag}>`];\n\tfor (const resource of visibleResources) {\n\t\tlines.push(` <${options.itemTag}>`);\n\t\tlines.push(` <name>${escapeXml(resource.name)}</name>`);\n\t\tlines.push(` <description>${escapeXml(resource.description)}</description>`);\n\t\tif (options.includeLocation !== false) lines.push(` <location>${escapeXml(resource.filePath)}</location>`);\n\t\tlines.push(` </${options.itemTag}>`);\n\t}\n\tlines.push(`</${options.containerTag}>`);\n\treturn lines.join(\"\\n\");\n}\n\nfunction escapeXml(value: string): string {\n\treturn value\n\t\t.replace(/&/g, \"&amp;\")\n\t\t.replace(/</g, \"&lt;\")\n\t\t.replace(/>/g, \"&gt;\")\n\t\t.replace(/\"/g, \"&quot;\")\n\t\t.replace(/'/g, \"&apos;\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACX,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,EACb,MAAM,4BAA4B,CAAC;AAIpC,YAAY,EACX,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,GACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE7E,eAAO,MAAM,yBAAyB,wGAGrC,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBAC3B,CAAC;AAEZ,eAAO,MAAM,qBAAqB,iGAGjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,eAAO,MAAM,wCAAwC,iCAAiC,CAAC;AAEvF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,CAgBrE;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,oBAAoB,CAOnH;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,wBAAwB,CAO1B;AAED,iGAAiG;AACjG,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAW3E;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,GACf,aAAa,CASf;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAqDhE"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACX,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,EACb,MAAM,4BAA4B,CAAC;AAIpC,YAAY,EACX,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,GACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAoB,YAAY,EAAE,OAAO,EAAE,WAAW,EAAqB,MAAM,oBAAoB,CAAC;AAElH,eAAO,MAAM,yBAAyB,wGAGrC,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBAC3B,CAAC;AAEZ,eAAO,MAAM,qBAAqB,iGAGjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,eAAO,MAAM,wCAAwC,iCAAiC,CAAC;AAEvF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,CAgBrE;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,oBAAoB,CAOnH;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,wBAAwB,CAO1B;AAED,iGAAiG;AACjG,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAW3E;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,GACf,aAAa,CASf;AA4BD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAyDhE"}
@@ -77,6 +77,31 @@ export function createCustomMessage(customType, content, display, details, times
77
77
  timestamp: new Date(timestamp).getTime(),
78
78
  };
79
79
  }
80
+ function recordBashOutputModes(message, modes) {
81
+ for (const part of message.content) {
82
+ if (part.type !== "toolCall" || part.name !== "bash")
83
+ continue;
84
+ const mode = part.arguments?.output_mode;
85
+ if (mode === "on_fail" || mode === "never")
86
+ modes.set(part.id, mode);
87
+ }
88
+ }
89
+ function maskBashToolResult(message, mode) {
90
+ if (mode === undefined || (mode === "on_fail" && message.isError))
91
+ return message;
92
+ const exitCode = message.isError
93
+ ? message.content
94
+ .filter((part) => part.type === "text")
95
+ .map((part) => part.text)
96
+ .join("\n")
97
+ .match(/(?:^|\n)Command exited with code (\d+)$/)?.[1]
98
+ : undefined;
99
+ const status = message.isError ? (exitCode ? `exited with code ${exitCode}` : "failed") : "succeeded";
100
+ return {
101
+ ...message,
102
+ content: [{ type: "text", text: `Bash command ${status}; output omitted (output_mode: ${mode}).` }],
103
+ };
104
+ }
80
105
  /**
81
106
  * Transform AgentMessages (including custom types) to LLM-compatible Messages.
82
107
  *
@@ -86,6 +111,7 @@ export function createCustomMessage(customType, content, display, details, times
86
111
  * - Custom extensions and tools
87
112
  */
88
113
  export function convertToLlm(messages) {
114
+ const bashOutputModes = new Map();
89
115
  return messages
90
116
  .map((m) => {
91
117
  switch (m.role) {
@@ -126,9 +152,12 @@ export function convertToLlm(messages) {
126
152
  timestamp: m.timestamp,
127
153
  };
128
154
  case "user":
155
+ return m;
129
156
  case "assistant":
130
- case "toolResult":
157
+ recordBashOutputModes(m, bashOutputModes);
131
158
  return m;
159
+ case "toolResult":
160
+ return maskBashToolResult(m, m.toolName === "bash" ? bashOutputModes.get(m.toolCallId) : undefined);
132
161
  default:
133
162
  // biome-ignore lint/correctness/noSwitchDeclarations: fine
134
163
  const _exhaustiveCheck = m;
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Custom message types and transformers for the coding agent.\n *\n * Extends the base AgentMessage type with coding-agent specific message types,\n * and provides a transformer to convert them to LLM-compatible messages.\n */\n\nimport type {\n\tAgentMessage,\n\tBashExecutionMessage,\n\tBranchSummaryMessage,\n\tCompactionSummaryMessage,\n\tCustomMessage,\n} from \"@greppleai/grip-agent-core\";\n\nimport { HOOK_EXECUTION_CUSTOM_TYPE } from \"./hooks/types.ts\";\n\nexport type {\n\tBashExecutionMessage,\n\tBranchSummaryMessage,\n\tCompactionSummaryMessage,\n\tCustomMessage,\n} from \"@greppleai/grip-agent-core\";\n\nimport type { ImageContent, Message, TextContent } from \"@greppleai/grip-ai\";\n\nexport const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:\n\n<summary>\n`;\n\nexport const COMPACTION_SUMMARY_SUFFIX = `\n</summary>`;\n\nexport const BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:\n\n<summary>\n`;\n\nexport const BRANCH_SUMMARY_SUFFIX = `</summary>`;\n\nexport const STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE = \"structured_response_internal\";\n\n/**\n * Convert a BashExecutionMessage to user message text for LLM context.\n */\nexport function bashExecutionToText(msg: BashExecutionMessage): string {\n\tlet text = `Ran \\`${msg.command}\\`\\n`;\n\tif (msg.output) {\n\t\ttext += `\\`\\`\\`\\n${msg.output}\\n\\`\\`\\``;\n\t} else {\n\t\ttext += \"(no output)\";\n\t}\n\tif (msg.cancelled) {\n\t\ttext += \"\\n\\n(command cancelled)\";\n\t} else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {\n\t\ttext += `\\n\\nCommand exited with code ${msg.exitCode}`;\n\t}\n\tif (msg.truncated && msg.fullOutputPath) {\n\t\ttext += `\\n\\n[Output truncated. Full output: ${msg.fullOutputPath}]`;\n\t}\n\treturn text;\n}\n\nexport function createBranchSummaryMessage(summary: string, fromId: string, timestamp: string): BranchSummaryMessage {\n\treturn {\n\t\trole: \"branchSummary\",\n\t\tsummary,\n\t\tfromId,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\nexport function createCompactionSummaryMessage(\n\tsummary: string,\n\ttokensBefore: number,\n\ttimestamp: string,\n): CompactionSummaryMessage {\n\treturn {\n\t\trole: \"compactionSummary\",\n\t\tsummary: summary,\n\t\ttokensBefore,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\n/** Normalize content-bearing messages received from untyped extension and session boundaries. */\nexport function normalizeMessageContent(message: AgentMessage): AgentMessage {\n\tif (\n\t\t(message.role === \"user\" ||\n\t\t\tmessage.role === \"assistant\" ||\n\t\t\tmessage.role === \"toolResult\" ||\n\t\t\tmessage.role === \"custom\") &&\n\t\tmessage.content == null\n\t) {\n\t\treturn { ...message, content: [] } as AgentMessage;\n\t}\n\treturn message;\n}\n\n/** Convert CustomMessageEntry to AgentMessage format */\nexport function createCustomMessage(\n\tcustomType: string,\n\tcontent: string | (TextContent | ImageContent)[],\n\tdisplay: boolean,\n\tdetails: unknown | undefined,\n\ttimestamp: string,\n): CustomMessage {\n\treturn {\n\t\trole: \"custom\",\n\t\tcustomType,\n\t\tcontent: content ?? [],\n\t\tdisplay,\n\t\tdetails,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\n/**\n * Transform AgentMessages (including custom types) to LLM-compatible Messages.\n *\n * This is used by:\n * - Agent's transormToLlm option (for prompt calls and queued messages)\n * - Compaction's generateSummary (for summarization)\n * - Custom extensions and tools\n */\nexport function convertToLlm(messages: AgentMessage[]): Message[] {\n\treturn messages\n\t\t.map((m): Message | undefined => {\n\t\t\tswitch (m.role) {\n\t\t\t\tcase \"bashExecution\":\n\t\t\t\t\t// Skip messages excluded from context (!! prefix)\n\t\t\t\t\tif (m.excludeFromContext) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: bashExecutionToText(m) }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"custom\": {\n\t\t\t\t\tif (\n\t\t\t\t\t\tm.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE ||\n\t\t\t\t\t\tm.customType === HOOK_EXECUTION_CUSTOM_TYPE\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tconst content = typeof m.content === \"string\" ? [{ type: \"text\" as const, text: m.content }] : m.content;\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"branchSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: BRANCH_SUMMARY_PREFIX + m.summary + BRANCH_SUMMARY_SUFFIX }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"compactionSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{ type: \"text\" as const, text: COMPACTION_SUMMARY_PREFIX + m.summary + COMPACTION_SUMMARY_SUFFIX },\n\t\t\t\t\t\t],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"user\":\n\t\t\t\tcase \"assistant\":\n\t\t\t\tcase \"toolResult\":\n\t\t\t\t\treturn m;\n\t\t\t\tdefault:\n\t\t\t\t\t// biome-ignore lint/correctness/noSwitchDeclarations: fine\n\t\t\t\t\tconst _exhaustiveCheck: never = m;\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t})\n\t\t.filter((m) => m !== undefined);\n}\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Custom message types and transformers for the coding agent.\n *\n * Extends the base AgentMessage type with coding-agent specific message types,\n * and provides a transformer to convert them to LLM-compatible messages.\n */\n\nimport type {\n\tAgentMessage,\n\tBashExecutionMessage,\n\tBranchSummaryMessage,\n\tCompactionSummaryMessage,\n\tCustomMessage,\n} from \"@greppleai/grip-agent-core\";\n\nimport { HOOK_EXECUTION_CUSTOM_TYPE } from \"./hooks/types.ts\";\n\nexport type {\n\tBashExecutionMessage,\n\tBranchSummaryMessage,\n\tCompactionSummaryMessage,\n\tCustomMessage,\n} from \"@greppleai/grip-agent-core\";\n\nimport type { AssistantMessage, ImageContent, Message, TextContent, ToolResultMessage } from \"@greppleai/grip-ai\";\n\nexport const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:\n\n<summary>\n`;\n\nexport const COMPACTION_SUMMARY_SUFFIX = `\n</summary>`;\n\nexport const BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:\n\n<summary>\n`;\n\nexport const BRANCH_SUMMARY_SUFFIX = `</summary>`;\n\nexport const STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE = \"structured_response_internal\";\n\n/**\n * Convert a BashExecutionMessage to user message text for LLM context.\n */\nexport function bashExecutionToText(msg: BashExecutionMessage): string {\n\tlet text = `Ran \\`${msg.command}\\`\\n`;\n\tif (msg.output) {\n\t\ttext += `\\`\\`\\`\\n${msg.output}\\n\\`\\`\\``;\n\t} else {\n\t\ttext += \"(no output)\";\n\t}\n\tif (msg.cancelled) {\n\t\ttext += \"\\n\\n(command cancelled)\";\n\t} else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {\n\t\ttext += `\\n\\nCommand exited with code ${msg.exitCode}`;\n\t}\n\tif (msg.truncated && msg.fullOutputPath) {\n\t\ttext += `\\n\\n[Output truncated. Full output: ${msg.fullOutputPath}]`;\n\t}\n\treturn text;\n}\n\nexport function createBranchSummaryMessage(summary: string, fromId: string, timestamp: string): BranchSummaryMessage {\n\treturn {\n\t\trole: \"branchSummary\",\n\t\tsummary,\n\t\tfromId,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\nexport function createCompactionSummaryMessage(\n\tsummary: string,\n\ttokensBefore: number,\n\ttimestamp: string,\n): CompactionSummaryMessage {\n\treturn {\n\t\trole: \"compactionSummary\",\n\t\tsummary: summary,\n\t\ttokensBefore,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\n/** Normalize content-bearing messages received from untyped extension and session boundaries. */\nexport function normalizeMessageContent(message: AgentMessage): AgentMessage {\n\tif (\n\t\t(message.role === \"user\" ||\n\t\t\tmessage.role === \"assistant\" ||\n\t\t\tmessage.role === \"toolResult\" ||\n\t\t\tmessage.role === \"custom\") &&\n\t\tmessage.content == null\n\t) {\n\t\treturn { ...message, content: [] } as AgentMessage;\n\t}\n\treturn message;\n}\n\n/** Convert CustomMessageEntry to AgentMessage format */\nexport function createCustomMessage(\n\tcustomType: string,\n\tcontent: string | (TextContent | ImageContent)[],\n\tdisplay: boolean,\n\tdetails: unknown | undefined,\n\ttimestamp: string,\n): CustomMessage {\n\treturn {\n\t\trole: \"custom\",\n\t\tcustomType,\n\t\tcontent: content ?? [],\n\t\tdisplay,\n\t\tdetails,\n\t\ttimestamp: new Date(timestamp).getTime(),\n\t};\n}\n\ntype SuppressedBashOutputMode = \"on_fail\" | \"never\";\n\nfunction recordBashOutputModes(message: AssistantMessage, modes: Map<string, SuppressedBashOutputMode>): void {\n\tfor (const part of message.content) {\n\t\tif (part.type !== \"toolCall\" || part.name !== \"bash\") continue;\n\t\tconst mode = part.arguments?.output_mode;\n\t\tif (mode === \"on_fail\" || mode === \"never\") modes.set(part.id, mode);\n\t}\n}\n\nfunction maskBashToolResult(message: ToolResultMessage, mode: SuppressedBashOutputMode | undefined): ToolResultMessage {\n\tif (mode === undefined || (mode === \"on_fail\" && message.isError)) return message;\n\tconst exitCode = message.isError\n\t\t? message.content\n\t\t\t\t.filter((part) => part.type === \"text\")\n\t\t\t\t.map((part) => part.text)\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.match(/(?:^|\\n)Command exited with code (\\d+)$/)?.[1]\n\t\t: undefined;\n\tconst status = message.isError ? (exitCode ? `exited with code ${exitCode}` : \"failed\") : \"succeeded\";\n\treturn {\n\t\t...message,\n\t\tcontent: [{ type: \"text\", text: `Bash command ${status}; output omitted (output_mode: ${mode}).` }],\n\t};\n}\n\n/**\n * Transform AgentMessages (including custom types) to LLM-compatible Messages.\n *\n * This is used by:\n * - Agent's transormToLlm option (for prompt calls and queued messages)\n * - Compaction's generateSummary (for summarization)\n * - Custom extensions and tools\n */\nexport function convertToLlm(messages: AgentMessage[]): Message[] {\n\tconst bashOutputModes = new Map<string, SuppressedBashOutputMode>();\n\treturn messages\n\t\t.map((m): Message | undefined => {\n\t\t\tswitch (m.role) {\n\t\t\t\tcase \"bashExecution\":\n\t\t\t\t\t// Skip messages excluded from context (!! prefix)\n\t\t\t\t\tif (m.excludeFromContext) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: bashExecutionToText(m) }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"custom\": {\n\t\t\t\t\tif (\n\t\t\t\t\t\tm.customType === STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE ||\n\t\t\t\t\t\tm.customType === HOOK_EXECUTION_CUSTOM_TYPE\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\tconst content = typeof m.content === \"string\" ? [{ type: \"text\" as const, text: m.content }] : m.content;\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"branchSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: BRANCH_SUMMARY_PREFIX + m.summary + BRANCH_SUMMARY_SUFFIX }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"compactionSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{ type: \"text\" as const, text: COMPACTION_SUMMARY_PREFIX + m.summary + COMPACTION_SUMMARY_SUFFIX },\n\t\t\t\t\t\t],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"user\":\n\t\t\t\t\treturn m;\n\t\t\t\tcase \"assistant\":\n\t\t\t\t\trecordBashOutputModes(m, bashOutputModes);\n\t\t\t\t\treturn m;\n\t\t\t\tcase \"toolResult\":\n\t\t\t\t\treturn maskBashToolResult(m, m.toolName === \"bash\" ? bashOutputModes.get(m.toolCallId) : undefined);\n\t\t\t\tdefault:\n\t\t\t\t\t// biome-ignore lint/correctness/noSwitchDeclarations: fine\n\t\t\t\t\tconst _exhaustiveCheck: never = m;\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t})\n\t\t.filter((m) => m !== undefined);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAEN,KAAK,mBAAmB,EACxB,KAAK,mCAAmC,EACxC,KAAK,8BAA8B,EACnC,yBAAyB,EACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,gBAAiB,SAAQ,8BAA8B;CAAG;AAE3E,MAAM,WAAW,KAAM,SAAQ,mBAAmB;CAAG;AAErD,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,wBAAwB,GAAG,mCAAmC,CAAC;AAE3E,MAAM,WAAW,iBAAiB;IACjC,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,0CAA0C;IAC1C,eAAe,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,+BAAgC,SAAQ,iBAAiB;IACzE,UAAU,EAAE,cAAc,CAAC;CAC3B;AAED,qBAAa,WAAY,SAAQ,yBAAyB,CAAC,KAAK,EAAE,gBAAgB,CAAC;IAClF,cAEC;IAED,UAAmB,cAAc,CAAC,QAAQ,EAAE,mBAAmB,GAAG,KAAK,CAEtE;IAED,WAAW,CAAC,OAAO,EAAE,wBAAwB,GAAG,gBAAgB,CAG/D;IAED,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAQjD;IAEK,kBAAkB,CAAC,OAAO,EAAE,+BAA+B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAS5F;CACD;AAID,oCAAoC;AACpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,gBAAgB,CAErF;AAED,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAEvE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,+BAA+B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAE5G;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAU7D"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAEN,KAAK,mBAAmB,EACxB,KAAK,mCAAmC,EACxC,KAAK,8BAA8B,EACnC,yBAAyB,EACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,gBAAiB,SAAQ,8BAA8B;CAAG;AAE3E,MAAM,WAAW,KAAM,SAAQ,mBAAmB;CAAG;AAErD,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,wBAAwB,GAAG,mCAAmC,CAAC;AAE3E,MAAM,WAAW,iBAAiB;IACjC,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,0CAA0C;IAC1C,eAAe,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,+BAAgC,SAAQ,iBAAiB;IACzE,UAAU,EAAE,cAAc,CAAC;CAC3B;AAED,qBAAa,WAAY,SAAQ,yBAAyB,CAAC,KAAK,EAAE,gBAAgB,CAAC;IAClF,cAEC;IAED,UAAmB,cAAc,CAAC,QAAQ,EAAE,mBAAmB,GAAG,KAAK,CAEtE;IAED,WAAW,CAAC,OAAO,EAAE,wBAAwB,GAAG,gBAAgB,CAG/D;IAED,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAQjD;IAEK,kBAAkB,CAAC,OAAO,EAAE,+BAA+B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAS5F;CACD;AAID,oCAAoC;AACpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,gBAAgB,CAErF;AAED,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAEvE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,+BAA+B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAE5G;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAW7D"}
@@ -47,11 +47,12 @@ export function formatSkillsForPrompt(skills) {
47
47
  return formatInstructionResourcesForPrompt(skills, {
48
48
  intro: [
49
49
  "The following skills provide specialized instructions for specific tasks.",
50
- "Use the read tool to load a skill's file when the task matches its description.",
51
- "When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.",
50
+ "Use load_skill with a skill name (or an array of names) when the task matches its description.",
51
+ "When a loaded skill references a relative path, resolve it against the skill directory reported by load_skill and use that absolute path in tool commands.",
52
52
  ],
53
53
  containerTag: "available_skills",
54
54
  itemTag: "skill",
55
+ includeLocation: false,
55
56
  });
56
57
  }
57
58
  //# sourceMappingURL=skills.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AACA,OAAO,EACN,mCAAmC,EAInC,yBAAyB,GACzB,MAAM,kCAAkC,CAAC;AA6B1C,MAAM,OAAO,WAAY,SAAQ,yBAAkD;IAClF;QACC,KAAK,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5F,CAAC;IAEkB,cAAc,CAAC,QAA6B;QAC9D,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,OAAiC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,OAA0B;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;YACjC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,aAAa,EAAE,OAAO,CAAC,UAAU;YACjC,eAAe,EAAE,OAAO,CAAC,eAAe;SACxC,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAwC;QAChE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC;YACrD,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,aAAa,EAAE,OAAO,CAAC,UAAU;YACjC,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,UAAU,EAAE,OAAO,CAAC,UAAU;SAC9B,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;CACD;AAED,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,oCAAoC;AACpC,MAAM,UAAU,iBAAiB,CAAC,OAAiC;IAClE,OAAO,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,UAAU,CAAC,OAA0B;IACpD,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAwC;IAChF,OAAO,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACpD,OAAO,mCAAmC,CAAC,MAAM,EAAE;QAClD,KAAK,EAAE;YACN,2EAA2E;YAC3E,iFAAiF;YACjF,8KAA8K;SAC9K;QACD,YAAY,EAAE,kBAAkB;QAChC,OAAO,EAAE,OAAO;KAChB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { ResourceDiagnostic } from \"./diagnostics.ts\";\nimport {\n\tformatInstructionResourcesForPrompt,\n\ttype InstructionResource,\n\ttype InstructionResourceDirectoryOptions,\n\ttype InstructionResourceFrontmatter,\n\tInstructionResourceLoader,\n} from \"./instruction-resource-loader.ts\";\nimport type { ToolOperations } from \"./tools/operations.ts\";\n\nexport interface SkillFrontmatter extends InstructionResourceFrontmatter {}\n\nexport interface Skill extends InstructionResource {}\n\nexport interface LoadSkillsResult {\n\tskills: Skill[];\n\tdiagnostics: ResourceDiagnostic[];\n}\n\nexport type LoadSkillsFromDirOptions = InstructionResourceDirectoryOptions;\n\nexport interface LoadSkillsOptions {\n\t/** Working directory for project-local skills. */\n\tcwd: string;\n\t/** Agent config directory for global skills. */\n\tagentDir: string;\n\t/** Explicit skill paths (files or directories) */\n\tskillPaths: string[];\n\t/** Include default skills directories. */\n\tincludeDefaults: boolean;\n}\n\nexport interface LoadSkillsWithOperationsOptions extends LoadSkillsOptions {\n\toperations: ToolOperations;\n}\n\nexport class SkillLoader extends InstructionResourceLoader<Skill, SkillFrontmatter> {\n\tconstructor() {\n\t\tsuper({ resourceType: \"skill\", defaultDirectoryName: \"skills\", rootFileName: \"SKILL.md\" });\n\t}\n\n\tprotected override createResource(resource: InstructionResource): Skill {\n\t\treturn resource;\n\t}\n\n\tloadFromDir(options: LoadSkillsFromDirOptions): LoadSkillsResult {\n\t\tconst result = this.loadResourcesFromDir(options.dir, options.source);\n\t\treturn { skills: result.resources, diagnostics: result.diagnostics };\n\t}\n\n\tload(options: LoadSkillsOptions): LoadSkillsResult {\n\t\tconst result = this.loadResources({\n\t\t\tcwd: options.cwd,\n\t\t\tagentDir: options.agentDir,\n\t\t\tresourcePaths: options.skillPaths,\n\t\t\tincludeDefaults: options.includeDefaults,\n\t\t});\n\t\treturn { skills: result.resources, diagnostics: result.diagnostics };\n\t}\n\n\tasync loadWithOperations(options: LoadSkillsWithOperationsOptions): Promise<LoadSkillsResult> {\n\t\tconst result = await this.loadResourcesWithOperations({\n\t\t\tcwd: options.cwd,\n\t\t\tagentDir: options.agentDir,\n\t\t\tresourcePaths: options.skillPaths,\n\t\t\tincludeDefaults: options.includeDefaults,\n\t\t\toperations: options.operations,\n\t\t});\n\t\treturn { skills: result.resources, diagnostics: result.diagnostics };\n\t}\n}\n\nconst skillLoader = new SkillLoader();\n\n/** Load skills from a directory. */\nexport function loadSkillsFromDir(options: LoadSkillsFromDirOptions): LoadSkillsResult {\n\treturn skillLoader.loadFromDir(options);\n}\n\n/** Load skills from all configured locations. */\nexport function loadSkills(options: LoadSkillsOptions): LoadSkillsResult {\n\treturn skillLoader.load(options);\n}\n\nexport function loadSkillsWithOperations(options: LoadSkillsWithOperationsOptions): Promise<LoadSkillsResult> {\n\treturn skillLoader.loadWithOperations(options);\n}\n\n/** Format model-visible skills for inclusion in a system prompt. */\nexport function formatSkillsForPrompt(skills: Skill[]): string {\n\treturn formatInstructionResourcesForPrompt(skills, {\n\t\tintro: [\n\t\t\t\"The following skills provide specialized instructions for specific tasks.\",\n\t\t\t\"Use the read tool to load a skill's file when the task matches its description.\",\n\t\t\t\"When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\",\n\t\t],\n\t\tcontainerTag: \"available_skills\",\n\t\titemTag: \"skill\",\n\t});\n}\n"]}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AACA,OAAO,EACN,mCAAmC,EAInC,yBAAyB,GACzB,MAAM,kCAAkC,CAAC;AA6B1C,MAAM,OAAO,WAAY,SAAQ,yBAAkD;IAClF;QACC,KAAK,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5F,CAAC;IAEkB,cAAc,CAAC,QAA6B;QAC9D,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,OAAiC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,OAA0B;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;YACjC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,aAAa,EAAE,OAAO,CAAC,UAAU;YACjC,eAAe,EAAE,OAAO,CAAC,eAAe;SACxC,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAwC;QAChE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC;YACrD,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,aAAa,EAAE,OAAO,CAAC,UAAU;YACjC,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,UAAU,EAAE,OAAO,CAAC,UAAU;SAC9B,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;CACD;AAED,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,oCAAoC;AACpC,MAAM,UAAU,iBAAiB,CAAC,OAAiC;IAClE,OAAO,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,UAAU,CAAC,OAA0B;IACpD,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAwC;IAChF,OAAO,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACpD,OAAO,mCAAmC,CAAC,MAAM,EAAE;QAClD,KAAK,EAAE;YACN,2EAA2E;YAC3E,gGAAgG;YAChG,4JAA4J;SAC5J;QACD,YAAY,EAAE,kBAAkB;QAChC,OAAO,EAAE,OAAO;QAChB,eAAe,EAAE,KAAK;KACtB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { ResourceDiagnostic } from \"./diagnostics.ts\";\nimport {\n\tformatInstructionResourcesForPrompt,\n\ttype InstructionResource,\n\ttype InstructionResourceDirectoryOptions,\n\ttype InstructionResourceFrontmatter,\n\tInstructionResourceLoader,\n} from \"./instruction-resource-loader.ts\";\nimport type { ToolOperations } from \"./tools/operations.ts\";\n\nexport interface SkillFrontmatter extends InstructionResourceFrontmatter {}\n\nexport interface Skill extends InstructionResource {}\n\nexport interface LoadSkillsResult {\n\tskills: Skill[];\n\tdiagnostics: ResourceDiagnostic[];\n}\n\nexport type LoadSkillsFromDirOptions = InstructionResourceDirectoryOptions;\n\nexport interface LoadSkillsOptions {\n\t/** Working directory for project-local skills. */\n\tcwd: string;\n\t/** Agent config directory for global skills. */\n\tagentDir: string;\n\t/** Explicit skill paths (files or directories) */\n\tskillPaths: string[];\n\t/** Include default skills directories. */\n\tincludeDefaults: boolean;\n}\n\nexport interface LoadSkillsWithOperationsOptions extends LoadSkillsOptions {\n\toperations: ToolOperations;\n}\n\nexport class SkillLoader extends InstructionResourceLoader<Skill, SkillFrontmatter> {\n\tconstructor() {\n\t\tsuper({ resourceType: \"skill\", defaultDirectoryName: \"skills\", rootFileName: \"SKILL.md\" });\n\t}\n\n\tprotected override createResource(resource: InstructionResource): Skill {\n\t\treturn resource;\n\t}\n\n\tloadFromDir(options: LoadSkillsFromDirOptions): LoadSkillsResult {\n\t\tconst result = this.loadResourcesFromDir(options.dir, options.source);\n\t\treturn { skills: result.resources, diagnostics: result.diagnostics };\n\t}\n\n\tload(options: LoadSkillsOptions): LoadSkillsResult {\n\t\tconst result = this.loadResources({\n\t\t\tcwd: options.cwd,\n\t\t\tagentDir: options.agentDir,\n\t\t\tresourcePaths: options.skillPaths,\n\t\t\tincludeDefaults: options.includeDefaults,\n\t\t});\n\t\treturn { skills: result.resources, diagnostics: result.diagnostics };\n\t}\n\n\tasync loadWithOperations(options: LoadSkillsWithOperationsOptions): Promise<LoadSkillsResult> {\n\t\tconst result = await this.loadResourcesWithOperations({\n\t\t\tcwd: options.cwd,\n\t\t\tagentDir: options.agentDir,\n\t\t\tresourcePaths: options.skillPaths,\n\t\t\tincludeDefaults: options.includeDefaults,\n\t\t\toperations: options.operations,\n\t\t});\n\t\treturn { skills: result.resources, diagnostics: result.diagnostics };\n\t}\n}\n\nconst skillLoader = new SkillLoader();\n\n/** Load skills from a directory. */\nexport function loadSkillsFromDir(options: LoadSkillsFromDirOptions): LoadSkillsResult {\n\treturn skillLoader.loadFromDir(options);\n}\n\n/** Load skills from all configured locations. */\nexport function loadSkills(options: LoadSkillsOptions): LoadSkillsResult {\n\treturn skillLoader.load(options);\n}\n\nexport function loadSkillsWithOperations(options: LoadSkillsWithOperationsOptions): Promise<LoadSkillsResult> {\n\treturn skillLoader.loadWithOperations(options);\n}\n\n/** Format model-visible skills for inclusion in a system prompt. */\nexport function formatSkillsForPrompt(skills: Skill[]): string {\n\treturn formatInstructionResourcesForPrompt(skills, {\n\t\tintro: [\n\t\t\t\"The following skills provide specialized instructions for specific tasks.\",\n\t\t\t\"Use load_skill with a skill name (or an array of names) when the task matches its description.\",\n\t\t\t\"When a loaded skill references a relative path, resolve it against the skill directory reported by load_skill and use that absolute path in tool commands.\",\n\t\t],\n\t\tcontainerTag: \"available_skills\",\n\t\titemTag: \"skill\",\n\t\tincludeLocation: false,\n\t});\n}\n"]}
@@ -10,7 +10,7 @@ export interface SystemPromptContextFile {
10
10
  export interface BuildSystemPromptOptions {
11
11
  /** Custom system prompt (replaces default). */
12
12
  customPrompt?: string;
13
- /** Tools to include in prompt. Default: [read, bash, edit, write] */
13
+ /** Tools to include in prompt. Default: [read, bash, edit, write, load_skill] */
14
14
  selectedTools?: string[];
15
15
  /** Optional one-line tool snippets keyed by tool name. */
16
16
  toolSnippets?: Record<string, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAwB,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAGhE,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACxC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,YAAY,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACzC,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,wBAAwB;IACxB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;CACf;AA8HD,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAY3E"}
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAwB,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAGhE,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACxC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,YAAY,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACzC,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,wBAAwB;IACxB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;CACf;AA+HD,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAa3E"}
@@ -106,7 +106,7 @@ function finalizeSystemPrompt(prompt, options) {
106
106
  }
107
107
  prompt += "</project_context>\n";
108
108
  }
109
- if (options.hasRead && options.skills.length > 0)
109
+ if (options.hasLoadSkill && options.skills.length > 0)
110
110
  prompt += formatSkillsForPrompt(options.skills);
111
111
  if (options.hasRead && options.rules.length > 0)
112
112
  prompt += formatRulesForPrompt(options.rules);
@@ -116,7 +116,7 @@ function finalizeSystemPrompt(prompt, options) {
116
116
  }
117
117
  /** Build the system prompt with tools, guidelines, and context */
118
118
  export function buildSystemPrompt(options) {
119
- const tools = options.selectedTools || ["read", "bash", "edit", "write"];
119
+ const tools = options.selectedTools || ["read", "bash", "edit", "write", "load_skill"];
120
120
  const basePrompt = options.customPrompt || buildDefaultSystemPrompt(options, tools);
121
121
  return finalizeSystemPrompt(basePrompt, {
122
122
  appendSystemPrompt: options.appendSystemPrompt,
@@ -126,6 +126,7 @@ export function buildSystemPrompt(options) {
126
126
  skills: options.skills ?? [],
127
127
  rules: options.rules ?? [],
128
128
  hasRead: !options.selectedTools || tools.includes("read"),
129
+ hasLoadSkill: tools.includes("load_skill"),
129
130
  });
130
131
  }
131
132
  //# sourceMappingURL=system-prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * System prompt construction and project context loading\n */\n\nimport { getDocsPath, getExamplesPath, getReadmePath } from \"../config.ts\";\nimport { formatRulesForPrompt, type Rule } from \"./rules.ts\";\nimport { formatSkillsForPrompt, type Skill } from \"./skills.ts\";\n\n// grip-ignore noNearIdenticalDataStructures: System-prompt context requires loaded file content, while the interactive status fixture is display-only and permits path-only entries.\nexport interface SystemPromptContextFile {\n\tpath: string;\n\tcontent: string;\n}\n\nexport interface BuildSystemPromptOptions {\n\t/** Custom system prompt (replaces default). */\n\tcustomPrompt?: string;\n\t/** Tools to include in prompt. Default: [read, bash, edit, write] */\n\tselectedTools?: string[];\n\t/** Optional one-line tool snippets keyed by tool name. */\n\ttoolSnippets?: Record<string, string>;\n\t/** Additional guideline bullets appended to the default system prompt guidelines. */\n\tpromptGuidelines?: string[];\n\t/** Text to append to system prompt. */\n\tappendSystemPrompt?: string;\n\t/** Working directory. */\n\tcwd: string;\n\t/** Pre-loaded context files. */\n\tcontextFiles?: SystemPromptContextFile[];\n\t/** Pre-loaded skills. */\n\tskills?: Skill[];\n\t/** Pre-loaded rules. */\n\trules?: Rule[];\n}\n\ninterface SystemPromptFinalizationOptions {\n\tappendSystemPrompt?: string;\n\tpromptCwd: string;\n\tdate: string;\n\tcontextFiles: SystemPromptContextFile[];\n\tskills: Skill[];\n\trules: Rule[];\n\thasRead: boolean;\n}\n\nfunction getCurrentPromptDate(): string {\n\tconst now = new Date();\n\tconst year = now.getFullYear();\n\tconst month = String(now.getMonth() + 1).padStart(2, \"0\");\n\tconst day = String(now.getDate()).padStart(2, \"0\");\n\treturn `${year}-${month}-${day}`;\n}\n\nfunction appendUniqueGuideline(guidelines: string[], seen: Set<string>, guideline: string): void {\n\tif (seen.has(guideline)) return;\n\tseen.add(guideline);\n\tguidelines.push(guideline);\n}\n\nfunction formatPromptGuidelines(tools: string[], additionalGuidelines: string[] | undefined): string {\n\tconst guidelines: string[] = [];\n\tconst seen = new Set<string>();\n\tconst hasBash = tools.includes(\"bash\");\n\tconst hasGrep = tools.includes(\"grep\");\n\tconst hasFind = tools.includes(\"find\");\n\tconst hasLs = tools.includes(\"ls\");\n\tif (hasBash && !hasGrep && !hasFind && !hasLs) {\n\t\tappendUniqueGuideline(guidelines, seen, \"Use bash for file operations like ls, rg, find\");\n\t} else if (hasBash && (hasGrep || hasFind || hasLs)) {\n\t\tappendUniqueGuideline(\n\t\t\tguidelines,\n\t\t\tseen,\n\t\t\t\"Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore)\",\n\t\t);\n\t}\n\tfor (const guideline of additionalGuidelines ?? []) {\n\t\tconst normalized = guideline.trim();\n\t\tif (normalized.length > 0) appendUniqueGuideline(guidelines, seen, normalized);\n\t}\n\tappendUniqueGuideline(guidelines, seen, \"Be concise in your responses\");\n\tappendUniqueGuideline(guidelines, seen, \"Show file paths clearly when working with files\");\n\treturn guidelines.map((guideline) => `- ${guideline}`).join(\"\\n\");\n}\n\nfunction formatAvailableTools(tools: string[], toolSnippets: Record<string, string> | undefined): string {\n\tconst visibleTools = tools.filter((name) => !!toolSnippets?.[name]);\n\treturn visibleTools.length > 0\n\t\t? visibleTools.map((name) => `- ${name}: ${toolSnippets![name]}`).join(\"\\n\")\n\t\t: \"(none)\";\n}\n\nfunction buildOrchestrationSection(hasSubagent: boolean): string {\n\tif (!hasSubagent) return \"\";\n\treturn `\n\t\t\t## Orchestration\n\nYou are the primary agent and final decision-maker. Use subagents as isolated workers for focused investigation, implementation alternatives, and independent review when delegation improves speed or confidence.\n\nGive each subagent a precise task and expected response format. Treat its output as evidence, not authority: reconcile conflicting findings, verify important claims against source or tests, and integrate the final result yourself.\n\nWork directly when delegation would cost more than completing the task. Do not delegate responsibility for the final answer.\n\t\t `.trim();\n}\n\nfunction buildDefaultSystemPrompt(options: BuildSystemPromptOptions, tools: string[]): string {\n\tconst toolsList = formatAvailableTools(tools, options.toolSnippets);\n\tconst guidelines = formatPromptGuidelines(tools, options.promptGuidelines);\n\tconst orchestrationSection = buildOrchestrationSection(tools.includes(\"subagent\"));\n\tconst stateCompressionSection = tools.includes(\"compress_context\")\n\t\t? `## State compression\nConsider compress_context at concrete checkpoints: when the user switches tasks, an investigation has yielded stable findings, an implementation slice is complete, or validation has finished and its raw logs are no longer needed. If older tool output or intermediate reasoning can be replaced by a concise account of decisions and current state, compress before starting the next slice; do not wait for a context percentage or an explicit request. Keep the active work and details needed for the next step intact. Do not compress a trivial exchange or interrupt an ongoing investigation, edit, or test.\n\nThe primary agent does not receive a context-utilization percentage. A background detector may send an advisory with an urgency score; treat it as a cue to evaluate the next safe checkpoint, not an instruction to compress immediately.\n\nYou receive model-only context metadata after user messages and completed tool-call batches, with session entry IDs but no utilization estimate. Use a user or assistant tool-call entry ID as a compression cut point; tool-result IDs are for lookup, not cuts. Do not repeat this metadata to the user.\n\nTurn batches of reads, searches, builds, and tests into concise state: findings and decisions, changed files, what passed or failed (including relevant errors), unresolved issues, and concrete next steps. Preserve important user instructions and constraints. Omit redundant tool output rather than carrying it forward.\n\nChoose a cut point from the entry IDs already visible in context metadata. Pass startEntryId and a summary to replace through the current tail, or add inclusive endEntryId to replace an older bounded range while retaining later messages. Never split a tool call from its results. Detector-suggested IDs are advisory; verify the range yourself before acting. Do not send a list of IDs. Call compress_context alone, not alongside other tools. session_search defaults to current model context; scope: branch/all retrieves historical entries for reference, not necessarily valid compression cut points.`\n\t\t: \"\";\n\tconst readmePath = getReadmePath();\n\tconst docsPath = getDocsPath();\n\tconst examplesPath = getExamplesPath();\n\treturn `You are an expert coding assistant operating inside grip, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.\nAvailable tools:\n${toolsList}\n\nIn addition to the tools above, you may have access to other custom tools depending on the project.\n${orchestrationSection ? `\\n${orchestrationSection}\\n` : \"\"}${stateCompressionSection ? `\\n${stateCompressionSection}\\n` : \"\"}\nGuidelines:\n${guidelines}\n\nGrip documentation (read only when the user asks about grip itself, its SDK, extensions, themes, skills, or TUI):\n- Main documentation: ${readmePath}\n- Additional docs: ${docsPath}\n- Examples: ${examplesPath} (extensions, custom tools, SDK)\n- When reading grip docs or examples, resolve docs/... under Additional docs and examples/... under Examples, not the current working directory\n- When asked about: extensions (docs/extensions.md, examples/extensions/), themes (docs/themes.md), skills (docs/skills.md), prompt templates (docs/prompt-templates.md), type TUI components (docs/tui.md), keybindings (docs/keybindings.md), SDK integrations (docs/sdk.md), custom providers (docs/custom-provider.md), adding models (docs/models.md), grip packages (docs/packages.md)\n- When working on grip topics, read the docs and examples, and follow .md cross-references before implementing\n- Always read grip .md files completely and follow links to related docs (e.g., tui.md for TUI API details)`;\n}\n\nfunction finalizeSystemPrompt(prompt: string, options: SystemPromptFinalizationOptions): string {\n\tif (options.appendSystemPrompt) prompt += `\\n\\n${options.appendSystemPrompt}`;\n\tif (options.contextFiles.length > 0) {\n\t\tprompt += \"\\n\\n<project_context>\\n\\n\";\n\t\tprompt += \"Project-specific instructions and guidelines:\\n\\n\";\n\t\tfor (const { path, content } of options.contextFiles) {\n\t\t\tprompt += `<project_instructions path=\"${path}\">\\n${content}\\n</project_instructions>\\n\\n`;\n\t\t}\n\t\tprompt += \"</project_context>\\n\";\n\t}\n\tif (options.hasRead && options.skills.length > 0) prompt += formatSkillsForPrompt(options.skills);\n\tif (options.hasRead && options.rules.length > 0) prompt += formatRulesForPrompt(options.rules);\n\tprompt += `\\nCurrent date: ${options.date}`;\n\tprompt += `\\nCurrent working directory: ${options.promptCwd}`;\n\treturn prompt;\n}\n\n/** Build the system prompt with tools, guidelines, and context */\nexport function buildSystemPrompt(options: BuildSystemPromptOptions): string {\n\tconst tools = options.selectedTools || [\"read\", \"bash\", \"edit\", \"write\"];\n\tconst basePrompt = options.customPrompt || buildDefaultSystemPrompt(options, tools);\n\treturn finalizeSystemPrompt(basePrompt, {\n\t\tappendSystemPrompt: options.appendSystemPrompt,\n\t\tpromptCwd: options.cwd.replace(/\\\\/g, \"/\"),\n\t\tdate: getCurrentPromptDate(),\n\t\tcontextFiles: options.contextFiles ?? [],\n\t\tskills: options.skills ?? [],\n\t\trules: options.rules ?? [],\n\t\thasRead: !options.selectedTools || tools.includes(\"read\"),\n\t});\n}\n"]}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * System prompt construction and project context loading\n */\n\nimport { getDocsPath, getExamplesPath, getReadmePath } from \"../config.ts\";\nimport { formatRulesForPrompt, type Rule } from \"./rules.ts\";\nimport { formatSkillsForPrompt, type Skill } from \"./skills.ts\";\n\n// grip-ignore noNearIdenticalDataStructures: System-prompt context requires loaded file content, while the interactive status fixture is display-only and permits path-only entries.\nexport interface SystemPromptContextFile {\n\tpath: string;\n\tcontent: string;\n}\n\nexport interface BuildSystemPromptOptions {\n\t/** Custom system prompt (replaces default). */\n\tcustomPrompt?: string;\n\t/** Tools to include in prompt. Default: [read, bash, edit, write, load_skill] */\n\tselectedTools?: string[];\n\t/** Optional one-line tool snippets keyed by tool name. */\n\ttoolSnippets?: Record<string, string>;\n\t/** Additional guideline bullets appended to the default system prompt guidelines. */\n\tpromptGuidelines?: string[];\n\t/** Text to append to system prompt. */\n\tappendSystemPrompt?: string;\n\t/** Working directory. */\n\tcwd: string;\n\t/** Pre-loaded context files. */\n\tcontextFiles?: SystemPromptContextFile[];\n\t/** Pre-loaded skills. */\n\tskills?: Skill[];\n\t/** Pre-loaded rules. */\n\trules?: Rule[];\n}\n\ninterface SystemPromptFinalizationOptions {\n\tappendSystemPrompt?: string;\n\tpromptCwd: string;\n\tdate: string;\n\tcontextFiles: SystemPromptContextFile[];\n\tskills: Skill[];\n\trules: Rule[];\n\thasRead: boolean;\n\thasLoadSkill: boolean;\n}\n\nfunction getCurrentPromptDate(): string {\n\tconst now = new Date();\n\tconst year = now.getFullYear();\n\tconst month = String(now.getMonth() + 1).padStart(2, \"0\");\n\tconst day = String(now.getDate()).padStart(2, \"0\");\n\treturn `${year}-${month}-${day}`;\n}\n\nfunction appendUniqueGuideline(guidelines: string[], seen: Set<string>, guideline: string): void {\n\tif (seen.has(guideline)) return;\n\tseen.add(guideline);\n\tguidelines.push(guideline);\n}\n\nfunction formatPromptGuidelines(tools: string[], additionalGuidelines: string[] | undefined): string {\n\tconst guidelines: string[] = [];\n\tconst seen = new Set<string>();\n\tconst hasBash = tools.includes(\"bash\");\n\tconst hasGrep = tools.includes(\"grep\");\n\tconst hasFind = tools.includes(\"find\");\n\tconst hasLs = tools.includes(\"ls\");\n\tif (hasBash && !hasGrep && !hasFind && !hasLs) {\n\t\tappendUniqueGuideline(guidelines, seen, \"Use bash for file operations like ls, rg, find\");\n\t} else if (hasBash && (hasGrep || hasFind || hasLs)) {\n\t\tappendUniqueGuideline(\n\t\t\tguidelines,\n\t\t\tseen,\n\t\t\t\"Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore)\",\n\t\t);\n\t}\n\tfor (const guideline of additionalGuidelines ?? []) {\n\t\tconst normalized = guideline.trim();\n\t\tif (normalized.length > 0) appendUniqueGuideline(guidelines, seen, normalized);\n\t}\n\tappendUniqueGuideline(guidelines, seen, \"Be concise in your responses\");\n\tappendUniqueGuideline(guidelines, seen, \"Show file paths clearly when working with files\");\n\treturn guidelines.map((guideline) => `- ${guideline}`).join(\"\\n\");\n}\n\nfunction formatAvailableTools(tools: string[], toolSnippets: Record<string, string> | undefined): string {\n\tconst visibleTools = tools.filter((name) => !!toolSnippets?.[name]);\n\treturn visibleTools.length > 0\n\t\t? visibleTools.map((name) => `- ${name}: ${toolSnippets![name]}`).join(\"\\n\")\n\t\t: \"(none)\";\n}\n\nfunction buildOrchestrationSection(hasSubagent: boolean): string {\n\tif (!hasSubagent) return \"\";\n\treturn `\n\t\t\t## Orchestration\n\nYou are the primary agent and final decision-maker. Use subagents as isolated workers for focused investigation, implementation alternatives, and independent review when delegation improves speed or confidence.\n\nGive each subagent a precise task and expected response format. Treat its output as evidence, not authority: reconcile conflicting findings, verify important claims against source or tests, and integrate the final result yourself.\n\nWork directly when delegation would cost more than completing the task. Do not delegate responsibility for the final answer.\n\t\t `.trim();\n}\n\nfunction buildDefaultSystemPrompt(options: BuildSystemPromptOptions, tools: string[]): string {\n\tconst toolsList = formatAvailableTools(tools, options.toolSnippets);\n\tconst guidelines = formatPromptGuidelines(tools, options.promptGuidelines);\n\tconst orchestrationSection = buildOrchestrationSection(tools.includes(\"subagent\"));\n\tconst stateCompressionSection = tools.includes(\"compress_context\")\n\t\t? `## State compression\nConsider compress_context at concrete checkpoints: when the user switches tasks, an investigation has yielded stable findings, an implementation slice is complete, or validation has finished and its raw logs are no longer needed. If older tool output or intermediate reasoning can be replaced by a concise account of decisions and current state, compress before starting the next slice; do not wait for a context percentage or an explicit request. Keep the active work and details needed for the next step intact. Do not compress a trivial exchange or interrupt an ongoing investigation, edit, or test.\n\nThe primary agent does not receive a context-utilization percentage. A background detector may send an advisory with an urgency score; treat it as a cue to evaluate the next safe checkpoint, not an instruction to compress immediately.\n\nYou receive model-only context metadata after user messages and completed tool-call batches, with session entry IDs but no utilization estimate. Use a user or assistant tool-call entry ID as a compression cut point; tool-result IDs are for lookup, not cuts. Do not repeat this metadata to the user.\n\nTurn batches of reads, searches, builds, and tests into concise state: findings and decisions, changed files, what passed or failed (including relevant errors), unresolved issues, and concrete next steps. Preserve important user instructions and constraints. Omit redundant tool output rather than carrying it forward.\n\nChoose a cut point from the entry IDs already visible in context metadata. Pass startEntryId and a summary to replace through the current tail, or add inclusive endEntryId to replace an older bounded range while retaining later messages. Never split a tool call from its results. Detector-suggested IDs are advisory; verify the range yourself before acting. Do not send a list of IDs. Call compress_context alone, not alongside other tools. session_search defaults to current model context; scope: branch/all retrieves historical entries for reference, not necessarily valid compression cut points.`\n\t\t: \"\";\n\tconst readmePath = getReadmePath();\n\tconst docsPath = getDocsPath();\n\tconst examplesPath = getExamplesPath();\n\treturn `You are an expert coding assistant operating inside grip, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.\nAvailable tools:\n${toolsList}\n\nIn addition to the tools above, you may have access to other custom tools depending on the project.\n${orchestrationSection ? `\\n${orchestrationSection}\\n` : \"\"}${stateCompressionSection ? `\\n${stateCompressionSection}\\n` : \"\"}\nGuidelines:\n${guidelines}\n\nGrip documentation (read only when the user asks about grip itself, its SDK, extensions, themes, skills, or TUI):\n- Main documentation: ${readmePath}\n- Additional docs: ${docsPath}\n- Examples: ${examplesPath} (extensions, custom tools, SDK)\n- When reading grip docs or examples, resolve docs/... under Additional docs and examples/... under Examples, not the current working directory\n- When asked about: extensions (docs/extensions.md, examples/extensions/), themes (docs/themes.md), skills (docs/skills.md), prompt templates (docs/prompt-templates.md), type TUI components (docs/tui.md), keybindings (docs/keybindings.md), SDK integrations (docs/sdk.md), custom providers (docs/custom-provider.md), adding models (docs/models.md), grip packages (docs/packages.md)\n- When working on grip topics, read the docs and examples, and follow .md cross-references before implementing\n- Always read grip .md files completely and follow links to related docs (e.g., tui.md for TUI API details)`;\n}\n\nfunction finalizeSystemPrompt(prompt: string, options: SystemPromptFinalizationOptions): string {\n\tif (options.appendSystemPrompt) prompt += `\\n\\n${options.appendSystemPrompt}`;\n\tif (options.contextFiles.length > 0) {\n\t\tprompt += \"\\n\\n<project_context>\\n\\n\";\n\t\tprompt += \"Project-specific instructions and guidelines:\\n\\n\";\n\t\tfor (const { path, content } of options.contextFiles) {\n\t\t\tprompt += `<project_instructions path=\"${path}\">\\n${content}\\n</project_instructions>\\n\\n`;\n\t\t}\n\t\tprompt += \"</project_context>\\n\";\n\t}\n\tif (options.hasLoadSkill && options.skills.length > 0) prompt += formatSkillsForPrompt(options.skills);\n\tif (options.hasRead && options.rules.length > 0) prompt += formatRulesForPrompt(options.rules);\n\tprompt += `\\nCurrent date: ${options.date}`;\n\tprompt += `\\nCurrent working directory: ${options.promptCwd}`;\n\treturn prompt;\n}\n\n/** Build the system prompt with tools, guidelines, and context */\nexport function buildSystemPrompt(options: BuildSystemPromptOptions): string {\n\tconst tools = options.selectedTools || [\"read\", \"bash\", \"edit\", \"write\", \"load_skill\"];\n\tconst basePrompt = options.customPrompt || buildDefaultSystemPrompt(options, tools);\n\treturn finalizeSystemPrompt(basePrompt, {\n\t\tappendSystemPrompt: options.appendSystemPrompt,\n\t\tpromptCwd: options.cwd.replace(/\\\\/g, \"/\"),\n\t\tdate: getCurrentPromptDate(),\n\t\tcontextFiles: options.contextFiles ?? [],\n\t\tskills: options.skills ?? [],\n\t\trules: options.rules ?? [],\n\t\thasRead: !options.selectedTools || tools.includes(\"read\"),\n\t\thasLoadSkill: tools.includes(\"load_skill\"),\n\t});\n}\n"]}
@@ -6,6 +6,7 @@ import { type TruncationResult } from "./truncate.ts";
6
6
  declare const bashSchema: Type.TObject<{
7
7
  command: Type.TString;
8
8
  timeout: Type.TOptional<Type.TNumber>;
9
+ output_mode: Type.TOptional<Type.TUnion<[Type.TLiteral<"always">, Type.TLiteral<"on_fail">, Type.TLiteral<"never">]>>;
9
10
  }>;
10
11
  export type BashToolInput = Static<typeof bashSchema>;
11
12
  export interface BashToolDetails {
@@ -1 +1 @@
1
- {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/core/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,4BAA4B,CAAC;AAE7E,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAK5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AACxG,OAAO,EAEN,KAAK,sBAAsB,EAG3B,KAAK,cAAc,EACnB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAoD,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAExG,QAAA,MAAM,UAAU;;;EAGd,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,0BAA0B,GAAG,cAAc,CAE9F;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,gBAAgB,CAAC;AAE5E,MAAM,MAAM,sBAAsB,GAAG,sBAAsB,CAAC;AAE5D,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAAG,sBAAsB,CAanG;AAgBD,MAAM,WAAW,eAAe;IAC/B,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2DAA2D;IAC3D,SAAS,CAAC,EAAE,aAAa,CAAC;CAC1B;AAKD,KAAK,eAAe,GAAG;IACtB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;CACrC,CAAC;AAoKF,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,EAAE,eAAe,CAAC,CAAC;AAEjH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,kBAAkB,CAiKlH;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAElH"}
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/core/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,4BAA4B,CAAC;AAE7E,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAK5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AACxG,OAAO,EAEN,KAAK,sBAAsB,EAG3B,KAAK,cAAc,EACnB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAoD,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAExG,QAAA,MAAM,UAAU;;;;EASd,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,0BAA0B,GAAG,cAAc,CAE9F;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,gBAAgB,CAAC;AAE5E,MAAM,MAAM,sBAAsB,GAAG,sBAAsB,CAAC;AAE5D,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAAG,sBAAsB,CAanG;AAgBD,MAAM,WAAW,eAAe;IAC/B,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,2DAA2D;IAC3D,SAAS,CAAC,EAAE,aAAa,CAAC;CAC1B;AAKD,KAAK,eAAe,GAAG;IACtB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;CACrC,CAAC;AAoKF,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,EAAE,eAAe,CAAC,CAAC;AAEjH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,kBAAkB,CAkKlH;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAElH"}