@stoneforge/quarry 0.1.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 (330) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +160 -0
  3. package/dist/api/index.d.ts +8 -0
  4. package/dist/api/index.d.ts.map +1 -0
  5. package/dist/api/index.js +8 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/quarry-api.d.ts +268 -0
  8. package/dist/api/quarry-api.d.ts.map +1 -0
  9. package/dist/api/quarry-api.js +3905 -0
  10. package/dist/api/quarry-api.js.map +1 -0
  11. package/dist/api/types.d.ts +1359 -0
  12. package/dist/api/types.d.ts.map +1 -0
  13. package/dist/api/types.js +204 -0
  14. package/dist/api/types.js.map +1 -0
  15. package/dist/bin/sf.d.ts +3 -0
  16. package/dist/bin/sf.d.ts.map +1 -0
  17. package/dist/bin/sf.js +9 -0
  18. package/dist/bin/sf.js.map +1 -0
  19. package/dist/cli/commands/admin.d.ts +11 -0
  20. package/dist/cli/commands/admin.d.ts.map +1 -0
  21. package/dist/cli/commands/admin.js +465 -0
  22. package/dist/cli/commands/admin.js.map +1 -0
  23. package/dist/cli/commands/alias.d.ts +8 -0
  24. package/dist/cli/commands/alias.d.ts.map +1 -0
  25. package/dist/cli/commands/alias.js +70 -0
  26. package/dist/cli/commands/alias.js.map +1 -0
  27. package/dist/cli/commands/channel.d.ts +13 -0
  28. package/dist/cli/commands/channel.d.ts.map +1 -0
  29. package/dist/cli/commands/channel.js +680 -0
  30. package/dist/cli/commands/channel.js.map +1 -0
  31. package/dist/cli/commands/completion.d.ts +8 -0
  32. package/dist/cli/commands/completion.d.ts.map +1 -0
  33. package/dist/cli/commands/completion.js +87 -0
  34. package/dist/cli/commands/completion.js.map +1 -0
  35. package/dist/cli/commands/config.d.ts +12 -0
  36. package/dist/cli/commands/config.d.ts.map +1 -0
  37. package/dist/cli/commands/config.js +242 -0
  38. package/dist/cli/commands/config.js.map +1 -0
  39. package/dist/cli/commands/crud.d.ts +64 -0
  40. package/dist/cli/commands/crud.d.ts.map +1 -0
  41. package/dist/cli/commands/crud.js +805 -0
  42. package/dist/cli/commands/crud.js.map +1 -0
  43. package/dist/cli/commands/dep.d.ts +16 -0
  44. package/dist/cli/commands/dep.d.ts.map +1 -0
  45. package/dist/cli/commands/dep.js +499 -0
  46. package/dist/cli/commands/dep.js.map +1 -0
  47. package/dist/cli/commands/document.d.ts +12 -0
  48. package/dist/cli/commands/document.d.ts.map +1 -0
  49. package/dist/cli/commands/document.js +1039 -0
  50. package/dist/cli/commands/document.js.map +1 -0
  51. package/dist/cli/commands/embeddings.d.ts +12 -0
  52. package/dist/cli/commands/embeddings.d.ts.map +1 -0
  53. package/dist/cli/commands/embeddings.js +273 -0
  54. package/dist/cli/commands/embeddings.js.map +1 -0
  55. package/dist/cli/commands/entity.d.ts +16 -0
  56. package/dist/cli/commands/entity.d.ts.map +1 -0
  57. package/dist/cli/commands/entity.js +522 -0
  58. package/dist/cli/commands/entity.js.map +1 -0
  59. package/dist/cli/commands/gc.d.ts +10 -0
  60. package/dist/cli/commands/gc.d.ts.map +1 -0
  61. package/dist/cli/commands/gc.js +257 -0
  62. package/dist/cli/commands/gc.js.map +1 -0
  63. package/dist/cli/commands/help.d.ts +11 -0
  64. package/dist/cli/commands/help.d.ts.map +1 -0
  65. package/dist/cli/commands/help.js +169 -0
  66. package/dist/cli/commands/help.js.map +1 -0
  67. package/dist/cli/commands/history.d.ts +9 -0
  68. package/dist/cli/commands/history.d.ts.map +1 -0
  69. package/dist/cli/commands/history.js +160 -0
  70. package/dist/cli/commands/history.js.map +1 -0
  71. package/dist/cli/commands/identity.d.ts +18 -0
  72. package/dist/cli/commands/identity.d.ts.map +1 -0
  73. package/dist/cli/commands/identity.js +698 -0
  74. package/dist/cli/commands/identity.js.map +1 -0
  75. package/dist/cli/commands/inbox.d.ts +20 -0
  76. package/dist/cli/commands/inbox.d.ts.map +1 -0
  77. package/dist/cli/commands/inbox.js +493 -0
  78. package/dist/cli/commands/inbox.js.map +1 -0
  79. package/dist/cli/commands/init.d.ts +20 -0
  80. package/dist/cli/commands/init.d.ts.map +1 -0
  81. package/dist/cli/commands/init.js +144 -0
  82. package/dist/cli/commands/init.js.map +1 -0
  83. package/dist/cli/commands/install.d.ts +9 -0
  84. package/dist/cli/commands/install.d.ts.map +1 -0
  85. package/dist/cli/commands/install.js +200 -0
  86. package/dist/cli/commands/install.js.map +1 -0
  87. package/dist/cli/commands/library.d.ts +12 -0
  88. package/dist/cli/commands/library.d.ts.map +1 -0
  89. package/dist/cli/commands/library.js +665 -0
  90. package/dist/cli/commands/library.js.map +1 -0
  91. package/dist/cli/commands/message.d.ts +11 -0
  92. package/dist/cli/commands/message.d.ts.map +1 -0
  93. package/dist/cli/commands/message.js +608 -0
  94. package/dist/cli/commands/message.js.map +1 -0
  95. package/dist/cli/commands/plan.d.ts +17 -0
  96. package/dist/cli/commands/plan.d.ts.map +1 -0
  97. package/dist/cli/commands/plan.js +698 -0
  98. package/dist/cli/commands/plan.js.map +1 -0
  99. package/dist/cli/commands/playbook.d.ts +12 -0
  100. package/dist/cli/commands/playbook.d.ts.map +1 -0
  101. package/dist/cli/commands/playbook.js +730 -0
  102. package/dist/cli/commands/playbook.js.map +1 -0
  103. package/dist/cli/commands/reset.d.ts +12 -0
  104. package/dist/cli/commands/reset.d.ts.map +1 -0
  105. package/dist/cli/commands/reset.js +306 -0
  106. package/dist/cli/commands/reset.js.map +1 -0
  107. package/dist/cli/commands/serve.d.ts +11 -0
  108. package/dist/cli/commands/serve.d.ts.map +1 -0
  109. package/dist/cli/commands/serve.js +106 -0
  110. package/dist/cli/commands/serve.js.map +1 -0
  111. package/dist/cli/commands/stats.d.ts +8 -0
  112. package/dist/cli/commands/stats.d.ts.map +1 -0
  113. package/dist/cli/commands/stats.js +82 -0
  114. package/dist/cli/commands/stats.js.map +1 -0
  115. package/dist/cli/commands/sync.d.ts +14 -0
  116. package/dist/cli/commands/sync.d.ts.map +1 -0
  117. package/dist/cli/commands/sync.js +370 -0
  118. package/dist/cli/commands/sync.js.map +1 -0
  119. package/dist/cli/commands/task.d.ts +25 -0
  120. package/dist/cli/commands/task.d.ts.map +1 -0
  121. package/dist/cli/commands/task.js +1153 -0
  122. package/dist/cli/commands/task.js.map +1 -0
  123. package/dist/cli/commands/team.d.ts +13 -0
  124. package/dist/cli/commands/team.d.ts.map +1 -0
  125. package/dist/cli/commands/team.js +471 -0
  126. package/dist/cli/commands/team.js.map +1 -0
  127. package/dist/cli/commands/workflow.d.ts +16 -0
  128. package/dist/cli/commands/workflow.d.ts.map +1 -0
  129. package/dist/cli/commands/workflow.js +753 -0
  130. package/dist/cli/commands/workflow.js.map +1 -0
  131. package/dist/cli/completion.d.ts +28 -0
  132. package/dist/cli/completion.d.ts.map +1 -0
  133. package/dist/cli/completion.js +295 -0
  134. package/dist/cli/completion.js.map +1 -0
  135. package/dist/cli/db.d.ts +38 -0
  136. package/dist/cli/db.d.ts.map +1 -0
  137. package/dist/cli/db.js +90 -0
  138. package/dist/cli/db.js.map +1 -0
  139. package/dist/cli/formatter.d.ts +87 -0
  140. package/dist/cli/formatter.d.ts.map +1 -0
  141. package/dist/cli/formatter.js +464 -0
  142. package/dist/cli/formatter.js.map +1 -0
  143. package/dist/cli/index.d.ts +33 -0
  144. package/dist/cli/index.d.ts.map +1 -0
  145. package/dist/cli/index.js +38 -0
  146. package/dist/cli/index.js.map +1 -0
  147. package/dist/cli/parser.d.ts +45 -0
  148. package/dist/cli/parser.d.ts.map +1 -0
  149. package/dist/cli/parser.js +256 -0
  150. package/dist/cli/parser.js.map +1 -0
  151. package/dist/cli/plugin-loader.d.ts +39 -0
  152. package/dist/cli/plugin-loader.d.ts.map +1 -0
  153. package/dist/cli/plugin-loader.js +165 -0
  154. package/dist/cli/plugin-loader.js.map +1 -0
  155. package/dist/cli/plugin-registry.d.ts +50 -0
  156. package/dist/cli/plugin-registry.d.ts.map +1 -0
  157. package/dist/cli/plugin-registry.js +206 -0
  158. package/dist/cli/plugin-registry.js.map +1 -0
  159. package/dist/cli/plugin-types.d.ts +106 -0
  160. package/dist/cli/plugin-types.d.ts.map +1 -0
  161. package/dist/cli/plugin-types.js +103 -0
  162. package/dist/cli/plugin-types.js.map +1 -0
  163. package/dist/cli/runner.d.ts +35 -0
  164. package/dist/cli/runner.d.ts.map +1 -0
  165. package/dist/cli/runner.js +340 -0
  166. package/dist/cli/runner.js.map +1 -0
  167. package/dist/cli/suggest.d.ts +15 -0
  168. package/dist/cli/suggest.d.ts.map +1 -0
  169. package/dist/cli/suggest.js +49 -0
  170. package/dist/cli/suggest.js.map +1 -0
  171. package/dist/cli/types.d.ts +138 -0
  172. package/dist/cli/types.d.ts.map +1 -0
  173. package/dist/cli/types.js +63 -0
  174. package/dist/cli/types.js.map +1 -0
  175. package/dist/config/config.d.ts +86 -0
  176. package/dist/config/config.d.ts.map +1 -0
  177. package/dist/config/config.js +348 -0
  178. package/dist/config/config.js.map +1 -0
  179. package/dist/config/defaults.d.ts +66 -0
  180. package/dist/config/defaults.d.ts.map +1 -0
  181. package/dist/config/defaults.js +114 -0
  182. package/dist/config/defaults.js.map +1 -0
  183. package/dist/config/duration.d.ts +75 -0
  184. package/dist/config/duration.d.ts.map +1 -0
  185. package/dist/config/duration.js +190 -0
  186. package/dist/config/duration.js.map +1 -0
  187. package/dist/config/env.d.ts +67 -0
  188. package/dist/config/env.d.ts.map +1 -0
  189. package/dist/config/env.js +207 -0
  190. package/dist/config/env.js.map +1 -0
  191. package/dist/config/file.d.ts +97 -0
  192. package/dist/config/file.d.ts.map +1 -0
  193. package/dist/config/file.js +365 -0
  194. package/dist/config/file.js.map +1 -0
  195. package/dist/config/index.d.ts +35 -0
  196. package/dist/config/index.d.ts.map +1 -0
  197. package/dist/config/index.js +41 -0
  198. package/dist/config/index.js.map +1 -0
  199. package/dist/config/merge.d.ts +53 -0
  200. package/dist/config/merge.d.ts.map +1 -0
  201. package/dist/config/merge.js +226 -0
  202. package/dist/config/merge.js.map +1 -0
  203. package/dist/config/types.d.ts +257 -0
  204. package/dist/config/types.d.ts.map +1 -0
  205. package/dist/config/types.js +72 -0
  206. package/dist/config/types.js.map +1 -0
  207. package/dist/config/validation.d.ts +55 -0
  208. package/dist/config/validation.d.ts.map +1 -0
  209. package/dist/config/validation.js +251 -0
  210. package/dist/config/validation.js.map +1 -0
  211. package/dist/http/index.d.ts +8 -0
  212. package/dist/http/index.d.ts.map +1 -0
  213. package/dist/http/index.js +12 -0
  214. package/dist/http/index.js.map +1 -0
  215. package/dist/http/sync-handlers.d.ts +162 -0
  216. package/dist/http/sync-handlers.d.ts.map +1 -0
  217. package/dist/http/sync-handlers.js +271 -0
  218. package/dist/http/sync-handlers.js.map +1 -0
  219. package/dist/index.d.ts +25 -0
  220. package/dist/index.d.ts.map +1 -0
  221. package/dist/index.js +69 -0
  222. package/dist/index.js.map +1 -0
  223. package/dist/server/index.d.ts +34 -0
  224. package/dist/server/index.d.ts.map +1 -0
  225. package/dist/server/index.js +3329 -0
  226. package/dist/server/index.js.map +1 -0
  227. package/dist/server/static.d.ts +18 -0
  228. package/dist/server/static.d.ts.map +1 -0
  229. package/dist/server/static.js +71 -0
  230. package/dist/server/static.js.map +1 -0
  231. package/dist/server/ws/broadcaster.d.ts +8 -0
  232. package/dist/server/ws/broadcaster.d.ts.map +1 -0
  233. package/dist/server/ws/broadcaster.js +7 -0
  234. package/dist/server/ws/broadcaster.js.map +1 -0
  235. package/dist/server/ws/handler.d.ts +55 -0
  236. package/dist/server/ws/handler.d.ts.map +1 -0
  237. package/dist/server/ws/handler.js +160 -0
  238. package/dist/server/ws/handler.js.map +1 -0
  239. package/dist/services/blocked-cache.d.ts +297 -0
  240. package/dist/services/blocked-cache.d.ts.map +1 -0
  241. package/dist/services/blocked-cache.js +755 -0
  242. package/dist/services/blocked-cache.js.map +1 -0
  243. package/dist/services/dependency.d.ts +205 -0
  244. package/dist/services/dependency.d.ts.map +1 -0
  245. package/dist/services/dependency.js +566 -0
  246. package/dist/services/dependency.js.map +1 -0
  247. package/dist/services/embeddings/fusion.d.ts +33 -0
  248. package/dist/services/embeddings/fusion.d.ts.map +1 -0
  249. package/dist/services/embeddings/fusion.js +34 -0
  250. package/dist/services/embeddings/fusion.js.map +1 -0
  251. package/dist/services/embeddings/index.d.ts +12 -0
  252. package/dist/services/embeddings/index.d.ts.map +1 -0
  253. package/dist/services/embeddings/index.js +10 -0
  254. package/dist/services/embeddings/index.js.map +1 -0
  255. package/dist/services/embeddings/local-provider.d.ts +31 -0
  256. package/dist/services/embeddings/local-provider.d.ts.map +1 -0
  257. package/dist/services/embeddings/local-provider.js +80 -0
  258. package/dist/services/embeddings/local-provider.js.map +1 -0
  259. package/dist/services/embeddings/service.d.ts +76 -0
  260. package/dist/services/embeddings/service.d.ts.map +1 -0
  261. package/dist/services/embeddings/service.js +153 -0
  262. package/dist/services/embeddings/service.js.map +1 -0
  263. package/dist/services/embeddings/types.d.ts +70 -0
  264. package/dist/services/embeddings/types.d.ts.map +1 -0
  265. package/dist/services/embeddings/types.js +8 -0
  266. package/dist/services/embeddings/types.js.map +1 -0
  267. package/dist/services/id-length-cache.d.ts +156 -0
  268. package/dist/services/id-length-cache.d.ts.map +1 -0
  269. package/dist/services/id-length-cache.js +197 -0
  270. package/dist/services/id-length-cache.js.map +1 -0
  271. package/dist/services/inbox.d.ts +147 -0
  272. package/dist/services/inbox.d.ts.map +1 -0
  273. package/dist/services/inbox.js +428 -0
  274. package/dist/services/inbox.js.map +1 -0
  275. package/dist/services/index.d.ts +10 -0
  276. package/dist/services/index.d.ts.map +1 -0
  277. package/dist/services/index.js +10 -0
  278. package/dist/services/index.js.map +1 -0
  279. package/dist/services/priority-service.d.ts +145 -0
  280. package/dist/services/priority-service.d.ts.map +1 -0
  281. package/dist/services/priority-service.js +272 -0
  282. package/dist/services/priority-service.js.map +1 -0
  283. package/dist/services/search-utils.d.ts +47 -0
  284. package/dist/services/search-utils.d.ts.map +1 -0
  285. package/dist/services/search-utils.js +83 -0
  286. package/dist/services/search-utils.js.map +1 -0
  287. package/dist/sync/hash.d.ts +48 -0
  288. package/dist/sync/hash.d.ts.map +1 -0
  289. package/dist/sync/hash.js +136 -0
  290. package/dist/sync/hash.js.map +1 -0
  291. package/dist/sync/index.d.ts +11 -0
  292. package/dist/sync/index.d.ts.map +1 -0
  293. package/dist/sync/index.js +16 -0
  294. package/dist/sync/index.js.map +1 -0
  295. package/dist/sync/merge.d.ts +80 -0
  296. package/dist/sync/merge.d.ts.map +1 -0
  297. package/dist/sync/merge.js +310 -0
  298. package/dist/sync/merge.js.map +1 -0
  299. package/dist/sync/serialization.d.ts +132 -0
  300. package/dist/sync/serialization.d.ts.map +1 -0
  301. package/dist/sync/serialization.js +306 -0
  302. package/dist/sync/serialization.js.map +1 -0
  303. package/dist/sync/service.d.ts +102 -0
  304. package/dist/sync/service.d.ts.map +1 -0
  305. package/dist/sync/service.js +493 -0
  306. package/dist/sync/service.js.map +1 -0
  307. package/dist/sync/types.d.ts +275 -0
  308. package/dist/sync/types.d.ts.map +1 -0
  309. package/dist/sync/types.js +76 -0
  310. package/dist/sync/types.js.map +1 -0
  311. package/dist/systems/identity.d.ts +479 -0
  312. package/dist/systems/identity.d.ts.map +1 -0
  313. package/dist/systems/identity.js +817 -0
  314. package/dist/systems/identity.js.map +1 -0
  315. package/dist/systems/index.d.ts +8 -0
  316. package/dist/systems/index.d.ts.map +1 -0
  317. package/dist/systems/index.js +29 -0
  318. package/dist/systems/index.js.map +1 -0
  319. package/package.json +121 -0
  320. package/web/assets/charts-vendor-D1YcbGux.js +55 -0
  321. package/web/assets/dnd-vendor-DmxE-_ZH.js +5 -0
  322. package/web/assets/editor-vendor-BxraAWts.js +279 -0
  323. package/web/assets/index-B77vv208.js +341 -0
  324. package/web/assets/index-CF_XnVLh.css +1 -0
  325. package/web/assets/router-vendor-BCKpRBrB.js +41 -0
  326. package/web/assets/ui-vendor-DUahGnbT.js +45 -0
  327. package/web/assets/utils-vendor-CfYKiENT.js +813 -0
  328. package/web/favicon.ico +0 -0
  329. package/web/index.html +23 -0
  330. package/web/logo.png +0 -0
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Configuration Validation
3
+ *
4
+ * Validates configuration values for correctness and consistency.
5
+ */
6
+ import { ValidationError, ErrorCode } from '@stoneforge/core';
7
+ import { isValidIdentityMode } from '../systems/identity.js';
8
+ import { MIN_EXPORT_DEBOUNCE, MAX_EXPORT_DEBOUNCE, MIN_TIME_TOLERANCE, MAX_TIME_TOLERANCE, MAX_TTL, } from './defaults.js';
9
+ import { validateDurationRange, formatDuration } from './duration.js';
10
+ // ============================================================================
11
+ // Field Validators
12
+ // ============================================================================
13
+ /**
14
+ * Validates an actor name
15
+ */
16
+ export function isValidActor(value) {
17
+ if (typeof value !== 'string') {
18
+ return false;
19
+ }
20
+ // Actor must be non-empty and contain only valid identifier characters
21
+ return value.length > 0 && /^[a-zA-Z0-9_-]+$/.test(value);
22
+ }
23
+ /**
24
+ * Validates actor and throws if invalid
25
+ */
26
+ export function validateActor(value) {
27
+ if (typeof value !== 'string') {
28
+ throw new ValidationError('Actor must be a string', ErrorCode.INVALID_INPUT, { field: 'actor', value, expected: 'string' });
29
+ }
30
+ if (value.length === 0) {
31
+ throw new ValidationError('Actor cannot be empty', ErrorCode.INVALID_INPUT, { field: 'actor', value });
32
+ }
33
+ if (!/^[a-zA-Z0-9_-]+$/.test(value)) {
34
+ throw new ValidationError('Actor must contain only alphanumeric characters, hyphens, and underscores', ErrorCode.INVALID_INPUT, { field: 'actor', value, expected: 'alphanumeric, hyphen, underscore' });
35
+ }
36
+ return value;
37
+ }
38
+ /**
39
+ * Validates a database filename
40
+ */
41
+ export function isValidDatabase(value) {
42
+ if (typeof value !== 'string') {
43
+ return false;
44
+ }
45
+ // Must be non-empty, end with .db, and not contain path separators
46
+ return (value.length > 0 &&
47
+ value.endsWith('.db') &&
48
+ !value.includes('/') &&
49
+ !value.includes('\\'));
50
+ }
51
+ /**
52
+ * Validates database and throws if invalid
53
+ */
54
+ export function validateDatabase(value) {
55
+ if (typeof value !== 'string') {
56
+ throw new ValidationError('Database must be a string', ErrorCode.INVALID_INPUT, { field: 'database', value, expected: 'string' });
57
+ }
58
+ if (value.length === 0) {
59
+ throw new ValidationError('Database cannot be empty', ErrorCode.INVALID_INPUT, { field: 'database', value });
60
+ }
61
+ if (!value.endsWith('.db')) {
62
+ throw new ValidationError('Database must end with .db extension', ErrorCode.INVALID_INPUT, { field: 'database', value, expected: '*.db' });
63
+ }
64
+ if (value.includes('/') || value.includes('\\')) {
65
+ throw new ValidationError('Database must be a filename, not a path', ErrorCode.INVALID_INPUT, { field: 'database', value });
66
+ }
67
+ return value;
68
+ }
69
+ /**
70
+ * Validates a JSONL filename
71
+ */
72
+ export function isValidJsonlFilename(value) {
73
+ if (typeof value !== 'string') {
74
+ return false;
75
+ }
76
+ return (value.length > 0 &&
77
+ value.endsWith('.jsonl') &&
78
+ !value.includes('/') &&
79
+ !value.includes('\\'));
80
+ }
81
+ /**
82
+ * Validates JSONL filename and throws if invalid
83
+ */
84
+ export function validateJsonlFilename(value, field) {
85
+ if (typeof value !== 'string') {
86
+ throw new ValidationError(`${field} must be a string`, ErrorCode.INVALID_INPUT, { field, value, expected: 'string' });
87
+ }
88
+ if (value.length === 0) {
89
+ throw new ValidationError(`${field} cannot be empty`, ErrorCode.INVALID_INPUT, { field, value });
90
+ }
91
+ if (!value.endsWith('.jsonl')) {
92
+ throw new ValidationError(`${field} must end with .jsonl extension`, ErrorCode.INVALID_INPUT, { field, value, expected: '*.jsonl' });
93
+ }
94
+ if (value.includes('/') || value.includes('\\')) {
95
+ throw new ValidationError(`${field} must be a filename, not a path`, ErrorCode.INVALID_INPUT, { field, value });
96
+ }
97
+ return value;
98
+ }
99
+ /**
100
+ * Validates playbook paths array
101
+ */
102
+ export function isValidPlaybookPaths(value) {
103
+ if (!Array.isArray(value)) {
104
+ return false;
105
+ }
106
+ return value.every((p) => typeof p === 'string' && p.length > 0);
107
+ }
108
+ /**
109
+ * Validates playbook paths and throws if invalid
110
+ */
111
+ export function validatePlaybookPaths(value) {
112
+ if (!Array.isArray(value)) {
113
+ throw new ValidationError('Playbook paths must be an array', ErrorCode.INVALID_INPUT, { field: 'playbooks.paths', value, expected: 'array of strings' });
114
+ }
115
+ for (let i = 0; i < value.length; i++) {
116
+ if (typeof value[i] !== 'string') {
117
+ throw new ValidationError(`Playbook path at index ${i} must be a string`, ErrorCode.INVALID_INPUT, { field: `playbooks.paths[${i}]`, value: value[i], expected: 'string' });
118
+ }
119
+ if (value[i].length === 0) {
120
+ throw new ValidationError(`Playbook path at index ${i} cannot be empty`, ErrorCode.INVALID_INPUT, { field: `playbooks.paths[${i}]`, value: value[i] });
121
+ }
122
+ }
123
+ return value;
124
+ }
125
+ // ============================================================================
126
+ // Full Configuration Validation
127
+ // ============================================================================
128
+ /**
129
+ * Validates a complete configuration object
130
+ *
131
+ * @param config - Configuration to validate
132
+ * @returns Validated configuration
133
+ * @throws ValidationError if validation fails
134
+ */
135
+ export function validateConfiguration(config) {
136
+ if (typeof config !== 'object' || config === null) {
137
+ throw new ValidationError('Configuration must be an object', ErrorCode.INVALID_INPUT, { value: config });
138
+ }
139
+ const obj = config;
140
+ // Validate actor (optional)
141
+ if (obj.actor !== undefined) {
142
+ validateActor(obj.actor);
143
+ }
144
+ // Validate database
145
+ if (typeof obj.database !== 'string') {
146
+ throw new ValidationError('Configuration must include database', ErrorCode.MISSING_REQUIRED_FIELD, { field: 'database' });
147
+ }
148
+ validateDatabase(obj.database);
149
+ // Validate sync
150
+ if (typeof obj.sync !== 'object' || obj.sync === null) {
151
+ throw new ValidationError('Configuration must include sync object', ErrorCode.MISSING_REQUIRED_FIELD, { field: 'sync' });
152
+ }
153
+ const sync = obj.sync;
154
+ if (typeof sync.autoExport !== 'boolean') {
155
+ throw new ValidationError('sync.autoExport must be a boolean', ErrorCode.INVALID_INPUT, { field: 'sync.autoExport', value: sync.autoExport, expected: 'boolean' });
156
+ }
157
+ if (typeof sync.exportDebounce !== 'number') {
158
+ throw new ValidationError('sync.exportDebounce must be a number', ErrorCode.INVALID_INPUT, { field: 'sync.exportDebounce', value: sync.exportDebounce, expected: 'number' });
159
+ }
160
+ validateDurationRange(sync.exportDebounce, MIN_EXPORT_DEBOUNCE, MAX_EXPORT_DEBOUNCE, 'sync.exportDebounce');
161
+ validateJsonlFilename(sync.elementsFile, 'sync.elementsFile');
162
+ validateJsonlFilename(sync.dependenciesFile, 'sync.dependenciesFile');
163
+ // Validate playbooks
164
+ if (typeof obj.playbooks !== 'object' || obj.playbooks === null) {
165
+ throw new ValidationError('Configuration must include playbooks object', ErrorCode.MISSING_REQUIRED_FIELD, { field: 'playbooks' });
166
+ }
167
+ const playbooks = obj.playbooks;
168
+ validatePlaybookPaths(playbooks.paths);
169
+ // Validate tombstone
170
+ if (typeof obj.tombstone !== 'object' || obj.tombstone === null) {
171
+ throw new ValidationError('Configuration must include tombstone object', ErrorCode.MISSING_REQUIRED_FIELD, { field: 'tombstone' });
172
+ }
173
+ const tombstone = obj.tombstone;
174
+ if (typeof tombstone.ttl !== 'number') {
175
+ throw new ValidationError('tombstone.ttl must be a number', ErrorCode.INVALID_INPUT, { field: 'tombstone.ttl', value: tombstone.ttl, expected: 'number' });
176
+ }
177
+ if (typeof tombstone.minTtl !== 'number') {
178
+ throw new ValidationError('tombstone.minTtl must be a number', ErrorCode.INVALID_INPUT, { field: 'tombstone.minTtl', value: tombstone.minTtl, expected: 'number' });
179
+ }
180
+ validateDurationRange(tombstone.ttl, tombstone.minTtl, MAX_TTL, 'tombstone.ttl');
181
+ validateDurationRange(tombstone.minTtl, 1, tombstone.ttl, 'tombstone.minTtl');
182
+ // Validate identity
183
+ if (typeof obj.identity !== 'object' || obj.identity === null) {
184
+ throw new ValidationError('Configuration must include identity object', ErrorCode.MISSING_REQUIRED_FIELD, { field: 'identity' });
185
+ }
186
+ const identity = obj.identity;
187
+ if (!isValidIdentityMode(identity.mode)) {
188
+ throw new ValidationError('identity.mode must be a valid identity mode', ErrorCode.INVALID_INPUT, { field: 'identity.mode', value: identity.mode, expected: ['soft', 'cryptographic', 'hybrid'] });
189
+ }
190
+ if (typeof identity.timeTolerance !== 'number') {
191
+ throw new ValidationError('identity.timeTolerance must be a number', ErrorCode.INVALID_INPUT, { field: 'identity.timeTolerance', value: identity.timeTolerance, expected: 'number' });
192
+ }
193
+ validateDurationRange(identity.timeTolerance, MIN_TIME_TOLERANCE, MAX_TIME_TOLERANCE, 'identity.timeTolerance');
194
+ return config;
195
+ }
196
+ /**
197
+ * Validates a configuration without throwing, returns result
198
+ */
199
+ export function validateConfigurationSafe(config) {
200
+ const errors = [];
201
+ const warnings = [];
202
+ try {
203
+ validateConfiguration(config);
204
+ return { valid: true, errors, warnings };
205
+ }
206
+ catch (err) {
207
+ if (err instanceof ValidationError) {
208
+ errors.push(err.message);
209
+ }
210
+ else {
211
+ errors.push(String(err));
212
+ }
213
+ return { valid: false, errors, warnings };
214
+ }
215
+ }
216
+ /**
217
+ * Validates partial configuration for merging
218
+ */
219
+ export function validatePartialConfiguration(config) {
220
+ if (config.actor !== undefined) {
221
+ validateActor(config.actor);
222
+ }
223
+ if (config.database !== undefined) {
224
+ validateDatabase(config.database);
225
+ }
226
+ if (config.sync?.exportDebounce !== undefined) {
227
+ validateDurationRange(config.sync.exportDebounce, MIN_EXPORT_DEBOUNCE, MAX_EXPORT_DEBOUNCE, 'sync.exportDebounce');
228
+ }
229
+ if (config.sync?.elementsFile !== undefined) {
230
+ validateJsonlFilename(config.sync.elementsFile, 'sync.elementsFile');
231
+ }
232
+ if (config.sync?.dependenciesFile !== undefined) {
233
+ validateJsonlFilename(config.sync.dependenciesFile, 'sync.dependenciesFile');
234
+ }
235
+ if (config.playbooks?.paths !== undefined) {
236
+ validatePlaybookPaths(config.playbooks.paths);
237
+ }
238
+ if (config.identity?.mode !== undefined && !isValidIdentityMode(config.identity.mode)) {
239
+ throw new ValidationError('identity.mode must be a valid identity mode', ErrorCode.INVALID_INPUT, { field: 'identity.mode', value: config.identity.mode, expected: ['soft', 'cryptographic', 'hybrid'] });
240
+ }
241
+ if (config.identity?.timeTolerance !== undefined) {
242
+ validateDurationRange(config.identity.timeTolerance, MIN_TIME_TOLERANCE, MAX_TIME_TOLERANCE, 'identity.timeTolerance');
243
+ }
244
+ // Cross-field validation for tombstone
245
+ if (config.tombstone?.ttl !== undefined && config.tombstone?.minTtl !== undefined) {
246
+ if (config.tombstone.ttl < config.tombstone.minTtl) {
247
+ throw new ValidationError(`tombstone.ttl (${formatDuration(config.tombstone.ttl)}) must be >= tombstone.minTtl (${formatDuration(config.tombstone.minTtl)})`, ErrorCode.INVALID_INPUT, { field: 'tombstone.ttl', value: config.tombstone.ttl, expected: `>= ${config.tombstone.minTtl}` });
248
+ }
249
+ }
250
+ }
251
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * HTTP Module - HTTP handlers for browser sync
3
+ *
4
+ * Provides framework-agnostic HTTP handlers that can be integrated
5
+ * with any HTTP server (Bun.serve, Express, Hono, etc.)
6
+ */
7
+ export { SyncHttpHandlers, createSyncHttpHandlers, type SyncPullRequest, type SyncPullResponse, type SyncPushRequest, type SyncPushResponse, type SyncExchangeRequest, type SyncExchangeResponse, type HttpResponse, getHttpStatus, parseRequestBody, serializeResponse, SYNC_CONTENT_TYPES, } from './sync-handlers.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,gBAAgB,EAChB,sBAAsB,EAEtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EAEjB,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * HTTP Module - HTTP handlers for browser sync
3
+ *
4
+ * Provides framework-agnostic HTTP handlers that can be integrated
5
+ * with any HTTP server (Bun.serve, Express, Hono, etc.)
6
+ */
7
+ export {
8
+ // Handler class
9
+ SyncHttpHandlers, createSyncHttpHandlers,
10
+ // Helpers
11
+ getHttpStatus, parseRequestBody, serializeResponse, SYNC_CONTENT_TYPES, } from './sync-handlers.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO;AACL,gBAAgB;AAChB,gBAAgB,EAChB,sBAAsB;AAStB,UAAU;AACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * HTTP Sync Handlers - Browser sync support via HTTP endpoints
3
+ *
4
+ * Provides framework-agnostic handlers for browser sync operations.
5
+ * These can be integrated with any HTTP framework (Bun.serve, Express, Hono, etc.)
6
+ *
7
+ * Implements the browser sync protocol from api/sync.md:
8
+ * 1. Browser exports local changes
9
+ * 2. HTTP POST to server with JSONL
10
+ * 3. Server merges with its state
11
+ * 4. Server exports current state
12
+ * 5. HTTP response with JSONL
13
+ * 6. Browser imports and merges
14
+ */
15
+ import type { StorageBackend } from '@stoneforge/storage';
16
+ import type { ImportResult, SyncStatus } from '../sync/types.js';
17
+ /**
18
+ * Request body for browser sync pull (export from server)
19
+ */
20
+ export interface SyncPullRequest {
21
+ /** Include ephemeral elements in export */
22
+ includeEphemeral?: boolean;
23
+ /** Include dependencies in export */
24
+ includeDependencies?: boolean;
25
+ }
26
+ /**
27
+ * Response for browser sync pull
28
+ */
29
+ export interface SyncPullResponse {
30
+ /** JSONL string of elements */
31
+ elements: string;
32
+ /** JSONL string of dependencies (if requested) */
33
+ dependencies?: string;
34
+ /** Element count */
35
+ elementCount: number;
36
+ /** Dependency count (if included) */
37
+ dependencyCount?: number;
38
+ /** Export timestamp */
39
+ exportedAt: string;
40
+ }
41
+ /**
42
+ * Request body for browser sync push (import to server)
43
+ */
44
+ export interface SyncPushRequest {
45
+ /** JSONL string of elements to import */
46
+ elements: string;
47
+ /** JSONL string of dependencies to import */
48
+ dependencies?: string;
49
+ /** Dry run - validate without applying changes */
50
+ dryRun?: boolean;
51
+ /** Force - remote always wins conflicts */
52
+ force?: boolean;
53
+ }
54
+ /**
55
+ * Response for browser sync push
56
+ */
57
+ export interface SyncPushResponse {
58
+ /** Import result with counts and conflicts */
59
+ result: ImportResult;
60
+ /** Server's current state after merge (for client to sync) */
61
+ serverState?: SyncPullResponse;
62
+ }
63
+ /**
64
+ * Request/Response for full bidirectional sync
65
+ */
66
+ export interface SyncExchangeRequest {
67
+ /** Client's elements to import */
68
+ elements: string;
69
+ /** Client's dependencies to import */
70
+ dependencies?: string;
71
+ /** Force - remote always wins conflicts */
72
+ force?: boolean;
73
+ }
74
+ export interface SyncExchangeResponse {
75
+ /** Import result from processing client data */
76
+ importResult: ImportResult;
77
+ /** Server's current state (for client to import) */
78
+ serverElements: string;
79
+ /** Server's dependencies (for client to import) */
80
+ serverDependencies: string;
81
+ /** Counts for client reference */
82
+ serverElementCount: number;
83
+ serverDependencyCount: number;
84
+ /** Sync timestamp */
85
+ syncedAt: string;
86
+ }
87
+ /**
88
+ * HTTP response envelope
89
+ */
90
+ export interface HttpResponse<T> {
91
+ success: boolean;
92
+ data?: T;
93
+ error?: {
94
+ code: string;
95
+ message: string;
96
+ details?: Record<string, unknown>;
97
+ };
98
+ }
99
+ /**
100
+ * HTTP handlers for browser sync operations
101
+ */
102
+ export declare class SyncHttpHandlers {
103
+ private backend;
104
+ private syncService;
105
+ constructor(backend: StorageBackend);
106
+ /**
107
+ * Handle GET /api/sync/status
108
+ *
109
+ * Returns current sync status including dirty element count
110
+ */
111
+ getStatus(): HttpResponse<SyncStatus>;
112
+ /**
113
+ * Handle GET /api/sync/pull or POST /api/sync/pull
114
+ *
115
+ * Exports server state as JSONL for client to import
116
+ */
117
+ pull(request?: SyncPullRequest): HttpResponse<SyncPullResponse>;
118
+ /**
119
+ * Handle POST /api/sync/push
120
+ *
121
+ * Imports client JSONL data to server
122
+ */
123
+ push(request: SyncPushRequest): HttpResponse<SyncPushResponse>;
124
+ /**
125
+ * Handle POST /api/sync/exchange
126
+ *
127
+ * Bidirectional sync in a single request:
128
+ * 1. Import client data
129
+ * 2. Export server state
130
+ * 3. Return both results
131
+ */
132
+ exchange(request: SyncExchangeRequest): HttpResponse<SyncExchangeResponse>;
133
+ /**
134
+ * Handle errors and return appropriate HTTP response
135
+ */
136
+ private handleError;
137
+ }
138
+ /**
139
+ * Create sync HTTP handlers for a storage backend
140
+ */
141
+ export declare function createSyncHttpHandlers(backend: StorageBackend): SyncHttpHandlers;
142
+ /**
143
+ * Map response to HTTP status code
144
+ */
145
+ export declare function getHttpStatus(response: HttpResponse<unknown>): number;
146
+ /**
147
+ * Supported content types for sync endpoints
148
+ */
149
+ export declare const SYNC_CONTENT_TYPES: {
150
+ readonly JSON: "application/json";
151
+ readonly JSONL: "application/jsonl";
152
+ readonly NDJSON: "application/x-ndjson";
153
+ };
154
+ /**
155
+ * Parse request body based on content type
156
+ */
157
+ export declare function parseRequestBody<T>(body: string, _contentType?: string): T;
158
+ /**
159
+ * Serialize response based on accept header
160
+ */
161
+ export declare function serializeResponse<T>(response: HttpResponse<T>): string;
162
+ //# sourceMappingURL=sync-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-handlers.d.ts","sourceRoot":"","sources":["../../src/http/sync-handlers.ts"],"names":[],"mappings":"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"}