@t4h.framework/dev 0.14.2 → 0.16.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 (199) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +112 -58
  3. package/dist/AppProcess.d.ts +36 -0
  4. package/dist/AppProcess.js +126 -0
  5. package/dist/AppProcess.js.map +1 -0
  6. package/dist/Server.d.ts +41 -0
  7. package/dist/Server.js +177 -0
  8. package/dist/Server.js.map +1 -0
  9. package/dist/constants/panel-config.d.ts +2 -0
  10. package/dist/constants/panel-config.js +34 -0
  11. package/dist/constants/panel-config.js.map +1 -0
  12. package/dist/constants/server.d.ts +9 -0
  13. package/dist/constants/server.js +10 -0
  14. package/dist/constants/server.js.map +1 -0
  15. package/dist/http/create-app.d.ts +16 -0
  16. package/dist/http/create-app.js +138 -0
  17. package/dist/http/create-app.js.map +1 -0
  18. package/dist/http/helpers/to-http-error.d.ts +8 -0
  19. package/dist/http/helpers/to-http-error.js +9 -0
  20. package/dist/http/helpers/to-http-error.js.map +1 -0
  21. package/dist/http/middlewares/error-handler.middleware.d.ts +2 -0
  22. package/dist/http/middlewares/error-handler.middleware.js +27 -0
  23. package/dist/http/middlewares/error-handler.middleware.js.map +1 -0
  24. package/dist/http/middlewares/project-manifest.middleware.d.ts +11 -0
  25. package/dist/http/middlewares/project-manifest.middleware.js +11 -0
  26. package/dist/http/middlewares/project-manifest.middleware.js.map +1 -0
  27. package/dist/http/middlewares/read-json-body.middleware.d.ts +6 -0
  28. package/dist/http/middlewares/read-json-body.middleware.js +22 -0
  29. package/dist/http/middlewares/read-json-body.middleware.js.map +1 -0
  30. package/dist/http/middlewares/workflow-authorization.middleware.d.ts +12 -0
  31. package/dist/http/middlewares/workflow-authorization.middleware.js +28 -0
  32. package/dist/http/middlewares/workflow-authorization.middleware.js.map +1 -0
  33. package/dist/index.d.ts +3 -15
  34. package/dist/index.js +2 -15
  35. package/dist/index.js.map +1 -1
  36. package/dist/models/JSONRPCClient.d.ts +2 -0
  37. package/dist/models/JSONRPCClient.js +21 -4
  38. package/dist/models/JSONRPCClient.js.map +1 -1
  39. package/dist/models/JSONRPCError.d.ts +13 -0
  40. package/dist/models/JSONRPCError.js +11 -0
  41. package/dist/models/JSONRPCError.js.map +1 -0
  42. package/dist/models/JSONRPCServer.d.ts +2 -0
  43. package/dist/models/JSONRPCServer.js +10 -2
  44. package/dist/models/JSONRPCServer.js.map +1 -1
  45. package/dist/models/WorkflowAuthorizationMissingError.d.ts +5 -0
  46. package/dist/models/WorkflowAuthorizationMissingError.js +9 -0
  47. package/dist/models/WorkflowAuthorizationMissingError.js.map +1 -0
  48. package/dist/models/WorkflowRun.d.ts +20 -15
  49. package/dist/models/WorkflowRun.js +14 -9
  50. package/dist/models/WorkflowRun.js.map +1 -1
  51. package/dist/models/WorkflowRunActivity.d.ts +40 -27
  52. package/dist/models/WorkflowRunActivity.js +46 -34
  53. package/dist/models/WorkflowRunActivity.js.map +1 -1
  54. package/dist/models/claims/DevHttpClientRequestClaim.js +4 -5
  55. package/dist/models/claims/DevHttpClientRequestClaim.js.map +1 -1
  56. package/dist/models/claims/DevORMClaim.d.ts +15 -4
  57. package/dist/models/claims/DevORMClaim.js +128 -29
  58. package/dist/models/claims/DevORMClaim.js.map +1 -1
  59. package/dist/models/claims/DevWorkflowBatchClaim.js +3 -6
  60. package/dist/models/claims/DevWorkflowBatchClaim.js.map +1 -1
  61. package/dist/models/claims/DevWorkflowClaim.d.ts +1 -1
  62. package/dist/models/claims/DevWorkflowClaim.js +6 -11
  63. package/dist/models/claims/DevWorkflowClaim.js.map +1 -1
  64. package/dist/repositories/WorkflowRun.repository.d.ts +44 -6
  65. package/dist/repositories/WorkflowRun.repository.js +196 -11
  66. package/dist/repositories/WorkflowRun.repository.js.map +1 -1
  67. package/dist/repositories/WorkflowRunActivity.repository.d.ts +19 -6
  68. package/dist/repositories/WorkflowRunActivity.repository.js +73 -23
  69. package/dist/repositories/WorkflowRunActivity.repository.js.map +1 -1
  70. package/dist/repositories/WorkflowRunAsyncActivityPending.repository.d.ts +39 -0
  71. package/dist/repositories/WorkflowRunAsyncActivityPending.repository.js +160 -0
  72. package/dist/repositories/WorkflowRunAsyncActivityPending.repository.js.map +1 -0
  73. package/dist/services/ActivityRegistry.service.d.ts +7 -0
  74. package/dist/services/ActivityRegistry.service.js +32 -0
  75. package/dist/services/ActivityRegistry.service.js.map +1 -0
  76. package/dist/services/Database.service.d.ts +14 -0
  77. package/dist/services/Database.service.js +106 -0
  78. package/dist/services/Database.service.js.map +1 -0
  79. package/dist/services/TimeoutScheduler.service.js +9 -3
  80. package/dist/services/TimeoutScheduler.service.js.map +1 -1
  81. package/dist/services/WorkflowAuthorization.service.d.ts +19 -0
  82. package/dist/services/WorkflowAuthorization.service.js +75 -0
  83. package/dist/services/WorkflowAuthorization.service.js.map +1 -0
  84. package/dist/services/WorkflowRunAsyncActivityFacade.service.d.ts +8 -15
  85. package/dist/services/WorkflowRunAsyncActivityFacade.service.js +12 -26
  86. package/dist/services/WorkflowRunAsyncActivityFacade.service.js.map +1 -1
  87. package/dist/services/WorkflowRunEvents.service.d.ts +11 -0
  88. package/dist/services/WorkflowRunEvents.service.js +42 -0
  89. package/dist/services/WorkflowRunEvents.service.js.map +1 -0
  90. package/dist/services/WorkflowRunFacade.service.d.ts +106 -7
  91. package/dist/services/WorkflowRunFacade.service.js +65 -10
  92. package/dist/services/WorkflowRunFacade.service.js.map +1 -1
  93. package/dist/services/WorkflowRunLock.service.d.ts +6 -0
  94. package/dist/services/WorkflowRunLock.service.js +34 -0
  95. package/dist/services/WorkflowRunLock.service.js.map +1 -0
  96. package/dist/services/WorkflowRunSyncActivityFacade.service.d.ts +4 -4
  97. package/dist/services/WorkflowRunSyncActivityFacade.service.js +7 -7
  98. package/dist/services/WorkflowRunSyncActivityFacade.service.js.map +1 -1
  99. package/dist/tools/copy-additional-files.d.ts +0 -5
  100. package/dist/tools/copy-additional-files.js +0 -5
  101. package/dist/tools/copy-additional-files.js.map +1 -1
  102. package/dist/tools/find-free-port.d.ts +5 -0
  103. package/dist/tools/find-free-port.js +30 -0
  104. package/dist/tools/find-free-port.js.map +1 -0
  105. package/dist/tools/find-workflow-by-id.d.ts +2 -0
  106. package/dist/tools/find-workflow-by-id.js +9 -0
  107. package/dist/tools/find-workflow-by-id.js.map +1 -0
  108. package/dist/tools/format-routes.d.ts +10 -0
  109. package/dist/tools/format-routes.js +40 -0
  110. package/dist/tools/format-routes.js.map +1 -0
  111. package/dist/tools/replace.d.ts +1 -0
  112. package/dist/tools/replace.js +14 -0
  113. package/dist/tools/replace.js.map +1 -0
  114. package/dist/tools/to-rejected-reason.d.ts +5 -0
  115. package/dist/tools/to-rejected-reason.js +11 -0
  116. package/dist/tools/to-rejected-reason.js.map +1 -0
  117. package/dist/tools/to-workflow-run-activity-output.d.ts +24 -0
  118. package/dist/tools/to-workflow-run-activity-output.js +18 -0
  119. package/dist/tools/to-workflow-run-activity-output.js.map +1 -0
  120. package/dist/tools/to-workflow-run-output.d.ts +11 -0
  121. package/dist/tools/to-workflow-run-output.js +12 -0
  122. package/dist/tools/to-workflow-run-output.js.map +1 -0
  123. package/dist/transport/AppProcessJsonRpc.js +59 -0
  124. package/dist/transport/AppProcessJsonRpc.js.map +1 -0
  125. package/dist/use-cases/BuildWorkflowRunActivityHistory.usecase.d.ts +9 -0
  126. package/dist/use-cases/{WorkflowRunBuildHistory.usecase.js → BuildWorkflowRunActivityHistory.usecase.js} +18 -16
  127. package/dist/use-cases/BuildWorkflowRunActivityHistory.usecase.js.map +1 -0
  128. package/dist/use-cases/CreateWorkflowRun.usecase.d.ts +6 -6
  129. package/dist/use-cases/CreateWorkflowRun.usecase.js +20 -21
  130. package/dist/use-cases/CreateWorkflowRun.usecase.js.map +1 -1
  131. package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.d.ts +9 -3
  132. package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.js +45 -39
  133. package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.js.map +1 -1
  134. package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.d.ts +9 -0
  135. package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.js +43 -0
  136. package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.js.map +1 -0
  137. package/dist/use-cases/ExecuteWorkflowRunActivity.usecase.d.ts +9 -0
  138. package/dist/use-cases/ExecuteWorkflowRunActivity.usecase.js +47 -0
  139. package/dist/use-cases/ExecuteWorkflowRunActivity.usecase.js.map +1 -0
  140. package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.d.ts +22 -0
  141. package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js +117 -0
  142. package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js.map +1 -0
  143. package/dist/use-cases/NextTickWorkflowRun.usecase.d.ts +16 -7
  144. package/dist/use-cases/NextTickWorkflowRun.usecase.js +139 -130
  145. package/dist/use-cases/NextTickWorkflowRun.usecase.js.map +1 -1
  146. package/dist/use-cases/RunWorkflow.usecase.d.ts +10 -0
  147. package/dist/use-cases/RunWorkflow.usecase.js +46 -0
  148. package/dist/use-cases/RunWorkflow.usecase.js.map +1 -0
  149. package/dist/use-cases/WorkflowRunActivityFind.usecase.d.ts +34 -0
  150. package/dist/use-cases/WorkflowRunActivityFind.usecase.js +49 -0
  151. package/dist/use-cases/WorkflowRunActivityFind.usecase.js.map +1 -0
  152. package/dist/use-cases/WorkflowRunActivityFindById.usecase.d.ts +34 -0
  153. package/dist/use-cases/WorkflowRunActivityFindById.usecase.js +60 -0
  154. package/dist/use-cases/WorkflowRunActivityFindById.usecase.js.map +1 -0
  155. package/dist/use-cases/WorkflowRunAsyncActivityAdvance.usecase.d.ts +12 -4
  156. package/dist/use-cases/WorkflowRunAsyncActivityAdvance.usecase.js +41 -27
  157. package/dist/use-cases/WorkflowRunAsyncActivityAdvance.usecase.js.map +1 -1
  158. package/dist/use-cases/WorkflowRunAsyncActivityPendingFind.usecase.d.ts +24 -0
  159. package/dist/use-cases/WorkflowRunAsyncActivityPendingFind.usecase.js +56 -0
  160. package/dist/use-cases/WorkflowRunAsyncActivityPendingFind.usecase.js.map +1 -0
  161. package/dist/use-cases/WorkflowRunFind.usecase.d.ts +17 -0
  162. package/dist/use-cases/WorkflowRunFind.usecase.js +28 -0
  163. package/dist/use-cases/WorkflowRunFind.usecase.js.map +1 -0
  164. package/dist/use-cases/WorkflowRunFindById.usecase.d.ts +19 -0
  165. package/dist/use-cases/WorkflowRunFindById.usecase.js +45 -0
  166. package/dist/use-cases/WorkflowRunFindById.usecase.js.map +1 -0
  167. package/dist/workers/app-process.js +10 -1
  168. package/dist/workers/app-process.js.map +1 -1
  169. package/package.json +15 -5
  170. package/.ai/skills/framework-dev/SKILL.md +0 -348
  171. package/dist/DevServer.d.ts +0 -24
  172. package/dist/DevServer.js +0 -87
  173. package/dist/DevServer.js.map +0 -1
  174. package/dist/models/InMemoryDatabase.d.ts +0 -20
  175. package/dist/models/InMemoryDatabase.js +0 -111
  176. package/dist/models/InMemoryDatabase.js.map +0 -1
  177. package/dist/services/BuildWorkflowRunResult.service.d.ts +0 -8
  178. package/dist/services/BuildWorkflowRunResult.service.js +0 -49
  179. package/dist/services/BuildWorkflowRunResult.service.js.map +0 -1
  180. package/dist/tools/is-workflow-waiting.d.ts +0 -4
  181. package/dist/tools/is-workflow-waiting.js +0 -12
  182. package/dist/tools/is-workflow-waiting.js.map +0 -1
  183. package/dist/transport/DevServerJsonRpc.js +0 -42
  184. package/dist/transport/DevServerJsonRpc.js.map +0 -1
  185. package/dist/use-cases/CallbackWorkflowRunAsyncActivity.usecase.d.ts +0 -14
  186. package/dist/use-cases/CallbackWorkflowRunAsyncActivity.usecase.js +0 -64
  187. package/dist/use-cases/CallbackWorkflowRunAsyncActivity.usecase.js.map +0 -1
  188. package/dist/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.d.ts +0 -8
  189. package/dist/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.js +0 -40
  190. package/dist/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.js.map +0 -1
  191. package/dist/use-cases/WorkflowRunAsyncActivity.usecase.d.ts +0 -7
  192. package/dist/use-cases/WorkflowRunAsyncActivity.usecase.js +0 -46
  193. package/dist/use-cases/WorkflowRunAsyncActivity.usecase.js.map +0 -1
  194. package/dist/use-cases/WorkflowRunBuildHistory.usecase.d.ts +0 -8
  195. package/dist/use-cases/WorkflowRunBuildHistory.usecase.js.map +0 -1
  196. package/dist/use-cases/WorkflowRunSyncActivity.usecase.d.ts +0 -4
  197. package/dist/use-cases/WorkflowRunSyncActivity.usecase.js +0 -28
  198. package/dist/use-cases/WorkflowRunSyncActivity.usecase.js.map +0 -1
  199. /package/dist/transport/{DevServerJsonRpc.d.ts → AppProcessJsonRpc.d.ts} +0 -0
@@ -0,0 +1,45 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Inject, Injectable } from 'pleroma';
11
+ import { JSONRPCError } from '../models/JSONRPCError.js';
12
+ import { WorkflowRunRepository } from '../repositories/WorkflowRun.repository.js';
13
+ import { DatabaseService } from '../services/Database.service.js';
14
+ import { toWorkflowRunOutput } from '../tools/to-workflow-run-output.js';
15
+ let WorkflowRunFindById = class WorkflowRunFindById {
16
+ workflowRunRepository;
17
+ database;
18
+ constructor(workflowRunRepository, database) {
19
+ this.workflowRunRepository = workflowRunRepository;
20
+ this.database = database;
21
+ }
22
+ async findById(id) {
23
+ const run = await this.workflowRunRepository.findById(id);
24
+ if (!run)
25
+ throw new JSONRPCError(`Workflow run not found: ${id}`, {
26
+ data: { status: 404 },
27
+ });
28
+ return {
29
+ ...toWorkflowRunOutput(run),
30
+ input: await this.toJSON(run.input),
31
+ output: await this.toJSON(run.output),
32
+ };
33
+ }
34
+ async toJSON(value) {
35
+ const text = await this.database.encode(value);
36
+ return text === null ? null : JSON.parse(text);
37
+ }
38
+ };
39
+ WorkflowRunFindById = __decorate([
40
+ Injectable(),
41
+ __param(0, Inject(() => WorkflowRunRepository)),
42
+ __param(1, Inject(() => DatabaseService))
43
+ ], WorkflowRunFindById);
44
+ export { WorkflowRunFindById };
45
+ //# sourceMappingURL=WorkflowRunFindById.usecase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowRunFindById.usecase.js","sourceRoot":"","sources":["../../src/use-cases/WorkflowRunFindById.usecase.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAA;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA;AAGjE,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAGX;IAGA;IALnB,YAEmB,qBAA4C,EAG5C,QAAyB;QAHzB,0BAAqB,GAArB,qBAAqB,CAAuB;QAG5C,aAAQ,GAAR,QAAQ,CAAiB;IACzC,CAAC;IAEG,KAAK,CAAC,QAAQ,CAAC,EAAU;QAC9B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAEzD,IAAI,CAAC,GAAG;YACN,MAAM,IAAI,YAAY,CAAC,2BAA2B,EAAE,EAAE,EAAE;gBACtD,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;aACtB,CAAC,CAAA;QAEJ,OAAO;YACL,GAAG,mBAAmB,CAAC,GAAG,CAAC;YAC3B,KAAK,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACnC,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;SACtC,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,KAAc;QACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAE9C,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAChD,CAAC;CACF,CAAA;AA7BY,mBAAmB;IAD/B,UAAU,EAAE;IAGR,WAAA,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,CAAA;IAGnC,WAAA,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAA;GALrB,mBAAmB,CA6B/B"}
@@ -1,10 +1,13 @@
1
1
  import path from 'node:path';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import { Env } from '@t4h.framework/core';
4
+ import { container } from 'pleroma';
5
+ import { WORKFLOW_RUN_EVENTS } from '../constants/server.js';
4
6
  import { JSONRPCClient } from '../models/JSONRPCClient.js';
5
7
  import { JSONRPCServer } from '../models/JSONRPCServer.js';
8
+ import { WorkflowRunEventsService } from '../services/WorkflowRunEvents.service.js';
6
9
  import { upApp } from '../tools/up-app.js';
7
- import { handlers } from '../transport/DevServerJsonRpc.js';
10
+ import { handlers } from '../transport/AppProcessJsonRpc.js';
8
11
  export let app = null;
9
12
  export const env = new Map();
10
13
  const isForkedEntry = !!process.argv[1] &&
@@ -32,6 +35,12 @@ if (isForkedEntry) {
32
35
  const client = new JSONRPCClient(async (message) => {
33
36
  process.send?.(message);
34
37
  });
38
+ const events = container.resolve(WorkflowRunEventsService);
39
+ for (const event of WORKFLOW_RUN_EVENTS)
40
+ events.on(event, payload => {
41
+ if (process.connected)
42
+ void client.notify(event, payload);
43
+ });
35
44
  process.on('message', message => Env.run(env, () => Promise.all([server.handle(message), client.handle(message)])));
36
45
  await Env.run(env, async () => {
37
46
  const manifest = app.toManifest();
@@ -1 +1 @@
1
- {"version":3,"file":"app-process.js","sourceRoot":"","sources":["../../src/workers/app-process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app-process.js","sourceRoot":"","sources":["../../src/workers/app-process.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t4h.framework/dev",
3
- "version": "0.14.2",
3
+ "version": "0.16.0",
4
4
  "description": "Dev server for the T4H Framework",
5
5
  "homepage": "https://github.com/tech4humans-brasil/framework/tree/main/packages/dev",
6
6
  "bugs": "https://github.com/tech4humans-brasil/framework/issues",
@@ -42,23 +42,33 @@
42
42
  "prepublishOnly": "yarn build"
43
43
  },
44
44
  "dependencies": {
45
+ "@hono/node-server": "^2.1.1",
45
46
  "@t4h.framework/cache": "^0.5.0",
46
- "@t4h.framework/fs": "^0.8.0",
47
- "@t4h.framework/http": "^0.4.3",
47
+ "@t4h.framework/fs": "^0.8.1",
48
+ "@t4h.framework/hmac": "^0.1.0",
49
+ "@t4h.framework/http": "^0.4.4",
50
+ "@t4h.framework/jwks": "^0.4.0",
51
+ "@t4h.framework/oidc": "^0.5.0",
48
52
  "@t4h.framework/orm": "^0.6.1",
49
53
  "@t4h.framework/runtime-claims": "^0.1.0",
50
54
  "@t4h.framework/sftp": "^0.6.0",
51
55
  "@t4h.framework/smtp": "^0.5.0",
56
+ "@t4h.framework/vite-panel-plugin": "^0.2.0",
57
+ "dot-object": "^2.1.5",
58
+ "hono": "^4.13.5",
52
59
  "mime-types": "^3.0.2",
53
60
  "nodemailer": "^8.0.1",
54
61
  "pleroma": "^1.0.0",
55
62
  "reflect-metadata": "^0.2.2",
56
63
  "sift": "^17.1.3",
57
64
  "ssh2-sftp-client": "^12.1.1",
58
- "undici": "^7.22.0"
65
+ "undici": "^7.22.0",
66
+ "uuidv7": "^1.2.1",
67
+ "vite": "^8.0.3"
59
68
  },
60
69
  "devDependencies": {
61
70
  "@t4h.framework/core": "^0.9.1",
71
+ "@types/dot-object": "^2.1.6",
62
72
  "@types/json-schema": "^7.0.15",
63
73
  "@types/mime-types": "^3",
64
74
  "@types/node": "^25.3.5",
@@ -72,6 +82,6 @@
72
82
  },
73
83
  "packageManager": "yarn@4.12.0",
74
84
  "engines": {
75
- "node": ">=22"
85
+ "node": ">=22.13"
76
86
  }
77
87
  }
@@ -1,348 +0,0 @@
1
- ---
2
- name: framework-dev
3
- description: >-
4
- Local development runtime for T4H Framework apps via @t4h.framework/dev:
5
- DevServer (TypeScript watch, forked app process, JSON-RPC IPC), dev claim
6
- providers (ORM, HTTP, FS, cache, SMTP, workflow engine), workflow runs, env
7
- vars, and async activity advancement. Use when implementing or debugging
8
- framework dev, embedding DevServer, importing @t4h.framework/dev/build for
9
- tsBuild/tsBuildWatch/upApp, wiring dev claims in tests, isWorkflowWaiting,
10
- findClaimByConstructor, db.json ORM persistence, or understanding how
11
- framework dev / framework build work under @t4h.framework/cli.
12
- ---
13
-
14
- # @t4h.framework/dev
15
-
16
- Local development runtime for [T4H Framework](https://github.com/tech4humans-brasil/framework) apps. Watches TypeScript, compiles the project, forks a child process that loads the user's `App`, and runs workflows with in-memory or local claim implementations — no external runtime infrastructure.
17
-
18
- | Import | Purpose |
19
- |--------|---------|
20
- | `@t4h.framework/dev` | `DevServer`, `claims`, dev claim classes, `findClaimByConstructor`, `isWorkflowWaiting` |
21
- | `@t4h.framework/dev/build` | `tsBuild`, `tsBuildWatch`, `upApp`, path resolvers, `mkdirOutDirProjectFromTsConfigPathAndJsonPackagePath` |
22
-
23
- Node `>=22`. ESM (`"type": "module"`). Authoritative docs: `packages/dev/README.md` and source under `packages/dev/src/`.
24
-
25
- Interactive CLI (`framework dev`, `framework build`) lives in **`@t4h.framework/cli`** — see `packages/cli/.ai/skills/framework-cli/SKILL.md` for flags and menus. This skill covers the **dev package API and behavior**.
26
-
27
- ---
28
-
29
- ## Architecture
30
-
31
- ```mermaid
32
- flowchart TB
33
- subgraph parent ["Parent (DevServer)"]
34
- Watch["tsBuildWatch"]
35
- RPCClient["JSON-RPC client"]
36
- Watch -->|"onSuccess"| Fork
37
- Fork["fork(app-process)"]
38
- Fork --> RPCClient
39
- end
40
-
41
- subgraph child ["Child (app-process worker)"]
42
- App["User App via upApp"]
43
- RPCServer["JSON-RPC server"]
44
- Claims["claims registry"]
45
- App --> RPCServer
46
- Claims --> App
47
- end
48
-
49
- RPCClient <-->|"IPC messages"| RPCServer
50
- ```
51
-
52
- 1. **Parent** — `DevServer.start()` resolves paths, creates a temp out dir, starts `tsBuildWatch`.
53
- 2. **On successful compile** — kills prior child, forks `src/workers/app-process.js` with compiled entry URL and `NAME=value` env args.
54
- 3. **Child** — `upApp(entrypoint)` loads `App`, registers RPC handlers from `DevServerJsonRpc`, notifies parent with `manifest`.
55
- 4. **Parent drives** — workflows, env, async advancement via `JSONRPCClient.call(...)`.
56
-
57
- Rebuild on file change restarts the child (CLI aborts in-flight prompts on manifest reload).
58
-
59
- ---
60
-
61
- ## App project requirements
62
-
63
- | Requirement | Detail |
64
- |-------------|--------|
65
- | `package.json` `main` | Non-empty string (compiled JS path relative to `dist/`) |
66
- | `tsconfig.json` | Beside `package.json` (`resolveTsconfigFromPackageJsonPath`) |
67
- | App export | `default` instance of `App` **or** named `app` (`upApp` throws `App not found` otherwise) |
68
- | Peer deps | Match app imports: `@t4h.framework/core`, `cache`, `fs`, `http`, `orm`, `smtp`, `runtime-claims` |
69
-
70
- Typical app script (via CLI):
71
-
72
- ```json
73
- {
74
- "main": "main.js",
75
- "scripts": {
76
- "dev": "framework dev --env-file-if-exists=.env"
77
- },
78
- "devDependencies": {
79
- "@t4h.framework/cli": "workspace:^"
80
- }
81
- }
82
- ```
83
-
84
- Install dev package directly only for **programmatic** embedding:
85
-
86
- ```bash
87
- yarn add -D @t4h.framework/dev
88
- ```
89
-
90
- ---
91
-
92
- ## DevServer (programmatic)
93
-
94
- ```typescript
95
- import { DevServer } from '@t4h.framework/dev'
96
-
97
- const devServer = new DevServer(
98
- {
99
- entrypoint: './package.json',
100
- env: { API_KEY: 'secret' },
101
- },
102
- manifest => {
103
- console.log(
104
- 'App loaded:',
105
- manifest.workflows.map(w => w.id),
106
- )
107
- },
108
- )
109
-
110
- await devServer.start()
111
-
112
- const result = await devServer.runWorkflow('my-workflow/v1', {
113
- userId: '123',
114
- })
115
-
116
- await devServer.setEnv('API_KEY', 'new-value')
117
- const env = await devServer.listEnv()
118
-
119
- const pending = await devServer.listWaitingAsyncActivities()
120
- await devServer.advanceAsyncActivity(pending[0].id, { approved: true })
121
- ```
122
-
123
- ### `DevServerConfig`
124
-
125
- | Field | Type | Role |
126
- |-------|------|------|
127
- | `entrypoint` | `string` | Path to `package.json` or directory containing it |
128
- | `env` | `Record<string, string>` | Initial env passed to child as `NAME=value` argv |
129
-
130
- ### Methods
131
-
132
- | Method | RPC / behavior |
133
- |--------|----------------|
134
- | `start()` | Resolve paths, temp out dir, `tsBuildWatch`; fork child on first successful build |
135
- | `runWorkflow(workflowId, input)` | `workflow.run` |
136
- | `setEnv(name, value)` | `env.set` |
137
- | `listEnv()` | `env.list` → `Record<string, string>` |
138
- | `listWaitingAsyncActivities()` | `workflow.async-activities.waiting.list` |
139
- | `advanceAsyncActivity(id, payload)` | `workflow.async-activities.advance` |
140
-
141
- Compile overrides in `DevServer` (same as `framework build`): `outDir: <temp>/dist`, `sourceMap: true`, `declaration: false`.
142
-
143
- ---
144
-
145
- ## Workflow run results
146
-
147
- `BuildWorkflowRunResultService.build(run)` shapes RPC results:
148
-
149
- | Run state | Returned value |
150
- |-----------|----------------|
151
- | `fulfilled` | `run.output` |
152
- | `rejected` | `{ error: run.rejectedReason }` |
153
- | pending async activity | `{ isWaiting: true, id: string }` (activity id) |
154
- | otherwise | `{ isWaiting: false }` |
155
-
156
- Detect waiting results in tooling:
157
-
158
- ```typescript
159
- import { isWorkflowWaiting } from '@t4h.framework/dev'
160
-
161
- if (isWorkflowWaiting(result)) {
162
- console.log(`Paused; advance activity id: ${result.id}`)
163
- }
164
- ```
165
-
166
- The CLI uses this for the same guidance after **Run workflow**.
167
-
168
- ---
169
-
170
- ## JSON-RPC surface (child handlers)
171
-
172
- Defined in `src/transport/DevServerJsonRpc.ts`:
173
-
174
- | Method | Params | Behavior |
175
- |--------|--------|----------|
176
- | `workflow.run` | `workflowId`, `input` | Create run, `nextTick`, return built result |
177
- | `workflow.async-activities.advance` | `id`, `payload` | Advance pending async activity |
178
- | `workflow.async-activities.waiting.list` | — | Pending activities with `id`, `workflowId`, optional `schema` |
179
- | `env.set` | `name`, `value` | Update child env `Map` (scoped via `Env.run`) |
180
- | `env.list` | — | `Object.fromEntries(env)` |
181
-
182
- Parent receives `manifest` notification from child (`app.toManifest()`, workflow ids default to `:index` when missing).
183
-
184
- ---
185
-
186
- ## Build pipeline (`@t4h.framework/dev/build`)
187
-
188
- Used by `framework build` and internally by `DevServer`. Mirror imports from `packages/cli/src/commands/build/build.ts`:
189
-
190
- ```typescript
191
- import path from 'node:path'
192
- import {
193
- mkdirOutDirProjectFromTsConfigPathAndJsonPackagePath,
194
- resolvePackageJsonPath,
195
- resolveTsconfigFromPackageJsonPath,
196
- tsBuild,
197
- upApp,
198
- } from '@t4h.framework/dev/build'
199
- ```
200
-
201
- ### Steps (`framework build`)
202
-
203
- 1. `resolvePackageJsonPath(entrypoint)` — file or directory; throws if missing.
204
- 2. `resolveTsconfigFromPackageJsonPath` — `<packageDir>/tsconfig.json` must exist.
205
- 3. `mkdirOutDirProjectFromTsConfigPathAndJsonPackagePath` — creates `<tsconfigDir>/.temp/<random>/`, copies `package.json`; may `process.send({ type: 'outDir', data })` when IPC parent exists.
206
- 4. `tsBuild(tsconfigPath, { outDir: join(outDir, 'dist'), sourceMap: true, declaration: false, declarationMap: false })` — returns `{ ok, diagnostics, parsed }`; throw on `!ok`.
207
- 5. `Env.run(env, () => upApp(join(outDir, 'dist', packageJson.main)))` then `app.toManifest()` → `manifest.json` in out dir.
208
-
209
- ### `tsBuild` vs `tsBuildWatch`
210
-
211
- | Function | Use |
212
- |----------|-----|
213
- | `tsBuild` | One-shot compile (`framework build`) |
214
- | `tsBuildWatch` | Watch mode with `onSuccess`, `onFail`, `onStatus`; returns `{ close() }` watcher |
215
-
216
- ### `upApp(appPath)`
217
-
218
- ```typescript
219
- const module = await import(appPath)
220
- if (module.default instanceof App) return module.default
221
- if (module.app instanceof App) return module.app
222
- throw new Error('App not found')
223
- ```
224
-
225
- Tests: `src/tools/__tests__/up-app.spec.ts`.
226
-
227
- ---
228
-
229
- ## Dev claims
230
-
231
- Registry: `export const claims` in `src/claims.ts` (`ClaimProvider[]` for `App` / `TestWorkflowEnvironment`).
232
-
233
- ```typescript
234
- import { claims, findClaimByConstructor } from '@t4h.framework/dev'
235
- import { DevHttpClientRequestClaim } from '@t4h.framework/dev'
236
-
237
- const httpClaim = findClaimByConstructor(DevHttpClientRequestClaim)
238
- ```
239
-
240
- | Claim constructor | Dev class | Behavior (from source) |
241
- |-------------------|-----------|------------------------|
242
- | `ORMClaim` | `DevORMClaim` | In-memory DB persisted to **`db.json`** in `process.cwd()` |
243
- | `HttpClientRequestClaim` | `DevHttpClientRequestClaim` | Real HTTP via **`undici`** (`request`, redirects) |
244
- | `FileSystemClaim` | `DevFileSystemClaim` | Local FS; writes under temp dir; `DevFileBinary` codec |
245
- | `SmtpSendEmailClaim` | `DevSmtpSendEmailClaim` | **`nodemailer`** transport from `connectionString` URL |
246
- | `WorkflowClaim` | `DevWorkflowClaim` | Local workflow runs via `WorkflowRunFacade` (nested `startWorkflow`) |
247
- | `CacheClaim` | `DevCacheClaim` | In-memory `Map` (process lifetime) |
248
- | `SftpClaim` | `DevSftpClaim` | Real SFTP via **`ssh2-sftp-client`** |
249
- | `GetActivityUniqueIdentifierClaim` | `DevGetActivityUniqueIdentifierClaim` | Dev identifiers |
250
- | `GetWorkflowUniqueIdentifierClaim` | `DevGetWorkflowUniqueIdentifierClaim` | Dev identifiers |
251
- | `GetProjectUniqueIdentifierClaim` | `DevGetProjectUniqueIdentifierClaim` | Dev identifiers |
252
- | `GetProjectVersionUniqueIdentifierClaim` | `DevGetProjectVersionUniqueIdentifierClaim` | Dev identifiers |
253
- | `GetProjectVersionWorkflowUniqueIdentifierClaim` | `DevGetProjectVersionWorkflowUniqueIdentifierClaim` | Dev identifiers |
254
-
255
- Exported claim classes (main entry): see `src/index.ts` — not every registry entry has a dedicated public export; use `claims` or `findClaimByConstructor` for tests.
256
-
257
- `DevWorkflowClaim.start` requires `workflow.id`; supports parent run context via `RuntimeContextService`.
258
-
259
- ---
260
-
261
- ## Testing with dev claims
262
-
263
- Prefer `@t4h.framework/core/testing` (`TestWorkflowEnvironment`) with `mockClaim`
264
- for unit tests (see **framework-workflow-testing**). For integration-style tests
265
- that need real dev claim behavior, pass the dev `claims` registry and spy on a
266
- concrete claim:
267
-
268
- ```typescript
269
- import { claims, DevHttpClientRequestClaim, findClaimByConstructor } from '@t4h.framework/dev'
270
- import { TestWorkflowEnvironment } from '@t4h.framework/core/testing'
271
-
272
- const httpClaim = findClaimByConstructor(DevHttpClientRequestClaim)
273
- vi.spyOn(httpClaim, 'request')
274
-
275
- const env = TestWorkflowEnvironment.create({ now: 0 })
276
- await env.execute(MyWorkflow, input, { claims })
277
- ```
278
-
279
- RPC handler tests: `src/transport/__tests__/DevServerJsonRpc.spec.ts`. Result shaping: `src/services/__tests__/BuildWorkflowRunResult.service.spec.ts`. Async fixtures: `src/__tests__/fixtures.ts` (`TestAsyncActivity` with `pending` / `advance`).
280
-
281
- ---
282
-
283
- ## Package layout (for contributors)
284
-
285
- ```
286
- packages/dev/src/
287
- ├── DevServer.ts # Parent orchestration
288
- ├── claims.ts # ClaimProvider registry
289
- ├── workers/app-process.ts # Child entry (fork target)
290
- ├── transport/DevServerJsonRpc.ts
291
- ├── tools/ # build, watch, upApp, resolvers
292
- ├── models/claims/ # Dev*Claim implementations
293
- ├── services/ # WorkflowRunFacade, BuildWorkflowRunResult, …
294
- ├── use-cases/ # CreateWorkflowRun, async advance, …
295
- └── repositories/ # In-memory workflow run stores
296
- ```
297
-
298
- Develop the package:
299
-
300
- ```bash
301
- cd packages/dev
302
- yarn build
303
- yarn test # vitest
304
- yarn check-types
305
- ```
306
-
307
- `vitest.setup.ts` loads `reflect-metadata` (pleroma DI).
308
-
309
- ---
310
-
311
- ## Common mistakes (do not invent APIs)
312
-
313
- | Mistake | Reality |
314
- |---------|---------|
315
- | Export plain object instead of `App` | `upApp` throws `App not found` |
316
- | Missing `tsconfig.json` next to `package.json` | `resolveTsconfigFromPackageJsonPath` throws |
317
- | Missing or non-string `package.json` `main` | `DevServer` / build throw |
318
- | Expecting SMTP captured in memory | `DevSmtpSendEmailClaim` sends via nodemailer using the activity connection string |
319
- | Expecting mock HTTP in dev | `DevHttpClientRequestClaim` performs real outbound HTTP |
320
- | ORM data lost between runs | Data lives in **`db.json`** under cwd (deleted only if you remove the file) |
321
- | Wrong waiting-result shape | Use `isWorkflowWaiting` — checks `isWaiting === true` and string `id` |
322
- | Import build tools from main entry | Use `@t4h.framework/dev/build` for `tsBuild`, `upApp`, resolvers |
323
- | Assume all JSON Schema types in CLI prompts | CLI only handles `object`, `string`, `number` (see framework-cli skill) |
324
- | Add RPC methods without updating both sides | Parent `DevServer` client calls must match child `handlers` in `DevServerJsonRpc.ts` |
325
-
326
- ---
327
-
328
- ## Quick reference
329
-
330
- ```bash
331
- # Via CLI (requires @t4h.framework/cli)
332
- framework dev --entrypoint ./package.json -e API_KEY=secret
333
- framework dev --env-file-if-exists=.env
334
- framework build --entrypoint ./package.json -e MY_VAR=value
335
- ```
336
-
337
- ```typescript
338
- // Programmatic dev loop
339
- import { DevServer, isWorkflowWaiting } from '@t4h.framework/dev'
340
-
341
- // Build-only tooling
342
- import { tsBuild, upApp } from '@t4h.framework/dev/build'
343
-
344
- // Test / custom App wiring
345
- import { claims, findClaimByConstructor, DevORMClaim } from '@t4h.framework/dev'
346
- ```
347
-
348
- For CLI menus, publish IPC, and binary relaunch behavior, use **`framework-cli`** skill. For workflow/activity authoring, use **`framework-core`** skill.
@@ -1,24 +0,0 @@
1
- import type { App } from '@t4h.framework/core';
2
- export interface DevServerConfig {
3
- entrypoint: string;
4
- env: Record<string, string>;
5
- }
6
- export declare class DevServer {
7
- private readonly config;
8
- private readonly onAppManifest;
9
- private tsBuildWatcher;
10
- private packageJsonPath;
11
- private tsConfigPath;
12
- private outDir;
13
- private app;
14
- private jsonRpcServer;
15
- private jsonRpcClient;
16
- constructor(config: DevServerConfig, onAppManifest: (manifest: ReturnType<App['toManifest']>) => void);
17
- start(): Promise<void>;
18
- protected onTsBuildSuccess(): Promise<void>;
19
- runWorkflow(workflowId: string, input: any): Promise<any>;
20
- setEnv(name: string, value: string): Promise<any>;
21
- listEnv(): Promise<any>;
22
- listWaitingAsyncActivities(): Promise<any>;
23
- advanceAsyncActivity(id: string, payload: unknown): Promise<any>;
24
- }
package/dist/DevServer.js DELETED
@@ -1,87 +0,0 @@
1
- import { ChildProcess, fork } from 'node:child_process';
2
- import path from 'node:path';
3
- import { pathToFileURL } from 'node:url';
4
- import Type from 'typebox';
5
- import { JSONRPCClient } from './models/JSONRPCClient.js';
6
- import { JSONRPCServer, JSONRPCServerMethod } from './models/JSONRPCServer.js';
7
- import { mkdirOutDirProjectFromTsConfigPathAndJsonPackagePath } from './tools/mkdir-out-dir-project-from-ts-config-path-and-json-package-path.js';
8
- import { resolvePackageJsonPath } from './tools/resolve-package-json-path.js';
9
- import { resolveTsconfigFromPackageJsonPath } from './tools/resolve-tsconfig-path-from-package-json-path.js';
10
- import { tsBuildWatch } from './tools/ts-build-watch.js';
11
- export class DevServer {
12
- config;
13
- onAppManifest;
14
- tsBuildWatcher;
15
- packageJsonPath;
16
- tsConfigPath;
17
- outDir;
18
- app;
19
- jsonRpcServer;
20
- jsonRpcClient;
21
- constructor(config, onAppManifest) {
22
- this.config = config;
23
- this.onAppManifest = onAppManifest;
24
- this.jsonRpcServer = new JSONRPCServer([
25
- new JSONRPCServerMethod('manifest', { schema: [Type.Any()] }, manifest => this.onAppManifest(manifest)),
26
- ], message => {
27
- this.app?.send(message);
28
- });
29
- this.jsonRpcClient = new JSONRPCClient(message => {
30
- this.app?.send(message);
31
- });
32
- }
33
- async start() {
34
- this.packageJsonPath = await resolvePackageJsonPath(this.config.entrypoint);
35
- this.tsConfigPath = await resolveTsconfigFromPackageJsonPath(this.packageJsonPath);
36
- this.outDir = await mkdirOutDirProjectFromTsConfigPathAndJsonPackagePath(this.tsConfigPath, this.packageJsonPath);
37
- this.tsBuildWatcher = tsBuildWatch(this.tsConfigPath, {
38
- outDir: path.join(this.outDir, 'dist'),
39
- sourceMap: true,
40
- declaration: false,
41
- declarationMap: false,
42
- }, {
43
- onSuccess: () => this.onTsBuildSuccess(),
44
- onFail(diagnostics) {
45
- console.error('[DevServer] ts build failed:', diagnostics);
46
- },
47
- onStatus(status) {
48
- console.log('[DevServer] ts build status:', status);
49
- },
50
- });
51
- }
52
- async onTsBuildSuccess() {
53
- if (this.app) {
54
- this.app.kill();
55
- }
56
- const { default: packageJson } = await import(this.packageJsonPath, {
57
- with: { type: 'json' },
58
- });
59
- if (typeof packageJson.main !== 'string')
60
- throw new Error('Main is not a string');
61
- const entrypoint = pathToFileURL(path.join(this.outDir, 'dist', packageJson.main)).href;
62
- this.app = fork(path.join(import.meta.dirname, 'workers', 'app-process.js'), [
63
- entrypoint,
64
- ...Object.entries(this.config.env).map(([name, value]) => `${name}=${value}`),
65
- ], { stdio: ['ignore', 'inherit', 'inherit', 'ipc'] });
66
- this.app.on('message', message => Promise.all([
67
- this.jsonRpcServer.handle(message),
68
- this.jsonRpcClient.handle(message),
69
- ]));
70
- }
71
- async runWorkflow(workflowId, input) {
72
- return await this.jsonRpcClient.call('workflow.run', workflowId, input);
73
- }
74
- async setEnv(name, value) {
75
- return await this.jsonRpcClient.call('env.set', name, value);
76
- }
77
- async listEnv() {
78
- return await this.jsonRpcClient.call('env.list');
79
- }
80
- async listWaitingAsyncActivities() {
81
- return await this.jsonRpcClient.call('workflow.async-activities.waiting.list');
82
- }
83
- async advanceAsyncActivity(id, payload) {
84
- return await this.jsonRpcClient.call('workflow.async-activities.advance', id, payload);
85
- }
86
- }
87
- //# sourceMappingURL=DevServer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DevServer.js","sourceRoot":"","sources":["../src/DevServer.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- import EventEmitter from 'node:events';
2
- import type { FindOptions } from '@t4h.framework/orm';
3
- export type Row = Record<string, any> & {
4
- id: string;
5
- };
6
- export declare class InMemoryDatabaseTable extends EventEmitter {
7
- private readonly rows;
8
- private _sort;
9
- find(options: FindOptions<Row>): Row[];
10
- insert(rows: Omit<Row, 'id'>[]): string[];
11
- update(where: FindOptions<Row>['where'], row: object): number;
12
- delete(where: FindOptions<Row>['where']): void;
13
- toJSON(): Row[];
14
- }
15
- export declare class InMemoryDatabase extends EventEmitter {
16
- private readonly tables;
17
- constructor(initial?: Record<string, Row[]>);
18
- table(name: string): InMemoryDatabaseTable;
19
- toJSON(): Record<string, Row[]>;
20
- }