@kilnai/core 0.10.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/engine/domain/eval-config.d.ts +2 -1
  2. package/dist/engine/domain/eval-config.d.ts.map +1 -1
  3. package/dist/engine/domain/eval-config.js +9 -0
  4. package/dist/engine/domain/eval-config.js.map +1 -1
  5. package/dist/engine/domain/integration.d.ts +50 -0
  6. package/dist/engine/domain/integration.d.ts.map +1 -0
  7. package/dist/engine/domain/integration.js +4 -0
  8. package/dist/engine/domain/integration.js.map +1 -0
  9. package/dist/engine/domain/knowledge-source.d.ts +5 -1
  10. package/dist/engine/domain/knowledge-source.d.ts.map +1 -1
  11. package/dist/engine/error-catalog.d.ts.map +1 -1
  12. package/dist/engine/error-catalog.js +23 -2
  13. package/dist/engine/error-catalog.js.map +1 -1
  14. package/dist/engine/errors.d.ts +1 -1
  15. package/dist/engine/errors.d.ts.map +1 -1
  16. package/dist/engine/errors.js.map +1 -1
  17. package/dist/engine/gateway/conversation-event.d.ts +9 -1
  18. package/dist/engine/gateway/conversation-event.d.ts.map +1 -1
  19. package/dist/engine/gateway/tenant-config.d.ts +22 -0
  20. package/dist/engine/gateway/tenant-config.d.ts.map +1 -1
  21. package/dist/engine/gateway/tenant-config.js +58 -0
  22. package/dist/engine/gateway/tenant-config.js.map +1 -1
  23. package/dist/engine/index.d.ts +3 -2
  24. package/dist/engine/index.d.ts.map +1 -1
  25. package/dist/engine/index.js.map +1 -1
  26. package/dist/eval/consistency-runner.d.ts +28 -0
  27. package/dist/eval/consistency-runner.d.ts.map +1 -0
  28. package/dist/eval/consistency-runner.js +43 -0
  29. package/dist/eval/consistency-runner.js.map +1 -0
  30. package/dist/eval/experiment-runner.d.ts.map +1 -1
  31. package/dist/eval/experiment-runner.js +1 -0
  32. package/dist/eval/experiment-runner.js.map +1 -1
  33. package/dist/eval/index.d.ts +13 -0
  34. package/dist/eval/index.d.ts.map +1 -1
  35. package/dist/eval/index.js +12 -0
  36. package/dist/eval/index.js.map +1 -1
  37. package/dist/eval/scorer-factory.d.ts.map +1 -1
  38. package/dist/eval/scorer-factory.js +33 -0
  39. package/dist/eval/scorer-factory.js.map +1 -1
  40. package/dist/eval/scorers/context-relevance-scorer.d.ts +8 -0
  41. package/dist/eval/scorers/context-relevance-scorer.d.ts.map +1 -0
  42. package/dist/eval/scorers/context-relevance-scorer.js +32 -0
  43. package/dist/eval/scorers/context-relevance-scorer.js.map +1 -0
  44. package/dist/eval/scorers/effort-scorer.d.ts +6 -0
  45. package/dist/eval/scorers/effort-scorer.d.ts.map +1 -0
  46. package/dist/eval/scorers/effort-scorer.js +15 -0
  47. package/dist/eval/scorers/effort-scorer.js.map +1 -0
  48. package/dist/eval/scorers/handoff-quality-scorer.d.ts +8 -0
  49. package/dist/eval/scorers/handoff-quality-scorer.d.ts.map +1 -0
  50. package/dist/eval/scorers/handoff-quality-scorer.js +65 -0
  51. package/dist/eval/scorers/handoff-quality-scorer.js.map +1 -0
  52. package/dist/eval/scorers/milestone-scorer.d.ts +6 -0
  53. package/dist/eval/scorers/milestone-scorer.d.ts.map +1 -0
  54. package/dist/eval/scorers/milestone-scorer.js +35 -0
  55. package/dist/eval/scorers/milestone-scorer.js.map +1 -0
  56. package/dist/eval/scorers/multi-turn-consistency-scorer.d.ts +8 -0
  57. package/dist/eval/scorers/multi-turn-consistency-scorer.d.ts.map +1 -0
  58. package/dist/eval/scorers/multi-turn-consistency-scorer.js +55 -0
  59. package/dist/eval/scorers/multi-turn-consistency-scorer.js.map +1 -0
  60. package/dist/eval/scorers/policy-adherence-scorer.d.ts +9 -0
  61. package/dist/eval/scorers/policy-adherence-scorer.d.ts.map +1 -0
  62. package/dist/eval/scorers/policy-adherence-scorer.js +34 -0
  63. package/dist/eval/scorers/policy-adherence-scorer.js.map +1 -0
  64. package/dist/eval/scorers/resolution-scorer.d.ts +6 -0
  65. package/dist/eval/scorers/resolution-scorer.d.ts.map +1 -0
  66. package/dist/eval/scorers/resolution-scorer.js +25 -0
  67. package/dist/eval/scorers/resolution-scorer.js.map +1 -0
  68. package/dist/eval/scorers/routing-accuracy-scorer.d.ts +6 -0
  69. package/dist/eval/scorers/routing-accuracy-scorer.d.ts.map +1 -0
  70. package/dist/eval/scorers/routing-accuracy-scorer.js +19 -0
  71. package/dist/eval/scorers/routing-accuracy-scorer.js.map +1 -0
  72. package/dist/eval/scorers/safety-preservation-scorer.d.ts +9 -0
  73. package/dist/eval/scorers/safety-preservation-scorer.d.ts.map +1 -0
  74. package/dist/eval/scorers/safety-preservation-scorer.js +54 -0
  75. package/dist/eval/scorers/safety-preservation-scorer.js.map +1 -0
  76. package/dist/eval/scorers/tool-calling-accuracy-scorer.d.ts +6 -0
  77. package/dist/eval/scorers/tool-calling-accuracy-scorer.d.ts.map +1 -0
  78. package/dist/eval/scorers/tool-calling-accuracy-scorer.js +81 -0
  79. package/dist/eval/scorers/tool-calling-accuracy-scorer.js.map +1 -0
  80. package/dist/eval/scorers/tool-trajectory-scorer.d.ts +8 -0
  81. package/dist/eval/scorers/tool-trajectory-scorer.d.ts.map +1 -0
  82. package/dist/eval/scorers/tool-trajectory-scorer.js +51 -0
  83. package/dist/eval/scorers/tool-trajectory-scorer.js.map +1 -0
  84. package/dist/eval/types.d.ts +1 -0
  85. package/dist/eval/types.d.ts.map +1 -1
  86. package/dist/events/index.d.ts +11 -1
  87. package/dist/events/index.d.ts.map +1 -1
  88. package/dist/events/index.js +1 -0
  89. package/dist/events/index.js.map +1 -1
  90. package/dist/index.d.ts +3 -2
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js.map +1 -1
  93. package/dist/knowledge/infrastructure/composite-extractor.d.ts +2 -2
  94. package/dist/knowledge/infrastructure/composite-extractor.d.ts.map +1 -1
  95. package/dist/knowledge/infrastructure/composite-extractor.js +2 -2
  96. package/dist/knowledge/infrastructure/composite-extractor.js.map +1 -1
  97. package/dist/knowledge/infrastructure/file-extractor.d.ts +2 -2
  98. package/dist/knowledge/infrastructure/file-extractor.d.ts.map +1 -1
  99. package/dist/knowledge/infrastructure/file-extractor.js +1 -1
  100. package/dist/knowledge/infrastructure/file-extractor.js.map +1 -1
  101. package/dist/knowledge/infrastructure/pdf-extractor.d.ts +2 -2
  102. package/dist/knowledge/infrastructure/pdf-extractor.d.ts.map +1 -1
  103. package/dist/knowledge/infrastructure/pdf-extractor.js +4 -2
  104. package/dist/knowledge/infrastructure/pdf-extractor.js.map +1 -1
  105. package/dist/knowledge/infrastructure/url-extractor.d.ts +2 -2
  106. package/dist/knowledge/infrastructure/url-extractor.d.ts.map +1 -1
  107. package/dist/knowledge/infrastructure/url-extractor.js +5 -3
  108. package/dist/knowledge/infrastructure/url-extractor.js.map +1 -1
  109. package/dist/knowledge/source-manager.d.ts +2 -0
  110. package/dist/knowledge/source-manager.d.ts.map +1 -1
  111. package/dist/knowledge/source-manager.js +54 -1
  112. package/dist/knowledge/source-manager.js.map +1 -1
  113. package/dist/observability/span-mapper.d.ts.map +1 -1
  114. package/dist/observability/span-mapper.js +15 -0
  115. package/dist/observability/span-mapper.js.map +1 -1
  116. package/dist/package/yaml-parser.d.ts.map +1 -1
  117. package/dist/package/yaml-parser.js +1 -0
  118. package/dist/package/yaml-parser.js.map +1 -1
  119. package/dist/skill/index.d.ts +2 -4
  120. package/dist/skill/index.d.ts.map +1 -1
  121. package/dist/skill/index.js +1 -2
  122. package/dist/skill/index.js.map +1 -1
  123. package/dist/skill/md-parser.d.ts +21 -0
  124. package/dist/skill/md-parser.d.ts.map +1 -0
  125. package/dist/skill/md-parser.js +168 -0
  126. package/dist/skill/md-parser.js.map +1 -0
  127. package/dist/skill/skill-registry.d.ts +16 -8
  128. package/dist/skill/skill-registry.d.ts.map +1 -1
  129. package/dist/skill/skill-registry.js +77 -30
  130. package/dist/skill/skill-registry.js.map +1 -1
  131. package/dist/skill/types.d.ts +7 -3
  132. package/dist/skill/types.d.ts.map +1 -1
  133. package/package.json +1 -1
  134. package/dist/skill/yaml-parser.d.ts +0 -18
  135. package/dist/skill/yaml-parser.d.ts.map +0 -1
  136. package/dist/skill/yaml-parser.js +0 -61
  137. package/dist/skill/yaml-parser.js.map +0 -1
  138. package/dist/skill/yaml-schema.d.ts +0 -20
  139. package/dist/skill/yaml-schema.d.ts.map +0 -1
  140. package/dist/skill/yaml-schema.js +0 -80
  141. package/dist/skill/yaml-schema.js.map +0 -1
@@ -0,0 +1,168 @@
1
+ import { parse } from "yaml";
2
+ import { readFileSync } from "node:fs";
3
+ import { KilnError } from "../engine/errors.js";
4
+ import { EVENT_LEVEL_MAP } from "../events/index.js";
5
+ const VALID_EVENT_TYPES = new Set(Object.keys(EVENT_LEVEL_MAP));
6
+ const FRONTMATTER_DELIMITER = "---";
7
+ export class SkillMdError extends KilnError {
8
+ errors;
9
+ filePath;
10
+ constructor(errors, filePath) {
11
+ const msg = errors.map((e) => ` ${e.field}: ${e.message}`).join("\n");
12
+ super("SKILL_MD_INVALID", `Invalid SKILL.md${filePath ? ` (${filePath})` : ""}:\n${msg}`, {
13
+ context: { errors, filePath },
14
+ retryable: false,
15
+ });
16
+ this.name = "SkillMdError";
17
+ this.errors = errors;
18
+ this.filePath = filePath;
19
+ }
20
+ }
21
+ /** Split SKILL.md content into frontmatter YAML and markdown body */
22
+ function splitFrontmatter(content) {
23
+ const trimmed = content.trimStart();
24
+ if (!trimmed.startsWith(FRONTMATTER_DELIMITER)) {
25
+ return { frontmatter: "", body: content };
26
+ }
27
+ const afterFirst = trimmed.slice(FRONTMATTER_DELIMITER.length);
28
+ const endIndex = afterFirst.indexOf(`\n${FRONTMATTER_DELIMITER}`);
29
+ if (endIndex === -1) {
30
+ return { frontmatter: "", body: content };
31
+ }
32
+ const frontmatter = afterFirst.slice(0, endIndex).trim();
33
+ const bodyStart = endIndex + 1 + FRONTMATTER_DELIMITER.length;
34
+ const body = afterFirst.slice(bodyStart).trim();
35
+ return { frontmatter, body };
36
+ }
37
+ /** Validate frontmatter object and return errors */
38
+ function validateFrontmatter(data) {
39
+ const errors = [];
40
+ if (typeof data !== "object" || data === null || Array.isArray(data)) {
41
+ errors.push({ field: "(root)", message: "Frontmatter must be a YAML object" });
42
+ return errors;
43
+ }
44
+ const obj = data;
45
+ // Required: name, description
46
+ if (!("name" in obj) || typeof obj.name !== "string" || obj.name.trim() === "") {
47
+ errors.push({ field: "name", message: "Required string field" });
48
+ }
49
+ if (!("description" in obj) || typeof obj.description !== "string" || obj.description.trim() === "") {
50
+ errors.push({ field: "description", message: "Required string field" });
51
+ }
52
+ // Optional: handler (string)
53
+ if ("handler" in obj && typeof obj.handler !== "string") {
54
+ errors.push({ field: "handler", message: `Expected string, got ${typeof obj.handler}` });
55
+ }
56
+ // Optional: tools (string[])
57
+ if ("tools" in obj) {
58
+ if (!Array.isArray(obj.tools)) {
59
+ errors.push({ field: "tools", message: `Expected array, got ${typeof obj.tools}` });
60
+ }
61
+ else {
62
+ for (let i = 0; i < obj.tools.length; i++) {
63
+ if (typeof obj.tools[i] !== "string") {
64
+ errors.push({ field: `tools[${i}]`, message: `Expected string, got ${typeof obj.tools[i]}` });
65
+ }
66
+ }
67
+ }
68
+ }
69
+ // Optional: tags (string[])
70
+ if ("tags" in obj) {
71
+ if (!Array.isArray(obj.tags)) {
72
+ errors.push({ field: "tags", message: `Expected array, got ${typeof obj.tags}` });
73
+ }
74
+ else {
75
+ for (let i = 0; i < obj.tags.length; i++) {
76
+ if (typeof obj.tags[i] !== "string") {
77
+ errors.push({ field: `tags[${i}]`, message: `Expected string, got ${typeof obj.tags[i]}` });
78
+ }
79
+ }
80
+ }
81
+ }
82
+ // Optional: triggers (array of {event, filter?})
83
+ if ("triggers" in obj) {
84
+ if (!Array.isArray(obj.triggers)) {
85
+ errors.push({ field: "triggers", message: `Expected array, got ${typeof obj.triggers}` });
86
+ }
87
+ else {
88
+ for (let i = 0; i < obj.triggers.length; i++) {
89
+ const trigger = obj.triggers[i];
90
+ if (typeof trigger !== "object" || trigger === null || Array.isArray(trigger)) {
91
+ errors.push({ field: `triggers[${i}]`, message: "Expected an object" });
92
+ }
93
+ else {
94
+ const t = trigger;
95
+ if (!("event" in t) || typeof t.event !== "string") {
96
+ errors.push({ field: `triggers[${i}].event`, message: "Required string field" });
97
+ }
98
+ }
99
+ }
100
+ }
101
+ }
102
+ return errors;
103
+ }
104
+ /** Build SkillIndex from validated frontmatter */
105
+ function buildIndex(obj, filePath) {
106
+ const rawTriggers = obj.triggers ?? [];
107
+ // Validate event types
108
+ const triggerErrors = [];
109
+ for (let i = 0; i < rawTriggers.length; i++) {
110
+ const event = rawTriggers[i].event;
111
+ if (!VALID_EVENT_TYPES.has(event)) {
112
+ triggerErrors.push({ field: `triggers[${i}].event`, message: `Unknown event type "${event}"` });
113
+ }
114
+ }
115
+ if (triggerErrors.length > 0)
116
+ throw new SkillMdError(triggerErrors, filePath);
117
+ return {
118
+ name: obj.name,
119
+ description: obj.description,
120
+ tools: obj.tools ?? [],
121
+ triggers: rawTriggers.map((t) => ({
122
+ event: t.event,
123
+ ...(t.filter !== undefined ? { filter: t.filter } : {}),
124
+ })),
125
+ tags: obj.tags ?? [],
126
+ ...(obj.handler !== undefined ? { handler: obj.handler } : {}),
127
+ filePath,
128
+ };
129
+ }
130
+ /** Parse SKILL.md content into a full SkillConfig (frontmatter + body) */
131
+ export function parseSkillMd(content, filePath = "") {
132
+ const { frontmatter, body } = splitFrontmatter(content);
133
+ if (!frontmatter) {
134
+ throw new SkillMdError([{ field: "(root)", message: "Missing YAML frontmatter (wrap in --- delimiters)" }], filePath);
135
+ }
136
+ const data = parse(frontmatter);
137
+ const errors = validateFrontmatter(data);
138
+ if (errors.length > 0)
139
+ throw new SkillMdError(errors, filePath);
140
+ if (!body) {
141
+ throw new SkillMdError([{ field: "body", message: "Missing markdown body (instructions)" }], filePath);
142
+ }
143
+ const index = buildIndex(data, filePath);
144
+ return { ...index, instructions: body };
145
+ }
146
+ /** Parse only the frontmatter of a SKILL.md file (index-only, skips body) */
147
+ export function parseSkillMdIndex(content, filePath = "") {
148
+ const { frontmatter } = splitFrontmatter(content);
149
+ if (!frontmatter) {
150
+ throw new SkillMdError([{ field: "(root)", message: "Missing YAML frontmatter (wrap in --- delimiters)" }], filePath);
151
+ }
152
+ const data = parse(frontmatter);
153
+ const errors = validateFrontmatter(data);
154
+ if (errors.length > 0)
155
+ throw new SkillMdError(errors, filePath);
156
+ return buildIndex(data, filePath);
157
+ }
158
+ /** Read a SKILL.md file from disk and parse into full SkillConfig */
159
+ export function loadSkillMd(filePath) {
160
+ const content = readFileSync(filePath, "utf-8");
161
+ return parseSkillMd(content, filePath);
162
+ }
163
+ /** Read a SKILL.md file from disk and parse only the index (frontmatter) */
164
+ export function loadSkillMdIndex(filePath) {
165
+ const content = readFileSync(filePath, "utf-8");
166
+ return parseSkillMdIndex(content, filePath);
167
+ }
168
+ //# sourceMappingURL=md-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md-parser.js","sourceRoot":"","sources":["../../src/skill/md-parser.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,23 @@
1
- import type { SkillConfig } from "./types.js";
1
+ import type { SkillIndex, SkillConfig } from "./types.js";
2
2
  import type { DomainPackageManifest } from "../package/types.js";
3
3
  export interface SkillRegistryOptions {
4
4
  readonly builtinSkills?: readonly SkillConfig[];
5
5
  }
6
6
  export declare class SkillRegistry {
7
- private readonly skills;
7
+ private readonly indexes;
8
+ private readonly fullCache;
8
9
  constructor(options?: SkillRegistryOptions);
9
- /** Register a skill. First-registered wins -- no overwrite. */
10
- register(skill: SkillConfig): void;
11
- get(name: string): SkillConfig | undefined;
12
- all(): SkillConfig[];
13
- /** Discover skills from a directory path. Returns number of skills loaded. */
10
+ /** Register a skill index. First-registered wins. */
11
+ register(index: SkillIndex): void;
12
+ /** Register a full SkillConfig (for builtins or programmatic use). Stores index + caches full config. */
13
+ registerFull(config: SkillConfig): void;
14
+ get(name: string): SkillIndex | undefined;
15
+ all(): SkillIndex[];
16
+ /** Load full SkillConfig on demand. Reads file from disk if not already cached. */
17
+ load(name: string): SkillConfig | undefined;
18
+ /** Resolve skills matching any of the given names or tags. */
19
+ resolve(names?: readonly string[], tags?: readonly string[]): SkillIndex[];
20
+ /** Discover SKILL.md files from a directory. Returns number of skills loaded. */
14
21
  discoverFrom(dirPath: string): number;
15
22
  /** Discover skills from a domain package manifest. Returns number loaded. */
16
23
  discoverFromPackage(manifest: DomainPackageManifest): number;
@@ -19,8 +26,9 @@ export declare class SkillRegistry {
19
26
  * 1. workspace: projectPath/.kiln/skills/
20
27
  * 2. user: userHome/.kiln/skills/
21
28
  * 3. builtin (passed via constructor)
22
- * Earlier tiers override later (workspace wins over user wins over builtin).
29
+ * Earlier tiers win (workspace > user > builtin).
23
30
  */
24
31
  discoverAll(projectPath: string, userHome: string): number;
32
+ private tryLoadIndex;
25
33
  }
26
34
  //# sourceMappingURL=skill-registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-registry.d.ts","sourceRoot":"","sources":["../../src/skill/skill-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACjD;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAE7C,OAAO,CAAC,EAAE,oBAAoB;IAQ1C,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAMlC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI1C,GAAG,IAAI,WAAW,EAAE;IAIpB,8EAA8E;IAC9E,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAsBrC,6EAA6E;IAC7E,mBAAmB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM;IAmB5D;;;;;;OAMG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAS3D"}
1
+ {"version":3,"file":"skill-registry.d.ts","sourceRoot":"","sources":["../../src/skill/skill-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACjD;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;gBAEhD,OAAO,CAAC,EAAE,oBAAoB;IAQ1C,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAMjC,yGAAyG;IACzG,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAOvC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIzC,GAAG,IAAI,UAAU,EAAE;IAInB,mFAAmF;IACnF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAgB3C,8DAA8D;IAC9D,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,EAAE;IAoB1E,iFAAiF;IACjF,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAqBrC,6EAA6E;IAC7E,mBAAmB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM;IAW5D;;;;;;OAMG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAU1D,OAAO,CAAC,YAAY;CAYrB"}
@@ -1,43 +1,86 @@
1
1
  import { existsSync, readdirSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { loadSkillYaml } from "./yaml-parser.js";
3
+ import { loadSkillMdIndex, loadSkillMd } from "./md-parser.js";
4
4
  export class SkillRegistry {
5
- skills = new Map();
5
+ indexes = new Map();
6
+ fullCache = new Map();
6
7
  constructor(options) {
7
8
  if (options?.builtinSkills) {
8
9
  for (const skill of options.builtinSkills) {
9
- this.register(skill);
10
+ this.registerFull(skill);
10
11
  }
11
12
  }
12
13
  }
13
- /** Register a skill. First-registered wins -- no overwrite. */
14
- register(skill) {
15
- if (!this.skills.has(skill.name)) {
16
- this.skills.set(skill.name, skill);
14
+ /** Register a skill index. First-registered wins. */
15
+ register(index) {
16
+ if (!this.indexes.has(index.name)) {
17
+ this.indexes.set(index.name, index);
18
+ }
19
+ }
20
+ /** Register a full SkillConfig (for builtins or programmatic use). Stores index + caches full config. */
21
+ registerFull(config) {
22
+ if (!this.indexes.has(config.name)) {
23
+ this.indexes.set(config.name, config);
24
+ this.fullCache.set(config.name, config);
17
25
  }
18
26
  }
19
27
  get(name) {
20
- return this.skills.get(name);
28
+ return this.indexes.get(name);
21
29
  }
22
30
  all() {
23
- return [...this.skills.values()];
31
+ return [...this.indexes.values()];
32
+ }
33
+ /** Load full SkillConfig on demand. Reads file from disk if not already cached. */
34
+ load(name) {
35
+ const cached = this.fullCache.get(name);
36
+ if (cached)
37
+ return cached;
38
+ const index = this.indexes.get(name);
39
+ if (!index?.filePath)
40
+ return undefined;
41
+ try {
42
+ const config = loadSkillMd(index.filePath);
43
+ this.fullCache.set(name, config);
44
+ return config;
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ }
50
+ /** Resolve skills matching any of the given names or tags. */
51
+ resolve(names, tags) {
52
+ if (!names?.length && !tags?.length)
53
+ return [];
54
+ const nameSet = names ? new Set(names) : undefined;
55
+ const tagSet = tags ? new Set(tags) : undefined;
56
+ const results = [];
57
+ for (const index of this.indexes.values()) {
58
+ if (nameSet?.has(index.name)) {
59
+ results.push(index);
60
+ continue;
61
+ }
62
+ if (tagSet && index.tags.some((t) => tagSet.has(t))) {
63
+ results.push(index);
64
+ }
65
+ }
66
+ return results;
24
67
  }
25
- /** Discover skills from a directory path. Returns number of skills loaded. */
68
+ /** Discover SKILL.md files from a directory. Returns number of skills loaded. */
26
69
  discoverFrom(dirPath) {
27
70
  if (!existsSync(dirPath))
28
71
  return 0;
29
- const files = readdirSync(dirPath).filter((f) => f.endsWith(".yaml") || f.endsWith(".yml"));
72
+ const entries = readdirSync(dirPath, { withFileTypes: true });
30
73
  let loaded = 0;
31
- for (const file of files) {
32
- try {
33
- const skill = loadSkillYaml(join(dirPath, file));
34
- if (!this.skills.has(skill.name)) {
35
- this.skills.set(skill.name, skill);
36
- loaded++;
74
+ for (const entry of entries) {
75
+ // Convention: each skill is a directory containing SKILL.md, or a flat SKILL.md file
76
+ if (entry.isDirectory()) {
77
+ const skillMdPath = join(dirPath, entry.name, "SKILL.md");
78
+ if (existsSync(skillMdPath)) {
79
+ loaded += this.tryLoadIndex(skillMdPath);
37
80
  }
38
81
  }
39
- catch {
40
- // Skip invalid files silently
82
+ else if (entry.name.endsWith(".md")) {
83
+ loaded += this.tryLoadIndex(join(dirPath, entry.name));
41
84
  }
42
85
  }
43
86
  return loaded;
@@ -49,16 +92,7 @@ export class SkillRegistry {
49
92
  let loaded = 0;
50
93
  for (const skillPath of manifest.skills) {
51
94
  const fullPath = join(manifest.installPath, skillPath);
52
- try {
53
- const skill = loadSkillYaml(fullPath);
54
- if (!this.skills.has(skill.name)) {
55
- this.skills.set(skill.name, skill);
56
- loaded++;
57
- }
58
- }
59
- catch {
60
- // Skip invalid skill files silently
61
- }
95
+ loaded += this.tryLoadIndex(fullPath);
62
96
  }
63
97
  return loaded;
64
98
  }
@@ -67,7 +101,7 @@ export class SkillRegistry {
67
101
  * 1. workspace: projectPath/.kiln/skills/
68
102
  * 2. user: userHome/.kiln/skills/
69
103
  * 3. builtin (passed via constructor)
70
- * Earlier tiers override later (workspace wins over user wins over builtin).
104
+ * Earlier tiers win (workspace > user > builtin).
71
105
  */
72
106
  discoverAll(projectPath, userHome) {
73
107
  const workspaceDir = join(projectPath, ".kiln", "skills");
@@ -77,5 +111,18 @@ export class SkillRegistry {
77
111
  total += this.discoverFrom(userDir);
78
112
  return total;
79
113
  }
114
+ tryLoadIndex(filePath) {
115
+ try {
116
+ const index = loadSkillMdIndex(filePath);
117
+ if (!this.indexes.has(index.name)) {
118
+ this.indexes.set(index.name, index);
119
+ return 1;
120
+ }
121
+ }
122
+ catch {
123
+ // Skip invalid files silently
124
+ }
125
+ return 0;
126
+ }
80
127
  }
81
128
  //# sourceMappingURL=skill-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../src/skill/skill-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../src/skill/skill-registry.ts"],"names":[],"mappings":"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"}
@@ -4,14 +4,18 @@ export interface SkillTrigger {
4
4
  readonly event: EventType;
5
5
  readonly filter?: Record<string, unknown>;
6
6
  }
7
- /** Skill configuration (runtime form) */
8
- export interface SkillConfig {
7
+ /** Lightweight index entry — loaded at discovery time (progressive disclosure) */
8
+ export interface SkillIndex {
9
9
  readonly name: string;
10
10
  readonly description: string;
11
11
  readonly tools: readonly string[];
12
12
  readonly triggers: readonly SkillTrigger[];
13
13
  readonly tags: readonly string[];
14
- readonly instructions: string;
15
14
  readonly handler?: string;
15
+ readonly filePath: string;
16
+ }
17
+ /** Full skill config — loaded on activation. Body is the markdown instructions. */
18
+ export interface SkillConfig extends SkillIndex {
19
+ readonly instructions: string;
16
20
  }
17
21
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/skill/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/skill/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,kFAAkF;AAClF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,mFAAmF;AACnF,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kilnai/core",
3
- "version": "0.10.0",
3
+ "version": "0.14.0",
4
4
  "description": "Domain-agnostic AI orchestration engine -- 7 primitives, 3 composites, YAML-configured",
5
5
  "type": "module",
6
6
  "exports": {
@@ -1,18 +0,0 @@
1
- import { KilnError } from "../engine/errors.js";
2
- import type { SkillConfig } from "./types.js";
3
- export declare class SkillYamlError extends KilnError {
4
- readonly errors: readonly {
5
- field: string;
6
- message: string;
7
- }[];
8
- readonly filePath?: string;
9
- constructor(errors: readonly {
10
- field: string;
11
- message: string;
12
- }[], filePath?: string);
13
- }
14
- /** Parse a YAML string into a validated SkillConfig */
15
- export declare function parseSkillYaml(content: string, filePath?: string): SkillConfig;
16
- /** Read a YAML file from disk and parse into SkillConfig */
17
- export declare function loadSkillYaml(filePath: string): SkillConfig;
18
- //# sourceMappingURL=yaml-parser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"yaml-parser.d.ts","sourceRoot":"","sources":["../../src/skill/yaml-parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9C,qBAAa,cAAe,SAAQ,SAAS;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAGzB,MAAM,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,EACrD,QAAQ,CAAC,EAAE,MAAM;CAWpB;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAkC9E;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAG3D"}
@@ -1,61 +0,0 @@
1
- import { parse } from "yaml";
2
- import { readFileSync } from "node:fs";
3
- import { KilnError } from "../engine/errors.js";
4
- import { validateSkillYaml } from "./yaml-schema.js";
5
- import { EVENT_LEVEL_MAP } from "../events/index.js";
6
- const VALID_EVENT_TYPES = new Set(Object.keys(EVENT_LEVEL_MAP));
7
- export class SkillYamlError extends KilnError {
8
- errors;
9
- filePath;
10
- constructor(errors, filePath) {
11
- const msg = errors.map((e) => ` ${e.field}: ${e.message}`).join("\n");
12
- super("SKILL_YAML_INVALID", `Invalid skill YAML${filePath ? ` (${filePath})` : ""}:\n${msg}`, {
13
- context: { errors, filePath },
14
- retryable: false,
15
- });
16
- this.name = "SkillYamlError";
17
- this.errors = errors;
18
- this.filePath = filePath;
19
- }
20
- }
21
- /** Parse a YAML string into a validated SkillConfig */
22
- export function parseSkillYaml(content, filePath) {
23
- const data = parse(content);
24
- const errors = validateSkillYaml(data, filePath);
25
- if (errors.length > 0)
26
- throw new SkillYamlError(errors, filePath);
27
- // Safe cast: validation above confirmed the required shape
28
- const yaml = data;
29
- // Validate trigger event values against known EventType strings
30
- const triggerErrors = [];
31
- const rawTriggers = yaml.triggers ?? [];
32
- for (let i = 0; i < rawTriggers.length; i++) {
33
- const trigger = rawTriggers[i];
34
- if (!VALID_EVENT_TYPES.has(trigger.event)) {
35
- triggerErrors.push({
36
- field: `triggers[${i}].event`,
37
- message: `Unknown event type "${trigger.event}"`,
38
- });
39
- }
40
- }
41
- if (triggerErrors.length > 0)
42
- throw new SkillYamlError(triggerErrors, filePath);
43
- return {
44
- name: yaml.name,
45
- description: yaml.description,
46
- tools: yaml.tools ?? [],
47
- triggers: rawTriggers.map((t) => ({
48
- event: t.event,
49
- ...(t.filter !== undefined ? { filter: t.filter } : {}),
50
- })),
51
- tags: yaml.tags ?? [],
52
- instructions: yaml.instructions,
53
- ...(yaml.handler !== undefined ? { handler: yaml.handler } : {}),
54
- };
55
- }
56
- /** Read a YAML file from disk and parse into SkillConfig */
57
- export function loadSkillYaml(filePath) {
58
- const content = readFileSync(filePath, "utf-8");
59
- return parseSkillYaml(content, filePath);
60
- }
61
- //# sourceMappingURL=yaml-parser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"yaml-parser.js","sourceRoot":"","sources":["../../src/skill/yaml-parser.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- import type { YamlValidationError } from "../domain/yaml-schema.js";
2
- export type { YamlValidationError };
3
- /** Trigger as expressed in YAML */
4
- export interface SkillTriggerYaml {
5
- readonly event: string;
6
- readonly filter?: Record<string, unknown>;
7
- }
8
- /** Skill config as expressed in YAML */
9
- export interface SkillYaml {
10
- readonly name: string;
11
- readonly description: string;
12
- readonly tools?: readonly string[];
13
- readonly triggers?: readonly SkillTriggerYaml[];
14
- readonly tags?: readonly string[];
15
- readonly instructions: string;
16
- readonly handler?: string;
17
- }
18
- /** Validate a parsed YAML object against the SkillYaml schema */
19
- export declare function validateSkillYaml(data: unknown, filePath?: string): YamlValidationError[];
20
- //# sourceMappingURL=yaml-schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"yaml-schema.d.ts","sourceRoot":"","sources":["../../src/skill/yaml-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGpE,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,mCAAmC;AACnC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,wCAAwC;AACxC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,iEAAiE;AACjE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,mBAAmB,EAAE,CA+EvB"}
@@ -1,80 +0,0 @@
1
- const REQUIRED_FIELDS = ["name", "description", "instructions"];
2
- /** Validate a parsed YAML object against the SkillYaml schema */
3
- export function validateSkillYaml(data, filePath) {
4
- const errors = [];
5
- if (typeof data !== "object" || data === null || Array.isArray(data)) {
6
- errors.push({ field: "(root)", message: "Expected an object", filePath });
7
- return errors;
8
- }
9
- const obj = data;
10
- // Required fields
11
- for (const field of REQUIRED_FIELDS) {
12
- if (!(field in obj)) {
13
- errors.push({ field, message: `Missing required field "${field}"`, filePath });
14
- }
15
- }
16
- // Type checks for present fields
17
- if ("name" in obj && typeof obj.name !== "string") {
18
- errors.push({ field: "name", message: `Expected string, got ${typeof obj.name}`, filePath });
19
- }
20
- if ("description" in obj && typeof obj.description !== "string") {
21
- errors.push({ field: "description", message: `Expected string, got ${typeof obj.description}`, filePath });
22
- }
23
- if ("instructions" in obj && typeof obj.instructions !== "string") {
24
- errors.push({ field: "instructions", message: `Expected string, got ${typeof obj.instructions}`, filePath });
25
- }
26
- if ("handler" in obj && typeof obj.handler !== "string") {
27
- errors.push({ field: "handler", message: `Expected string, got ${typeof obj.handler}`, filePath });
28
- }
29
- // tools: optional array of strings
30
- if ("tools" in obj) {
31
- if (!Array.isArray(obj.tools)) {
32
- errors.push({ field: "tools", message: `Expected array, got ${typeof obj.tools}`, filePath });
33
- }
34
- else {
35
- for (let i = 0; i < obj.tools.length; i++) {
36
- if (typeof obj.tools[i] !== "string") {
37
- errors.push({ field: `tools[${i}]`, message: `Expected string, got ${typeof obj.tools[i]}`, filePath });
38
- }
39
- }
40
- }
41
- }
42
- // tags: optional array of strings
43
- if ("tags" in obj) {
44
- if (!Array.isArray(obj.tags)) {
45
- errors.push({ field: "tags", message: `Expected array, got ${typeof obj.tags}`, filePath });
46
- }
47
- else {
48
- for (let i = 0; i < obj.tags.length; i++) {
49
- if (typeof obj.tags[i] !== "string") {
50
- errors.push({ field: `tags[${i}]`, message: `Expected string, got ${typeof obj.tags[i]}`, filePath });
51
- }
52
- }
53
- }
54
- }
55
- // triggers: optional array of objects with event=string
56
- if ("triggers" in obj) {
57
- if (!Array.isArray(obj.triggers)) {
58
- errors.push({ field: "triggers", message: `Expected array, got ${typeof obj.triggers}`, filePath });
59
- }
60
- else {
61
- for (let i = 0; i < obj.triggers.length; i++) {
62
- const trigger = obj.triggers[i];
63
- if (typeof trigger !== "object" || trigger === null || Array.isArray(trigger)) {
64
- errors.push({ field: `triggers[${i}]`, message: "Expected an object", filePath });
65
- }
66
- else {
67
- const t = trigger;
68
- if (!("event" in t)) {
69
- errors.push({ field: `triggers[${i}].event`, message: `Missing required field "event"`, filePath });
70
- }
71
- else if (typeof t.event !== "string") {
72
- errors.push({ field: `triggers[${i}].event`, message: `Expected string, got ${typeof t.event}`, filePath });
73
- }
74
- }
75
- }
76
- }
77
- }
78
- return errors;
79
- }
80
- //# sourceMappingURL=yaml-schema.js.map