@revealui/ai 0.2.7 → 0.2.9

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 (220) hide show
  1. package/LICENSE +104 -17
  2. package/README.md +2 -2
  3. package/dist/a2a/card.d.ts +1 -1
  4. package/dist/a2a/card.d.ts.map +1 -1
  5. package/dist/a2a/card.js +4 -4
  6. package/dist/a2a/handler.d.ts +4 -4
  7. package/dist/a2a/handler.js +5 -5
  8. package/dist/a2a/index.d.ts +1 -1
  9. package/dist/a2a/index.js +1 -1
  10. package/dist/audit/emitter.d.ts +1 -1
  11. package/dist/audit/emitter.js +2 -2
  12. package/dist/audit/index.d.ts +2 -2
  13. package/dist/audit/index.js +2 -2
  14. package/dist/audit/store.d.ts +2 -2
  15. package/dist/audit/store.js +2 -2
  16. package/dist/client/errors.d.ts +13 -0
  17. package/dist/client/errors.d.ts.map +1 -0
  18. package/dist/client/errors.js +28 -0
  19. package/dist/client/hooks/useAgentContext.d.ts.map +1 -1
  20. package/dist/client/hooks/useAgentContext.js +6 -5
  21. package/dist/client/hooks/useAgentStream.d.ts +2 -2
  22. package/dist/client/hooks/useAgentStream.js +3 -3
  23. package/dist/client/hooks/useEpisodicMemory.d.ts.map +1 -1
  24. package/dist/client/hooks/useEpisodicMemory.js +6 -5
  25. package/dist/client/hooks/useWorkingMemory.d.ts.map +1 -1
  26. package/dist/client/hooks/useWorkingMemory.js +7 -6
  27. package/dist/embeddings/index.d.ts +1 -1
  28. package/dist/embeddings/index.js +4 -4
  29. package/dist/index.d.ts +1 -2
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +1 -2
  32. package/dist/inference/context-budget.d.ts +1 -1
  33. package/dist/inference/context-budget.js +4 -4
  34. package/dist/inference/index.d.ts +1 -1
  35. package/dist/inference/index.js +1 -1
  36. package/dist/inference/runRag.d.ts +3 -3
  37. package/dist/inference/runRag.d.ts.map +1 -1
  38. package/dist/inference/runRag.js +1 -1
  39. package/dist/inference/task-decomposer.d.ts +1 -1
  40. package/dist/inference/task-decomposer.d.ts.map +1 -1
  41. package/dist/inference/task-decomposer.js +3 -3
  42. package/dist/inference/tool-result-compressor.d.ts +1 -1
  43. package/dist/inference/tool-result-compressor.js +1 -1
  44. package/dist/ingestion/{cms-indexer.d.ts → admin-indexer.d.ts} +12 -12
  45. package/dist/ingestion/admin-indexer.d.ts.map +1 -0
  46. package/dist/ingestion/{cms-indexer.js → admin-indexer.js} +9 -9
  47. package/dist/ingestion/bm25.d.ts +1 -1
  48. package/dist/ingestion/bm25.js +1 -1
  49. package/dist/ingestion/file-parsers.d.ts +1 -1
  50. package/dist/ingestion/file-parsers.d.ts.map +1 -1
  51. package/dist/ingestion/file-parsers.js +36 -17
  52. package/dist/ingestion/hybrid-search.d.ts +1 -1
  53. package/dist/ingestion/hybrid-search.js +1 -1
  54. package/dist/ingestion/index.d.ts +1 -1
  55. package/dist/ingestion/index.d.ts.map +1 -1
  56. package/dist/ingestion/index.js +1 -1
  57. package/dist/ingestion/rag-vector-service.d.ts +1 -1
  58. package/dist/ingestion/rag-vector-service.js +1 -1
  59. package/dist/ingestion/reranker.d.ts +1 -1
  60. package/dist/ingestion/reranker.js +1 -1
  61. package/dist/ingestion/text-splitter.d.ts +1 -1
  62. package/dist/ingestion/text-splitter.js +2 -2
  63. package/dist/llm/cache-utils.d.ts.map +1 -1
  64. package/dist/llm/cache-utils.js +1 -17
  65. package/dist/llm/client.d.ts +8 -13
  66. package/dist/llm/client.d.ts.map +1 -1
  67. package/dist/llm/client.js +12 -60
  68. package/dist/llm/key-validator.d.ts +1 -1
  69. package/dist/llm/key-validator.js +8 -8
  70. package/dist/llm/providers/base.d.ts +2 -2
  71. package/dist/llm/providers/groq.d.ts +2 -2
  72. package/dist/llm/providers/groq.d.ts.map +1 -1
  73. package/dist/llm/providers/groq.js +4 -4
  74. package/dist/llm/providers/inference-snaps.d.ts +5 -5
  75. package/dist/llm/providers/inference-snaps.d.ts.map +1 -1
  76. package/dist/llm/providers/inference-snaps.js +6 -6
  77. package/dist/llm/providers/ollama.d.ts +2 -2
  78. package/dist/llm/providers/ollama.d.ts.map +1 -1
  79. package/dist/llm/providers/ollama.js +3 -3
  80. package/dist/llm/providers/{openai.d.ts → openai-compat.d.ts} +8 -7
  81. package/dist/llm/providers/openai-compat.d.ts.map +1 -0
  82. package/dist/llm/providers/{openai.js → openai-compat.js} +13 -17
  83. package/dist/llm/providers/vultr.d.ts.map +1 -1
  84. package/dist/llm/providers/vultr.js +1 -0
  85. package/dist/llm/server.d.ts +1 -3
  86. package/dist/llm/server.d.ts.map +1 -1
  87. package/dist/llm/server.js +1 -3
  88. package/dist/llm/token-counter.d.ts.map +1 -1
  89. package/dist/llm/token-counter.js +11 -8
  90. package/dist/llm/workspace-provider-config.d.ts +1 -1
  91. package/dist/llm/workspace-provider-config.d.ts.map +1 -1
  92. package/dist/llm/workspace-provider-config.js +1 -1
  93. package/dist/memory/crdt/or-set.d.ts +12 -0
  94. package/dist/memory/crdt/or-set.d.ts.map +1 -1
  95. package/dist/memory/crdt/or-set.js +27 -0
  96. package/dist/memory/index.d.ts +1 -0
  97. package/dist/memory/index.d.ts.map +1 -1
  98. package/dist/memory/index.js +1 -0
  99. package/dist/memory/persistence/crdt-persistence.d.ts +21 -1
  100. package/dist/memory/persistence/crdt-persistence.d.ts.map +1 -1
  101. package/dist/memory/persistence/crdt-persistence.js +67 -0
  102. package/dist/memory/preferences/user-preferences-manager.d.ts.map +1 -1
  103. package/dist/memory/preferences/user-preferences-manager.js +11 -1
  104. package/dist/memory/stores/episodic-memory.js +2 -2
  105. package/dist/memory/stores/working-memory.d.ts +7 -2
  106. package/dist/memory/stores/working-memory.d.ts.map +1 -1
  107. package/dist/memory/stores/working-memory.js +31 -17
  108. package/dist/memory/sync/index.d.ts +2 -0
  109. package/dist/memory/sync/index.d.ts.map +1 -0
  110. package/dist/memory/sync/index.js +1 -0
  111. package/dist/memory/sync/sync-manager.d.ts +104 -0
  112. package/dist/memory/sync/sync-manager.d.ts.map +1 -0
  113. package/dist/memory/sync/sync-manager.js +137 -0
  114. package/dist/memory/utils/validation.js +1 -1
  115. package/dist/memory/vector/vector-memory-service.d.ts +1 -1
  116. package/dist/memory/vector/vector-memory-service.js +1 -1
  117. package/dist/orchestration/agent.d.ts +2 -2
  118. package/dist/orchestration/defaults.d.ts +1 -1
  119. package/dist/orchestration/defaults.js +1 -1
  120. package/dist/orchestration/orchestrator.d.ts +3 -3
  121. package/dist/orchestration/orchestrator.js +3 -3
  122. package/dist/orchestration/runtime.d.ts +1 -1
  123. package/dist/orchestration/runtime.js +1 -1
  124. package/dist/orchestration/streaming-runtime.d.ts +2 -2
  125. package/dist/orchestration/streaming-runtime.js +2 -2
  126. package/dist/orchestration/ticket-agent.d.ts +11 -11
  127. package/dist/orchestration/ticket-agent.d.ts.map +1 -1
  128. package/dist/orchestration/ticket-agent.js +10 -10
  129. package/dist/skills/catalog/vercel-catalog.d.ts.map +1 -1
  130. package/dist/skills/catalog/vercel-catalog.js +7 -4
  131. package/dist/skills/loader/github-loader.d.ts.map +1 -1
  132. package/dist/skills/loader/github-loader.js +2 -0
  133. package/dist/skills/loader/local-loader.js +1 -1
  134. package/dist/skills/loader/vercel-loader.d.ts.map +1 -1
  135. package/dist/skills/loader/vercel-loader.js +2 -0
  136. package/dist/skills/parser/skill-md-parser.js +2 -2
  137. package/dist/skills/registry/skill-registry.js +1 -1
  138. package/dist/skills/types.d.ts +6 -6
  139. package/dist/templates/prompt-spec.js +1 -1
  140. package/dist/templates/skill-spec.js +1 -1
  141. package/dist/tools/{cms → admin}/collection-tools.d.ts +2 -2
  142. package/dist/tools/admin/collection-tools.d.ts.map +1 -0
  143. package/dist/tools/{cms → admin}/collection-tools.js +8 -8
  144. package/dist/tools/{cms → admin}/factory.d.ts +11 -11
  145. package/dist/tools/admin/factory.d.ts.map +1 -0
  146. package/dist/tools/{cms → admin}/factory.js +4 -4
  147. package/dist/tools/{cms → admin}/global-tools.d.ts +1 -1
  148. package/dist/tools/admin/global-tools.d.ts.map +1 -0
  149. package/dist/tools/{cms → admin}/global-tools.js +4 -4
  150. package/dist/tools/{cms → admin}/index.d.ts +4 -4
  151. package/dist/tools/admin/index.d.ts.map +1 -0
  152. package/dist/tools/{cms → admin}/index.js +3 -3
  153. package/dist/tools/{cms → admin}/media-tools.d.ts +1 -1
  154. package/dist/tools/admin/media-tools.d.ts.map +1 -0
  155. package/dist/tools/{cms → admin}/media-tools.js +4 -4
  156. package/dist/tools/{cms → admin}/user-tools.d.ts +1 -1
  157. package/dist/tools/admin/user-tools.d.ts.map +1 -0
  158. package/dist/tools/{cms → admin}/user-tools.js +1 -1
  159. package/dist/tools/coding/file-edit.d.ts +1 -1
  160. package/dist/tools/coding/file-edit.js +2 -2
  161. package/dist/tools/coding/file-glob.d.ts +1 -1
  162. package/dist/tools/coding/file-glob.d.ts.map +1 -1
  163. package/dist/tools/coding/file-glob.js +2 -1
  164. package/dist/tools/coding/file-grep.d.ts +1 -1
  165. package/dist/tools/coding/file-grep.d.ts.map +1 -1
  166. package/dist/tools/coding/file-grep.js +2 -1
  167. package/dist/tools/coding/file-read.d.ts +1 -1
  168. package/dist/tools/coding/file-read.d.ts.map +1 -1
  169. package/dist/tools/coding/file-read.js +15 -9
  170. package/dist/tools/coding/file-write.d.ts +1 -1
  171. package/dist/tools/coding/file-write.js +1 -1
  172. package/dist/tools/coding/git-ops.d.ts +1 -1
  173. package/dist/tools/coding/git-ops.d.ts.map +1 -1
  174. package/dist/tools/coding/git-ops.js +5 -7
  175. package/dist/tools/coding/index.d.ts +1 -1
  176. package/dist/tools/coding/index.d.ts.map +1 -1
  177. package/dist/tools/coding/lint-fix.d.ts +1 -1
  178. package/dist/tools/coding/lint-fix.d.ts.map +1 -1
  179. package/dist/tools/coding/lint-fix.js +8 -4
  180. package/dist/tools/coding/project-context.d.ts +1 -1
  181. package/dist/tools/coding/project-context.d.ts.map +1 -1
  182. package/dist/tools/coding/project-context.js +25 -24
  183. package/dist/tools/coding/safety.d.ts +1 -1
  184. package/dist/tools/coding/safety.d.ts.map +1 -1
  185. package/dist/tools/coding/shell-exec.d.ts +1 -1
  186. package/dist/tools/coding/shell-exec.js +1 -1
  187. package/dist/tools/coding/test-runner.d.ts +1 -1
  188. package/dist/tools/coding/test-runner.d.ts.map +1 -1
  189. package/dist/tools/coding/test-runner.js +12 -7
  190. package/dist/tools/deduplicator.js +1 -1
  191. package/dist/tools/document-summarizer.js +2 -2
  192. package/dist/tools/memory/store-memory.d.ts +1 -1
  193. package/dist/tools/memory/store-memory.js +2 -2
  194. package/dist/tools/ticket-tools.d.ts +2 -2
  195. package/dist/tools/ticket-tools.js +3 -3
  196. package/dist/tools/web/duck-duck-go.d.ts +3 -3
  197. package/dist/tools/web/duck-duck-go.js +4 -4
  198. package/dist/tools/web/exa.d.ts +1 -1
  199. package/dist/tools/web/exa.js +1 -1
  200. package/dist/tools/web/scraper.js +1 -1
  201. package/dist/tools/web/tavily.d.ts +2 -2
  202. package/dist/tools/web/tavily.js +2 -2
  203. package/dist/tools/web/types.d.ts +2 -2
  204. package/dist/tools/web/types.js +2 -2
  205. package/package.json +23 -17
  206. package/LICENSE.commercial +0 -111
  207. package/dist/ingestion/cms-indexer.d.ts.map +0 -1
  208. package/dist/llm/providers/anthropic.d.ts +0 -31
  209. package/dist/llm/providers/anthropic.d.ts.map +0 -1
  210. package/dist/llm/providers/anthropic.js +0 -264
  211. package/dist/llm/providers/bitnet.d.ts +0 -28
  212. package/dist/llm/providers/bitnet.d.ts.map +0 -1
  213. package/dist/llm/providers/bitnet.js +0 -36
  214. package/dist/llm/providers/openai.d.ts.map +0 -1
  215. package/dist/tools/cms/collection-tools.d.ts.map +0 -1
  216. package/dist/tools/cms/factory.d.ts.map +0 -1
  217. package/dist/tools/cms/global-tools.d.ts.map +0 -1
  218. package/dist/tools/cms/index.d.ts.map +0 -1
  219. package/dist/tools/cms/media-tools.d.ts.map +0 -1
  220. package/dist/tools/cms/user-tools.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAevC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,kCAAkC;IAClC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,KAAK,CACX,WAAW,GACX,YAAY,GACZ,WAAW,GACX,WAAW,GACX,WAAW,GACX,YAAY,GACZ,SAAS,GACT,iBAAiB,GACjB,aAAa,GACb,UAAU,CACb,CAAC;CACH;AAgBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAAE,CAmBnE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAevC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,kCAAkC;IAClC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,4CAA4C;IAC5C,OAAO,CAAC,EAAE,KAAK,CACX,WAAW,GACX,YAAY,GACZ,WAAW,GACX,WAAW,GACX,WAAW,GACX,YAAY,GACZ,SAAS,GACT,iBAAiB,GACjB,aAAa,GACb,UAAU,CACb,CAAC;CACH;AAgBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAAE,CAmBnE"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * lint_fixRun linter and optionally auto-fix issues
2
+ * lint_fix - Run linter and optionally auto-fix issues
3
3
  *
4
4
  * Detects the linter (Biome, ESLint) and runs it with machine-parseable
5
5
  * output. Returns structured diagnostic counts and details.
@@ -1 +1 @@
1
- {"version":3,"file":"lint-fix.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/lint-fix.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAwMnD,eAAO,MAAM,WAAW,EAAE,IAqHzB,CAAC"}
1
+ {"version":3,"file":"lint-fix.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/lint-fix.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AA6MnD,eAAO,MAAM,WAAW,EAAE,IAqHzB,CAAC"}
@@ -1,11 +1,11 @@
1
1
  /**
2
- * lint_fixRun linter and optionally auto-fix issues
2
+ * lint_fix - Run linter and optionally auto-fix issues
3
3
  *
4
4
  * Detects the linter (Biome, ESLint) and runs it with machine-parseable
5
5
  * output. Returns structured diagnostic counts and details.
6
6
  */
7
7
  import { execSync } from 'node:child_process';
8
- import { existsSync } from 'node:fs';
8
+ import { existsSync, readFileSync } from 'node:fs';
9
9
  import { join } from 'node:path';
10
10
  import { z } from 'zod/v4';
11
11
  import { getSafetyConfig } from './safety.js';
@@ -22,7 +22,7 @@ function detectLinter(projectRoot) {
22
22
  const pkgPath = join(projectRoot, 'package.json');
23
23
  if (existsSync(pkgPath)) {
24
24
  try {
25
- const pkg = JSON.parse(execSync(`cat "${pkgPath}"`, { encoding: 'utf8', timeout: 5000 }));
25
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
26
26
  const deps = {
27
27
  ...pkg.dependencies,
28
28
  ...pkg.devDependencies,
@@ -38,8 +38,12 @@ function detectLinter(projectRoot) {
38
38
  }
39
39
  return 'unknown';
40
40
  }
41
+ /** Validate that a file argument is safe for shell use (no metacharacters) */
42
+ function isSafeShellArg(arg) {
43
+ return /^[\w./@-]+$/.test(arg);
44
+ }
41
45
  function buildCommand(linter, file, fix) {
42
- const target = file ?? '.';
46
+ const target = file && isSafeShellArg(file) ? file : '.';
43
47
  switch (linter) {
44
48
  case 'biome':
45
49
  return fix ? `npx biome check --write ${target}` : `npx biome check ${target}`;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * project_contextQuery the harness content layer for relevant project rules and skills
2
+ * project_context - Query the harness content layer for relevant project rules and skills
3
3
  */
4
4
  import type { Tool } from '../base.js';
5
5
  export declare const projectContextTool: Tool;
@@ -1 +1 @@
1
- {"version":3,"file":"project-context.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/project-context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAuFnD,eAAO,MAAM,kBAAkB,EAAE,IAkDhC,CAAC"}
1
+ {"version":3,"file":"project-context.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/project-context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAyFnD,eAAO,MAAM,kBAAkB,EAAE,IAkDhC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * project_contextQuery the harness content layer for relevant project rules and skills
2
+ * project_context - Query the harness content layer for relevant project rules and skills
3
3
  */
4
- import { readdirSync, readFileSync, statSync } from 'node:fs';
4
+ import { readdirSync, readFileSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
6
  import { z } from 'zod/v4';
7
7
  import { getSafetyConfig } from './safety.js';
@@ -28,27 +28,28 @@ function searchContent(projectRoot, query, scope) {
28
28
  }
29
29
  for (const entry of entries) {
30
30
  const fullPath = join(dir, entry);
31
- try {
32
- const stat = statSync(fullPath);
33
- if (stat.isDirectory()) {
34
- // Check for skill directories with SKILL.md
35
- const skillPath = join(fullPath, 'SKILL.md');
36
- try {
37
- const content = readFileSync(skillPath, 'utf8');
38
- if (matchesQuery(content, queryTerms)) {
39
- results.push({
40
- id: entry,
41
- type: 'skill',
42
- path: skillPath.replace(`${projectRoot}/`, ''),
43
- content,
44
- });
45
- }
46
- }
47
- catch {
48
- // Not a skill directory, skip
31
+ // Try reading as skill directory first, then as markdown file
32
+ // (avoids TOCTOU race between stat and read)
33
+ if (!entry.includes('.')) {
34
+ // Likely a directory, check for SKILL.md
35
+ const skillPath = join(fullPath, 'SKILL.md');
36
+ try {
37
+ const content = readFileSync(skillPath, 'utf8');
38
+ if (matchesQuery(content, queryTerms)) {
39
+ results.push({
40
+ id: entry,
41
+ type: 'skill',
42
+ path: skillPath.replace(`${projectRoot}/`, ''),
43
+ content,
44
+ });
49
45
  }
50
46
  }
51
- else if (entry.endsWith('.md')) {
47
+ catch {
48
+ // Not a skill directory or not readable, skip
49
+ }
50
+ }
51
+ if (entry.endsWith('.md')) {
52
+ try {
52
53
  const content = readFileSync(fullPath, 'utf8');
53
54
  if (matchesQuery(content, queryTerms)) {
54
55
  results.push({
@@ -59,9 +60,9 @@ function searchContent(projectRoot, query, scope) {
59
60
  });
60
61
  }
61
62
  }
62
- }
63
- catch {
64
- // Directory not readable or does not exist — skip silently
63
+ catch {
64
+ // Not readable, skip
65
+ }
65
66
  }
66
67
  }
67
68
  }
@@ -3,7 +3,7 @@
3
3
  * Path sandboxing and command denylist for secure tool execution
4
4
  */
5
5
  export interface SafetyConfig {
6
- /** Project root directoryall file operations are sandboxed here */
6
+ /** Project root directory - all file operations are sandboxed here */
7
7
  projectRoot: string;
8
8
  /** Additional directories to allow (e.g., /tmp for scratch files) */
9
9
  allowedPaths?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/safety.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,gEAAgE;IAChE,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAiDD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CA0BpC;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAE9E;AAMD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAapC;AAQD,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAE1D;AAED,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/safety.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,gEAAgE;IAChE,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAiDD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CA0BpC;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAE9E;AAMD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAapC;AAQD,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAE1D;AAED,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * shell_execSandboxed shell command execution
2
+ * shell_exec - Sandboxed shell command execution
3
3
  */
4
4
  import type { Tool } from '../base.js';
5
5
  export declare const shellExecTool: Tool;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * shell_execSandboxed shell command execution
2
+ * shell_exec - Sandboxed shell command execution
3
3
  */
4
4
  import { execSync } from 'node:child_process';
5
5
  import { z } from 'zod/v4';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * test_runnerRun tests and return structured results
2
+ * test_runner - Run tests and return structured results
3
3
  *
4
4
  * Detects the test framework (Vitest, Jest, Mocha) and runs tests with
5
5
  * machine-parseable output. Returns structured pass/fail/skip counts
@@ -1 +1 @@
1
- {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/test-runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAqJnD,eAAO,MAAM,cAAc,EAAE,IA0G5B,CAAC"}
1
+ {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../../src/tools/coding/test-runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AA2JnD,eAAO,MAAM,cAAc,EAAE,IA0G5B,CAAC"}
@@ -1,12 +1,12 @@
1
1
  /**
2
- * test_runnerRun tests and return structured results
2
+ * test_runner - Run tests and return structured results
3
3
  *
4
4
  * Detects the test framework (Vitest, Jest, Mocha) and runs tests with
5
5
  * machine-parseable output. Returns structured pass/fail/skip counts
6
6
  * and failure details.
7
7
  */
8
8
  import { execSync } from 'node:child_process';
9
- import { existsSync } from 'node:fs';
9
+ import { existsSync, readFileSync } from 'node:fs';
10
10
  import { join } from 'node:path';
11
11
  import { z } from 'zod/v4';
12
12
  import { getSafetyConfig } from './safety.js';
@@ -19,8 +19,7 @@ function detectFramework(projectRoot) {
19
19
  if (!existsSync(pkgPath))
20
20
  return 'unknown';
21
21
  try {
22
- // eslint-disable-next-line @typescript-eslint/no-require-imports
23
- const pkg = JSON.parse(execSync(`cat "${pkgPath}"`, { encoding: 'utf8', timeout: 5000 }));
22
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
24
23
  const deps = {
25
24
  ...pkg.dependencies,
26
25
  ...pkg.devDependencies,
@@ -37,12 +36,18 @@ function detectFramework(projectRoot) {
37
36
  }
38
37
  return 'unknown';
39
38
  }
39
+ /** Validate that an argument is safe for shell use (no metacharacters) */
40
+ function isSafeShellArg(arg) {
41
+ return /^[\w./@-]+$/.test(arg);
42
+ }
40
43
  function buildCommand(framework, file, grep) {
41
- const fileArg = file ? ` ${file}` : '';
42
- const grepArg = grep ? ` -t "${grep}"` : '';
44
+ const safeFile = file && isSafeShellArg(file) ? file : undefined;
45
+ const fileArg = safeFile ? ` ${safeFile}` : '';
46
+ const safeGrep = grep && isSafeShellArg(grep) ? grep : undefined;
47
+ const grepArg = safeGrep ? ` -t "${safeGrep}"` : '';
43
48
  switch (framework) {
44
49
  case 'vitest':
45
- return `npx vitest run${fileArg}${grep ? ` --reporter=verbose` : ''} --no-color`;
50
+ return `npx vitest run${fileArg}${safeGrep ? ` --reporter=verbose` : ''} --no-color`;
46
51
  case 'jest':
47
52
  return `npx jest${fileArg}${grepArg} --no-color --forceExit`;
48
53
  case 'mocha':
@@ -22,7 +22,7 @@ function stableStringify(obj) {
22
22
  }
23
23
  /**
24
24
  * Compute a stable cache key for a (toolName, params) pair.
25
- * Uses a simple djb2-style hashno crypto dep required.
25
+ * Uses a simple djb2-style hash - no crypto dep required.
26
26
  */
27
27
  function hashKey(toolName, params) {
28
28
  const raw = `${toolName}::${stableStringify(params)}`;
@@ -32,7 +32,7 @@ export function createDocumentSummarizerTool(_db, llmClient) {
32
32
  }
33
33
  const fullContent = chunks.map((c) => c.content).join('\n\n');
34
34
  const estimatedTokens = Math.ceil(fullContent.length / CHARS_PER_TOKEN);
35
- // Short documentreturn directly without LLM call
35
+ // Short document - return directly without LLM call
36
36
  if (estimatedTokens <= SHORT_DOCUMENT_TOKENS) {
37
37
  return {
38
38
  success: true,
@@ -45,7 +45,7 @@ export function createDocumentSummarizerTool(_db, llmClient) {
45
45
  metadata: { executionTime: Date.now() - start },
46
46
  };
47
47
  }
48
- // Long documentsummarize with LLM
48
+ // Long document - summarize with LLM
49
49
  const focusInstruction = focusQuestion
50
50
  ? `Focus especially on answering: "${focusQuestion}"`
51
51
  : '';
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Explicit memory storage tool that agents must call to persist information
5
5
  * to long-term episodic memory. Agents are never auto-enrolled into memory
6
- * writesthey must invoke this tool with a clear reason.
6
+ * writes - they must invoke this tool with a clear reason.
7
7
  *
8
8
  * GDPR rationale: Requiring explicit intent aligns with the data minimisation
9
9
  * principle (GDPR Art. 5(1)(c)) and purpose limitation principle (Art. 5(1)(b)).
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Explicit memory storage tool that agents must call to persist information
5
5
  * to long-term episodic memory. Agents are never auto-enrolled into memory
6
- * writesthey must invoke this tool with a clear reason.
6
+ * writes - they must invoke this tool with a clear reason.
7
7
  *
8
8
  * GDPR rationale: Requiring explicit intent aligns with the data minimisation
9
9
  * principle (GDPR Art. 5(1)(c)) and purpose limitation principle (Art. 5(1)(b)).
@@ -36,7 +36,7 @@ export function createStoreMemoryTool(memory, agentId) {
36
36
  name: 'store_memory',
37
37
  description: 'Explicitly store important information in long-term memory for future sessions. ' +
38
38
  'Only call this when information is genuinely valuable to retain. ' +
39
- 'Provide a clear reasonthis is required for privacy compliance.',
39
+ 'Provide a clear reason - this is required for privacy compliance.',
40
40
  parameters: StoreMemoryParamsSchema,
41
41
  async execute(params) {
42
42
  const { content, tags, reason } = StoreMemoryParamsSchema.parse(params);
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Ticket Mutation Tools
3
3
  *
4
- * Tools that allow an agent to update ticket state as it works
4
+ * Tools that allow an agent to update ticket state as it works -
5
5
  * closing a ticket when done, moving it between columns, and writing
6
6
  * its results back as a comment.
7
7
  *
8
8
  * These are injected by createTicketTools() and are always paired with
9
- * CMS tools so agents can act on content AND report back through the ticket.
9
+ * admin tools so agents can act on content AND report back through the ticket.
10
10
  */
11
11
  import type { Tool } from './base.js';
12
12
  /**
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Ticket Mutation Tools
3
3
  *
4
- * Tools that allow an agent to update ticket state as it works
4
+ * Tools that allow an agent to update ticket state as it works -
5
5
  * closing a ticket when done, moving it between columns, and writing
6
6
  * its results back as a comment.
7
7
  *
8
8
  * These are injected by createTicketTools() and are always paired with
9
- * CMS tools so agents can act on content AND report back through the ticket.
9
+ * admin tools so agents can act on content AND report back through the ticket.
10
10
  */
11
11
  import { z } from 'zod/v4';
12
12
  export function createTicketTools(ticketId, client) {
@@ -41,7 +41,7 @@ export function createTicketTools(ticketId, client) {
41
41
  };
42
42
  const addCommentTool = {
43
43
  name: 'add_ticket_comment',
44
- description: 'Write a comment on the current ticket. Use this to report what you did, what changed in the CMS, or why you could not complete the task.',
44
+ description: 'Write a comment on the current ticket. Use this to report what you did, what changed in the admin, or why you could not complete the task.',
45
45
  parameters: z.object({
46
46
  text: z.string().min(1).describe('The comment text to add to the ticket'),
47
47
  }),
@@ -4,13 +4,13 @@
4
4
  * Uses the DuckDuckGo Instant Answer API (no API key required).
5
5
  * Returns structured results suitable for agent consumption.
6
6
  *
7
- * Part of the WebSearch skill familysee types.ts for the
7
+ * Part of the WebSearch skill family - see types.ts for the
8
8
  * WebSearchProvider interface used by future Tavily/Exa backends (P4-3).
9
9
  */
10
10
  import type { Tool } from '../base.js';
11
11
  import type { WebSearchProvider, WebSearchResponse } from './types.js';
12
12
  /**
13
- * DuckDuckGo search providerzero-config, no API key required.
13
+ * DuckDuckGo search provider - zero-config, no API key required.
14
14
  *
15
15
  * Uses the DuckDuckGo Instant Answer API to retrieve the abstract summary
16
16
  * and related topics for a query.
@@ -38,7 +38,7 @@ export declare function createWebSearchTool(provider: WebSearchProvider): Tool;
38
38
  * Web search tool backed by DuckDuckGo (zero-config).
39
39
  *
40
40
  * Register this on any agent that needs live web access. Requires no
41
- * API keybacked by the DuckDuckGo Instant Answer API.
41
+ * API key - backed by the DuckDuckGo Instant Answer API.
42
42
  *
43
43
  * @example
44
44
  * ```typescript
@@ -4,7 +4,7 @@
4
4
  * Uses the DuckDuckGo Instant Answer API (no API key required).
5
5
  * Returns structured results suitable for agent consumption.
6
6
  *
7
- * Part of the WebSearch skill familysee types.ts for the
7
+ * Part of the WebSearch skill family - see types.ts for the
8
8
  * WebSearchProvider interface used by future Tavily/Exa backends (P4-3).
9
9
  */
10
10
  import { z } from 'zod/v4';
@@ -17,7 +17,7 @@ function estimateTokens(text) {
17
17
  // Provider
18
18
  // =============================================================================
19
19
  /**
20
- * DuckDuckGo search providerzero-config, no API key required.
20
+ * DuckDuckGo search provider - zero-config, no API key required.
21
21
  *
22
22
  * Uses the DuckDuckGo Instant Answer API to retrieve the abstract summary
23
23
  * and related topics for a query.
@@ -57,7 +57,7 @@ export class DuckDuckGoProvider {
57
57
  if (results.length >= maxResults)
58
58
  break;
59
59
  if (topic.Topics)
60
- continue; // category groupskip
60
+ continue; // category group - skip
61
61
  const text = topic.Text;
62
62
  const firstURL = topic.FirstURL;
63
63
  if (!(firstURL && text))
@@ -147,7 +147,7 @@ export function createWebSearchTool(provider) {
147
147
  * Web search tool backed by DuckDuckGo (zero-config).
148
148
  *
149
149
  * Register this on any agent that needs live web access. Requires no
150
- * API keybacked by the DuckDuckGo Instant Answer API.
150
+ * API key - backed by the DuckDuckGo Instant Answer API.
151
151
  *
152
152
  * @example
153
153
  * ```typescript
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import type { WebSearchProvider, WebSearchResponse } from './types.js';
11
11
  /**
12
- * Exa neural search providerBYOK, requires `EXA_API_KEY`.
12
+ * Exa neural search provider - BYOK, requires `EXA_API_KEY`.
13
13
  *
14
14
  * Exa uses embeddings to find semantically relevant results rather than
15
15
  * keyword matching. Best for research-oriented queries.
@@ -13,7 +13,7 @@ function estimateTokens(text) {
13
13
  return Math.ceil(text.length / 4);
14
14
  }
15
15
  /**
16
- * Exa neural search providerBYOK, requires `EXA_API_KEY`.
16
+ * Exa neural search provider - BYOK, requires `EXA_API_KEY`.
17
17
  *
18
18
  * Exa uses embeddings to find semantically relevant results rather than
19
19
  * keyword matching. Best for research-oriented queries.
@@ -96,7 +96,7 @@ export const webScraperTool = {
96
96
  if (content.length > maxChars) {
97
97
  content =
98
98
  content.slice(0, maxChars) +
99
- ' [content truncateduse document_summarize for full content]';
99
+ ' [content truncated - use document_summarize for full content]';
100
100
  truncated = true;
101
101
  }
102
102
  return {
@@ -2,14 +2,14 @@
2
2
  * Tavily Web Search Provider (P4-3)
3
3
  *
4
4
  * High-quality BYOK search backend using the Tavily Search API.
5
- * Tavily is optimised for LLM consumptionreturns clean, summarised
5
+ * Tavily is optimised for LLM consumption - returns clean, summarised
6
6
  * content rather than raw HTML. Requires a Tavily API key.
7
7
  *
8
8
  * @see https://docs.tavily.com/docs/tavily-api/rest_api
9
9
  */
10
10
  import type { WebSearchProvider, WebSearchResponse } from './types.js';
11
11
  /**
12
- * Tavily search providerBYOK, requires `TAVILY_API_KEY`.
12
+ * Tavily search provider - BYOK, requires `TAVILY_API_KEY`.
13
13
  *
14
14
  * Tavily returns high-quality, LLM-optimised results with relevance scoring.
15
15
  * Register via `AgentConfig.webSearchProvider` to replace the default
@@ -2,7 +2,7 @@
2
2
  * Tavily Web Search Provider (P4-3)
3
3
  *
4
4
  * High-quality BYOK search backend using the Tavily Search API.
5
- * Tavily is optimised for LLM consumptionreturns clean, summarised
5
+ * Tavily is optimised for LLM consumption - returns clean, summarised
6
6
  * content rather than raw HTML. Requires a Tavily API key.
7
7
  *
8
8
  * @see https://docs.tavily.com/docs/tavily-api/rest_api
@@ -13,7 +13,7 @@ function estimateTokens(text) {
13
13
  return Math.ceil(text.length / 4);
14
14
  }
15
15
  /**
16
- * Tavily search providerBYOK, requires `TAVILY_API_KEY`.
16
+ * Tavily search provider - BYOK, requires `TAVILY_API_KEY`.
17
17
  *
18
18
  * Tavily returns high-quality, LLM-optimised results with relevance scoring.
19
19
  * Register via `AgentConfig.webSearchProvider` to replace the default
@@ -3,8 +3,8 @@
3
3
  *
4
4
  * Shared types for web search tools and provider interface.
5
5
  * The WebSearchProvider interface enables swappable backends:
6
- * - DuckDuckGo (default, zero-config)P3-1
7
- * - Tavily, Exa (BYOK)P4-3
6
+ * - DuckDuckGo (default, zero-config) - P3-1
7
+ * - Tavily, Exa (BYOK) - P4-3
8
8
  */
9
9
  export interface WebSearchResult {
10
10
  title: string;
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Shared types for web search tools and provider interface.
5
5
  * The WebSearchProvider interface enables swappable backends:
6
- * - DuckDuckGo (default, zero-config)P3-1
7
- * - Tavily, Exa (BYOK)P4-3
6
+ * - DuckDuckGo (default, zero-config) - P3-1
7
+ * - Tavily, Exa (BYOK) - P4-3
8
8
  */
9
9
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revealui/ai",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
4
4
  "description": "[Pro] AI system for RevealUI - memory, LLM, orchestration, and tools",
5
5
  "keywords": [
6
6
  "agent",
@@ -21,23 +21,23 @@
21
21
  "url": "https://github.com/RevealUIStudio/revealui.git",
22
22
  "directory": "packages/ai"
23
23
  },
24
- "license": "SEE LICENSE IN ../../LICENSE.commercial",
24
+ "license": "FSL-1.1-MIT",
25
25
  "dependencies": {
26
- "lru-cache": "^11.2.5",
27
- "zod": "^4.3.5",
28
- "@revealui/contracts": "1.3.5",
29
- "@revealui/core": "0.5.4",
30
- "@revealui/db": "0.3.5"
26
+ "lru-cache": "^11.3.3",
27
+ "zod": "^4.3.6",
28
+ "@revealui/contracts": "1.3.7",
29
+ "@revealui/core": "0.5.6",
30
+ "@revealui/db": "0.3.7"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@testing-library/react": "^16.3.2",
34
- "@vitest/coverage-v8": "^4.0.18",
35
- "jsdom": "^29.0.1",
36
- "react": "^19.2.3",
37
- "react-dom": "^19.2.3",
34
+ "@vitest/coverage-v8": "^4.1.3",
35
+ "jsdom": "29.0.1",
36
+ "react": "^19.2.5",
37
+ "react-dom": "^19.2.5",
38
38
  "typescript": "^6.0.2",
39
- "vitest": "^4.0.18",
40
- "dev": "0.0.1"
39
+ "vitest": "^4.1.3",
40
+ "@revealui/dev": "0.1.0"
41
41
  },
42
42
  "engines": {
43
43
  "node": ">=24.13.0"
@@ -99,9 +99,9 @@
99
99
  "types": "./dist/llm/providers/base.d.ts",
100
100
  "import": "./dist/llm/providers/base.js"
101
101
  },
102
- "./tools/cms": {
103
- "types": "./dist/tools/cms/index.d.ts",
104
- "import": "./dist/tools/cms/index.js"
102
+ "./tools/admin": {
103
+ "types": "./dist/tools/admin/index.d.ts",
104
+ "import": "./dist/tools/admin/index.js"
105
105
  },
106
106
  "./tools/registry": {
107
107
  "types": "./dist/tools/registry.d.ts",
@@ -141,7 +141,8 @@
141
141
  }
142
142
  },
143
143
  "files": [
144
- "dist"
144
+ "dist",
145
+ "LICENSE"
145
146
  ],
146
147
  "funding": {
147
148
  "type": "commercial",
@@ -159,6 +160,11 @@
159
160
  },
160
161
  "type": "module",
161
162
  "types": "./dist/index.d.ts",
163
+ "homepage": "https://revealui.com",
164
+ "author": "RevealUI Studio <founder@revealui.com>",
165
+ "bugs": {
166
+ "url": "https://github.com/RevealUIStudio/revealui/issues"
167
+ },
162
168
  "scripts": {
163
169
  "build": "tsc",
164
170
  "clean": "rm -rf dist",