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,474 @@
1
+ /**
2
+ * Skill Storage Module - File I/O Operations for World-Level Agent Skills
3
+ *
4
+ * Purpose:
5
+ * File-based storage for world-scoped skills following the Anthropic Agent Skills Protocol.
6
+ * Each skill is a directory under `{world-dir}/skills/{skill-name}/` containing a `SKILL.md`
7
+ * file with YAML frontmatter metadata and markdown body instructions.
8
+ *
9
+ * Features:
10
+ * - SKILL.md parsing with YAML frontmatter extraction and validation
11
+ * - Skill CRUD operations (import, read, list, delete, export)
12
+ * - `.meta.json` write-time cache for fast metadata listing
13
+ * - Cache fallback to SKILL.md parsing when cache is missing or corrupt
14
+ * - Path traversal protection using resolve + startsWith guards
15
+ * - Duplicate skill rejection via `skillExists()` check before import
16
+ * - Content size and line-count validation with warnings
17
+ *
18
+ * Notes:
19
+ * - Follows `agent-storage.ts` pattern: standalone module with explicit `rootPath`
20
+ * - Uses `fs/promises` for all I/O, pure functions, no classes
21
+ * - Skills are NOT tool calls — they follow the Anthropic Agent Skills Protocol
22
+ * as a content/instruction protocol (app reads SKILL.md, injects into user message)
23
+ * - Skill metadata limits: name max 64 chars (kebab-case), description max 256 chars
24
+ *
25
+ * Recent Changes:
26
+ * - 2026-02-09: Initial implementation for world-level skills system
27
+ */
28
+ import { promises as fs } from 'fs';
29
+ import * as path from 'path';
30
+ import { DuplicateSkillError } from '../types.js';
31
+ // ============================================================
32
+ // Constants
33
+ // ============================================================
34
+ /** Maximum allowed length for skill name. */
35
+ const MAX_NAME_LENGTH = 64;
36
+ /** Maximum allowed length for skill description. */
37
+ const MAX_DESCRIPTION_LENGTH = 256;
38
+ /** Maximum SKILL.md file size in bytes before warning (50 KB). */
39
+ const MAX_CONTENT_SIZE_WARN = 50 * 1024;
40
+ /** Maximum SKILL.md line count before warning. */
41
+ const MAX_LINE_COUNT_WARN = 500;
42
+ /** Pattern for valid skill names (kebab-case). */
43
+ const SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
44
+ /** Name of the metadata cache file. */
45
+ const META_CACHE_FILENAME = '.meta.json';
46
+ /** Name of the skill definition file. */
47
+ const SKILL_FILENAME = 'SKILL.md';
48
+ // ============================================================
49
+ // Path Helpers
50
+ // ============================================================
51
+ /**
52
+ * Get the skills root directory for a world.
53
+ */
54
+ export function getSkillsDir(rootPath, worldId) {
55
+ return path.join(rootPath, worldId, 'skills');
56
+ }
57
+ /**
58
+ * Get the directory path for a specific skill.
59
+ */
60
+ export function getSkillDir(rootPath, worldId, skillName) {
61
+ return path.join(getSkillsDir(rootPath, worldId), skillName);
62
+ }
63
+ /**
64
+ * Get the SKILL.md file path for a specific skill.
65
+ */
66
+ export function getSkillFilePath(rootPath, worldId, skillName) {
67
+ return path.join(getSkillDir(rootPath, worldId, skillName), SKILL_FILENAME);
68
+ }
69
+ /**
70
+ * Get the .meta.json cache file path for a world's skills.
71
+ */
72
+ function getMetaCachePath(rootPath, worldId) {
73
+ return path.join(getSkillsDir(rootPath, worldId), META_CACHE_FILENAME);
74
+ }
75
+ // ============================================================
76
+ // Directory Helpers
77
+ // ============================================================
78
+ /**
79
+ * Ensure the skills root directory exists.
80
+ */
81
+ export async function ensureSkillsDirectory(rootPath, worldId) {
82
+ await fs.mkdir(getSkillsDir(rootPath, worldId), { recursive: true });
83
+ }
84
+ /**
85
+ * Ensure a specific skill directory exists.
86
+ */
87
+ export async function ensureSkillDirectory(rootPath, worldId, skillName) {
88
+ await fs.mkdir(getSkillDir(rootPath, worldId, skillName), { recursive: true });
89
+ }
90
+ // ============================================================
91
+ // Path Safety
92
+ // ============================================================
93
+ /**
94
+ * Validate that a resolved path stays within the expected base directory.
95
+ * Prevents path traversal attacks (e.g., `../../etc/passwd`).
96
+ */
97
+ function assertSafePath(filePath, baseDir) {
98
+ const resolved = path.resolve(filePath);
99
+ const resolvedBase = path.resolve(baseDir);
100
+ const sep = path.sep || '/';
101
+ if (!resolved.startsWith(resolvedBase + sep) && resolved !== resolvedBase) {
102
+ throw new Error(`Path traversal detected: ${filePath} escapes ${baseDir}`);
103
+ }
104
+ }
105
+ // ============================================================
106
+ // YAML Frontmatter Parsing
107
+ // ============================================================
108
+ /**
109
+ * Parse SKILL.md content into metadata (YAML frontmatter) and body content.
110
+ * Supports standard YAML frontmatter delimited by `---` lines.
111
+ *
112
+ * @param raw - Raw file content of SKILL.md
113
+ * @returns Parsed SkillData with metadata and content
114
+ * @throws Error if frontmatter is missing or malformed
115
+ */
116
+ export function parseSkillFile(raw) {
117
+ const trimmed = raw.trimStart();
118
+ if (!trimmed.startsWith('---')) {
119
+ throw new Error('SKILL.md must start with YAML frontmatter (---)');
120
+ }
121
+ const endIndex = trimmed.indexOf('\n---', 3);
122
+ if (endIndex === -1) {
123
+ throw new Error('SKILL.md YAML frontmatter is not properly closed (missing closing ---)');
124
+ }
125
+ const yamlBlock = trimmed.substring(3, endIndex).trim();
126
+ const body = trimmed.substring(endIndex + 4).trim();
127
+ const metadata = parseSimpleYaml(yamlBlock);
128
+ return { metadata, content: body };
129
+ }
130
+ /**
131
+ * Minimal YAML parser for frontmatter fields.
132
+ * Handles simple key-value pairs and arrays (inline `[a, b]` syntax).
133
+ * Does NOT support nested objects, multi-line strings, or complex YAML.
134
+ */
135
+ function parseSimpleYaml(yaml) {
136
+ const result = {};
137
+ const lines = yaml.split('\n');
138
+ for (const line of lines) {
139
+ const trimmed = line.trim();
140
+ if (!trimmed || trimmed.startsWith('#'))
141
+ continue;
142
+ const colonIndex = trimmed.indexOf(':');
143
+ if (colonIndex === -1)
144
+ continue;
145
+ const key = trimmed.substring(0, colonIndex).trim();
146
+ let value = trimmed.substring(colonIndex + 1).trim();
147
+ // Handle inline arrays: [item1, item2]
148
+ if (value.startsWith('[') && value.endsWith(']')) {
149
+ value = value
150
+ .slice(1, -1)
151
+ .split(',')
152
+ .map((item) => item.trim().replace(/^["']|["']$/g, ''))
153
+ .filter((item) => item.length > 0);
154
+ }
155
+ else {
156
+ // Remove surrounding quotes
157
+ value = value.replace(/^["']|["']$/g, '');
158
+ }
159
+ result[key] = value;
160
+ }
161
+ if (!result.name || !result.description) {
162
+ throw new Error('SKILL.md frontmatter must contain required fields: name, description');
163
+ }
164
+ return result;
165
+ }
166
+ /**
167
+ * Extract just the metadata from a SKILL.md file (without body content).
168
+ */
169
+ export function extractSkillMetadata(raw) {
170
+ return parseSkillFile(raw).metadata;
171
+ }
172
+ // ============================================================
173
+ // Validation
174
+ // ============================================================
175
+ /**
176
+ * Validate skill metadata against protocol constraints.
177
+ */
178
+ export function validateSkillMetadata(metadata) {
179
+ const errors = [];
180
+ const warnings = [];
181
+ // Name validation
182
+ if (!metadata.name) {
183
+ errors.push('Skill name is required');
184
+ }
185
+ else {
186
+ if (metadata.name.length > MAX_NAME_LENGTH) {
187
+ errors.push(`Skill name exceeds maximum length of ${MAX_NAME_LENGTH} characters`);
188
+ }
189
+ if (!SKILL_NAME_PATTERN.test(metadata.name)) {
190
+ errors.push('Skill name must be kebab-case (lowercase alphanumeric with hyphens)');
191
+ }
192
+ }
193
+ // Description validation
194
+ if (!metadata.description) {
195
+ errors.push('Skill description is required');
196
+ }
197
+ else if (metadata.description.length > MAX_DESCRIPTION_LENGTH) {
198
+ errors.push(`Skill description exceeds maximum length of ${MAX_DESCRIPTION_LENGTH} characters`);
199
+ }
200
+ // Optional field warnings
201
+ if (!metadata.version) {
202
+ warnings.push('No version specified');
203
+ }
204
+ return { valid: errors.length === 0, errors, warnings };
205
+ }
206
+ /**
207
+ * Validate skill content (SKILL.md body) for size and line count.
208
+ */
209
+ export function validateSkillContent(content) {
210
+ const errors = [];
211
+ const warnings = [];
212
+ const byteSize = Buffer.byteLength(content, 'utf8');
213
+ if (byteSize > MAX_CONTENT_SIZE_WARN) {
214
+ warnings.push(`Skill content is ${Math.round(byteSize / 1024)} KB (recommended max: ${MAX_CONTENT_SIZE_WARN / 1024} KB)`);
215
+ }
216
+ const lineCount = content.split('\n').length;
217
+ if (lineCount > MAX_LINE_COUNT_WARN) {
218
+ warnings.push(`Skill content has ${lineCount} lines (recommended max: ${MAX_LINE_COUNT_WARN})`);
219
+ }
220
+ return { valid: errors.length === 0, errors, warnings };
221
+ }
222
+ // ============================================================
223
+ // File CRUD Operations
224
+ // ============================================================
225
+ /**
226
+ * Check if a skill exists in a world.
227
+ */
228
+ export async function skillExists(rootPath, worldId, skillName) {
229
+ try {
230
+ const filePath = getSkillFilePath(rootPath, worldId, skillName);
231
+ await fs.access(filePath);
232
+ return true;
233
+ }
234
+ catch {
235
+ return false;
236
+ }
237
+ }
238
+ /**
239
+ * Save a SKILL.md file for a skill.
240
+ */
241
+ export async function saveSkillFile(rootPath, worldId, skillName, content) {
242
+ await ensureSkillDirectory(rootPath, worldId, skillName);
243
+ const filePath = getSkillFilePath(rootPath, worldId, skillName);
244
+ assertSafePath(filePath, getSkillsDir(rootPath, worldId));
245
+ await fs.writeFile(filePath, content, 'utf8');
246
+ }
247
+ /**
248
+ * Load a SKILL.md file content for a skill.
249
+ */
250
+ export async function loadSkillFile(rootPath, worldId, skillName) {
251
+ const filePath = getSkillFilePath(rootPath, worldId, skillName);
252
+ assertSafePath(filePath, getSkillsDir(rootPath, worldId));
253
+ return fs.readFile(filePath, 'utf8');
254
+ }
255
+ /**
256
+ * Delete a skill directory and all its contents.
257
+ */
258
+ export async function deleteSkillFolder(rootPath, worldId, skillName) {
259
+ try {
260
+ const skillDir = getSkillDir(rootPath, worldId, skillName);
261
+ assertSafePath(skillDir, getSkillsDir(rootPath, worldId));
262
+ await fs.rm(skillDir, { recursive: true, force: true });
263
+ return true;
264
+ }
265
+ catch {
266
+ return false;
267
+ }
268
+ }
269
+ /**
270
+ * List all skill folder names in a world's skills directory.
271
+ */
272
+ export async function listSkillFolders(rootPath, worldId) {
273
+ try {
274
+ const skillsDir = getSkillsDir(rootPath, worldId);
275
+ const entries = await fs.readdir(skillsDir, { withFileTypes: true });
276
+ return entries
277
+ .filter(entry => entry.isDirectory())
278
+ .map(entry => entry.name);
279
+ }
280
+ catch {
281
+ return [];
282
+ }
283
+ }
284
+ // ============================================================
285
+ // High-Level Operations
286
+ // ============================================================
287
+ /**
288
+ * Get a full WorldSkill object for a specific skill.
289
+ */
290
+ export async function getWorldSkill(rootPath, worldId, skillName) {
291
+ try {
292
+ const raw = await loadSkillFile(rootPath, worldId, skillName);
293
+ const skillData = parseSkillFile(raw);
294
+ const dirPath = getSkillDir(rootPath, worldId, skillName);
295
+ const filePath = getSkillFilePath(rootPath, worldId, skillName);
296
+ return {
297
+ metadata: skillData.metadata,
298
+ content: skillData.content,
299
+ dirPath,
300
+ filePath,
301
+ contentSize: Buffer.byteLength(raw, 'utf8'),
302
+ };
303
+ }
304
+ catch {
305
+ return null;
306
+ }
307
+ }
308
+ /**
309
+ * Get just the metadata for a specific skill.
310
+ */
311
+ export async function getWorldSkillMetadata(rootPath, worldId, skillName) {
312
+ try {
313
+ const raw = await loadSkillFile(rootPath, worldId, skillName);
314
+ return extractSkillMetadata(raw);
315
+ }
316
+ catch {
317
+ return null;
318
+ }
319
+ }
320
+ /**
321
+ * List all WorldSkill objects in a world.
322
+ */
323
+ export async function listWorldSkills(rootPath, worldId) {
324
+ const folders = await listSkillFolders(rootPath, worldId);
325
+ const skills = [];
326
+ for (const folder of folders) {
327
+ const skill = await getWorldSkill(rootPath, worldId, folder);
328
+ if (skill) {
329
+ skills.push(skill);
330
+ }
331
+ }
332
+ return skills;
333
+ }
334
+ /**
335
+ * List skill metadata for all skills in a world.
336
+ * Uses `.meta.json` cache for fast listing; falls back to SKILL.md parsing.
337
+ */
338
+ export async function listWorldSkillsMetadata(rootPath, worldId) {
339
+ // Try cache first
340
+ const cached = await loadMetaCache(rootPath, worldId);
341
+ if (cached) {
342
+ return cached;
343
+ }
344
+ // Fallback: parse all SKILL.md files
345
+ const folders = await listSkillFolders(rootPath, worldId);
346
+ const metadataList = [];
347
+ for (const folder of folders) {
348
+ const metadata = await getWorldSkillMetadata(rootPath, worldId, folder);
349
+ if (metadata) {
350
+ metadataList.push(metadata);
351
+ }
352
+ }
353
+ // Write collected metadata to cache for next time (avoids re-reading all SKILL.md files)
354
+ if (metadataList.length > 0) {
355
+ try {
356
+ await ensureSkillsDirectory(rootPath, worldId);
357
+ const cachePath = getMetaCachePath(rootPath, worldId);
358
+ await fs.writeFile(cachePath, JSON.stringify(metadataList, null, 2), 'utf8');
359
+ }
360
+ catch {
361
+ // Cache write failure is non-critical
362
+ }
363
+ }
364
+ return metadataList;
365
+ }
366
+ /**
367
+ * Import a skill into a world from raw SKILL.md content.
368
+ * Validates metadata, rejects duplicates, and regenerates cache.
369
+ *
370
+ * @throws {DuplicateSkillError} if skill with same name already exists
371
+ * @throws {Error} if content is invalid
372
+ */
373
+ export async function importWorldSkill(rootPath, worldId, skillContent) {
374
+ // Parse and validate
375
+ const skillData = parseSkillFile(skillContent);
376
+ const metaValidation = validateSkillMetadata(skillData.metadata);
377
+ if (!metaValidation.valid) {
378
+ throw new Error(`Invalid skill metadata: ${metaValidation.errors.join(', ')}`);
379
+ }
380
+ const skillName = skillData.metadata.name;
381
+ // Check for duplicates
382
+ if (await skillExists(rootPath, worldId, skillName)) {
383
+ throw new DuplicateSkillError(skillName);
384
+ }
385
+ // Save skill file
386
+ await saveSkillFile(rootPath, worldId, skillName, skillContent);
387
+ // Regenerate metadata cache
388
+ await regenerateMetaCache(rootPath, worldId);
389
+ // Return the full WorldSkill object
390
+ return (await getWorldSkill(rootPath, worldId, skillName));
391
+ }
392
+ /**
393
+ * Export a skill's SKILL.md content as a raw string.
394
+ */
395
+ export async function exportWorldSkill(rootPath, worldId, skillName) {
396
+ try {
397
+ return await loadSkillFile(rootPath, worldId, skillName);
398
+ }
399
+ catch {
400
+ return null;
401
+ }
402
+ }
403
+ /**
404
+ * Delete a skill from a world and regenerate the metadata cache.
405
+ */
406
+ export async function deleteWorldSkill(rootPath, worldId, skillName) {
407
+ const deleted = await deleteSkillFolder(rootPath, worldId, skillName);
408
+ if (deleted) {
409
+ await regenerateMetaCache(rootPath, worldId);
410
+ }
411
+ return deleted;
412
+ }
413
+ /**
414
+ * Get total size (in bytes) of all SKILL.md files in a world.
415
+ */
416
+ export async function getWorldSkillsSize(rootPath, worldId) {
417
+ const folders = await listSkillFolders(rootPath, worldId);
418
+ let totalSize = 0;
419
+ for (const folder of folders) {
420
+ try {
421
+ const filePath = getSkillFilePath(rootPath, worldId, folder);
422
+ const stat = await fs.stat(filePath);
423
+ totalSize += stat.size;
424
+ }
425
+ catch {
426
+ // Skip unreadable files
427
+ }
428
+ }
429
+ return totalSize;
430
+ }
431
+ // ============================================================
432
+ // `.meta.json` Cache
433
+ // ============================================================
434
+ /**
435
+ * Regenerate the `.meta.json` metadata cache from all SKILL.md files.
436
+ */
437
+ export async function regenerateMetaCache(rootPath, worldId) {
438
+ await ensureSkillsDirectory(rootPath, worldId);
439
+ const folders = await listSkillFolders(rootPath, worldId);
440
+ const metadataList = [];
441
+ for (const folder of folders) {
442
+ try {
443
+ const raw = await loadSkillFile(rootPath, worldId, folder);
444
+ const metadata = extractSkillMetadata(raw);
445
+ metadataList.push(metadata);
446
+ }
447
+ catch {
448
+ // Skip malformed skill files
449
+ }
450
+ }
451
+ const cachePath = getMetaCachePath(rootPath, worldId);
452
+ await fs.writeFile(cachePath, JSON.stringify(metadataList, null, 2), 'utf8');
453
+ }
454
+ /**
455
+ * Load the `.meta.json` metadata cache.
456
+ * Returns null if cache is missing or corrupt.
457
+ */
458
+ export async function loadMetaCache(rootPath, worldId) {
459
+ try {
460
+ const cachePath = getMetaCachePath(rootPath, worldId);
461
+ const raw = await fs.readFile(cachePath, 'utf8');
462
+ const parsed = JSON.parse(raw);
463
+ if (!Array.isArray(parsed)) {
464
+ return null;
465
+ }
466
+ // Basic validation: ensure each entry has name and description
467
+ const valid = parsed.every((item) => typeof item.name === 'string' && typeof item.description === 'string');
468
+ return valid ? parsed : null;
469
+ }
470
+ catch {
471
+ return null;
472
+ }
473
+ }
474
+ //# sourceMappingURL=skill-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-storage.js","sourceRoot":"","sources":["../../../core/storage/skill-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * SQLite Database Schema for Agent World System
3
+ *
4
+ * Logger Category: storage.schema
5
+ * Purpose: Schema utilities and PRAGMA configuration
6
+ *
7
+ * Features:
8
+ * - PRAGMA configuration for performance and integrity
9
+ * - Schema version tracking (PRAGMA user_version)
10
+ * - Database statistics and integrity validation
11
+ * - Index and trigger creation utilities
12
+ *
13
+ * Schema Design:
14
+ * - worlds: Core world configuration and metadata
15
+ * - agents: Agent configuration with LLM settings
16
+ * - agent_memory: Current active conversation memory
17
+ * - memory_archives: Archive session metadata with rich information
18
+ * - archived_messages: Historical conversation content linked to archives
19
+ * - archive_statistics: Usage analytics and management data
20
+ * - world_chats: Chat session management
21
+ * - events: Event storage with sequences
22
+ * - event_sequences: Atomic sequence generation
23
+ *
24
+ * Implementation:
25
+ * - PRAGMA settings for performance and integrity
26
+ * - JSON column types for flexible configuration storage
27
+ * - Timestamp tracking for all operations
28
+ * - Cascading deletes for data consistency
29
+ * - Prepared statements for security and performance
30
+ * - 2025-11-02: Refactored to remove migration logic (now in migration-runner.ts)
31
+ * - 2025-11-02: Schema initialization deprecated - all databases use migration system (0000-0009)
32
+ * - 2025-11-02: Removed initializeSchema() - migration 0000 handles base schema creation
33
+ */
34
+ import type { Database } from 'sqlite3';
35
+ export interface SQLiteConfig {
36
+ database: string;
37
+ enableWAL?: boolean;
38
+ busyTimeout?: number;
39
+ cacheSize?: number;
40
+ enableForeignKeys?: boolean;
41
+ }
42
+ export interface ArchiveMetadata {
43
+ sessionName?: string;
44
+ archiveReason?: string;
45
+ messageCount: number;
46
+ startTime?: string;
47
+ endTime?: string;
48
+ participants: string[];
49
+ tags?: string[];
50
+ }
51
+ export interface ArchiveStatistics {
52
+ totalArchives: number;
53
+ totalMessages: number;
54
+ averageSessionLength: number;
55
+ mostActiveAgent: string;
56
+ archiveFrequency: {
57
+ [key: string]: number;
58
+ };
59
+ }
60
+ export interface SQLiteSchemaContext {
61
+ db: Database;
62
+ config: SQLiteConfig;
63
+ isInitialized: boolean;
64
+ }
65
+ export declare function createSQLiteSchemaContext(config: SQLiteConfig): Promise<SQLiteSchemaContext>;
66
+ export declare function configurePragmas(ctx: {
67
+ db: Database;
68
+ config: SQLiteConfig;
69
+ }): void;
70
+ /**
71
+ * @deprecated All schema initialization is now handled by the migration system.
72
+ * This file only provides utility functions for PRAGMA configuration and database introspection.
73
+ * Schema creation (tables, indexes, triggers) is defined in migrations/*.sql files.
74
+ */
75
+ export declare function getSchemaVersion(ctx: SQLiteSchemaContext): Promise<number>;
76
+ export declare function setSchemaVersion(ctx: SQLiteSchemaContext, version: number): Promise<void>;
77
+ /**
78
+ * Validate database integrity
79
+ * Checks for corruption and foreign key constraint violations
80
+ */
81
+ export declare function validateIntegrity(ctx: SQLiteSchemaContext): Promise<{
82
+ isValid: boolean;
83
+ errors: string[];
84
+ }>;
85
+ export declare function getDatabaseStats(ctx: SQLiteSchemaContext): Promise<{
86
+ worldCount: number;
87
+ agentCount: number;
88
+ activeMemoryCount: number;
89
+ archiveCount: number;
90
+ archivedMessageCount: number;
91
+ databaseSize: number;
92
+ }>;
93
+ export declare function closeSchema(ctx: SQLiteSchemaContext): Promise<void>;
94
+ export declare function getDatabase(ctx: SQLiteSchemaContext): Database;
95
+ //# sourceMappingURL=sqlite-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-schema.d.ts","sourceRoot":"","sources":["../../../core/storage/sqlite-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAUxC,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAGD,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAGD,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CAC7C;AAID,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,QAAQ,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqBlG;AAGD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG,IAAI,CAgBlF;AAED;;;;GAIG;AAEH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQhF;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/F;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAkBjH;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CAyBD;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,mBAAmB,GAAG,QAAQ,CAE9D"}