@exaudeus/workrail 0.8.5 → 0.9.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 (424) hide show
  1. package/README.md +157 -403
  2. package/dist/application/services/enhanced-loop-validator.d.ts +2 -2
  3. package/dist/application/services/enhanced-loop-validator.js +12 -2
  4. package/dist/application/services/validation-engine.d.ts +8 -29
  5. package/dist/application/services/validation-engine.js +38 -21
  6. package/dist/application/services/workflow-compiler.d.ts +18 -0
  7. package/dist/application/services/workflow-compiler.js +79 -0
  8. package/dist/application/services/workflow-interpreter.d.ts +31 -0
  9. package/dist/application/services/workflow-interpreter.js +280 -0
  10. package/dist/application/services/workflow-service.d.ts +34 -32
  11. package/dist/application/services/workflow-service.js +93 -425
  12. package/dist/application/use-cases/get-next-step.d.ts +6 -10
  13. package/dist/application/use-cases/get-next-step.js +2 -6
  14. package/dist/application/use-cases/get-workflow.d.ts +8 -6
  15. package/dist/application/use-cases/get-workflow.js +42 -33
  16. package/dist/application/use-cases/list-workflows.d.ts +3 -3
  17. package/dist/application/use-cases/validate-step-output.d.ts +4 -4
  18. package/dist/application/use-cases/validate-workflow-file.d.ts +46 -0
  19. package/dist/application/use-cases/validate-workflow-file.js +57 -0
  20. package/dist/cli/commands/cleanup.d.ts +8 -0
  21. package/dist/cli/commands/cleanup.js +20 -0
  22. package/dist/cli/commands/index.d.ts +7 -0
  23. package/dist/cli/commands/index.js +21 -0
  24. package/dist/cli/commands/init.d.ts +11 -0
  25. package/dist/cli/commands/init.js +49 -0
  26. package/dist/cli/commands/list.d.ts +9 -0
  27. package/dist/cli/commands/list.js +34 -0
  28. package/dist/cli/commands/migrate.d.ts +78 -0
  29. package/dist/cli/commands/migrate.js +248 -0
  30. package/dist/cli/commands/sources.d.ts +21 -0
  31. package/dist/cli/commands/sources.js +87 -0
  32. package/dist/cli/commands/start.d.ts +8 -0
  33. package/dist/cli/commands/start.js +16 -0
  34. package/dist/cli/commands/validate.d.ts +6 -0
  35. package/dist/cli/commands/validate.js +55 -0
  36. package/dist/cli/interpret-result.d.ts +4 -0
  37. package/dist/cli/interpret-result.js +24 -0
  38. package/dist/cli/output-formatter.d.ts +10 -0
  39. package/dist/cli/output-formatter.js +97 -0
  40. package/dist/cli/types/cli-result.d.ts +23 -0
  41. package/dist/cli/types/cli-result.js +30 -0
  42. package/dist/cli/types/exit-code.d.ts +13 -0
  43. package/dist/cli/types/exit-code.js +23 -0
  44. package/dist/cli/types/index.d.ts +4 -0
  45. package/dist/cli/types/index.js +11 -0
  46. package/dist/cli.js +84 -278
  47. package/dist/config/app-config.d.ts +40 -0
  48. package/dist/config/app-config.js +58 -0
  49. package/dist/config/feature-flags.d.ts +10 -2
  50. package/dist/config/feature-flags.js +74 -12
  51. package/dist/core/error-handler.d.ts +18 -27
  52. package/dist/core/error-handler.js +24 -218
  53. package/dist/di/container.d.ts +12 -0
  54. package/dist/di/container.js +244 -0
  55. package/dist/di/tokens.d.ts +40 -0
  56. package/dist/di/tokens.js +42 -0
  57. package/dist/domain/execution/error.d.ts +32 -0
  58. package/dist/domain/execution/error.js +24 -0
  59. package/dist/domain/execution/event.d.ts +7 -0
  60. package/dist/domain/execution/event.js +11 -0
  61. package/dist/domain/execution/ids.d.ts +9 -0
  62. package/dist/domain/execution/ids.js +9 -0
  63. package/dist/domain/execution/result.d.ts +3 -0
  64. package/dist/domain/execution/result.js +10 -0
  65. package/dist/domain/execution/state.d.ts +57 -0
  66. package/dist/domain/execution/state.js +28 -0
  67. package/dist/errors/app-error.d.ts +23 -0
  68. package/dist/errors/factories.d.ts +6 -0
  69. package/dist/errors/factories.js +21 -0
  70. package/dist/errors/formatter.d.ts +2 -0
  71. package/dist/errors/formatter.js +32 -0
  72. package/dist/errors/index.d.ts +3 -0
  73. package/dist/errors/index.js +7 -0
  74. package/dist/index.d.ts +6 -1
  75. package/dist/index.js +10 -25
  76. package/dist/infrastructure/index.d.ts +0 -1
  77. package/dist/infrastructure/index.js +0 -1
  78. package/dist/infrastructure/session/DashboardHeartbeat.d.ts +8 -0
  79. package/dist/infrastructure/session/DashboardHeartbeat.js +39 -0
  80. package/dist/infrastructure/session/DashboardLockRelease.d.ts +2 -0
  81. package/dist/infrastructure/session/DashboardLockRelease.js +29 -0
  82. package/dist/infrastructure/session/HttpServer.d.ts +25 -6
  83. package/dist/infrastructure/session/HttpServer.js +245 -90
  84. package/dist/infrastructure/session/SessionDataNormalizer.js +12 -2
  85. package/dist/infrastructure/session/SessionDataValidator.js +12 -2
  86. package/dist/infrastructure/session/SessionManager.d.ts +5 -3
  87. package/dist/infrastructure/session/SessionManager.js +52 -6
  88. package/dist/infrastructure/storage/caching-workflow-storage.d.ts +30 -6
  89. package/dist/infrastructure/storage/caching-workflow-storage.js +105 -23
  90. package/dist/infrastructure/storage/enhanced-multi-source-workflow-storage.d.ts +13 -9
  91. package/dist/infrastructure/storage/enhanced-multi-source-workflow-storage.js +80 -54
  92. package/dist/infrastructure/storage/file-workflow-storage.d.ts +10 -8
  93. package/dist/infrastructure/storage/file-workflow-storage.js +48 -56
  94. package/dist/infrastructure/storage/git-workflow-storage.d.ts +7 -22
  95. package/dist/infrastructure/storage/git-workflow-storage.js +48 -103
  96. package/dist/infrastructure/storage/in-memory-storage.d.ts +10 -6
  97. package/dist/infrastructure/storage/in-memory-storage.js +18 -13
  98. package/dist/infrastructure/storage/plugin-workflow-storage.d.ts +6 -18
  99. package/dist/infrastructure/storage/plugin-workflow-storage.js +29 -51
  100. package/dist/infrastructure/storage/remote-workflow-storage.d.ts +8 -17
  101. package/dist/infrastructure/storage/remote-workflow-storage.js +33 -156
  102. package/dist/infrastructure/storage/schema-validating-workflow-storage.d.ts +21 -13
  103. package/dist/infrastructure/storage/schema-validating-workflow-storage.js +86 -24
  104. package/dist/infrastructure/storage/storage.d.ts +7 -5
  105. package/dist/infrastructure/storage/storage.js +7 -6
  106. package/dist/manifest.json +1093 -0
  107. package/dist/mcp/error-mapper.d.ts +9 -0
  108. package/dist/mcp/error-mapper.js +66 -0
  109. package/dist/mcp/handlers/session.d.ts +34 -0
  110. package/dist/mcp/handlers/session.js +135 -0
  111. package/dist/mcp/handlers/v2-workflow.d.ts +4 -0
  112. package/dist/mcp/handlers/v2-workflow.js +112 -0
  113. package/dist/mcp/handlers/workflow.d.ts +45 -0
  114. package/dist/mcp/handlers/workflow.js +167 -0
  115. package/dist/mcp/index.d.ts +16 -0
  116. package/dist/mcp/index.js +51 -0
  117. package/dist/mcp/output-schemas.d.ts +317 -0
  118. package/dist/mcp/output-schemas.js +91 -0
  119. package/dist/mcp/server.d.ts +3 -0
  120. package/dist/mcp/server.js +258 -0
  121. package/dist/mcp/tool-description-provider.d.ts +16 -0
  122. package/dist/mcp/tool-description-provider.js +43 -0
  123. package/dist/mcp/tool-descriptions.d.ts +2 -0
  124. package/dist/mcp/tool-descriptions.js +109 -0
  125. package/dist/mcp/tool-factory.d.ts +23 -0
  126. package/dist/mcp/tool-factory.js +14 -0
  127. package/dist/mcp/tools.d.ts +156 -0
  128. package/dist/mcp/tools.js +196 -0
  129. package/dist/mcp/types/tool-description-types.d.ts +8 -0
  130. package/dist/mcp/types/tool-description-types.js +24 -0
  131. package/dist/mcp/types.d.ts +25 -0
  132. package/dist/mcp/types.js +15 -0
  133. package/dist/mcp/v2/tool-registry.d.ts +11 -0
  134. package/dist/mcp/v2/tool-registry.js +26 -0
  135. package/dist/mcp/v2/tools.d.ts +20 -0
  136. package/dist/mcp/v2/tools.js +17 -0
  137. package/dist/mcp/validation/bounded-json.d.ts +3 -0
  138. package/dist/mcp/validation/bounded-json.js +22 -0
  139. package/dist/mcp/validation/workflow-next-prevalidate.d.ts +9 -0
  140. package/dist/mcp/validation/workflow-next-prevalidate.js +83 -0
  141. package/dist/mcp/zod-to-json-schema.d.ts +17 -0
  142. package/dist/mcp/zod-to-json-schema.js +134 -0
  143. package/dist/mcp-server.d.ts +1 -1
  144. package/dist/mcp-server.js +6 -424
  145. package/dist/runtime/adapters/in-memory-shutdown-events.d.ts +6 -0
  146. package/dist/runtime/adapters/in-memory-shutdown-events.js +20 -0
  147. package/dist/runtime/adapters/node-process-signals.d.ts +4 -0
  148. package/dist/runtime/adapters/node-process-signals.js +11 -0
  149. package/dist/runtime/adapters/node-process-terminator.d.ts +4 -0
  150. package/dist/runtime/adapters/node-process-terminator.js +17 -0
  151. package/dist/runtime/adapters/noop-process-signals.d.ts +4 -0
  152. package/dist/runtime/adapters/noop-process-signals.js +8 -0
  153. package/dist/runtime/adapters/throwing-process-terminator.d.ts +4 -0
  154. package/dist/runtime/adapters/throwing-process-terminator.js +9 -0
  155. package/dist/runtime/assert-never.d.ts +1 -0
  156. package/dist/runtime/assert-never.js +6 -0
  157. package/dist/runtime/brand.d.ts +5 -0
  158. package/dist/runtime/ports/process-signals.d.ts +4 -0
  159. package/dist/runtime/ports/process-signals.js +2 -0
  160. package/dist/runtime/ports/process-terminator.d.ts +8 -0
  161. package/dist/runtime/ports/process-terminator.js +2 -0
  162. package/dist/runtime/ports/shutdown-events.d.ts +11 -0
  163. package/dist/runtime/ports/shutdown-events.js +2 -0
  164. package/dist/runtime/process-lifecycle-policy.d.ts +5 -0
  165. package/dist/runtime/process-lifecycle-policy.js +2 -0
  166. package/dist/runtime/result.d.ts +17 -0
  167. package/dist/runtime/result.js +31 -0
  168. package/dist/runtime/runtime-mode.d.ts +9 -0
  169. package/dist/runtime/runtime-mode.js +2 -0
  170. package/dist/types/storage.d.ts +16 -5
  171. package/dist/types/storage.js +8 -0
  172. package/dist/types/validation.d.ts +27 -0
  173. package/dist/types/validation.js +10 -0
  174. package/dist/types/workflow-definition.d.ts +63 -0
  175. package/dist/types/workflow-definition.js +33 -0
  176. package/dist/types/workflow-source.d.ts +51 -0
  177. package/dist/types/workflow-source.js +128 -0
  178. package/dist/types/workflow.d.ts +28 -0
  179. package/dist/types/workflow.js +96 -0
  180. package/dist/utils/workflow-init.d.ts +1 -0
  181. package/dist/utils/workflow-init.js +38 -0
  182. package/dist/v2/durable-core/canonical/hashing.d.ts +11 -0
  183. package/dist/v2/durable-core/canonical/hashing.js +13 -0
  184. package/dist/v2/durable-core/canonical/jcs.d.ts +11 -0
  185. package/dist/v2/durable-core/canonical/jcs.js +65 -0
  186. package/dist/v2/durable-core/canonical/json-types.d.ts +6 -0
  187. package/dist/v2/durable-core/canonical/json-types.js +2 -0
  188. package/dist/v2/durable-core/canonical/json-zod.d.ts +2 -0
  189. package/dist/v2/durable-core/canonical/json-zod.js +7 -0
  190. package/dist/v2/durable-core/canonical/jsonl.d.ts +4 -0
  191. package/dist/v2/durable-core/canonical/jsonl.js +13 -0
  192. package/dist/v2/durable-core/ids/index.d.ts +23 -0
  193. package/dist/v2/durable-core/ids/index.js +46 -0
  194. package/dist/v2/durable-core/schemas/compiled-workflow/index.d.ts +47 -0
  195. package/dist/v2/durable-core/schemas/compiled-workflow/index.js +17 -0
  196. package/dist/v2/durable-core/schemas/session/events.d.ts +1812 -0
  197. package/dist/v2/durable-core/schemas/session/events.js +328 -0
  198. package/dist/v2/durable-core/schemas/session/index.d.ts +2 -0
  199. package/dist/v2/durable-core/schemas/session/index.js +8 -0
  200. package/dist/v2/durable-core/schemas/session/manifest.d.ts +57 -0
  201. package/dist/v2/durable-core/schemas/session/manifest.js +30 -0
  202. package/dist/v2/infra/local/crypto/index.d.ts +5 -0
  203. package/dist/v2/infra/local/crypto/index.js +12 -0
  204. package/dist/v2/infra/local/data-dir/index.d.ts +13 -0
  205. package/dist/v2/infra/local/data-dir/index.js +69 -0
  206. package/dist/v2/infra/local/fs/index.d.ts +26 -0
  207. package/dist/v2/infra/local/fs/index.js +156 -0
  208. package/dist/v2/infra/local/pinned-workflow-store/index.d.ts +11 -0
  209. package/dist/v2/infra/local/pinned-workflow-store/index.js +85 -0
  210. package/dist/v2/infra/local/session-lock/index.d.ts +12 -0
  211. package/dist/v2/infra/local/session-lock/index.js +44 -0
  212. package/dist/v2/infra/local/session-store/index.d.ts +22 -0
  213. package/dist/v2/infra/local/session-store/index.js +358 -0
  214. package/dist/v2/infra/local/sha256/index.d.ts +5 -0
  215. package/dist/v2/infra/local/sha256/index.js +12 -0
  216. package/dist/v2/ports/data-dir.port.d.ts +9 -0
  217. package/dist/v2/ports/data-dir.port.js +2 -0
  218. package/dist/v2/ports/fs.port.d.ts +41 -0
  219. package/dist/v2/ports/fs.port.js +2 -0
  220. package/dist/v2/ports/pinned-workflow-store.port.d.ts +11 -0
  221. package/dist/v2/ports/pinned-workflow-store.port.js +2 -0
  222. package/dist/v2/ports/session-event-log-store.port.d.ts +37 -0
  223. package/dist/v2/ports/session-event-log-store.port.js +2 -0
  224. package/dist/v2/ports/session-lock.port.d.ts +23 -0
  225. package/dist/v2/ports/session-lock.port.js +2 -0
  226. package/dist/v2/ports/sha256.port.d.ts +4 -0
  227. package/dist/v2/ports/sha256.port.js +2 -0
  228. package/dist/v2/projections/advance-outcomes.d.ts +23 -0
  229. package/dist/v2/projections/advance-outcomes.js +23 -0
  230. package/dist/v2/projections/capabilities.d.ts +27 -0
  231. package/dist/v2/projections/capabilities.js +33 -0
  232. package/dist/v2/projections/gaps.d.ts +29 -0
  233. package/dist/v2/projections/gaps.js +49 -0
  234. package/dist/v2/projections/node-outputs.d.ts +34 -0
  235. package/dist/v2/projections/node-outputs.js +73 -0
  236. package/dist/v2/projections/preferences.d.ts +28 -0
  237. package/dist/v2/projections/preferences.js +50 -0
  238. package/dist/v2/projections/run-dag.d.ts +42 -0
  239. package/dist/v2/projections/run-dag.js +186 -0
  240. package/dist/v2/projections/run-status-signals.d.ts +26 -0
  241. package/dist/v2/projections/run-status-signals.js +49 -0
  242. package/dist/v2/projections/session-health.d.ts +18 -0
  243. package/dist/v2/projections/session-health.js +15 -0
  244. package/dist/v2/read-only/v1-to-v2-shim.d.ts +3 -0
  245. package/dist/v2/read-only/v1-to-v2-shim.js +38 -0
  246. package/package.json +35 -10
  247. package/spec/mcp-api-v1.0.md +5 -5
  248. package/web/assets/services/data-normalizer.js +17 -2
  249. package/web/assets/services/pattern-recognizer.js +3 -1
  250. package/web/assets/services/session-data.js +13 -8
  251. package/web/assets/utils/formatters.js +34 -23
  252. package/workflows/CHANGELOG-bug-investigation.md +4 -4
  253. package/workflows/bug-investigation.agentic.json +156 -56
  254. package/workflows/coding-task-workflow-agentic.json +262 -0
  255. package/workflows/design-thinking-workflow-autonomous.agentic.json +215 -0
  256. package/workflows/design-thinking-workflow.json +198 -0
  257. package/workflows/mr-review-workflow.agentic.json +538 -0
  258. package/workflows/routines/context-gathering.json +0 -4
  259. package/workflows/routines/ideation.json +73 -0
  260. package/dist/application/app.d.ts +0 -29
  261. package/dist/application/app.d.ts.map +0 -1
  262. package/dist/application/app.js +0 -114
  263. package/dist/application/app.js.map +0 -1
  264. package/dist/application/decorators/simple-output-decorator.d.ts +0 -8
  265. package/dist/application/decorators/simple-output-decorator.js +0 -89
  266. package/dist/application/services/classification-engine.d.ts +0 -33
  267. package/dist/application/services/classification-engine.js +0 -258
  268. package/dist/application/services/compression-service.d.ts +0 -20
  269. package/dist/application/services/compression-service.js +0 -312
  270. package/dist/application/services/context-management-service.d.ts +0 -38
  271. package/dist/application/services/context-management-service.js +0 -301
  272. package/dist/application/services/context-optimizer.d.ts +0 -11
  273. package/dist/application/services/context-optimizer.js +0 -62
  274. package/dist/application/services/context-persistence-service.d.ts +0 -45
  275. package/dist/application/services/context-persistence-service.js +0 -273
  276. package/dist/application/services/documentation-service.d.ts +0 -20
  277. package/dist/application/services/documentation-service.js +0 -155
  278. package/dist/application/services/enhanced-error-service.d.ts.map +0 -1
  279. package/dist/application/services/enhanced-error-service.js.map +0 -1
  280. package/dist/application/services/loop-context-optimizer.d.ts +0 -8
  281. package/dist/application/services/loop-context-optimizer.js +0 -114
  282. package/dist/application/services/loop-execution-context.d.ts +0 -23
  283. package/dist/application/services/loop-execution-context.js +0 -188
  284. package/dist/application/services/loop-step-resolver.d.ts +0 -11
  285. package/dist/application/services/loop-step-resolver.js +0 -70
  286. package/dist/application/services/validation-engine.d.ts.map +0 -1
  287. package/dist/application/services/validation-engine.js.map +0 -1
  288. package/dist/application/services/workflow-service.d.ts.map +0 -1
  289. package/dist/application/services/workflow-service.js.map +0 -1
  290. package/dist/application/use-cases/get-next-step.d.ts.map +0 -1
  291. package/dist/application/use-cases/get-next-step.js.map +0 -1
  292. package/dist/application/use-cases/get-workflow-docs.d.ts +0 -4
  293. package/dist/application/use-cases/get-workflow-docs.js +0 -12
  294. package/dist/application/use-cases/get-workflow.d.ts.map +0 -1
  295. package/dist/application/use-cases/get-workflow.js.map +0 -1
  296. package/dist/application/use-cases/get-workrail-help.d.ts +0 -4
  297. package/dist/application/use-cases/get-workrail-help.js +0 -12
  298. package/dist/application/use-cases/list-workflows.d.ts.map +0 -1
  299. package/dist/application/use-cases/list-workflows.js.map +0 -1
  300. package/dist/application/use-cases/validate-step-output.d.ts.map +0 -1
  301. package/dist/application/use-cases/validate-step-output.js.map +0 -1
  302. package/dist/application/use-cases/validate-workflow-json.d.ts.map +0 -1
  303. package/dist/application/use-cases/validate-workflow-json.js.map +0 -1
  304. package/dist/application/validation.d.ts.map +0 -1
  305. package/dist/application/validation.js.map +0 -1
  306. package/dist/cli/migrate-workflow.d.ts +0 -22
  307. package/dist/cli/migrate-workflow.js +0 -196
  308. package/dist/cli.d.ts.map +0 -1
  309. package/dist/cli.js.map +0 -1
  310. package/dist/container.d.ts +0 -15
  311. package/dist/container.d.ts.map +0 -1
  312. package/dist/container.js +0 -25
  313. package/dist/container.js.map +0 -1
  314. package/dist/core/error-handler.d.ts.map +0 -1
  315. package/dist/core/error-handler.js.map +0 -1
  316. package/dist/domain/index.d.ts +0 -2
  317. package/dist/domain/index.d.ts.map +0 -1
  318. package/dist/domain/index.js +0 -18
  319. package/dist/domain/index.js.map +0 -1
  320. package/dist/index.d.ts.map +0 -1
  321. package/dist/index.js.map +0 -1
  322. package/dist/infrastructure/index.d.ts.map +0 -1
  323. package/dist/infrastructure/index.js.map +0 -1
  324. package/dist/infrastructure/rpc/handler.d.ts +0 -17
  325. package/dist/infrastructure/rpc/handler.d.ts.map +0 -1
  326. package/dist/infrastructure/rpc/handler.js +0 -78
  327. package/dist/infrastructure/rpc/handler.js.map +0 -1
  328. package/dist/infrastructure/rpc/index.d.ts +0 -1
  329. package/dist/infrastructure/rpc/index.d.ts.map +0 -1
  330. package/dist/infrastructure/rpc/index.js +0 -17
  331. package/dist/infrastructure/rpc/index.js.map +0 -1
  332. package/dist/infrastructure/rpc/server.d.ts +0 -3
  333. package/dist/infrastructure/rpc/server.d.ts.map +0 -1
  334. package/dist/infrastructure/rpc/server.js +0 -37
  335. package/dist/infrastructure/rpc/server.js.map +0 -1
  336. package/dist/infrastructure/storage/caching-workflow-storage.d.ts.map +0 -1
  337. package/dist/infrastructure/storage/caching-workflow-storage.js.map +0 -1
  338. package/dist/infrastructure/storage/context-storage.d.ts +0 -150
  339. package/dist/infrastructure/storage/context-storage.js +0 -40
  340. package/dist/infrastructure/storage/file-workflow-storage.d.ts.map +0 -1
  341. package/dist/infrastructure/storage/file-workflow-storage.js.map +0 -1
  342. package/dist/infrastructure/storage/filesystem-blob-storage.d.ts +0 -27
  343. package/dist/infrastructure/storage/filesystem-blob-storage.js +0 -363
  344. package/dist/infrastructure/storage/git-workflow-storage.d.ts.map +0 -1
  345. package/dist/infrastructure/storage/git-workflow-storage.js.map +0 -1
  346. package/dist/infrastructure/storage/hybrid-context-storage.d.ts +0 -29
  347. package/dist/infrastructure/storage/hybrid-context-storage.js +0 -400
  348. package/dist/infrastructure/storage/in-memory-storage.d.ts.map +0 -1
  349. package/dist/infrastructure/storage/in-memory-storage.js.map +0 -1
  350. package/dist/infrastructure/storage/index.d.ts.map +0 -1
  351. package/dist/infrastructure/storage/index.js.map +0 -1
  352. package/dist/infrastructure/storage/migrations/001_initial_schema.sql +0 -38
  353. package/dist/infrastructure/storage/migrations/002_context_concurrency_enhancements.sql +0 -234
  354. package/dist/infrastructure/storage/migrations/003_classification_overrides.sql +0 -20
  355. package/dist/infrastructure/storage/multi-directory-workflow-storage.d.ts +0 -32
  356. package/dist/infrastructure/storage/multi-directory-workflow-storage.d.ts.map +0 -1
  357. package/dist/infrastructure/storage/multi-directory-workflow-storage.js +0 -184
  358. package/dist/infrastructure/storage/multi-directory-workflow-storage.js.map +0 -1
  359. package/dist/infrastructure/storage/plugin-workflow-storage.d.ts.map +0 -1
  360. package/dist/infrastructure/storage/plugin-workflow-storage.js.map +0 -1
  361. package/dist/infrastructure/storage/remote-workflow-storage.d.ts.map +0 -1
  362. package/dist/infrastructure/storage/remote-workflow-storage.js.map +0 -1
  363. package/dist/infrastructure/storage/schema-validating-workflow-storage.d.ts.map +0 -1
  364. package/dist/infrastructure/storage/schema-validating-workflow-storage.js.map +0 -1
  365. package/dist/infrastructure/storage/sqlite-metadata-storage.d.ts +0 -35
  366. package/dist/infrastructure/storage/sqlite-metadata-storage.js +0 -410
  367. package/dist/infrastructure/storage/sqlite-migrator.d.ts +0 -46
  368. package/dist/infrastructure/storage/sqlite-migrator.js +0 -293
  369. package/dist/infrastructure/storage/storage.d.ts.map +0 -1
  370. package/dist/infrastructure/storage/storage.js.map +0 -1
  371. package/dist/mcp-server.d.ts.map +0 -1
  372. package/dist/mcp-server.js.map +0 -1
  373. package/dist/tools/mcp_initialize.d.ts +0 -2
  374. package/dist/tools/mcp_initialize.d.ts.map +0 -1
  375. package/dist/tools/mcp_initialize.js +0 -45
  376. package/dist/tools/mcp_initialize.js.map +0 -1
  377. package/dist/tools/mcp_shutdown.d.ts +0 -2
  378. package/dist/tools/mcp_shutdown.d.ts.map +0 -1
  379. package/dist/tools/mcp_shutdown.js +0 -10
  380. package/dist/tools/mcp_shutdown.js.map +0 -1
  381. package/dist/tools/mcp_tools_list.d.ts +0 -2
  382. package/dist/tools/mcp_tools_list.d.ts.map +0 -1
  383. package/dist/tools/mcp_tools_list.js +0 -60
  384. package/dist/tools/mcp_tools_list.js.map +0 -1
  385. package/dist/tools/session-tools.d.ts +0 -5
  386. package/dist/tools/session-tools.js +0 -270
  387. package/dist/types/context-types.d.ts +0 -236
  388. package/dist/types/context-types.js +0 -10
  389. package/dist/types/documentation-types.d.ts +0 -37
  390. package/dist/types/loop-context-optimizer.d.ts +0 -7
  391. package/dist/types/mcp-types.d.ts +0 -273
  392. package/dist/types/mcp-types.d.ts.map +0 -1
  393. package/dist/types/mcp-types.js +0 -19
  394. package/dist/types/mcp-types.js.map +0 -1
  395. package/dist/types/server.d.ts.map +0 -1
  396. package/dist/types/server.js.map +0 -1
  397. package/dist/types/storage.d.ts.map +0 -1
  398. package/dist/types/storage.js.map +0 -1
  399. package/dist/types/workflow-types.d.ts +0 -336
  400. package/dist/types/workflow-types.d.ts.map +0 -1
  401. package/dist/types/workflow-types.js +0 -20
  402. package/dist/types/workflow-types.js.map +0 -1
  403. package/dist/utils/condition-evaluator.d.ts.map +0 -1
  404. package/dist/utils/condition-evaluator.js.map +0 -1
  405. package/dist/utils/config.d.ts +0 -149
  406. package/dist/utils/config.d.ts.map +0 -1
  407. package/dist/utils/config.js +0 -251
  408. package/dist/utils/config.js.map +0 -1
  409. package/dist/utils/storage-security.d.ts.map +0 -1
  410. package/dist/utils/storage-security.js.map +0 -1
  411. package/dist/validation/request-validator.d.ts +0 -8
  412. package/dist/validation/request-validator.d.ts.map +0 -1
  413. package/dist/validation/request-validator.js +0 -32
  414. package/dist/validation/request-validator.js.map +0 -1
  415. package/dist/validation/response-validator.d.ts +0 -8
  416. package/dist/validation/response-validator.d.ts.map +0 -1
  417. package/dist/validation/response-validator.js +0 -110
  418. package/dist/validation/response-validator.js.map +0 -1
  419. package/dist/validation/schemas.d.ts +0 -1
  420. package/dist/validation/schemas.d.ts.map +0 -1
  421. package/dist/validation/schemas.js +0 -53
  422. package/dist/validation/schemas.js.map +0 -1
  423. /package/dist/{types/documentation-types.js → errors/app-error.js} +0 -0
  424. /package/dist/{types/loop-context-optimizer.js → runtime/brand.js} +0 -0
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.COMMUNITY_WORKFLOW_REPOS = exports.GitWorkflowStorage = void 0;
6
+ exports.GitWorkflowStorage = void 0;
7
+ const workflow_1 = require("../../types/workflow");
7
8
  const child_process_1 = require("child_process");
8
9
  const util_1 = require("util");
9
10
  const path_1 = __importDefault(require("path"));
@@ -16,16 +17,17 @@ const logger_1 = require("../../utils/logger");
16
17
  const execAsync = (0, util_1.promisify)(child_process_1.exec);
17
18
  const logger = (0, logger_1.createLogger)('GitWorkflowStorage');
18
19
  class GitWorkflowStorage {
19
- constructor(config) {
20
+ constructor(config, source) {
21
+ this.kind = 'single';
20
22
  this.lastSync = 0;
21
23
  this.isCloning = false;
22
24
  this.config = this.validateAndNormalizeConfig(config);
23
25
  this.localPath = this.config.localPath;
26
+ this.source = source ?? (0, workflow_1.createGitRepositorySource)(this.config.repositoryUrl, this.config.branch, this.localPath);
24
27
  logger.info('Git workflow storage initialized', {
25
28
  repositoryUrl: this.config.repositoryUrl,
26
29
  branch: this.config.branch,
27
- localPath: this.localPath,
28
- syncInterval: this.config.syncInterval
30
+ localPath: this.localPath
29
31
  });
30
32
  }
31
33
  validateAndNormalizeConfig(config) {
@@ -39,8 +41,7 @@ class GitWorkflowStorage {
39
41
  maxFileSizeBytes: config.maxFileSize || 1024 * 1024
40
42
  });
41
43
  const defaultCacheDir = path_1.default.join(os_1.default.homedir(), '.workrail', 'cache');
42
- const localPath = config.localPath ||
43
- path_1.default.join(defaultCacheDir, 'community-workflows');
44
+ const localPath = config.localPath || path_1.default.join(defaultCacheDir, 'community-workflows');
44
45
  if (!config.skipSandboxCheck) {
45
46
  try {
46
47
  const safeBaseDir = config.localPath
@@ -64,27 +65,27 @@ class GitWorkflowStorage {
64
65
  }
65
66
  isValidGitUrl(url) {
66
67
  const sshPattern = /^git@[\w.-]+:[\w\/-]+\.git$/;
67
- if (sshPattern.test(url)) {
68
+ if (sshPattern.test(url))
68
69
  return true;
69
- }
70
- if (url.startsWith('ssh://')) {
70
+ if (url.startsWith('ssh://'))
71
71
  return true;
72
- }
73
- if (url.startsWith('/') || url.startsWith('file://')) {
72
+ if (url.startsWith('/') || url.startsWith('file://'))
74
73
  return true;
75
- }
76
74
  try {
77
75
  const parsed = new URL(url);
78
- const allowedHosts = [
79
- 'github.com', 'gitlab.com', 'bitbucket.org',
80
- 'dev.azure.com', 'sourceforge.net'
81
- ];
82
76
  if (parsed.protocol === 'https:' || parsed.protocol === 'git:') {
83
- return allowedHosts.some(host => parsed.hostname === host || parsed.hostname.endsWith(`.${host}`));
84
- }
85
- if (parsed.protocol === 'file:') {
77
+ const hostname = parsed.hostname;
78
+ const pathname = parsed.pathname;
79
+ if (!hostname || hostname.length === 0)
80
+ return false;
81
+ if (!pathname || pathname === '/')
82
+ return false;
83
+ if (hostname.includes('..') || pathname.includes('..'))
84
+ return false;
86
85
  return true;
87
86
  }
87
+ if (parsed.protocol === 'file:')
88
+ return true;
88
89
  return false;
89
90
  }
90
91
  catch {
@@ -111,7 +112,6 @@ class GitWorkflowStorage {
111
112
  }
112
113
  const files = await promises_1.default.readdir(workflowsPath);
113
114
  const jsonFiles = files.filter(f => f.endsWith('.json'));
114
- logger.debug('Found workflow files', { count: jsonFiles.length });
115
115
  if (jsonFiles.length > this.config.maxFiles) {
116
116
  throw new error_handler_1.StorageError(`Too many workflow files (${jsonFiles.length}), maximum allowed: ${this.config.maxFiles}`);
117
117
  }
@@ -123,13 +123,12 @@ class GitWorkflowStorage {
123
123
  const stats = await promises_1.default.stat(filePath);
124
124
  (0, storage_security_1.validateFileSize)(stats.size, this.config.maxFileSize, file);
125
125
  const content = await promises_1.default.readFile(filePath, 'utf-8');
126
- const workflow = JSON.parse(content);
127
- const expectedFilename = `${(0, storage_security_1.sanitizeId)(workflow.id)}.json`;
126
+ const definition = JSON.parse(content);
127
+ const expectedFilename = `${(0, storage_security_1.sanitizeId)(definition.id)}.json`;
128
128
  if (file !== expectedFilename) {
129
- throw new error_handler_1.InvalidWorkflowError(workflow.id, `Workflow ID '${workflow.id}' doesn't match filename '${file}'`);
129
+ throw new error_handler_1.InvalidWorkflowError(definition.id, `Workflow ID '${definition.id}' doesn't match filename '${file}'`);
130
130
  }
131
- workflows.push(workflow);
132
- logger.debug('Loaded workflow', { id: workflow.id, name: workflow.name });
131
+ workflows.push((0, workflow_1.createWorkflow)(definition, this.source));
133
132
  }
134
133
  catch (error) {
135
134
  if (error instanceof error_handler_1.SecurityError || error instanceof error_handler_1.InvalidWorkflowError) {
@@ -140,15 +139,12 @@ class GitWorkflowStorage {
140
139
  }
141
140
  logger.info('Successfully loaded workflows from Git repository', {
142
141
  repositoryUrl: this.config.repositoryUrl,
143
- count: workflows.length,
144
- workflows: workflows.map(w => ({ id: w.id, name: w.name }))
142
+ count: workflows.length
145
143
  });
146
144
  return workflows;
147
145
  }
148
146
  catch (error) {
149
- logger.error('Failed to load workflows from Git repository', error, {
150
- repositoryUrl: this.config.repositoryUrl
151
- });
147
+ logger.error('Failed to load workflows from Git repository', error);
152
148
  if (error instanceof error_handler_1.StorageError || error instanceof error_handler_1.SecurityError || error instanceof error_handler_1.InvalidWorkflowError) {
153
149
  throw error;
154
150
  }
@@ -158,23 +154,17 @@ class GitWorkflowStorage {
158
154
  async getWorkflowById(id) {
159
155
  const sanitizedId = (0, storage_security_1.sanitizeId)(id);
160
156
  const workflows = await this.loadAllWorkflows();
161
- return workflows.find(w => w.id === sanitizedId) || null;
157
+ return workflows.find(w => w.definition.id === sanitizedId) || null;
162
158
  }
163
159
  async listWorkflowSummaries() {
164
160
  const workflows = await this.loadAllWorkflows();
165
- return workflows.map(workflow => ({
166
- id: workflow.id,
167
- name: workflow.name,
168
- description: workflow.description,
169
- category: 'community',
170
- version: workflow.version
171
- }));
161
+ return workflows.map(workflow_1.toWorkflowSummary);
172
162
  }
173
- async save(workflow) {
163
+ async save(definition) {
174
164
  try {
175
- const sanitizedId = (0, storage_security_1.sanitizeId)(workflow.id);
176
- if (workflow.id !== sanitizedId) {
177
- throw new error_handler_1.InvalidWorkflowError(workflow.id, `Invalid workflow ID: ${workflow.id}`);
165
+ const sanitizedId = (0, storage_security_1.sanitizeId)(definition.id);
166
+ if (definition.id !== sanitizedId) {
167
+ throw new error_handler_1.InvalidWorkflowError(definition.id, `Invalid workflow ID: ${definition.id}`);
178
168
  }
179
169
  await this.ensureRepository();
180
170
  const workflowsPath = path_1.default.join(this.localPath, 'workflows');
@@ -182,10 +172,10 @@ class GitWorkflowStorage {
182
172
  const filename = `${sanitizedId}.json`;
183
173
  const filePath = path_1.default.join(workflowsPath, filename);
184
174
  (0, storage_security_1.assertWithinBase)(filePath, workflowsPath);
185
- const content = JSON.stringify(workflow, null, 2);
186
- (0, storage_security_1.validateFileSize)(Buffer.byteLength(content, 'utf-8'), this.config.maxFileSize, workflow.id);
175
+ const content = JSON.stringify(definition, null, 2);
176
+ (0, storage_security_1.validateFileSize)(Buffer.byteLength(content, 'utf-8'), this.config.maxFileSize, definition.id);
187
177
  await promises_1.default.writeFile(filePath, content);
188
- await this.gitCommitAndPush(workflow);
178
+ await this.gitCommitAndPush(definition);
189
179
  }
190
180
  catch (error) {
191
181
  if (error instanceof error_handler_1.SecurityError || error instanceof error_handler_1.InvalidWorkflowError) {
@@ -209,9 +199,8 @@ class GitWorkflowStorage {
209
199
  }
210
200
  const shouldSync = !(0, fs_1.existsSync)(this.localPath) ||
211
201
  (Date.now() - this.lastSync) > (this.config.syncInterval * 60 * 1000);
212
- if (!shouldSync) {
202
+ if (!shouldSync)
213
203
  return;
214
- }
215
204
  this.isCloning = true;
216
205
  try {
217
206
  if (!(0, fs_1.existsSync)(this.localPath)) {
@@ -232,97 +221,70 @@ class GitWorkflowStorage {
232
221
  async cloneRepository() {
233
222
  logger.info('Cloning Git repository', {
234
223
  repositoryUrl: this.config.repositoryUrl,
235
- branch: this.config.branch,
236
- localPath: this.localPath
224
+ branch: this.config.branch
237
225
  });
238
226
  const parentDir = path_1.default.dirname(this.localPath);
239
227
  await promises_1.default.mkdir(parentDir, { recursive: true });
240
228
  let cloneUrl = this.config.repositoryUrl;
241
229
  if (cloneUrl.startsWith('/')) {
242
230
  cloneUrl = `file://${cloneUrl}`;
243
- logger.debug('Converted local path to file:// URL', { cloneUrl });
244
231
  }
245
232
  if (!this.isSshUrl(this.config.repositoryUrl) && this.config.authToken && cloneUrl.startsWith('https://')) {
246
233
  cloneUrl = cloneUrl.replace('https://', `https://${this.config.authToken}@`);
247
- logger.debug('Injected auth token into URL');
248
234
  }
249
235
  const escapedUrl = this.escapeShellArg(cloneUrl);
250
236
  const escapedBranch = this.escapeShellArg(this.config.branch);
251
237
  const escapedPath = this.escapeShellArg(this.localPath);
252
238
  let command = `git clone --branch ${escapedBranch} ${escapedUrl} ${escapedPath}`;
253
239
  try {
254
- logger.debug('Executing git clone', { branch: this.config.branch });
255
240
  await execAsync(command, { timeout: 60000 });
256
241
  logger.info('Successfully cloned repository', { branch: this.config.branch });
257
242
  }
258
243
  catch (error) {
259
244
  const errorMsg = error.message;
260
245
  if (errorMsg.includes('Remote branch') && errorMsg.includes('not found')) {
261
- logger.warn('Requested branch not found, trying default branch', {
262
- requestedBranch: this.config.branch
263
- });
264
246
  command = `git clone ${escapedUrl} ${escapedPath}`;
265
247
  try {
266
248
  await execAsync(command, { timeout: 60000 });
267
249
  const { stdout } = await execAsync('git rev-parse --abbrev-ref HEAD', { cwd: this.localPath });
268
- const actualBranch = stdout.trim();
269
- logger.info('Successfully cloned with default branch', {
270
- requestedBranch: this.config.branch,
271
- actualBranch
272
- });
273
- this.config.branch = actualBranch;
250
+ this.config.branch = stdout.trim();
274
251
  }
275
252
  catch (fallbackError) {
276
- logger.error('Failed to clone repository with fallback', fallbackError);
277
253
  throw new error_handler_1.StorageError(`Failed to clone workflow repository: ${fallbackError.message}`);
278
254
  }
279
255
  }
280
256
  else {
281
- logger.error('Failed to clone repository', error, { branch: this.config.branch });
282
257
  throw new error_handler_1.StorageError(`Failed to clone workflow repository: ${errorMsg}`);
283
258
  }
284
259
  }
285
260
  }
286
261
  async pullRepository() {
287
- logger.debug('Pulling latest changes from Git repository', {
288
- branch: this.config.branch,
289
- localPath: this.localPath
290
- });
291
262
  const escapedPath = this.escapeShellArg(this.localPath);
292
263
  const escapedBranch = this.escapeShellArg(this.config.branch);
293
264
  try {
294
- const fetchCommand = `cd ${escapedPath} && git fetch origin ${escapedBranch}`;
295
- const resetCommand = `cd ${escapedPath} && git reset --hard origin/${escapedBranch}`;
296
- await execAsync(fetchCommand, { timeout: 30000 });
297
- await execAsync(resetCommand, { timeout: 30000 });
298
- logger.info('Successfully updated repository', { branch: this.config.branch });
265
+ await execAsync(`cd ${escapedPath} && git fetch origin ${escapedBranch}`, { timeout: 30000 });
266
+ await execAsync(`cd ${escapedPath} && git reset --hard origin/${escapedBranch}`, { timeout: 30000 });
299
267
  }
300
- catch (error) {
268
+ catch {
301
269
  try {
302
- const pullCommand = `cd ${escapedPath} && git pull origin ${escapedBranch}`;
303
- await execAsync(pullCommand, { timeout: 30000 });
304
- logger.info('Successfully updated repository via pull', { branch: this.config.branch });
270
+ await execAsync(`cd ${escapedPath} && git pull origin ${escapedBranch}`, { timeout: 30000 });
305
271
  }
306
272
  catch (pullError) {
307
- logger.warn('Git pull failed, using cached version', pullError, {
308
- repositoryUrl: this.config.repositoryUrl,
309
- branch: this.config.branch
310
- });
273
+ logger.warn('Git pull failed, using cached version', pullError);
311
274
  }
312
275
  }
313
276
  }
314
- async gitCommitAndPush(workflow) {
277
+ async gitCommitAndPush(definition) {
315
278
  const escapedPath = this.escapeShellArg(this.localPath);
316
- const escapedFilename = this.escapeShellArg(`workflows/${workflow.id}.json`);
317
- const escapedMessage = this.escapeShellArg(`Add/update workflow: ${workflow.name}`);
279
+ const escapedFilename = this.escapeShellArg(`workflows/${definition.id}.json`);
280
+ const escapedMessage = this.escapeShellArg(`Add/update workflow: ${definition.name}`);
318
281
  const escapedBranch = this.escapeShellArg(this.config.branch);
319
- const commands = [
282
+ const command = [
320
283
  `cd ${escapedPath}`,
321
284
  `git add ${escapedFilename}`,
322
285
  `git commit -m ${escapedMessage}`,
323
286
  `git push origin ${escapedBranch}`
324
- ];
325
- const command = commands.join(' && ');
287
+ ].join(' && ');
326
288
  try {
327
289
  await execAsync(command, { timeout: 60000 });
328
290
  }
@@ -335,20 +297,3 @@ class GitWorkflowStorage {
335
297
  }
336
298
  }
337
299
  exports.GitWorkflowStorage = GitWorkflowStorage;
338
- exports.COMMUNITY_WORKFLOW_REPOS = {
339
- official: {
340
- repositoryUrl: 'https://github.com/EtienneBBeaulac/workrail-community-workflows.git',
341
- branch: 'main',
342
- syncInterval: 60,
343
- maxFileSize: 1024 * 1024,
344
- maxFiles: 100
345
- },
346
- personal: {
347
- repositoryUrl: 'https://github.com/username/my-workflows.git',
348
- branch: 'main',
349
- syncInterval: 30,
350
- authToken: process.env['GITHUB_TOKEN'],
351
- maxFileSize: 1024 * 1024,
352
- maxFiles: 50
353
- }
354
- };
@@ -1,11 +1,15 @@
1
- import { Workflow, WorkflowSummary } from '../../types/mcp-types';
1
+ import { Workflow, WorkflowSummary, WorkflowDefinition, WorkflowSource } from '../../types/workflow';
2
2
  import { IWorkflowStorage } from '../../types/storage';
3
3
  export declare class InMemoryWorkflowStorage implements IWorkflowStorage {
4
+ readonly kind: "single";
5
+ readonly source: WorkflowSource;
4
6
  private workflows;
5
- constructor(workflows?: Workflow[]);
6
- setWorkflows(workflows: Workflow[]): void;
7
- loadAllWorkflows(): Promise<Workflow[]>;
7
+ constructor(definitions?: readonly WorkflowDefinition[], source?: WorkflowSource);
8
+ setWorkflows(definitions: readonly WorkflowDefinition[]): void;
9
+ setWorkflowsRaw(workflows: readonly Workflow[]): void;
10
+ loadAllWorkflows(): Promise<readonly Workflow[]>;
8
11
  getWorkflowById(id: string): Promise<Workflow | null>;
9
- listWorkflowSummaries(): Promise<WorkflowSummary[]>;
10
- save(workflow: Workflow): Promise<void>;
12
+ listWorkflowSummaries(): Promise<readonly WorkflowSummary[]>;
13
+ save(definition: WorkflowDefinition): Promise<void>;
11
14
  }
15
+ export declare function createTestStorage(definitions?: readonly WorkflowDefinition[], source?: WorkflowSource): InMemoryWorkflowStorage;
@@ -1,30 +1,32 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InMemoryWorkflowStorage = void 0;
4
+ exports.createTestStorage = createTestStorage;
5
+ const workflow_1 = require("../../types/workflow");
4
6
  class InMemoryWorkflowStorage {
5
- constructor(workflows = []) {
6
- this.workflows = [...workflows];
7
+ constructor(definitions = [], source = (0, workflow_1.createBundledSource)()) {
8
+ this.kind = 'single';
9
+ this.source = source;
10
+ this.workflows = definitions.map(def => (0, workflow_1.createWorkflow)(def, source));
11
+ }
12
+ setWorkflows(definitions) {
13
+ this.workflows = definitions.map(def => (0, workflow_1.createWorkflow)(def, this.source));
7
14
  }
8
- setWorkflows(workflows) {
15
+ setWorkflowsRaw(workflows) {
9
16
  this.workflows = [...workflows];
10
17
  }
11
18
  async loadAllWorkflows() {
12
19
  return [...this.workflows];
13
20
  }
14
21
  async getWorkflowById(id) {
15
- return this.workflows.find((wf) => wf.id === id) || null;
22
+ return this.workflows.find((wf) => wf.definition.id === id) || null;
16
23
  }
17
24
  async listWorkflowSummaries() {
18
- return this.workflows.map((workflow) => ({
19
- id: workflow.id,
20
- name: workflow.name,
21
- description: workflow.description,
22
- category: 'default',
23
- version: workflow.version
24
- }));
25
+ return this.workflows.map(workflow_1.toWorkflowSummary);
25
26
  }
26
- async save(workflow) {
27
- const index = this.workflows.findIndex((w) => w.id === workflow.id);
27
+ async save(definition) {
28
+ const index = this.workflows.findIndex((w) => w.definition.id === definition.id);
29
+ const workflow = (0, workflow_1.createWorkflow)(definition, this.source);
28
30
  if (index >= 0) {
29
31
  this.workflows[index] = workflow;
30
32
  }
@@ -34,3 +36,6 @@ class InMemoryWorkflowStorage {
34
36
  }
35
37
  }
36
38
  exports.InMemoryWorkflowStorage = InMemoryWorkflowStorage;
39
+ function createTestStorage(definitions = [], source) {
40
+ return new InMemoryWorkflowStorage(definitions, source);
41
+ }
@@ -1,5 +1,5 @@
1
1
  import { IWorkflowStorage } from '../../types/storage';
2
- import { Workflow, WorkflowSummary } from '../../types/mcp-types';
2
+ import { Workflow, WorkflowSummary, WorkflowSource } from '../../types/workflow';
3
3
  export interface WorkflowPlugin {
4
4
  name: string;
5
5
  version: string;
@@ -26,15 +26,17 @@ export interface ValidatedPluginWorkflowConfig extends Required<PluginWorkflowCo
26
26
  maxPlugins: number;
27
27
  }
28
28
  export declare class PluginWorkflowStorage implements IWorkflowStorage {
29
+ readonly kind: "single";
30
+ readonly source: WorkflowSource;
29
31
  private readonly config;
30
32
  private pluginCache;
31
33
  private lastScan;
32
- constructor(config?: PluginWorkflowConfig);
34
+ constructor(config?: PluginWorkflowConfig, source?: WorkflowSource);
33
35
  private validateAndNormalizeConfig;
34
36
  private getDefaultPluginPaths;
35
- loadAllWorkflows(): Promise<Workflow[]>;
37
+ loadAllWorkflows(): Promise<readonly Workflow[]>;
36
38
  getWorkflowById(id: string): Promise<Workflow | null>;
37
- listWorkflowSummaries(): Promise<WorkflowSummary[]>;
39
+ listWorkflowSummaries(): Promise<readonly WorkflowSummary[]>;
38
40
  save(): Promise<void>;
39
41
  private scanPlugins;
40
42
  private isWorkflowPlugin;
@@ -43,17 +45,3 @@ export declare class PluginWorkflowStorage implements IWorkflowStorage {
43
45
  getLoadedPlugins(): WorkflowPlugin[];
44
46
  getConfig(): ValidatedPluginWorkflowConfig;
45
47
  }
46
- export declare const PLUGIN_WORKFLOW_CONFIGS: {
47
- development: {
48
- scanInterval: number;
49
- maxFileSize: number;
50
- maxFiles: number;
51
- maxPlugins: number;
52
- };
53
- production: {
54
- scanInterval: number;
55
- maxFileSize: number;
56
- maxFiles: number;
57
- maxPlugins: number;
58
- };
59
- };
@@ -3,17 +3,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.PLUGIN_WORKFLOW_CONFIGS = exports.PluginWorkflowStorage = void 0;
6
+ exports.PluginWorkflowStorage = void 0;
7
+ const workflow_1 = require("../../types/workflow");
7
8
  const path_1 = __importDefault(require("path"));
8
9
  const promises_1 = __importDefault(require("fs/promises"));
9
10
  const fs_1 = require("fs");
10
11
  const storage_security_1 = require("../../utils/storage-security");
11
12
  const error_handler_1 = require("../../core/error-handler");
12
13
  class PluginWorkflowStorage {
13
- constructor(config = {}) {
14
+ constructor(config = {}, source) {
15
+ this.kind = 'single';
14
16
  this.pluginCache = new Map();
15
17
  this.lastScan = 0;
16
18
  this.config = this.validateAndNormalizeConfig(config);
19
+ this.source = source ?? (0, workflow_1.createPluginSource)('plugins', '1.0.0');
17
20
  }
18
21
  validateAndNormalizeConfig(config) {
19
22
  const securityOptions = (0, storage_security_1.validateSecurityOptions)({
@@ -50,10 +53,7 @@ class PluginWorkflowStorage {
50
53
  }
51
54
  }
52
55
  catch {
53
- const commonPaths = [
54
- '/usr/local/lib/node_modules',
55
- '/usr/lib/node_modules'
56
- ];
56
+ const commonPaths = ['/usr/local/lib/node_modules', '/usr/lib/node_modules'];
57
57
  for (const commonPath of commonPaths) {
58
58
  if ((0, fs_1.existsSync)(commonPath)) {
59
59
  paths.push(commonPath);
@@ -85,17 +85,11 @@ class PluginWorkflowStorage {
85
85
  async getWorkflowById(id) {
86
86
  const sanitizedId = (0, storage_security_1.sanitizeId)(id);
87
87
  const workflows = await this.loadAllWorkflows();
88
- return workflows.find(w => w.id === sanitizedId) || null;
88
+ return workflows.find(w => w.definition.id === sanitizedId) || null;
89
89
  }
90
90
  async listWorkflowSummaries() {
91
91
  const workflows = await this.loadAllWorkflows();
92
- return workflows.map(workflow => ({
93
- id: workflow.id,
94
- name: workflow.name,
95
- description: workflow.description,
96
- category: 'plugin',
97
- version: workflow.version
98
- }));
92
+ return workflows.map(workflow_1.toWorkflowSummary);
99
93
  }
100
94
  async save() {
101
95
  throw new error_handler_1.StorageError('Plugin-based storage is read-only. Publish workflows as npm packages instead.');
@@ -108,9 +102,8 @@ class PluginWorkflowStorage {
108
102
  this.pluginCache.clear();
109
103
  let pluginCount = 0;
110
104
  for (const pluginPath of this.config.pluginPaths) {
111
- if (!(0, fs_1.existsSync)(pluginPath)) {
105
+ if (!(0, fs_1.existsSync)(pluginPath))
112
106
  continue;
113
- }
114
107
  try {
115
108
  (0, storage_security_1.assertWithinBase)(pluginPath, pluginPath);
116
109
  const entries = await promises_1.default.readdir(pluginPath);
@@ -145,9 +138,8 @@ class PluginWorkflowStorage {
145
138
  try {
146
139
  (0, storage_security_1.assertWithinBase)(pluginPath, path_1.default.dirname(pluginPath));
147
140
  const packageJsonPath = path_1.default.join(pluginPath, 'package.json');
148
- if (!(0, fs_1.existsSync)(packageJsonPath)) {
141
+ if (!(0, fs_1.existsSync)(packageJsonPath))
149
142
  return null;
150
- }
151
143
  (0, storage_security_1.assertWithinBase)(packageJsonPath, pluginPath);
152
144
  const packageStats = await promises_1.default.stat(packageJsonPath);
153
145
  (0, storage_security_1.validateFileSize)(packageStats.size, Math.min(this.config.maxFileSize, 64 * 1024), 'package.json');
@@ -159,27 +151,27 @@ class PluginWorkflowStorage {
159
151
  catch (parseError) {
160
152
  throw new error_handler_1.InvalidWorkflowError(pluginPath, `Invalid package.json: ${parseError.message}`);
161
153
  }
162
- if (!packageJson.workrail || !packageJson.workrail.workflows) {
154
+ if (!packageJson['workrail'] || !packageJson['workrail']['workflows']) {
163
155
  return null;
164
156
  }
165
- if (!packageJson.name || typeof packageJson.name !== 'string') {
166
- throw new error_handler_1.InvalidWorkflowError(pluginPath, `Invalid package name`);
157
+ if (!packageJson['name'] || typeof packageJson['name'] !== 'string') {
158
+ throw new error_handler_1.InvalidWorkflowError(pluginPath, 'Invalid package name');
167
159
  }
168
160
  const workflowsPath = path_1.default.join(pluginPath, 'workflows');
169
- if (!(0, fs_1.existsSync)(workflowsPath)) {
161
+ if (!(0, fs_1.existsSync)(workflowsPath))
170
162
  return null;
171
- }
172
163
  (0, storage_security_1.assertWithinBase)(workflowsPath, pluginPath);
173
- const workflows = await this.loadWorkflowsFromDirectory(workflowsPath);
164
+ const pluginSource = (0, workflow_1.createPluginSource)(packageJson['name'], packageJson['version'] || '0.0.0');
165
+ const workflows = await this.loadWorkflowsFromDirectory(workflowsPath, pluginSource);
174
166
  return {
175
- name: packageJson.name,
176
- version: packageJson.version || '0.0.0',
167
+ name: packageJson['name'],
168
+ version: packageJson['version'] || '0.0.0',
177
169
  workflows,
178
170
  metadata: {
179
- author: packageJson.author,
180
- description: packageJson.description,
181
- homepage: packageJson.homepage,
182
- repository: packageJson.repository?.url || packageJson.repository
171
+ author: packageJson['author'],
172
+ description: packageJson['description'],
173
+ homepage: packageJson['homepage'],
174
+ repository: packageJson['repository']?.['url'] || packageJson['repository']
183
175
  }
184
176
  };
185
177
  }
@@ -190,7 +182,7 @@ class PluginWorkflowStorage {
190
182
  throw new error_handler_1.StorageError(`Failed to load plugin from ${pluginPath}: ${error.message}`);
191
183
  }
192
184
  }
193
- async loadWorkflowsFromDirectory(workflowsPath) {
185
+ async loadWorkflowsFromDirectory(workflowsPath, pluginSource) {
194
186
  const workflows = [];
195
187
  try {
196
188
  const files = await promises_1.default.readdir(workflowsPath);
@@ -205,18 +197,18 @@ class PluginWorkflowStorage {
205
197
  const stats = await promises_1.default.stat(filePath);
206
198
  (0, storage_security_1.validateFileSize)(stats.size, this.config.maxFileSize, file);
207
199
  const content = await promises_1.default.readFile(filePath, 'utf-8');
208
- let workflow;
200
+ let definition;
209
201
  try {
210
- workflow = JSON.parse(content);
202
+ definition = JSON.parse(content);
211
203
  }
212
204
  catch (parseError) {
213
205
  throw new error_handler_1.InvalidWorkflowError(file, `Invalid JSON in workflow file: ${parseError.message}`);
214
206
  }
215
- const sanitizedId = (0, storage_security_1.sanitizeId)(workflow.id);
216
- if (workflow.id !== sanitizedId) {
217
- throw new error_handler_1.InvalidWorkflowError(workflow.id, `Invalid workflow ID in file ${file}`);
207
+ const sanitizedId = (0, storage_security_1.sanitizeId)(definition.id);
208
+ if (definition.id !== sanitizedId) {
209
+ throw new error_handler_1.InvalidWorkflowError(definition.id, `Invalid workflow ID in file ${file}`);
218
210
  }
219
- workflows.push(workflow);
211
+ workflows.push((0, workflow_1.createWorkflow)(definition, pluginSource));
220
212
  }
221
213
  catch (error) {
222
214
  if (error instanceof error_handler_1.SecurityError || error instanceof error_handler_1.InvalidWorkflowError) {
@@ -242,17 +234,3 @@ class PluginWorkflowStorage {
242
234
  }
243
235
  }
244
236
  exports.PluginWorkflowStorage = PluginWorkflowStorage;
245
- exports.PLUGIN_WORKFLOW_CONFIGS = {
246
- development: {
247
- scanInterval: 60000,
248
- maxFileSize: 2 * 1024 * 1024,
249
- maxFiles: 100,
250
- maxPlugins: 50
251
- },
252
- production: {
253
- scanInterval: 300000,
254
- maxFileSize: 1024 * 1024,
255
- maxFiles: 50,
256
- maxPlugins: 20
257
- }
258
- };
@@ -1,5 +1,5 @@
1
1
  import { IWorkflowStorage } from '../../types/storage';
2
- import { Workflow, WorkflowSummary } from '../../types/mcp-types';
2
+ import { Workflow, WorkflowSummary, WorkflowDefinition, WorkflowSource } from '../../types/workflow';
3
3
  import { StorageSecurityOptions } from '../../utils/storage-security';
4
4
  export interface RemoteWorkflowRegistryConfig extends StorageSecurityOptions {
5
5
  baseUrl: string;
@@ -9,26 +9,17 @@ export interface RemoteWorkflowRegistryConfig extends StorageSecurityOptions {
9
9
  userAgent?: string;
10
10
  }
11
11
  export declare class RemoteWorkflowStorage implements IWorkflowStorage {
12
+ readonly kind: "single";
13
+ readonly source: WorkflowSource;
12
14
  private readonly config;
13
15
  private readonly securityOptions;
14
- constructor(config: RemoteWorkflowRegistryConfig);
16
+ constructor(config: RemoteWorkflowRegistryConfig, source?: WorkflowSource);
15
17
  private validateConfig;
16
- loadAllWorkflows(): Promise<Workflow[]>;
18
+ loadAllWorkflows(): Promise<readonly Workflow[]>;
17
19
  getWorkflowById(id: string): Promise<Workflow | null>;
18
- listWorkflowSummaries(): Promise<WorkflowSummary[]>;
19
- save(workflow: Workflow): Promise<void>;
20
+ listWorkflowSummaries(): Promise<readonly WorkflowSummary[]>;
21
+ save(definition: WorkflowDefinition): Promise<void>;
20
22
  private fetchWithRetry;
21
23
  private parseResponse;
22
- private validateWorkflows;
23
- private validateSummaries;
24
- private validateWorkflowForSave;
25
- }
26
- export declare class CommunityWorkflowStorage implements IWorkflowStorage {
27
- private readonly sources;
28
- private readonly remoteStorage;
29
- constructor(bundledStorage: IWorkflowStorage, localStorage: IWorkflowStorage, remoteConfig: RemoteWorkflowRegistryConfig);
30
- loadAllWorkflows(): Promise<Workflow[]>;
31
- getWorkflowById(id: string): Promise<Workflow | null>;
32
- listWorkflowSummaries(): Promise<WorkflowSummary[]>;
33
- save(workflow: Workflow): Promise<void>;
24
+ private validateDefinitions;
34
25
  }