agent-world 0.11.1 → 0.12.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 (267) hide show
  1. package/README.md +17 -7
  2. package/dist/cli/commands.d.ts +109 -0
  3. package/dist/cli/commands.js +2024 -0
  4. package/dist/cli/display.d.ts +124 -0
  5. package/dist/cli/display.js +381 -0
  6. package/dist/cli/hitl.d.ts +33 -0
  7. package/dist/cli/hitl.js +81 -0
  8. package/dist/cli/index.d.ts +2 -0
  9. package/dist/cli/stream.d.ts +41 -0
  10. package/dist/cli/stream.js +222 -0
  11. package/dist/core/activity-tracker.d.ts +16 -0
  12. package/dist/core/activity-tracker.d.ts.map +1 -0
  13. package/dist/core/activity-tracker.js +91 -0
  14. package/dist/core/activity-tracker.js.map +1 -0
  15. package/dist/core/ai-commands.d.ts +16 -0
  16. package/dist/core/ai-commands.d.ts.map +1 -0
  17. package/dist/core/ai-commands.js +24 -0
  18. package/dist/core/ai-commands.js.map +1 -0
  19. package/dist/core/ai-sdk-patch.d.ts +24 -0
  20. package/dist/core/ai-sdk-patch.d.ts.map +1 -0
  21. package/dist/core/ai-sdk-patch.js +169 -0
  22. package/dist/core/ai-sdk-patch.js.map +1 -0
  23. package/dist/core/anthropic-direct.d.ts +52 -0
  24. package/dist/core/anthropic-direct.d.ts.map +1 -0
  25. package/dist/core/anthropic-direct.js +301 -0
  26. package/dist/core/anthropic-direct.js.map +1 -0
  27. package/dist/core/approval-cache.d.ts +104 -0
  28. package/dist/core/approval-cache.d.ts.map +1 -0
  29. package/dist/core/approval-cache.js +150 -0
  30. package/dist/core/approval-cache.js.map +1 -0
  31. package/dist/core/chat-constants.d.ts +20 -0
  32. package/dist/core/chat-constants.d.ts.map +1 -0
  33. package/dist/core/chat-constants.js +22 -0
  34. package/dist/core/chat-constants.js.map +1 -0
  35. package/dist/core/create-agent-tool.d.ts +66 -0
  36. package/dist/core/create-agent-tool.d.ts.map +1 -0
  37. package/dist/core/create-agent-tool.js +212 -0
  38. package/dist/core/create-agent-tool.js.map +1 -0
  39. package/dist/core/events/approval-checker.d.ts +61 -0
  40. package/dist/core/events/approval-checker.d.ts.map +1 -0
  41. package/dist/core/events/approval-checker.js +226 -0
  42. package/dist/core/events/approval-checker.js.map +1 -0
  43. package/dist/core/events/index.d.ts +25 -0
  44. package/dist/core/events/index.d.ts.map +1 -0
  45. package/dist/core/events/index.js +30 -0
  46. package/dist/core/events/index.js.map +1 -0
  47. package/dist/core/events/memory-manager.d.ts +73 -0
  48. package/dist/core/events/memory-manager.d.ts.map +1 -0
  49. package/dist/core/events/memory-manager.js +1218 -0
  50. package/dist/core/events/memory-manager.js.map +1 -0
  51. package/dist/core/events/mention-logic.d.ts +39 -0
  52. package/dist/core/events/mention-logic.d.ts.map +1 -0
  53. package/dist/core/events/mention-logic.js +163 -0
  54. package/dist/core/events/mention-logic.js.map +1 -0
  55. package/dist/core/events/orchestrator.d.ts +69 -0
  56. package/dist/core/events/orchestrator.d.ts.map +1 -0
  57. package/dist/core/events/orchestrator.js +883 -0
  58. package/dist/core/events/orchestrator.js.map +1 -0
  59. package/dist/core/events/persistence.d.ts +41 -0
  60. package/dist/core/events/persistence.d.ts.map +1 -0
  61. package/dist/core/events/persistence.js +296 -0
  62. package/dist/core/events/persistence.js.map +1 -0
  63. package/dist/core/events/publishers.d.ts +81 -0
  64. package/dist/core/events/publishers.d.ts.map +1 -0
  65. package/dist/core/events/publishers.js +272 -0
  66. package/dist/core/events/publishers.js.map +1 -0
  67. package/dist/core/events/subscribers.d.ts +45 -0
  68. package/dist/core/events/subscribers.d.ts.map +1 -0
  69. package/dist/core/events/subscribers.js +288 -0
  70. package/dist/core/events/subscribers.js.map +1 -0
  71. package/dist/core/events/tool-bridge-logging.d.ts +28 -0
  72. package/dist/core/events/tool-bridge-logging.d.ts.map +1 -0
  73. package/dist/core/events/tool-bridge-logging.js +94 -0
  74. package/dist/core/events/tool-bridge-logging.js.map +1 -0
  75. package/dist/core/events-metadata.d.ts +72 -0
  76. package/dist/core/events-metadata.d.ts.map +1 -0
  77. package/dist/core/events-metadata.js +167 -0
  78. package/dist/core/events-metadata.js.map +1 -0
  79. package/dist/core/events.d.ts +186 -0
  80. package/dist/core/events.d.ts.map +1 -0
  81. package/dist/core/events.js +1248 -0
  82. package/dist/core/events.js.map +1 -0
  83. package/dist/core/export.d.ts +106 -0
  84. package/dist/core/export.d.ts.map +1 -0
  85. package/dist/core/export.js +705 -0
  86. package/dist/core/export.js.map +1 -0
  87. package/dist/core/file-tools.d.ts +114 -0
  88. package/dist/core/file-tools.d.ts.map +1 -0
  89. package/dist/core/file-tools.js +370 -0
  90. package/dist/core/file-tools.js.map +1 -0
  91. package/dist/core/google-direct.d.ts +58 -0
  92. package/dist/core/google-direct.d.ts.map +1 -0
  93. package/dist/core/google-direct.js +298 -0
  94. package/dist/core/google-direct.js.map +1 -0
  95. package/dist/core/hitl.d.ts +54 -0
  96. package/dist/core/hitl.d.ts.map +1 -0
  97. package/dist/core/hitl.js +153 -0
  98. package/dist/core/hitl.js.map +1 -0
  99. package/dist/core/index.d.ts +59 -0
  100. package/dist/core/index.d.ts.map +1 -0
  101. package/dist/core/index.js +70 -0
  102. package/dist/core/index.js.map +1 -0
  103. package/dist/core/llm-config.d.ts +128 -0
  104. package/dist/core/llm-config.d.ts.map +1 -0
  105. package/dist/core/llm-config.js +164 -0
  106. package/dist/core/llm-config.js.map +1 -0
  107. package/dist/core/llm-manager.d.ts +163 -0
  108. package/dist/core/llm-manager.d.ts.map +1 -0
  109. package/dist/core/llm-manager.js +669 -0
  110. package/dist/core/llm-manager.js.map +1 -0
  111. package/dist/core/load-skill-tool.d.ts +55 -0
  112. package/dist/core/load-skill-tool.d.ts.map +1 -0
  113. package/dist/core/load-skill-tool.js +468 -0
  114. package/dist/core/load-skill-tool.js.map +1 -0
  115. package/dist/core/logger.d.ts +88 -0
  116. package/dist/core/logger.d.ts.map +1 -0
  117. package/dist/core/logger.js +358 -0
  118. package/dist/core/logger.js.map +1 -0
  119. package/dist/core/managers.d.ts +131 -0
  120. package/dist/core/managers.d.ts.map +1 -0
  121. package/dist/core/managers.js +1223 -0
  122. package/dist/core/managers.js.map +1 -0
  123. package/dist/core/mcp-server-registry.d.ts +304 -0
  124. package/dist/core/mcp-server-registry.d.ts.map +1 -0
  125. package/dist/core/mcp-server-registry.js +1769 -0
  126. package/dist/core/mcp-server-registry.js.map +1 -0
  127. package/dist/core/mcp-tools.d.ts +56 -0
  128. package/dist/core/mcp-tools.d.ts.map +1 -0
  129. package/dist/core/mcp-tools.js +186 -0
  130. package/dist/core/mcp-tools.js.map +1 -0
  131. package/dist/core/message-prep.d.ts +81 -0
  132. package/dist/core/message-prep.d.ts.map +1 -0
  133. package/dist/core/message-prep.js +223 -0
  134. package/dist/core/message-prep.js.map +1 -0
  135. package/dist/core/message-processing-control.d.ts +54 -0
  136. package/dist/core/message-processing-control.d.ts.map +1 -0
  137. package/dist/core/message-processing-control.js +139 -0
  138. package/dist/core/message-processing-control.js.map +1 -0
  139. package/dist/core/openai-direct.d.ts +80 -0
  140. package/dist/core/openai-direct.d.ts.map +1 -0
  141. package/dist/core/openai-direct.js +374 -0
  142. package/dist/core/openai-direct.js.map +1 -0
  143. package/dist/core/shell-cmd-tool.d.ts +235 -0
  144. package/dist/core/shell-cmd-tool.d.ts.map +1 -0
  145. package/dist/core/shell-cmd-tool.js +1157 -0
  146. package/dist/core/shell-cmd-tool.js.map +1 -0
  147. package/dist/core/shell-process-registry.d.ts +88 -0
  148. package/dist/core/shell-process-registry.d.ts.map +1 -0
  149. package/dist/core/shell-process-registry.js +309 -0
  150. package/dist/core/shell-process-registry.js.map +1 -0
  151. package/dist/core/skill-registry.d.ts +75 -0
  152. package/dist/core/skill-registry.d.ts.map +1 -0
  153. package/dist/core/skill-registry.js +369 -0
  154. package/dist/core/skill-registry.js.map +1 -0
  155. package/dist/core/skill-script-runner.d.ts +89 -0
  156. package/dist/core/skill-script-runner.d.ts.map +1 -0
  157. package/dist/core/skill-script-runner.js +274 -0
  158. package/dist/core/skill-script-runner.js.map +1 -0
  159. package/dist/core/skill-selector.d.ts +65 -0
  160. package/dist/core/skill-selector.d.ts.map +1 -0
  161. package/dist/core/skill-selector.js +190 -0
  162. package/dist/core/skill-selector.js.map +1 -0
  163. package/dist/core/skill-settings.d.ts +20 -0
  164. package/dist/core/skill-settings.d.ts.map +1 -0
  165. package/dist/core/skill-settings.js +40 -0
  166. package/dist/core/skill-settings.js.map +1 -0
  167. package/dist/core/storage/agent-storage.d.ts +134 -0
  168. package/dist/core/storage/agent-storage.d.ts.map +1 -0
  169. package/dist/core/storage/agent-storage.js +498 -0
  170. package/dist/core/storage/agent-storage.js.map +1 -0
  171. package/dist/core/storage/eventStorage/fileEventStorage.d.ts +100 -0
  172. package/dist/core/storage/eventStorage/fileEventStorage.d.ts.map +1 -0
  173. package/dist/core/storage/eventStorage/fileEventStorage.js +494 -0
  174. package/dist/core/storage/eventStorage/fileEventStorage.js.map +1 -0
  175. package/dist/core/storage/eventStorage/index.d.ts +31 -0
  176. package/dist/core/storage/eventStorage/index.d.ts.map +1 -0
  177. package/dist/core/storage/eventStorage/index.js +31 -0
  178. package/dist/core/storage/eventStorage/index.js.map +1 -0
  179. package/dist/core/storage/eventStorage/memoryEventStorage.d.ts +87 -0
  180. package/dist/core/storage/eventStorage/memoryEventStorage.d.ts.map +1 -0
  181. package/dist/core/storage/eventStorage/memoryEventStorage.js +244 -0
  182. package/dist/core/storage/eventStorage/memoryEventStorage.js.map +1 -0
  183. package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts +45 -0
  184. package/dist/core/storage/eventStorage/sqliteEventStorage.d.ts.map +1 -0
  185. package/dist/core/storage/eventStorage/sqliteEventStorage.js +301 -0
  186. package/dist/core/storage/eventStorage/sqliteEventStorage.js.map +1 -0
  187. package/dist/core/storage/eventStorage/types.d.ts +142 -0
  188. package/dist/core/storage/eventStorage/types.d.ts.map +1 -0
  189. package/dist/core/storage/eventStorage/types.js +43 -0
  190. package/dist/core/storage/eventStorage/types.js.map +1 -0
  191. package/dist/core/storage/eventStorage/validation.d.ts +30 -0
  192. package/dist/core/storage/eventStorage/validation.d.ts.map +1 -0
  193. package/dist/core/storage/eventStorage/validation.js +68 -0
  194. package/dist/core/storage/eventStorage/validation.js.map +1 -0
  195. package/dist/core/storage/legacy-migrations.d.ts +45 -0
  196. package/dist/core/storage/legacy-migrations.d.ts.map +1 -0
  197. package/dist/core/storage/legacy-migrations.js +295 -0
  198. package/dist/core/storage/legacy-migrations.js.map +1 -0
  199. package/dist/core/storage/memory-storage.d.ts +105 -0
  200. package/dist/core/storage/memory-storage.d.ts.map +1 -0
  201. package/dist/core/storage/memory-storage.js +415 -0
  202. package/dist/core/storage/memory-storage.js.map +1 -0
  203. package/dist/core/storage/migration-runner.d.ts +96 -0
  204. package/dist/core/storage/migration-runner.d.ts.map +1 -0
  205. package/dist/core/storage/migration-runner.js +306 -0
  206. package/dist/core/storage/migration-runner.js.map +1 -0
  207. package/dist/core/storage/queue-storage.d.ts +147 -0
  208. package/dist/core/storage/queue-storage.d.ts.map +1 -0
  209. package/dist/core/storage/queue-storage.js +290 -0
  210. package/dist/core/storage/queue-storage.js.map +1 -0
  211. package/dist/core/storage/skill-storage.d.ts +136 -0
  212. package/dist/core/storage/skill-storage.d.ts.map +1 -0
  213. package/dist/core/storage/skill-storage.js +474 -0
  214. package/dist/core/storage/skill-storage.js.map +1 -0
  215. package/dist/core/storage/sqlite-schema.d.ts +95 -0
  216. package/dist/core/storage/sqlite-schema.d.ts.map +1 -0
  217. package/dist/core/storage/sqlite-schema.js +156 -0
  218. package/dist/core/storage/sqlite-schema.js.map +1 -0
  219. package/dist/core/storage/sqlite-storage.d.ts +146 -0
  220. package/dist/core/storage/sqlite-storage.d.ts.map +1 -0
  221. package/dist/core/storage/sqlite-storage.js +709 -0
  222. package/dist/core/storage/sqlite-storage.js.map +1 -0
  223. package/dist/core/storage/storage-factory.d.ts +61 -0
  224. package/dist/core/storage/storage-factory.d.ts.map +1 -0
  225. package/dist/core/storage/storage-factory.js +794 -0
  226. package/dist/core/storage/storage-factory.js.map +1 -0
  227. package/dist/core/storage/validation.d.ts +36 -0
  228. package/dist/core/storage/validation.d.ts.map +1 -0
  229. package/dist/core/storage/validation.js +79 -0
  230. package/dist/core/storage/validation.js.map +1 -0
  231. package/dist/core/storage/world-storage.d.ts +114 -0
  232. package/dist/core/storage/world-storage.d.ts.map +1 -0
  233. package/dist/core/storage/world-storage.js +378 -0
  234. package/dist/core/storage/world-storage.js.map +1 -0
  235. package/dist/core/subscription.d.ts +43 -0
  236. package/dist/core/subscription.d.ts.map +1 -0
  237. package/dist/core/subscription.js +227 -0
  238. package/dist/core/subscription.js.map +1 -0
  239. package/dist/core/tool-utils.d.ts +80 -0
  240. package/dist/core/tool-utils.d.ts.map +1 -0
  241. package/dist/core/tool-utils.js +273 -0
  242. package/dist/core/tool-utils.js.map +1 -0
  243. package/dist/core/types.d.ts +595 -0
  244. package/dist/core/types.d.ts.map +1 -0
  245. package/dist/core/types.js +158 -0
  246. package/dist/core/types.js.map +1 -0
  247. package/dist/core/utils.d.ts +138 -0
  248. package/dist/core/utils.d.ts.map +1 -0
  249. package/dist/core/utils.js +478 -0
  250. package/dist/core/utils.js.map +1 -0
  251. package/dist/core/world-class.d.ts +43 -0
  252. package/dist/core/world-class.d.ts.map +1 -0
  253. package/dist/core/world-class.js +90 -0
  254. package/dist/core/world-class.js.map +1 -0
  255. package/dist/index.d.ts +18 -0
  256. package/dist/public/assets/agent-sprites-DJFgj-zP.png +0 -0
  257. package/dist/public/assets/border-KHK37r8y.svg +83 -0
  258. package/dist/public/assets/index-C9kPXL6G.css +1 -0
  259. package/dist/public/assets/index-DOQEHGWt.js +96 -0
  260. package/dist/public/index.html +21 -0
  261. package/dist/server/api.d.ts +2 -0
  262. package/dist/server/api.js +1124 -0
  263. package/dist/server/index.d.ts +29 -0
  264. package/dist/server/sse-handler.d.ts +62 -0
  265. package/dist/server/sse-handler.js +234 -0
  266. package/package.json +15 -3
  267. package/scripts/launch-electron.js +0 -58
@@ -0,0 +1,369 @@
1
+ /**
2
+ * Skill Registry - Singleton registry and synchronization for agent skills.
3
+ *
4
+ * Purpose:
5
+ * - Maintain one in-memory registry keyed by `skill_id`
6
+ * - Sync registry entries from discovered SKILL.md files in user/project roots
7
+ *
8
+ * Key Features:
9
+ * - Singleton module-level registry with exported helpers
10
+ * - Recursive SKILL.md discovery with deterministic ordering
11
+ * - Hash-based update checks using full SKILL.md content
12
+ * - Automatic initial sync on module load so core starts with up-to-date skills
13
+ * - Automatic pruning of entries whose files no longer exist
14
+ *
15
+ * Implementation Notes:
16
+ * - `skill_id` is sourced from front-matter `name`
17
+ * - `description` is sourced from front-matter `description`
18
+ * - `hash` is computed from full SKILL.md content (front matter + body)
19
+ * - Project roots are scanned after user roots, so later collisions always override earlier ones
20
+ *
21
+ * Recent Changes:
22
+ * - 2026-02-16: Default project-skill roots now resolve from active workspace env (`AGENT_WORLD_PROJECT_PATH`/`AGENT_WORLD_WORKSPACE_PATH`) before falling back to process cwd.
23
+ * - 2026-02-16: Added source-scope filtering helper so callers can include/exclude global or project skills when building system prompts.
24
+ * - 2026-02-14: Added `getSkillSourcePath` API and source-path tracking map for on-demand `SKILL.md` loading.
25
+ * - 2026-02-14: Added `~/.codex/skills` to default user skill roots for Codex-managed skills discovery.
26
+ * - 2026-02-14: Removed timestamp-gated update blocking so project-scope collisions always override user-scope entries when hashes differ.
27
+ * - 2026-02-14: Fixed skill collision precedence so project-root skills override user-root skills for the same `skill_id`.
28
+ * - 2026-02-14: Added `waitForInitialSkillSync` and startup sync tracking promise for deterministic core-load sync completion.
29
+ * - 2026-02-14: Added module-load auto-sync so each core load refreshes the skill registry.
30
+ * - 2026-02-14: Switched skill hash generation to use full SKILL.md content instead of metadata-only fields.
31
+ * - 2026-02-14: Switched registry metadata source to SKILL.md front matter (`name` + `description`).
32
+ * - 2026-02-14: Use front-matter `name` as canonical `skill_id`.
33
+ */
34
+ import { createHash } from 'crypto';
35
+ import { promises as fs } from 'fs';
36
+ import { homedir } from 'os';
37
+ import * as path from 'path';
38
+ function buildDefaultUserSkillRoots() {
39
+ return [
40
+ path.join(homedir(), '.agents', 'skills'),
41
+ path.join(homedir(), '.codex', 'skills'),
42
+ ];
43
+ }
44
+ function buildDefaultProjectSkillRoots() {
45
+ const envWorkspace = [
46
+ process.env.AGENT_WORLD_PROJECT_PATH,
47
+ process.env.AGENT_WORLD_WORKSPACE_PATH,
48
+ process.env.AGENT_WORLD_DATA_PATH,
49
+ ]
50
+ .map((value) => (typeof value === 'string' ? value.trim() : ''))
51
+ .find((value) => value.length > 0);
52
+ const projectRoot = envWorkspace || process.cwd();
53
+ return [path.join(projectRoot, '.agents', 'skills'), path.join(projectRoot, 'skills')];
54
+ }
55
+ function normalizeRoots(roots) {
56
+ const resolved = roots
57
+ .map((candidate) => candidate.trim())
58
+ .filter((candidate) => candidate.length > 0)
59
+ .map((candidate) => path.resolve(candidate));
60
+ return [...new Set(resolved)];
61
+ }
62
+ function isPathWithinRoot(candidatePath, rootPath) {
63
+ const relative = path.relative(rootPath, candidatePath);
64
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
65
+ }
66
+ function createContentHash(content) {
67
+ return createHash('md5').update(content).digest('hex').slice(0, 8);
68
+ }
69
+ function normalizeFrontMatterValue(value) {
70
+ const trimmed = value.trim();
71
+ if (!trimmed) {
72
+ return '';
73
+ }
74
+ const hasMatchingQuotes = (trimmed.startsWith('"') && trimmed.endsWith('"')) ||
75
+ (trimmed.startsWith("'") && trimmed.endsWith("'"));
76
+ if (hasMatchingQuotes && trimmed.length >= 2) {
77
+ return trimmed.slice(1, -1).trim();
78
+ }
79
+ return trimmed;
80
+ }
81
+ function parseSkillFrontMatter(content) {
82
+ const frontMatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---\s*(?:\n|$)/);
83
+ if (!frontMatterMatch || !frontMatterMatch[1]) {
84
+ return {};
85
+ }
86
+ const lines = frontMatterMatch[1].split(/\r?\n/);
87
+ const metadata = {};
88
+ let currentMultilineKey = null;
89
+ let blockStyle = null;
90
+ for (const rawLine of lines) {
91
+ const trimmed = rawLine.trim();
92
+ if (!trimmed || trimmed.startsWith('#')) {
93
+ continue;
94
+ }
95
+ const keyValueMatch = rawLine.match(/^\s*([A-Za-z0-9_-]+)\s*:\s*(.*)$/);
96
+ if (keyValueMatch) {
97
+ const rawKey = keyValueMatch[1].trim();
98
+ const rawValue = keyValueMatch[2] ?? '';
99
+ if (rawKey !== 'name' && rawKey !== 'description') {
100
+ currentMultilineKey = null;
101
+ blockStyle = null;
102
+ continue;
103
+ }
104
+ if ((rawValue === '|' || rawValue === '>') && rawKey === 'description') {
105
+ metadata.description = '';
106
+ currentMultilineKey = rawKey;
107
+ blockStyle = rawValue === '|' ? 'literal' : 'folded';
108
+ continue;
109
+ }
110
+ metadata[rawKey] = normalizeFrontMatterValue(rawValue);
111
+ currentMultilineKey = null;
112
+ blockStyle = null;
113
+ continue;
114
+ }
115
+ if (!currentMultilineKey || currentMultilineKey !== 'description') {
116
+ continue;
117
+ }
118
+ if (!/^\s+/.test(rawLine)) {
119
+ currentMultilineKey = null;
120
+ blockStyle = null;
121
+ continue;
122
+ }
123
+ const chunk = rawLine.trim();
124
+ if (!chunk) {
125
+ continue;
126
+ }
127
+ if (blockStyle === 'literal') {
128
+ metadata.description = metadata.description
129
+ ? `${metadata.description}\n${chunk}`
130
+ : chunk;
131
+ }
132
+ else {
133
+ metadata.description = metadata.description
134
+ ? `${metadata.description} ${chunk}`
135
+ : chunk;
136
+ }
137
+ }
138
+ return metadata;
139
+ }
140
+ async function pathExists(targetPath) {
141
+ try {
142
+ await fs.access(targetPath);
143
+ return true;
144
+ }
145
+ catch {
146
+ return false;
147
+ }
148
+ }
149
+ async function readDirectoryEntries(directoryPath) {
150
+ try {
151
+ const entries = await fs.readdir(directoryPath, { withFileTypes: true });
152
+ return entries.sort((left, right) => left.name.localeCompare(right.name));
153
+ }
154
+ catch {
155
+ return [];
156
+ }
157
+ }
158
+ async function findSkillMarkdownFiles(rootPath) {
159
+ const output = [];
160
+ const queue = [rootPath];
161
+ while (queue.length > 0) {
162
+ const current = queue.shift();
163
+ if (!current) {
164
+ continue;
165
+ }
166
+ const entries = await readDirectoryEntries(current);
167
+ for (const entry of entries) {
168
+ const absolutePath = path.join(current, entry.name);
169
+ if (entry.isDirectory()) {
170
+ queue.push(absolutePath);
171
+ continue;
172
+ }
173
+ if (entry.isFile() && entry.name === 'SKILL.md') {
174
+ output.push(absolutePath);
175
+ }
176
+ }
177
+ }
178
+ return output.sort((left, right) => left.localeCompare(right));
179
+ }
180
+ async function readSkillStats(skillFilePath) {
181
+ try {
182
+ return await fs.stat(skillFilePath);
183
+ }
184
+ catch {
185
+ return null;
186
+ }
187
+ }
188
+ async function discoverSkills(roots) {
189
+ const discovered = new Map();
190
+ for (const { rootPath, sourceScope } of roots) {
191
+ const exists = await pathExists(rootPath);
192
+ if (!exists) {
193
+ continue;
194
+ }
195
+ const skillFiles = await findSkillMarkdownFiles(rootPath);
196
+ for (const skillFilePath of skillFiles) {
197
+ const stats = await readSkillStats(skillFilePath);
198
+ if (!stats) {
199
+ continue;
200
+ }
201
+ discovered.set(skillFilePath, {
202
+ skillFilePath,
203
+ lastUpdated: stats.mtime.toISOString(),
204
+ sourceScope,
205
+ });
206
+ }
207
+ }
208
+ return discovered;
209
+ }
210
+ function createSkillRegistrySingleton() {
211
+ const registry = new Map();
212
+ const registrySourcePaths = new Map();
213
+ const registryScopes = new Map();
214
+ async function syncSkills(options = {}) {
215
+ const userRoots = normalizeRoots(options.userSkillRoots ?? buildDefaultUserSkillRoots());
216
+ const projectRoots = normalizeRoots(options.projectSkillRoots ?? buildDefaultProjectSkillRoots());
217
+ const roots = [
218
+ ...userRoots.map((rootPath) => ({ rootPath, sourceScope: 'global' })),
219
+ ...projectRoots.map((rootPath) => ({ rootPath, sourceScope: 'project' })),
220
+ ];
221
+ const discovered = await discoverSkills(roots);
222
+ const discoveredIds = new Set();
223
+ let added = 0;
224
+ let updated = 0;
225
+ let unchanged = 0;
226
+ const resolvedDiscovered = new Map();
227
+ for (const discoveredSkill of discovered.values()) {
228
+ let content;
229
+ try {
230
+ content = await fs.readFile(discoveredSkill.skillFilePath, 'utf8');
231
+ }
232
+ catch {
233
+ continue;
234
+ }
235
+ const metadata = parseSkillFrontMatter(content);
236
+ const skillId = (metadata.name ?? '').trim();
237
+ if (!skillId) {
238
+ continue;
239
+ }
240
+ const description = (metadata.description ?? '').trim();
241
+ resolvedDiscovered.set(skillId, {
242
+ description,
243
+ hash: createContentHash(content),
244
+ lastUpdated: discoveredSkill.lastUpdated,
245
+ skillFilePath: discoveredSkill.skillFilePath,
246
+ sourceScope: discoveredSkill.sourceScope,
247
+ });
248
+ }
249
+ for (const [skillId, discoveredSkill] of [...resolvedDiscovered.entries()].sort(([leftId], [rightId]) => leftId.localeCompare(rightId))) {
250
+ discoveredIds.add(skillId);
251
+ const existing = registry.get(skillId);
252
+ const nextHash = discoveredSkill.hash;
253
+ registrySourcePaths.set(skillId, discoveredSkill.skillFilePath);
254
+ registryScopes.set(skillId, discoveredSkill.sourceScope);
255
+ if (existing && existing.hash === nextHash) {
256
+ unchanged += 1;
257
+ continue;
258
+ }
259
+ registry.set(skillId, {
260
+ skill_id: skillId,
261
+ description: discoveredSkill.description,
262
+ hash: nextHash,
263
+ lastUpdated: discoveredSkill.lastUpdated,
264
+ });
265
+ if (existing) {
266
+ updated += 1;
267
+ }
268
+ else {
269
+ added += 1;
270
+ }
271
+ }
272
+ let removed = 0;
273
+ for (const skillId of [...registry.keys()]) {
274
+ if (!discoveredIds.has(skillId)) {
275
+ registry.delete(skillId);
276
+ registrySourcePaths.delete(skillId);
277
+ registryScopes.delete(skillId);
278
+ removed += 1;
279
+ }
280
+ }
281
+ return {
282
+ added,
283
+ updated,
284
+ removed,
285
+ unchanged,
286
+ total: registry.size,
287
+ };
288
+ }
289
+ function getSkills() {
290
+ return [...registry.values()].sort((left, right) => left.skill_id.localeCompare(right.skill_id));
291
+ }
292
+ function getSkill(skillId) {
293
+ return registry.get(skillId);
294
+ }
295
+ function getSkillSourcePath(skillId) {
296
+ return registrySourcePaths.get(skillId);
297
+ }
298
+ function getSkillSourceScope(skillId) {
299
+ return registryScopes.get(skillId);
300
+ }
301
+ function getSkillsForSystemPrompt(options = {}) {
302
+ const includeGlobal = options.includeGlobal !== false;
303
+ const includeProject = options.includeProject !== false;
304
+ if (!includeGlobal && !includeProject) {
305
+ return [];
306
+ }
307
+ const userRoots = normalizeRoots(options.userSkillRoots ?? buildDefaultUserSkillRoots());
308
+ const projectRoots = normalizeRoots(options.projectSkillRoots ?? buildDefaultProjectSkillRoots());
309
+ return [...registry.values()]
310
+ .filter((skill) => {
311
+ const sourcePath = registrySourcePaths.get(skill.skill_id);
312
+ const sourceScope = registryScopes.get(skill.skill_id);
313
+ if (sourceScope === 'project') {
314
+ return includeProject;
315
+ }
316
+ if (sourceScope === 'global') {
317
+ return includeGlobal;
318
+ }
319
+ if (!sourcePath) {
320
+ return includeGlobal || includeProject;
321
+ }
322
+ const resolvedSourcePath = path.resolve(sourcePath);
323
+ const isProjectSkill = projectRoots.some((rootPath) => isPathWithinRoot(resolvedSourcePath, rootPath));
324
+ if (isProjectSkill) {
325
+ return includeProject;
326
+ }
327
+ const isGlobalSkill = userRoots.some((rootPath) => isPathWithinRoot(resolvedSourcePath, rootPath));
328
+ if (isGlobalSkill) {
329
+ return includeGlobal;
330
+ }
331
+ return includeGlobal && includeProject;
332
+ })
333
+ .sort((left, right) => left.skill_id.localeCompare(right.skill_id));
334
+ }
335
+ function clearSkillsForTests() {
336
+ registry.clear();
337
+ registrySourcePaths.clear();
338
+ registryScopes.clear();
339
+ }
340
+ return { syncSkills, getSkills, getSkill, getSkillSourcePath, getSkillSourceScope, getSkillsForSystemPrompt, clearSkillsForTests };
341
+ }
342
+ export const skillRegistry = createSkillRegistrySingleton();
343
+ export const syncSkills = skillRegistry.syncSkills;
344
+ export const getSkills = skillRegistry.getSkills;
345
+ export const getSkill = skillRegistry.getSkill;
346
+ export const getSkillSourcePath = skillRegistry.getSkillSourcePath;
347
+ export const getSkillSourceScope = skillRegistry.getSkillSourceScope;
348
+ export const getSkillsForSystemPrompt = skillRegistry.getSkillsForSystemPrompt;
349
+ export const clearSkillsForTests = skillRegistry.clearSkillsForTests;
350
+ const EMPTY_SYNC_RESULT = {
351
+ added: 0,
352
+ updated: 0,
353
+ removed: 0,
354
+ unchanged: 0,
355
+ total: 0,
356
+ };
357
+ let initialSkillSyncPromise = null;
358
+ function ensureInitialSkillSyncStarted() {
359
+ if (!initialSkillSyncPromise) {
360
+ initialSkillSyncPromise = syncSkills().catch(() => EMPTY_SYNC_RESULT);
361
+ }
362
+ return initialSkillSyncPromise;
363
+ }
364
+ export function waitForInitialSkillSync() {
365
+ return ensureInitialSkillSyncStarted();
366
+ }
367
+ // Keep the registry warm when core loads, without breaking module import flows on sync errors.
368
+ void ensureInitialSkillSyncStarted();
369
+ //# sourceMappingURL=skill-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../core/skill-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Skill Script Runner Module - Dedicated executor for skill-bundled scripts
3
+ *
4
+ * Purpose:
5
+ * Provides a sandboxed, path-guarded script executor for files stored under
6
+ * `{world-dir}/skills/{skill-name}/scripts/`. This is the ONLY entry point
7
+ * for skill script execution — the generic `shell-cmd-tool.ts` must NEVER
8
+ * be used for skill scripts.
9
+ *
10
+ * Features:
11
+ * - Strict path guards: resolve + verify target stays within the skill's `scripts/` directory
12
+ * - Runtime sandbox permissions: allowlist of allowed interpreters
13
+ * - Execution controls: configurable timeout, max output size, exit code capture
14
+ * - stdout/stderr capture with size limits
15
+ * - Explicit error handling with structured results
16
+ *
17
+ * Notes:
18
+ * - This module does NOT use `shell-cmd-tool.ts` — it is a separate executor
19
+ * - Scripts are executed via child_process.spawn with explicit interpreter
20
+ * - Path traversal is prevented by resolving + verifying all paths
21
+ * - Only scripts under `{skill-dir}/scripts/` are allowed to execute
22
+ *
23
+ * Recent Changes:
24
+ * - 2026-02-09: Initial implementation for world-level skills system
25
+ */
26
+ /** Result of a skill script execution */
27
+ export interface SkillScriptResult {
28
+ /** Exit code of the process (null if killed/timed out) */
29
+ exitCode: number | null;
30
+ /** Signal that terminated the process, if any */
31
+ signal: string | null;
32
+ /** Captured stdout (truncated to maxOutputSize) */
33
+ stdout: string;
34
+ /** Captured stderr (truncated to maxOutputSize) */
35
+ stderr: string;
36
+ /** Whether execution was killed due to timeout */
37
+ timedOut: boolean;
38
+ /** Whether output was truncated */
39
+ truncated: boolean;
40
+ /** Execution duration in milliseconds */
41
+ durationMs: number;
42
+ }
43
+ /** Options for script execution */
44
+ export interface SkillScriptOptions {
45
+ /** Timeout in milliseconds (default: 30000 = 30 seconds) */
46
+ timeout?: number;
47
+ /** Maximum output size in bytes for stdout/stderr each (default: 65536 = 64KB) */
48
+ maxOutputSize?: number;
49
+ /** Environment variables to pass to the script */
50
+ env?: Record<string, string>;
51
+ /** Arguments to pass to the script */
52
+ args?: string[];
53
+ }
54
+ /**
55
+ * Build the scripts directory path for a skill.
56
+ */
57
+ export declare function getSkillScriptsDir(rootPath: string, worldId: string, skillName: string): string;
58
+ /**
59
+ * Resolve and validate that a script path stays within the skill's scripts/ directory.
60
+ * Throws if the resolved path escapes the boundary.
61
+ */
62
+ export declare function resolveAndGuardScriptPath(scriptsDir: string, scriptName: string): string;
63
+ /**
64
+ * Determine the interpreter to use for a script based on its file extension.
65
+ * Returns null if the extension is not in the allowlist.
66
+ */
67
+ export declare function detectInterpreter(scriptPath: string): {
68
+ command: string;
69
+ extraArgs: string[];
70
+ } | null;
71
+ /**
72
+ * Execute a skill script with sandbox/permission guards.
73
+ *
74
+ * This function:
75
+ * 1. Validates the script path stays within the skill's scripts/ directory
76
+ * 2. Verifies the script file exists
77
+ * 3. Detects the appropriate interpreter from file extension
78
+ * 4. Executes with timeout, output size limits, and environment isolation
79
+ * 5. Captures stdout, stderr, exit code, and timing
80
+ *
81
+ * @param rootPath - Root storage path (e.g., ~/agent-world)
82
+ * @param worldId - World identifier
83
+ * @param skillName - Skill name (kebab-case)
84
+ * @param scriptName - Script filename (e.g., "run.sh", "analyze.py")
85
+ * @param options - Execution options (timeout, max output, env, args)
86
+ * @returns Structured execution result
87
+ */
88
+ export declare function runSkillScript(rootPath: string, worldId: string, skillName: string, scriptName: string, options?: SkillScriptOptions): Promise<SkillScriptResult>;
89
+ //# sourceMappingURL=skill-script-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-script-runner.d.ts","sourceRoot":"","sources":["../../core/skill-script-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAaH,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iDAAiD;IACjD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;IAClB,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,mCAAmC;AACnC,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AA2CD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/F;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,MAAM,CA0BR;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAUrG;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAkD5B"}