create-windy 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (904) hide show
  1. package/README.md +114 -0
  2. package/assets/LICENSE-Apache-2.0.txt +201 -0
  3. package/dist/cli.js +1662 -0
  4. package/package.json +37 -0
  5. package/template/.dockerignore +11 -0
  6. package/template/.oxfmtrc.json +9 -0
  7. package/template/.oxlintrc.json +119 -0
  8. package/template/.windy-template.json +71 -0
  9. package/template/AGENTS.md +87 -0
  10. package/template/README.md +128 -0
  11. package/template/apps/server/Dockerfile +34 -0
  12. package/template/apps/server/package.json +30 -0
  13. package/template/apps/server/src/access-guards.ts +112 -0
  14. package/template/apps/server/src/admin/routes.test.ts +105 -0
  15. package/template/apps/server/src/admin/routes.ts +95 -0
  16. package/template/apps/server/src/agent/data-scope-routes.test.ts +143 -0
  17. package/template/apps/server/src/agent/routes.test.ts +244 -0
  18. package/template/apps/server/src/agent/routes.ts +257 -0
  19. package/template/apps/server/src/api-app.ts +32 -0
  20. package/template/apps/server/src/application-services.ts +154 -0
  21. package/template/apps/server/src/audit/contracts.ts +21 -0
  22. package/template/apps/server/src/audit/drizzle-log-store.ts +150 -0
  23. package/template/apps/server/src/audit/policy.ts +18 -0
  24. package/template/apps/server/src/audit/recovery-queue.test.ts +42 -0
  25. package/template/apps/server/src/audit/recovery-queue.ts +63 -0
  26. package/template/apps/server/src/audit/redaction.ts +55 -0
  27. package/template/apps/server/src/audit/reliable-writer.test.ts +200 -0
  28. package/template/apps/server/src/audit/reliable-writer.ts +201 -0
  29. package/template/apps/server/src/audit/search-summary.ts +32 -0
  30. package/template/apps/server/src/auth/actor-resolver.test.ts +138 -0
  31. package/template/apps/server/src/auth/actor-resolver.ts +109 -0
  32. package/template/apps/server/src/auth/authentication-provider.test.ts +180 -0
  33. package/template/apps/server/src/auth/authentication-provider.ts +117 -0
  34. package/template/apps/server/src/auth/authorization-snapshot.test.ts +117 -0
  35. package/template/apps/server/src/auth/authorization-snapshot.ts +98 -0
  36. package/template/apps/server/src/auth/bearer-token.ts +5 -0
  37. package/template/apps/server/src/auth/bootstrap-admin.ts +33 -0
  38. package/template/apps/server/src/auth/credential-restriction.ts +29 -0
  39. package/template/apps/server/src/auth/credential-routes.test.ts +190 -0
  40. package/template/apps/server/src/auth/credential-service.ts +165 -0
  41. package/template/apps/server/src/auth/development-bypass.ts +22 -0
  42. package/template/apps/server/src/auth/drizzle-repository.ts +315 -0
  43. package/template/apps/server/src/auth/drizzle-session-operations.ts +119 -0
  44. package/template/apps/server/src/auth/login-routes.ts +121 -0
  45. package/template/apps/server/src/auth/own-session-routes.test.ts +248 -0
  46. package/template/apps/server/src/auth/own-session-routes.ts +110 -0
  47. package/template/apps/server/src/auth/password.test.ts +30 -0
  48. package/template/apps/server/src/auth/password.ts +46 -0
  49. package/template/apps/server/src/auth/repository.test.ts +61 -0
  50. package/template/apps/server/src/auth/repository.ts +305 -0
  51. package/template/apps/server/src/auth/routes.test.ts +350 -0
  52. package/template/apps/server/src/auth/routes.ts +237 -0
  53. package/template/apps/server/src/auth/runtime.ts +20 -0
  54. package/template/apps/server/src/auth/service.ts +329 -0
  55. package/template/apps/server/src/auth/session-service.ts +123 -0
  56. package/template/apps/server/src/background/task-guard.test.ts +66 -0
  57. package/template/apps/server/src/background/task-guard.ts +49 -0
  58. package/template/apps/server/src/bulk-data/artifact-store.ts +82 -0
  59. package/template/apps/server/src/bulk-data/dictionary-handler.ts +122 -0
  60. package/template/apps/server/src/bulk-data/drizzle-repository.integration.test.ts +156 -0
  61. package/template/apps/server/src/bulk-data/drizzle-repository.ts +298 -0
  62. package/template/apps/server/src/bulk-data/helpers.ts +36 -0
  63. package/template/apps/server/src/bulk-data/input-validation.ts +99 -0
  64. package/template/apps/server/src/bulk-data/repository.ts +246 -0
  65. package/template/apps/server/src/bulk-data/resource-handler.ts +27 -0
  66. package/template/apps/server/src/bulk-data/routes.test.ts +169 -0
  67. package/template/apps/server/src/bulk-data/routes.ts +248 -0
  68. package/template/apps/server/src/bulk-data/scheduler-integration.test.ts +142 -0
  69. package/template/apps/server/src/bulk-data/service.test.ts +347 -0
  70. package/template/apps/server/src/bulk-data/service.ts +319 -0
  71. package/template/apps/server/src/bulk-data/types.ts +73 -0
  72. package/template/apps/server/src/configuration/bootstrap.ts +59 -0
  73. package/template/apps/server/src/configuration/definition.ts +89 -0
  74. package/template/apps/server/src/configuration/drizzle-repository.ts +166 -0
  75. package/template/apps/server/src/configuration/repository.ts +138 -0
  76. package/template/apps/server/src/configuration/routes.test.ts +178 -0
  77. package/template/apps/server/src/configuration/routes.ts +260 -0
  78. package/template/apps/server/src/configuration/service.test.ts +128 -0
  79. package/template/apps/server/src/configuration/service.ts +187 -0
  80. package/template/apps/server/src/data-access/context.ts +162 -0
  81. package/template/apps/server/src/data-access/department-tree.ts +27 -0
  82. package/template/apps/server/src/data-access/drizzle-predicate.test.ts +86 -0
  83. package/template/apps/server/src/data-access/drizzle-predicate.ts +50 -0
  84. package/template/apps/server/src/data-access/errors.ts +5 -0
  85. package/template/apps/server/src/data-access/platform-actor.ts +25 -0
  86. package/template/apps/server/src/data-access/query-specification.test.ts +82 -0
  87. package/template/apps/server/src/data-access/query-specification.ts +77 -0
  88. package/template/apps/server/src/data-access/scoped-repository.integration.test.ts +203 -0
  89. package/template/apps/server/src/data-access/scoped-repository.ts +268 -0
  90. package/template/apps/server/src/data-access/scoped-resource.test.ts +158 -0
  91. package/template/apps/server/src/data-access/scoped-resource.ts +141 -0
  92. package/template/apps/server/src/data-governance/export/approval-port.ts +84 -0
  93. package/template/apps/server/src/data-governance/export/authorization-port.test.ts +103 -0
  94. package/template/apps/server/src/data-governance/export/authorization-port.ts +69 -0
  95. package/template/apps/server/src/data-governance/export/drizzle-repository.integration.test.ts +88 -0
  96. package/template/apps/server/src/data-governance/export/drizzle-repository.ts +97 -0
  97. package/template/apps/server/src/data-governance/export/job-runtime.test.ts +339 -0
  98. package/template/apps/server/src/data-governance/export/job-runtime.ts +242 -0
  99. package/template/apps/server/src/data-governance/export/ndjson-stream.ts +62 -0
  100. package/template/apps/server/src/data-governance/export/postgres-api-actors.ts +140 -0
  101. package/template/apps/server/src/data-governance/export/postgres-api-assertions.ts +76 -0
  102. package/template/apps/server/src/data-governance/export/postgres-api-fixture.ts +265 -0
  103. package/template/apps/server/src/data-governance/export/postgres-api.integration.test.ts +298 -0
  104. package/template/apps/server/src/data-governance/export/postgres-recovery.integration.test.ts +344 -0
  105. package/template/apps/server/src/data-governance/export/repository.test.ts +55 -0
  106. package/template/apps/server/src/data-governance/export/repository.ts +83 -0
  107. package/template/apps/server/src/data-governance/export/request-fingerprint.test.ts +51 -0
  108. package/template/apps/server/src/data-governance/export/request-fingerprint.ts +45 -0
  109. package/template/apps/server/src/data-governance/export/routes-integrity.test.ts +90 -0
  110. package/template/apps/server/src/data-governance/export/routes-test-fixture.ts +239 -0
  111. package/template/apps/server/src/data-governance/export/routes.test.ts +182 -0
  112. package/template/apps/server/src/data-governance/export/routes.ts +215 -0
  113. package/template/apps/server/src/data-governance/export/scope-snapshot.test.ts +45 -0
  114. package/template/apps/server/src/data-governance/export/scope-snapshot.ts +27 -0
  115. package/template/apps/server/src/data-governance/export/service.ts +337 -0
  116. package/template/apps/server/src/data-governance/export/source.ts +69 -0
  117. package/template/apps/server/src/data-governance/export/types.ts +55 -0
  118. package/template/apps/server/src/data-governance/plaintext-access.test.ts +70 -0
  119. package/template/apps/server/src/data-governance/plaintext-access.ts +88 -0
  120. package/template/apps/server/src/data-governance/plaintext-postgres.integration.test.ts +223 -0
  121. package/template/apps/server/src/data-governance/user-plaintext-routes.test.ts +287 -0
  122. package/template/apps/server/src/data-governance/user-plaintext-routes.ts +181 -0
  123. package/template/apps/server/src/data-governance/user-projection.ts +54 -0
  124. package/template/apps/server/src/data-governance/user-sensitive-read-service.ts +54 -0
  125. package/template/apps/server/src/example-modules.ts +62 -0
  126. package/template/apps/server/src/example-permissions.ts +5 -0
  127. package/template/apps/server/src/feature/manifest-feature-repository.test.ts +187 -0
  128. package/template/apps/server/src/feature/manifest-feature-repository.ts +200 -0
  129. package/template/apps/server/src/feature/routes.authorization.test.ts +199 -0
  130. package/template/apps/server/src/feature/routes.ts +193 -0
  131. package/template/apps/server/src/foundation-access.test.ts +50 -0
  132. package/template/apps/server/src/foundation-access.ts +34 -0
  133. package/template/apps/server/src/foundation-route.ts +55 -0
  134. package/template/apps/server/src/foundation.ts +85 -0
  135. package/template/apps/server/src/guards.test.ts +74 -0
  136. package/template/apps/server/src/guards.ts +214 -0
  137. package/template/apps/server/src/http-app.test.ts +77 -0
  138. package/template/apps/server/src/http-app.ts +51 -0
  139. package/template/apps/server/src/index.ts +374 -0
  140. package/template/apps/server/src/jobs/artifact-service.test.ts +78 -0
  141. package/template/apps/server/src/jobs/artifact-service.ts +94 -0
  142. package/template/apps/server/src/jobs/drizzle-artifact.ts +63 -0
  143. package/template/apps/server/src/jobs/drizzle-claim.ts +111 -0
  144. package/template/apps/server/src/jobs/drizzle-execution-repository.ts +299 -0
  145. package/template/apps/server/src/jobs/drizzle-execution.integration.test.ts +232 -0
  146. package/template/apps/server/src/jobs/drizzle-lease.ts +21 -0
  147. package/template/apps/server/src/jobs/drizzle-mappers.ts +121 -0
  148. package/template/apps/server/src/jobs/drizzle-recovery-repository.ts +214 -0
  149. package/template/apps/server/src/jobs/drizzle-repository.integration.test.ts +135 -0
  150. package/template/apps/server/src/jobs/drizzle-repository.ts +268 -0
  151. package/template/apps/server/src/jobs/execution-repository.ts +72 -0
  152. package/template/apps/server/src/jobs/execution.test.ts +303 -0
  153. package/template/apps/server/src/jobs/handler-registry.ts +81 -0
  154. package/template/apps/server/src/jobs/in-memory-claim.ts +96 -0
  155. package/template/apps/server/src/jobs/in-memory-execution.ts +336 -0
  156. package/template/apps/server/src/jobs/in-memory-lease.ts +66 -0
  157. package/template/apps/server/src/jobs/legacy-adapter.integration.test.ts +177 -0
  158. package/template/apps/server/src/jobs/legacy-adapter.test.ts +199 -0
  159. package/template/apps/server/src/jobs/legacy-adapter.ts +109 -0
  160. package/template/apps/server/src/jobs/legacy-service-runtime.ts +95 -0
  161. package/template/apps/server/src/jobs/repository.ts +141 -0
  162. package/template/apps/server/src/jobs/service.test.ts +64 -0
  163. package/template/apps/server/src/jobs/service.ts +44 -0
  164. package/template/apps/server/src/jobs/types.ts +180 -0
  165. package/template/apps/server/src/jobs/worker.ts +258 -0
  166. package/template/apps/server/src/license/legacy-license-resolver.ts +23 -0
  167. package/template/apps/server/src/license/license-resolver.test.ts +55 -0
  168. package/template/apps/server/src/license/license-resolver.ts +122 -0
  169. package/template/apps/server/src/license/reminder.test.ts +61 -0
  170. package/template/apps/server/src/license/reminder.ts +33 -0
  171. package/template/apps/server/src/license/restriction.test.ts +54 -0
  172. package/template/apps/server/src/license/restriction.ts +80 -0
  173. package/template/apps/server/src/license/routes-offline-code.test.ts +173 -0
  174. package/template/apps/server/src/license/routes.ts +99 -0
  175. package/template/apps/server/src/license/runtime-audit-reliability.test.ts +96 -0
  176. package/template/apps/server/src/license/runtime-reminder.test.ts +147 -0
  177. package/template/apps/server/src/license/runtime-service-test-http.ts +28 -0
  178. package/template/apps/server/src/license/runtime-service.test.ts +334 -0
  179. package/template/apps/server/src/license/runtime-service.ts +308 -0
  180. package/template/apps/server/src/module-composition.test.ts +70 -0
  181. package/template/apps/server/src/module-composition.ts +28 -0
  182. package/template/apps/server/src/notification/drizzle-repository.ts +233 -0
  183. package/template/apps/server/src/notification/repository.ts +160 -0
  184. package/template/apps/server/src/notification/routes.test.ts +151 -0
  185. package/template/apps/server/src/notification/routes.ts +185 -0
  186. package/template/apps/server/src/observability/bootstrap.ts +56 -0
  187. package/template/apps/server/src/observability/http-observability.test.ts +53 -0
  188. package/template/apps/server/src/observability/http-observability.ts +54 -0
  189. package/template/apps/server/src/observability/metrics.test.ts +36 -0
  190. package/template/apps/server/src/observability/metrics.ts +105 -0
  191. package/template/apps/server/src/observability/readiness.test.ts +36 -0
  192. package/template/apps/server/src/observability/readiness.ts +43 -0
  193. package/template/apps/server/src/observability/routes.test.ts +61 -0
  194. package/template/apps/server/src/observability/routes.ts +44 -0
  195. package/template/apps/server/src/pagination.ts +31 -0
  196. package/template/apps/server/src/persistence.integration.test.ts +54 -0
  197. package/template/apps/server/src/persistence.ts +118 -0
  198. package/template/apps/server/src/profile/routes.test.ts +190 -0
  199. package/template/apps/server/src/profile/routes.ts +173 -0
  200. package/template/apps/server/src/request-restriction.ts +29 -0
  201. package/template/apps/server/src/route-guards.test.ts +148 -0
  202. package/template/apps/server/src/route-guards.ts +63 -0
  203. package/template/apps/server/src/runtime-audit-list.test.ts +98 -0
  204. package/template/apps/server/src/runtime-config.ts +11 -0
  205. package/template/apps/server/src/runtime-development.ts +68 -0
  206. package/template/apps/server/src/runtime-license.ts +50 -0
  207. package/template/apps/server/src/runtime.test.ts +264 -0
  208. package/template/apps/server/src/runtime.ts +324 -0
  209. package/template/apps/server/src/scheduler/audit.ts +38 -0
  210. package/template/apps/server/src/scheduler/definitions.test.ts +35 -0
  211. package/template/apps/server/src/scheduler/definitions.ts +79 -0
  212. package/template/apps/server/src/scheduler/drizzle-durable-links.ts +52 -0
  213. package/template/apps/server/src/scheduler/drizzle-mappers.ts +36 -0
  214. package/template/apps/server/src/scheduler/drizzle-repository.integration.test.ts +174 -0
  215. package/template/apps/server/src/scheduler/drizzle-repository.ts +348 -0
  216. package/template/apps/server/src/scheduler/execution-context.ts +24 -0
  217. package/template/apps/server/src/scheduler/execution-recorder.ts +101 -0
  218. package/template/apps/server/src/scheduler/feature-preflight.ts +40 -0
  219. package/template/apps/server/src/scheduler/history.ts +22 -0
  220. package/template/apps/server/src/scheduler/overview.test.ts +89 -0
  221. package/template/apps/server/src/scheduler/overview.ts +125 -0
  222. package/template/apps/server/src/scheduler/recovery-conflict.ts +19 -0
  223. package/template/apps/server/src/scheduler/recovery-service.test.ts +238 -0
  224. package/template/apps/server/src/scheduler/recovery-service.ts +152 -0
  225. package/template/apps/server/src/scheduler/repository.ts +274 -0
  226. package/template/apps/server/src/scheduler/routes.test.ts +347 -0
  227. package/template/apps/server/src/scheduler/routes.ts +222 -0
  228. package/template/apps/server/src/scheduler/sensitive-text.ts +20 -0
  229. package/template/apps/server/src/scheduler/service-idle.test.ts +73 -0
  230. package/template/apps/server/src/scheduler/service.test.ts +330 -0
  231. package/template/apps/server/src/scheduler/service.ts +339 -0
  232. package/template/apps/server/src/scheduler/types.ts +103 -0
  233. package/template/apps/server/src/scheduler/worker.ts +38 -0
  234. package/template/apps/server/src/search/config.test.ts +43 -0
  235. package/template/apps/server/src/search/config.ts +62 -0
  236. package/template/apps/server/src/search/contracts.ts +127 -0
  237. package/template/apps/server/src/search/cursor.ts +39 -0
  238. package/template/apps/server/src/search/errors.ts +11 -0
  239. package/template/apps/server/src/search/host.ts +36 -0
  240. package/template/apps/server/src/search/masking.ts +6 -0
  241. package/template/apps/server/src/search/provider-execution.ts +195 -0
  242. package/template/apps/server/src/search/rate-limiter.ts +23 -0
  243. package/template/apps/server/src/search/registry.ts +105 -0
  244. package/template/apps/server/src/search/routes.test.ts +156 -0
  245. package/template/apps/server/src/search/routes.ts +95 -0
  246. package/template/apps/server/src/search/service.test.ts +314 -0
  247. package/template/apps/server/src/search/service.ts +257 -0
  248. package/template/apps/server/src/search/test-support.ts +122 -0
  249. package/template/apps/server/src/session/routes.test.ts +111 -0
  250. package/template/apps/server/src/session/routes.ts +56 -0
  251. package/template/apps/server/src/settings/drizzle-repository.ts +66 -0
  252. package/template/apps/server/src/settings/repository.ts +29 -0
  253. package/template/apps/server/src/settings/routes.test.ts +250 -0
  254. package/template/apps/server/src/settings/routes.ts +175 -0
  255. package/template/apps/server/src/settings/runtime.ts +13 -0
  256. package/template/apps/server/src/storage/blob-reference-registry.test.ts +25 -0
  257. package/template/apps/server/src/storage/blob-reference-registry.ts +15 -0
  258. package/template/apps/server/src/storage/drizzle-upload-repository.integration.test.ts +136 -0
  259. package/template/apps/server/src/storage/drizzle-upload-repository.ts +248 -0
  260. package/template/apps/server/src/storage/route-support.ts +84 -0
  261. package/template/apps/server/src/storage/routes.test.ts +288 -0
  262. package/template/apps/server/src/storage/routes.ts +297 -0
  263. package/template/apps/server/src/storage/runtime.ts +86 -0
  264. package/template/apps/server/src/system/audit-query.ts +17 -0
  265. package/template/apps/server/src/system/audit-routes.test.ts +139 -0
  266. package/template/apps/server/src/system/audit-routes.ts +113 -0
  267. package/template/apps/server/src/system/built-in-roles.ts +116 -0
  268. package/template/apps/server/src/system/department-routes.test.ts +80 -0
  269. package/template/apps/server/src/system/department-routes.ts +90 -0
  270. package/template/apps/server/src/system/drizzle-mapping.ts +53 -0
  271. package/template/apps/server/src/system/drizzle-repository.ts +298 -0
  272. package/template/apps/server/src/system/drizzle-scoped-repository.ts +235 -0
  273. package/template/apps/server/src/system/drizzle-system.ts +361 -0
  274. package/template/apps/server/src/system/entities.ts +78 -0
  275. package/template/apps/server/src/system/feature-routes.test.ts +55 -0
  276. package/template/apps/server/src/system/identity-route-config.ts +73 -0
  277. package/template/apps/server/src/system/interface-catalog.test.ts +103 -0
  278. package/template/apps/server/src/system/interface-catalog.ts +82 -0
  279. package/template/apps/server/src/system/menu-registry.test.ts +125 -0
  280. package/template/apps/server/src/system/menu-registry.ts +259 -0
  281. package/template/apps/server/src/system/menu-routes.test.ts +68 -0
  282. package/template/apps/server/src/system/menu-routes.ts +200 -0
  283. package/template/apps/server/src/system/mutation-runner.ts +33 -0
  284. package/template/apps/server/src/system/operation-monitoring.test.ts +78 -0
  285. package/template/apps/server/src/system/operation-monitoring.ts +233 -0
  286. package/template/apps/server/src/system/operations.test.ts +269 -0
  287. package/template/apps/server/src/system/operations.ts +155 -0
  288. package/template/apps/server/src/system/postgres-monitoring.ts +31 -0
  289. package/template/apps/server/src/system/redis-health.test.ts +116 -0
  290. package/template/apps/server/src/system/redis-health.ts +230 -0
  291. package/template/apps/server/src/system/repository.ts +234 -0
  292. package/template/apps/server/src/system/resource-access-response.ts +47 -0
  293. package/template/apps/server/src/system/resource-export-route.ts +64 -0
  294. package/template/apps/server/src/system/resource-route-support.ts +50 -0
  295. package/template/apps/server/src/system/response-projection.ts +24 -0
  296. package/template/apps/server/src/system/route-helpers.ts +104 -0
  297. package/template/apps/server/src/system/route-test-app.ts +27 -0
  298. package/template/apps/server/src/system/route-types.ts +52 -0
  299. package/template/apps/server/src/system/routes-validation.test.ts +61 -0
  300. package/template/apps/server/src/system/routes.test.ts +311 -0
  301. package/template/apps/server/src/system/routes.ts +354 -0
  302. package/template/apps/server/src/system/seed.test.ts +129 -0
  303. package/template/apps/server/src/system/seed.ts +237 -0
  304. package/template/apps/server/src/system/user-account-policy.test.ts +158 -0
  305. package/template/apps/server/src/system/user-account-policy.ts +103 -0
  306. package/template/apps/server/src/system/user-data-scope.ts +10 -0
  307. package/template/apps/server/src/system/user-department-validation.ts +17 -0
  308. package/template/apps/server/src/system/user-projection.test.ts +40 -0
  309. package/template/apps/server/src/system/user-projection.ts +35 -0
  310. package/template/apps/server/src/work-order/data-scope.integration.test.ts +171 -0
  311. package/template/apps/server/src/work-order/drizzle-repository.integration.test.ts +78 -0
  312. package/template/apps/server/src/work-order/drizzle-repository.ts +67 -0
  313. package/template/apps/server/src/work-order/foundation-modules.test.ts +85 -0
  314. package/template/apps/server/src/work-order/repository.ts +46 -0
  315. package/template/apps/server/src/work-order/routes.test.ts +209 -0
  316. package/template/apps/server/src/work-order/routes.ts +159 -0
  317. package/template/apps/server/src/work-order/search-api.test.ts +121 -0
  318. package/template/apps/server/src/work-order/search-provider.test.ts +201 -0
  319. package/template/apps/server/src/work-order/search-provider.ts +59 -0
  320. package/template/apps/server/src/work-order/service.ts +82 -0
  321. package/template/apps/server/src/work-order/task.test.ts +79 -0
  322. package/template/apps/server/src/work-order/task.ts +30 -0
  323. package/template/apps/server/src/workflow/assignee-directory.ts +23 -0
  324. package/template/apps/server/src/workflow/drizzle-repository.integration.test.ts +213 -0
  325. package/template/apps/server/src/workflow/drizzle-repository.ts +299 -0
  326. package/template/apps/server/src/workflow/effects.test.ts +64 -0
  327. package/template/apps/server/src/workflow/effects.ts +112 -0
  328. package/template/apps/server/src/workflow/repository.ts +160 -0
  329. package/template/apps/server/src/workflow/routes.test.ts +256 -0
  330. package/template/apps/server/src/workflow/routes.ts +249 -0
  331. package/template/apps/server/src/workflow/service.ts +196 -0
  332. package/template/apps/server/src/workflow/timeout-runtime.test.ts +96 -0
  333. package/template/apps/server/src/workflow/timeout-runtime.ts +66 -0
  334. package/template/apps/server/tsconfig.json +17 -0
  335. package/template/apps/web/Dockerfile +41 -0
  336. package/template/apps/web/components.json +24 -0
  337. package/template/apps/web/dev/dev-identity.ts +58 -0
  338. package/template/apps/web/dev/dev-port.test.ts +53 -0
  339. package/template/apps/web/dev/dev-port.ts +68 -0
  340. package/template/apps/web/dev/start.ts +37 -0
  341. package/template/apps/web/index.html +14 -0
  342. package/template/apps/web/package.json +44 -0
  343. package/template/apps/web/runtime-server.test.ts +86 -0
  344. package/template/apps/web/runtime-server.ts +143 -0
  345. package/template/apps/web/server.ts +21 -0
  346. package/template/apps/web/src/App.vue +22 -0
  347. package/template/apps/web/src/app/home/HomePage.vue +75 -0
  348. package/template/apps/web/src/app/home/HomeWelcome.vue +85 -0
  349. package/template/apps/web/src/app/home/HomeWelcome.webtest.ts +32 -0
  350. package/template/apps/web/src/app/layouts/AppLayout.vue +10 -0
  351. package/template/apps/web/src/components/auth/DevelopmentAuthWarning.vue +15 -0
  352. package/template/apps/web/src/components/auth/LoginForm.vue +80 -0
  353. package/template/apps/web/src/components/auth/LoginForm.webtest.ts +33 -0
  354. package/template/apps/web/src/components/auth/PasswordChangeForm.vue +90 -0
  355. package/template/apps/web/src/components/auth/UserSessionMenu.vue +60 -0
  356. package/template/apps/web/src/components/auth/UserSessionMenu.webtest.ts +45 -0
  357. package/template/apps/web/src/components/common/ConfirmDialog.vue +75 -0
  358. package/template/apps/web/src/components/common/DataPagination.vue +79 -0
  359. package/template/apps/web/src/components/common/DataPagination.webtest.ts +28 -0
  360. package/template/apps/web/src/components/common/EmptyState.vue +43 -0
  361. package/template/apps/web/src/components/common/FormDialog.vue +86 -0
  362. package/template/apps/web/src/components/common/ModalBody.vue +19 -0
  363. package/template/apps/web/src/components/common/ModalLayout.webtest.ts +54 -0
  364. package/template/apps/web/src/components/common/PageError.vue +46 -0
  365. package/template/apps/web/src/components/common/PageLoading.vue +41 -0
  366. package/template/apps/web/src/components/common/StatusSummary.vue +37 -0
  367. package/template/apps/web/src/components/common/UnsavedChangesDialog.vue +60 -0
  368. package/template/apps/web/src/components/common/UnsavedChangesDialog.webtest.ts +60 -0
  369. package/template/apps/web/src/components/license/LicenseActivationCodeForm.vue +80 -0
  370. package/template/apps/web/src/components/license/LicenseExpiryBanner.vue +54 -0
  371. package/template/apps/web/src/components/license/LicenseFlow.webtest.ts +170 -0
  372. package/template/apps/web/src/components/license/LicenseStatusCard.vue +95 -0
  373. package/template/apps/web/src/components/license/LicenseUploadForm.vue +79 -0
  374. package/template/apps/web/src/components/license/license-display.ts +12 -0
  375. package/template/apps/web/src/components/ui/alert/Alert.vue +21 -0
  376. package/template/apps/web/src/components/ui/alert/AlertAction.vue +17 -0
  377. package/template/apps/web/src/components/ui/alert/AlertDescription.vue +22 -0
  378. package/template/apps/web/src/components/ui/alert/AlertTitle.vue +22 -0
  379. package/template/apps/web/src/components/ui/alert/index.ts +25 -0
  380. package/template/apps/web/src/components/ui/badge/Badge.vue +29 -0
  381. package/template/apps/web/src/components/ui/badge/index.ts +28 -0
  382. package/template/apps/web/src/components/ui/breadcrumb/Breadcrumb.vue +18 -0
  383. package/template/apps/web/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +26 -0
  384. package/template/apps/web/src/components/ui/breadcrumb/BreadcrumbItem.vue +17 -0
  385. package/template/apps/web/src/components/ui/breadcrumb/BreadcrumbLink.vue +24 -0
  386. package/template/apps/web/src/components/ui/breadcrumb/BreadcrumbList.vue +22 -0
  387. package/template/apps/web/src/components/ui/breadcrumb/BreadcrumbPage.vue +20 -0
  388. package/template/apps/web/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +23 -0
  389. package/template/apps/web/src/components/ui/breadcrumb/index.ts +7 -0
  390. package/template/apps/web/src/components/ui/button/Button.vue +31 -0
  391. package/template/apps/web/src/components/ui/button/index.ts +42 -0
  392. package/template/apps/web/src/components/ui/card/Card.vue +29 -0
  393. package/template/apps/web/src/components/ui/card/CardAction.vue +22 -0
  394. package/template/apps/web/src/components/ui/card/CardContent.vue +17 -0
  395. package/template/apps/web/src/components/ui/card/CardDescription.vue +17 -0
  396. package/template/apps/web/src/components/ui/card/CardFooter.vue +22 -0
  397. package/template/apps/web/src/components/ui/card/CardHeader.vue +22 -0
  398. package/template/apps/web/src/components/ui/card/CardTitle.vue +22 -0
  399. package/template/apps/web/src/components/ui/card/index.ts +7 -0
  400. package/template/apps/web/src/components/ui/checkbox/Checkbox.vue +41 -0
  401. package/template/apps/web/src/components/ui/checkbox/index.ts +1 -0
  402. package/template/apps/web/src/components/ui/dialog/Dialog.vue +15 -0
  403. package/template/apps/web/src/components/ui/dialog/DialogClose.vue +12 -0
  404. package/template/apps/web/src/components/ui/dialog/DialogContent.vue +62 -0
  405. package/template/apps/web/src/components/ui/dialog/DialogDescription.vue +30 -0
  406. package/template/apps/web/src/components/ui/dialog/DialogFooter.vue +33 -0
  407. package/template/apps/web/src/components/ui/dialog/DialogHeader.vue +17 -0
  408. package/template/apps/web/src/components/ui/dialog/DialogOverlay.vue +28 -0
  409. package/template/apps/web/src/components/ui/dialog/DialogScrollContent.vue +67 -0
  410. package/template/apps/web/src/components/ui/dialog/DialogTitle.vue +27 -0
  411. package/template/apps/web/src/components/ui/dialog/DialogTrigger.vue +12 -0
  412. package/template/apps/web/src/components/ui/dialog/index.ts +10 -0
  413. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenu.vue +19 -0
  414. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +50 -0
  415. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuContent.vue +48 -0
  416. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +12 -0
  417. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuItem.vue +41 -0
  418. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +30 -0
  419. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +21 -0
  420. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +51 -0
  421. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +23 -0
  422. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +22 -0
  423. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
  424. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +34 -0
  425. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +36 -0
  426. package/template/apps/web/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +17 -0
  427. package/template/apps/web/src/components/ui/dropdown-menu/index.ts +16 -0
  428. package/template/apps/web/src/components/ui/input/Input.vue +33 -0
  429. package/template/apps/web/src/components/ui/input/index.ts +1 -0
  430. package/template/apps/web/src/components/ui/select/Select.vue +15 -0
  431. package/template/apps/web/src/components/ui/select/SelectContent.vue +61 -0
  432. package/template/apps/web/src/components/ui/select/SelectGroup.vue +23 -0
  433. package/template/apps/web/src/components/ui/select/SelectItem.vue +49 -0
  434. package/template/apps/web/src/components/ui/select/SelectItemText.vue +12 -0
  435. package/template/apps/web/src/components/ui/select/SelectLabel.vue +19 -0
  436. package/template/apps/web/src/components/ui/select/SelectScrollDownButton.vue +34 -0
  437. package/template/apps/web/src/components/ui/select/SelectScrollUpButton.vue +34 -0
  438. package/template/apps/web/src/components/ui/select/SelectSeparator.vue +21 -0
  439. package/template/apps/web/src/components/ui/select/SelectTrigger.vue +43 -0
  440. package/template/apps/web/src/components/ui/select/SelectValue.vue +12 -0
  441. package/template/apps/web/src/components/ui/select/index.ts +11 -0
  442. package/template/apps/web/src/components/ui/separator/Separator.vue +30 -0
  443. package/template/apps/web/src/components/ui/separator/index.ts +1 -0
  444. package/template/apps/web/src/components/ui/sheet/Sheet.vue +15 -0
  445. package/template/apps/web/src/components/ui/sheet/SheetClose.vue +12 -0
  446. package/template/apps/web/src/components/ui/sheet/SheetContent.vue +62 -0
  447. package/template/apps/web/src/components/ui/sheet/SheetDescription.vue +23 -0
  448. package/template/apps/web/src/components/ui/sheet/SheetFooter.vue +15 -0
  449. package/template/apps/web/src/components/ui/sheet/SheetHeader.vue +15 -0
  450. package/template/apps/web/src/components/ui/sheet/SheetOverlay.vue +28 -0
  451. package/template/apps/web/src/components/ui/sheet/SheetTitle.vue +25 -0
  452. package/template/apps/web/src/components/ui/sheet/SheetTrigger.vue +12 -0
  453. package/template/apps/web/src/components/ui/sheet/index.ts +8 -0
  454. package/template/apps/web/src/components/ui/sidebar/Sidebar.vue +114 -0
  455. package/template/apps/web/src/components/ui/sidebar/SidebarContent.vue +23 -0
  456. package/template/apps/web/src/components/ui/sidebar/SidebarFooter.vue +18 -0
  457. package/template/apps/web/src/components/ui/sidebar/SidebarGroup.vue +18 -0
  458. package/template/apps/web/src/components/ui/sidebar/SidebarGroupAction.vue +29 -0
  459. package/template/apps/web/src/components/ui/sidebar/SidebarGroupContent.vue +18 -0
  460. package/template/apps/web/src/components/ui/sidebar/SidebarGroupLabel.vue +29 -0
  461. package/template/apps/web/src/components/ui/sidebar/SidebarHeader.vue +18 -0
  462. package/template/apps/web/src/components/ui/sidebar/SidebarInput.vue +19 -0
  463. package/template/apps/web/src/components/ui/sidebar/SidebarInset.vue +22 -0
  464. package/template/apps/web/src/components/ui/sidebar/SidebarMenu.vue +18 -0
  465. package/template/apps/web/src/components/ui/sidebar/SidebarMenuAction.vue +37 -0
  466. package/template/apps/web/src/components/ui/sidebar/SidebarMenuBadge.vue +23 -0
  467. package/template/apps/web/src/components/ui/sidebar/SidebarMenuButton.vue +60 -0
  468. package/template/apps/web/src/components/ui/sidebar/SidebarMenuButtonChild.vue +36 -0
  469. package/template/apps/web/src/components/ui/sidebar/SidebarMenuItem.vue +18 -0
  470. package/template/apps/web/src/components/ui/sidebar/SidebarMenuSkeleton.vue +35 -0
  471. package/template/apps/web/src/components/ui/sidebar/SidebarMenuSub.vue +23 -0
  472. package/template/apps/web/src/components/ui/sidebar/SidebarMenuSubButton.vue +39 -0
  473. package/template/apps/web/src/components/ui/sidebar/SidebarMenuSubItem.vue +18 -0
  474. package/template/apps/web/src/components/ui/sidebar/SidebarProvider.vue +128 -0
  475. package/template/apps/web/src/components/ui/sidebar/SidebarRail.vue +94 -0
  476. package/template/apps/web/src/components/ui/sidebar/SidebarSeparator.vue +19 -0
  477. package/template/apps/web/src/components/ui/sidebar/SidebarTrigger.vue +28 -0
  478. package/template/apps/web/src/components/ui/sidebar/index.ts +62 -0
  479. package/template/apps/web/src/components/ui/sidebar/sidebar-width.ts +29 -0
  480. package/template/apps/web/src/components/ui/sidebar/sidebar-width.webtest.ts +28 -0
  481. package/template/apps/web/src/components/ui/sidebar/utils.ts +26 -0
  482. package/template/apps/web/src/components/ui/skeleton/Skeleton.vue +17 -0
  483. package/template/apps/web/src/components/ui/skeleton/index.ts +1 -0
  484. package/template/apps/web/src/components/ui/sonner/Sonner.vue +70 -0
  485. package/template/apps/web/src/components/ui/sonner/index.ts +1 -0
  486. package/template/apps/web/src/components/ui/switch/Switch.vue +47 -0
  487. package/template/apps/web/src/components/ui/switch/Switch.webtest.ts +23 -0
  488. package/template/apps/web/src/components/ui/switch/index.ts +1 -0
  489. package/template/apps/web/src/components/ui/table/Table.vue +19 -0
  490. package/template/apps/web/src/components/ui/table/TableBody.vue +17 -0
  491. package/template/apps/web/src/components/ui/table/TableCaption.vue +17 -0
  492. package/template/apps/web/src/components/ui/table/TableCell.vue +22 -0
  493. package/template/apps/web/src/components/ui/table/TableEmpty.vue +37 -0
  494. package/template/apps/web/src/components/ui/table/TableFooter.vue +19 -0
  495. package/template/apps/web/src/components/ui/table/TableHead.vue +22 -0
  496. package/template/apps/web/src/components/ui/table/TableHeader.vue +14 -0
  497. package/template/apps/web/src/components/ui/table/TableRow.vue +22 -0
  498. package/template/apps/web/src/components/ui/table/index.ts +9 -0
  499. package/template/apps/web/src/components/ui/table/utils.ts +10 -0
  500. package/template/apps/web/src/components/ui/tabs/Tabs.vue +27 -0
  501. package/template/apps/web/src/components/ui/tabs/TabsContent.vue +23 -0
  502. package/template/apps/web/src/components/ui/tabs/TabsList.vue +34 -0
  503. package/template/apps/web/src/components/ui/tabs/TabsTrigger.vue +33 -0
  504. package/template/apps/web/src/components/ui/tabs/index.ts +24 -0
  505. package/template/apps/web/src/components/ui/tooltip/Tooltip.vue +15 -0
  506. package/template/apps/web/src/components/ui/tooltip/TooltipContent.vue +49 -0
  507. package/template/apps/web/src/components/ui/tooltip/TooltipProvider.vue +14 -0
  508. package/template/apps/web/src/components/ui/tooltip/TooltipTrigger.vue +12 -0
  509. package/template/apps/web/src/components/ui/tooltip/index.ts +4 -0
  510. package/template/apps/web/src/composables/useAccessSnapshot.ts +55 -0
  511. package/template/apps/web/src/composables/useAccessSnapshot.webtest.ts +39 -0
  512. package/template/apps/web/src/composables/useAppToast.ts +30 -0
  513. package/template/apps/web/src/composables/useAuthSession.ts +127 -0
  514. package/template/apps/web/src/composables/useAuthSession.webtest.ts +48 -0
  515. package/template/apps/web/src/composables/useLicenseReminderRefresh.ts +27 -0
  516. package/template/apps/web/src/composables/useLicenseReminderRefresh.webtest.ts +30 -0
  517. package/template/apps/web/src/composables/useLicenseRuntime.ts +90 -0
  518. package/template/apps/web/src/composables/useLoginFlow.ts +39 -0
  519. package/template/apps/web/src/composables/useModuleConfigurations.ts +116 -0
  520. package/template/apps/web/src/composables/usePasswordChange.ts +31 -0
  521. package/template/apps/web/src/composables/usePlatformSettings.ts +90 -0
  522. package/template/apps/web/src/composables/useSessionContext.ts +56 -0
  523. package/template/apps/web/src/composables/useTheme.ts +123 -0
  524. package/template/apps/web/src/composables/useUnsavedChangesConfirmation.ts +55 -0
  525. package/template/apps/web/src/composables/useWatermarkSettings.ts +56 -0
  526. package/template/apps/web/src/composables/watermark-settings.ts +45 -0
  527. package/template/apps/web/src/composables/watermark-settings.webtest.ts +38 -0
  528. package/template/apps/web/src/env.d.ts +17 -0
  529. package/template/apps/web/src/layout/AppHeader.vue +107 -0
  530. package/template/apps/web/src/layout/AppShell.vue +55 -0
  531. package/template/apps/web/src/layout/AppShell.webtest.ts +75 -0
  532. package/template/apps/web/src/layout/AppSidebar.vue +262 -0
  533. package/template/apps/web/src/layout/AppSidebar.webtest.ts +167 -0
  534. package/template/apps/web/src/layout/GlobalWatermark.vue +38 -0
  535. package/template/apps/web/src/layout/NavigationSearchDialog.vue +166 -0
  536. package/template/apps/web/src/layout/NavigationSearchDialog.webtest.ts +84 -0
  537. package/template/apps/web/src/layout/NotificationMenu.vue +174 -0
  538. package/template/apps/web/src/layout/NotificationMenu.webtest.ts +102 -0
  539. package/template/apps/web/src/layout/ThemeToggle.vue +44 -0
  540. package/template/apps/web/src/layout/navigation.ts +103 -0
  541. package/template/apps/web/src/layout/navigation.webtest.ts +99 -0
  542. package/template/apps/web/src/lib/date-time.ts +21 -0
  543. package/template/apps/web/src/lib/date-time.webtest.ts +14 -0
  544. package/template/apps/web/src/lib/utils.ts +7 -0
  545. package/template/apps/web/src/main.ts +11 -0
  546. package/template/apps/web/src/pages/AccessDeniedPage.vue +61 -0
  547. package/template/apps/web/src/pages/auth/ChangePasswordPage.vue +46 -0
  548. package/template/apps/web/src/pages/auth/LoginPage.vue +63 -0
  549. package/template/apps/web/src/pages/configuration/ModuleConfigurationPage.vue +15 -0
  550. package/template/apps/web/src/pages/configuration/components/ModuleConfigRollbackDialog.vue +51 -0
  551. package/template/apps/web/src/pages/configuration/components/ModuleConfigVersionList.vue +116 -0
  552. package/template/apps/web/src/pages/configuration/components/ModuleConfigurationEditor.vue +126 -0
  553. package/template/apps/web/src/pages/configuration/components/ModuleConfigurationEditor.webtest.ts +73 -0
  554. package/template/apps/web/src/pages/configuration/components/ModuleConfigurationWorkbench.vue +236 -0
  555. package/template/apps/web/src/pages/dashboard/DashboardPage.vue +39 -0
  556. package/template/apps/web/src/pages/dashboard/DashboardPage.webtest.ts +37 -0
  557. package/template/apps/web/src/pages/dashboard/components/DashboardAttention.vue +36 -0
  558. package/template/apps/web/src/pages/dashboard/components/DashboardMetricCards.vue +28 -0
  559. package/template/apps/web/src/pages/dashboard/dashboard-presenter.ts +115 -0
  560. package/template/apps/web/src/pages/dashboard/dashboard-presenter.webtest.ts +92 -0
  561. package/template/apps/web/src/pages/license/LicensePage.vue +65 -0
  562. package/template/apps/web/src/pages/profile/PersonalSettingsPage.vue +177 -0
  563. package/template/apps/web/src/pages/profile/PersonalSettingsPage.webtest.ts +78 -0
  564. package/template/apps/web/src/pages/settings/BrandingSettingsSection.vue +198 -0
  565. package/template/apps/web/src/pages/settings/GlobalSettingsPage.vue +195 -0
  566. package/template/apps/web/src/pages/settings/GlobalSettingsPage.webtest.ts +314 -0
  567. package/template/apps/web/src/pages/settings/WatermarkSettingsSection.vue +115 -0
  568. package/template/apps/web/src/pages/settings/logo-file.ts +23 -0
  569. package/template/apps/web/src/pages/settings/logo-file.webtest.ts +14 -0
  570. package/template/apps/web/src/pages/system/SystemNotificationsPage.vue +262 -0
  571. package/template/apps/web/src/pages/system/SystemNotificationsPage.webtest.ts +88 -0
  572. package/template/apps/web/src/pages/system/SystemOperationsPage.vue +151 -0
  573. package/template/apps/web/src/pages/system/SystemOperationsPage.webtest.ts +146 -0
  574. package/template/apps/web/src/pages/system/SystemResourceRoutePage.vue +80 -0
  575. package/template/apps/web/src/pages/system/SystemResourceRoutePage.webtest.ts +100 -0
  576. package/template/apps/web/src/pages/system/components/AuditActionCell.vue +87 -0
  577. package/template/apps/web/src/pages/system/components/AuditActionCell.webtest.ts +66 -0
  578. package/template/apps/web/src/pages/system/components/AuditLogFilters.vue +119 -0
  579. package/template/apps/web/src/pages/system/components/AuditLogFilters.webtest.ts +59 -0
  580. package/template/apps/web/src/pages/system/components/DiskUsageChart.vue +62 -0
  581. package/template/apps/web/src/pages/system/components/FeatureLicensePolicyDialog.vue +136 -0
  582. package/template/apps/web/src/pages/system/components/FeatureLicensePolicyDialog.webtest.ts +67 -0
  583. package/template/apps/web/src/pages/system/components/NotificationPublishForm.vue +57 -0
  584. package/template/apps/web/src/pages/system/components/OperationCacheMonitor.vue +73 -0
  585. package/template/apps/web/src/pages/system/components/OperationOnlineUsers.vue +60 -0
  586. package/template/apps/web/src/pages/system/components/OperationOnlineUsers.webtest.ts +35 -0
  587. package/template/apps/web/src/pages/system/components/OperationServiceMonitor.vue +118 -0
  588. package/template/apps/web/src/pages/system/components/OperationServiceMonitor.webtest.ts +64 -0
  589. package/template/apps/web/src/pages/system/components/SchedulerOperationsPanel.vue +297 -0
  590. package/template/apps/web/src/pages/system/components/SchedulerOperationsPanel.webtest.ts +145 -0
  591. package/template/apps/web/src/pages/system/components/SchedulerRunTable.vue +127 -0
  592. package/template/apps/web/src/pages/system/components/SchedulerRunTable.webtest.ts +75 -0
  593. package/template/apps/web/src/pages/system/components/SchedulerStaleRecoveryForm.vue +125 -0
  594. package/template/apps/web/src/pages/system/components/SchedulerStaleRecoveryForm.webtest.ts +84 -0
  595. package/template/apps/web/src/pages/system/components/SystemResourceFilters.vue +64 -0
  596. package/template/apps/web/src/pages/system/components/SystemResourceForm.vue +102 -0
  597. package/template/apps/web/src/pages/system/components/SystemResourcePage.vue +360 -0
  598. package/template/apps/web/src/pages/system/components/SystemResourcePage.webtest.ts +263 -0
  599. package/template/apps/web/src/pages/system/components/SystemResourceTable.vue +242 -0
  600. package/template/apps/web/src/pages/system/components/SystemResourceTable.webtest.ts +196 -0
  601. package/template/apps/web/src/pages/system/components/dictionary-bulk/DictionaryBulkActions.vue +142 -0
  602. package/template/apps/web/src/pages/system/components/dictionary-bulk/DictionaryBulkJobDetail.vue +109 -0
  603. package/template/apps/web/src/pages/system/components/dictionary-bulk/DictionaryBulkJobList.vue +127 -0
  604. package/template/apps/web/src/pages/system/components/dictionary-bulk/DictionaryBulkPanel.vue +72 -0
  605. package/template/apps/web/src/pages/system/components/dictionary-bulk/DictionaryBulkPanel.webtest.ts +255 -0
  606. package/template/apps/web/src/pages/system/components/feature-license-policy.ts +12 -0
  607. package/template/apps/web/src/pages/system/components/menu-management/MenuManagementPage.vue +131 -0
  608. package/template/apps/web/src/pages/system/components/menu-management/MenuManagementPage.webtest.ts +228 -0
  609. package/template/apps/web/src/pages/system/components/menu-management/MenuStructureTable.vue +230 -0
  610. package/template/apps/web/src/pages/system/components/menu-management/menu-model.ts +161 -0
  611. package/template/apps/web/src/pages/system/components/menu-management/menu-model.webtest.ts +133 -0
  612. package/template/apps/web/src/pages/system/components/menu-management/useMenuManagement.ts +117 -0
  613. package/template/apps/web/src/pages/system/components/role-policy/RolePermissionTree.vue +144 -0
  614. package/template/apps/web/src/pages/system/components/role-policy/RolePermissionTree.webtest.ts +55 -0
  615. package/template/apps/web/src/pages/system/components/role-policy/RolePolicyForm.vue +134 -0
  616. package/template/apps/web/src/pages/system/components/role-policy/permission-tree.ts +58 -0
  617. package/template/apps/web/src/pages/system/components/role-policy/permission-tree.webtest.ts +80 -0
  618. package/template/apps/web/src/pages/system/components/user-account/UserAccountForm.vue +307 -0
  619. package/template/apps/web/src/pages/system/components/user-account/UserRoleSelector.vue +111 -0
  620. package/template/apps/web/src/pages/system/components/user-account/UserRoleSelector.webtest.ts +45 -0
  621. package/template/apps/web/src/pages/system/components/user-account/save-user-account.ts +47 -0
  622. package/template/apps/web/src/pages/system/composables/useDictionaryBulkJobs.ts +152 -0
  623. package/template/apps/web/src/pages/system/composables/useFeatureLicenseEditor.ts +38 -0
  624. package/template/apps/web/src/pages/system/composables/useSchedulerOperations.ts +141 -0
  625. package/template/apps/web/src/pages/system/composables/useSchedulerOperations.webtest.ts +224 -0
  626. package/template/apps/web/src/pages/system/composables/useSystemResource.ts +269 -0
  627. package/template/apps/web/src/pages/system/composables/useSystemResource.webtest.ts +51 -0
  628. package/template/apps/web/src/pages/system/dictionary-bulk-presenter.ts +126 -0
  629. package/template/apps/web/src/pages/system/resource-config.ts +233 -0
  630. package/template/apps/web/src/router/auth-navigation.ts +76 -0
  631. package/template/apps/web/src/router/index.ts +246 -0
  632. package/template/apps/web/src/router/index.webtest.ts +396 -0
  633. package/template/apps/web/src/router/manifest-routes.ts +59 -0
  634. package/template/apps/web/src/services/access-api.ts +26 -0
  635. package/template/apps/web/src/services/auth-api.ts +72 -0
  636. package/template/apps/web/src/services/bulk-data-api.ts +105 -0
  637. package/template/apps/web/src/services/configuration-api.ts +43 -0
  638. package/template/apps/web/src/services/http.ts +145 -0
  639. package/template/apps/web/src/services/http.webtest.ts +73 -0
  640. package/template/apps/web/src/services/license-api.ts +53 -0
  641. package/template/apps/web/src/services/notification-api.ts +51 -0
  642. package/template/apps/web/src/services/operations-api.ts +128 -0
  643. package/template/apps/web/src/services/platform-settings-api.ts +21 -0
  644. package/template/apps/web/src/services/profile-api.ts +17 -0
  645. package/template/apps/web/src/services/session-context-api.ts +20 -0
  646. package/template/apps/web/src/services/system-api.ts +156 -0
  647. package/template/apps/web/src/style.css +142 -0
  648. package/template/apps/web/src/style.webtest.ts +18 -0
  649. package/template/apps/web/tsconfig.json +23 -0
  650. package/template/apps/web/vite.config.ts +26 -0
  651. package/template/apps/web/vitest.config.ts +14 -0
  652. package/template/bunfig.toml +2 -0
  653. package/template/docker-compose.yml +74 -0
  654. package/template/docs/adapters/ruoyi-vue-compatibility.md +93 -0
  655. package/template/docs/architecture/admin-surface-boundary.md +24 -0
  656. package/template/docs/architecture/data-scope-query-enforcement.md +26 -0
  657. package/template/docs/architecture/durable-jobs.md +101 -0
  658. package/template/docs/architecture/minimal-approval-workflow.md +60 -0
  659. package/template/docs/architecture/module-manifest-composition.md +47 -0
  660. package/template/docs/architecture/object-storage.md +65 -0
  661. package/template/docs/architecture/search-provider-protocol.md +59 -0
  662. package/template/docs/development/crud-generator.md +57 -0
  663. package/template/docs/license/license-offline-activation-code.md +67 -0
  664. package/template/docs/operations/observability.md +50 -0
  665. package/template/docs/platform/agent-tools.md +37 -0
  666. package/template/docs/platform/audit-reliability.md +95 -0
  667. package/template/docs/platform/bulk-data-jobs.md +156 -0
  668. package/template/docs/platform/data-access-control.md +62 -0
  669. package/template/docs/platform/module-configuration.md +98 -0
  670. package/template/docs/platform/navigation-registry.md +36 -0
  671. package/template/docs/platform/notifications.md +33 -0
  672. package/template/docs/platform/operations-overview.md +35 -0
  673. package/template/docs/platform/organization-membership.md +31 -0
  674. package/template/docs/platform/platform-authentication.md +127 -0
  675. package/template/docs/platform/platform-shell-settings.md +88 -0
  676. package/template/docs/platform/scheduled-task-executor.md +89 -0
  677. package/template/docs/platform/system-crud-api.md +100 -0
  678. package/template/docs/platform/web-system-crud.md +96 -0
  679. package/template/docs/product/built-in-roles.md +26 -0
  680. package/template/drizzle.config.ts +16 -0
  681. package/template/examples/inventory-item.crud.json +55 -0
  682. package/template/package.json +55 -0
  683. package/template/packages/config/index.test.ts +114 -0
  684. package/template/packages/config/index.ts +4 -0
  685. package/template/packages/config/package.json +13 -0
  686. package/template/packages/config/src/definition.ts +109 -0
  687. package/template/packages/config/src/environment-loader.ts +240 -0
  688. package/template/packages/config/src/platform.ts +185 -0
  689. package/template/packages/config/src/secrets.ts +69 -0
  690. package/template/packages/crud-generator/index.ts +3 -0
  691. package/template/packages/crud-generator/package.json +12 -0
  692. package/template/packages/crud-generator/src/cli.ts +31 -0
  693. package/template/packages/crud-generator/src/definition.ts +48 -0
  694. package/template/packages/crud-generator/src/generator.test.ts +180 -0
  695. package/template/packages/crud-generator/src/generator.ts +99 -0
  696. package/template/packages/crud-generator/src/template-helpers.ts +72 -0
  697. package/template/packages/crud-generator/src/templates/domain.ts +27 -0
  698. package/template/packages/crud-generator/src/templates/drizzle-repository.ts +126 -0
  699. package/template/packages/crud-generator/src/templates/dto.ts +19 -0
  700. package/template/packages/crud-generator/src/templates/index.ts +8 -0
  701. package/template/packages/crud-generator/src/templates/manifest.ts +69 -0
  702. package/template/packages/crud-generator/src/templates/project.ts +161 -0
  703. package/template/packages/crud-generator/src/templates/repository.ts +23 -0
  704. package/template/packages/crud-generator/src/templates/routes.ts +158 -0
  705. package/template/packages/crud-generator/src/templates/schema.ts +45 -0
  706. package/template/packages/crud-generator/src/templates/service.ts +32 -0
  707. package/template/packages/crud-generator/src/validation.ts +205 -0
  708. package/template/packages/crud-generator/tsconfig.json +15 -0
  709. package/template/packages/database/drizzle/0000_organic_madame_web.sql +136 -0
  710. package/template/packages/database/drizzle/0001_flawless_senator_kelly.sql +80 -0
  711. package/template/packages/database/drizzle/0002_woozy_squadron_supreme.sql +53 -0
  712. package/template/packages/database/drizzle/0003_far_carnage.sql +17 -0
  713. package/template/packages/database/drizzle/0004_flat_bastion.sql +2 -0
  714. package/template/packages/database/drizzle/0005_fixed_enchantress.sql +6 -0
  715. package/template/packages/database/drizzle/0006_groovy_overlord.sql +146 -0
  716. package/template/packages/database/drizzle/0007_chubby_may_parker.sql +9 -0
  717. package/template/packages/database/drizzle/0008_secret_toxin.sql +21 -0
  718. package/template/packages/database/drizzle/0009_ambiguous_adam_warlock.sql +46 -0
  719. package/template/packages/database/drizzle/0010_complex_orphan.sql +42 -0
  720. package/template/packages/database/drizzle/0011_lowly_maria_hill.sql +42 -0
  721. package/template/packages/database/drizzle/0012_serious_marvex.sql +11 -0
  722. package/template/packages/database/drizzle/0013_mysterious_miek.sql +48 -0
  723. package/template/packages/database/drizzle/0014_graceful_husk.sql +1 -0
  724. package/template/packages/database/drizzle/0015_illegal_jazinda.sql +29 -0
  725. package/template/packages/database/drizzle/0016_seed_platform_roles.sql +21 -0
  726. package/template/packages/database/drizzle/0017_silly_thunderbolt.sql +35 -0
  727. package/template/packages/database/drizzle/0018_cheerful_alex_power.sql +22 -0
  728. package/template/packages/database/drizzle/0019_omniscient_luckman.sql +3 -0
  729. package/template/packages/database/drizzle/0020_handy_vertigo.sql +18 -0
  730. package/template/packages/database/drizzle/0021_plain_paladin.sql +51 -0
  731. package/template/packages/database/drizzle/0022_icy_rhodey.sql +2 -0
  732. package/template/packages/database/drizzle/0023_fresh_thunderbolt_ross.sql +138 -0
  733. package/template/packages/database/drizzle/0024_misty_lizard.sql +13 -0
  734. package/template/packages/database/drizzle/0025_premium_songbird.sql +6 -0
  735. package/template/packages/database/drizzle/0026_aberrant_doctor_octopus.sql +42 -0
  736. package/template/packages/database/drizzle/0027_tiny_diamondback.sql +5 -0
  737. package/template/packages/database/drizzle/0028_condemned_ulik.sql +27 -0
  738. package/template/packages/database/drizzle/0029_clean_nightshade.sql +5 -0
  739. package/template/packages/database/drizzle/0030_governed_export_constraints.sql +84 -0
  740. package/template/packages/database/drizzle/meta/0000_snapshot.json +973 -0
  741. package/template/packages/database/drizzle/meta/0001_snapshot.json +1559 -0
  742. package/template/packages/database/drizzle/meta/0002_snapshot.json +1911 -0
  743. package/template/packages/database/drizzle/meta/0003_snapshot.json +2047 -0
  744. package/template/packages/database/drizzle/meta/0004_snapshot.json +2059 -0
  745. package/template/packages/database/drizzle/meta/0005_snapshot.json +2084 -0
  746. package/template/packages/database/drizzle/meta/0006_snapshot.json +3192 -0
  747. package/template/packages/database/drizzle/meta/0007_snapshot.json +3208 -0
  748. package/template/packages/database/drizzle/meta/0008_snapshot.json +3367 -0
  749. package/template/packages/database/drizzle/meta/0009_snapshot.json +3629 -0
  750. package/template/packages/database/drizzle/meta/0010_snapshot.json +3955 -0
  751. package/template/packages/database/drizzle/meta/0011_snapshot.json +4299 -0
  752. package/template/packages/database/drizzle/meta/0012_snapshot.json +4368 -0
  753. package/template/packages/database/drizzle/meta/0013_snapshot.json +4483 -0
  754. package/template/packages/database/drizzle/meta/0014_snapshot.json +4489 -0
  755. package/template/packages/database/drizzle/meta/0015_snapshot.json +4771 -0
  756. package/template/packages/database/drizzle/meta/0016_snapshot.json +4694 -0
  757. package/template/packages/database/drizzle/meta/0017_snapshot.json +4731 -0
  758. package/template/packages/database/drizzle/meta/0018_snapshot.json +4978 -0
  759. package/template/packages/database/drizzle/meta/0019_snapshot.json +4996 -0
  760. package/template/packages/database/drizzle/meta/0020_snapshot.json +5140 -0
  761. package/template/packages/database/drizzle/meta/0021_snapshot.json +5535 -0
  762. package/template/packages/database/drizzle/meta/0022_snapshot.json +5541 -0
  763. package/template/packages/database/drizzle/meta/0023_snapshot.json +6667 -0
  764. package/template/packages/database/drizzle/meta/0024_snapshot.json +6780 -0
  765. package/template/packages/database/drizzle/meta/0025_snapshot.json +6849 -0
  766. package/template/packages/database/drizzle/meta/0026_snapshot.json +7185 -0
  767. package/template/packages/database/drizzle/meta/0027_snapshot.json +7225 -0
  768. package/template/packages/database/drizzle/meta/0028_snapshot.json +7454 -0
  769. package/template/packages/database/drizzle/meta/0029_snapshot.json +7460 -0
  770. package/template/packages/database/drizzle/meta/0030_snapshot.json +7473 -0
  771. package/template/packages/database/drizzle/meta/_journal.json +223 -0
  772. package/template/packages/database/index.ts +5 -0
  773. package/template/packages/database/package.json +17 -0
  774. package/template/packages/database/src/dialects.test.ts +33 -0
  775. package/template/packages/database/src/dialects.ts +139 -0
  776. package/template/packages/database/src/runner.test.ts +96 -0
  777. package/template/packages/database/src/runner.ts +175 -0
  778. package/template/packages/database/src/schema/bulk-data.ts +87 -0
  779. package/template/packages/database/src/schema/common.ts +33 -0
  780. package/template/packages/database/src/schema/durable-jobs.ts +266 -0
  781. package/template/packages/database/src/schema/file-storage.ts +94 -0
  782. package/template/packages/database/src/schema/governance.ts +195 -0
  783. package/template/packages/database/src/schema/governed-exports.ts +90 -0
  784. package/template/packages/database/src/schema/identity.ts +169 -0
  785. package/template/packages/database/src/schema/index.ts +33 -0
  786. package/template/packages/database/src/schema/license-legacy.ts +93 -0
  787. package/template/packages/database/src/schema/license-v1.ts +246 -0
  788. package/template/packages/database/src/schema/migration-history.ts +30 -0
  789. package/template/packages/database/src/schema/notifications.ts +60 -0
  790. package/template/packages/database/src/schema/platform-settings.ts +55 -0
  791. package/template/packages/database/src/schema/scheduler.ts +89 -0
  792. package/template/packages/database/src/schema/work-orders.ts +23 -0
  793. package/template/packages/database/src/schema/workflow.ts +86 -0
  794. package/template/packages/database/src/schema-durable-links.test.ts +27 -0
  795. package/template/packages/database/src/schema-governed-exports.test.ts +49 -0
  796. package/template/packages/database/src/schema-workflow-notification.test.ts +63 -0
  797. package/template/packages/database/src/schema.test.ts +343 -0
  798. package/template/packages/database/src/sql-store.test.ts +92 -0
  799. package/template/packages/database/src/sql-store.ts +101 -0
  800. package/template/packages/database/src/store.ts +32 -0
  801. package/template/packages/database/tsconfig.json +17 -0
  802. package/template/packages/example-work-order/index.ts +3 -0
  803. package/template/packages/example-work-order/package.json +13 -0
  804. package/template/packages/example-work-order/src/contract.ts +50 -0
  805. package/template/packages/example-work-order/src/manifest.test.ts +54 -0
  806. package/template/packages/example-work-order/src/manifest.ts +120 -0
  807. package/template/packages/example-work-order/src/schema.ts +27 -0
  808. package/template/packages/license-sdk/index.ts +13 -0
  809. package/template/packages/license-sdk/package.json +18 -0
  810. package/template/packages/license-sdk/src/bounded-json-body.test.ts +65 -0
  811. package/template/packages/license-sdk/src/bounded-json-body.ts +135 -0
  812. package/template/packages/license-sdk/src/canonical-json.test.ts +28 -0
  813. package/template/packages/license-sdk/src/canonical-json.ts +104 -0
  814. package/template/packages/license-sdk/src/client.test.ts +82 -0
  815. package/template/packages/license-sdk/src/client.ts +86 -0
  816. package/template/packages/license-sdk/src/device.ts +46 -0
  817. package/template/packages/license-sdk/src/file-storage.test.ts +80 -0
  818. package/template/packages/license-sdk/src/file-storage.ts +77 -0
  819. package/template/packages/license-sdk/src/installation.test.ts +241 -0
  820. package/template/packages/license-sdk/src/installation.ts +150 -0
  821. package/template/packages/license-sdk/src/license-parser.ts +56 -0
  822. package/template/packages/license-sdk/src/offline-code-base32.ts +57 -0
  823. package/template/packages/license-sdk/src/offline-code-decompression.ts +55 -0
  824. package/template/packages/license-sdk/src/offline-code-limits.ts +10 -0
  825. package/template/packages/license-sdk/src/offline-code-wire.ts +72 -0
  826. package/template/packages/license-sdk/src/offline-code.test.ts +172 -0
  827. package/template/packages/license-sdk/src/offline-code.ts +319 -0
  828. package/template/packages/license-sdk/src/payload.test.ts +72 -0
  829. package/template/packages/license-sdk/src/payload.ts +201 -0
  830. package/template/packages/license-sdk/src/storage.ts +64 -0
  831. package/template/packages/license-sdk/src/test-fixtures.ts +59 -0
  832. package/template/packages/license-sdk/src/v1-test-vector.ts +49 -0
  833. package/template/packages/license-sdk/src/validation.test.ts +62 -0
  834. package/template/packages/license-sdk/src/validation.ts +143 -0
  835. package/template/packages/license-sdk/src/verification.test.ts +97 -0
  836. package/template/packages/license-sdk/src/verification.ts +199 -0
  837. package/template/packages/license-sdk/tsconfig.json +17 -0
  838. package/template/packages/modules/index.ts +8 -0
  839. package/template/packages/modules/package.json +13 -0
  840. package/template/packages/modules/src/composition.test.ts +267 -0
  841. package/template/packages/modules/src/composition.ts +342 -0
  842. package/template/packages/modules/src/installed-business-modules.ts +10 -0
  843. package/template/packages/modules/src/manifest.ts +97 -0
  844. package/template/packages/modules/src/menu-composition.test.ts +64 -0
  845. package/template/packages/modules/src/menu-composition.ts +54 -0
  846. package/template/packages/modules/src/registry.ts +53 -0
  847. package/template/packages/modules/src/system-admin-routes.ts +134 -0
  848. package/template/packages/modules/src/system-agent-tools.ts +28 -0
  849. package/template/packages/modules/src/system-api-binding.ts +37 -0
  850. package/template/packages/modules/src/system-api-data-governance.ts +21 -0
  851. package/template/packages/modules/src/system-api-permissions.ts +344 -0
  852. package/template/packages/modules/src/system-audit-actions.ts +70 -0
  853. package/template/packages/modules/src/system-data-governance.ts +30 -0
  854. package/template/packages/modules/src/system-features.ts +143 -0
  855. package/template/packages/modules/src/system-governed-export-bindings.ts +31 -0
  856. package/template/packages/modules/src/system-module-catalog.test.ts +145 -0
  857. package/template/packages/modules/src/system-module-catalog.ts +250 -0
  858. package/template/packages/modules/src/system-modules.test.ts +344 -0
  859. package/template/packages/modules/src/system-modules.ts +335 -0
  860. package/template/packages/modules/src/system-permissions.ts +142 -0
  861. package/template/packages/modules/user/module.ts +72 -0
  862. package/template/packages/shared/index.ts +16 -0
  863. package/template/packages/shared/package.json +9 -0
  864. package/template/packages/shared/src/audit.test.ts +17 -0
  865. package/template/packages/shared/src/audit.ts +237 -0
  866. package/template/packages/shared/src/correlation.test.ts +10 -0
  867. package/template/packages/shared/src/correlation.ts +11 -0
  868. package/template/packages/shared/src/data-governance.test.ts +44 -0
  869. package/template/packages/shared/src/data-governance.ts +89 -0
  870. package/template/packages/shared/src/database.ts +67 -0
  871. package/template/packages/shared/src/feature.test.ts +54 -0
  872. package/template/packages/shared/src/feature.ts +104 -0
  873. package/template/packages/shared/src/license-legacy.ts +153 -0
  874. package/template/packages/shared/src/license.test.ts +63 -0
  875. package/template/packages/shared/src/license.ts +267 -0
  876. package/template/packages/shared/src/module-configuration.ts +50 -0
  877. package/template/packages/shared/src/notification.ts +46 -0
  878. package/template/packages/shared/src/platform-settings.ts +5 -0
  879. package/template/packages/shared/src/primitives.ts +47 -0
  880. package/template/packages/shared/src/profile.ts +13 -0
  881. package/template/packages/shared/src/rbac.ts +117 -0
  882. package/template/packages/shared/src/ruoyi.ts +98 -0
  883. package/template/packages/shared/src/scheduler.ts +108 -0
  884. package/template/packages/shared/src/search-provider.ts +24 -0
  885. package/template/packages/shared/src/workflow.test.ts +225 -0
  886. package/template/packages/shared/src/workflow.ts +307 -0
  887. package/template/packages/storage/index.ts +11 -0
  888. package/template/packages/storage/package.json +12 -0
  889. package/template/packages/storage/src/blob-store.ts +64 -0
  890. package/template/packages/storage/src/content-hash.ts +24 -0
  891. package/template/packages/storage/src/file-service.test.ts +100 -0
  892. package/template/packages/storage/src/file-service.ts +59 -0
  893. package/template/packages/storage/src/in-memory-upload-repository.ts +154 -0
  894. package/template/packages/storage/src/local-file-blob-store.test.ts +175 -0
  895. package/template/packages/storage/src/local-file-blob-store.ts +344 -0
  896. package/template/packages/storage/src/local-file-maintenance.ts +133 -0
  897. package/template/packages/storage/src/memory-blob-store.test.ts +16 -0
  898. package/template/packages/storage/src/memory-blob-store.ts +100 -0
  899. package/template/packages/storage/src/upload-repository.ts +43 -0
  900. package/template/packages/storage/src/upload-service.test.ts +246 -0
  901. package/template/packages/storage/src/upload-service.ts +334 -0
  902. package/template/packages/storage/src/upload-streams.ts +123 -0
  903. package/template/packages/storage/src/upload-types.ts +110 -0
  904. package/template/packages/storage/tsconfig.json +16 -0
@@ -0,0 +1,47 @@
1
+ # Module Manifest 组合契约
2
+
3
+ 更新时间:2026-07-16。
4
+
5
+ ## 目标与边界
6
+
7
+ Module Manifest 是模块公开能力的唯一声明 Interface;Server、Web 等宿主只提供具体 Implementation,并在 Composition Root 通过同一个 `validateModuleComposition` Seam 完成 fail-fast 校验。本批不实现业务搜索,只提供通用 Provider 注册位。
8
+
9
+ Manifest 当前覆盖:
10
+
11
+ - Feature、Permission、API Route、Admin Route 与菜单 Surface;
12
+ - Migration 与 Schema Export 证据;
13
+ - Scheduled Task、Agent Tool、Provider 与 Audit Action;
14
+ - 模块依赖及版本元数据。
15
+
16
+ ## 不变量
17
+
18
+ 组合校验在运行时业务逻辑前执行,并拒绝:
19
+
20
+ 1. 缺失依赖、依赖循环及同类能力重复 Key;
21
+ 2. Menu、Admin Route、API、Task、Tool、Provider 对未知 Permission 或 Feature 的引用;
22
+ 3. Tool 对未知 Audit Action 的引用;
23
+ 4. Menu 与 Admin Route 路径或 Guard 漂移;
24
+ 5. 已声明 Route、Task、Tool、Provider 缺少宿主 Handler,或宿主注册未声明 Handler;
25
+ 6. Schema Export 没有对应 Migration ID 证据,或可执行 Migration 归属错误。
26
+
27
+ 同一个稳定能力基础 Key 仍可分别出现在 Feature、Permission 前缀、菜单和页面入口中;“重复”按能力类别判断,避免破坏项目既定 Key 语义。
28
+
29
+ ## 模块与 Adapter
30
+
31
+ - `@windy/modules` 是深 Module:拥有声明类型、依赖排序、引用规则和组合验证,不依赖 Elysia 或 Vue。
32
+ - `systemModuleFactories` 是 15 个平台模块的运行时目录;`systemFoundationModule()` 仅保留为兼容聚合视图,不再作为 Composition Root 中唯一的巨型平台模块。
33
+ - 多个模块可以向同一菜单目录贡献入口;`composeModuleMenus()` 合并一致的目录壳,并在标题、类型、顺序或 Guard 漂移时 fail fast。
34
+ - Server Adapter 提供 API Route、Task、Tool、Provider Handler Key;启动监听前验证。
35
+ - Web Adapter 提供实际 Admin Route Key;构建测试验证页面、Guard 与 Manifest 一致。
36
+ - 普通业务 Module 可以只声明 API、Task 等 Server 能力;`menus` 与 `adminRoutes` 为空时,Windy Web 不导入业务 package 或 Vue 页面。
37
+ - Drizzle schema 的具体表定义仍在 `@windy/database`,Manifest 只公开模块 Schema Export 和历史 migration 证据,不复制数据库实现。
38
+
39
+ 这种边界允许宿主替换实现,同时保持 Manifest 的能力语义稳定。
40
+
41
+ ## 分批落地
42
+
43
+ - 第一批:类型、声明级验证和失败回归。
44
+ - 第二批(已完成):Server 直接读取 Elysia 实际路由表、Scheduler definitions 和 Agent Tool Handler Registry,在 `listen` 与 Worker 启动前执行 fail-fast。无数据库开发模式下不会注册的密码管理与个人资料路由,由其实际注册函数导出 Implementation 描述,避免把条件装配误判成缺少代码实现。
45
+ - 第三批(已完成):Web 只注册页面组件、name 和 props,path、标题、Permission 与 Feature 由 Manifest Admin Route Adapter 生成;模块加载时校验所有 Admin Route 都有实现。License 恢复页的“已认证即可直访”作为 `directAccess: authenticated` 显式声明,Sidebar 可见性仍使用 Manifest Permission/Feature。
46
+
47
+ 每批都必须更新本文件与产品任务状态后再提交。
@@ -0,0 +1,65 @@
1
+ # 通用文件与对象存储
2
+
3
+ ## 模块与 seam
4
+
5
+ `@windy/storage` 是平台文件能力的唯一底层模块。业务模块只学习 `BlobStore` 接口:流式写入、流式打开和删除;文件名、MIME、上传会话、Owner、权限与审计不进入这个底层接口,由上层上传模块统一处理。
6
+
7
+ `ArtifactRef` 使用 `blob_` 加 128 位随机值,不包含目录、租户或内容摘要,不能由业务主键推算。`ContentHash` 当前固定为 SHA-256。调用方可以声明大小和摘要,本地 Adapter 会在写入过程中验证;任何不一致都不会发布 Blob。
8
+
9
+ ## 本地 Adapter
10
+
11
+ `LocalFileBlobStore` 逐块消费 Web `ReadableStream`,直接写入权限为 `0600` 的临时文件,同时累计字节数和 SHA-256。完成后执行文件同步和同文件系统 rename,再发布小型 JSON 元数据。读取返回文件流,不把 Blob 整体载入内存。
12
+
13
+ 目录结构按引用前缀分片:
14
+
15
+ ```text
16
+ <root>/
17
+ .tmp/
18
+ blobs/<prefix>/blob_<random>.blob
19
+ blobs/<prefix>/blob_<random>.json
20
+ ```
21
+
22
+ 部署时 `root` 必须是仅 Server 运行账号可写的持久目录,不得直接暴露给 Web Server。生产下载只经过应用授权路由,不能把上述路径映射成公开静态目录。
23
+
24
+ `BlobStore` 同时是未来 S3-compatible Adapter 的 seam。业务层不依赖云 SDK、bucket 或 presigned URL;后续 Adapter 必须保持相同的流式、摘要与不可猜引用语义。
25
+
26
+ ## 可续传上传
27
+
28
+ `UploadService` 是上传生命周期的唯一入口,依据用途策略校验文件名、大小、MIME 与扩展名。图片用途还会在首个分片流经存储前嗅探 PNG、JPEG 或 WebP 魔数;嗅探最多保留签名所需的前 12 字节,不读取整个文件。
29
+
30
+ 客户端创建会话后,使用服务端返回的 `nextPartNumber` 和 `receivedByteSize` 顺序续传。相同编号、偏移、大小和摘要的重试是幂等操作;其它旧偏移或并发更新会返回冲突,客户端必须读取最新会话再继续。每个分片由 `BlobStore` 独立验证大小和 SHA-256。完成时按编号串联分片流,再次校验总大小和可选总 SHA-256,整个路径不拼装内存 Buffer。
31
+
32
+ PostgreSQL 通过 `file_upload_sessions`、`file_upload_parts` 和 `file_metadata` 持久化会话进度及最终文件。分片提交使用 `received_byte_size + next_part_number` compare-and-set;最终 Blob 与 FileMetadata 只有数据库状态切换成功后才发布为完成状态。
33
+
34
+ 清理任务先删除已过期会话的分片和已过期文件,再将数据库仍引用的 `ArtifactRef` 集合交给 `LocalFileBlobMaintenance`。本地维护器只删除超过 grace period 的临时文件或未引用 Blob,避免与正在提交的上传竞争。生产应由 Scheduler 周期调用清理入口;grace period 默认一小时。
35
+
36
+ ## 授权下载与业务接入
37
+
38
+ 存储能力以 `system.storage` Feature 注册,上传和下载路由统一引用 Module Manifest 的权限:
39
+
40
+ - `system.storage.create`:创建会话、查询续传位置、提交分片、完成或终止本人上传。
41
+ - `system.storage.read`:下载本人文件。
42
+ - `system.storage.manage`:在具备 read 的前提下跨 Owner 下载;跨 Owner 不改变文件归属。
43
+
44
+ 每次创建、完成、终止和授权下载都会记录稳定审计动作。文件过期在打开 Blob 前检查,即使 Owner 或 manage 用户也不能绕过;数据库元数据与 Blob 大小或摘要不一致时返回内容不可用,不流出部分内容。响应体直接使用 `BlobStore.open()` 返回的流,并带有长度、SHA-256、ETag 和安全文件名。
45
+
46
+ Logo 使用 `branding-logo` 上传策略。匿名 `/api/platform/files/:id` 只允许读取当前品牌设置实际引用、且 purpose 为 `branding-logo` 的文件,不能把一个不可猜引用自行升级为公开访问。bulk import/export 的结果和失败 artifact 通过同一 `BlobStore` 保存,数据库只持久化 artifact ref、摘要、大小和留存元数据;下载与到期清理复用统一端口。导入 source 暂时保留在幂等任务事务内,避免任务已创建但 source Blob 未绑定的半成品状态。
47
+
48
+ ## 运行配置
49
+
50
+ - `WINDY_BLOB_DRIVER`:当前生产 Adapter 为 `local`;配置未知驱动时启动失败,不静默回退。
51
+ - `WINDY_STORAGE_ROOT`:本地持久目录,默认 `.data/storage`。Compose 使用独立 named volume 挂载 `/app/data/storage`。
52
+ - S3-compatible 支持保留在 `BlobStore` seam;当前不强制安装云 SDK。未来 Adapter 必须保持流式读写、服务端摘要验证、不可猜引用、明确删除与损坏语义,不能让业务模块学习 bucket/key。
53
+
54
+ ## 故障语义
55
+
56
+ - 声明大小或 SHA-256 不一致:拒绝并删除临时文件。
57
+ - 元数据丢失:按不存在处理;元数据存在但内容缺失或大小不符:报告损坏,不返回部分文件。
58
+ - 删除为幂等操作;第一次存在时返回 `true`,重复删除返回 `false`。
59
+ - 进程在 Blob 发布与元数据发布之间退出时可能产生孤儿内容;上传生命周期模块基于过期时间、引用集合与 grace period 清理。
60
+
61
+ ## 当前切片
62
+
63
+ - F1:Blob 端口、SHA-256、随机引用和本地流式 Adapter 已完成。
64
+ - F2:上传会话、分片续传、文件元数据、校验和清理已完成。
65
+ - F3:服务端授权下载、审计、bulk artifact 与 Logo 接入已完成。
@@ -0,0 +1,59 @@
1
+ # SearchProvider 协议与治理边界
2
+
3
+ ## 目标
4
+
5
+ 平台通过一个稳定的 `SearchService` 聚合业务搜索结果,但不读取业务模块 Repository,也不把用户输入转换成跨模块 SQL。业务模块通过 Manifest 声明 `kind: "search"` 的 Provider,并提供同 Key、同版本的 Handler。Composition Root 启动时要求声明与实现一一对应,未知 Handler、缺失 Handler、重复 Key、协议版本或 Provider 版本漂移都会 fail-fast。
6
+
7
+ 默认部署不引入 OpenSearch、Elasticsearch 或其它外部搜索引擎。小数据量模块可以实现 Repository Provider;将来若替换为可重建索引 Provider,平台协议、调用方与业务详情授权边界不变,业务数据库仍是事实源。
8
+
9
+ ## 深模块边界
10
+
11
+ `SearchService` 是宿主唯一需要调用的搜索边界。它负责:
12
+
13
+ - 从 Module Manifest 发现 Provider,按强类型配置启用或停用,并报告版本和健康状态;
14
+ - 先按目标 Feature、License 与 RBAC 裁剪 Provider,再允许请求的 `providerKeys` 进一步缩小集合;客户端不能启用、扩大或探测未授权 Provider;
15
+ - 并发执行 Provider,并在单 Provider 超时、异常或非法响应时隔离失败,返回分组结果、部分失败与耗时观察值;
16
+ - 维护分页游标、按服务端 Actor 限流,并用 Manifest 中的业务路由模板构造深链;Provider 不能注入任意 URL;
17
+ - 只接受脱敏标题和脱敏摘要,拒绝携带 `title`、`description` 或 `raw` 等明文字段的 Provider 响应;
18
+ - 查询审计只记录 SHA-256 摘要、长度和 Provider Key;结果访问审计只记录分组数、命中数和部分失败状态。
19
+
20
+ Provider 只负责在自身模块边界内执行搜索。它接收平台从已认证 Actor、有效角色、组织和 nominal `ScopeContext` 计算出的 `SearchExecutionContext`。查询请求没有 actor、角色、组织、租户或数据范围字段,因此客户端只能提供查询词、分页限制、游标和用于缩小集合的 Provider Key。业务 Provider 必须把 `ScopeContext` 编译进 Repository predicate,让搜索、count 和分页在同一查询中执行范围约束;先查全量再在内存过滤不符合协议。
21
+
22
+ ## 权限与数据泄漏边界
23
+
24
+ 使用统一搜索入口的权限和读取目标资源的权限是两层独立判定:
25
+
26
+ 1. Server API 路由使用 `system.search.read` 与 `system.search` 检查入口准入。
27
+ 2. `SearchService` 对每个 Provider 再检查其 Manifest 声明的目标 `permissionKey` 和 `featureKey`。
28
+ 3. Provider 使用服务端 `ScopeContext` 在 Repository 查询阶段缩小实体集合。
29
+
30
+ 因此拥有搜索入口权限不代表可以搜索所有资源;缺少目标权限的 Provider 不出现在发现结果中,也不会暴露空分组、健康状态或错误差异。请求指定未知、已停用或未授权 Provider 时统一返回不可用错误,避免把 Provider 存在性变成权限探针。
31
+
32
+ 搜索结果仅是脱敏发现投影,不授予明文或导出权限。每个命中显式声明:明文详情继续委托目标资源接口授权,受治理导出继续委托统一导出能力。两条后续链路属于 P0-7 的资源访问和导出治理,不在搜索协议内复制实现。
33
+
34
+ ## 稳定 DTO
35
+
36
+ - `SearchRequest`:`query`、`limit`、版本化聚合 `cursor`、可选 `providerKeys`。
37
+ - `SearchResultPage`:按 Provider 分组的脱敏 `hits`、下一页游标、`partial`、通用失败和观察值。
38
+ - `SearchProvider`:稳定 Key、实现版本、可中止的 `search` 与 `health`。
39
+ - `SearchProviderDefinition`:协议版本、实现版本、标签、默认启用状态、目标 Feature/Permission 和业务深链模板。
40
+
41
+ 游标只保存各 Provider 的不透明分页状态,不包含授权快照,也不能替代每次请求重新执行 Feature、RBAC 与 dataScope 判定。非法或未知版本游标会返回稳定的 `INVALID_CURSOR`。
42
+
43
+ ## Server API 与启动配置
44
+
45
+ - `GET /api/search/providers` 只返回入口与目标资源均已授权的 Provider 目录、版本和健康状态,不接收查询词。
46
+ - `POST /api/search` 只从 JSON body 读取 `SearchRequest`。平台不提供 `GET /api/search?q=...`,避免查询词进入 URL、代理访问日志和浏览器历史。
47
+ - 两条路由先执行独立的 `system.search` Feature 与 `system.search.read` Permission Guard;通过入口后,Core 再逐个执行目标资源 Guard。`INVALID_REQUEST` / `INVALID_CURSOR`、`SCOPE_DENIED`、`PROVIDER_UNAVAILABLE` 和 `RATE_LIMITED` 分别稳定映射为 400、403、404 和 429。
48
+ - `SEARCH_PROVIDER_KEYS` 是逗号分隔的启动白名单;未配置时按 Manifest 的 `enabledByDefault` 启用,显式空字符串关闭全部 Provider,未知、重复或非法 Key 使启动失败。
49
+ - `SEARCH_PROVIDER_TIMEOUT_MS`、`SEARCH_HEALTH_TIMEOUT_MS` 允许 10-5000 毫秒;`SEARCH_MAX_REQUESTS_PER_MINUTE` 允许 1-300。非整数或越界配置使启动失败,不能被静默截断或钳制。
50
+
51
+ Composition Root 把 Server 实际注册的搜索 API 与 Provider Handler Key 一并交给 Module Composition 校验。没有业务 Provider 声明的项目允许 Core 以空 Registry 启动;只要 Manifest 与 Handler 不一致,启动就在监听端口前失败。
52
+
53
+ ## 当前验证范围
54
+
55
+ 协议单元测试覆盖声明/实现/版本 fail-fast、启停与健康发现、目标权限裁剪、客户端不能扩大服务端身份和组织范围、分组与游标、Manifest 深链、明文响应拒绝、故障/超时隔离、部分失败、按 Actor 限流,以及审计中不出现原始查询词。Server API 测试另行覆盖入口权限先行、目标权限二次裁剪、Feature 关闭、只接受 POST body、稳定错误状态和直接 API 伪造身份/部门不能扩大 scoped Repository 结果。
56
+
57
+ 示例 Work Order 已注册 `work-order.ticket.search`,Provider 只调用 `WorkOrderService.list`,后者把查询、count、分页与服务端 dataScope 一起交给 scoped Repository;测试会让裸 `Repository.list` 主动抛错,并确认本人范围不会返回其他负责人的匹配工单。另一个实现相同 Key/版本的测试 Provider 可以在不修改 Core 的情况下替换工单 Adapter。
58
+
59
+ 生成器默认产物保留 Work Order Provider;`--no-example` 完整移除业务 Provider、schema 与 migration 引用,但保留搜索 Core、Guarded API 和类型化空 Registry。`bun run test:create-windy` 对两种生成物执行真实安装、typecheck、test、build 和 Server 启动,并显式断言该移除边界;`bun run test:db:data-scope` 在真实 PostgreSQL 中分别验证核心用户资源与可删除工单资源的 Repository 级范围约束。
@@ -0,0 +1,57 @@
1
+ # CRUD 代码生成器
2
+
3
+ OPS-03 提供一个基于 canonical CRUD 元数据的保守生成器。它生成可编译、可测试的独立模块包,不自动修改平台 schema 导出、路由注册或 Drizzle migration,因此不会在一次生成命令中悄悄改变生产数据库。
4
+
5
+ ## 使用方式
6
+
7
+ ```bash
8
+ bun run generate:crud -- \
9
+ --spec examples/inventory-item.crud.json \
10
+ --output packages/inventory
11
+ bun install
12
+ bun run --cwd packages/inventory typecheck
13
+ bun run --cwd packages/inventory test
14
+ ```
15
+
16
+ 输出目标必须不存在。生成器先按封闭的 canonical 字段集合验证完整元数据,在同级临时目录写完全部文件后再原子重命名;未知字段、目标已存在、字段名/列名重复、路径格式错误或路径逃逸、保留审计字段被占用、非字符串字段声明全文搜索时都会在生成前直接失败。它不会合并或覆盖人工代码。
17
+
18
+ 生成包包含:
19
+
20
+ - domain 类型和严格 Zod create/update DTO;
21
+ - PostgreSQL canonical Drizzle schema;
22
+ - 模块私有 Repository 端口和 Drizzle 实现;
23
+ - 仅依赖 Repository 接口的 service;
24
+ - read/create/update/delete 逐动作权限路由、列表与详情精确接口绑定、关键写审计和 Guard port;
25
+ - Module Manifest、Feature、可选允许 License 版本集合和 API 权限绑定;生成业务模块默认不声明 Windy 菜单或 Admin Route;
26
+ - service 与路由 Guard/审计单元测试。
27
+
28
+ 所有生成文件均受 350 行上限回归保护。仓库测试会在 `.tmp/crud-generator` 生成 fixture,临时连接当前 workspace 依赖,实际执行 `tsc` 和 `bun test`,结束后清理;fixture 不加入 workspace、不生成 migration。
29
+
30
+ ## 接入平台
31
+
32
+ 生成完成后必须人工完成以下显式接线并接受代码评审:
33
+
34
+ 1. 把生成 schema 从业务模块公开出口接入 `@windy/database` canonical schema,再执行 `bun run db:generate` 并审阅 migration diff。
35
+ 2. 在 Server composition root 创建模块自己的 Drizzle Repository,注入 service;业务模块不得读取其它模块 Repository。
36
+ 3. 为生成的 `CrudAccessPort` 提供平台 Adapter。Adapter 必须调用现有 `evaluateAccessGuards`,按 `license → license-version → dynamic feature → permission` 顺序执行策略;没有商业版本限制的基础功能省略 `license-version`;不能在生成模块中复制 Guard 逻辑。
37
+ 4. 把 `CrudAuditPort` 接到平台可靠审计 writer,并保留生成器为 create/update/delete 指定的 `critical` 策略;随后注册生成的 Module Manifest 和 routes。
38
+ 5. 业务页面应在独立业务应用中组合自己的组件;只有明确属于平台管理控制面的能力,才可另行声明 Admin Route 并在 Windy Web 提供实现。生成器不生成 Vue 页面。
39
+
40
+ 生成的 schema 仅使用 Drizzle PostgreSQL canonical 类型。达梦、人大金仓和 RuoYi 旧库运行时受控写入不在本任务范围内。
41
+
42
+ ## 元数据约束
43
+
44
+ 当前 `schemaVersion` 固定为 `1`,支持 `string`、`integer`、`boolean`、`datetime` 和 `json` 字段。字符串必须声明 `maxLength`;`id/status/created*/updated*/deleted*` 是平台保留字段。权限固定拆为:
45
+
46
+ - `<module>.<resource>.read`
47
+ - `<module>.<resource>.create`
48
+ - `<module>.<resource>.update`
49
+ - `<module>.<resource>.delete`
50
+
51
+ 这使接口权限总览可以从已注册 manifest 精确展示每个 HTTP 动作的权限、Feature 和允许的 License 版本,不需要扫描源码猜测。
52
+
53
+ ## 系统接口权限目录
54
+
55
+ `GET /api/system/operations` 的 `systemInterfaces` 只消费 Server composition root 已注册的 `ModuleManifest[]`。每条记录包含模块、HTTP method/path、权限 Key、匿名策略、Feature、由业务应用为 Feature 声明的允许 License 版本,以及实际 Guard 顺序。相同 method/path 重复绑定或接口引用未注册 Feature 时 fail closed,避免总览展示与运行策略不一致。
56
+
57
+ Web 运维总览按该目录展示 `License → License 版本 → Feature → RBAC` 链路。Feature 控制面本身为了允许开发角色恢复被关闭的功能,不绑定业务 Feature,因此会如实展示为 `License → RBAC`。健康检查、Swagger 或仅做会话认证而未声明权限 Key 的入口不会伪装成 manifest 权限绑定。
@@ -0,0 +1,67 @@
1
+ # W1 分组离线激活码
2
+
3
+ ## 产品边界
4
+
5
+ W1 是同一份 `SignedLicenseV1` 的离线传输编码,用于客户电脑没有网络、摄像头且文件传输不便时手工录入。它不是联网兑换短码,不改变授权字段、签名对象或安装规则,也不会建立第二套 License 状态。
6
+
7
+ 签发中心仍保留 `.license.json` 下载。操作员可以针对任一签发记录查看 W1,按段抄写或复制完整文本。客户 License 页面既可上传文件,也可逐段输入或整段粘贴 W1;两条入口最终都将 canonical `SignedLicenseV1` 交给同一个服务端安装入口。
8
+
9
+ 客户电脑不扫描 License 二维码,不要求摄像头。W1 解码和安装均不访问厂商服务器。
10
+
11
+ ## 确定性编码
12
+
13
+ 编码顺序固定如下:
14
+
15
+ 1. 用现有严格解析器验证 `SignedLicenseV1`,并生成 canonical JSON。
16
+ 2. 将 V1 固定字段映射为有固定位置的紧凑 tuple;`formatVersion=1` 和 `algorithm=ED25519` 由 W1 格式固定,不在 tuple 中重复。
17
+ 3. 将 64 字节 ED25519 签名从 Base64 还原为原始字节,避免 Base64 的传输膨胀;这不改变签名内容。
18
+ 4. 使用 zlib level 9 确定性压缩紧凑 tuple。
19
+ 5. 生成信封:`4 字节 tuple 原文长度 + zlib 数据 + 64 字节签名 + 4 字节 canonical JSON CRC32`。
20
+ 6. 使用 Crockford Base32 编码信封。
21
+ 7. 每段承载最多 25 个 Base32 数据字符,并附加 2 个依赖段序号的校验字符;最终以 `W1-` 为前缀,只在段之间加入连字符。
22
+
23
+ 签发页面把每段内部再按 5 个字符做视觉分组,并单独标出末尾 2 个段校验字符。实际编码不为每个 5 字符小组增加校验位,避免明显放大手工录入长度。
24
+
25
+ ## 输入和错误处理
26
+
27
+ - 输入不区分大小写,并忽略空格、换行和连字符。
28
+ - `O` 只按 `0` 归一化,`I` 和 `L` 只按 `1` 归一化;不会尝试猜测或修复其他字符。
29
+ - 段校验失败返回具体段号,单字符数据错误或校验字符错误不会进入安装流程。
30
+ - 截断、未知版本、非法字符、zlib 损坏、tuple 长度/类型错误和整体 CRC 错误均稳定拒绝。
31
+ - CRC32 和段校验只用于发现抄写/传输错误,不是安全边界。解码后的完整 License 必须继续通过 ED25519、公钥、产品、设备码、到期时间和防降级校验。
32
+ - 解码成功只生成 canonical License JSON;服务端仍使用同一个串行化 `LicenseInstaller` 完成防降级、原子替换和摘要审计。失败不会覆盖 current。
33
+ - 普通日志、签发审计和客户安装审计不保存完整 W1。签发端查看 W1 只记录 License ID 和导出动作;客户安装审计只保存 canonical License 摘要、稳定结果和非敏感标识。
34
+
35
+ ### 安全长度上限
36
+
37
+ 常见 W1 不足 1 KiB。实现为正常字段增长保留了数十倍余量,同时在分配、解析和解压之前执行以下固定上限:
38
+
39
+ | 层次 | 最大长度 | 拒绝时机 |
40
+ | ---------------------------- | ---------: | ------------------------ |
41
+ | 原始打印/粘贴文本 | 32 Ki 字符 | 大小写转换和去分隔符之前 |
42
+ | 去空白、连字符后的规范化文本 | 28 Ki 字符 | Base32 解码之前 |
43
+ | 信封内 zlib 数据 | 16 KiB | 解压之前 |
44
+ | 解压后的紧凑 tuple | 64 KiB | 增量解压过程中 |
45
+ | 安装或签发 JSON 请求体 | 64 KiB | JSON 解析之前 |
46
+
47
+ 解压器以小块增量消费压缩数据,累计输出一旦超过信封声明长度或 64 KiB 上限便立即停止,不会先完整分配异常膨胀的输出。HTTP 入口先校验 `Content-Length`,再对没有长度或声明不可信的请求流逐块计数;声明值与实际字节数不一致时同样拒绝。超限、JSON 损坏等错误只返回稳定中文原因,不回显 W1 或请求正文。
48
+
49
+ ## 长度基准
50
+
51
+ 下表由当前固定 V1 测试向量测得。`完整编码字符`包含 `W1`、段分隔连字符和校验字符;Base32 本身不包含易混的 `I/L/O/U`。V1 现在只携带单一 License 版本标记,不再包含数量可变的能力列表。
52
+
53
+ | 样本 | canonical JSON 字节 | 段数 | 完整编码字符 |
54
+ | ---------------------------- | ------------------: | ---: | -----------: |
55
+ | 仓库固定 V1 版本标记向量 | 673 | 20 | 519 |
56
+
57
+ 因此 W1 仍然只是无 U 盘、无摄像头时的兜底入口,不能承诺 150~300 字符。仅 64 字节 ED25519 签名转为 Base32 就需要约 103 个数据字符,V1 还签入客户、项目、合同、设备、时间、公钥 ID 和 License 版本等完整展示字段。
58
+
59
+ 若未来必须进一步缩短,应设计新的签名格式版本,由产品明确哪些展示字段可以不再进入签名正文,或使用更紧凑的稳定标识与二进制字段编码;不得删除现有 V1 字段后仍冒充 V1,也不得改为联网兑换、只校验 CRC 或削弱 ED25519。
60
+
61
+ ## 接口与运维
62
+
63
+ - `GET /api/licenses/:id/activation-code`:需要 `license.record.read`,返回 `W1`、分段和字符数,设置 `Cache-Control: no-store`,并复用 License 下载事件和敏感导出审计。
64
+ - `POST /api/license/runtime/install`:既接受原有 `{ license }`,也接受 `{ activationCode }`。W1 解码后只把 canonical License 传给现有安装器。
65
+ - 签发页面和客户页面都不把 W1 写入浏览器日志。复制能力仅在操作员明确点击后调用系统剪贴板。
66
+
67
+ W1 的压缩算法、tuple 字段顺序、信封结构、Base32 字母表和分段校验都属于版本协议;任何不兼容修改必须使用新的显式前缀,不能改变既有 W1 解码结果。
@@ -0,0 +1,50 @@
1
+ # 运行时可观测性
2
+
3
+ 本页定义 P0 生产运维基线中的探针、结构化日志、指标和关联标识契约。它描述的是应用边界,不代表反向代理、TLS、告警平台或客户基础设施已经验收。
4
+
5
+ ## 存活与就绪探针
6
+
7
+ 存活探针只回答进程是否仍能处理 HTTP,不访问数据库或外部服务;就绪探针用于决定是否接收流量,会检查当前服务启动所需的依赖。探针失败只返回稳定状态,不回显异常、连接串或上游响应正文。
8
+
9
+ | 服务 | Liveness | Readiness | 兼容入口 | 就绪条件 |
10
+ | ------- | --------------- | ---------------- | ----------------- | ---------------------------------------------------------------------- |
11
+ | Server | `GET /api/live` | `GET /api/ready` | `GET /api/health` | PostgreSQL 已配置且可查询;显式非生产内存模式允许显示 `not-configured` |
12
+ | Web | `GET /-/live` | `GET /-/ready` | 无 | `dist/index.html` 存在且 Server `/api/ready` 返回成功 |
13
+ | License | `GET /api/live` | `GET /api/ready` | `GET /api/health` | PostgreSQL License schema 可用 |
14
+ | Signing | `GET /live` | `GET /ready` | `GET /health` | Vault 可用、已初始化且未 sealed |
15
+
16
+ `/api/health` 和 `/health` 只为已有调用方保留;新编排必须分别使用 liveness 和 readiness。Dockerfile 的 `HEALTHCHECK` 使用 readiness;根目录开发 Compose 也用 readiness 控制服务依赖,但它仍然不是生产编排。
17
+
18
+ Server readiness 同时返回审计 writer 状态,便于对 `degraded`、队列积压或丢弃计数告警。审计降级当前不会自动把实例摘流;关键写入仍由业务 Guard fail closed,处置方式见[平台审计可靠写入](../platform/audit-reliability.md)。
19
+
20
+ ## Request 与 Job 关联
21
+
22
+ Web、Server、License 和 Signing 接受 `x-request-id`。只保留 1 至 128 位的 ASCII 字母、数字、点、下划线和连字符;缺失或非法值会替换为新 UUID,并在响应 `x-request-id` 中返回。Web 同源代理会把同一值转发给 Server,因此浏览器错误响应、Server 完成日志和审计事件可使用同一标识定位。
23
+
24
+ 后台调度使用一次触发链的 `requestId` 和单次执行的 `runId`:审计事件保存两者,聚合指标只记录结果分类,不把任一标识放进 metric label。业务 handler 如调用外部系统,应继续透传当前关联标识,并保持敏感头与正文不落日志。
25
+
26
+ ## 结构化日志
27
+
28
+ 应用启动、运行模式警告和 HTTP 完成事件使用单行 JSON。HTTP 完成事件的稳定字段为:
29
+
30
+ - `timestamp`、`level`、`event`、`component`;
31
+ - `requestId`、`method`、`statusCode`、`durationMs`;
32
+ - Server 可额外记录粗粒度 `actorType`,不记录用户或资源 ID。
33
+
34
+ 请求完成日志禁止记录完整 URL、query、请求或响应 body、Cookie、Authorization、Secret、连接串和原始异常。需要增加字段时,必须先判断其基数和敏感性,并补充防泄漏测试。生产日志采集器应按 JSON 字段解析,按 `requestId` 关联,不依赖自由文本。
35
+
36
+ ## Server 指标
37
+
38
+ `GET /api/metrics` 输出 Prometheus text format,并设置 `Cache-Control: no-store`。当前指标包括:
39
+
40
+ - 进程 uptime 和 RSS;
41
+ - 活跃请求数、按安全 HTTP method 和状态码分类的完成计数、无路由 label 的耗时汇总;
42
+ - 调度 tick 次数,以及 `scheduled`、`retried`、`blocked`、`failed` 结果计数。
43
+
44
+ 指标不使用 URL、route parameter、request ID、run ID、用户 ID 或资源 ID label,避免泄密和无界基数。该入口当前没有独立公网认证层;生产反向代理和网络策略必须只允许内部监控系统访问,不能直接暴露到互联网。
45
+
46
+ ## 当前验证状态
47
+
48
+ 已验证:共享关联标识校验、四个服务的 liveness/readiness 分离、Server 指标格式、Server/License 请求完成日志字段、Web 到 Server 的标识透传,均有 Bun 单元或边界测试;工作区 typecheck 和 Oxlint 已通过。Dockerfile 已声明 readiness `HEALTHCHECK`。
49
+
50
+ 尚未由本页证明:生产 Compose、新环境部署、备份恢复、升级回滚、原生 Linux amd64 runner、告警规则、长稳运行、多实例和大容量。这些项必须由后续生产恢复演练和目标环境记录单独闭环;Docker Desktop 或 QEMU 上的 amd64 运行不能写成原生 Linux amd64 已认证。
@@ -0,0 +1,37 @@
1
+ # Agent Tool 注册与执行
2
+
3
+ ## 当前状态
4
+
5
+ Server 端已提供 Agent Tool 的最小闭环:
6
+
7
+ - 工具定义来自模块 manifest 的 `tools` 字段。
8
+ - `GET /api/agent/tools` 返回已注册工具和当前请求是否有权限。
9
+ - `POST /api/agent/tools/:key/execute` 执行工具。
10
+ - 执行前使用 Permission Guard 校验 `permissionKey`。
11
+ - 权限拒绝记录 `security.denied` 审计事件。
12
+ - 执行成功记录 `agent.tool.execute` 审计事件。
13
+
14
+ OpenAPI 文档由 `@elysiajs/swagger` 提供,随 Server 启动自动暴露。
15
+
16
+ ## 当前工具
17
+
18
+ - `system.users.list`:查询用户。
19
+ - `system.features.list`:查询功能开关。
20
+ - `system.audit.list`:查询审计日志。
21
+
22
+ ## 开发态鉴权
23
+
24
+ 开发态可用:
25
+
26
+ ```text
27
+ Authorization: Bearer dev-admin-token
28
+ ```
29
+
30
+ 该 token 来自内存运行时上下文,只用于本地闭环验证,不是生产登录体系。
31
+
32
+ ## 当前边界
33
+
34
+ - 工具执行复用系统资源 Repository;未配置 `DATABASE_URL` 时使用内存仓储,配置后使用 Drizzle 仓储。
35
+ - 工具参数当前只支持基础分页参数。
36
+ - 审计事件写入内存 sink;配置 `DATABASE_URL` 后会通过有界重试写入 PostgreSQL `audit_logs`,持续失败会增加计数并输出告警,审计查询优先读取该表。详细降级语义见 [平台审计可靠写入](./audit-reliability.md)。
37
+ - 后续应继续完善 Agent Tool 的结构化输入 schema 和执行结果追踪。
@@ -0,0 +1,95 @@
1
+ # 平台审计可靠写入
2
+
3
+ ## 目标与边界
4
+
5
+ 平台普通审计统一通过可靠写入器进入 PostgreSQL `audit_logs`。本设计只处理平台运行时审计,不改变 License Authority 的 `license_events` 追加式不可变事件模型;后者仍由签发领域事务保证,不进入本地恢复队列。
6
+
7
+ 本次不新增数据库表或 migration:`audit_logs.id` 已是事件唯一标识,恢复重放通过 `ON CONFLICT DO NOTHING` 保持幂等。PostgreSQL 不可用时,关键安全事件写入独立的本地恢复文件,避免恢复队列与主库发生同故障域失效。
8
+
9
+ ## 两类写入策略
10
+
11
+ | 策略 | 典型事件 | PostgreSQL 持续失败后的行为 |
12
+ | -------- | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
13
+ | 普通审计 | 普通 CRUD、导入导出、Agent Tool 执行、权限拒绝 | 业务继续;保留进程内事件;增加失败和丢弃计数;记录降级告警 |
14
+ | 关键审计 | 登录/退出/密码和会话操作、用户与角色变更、Feature Flag 开关、License 资源变更、License 上传与损坏文件恢复 | 写入本地原子恢复队列后业务可继续;数据库和恢复队列都不可用时抛错并 fail closed |
15
+
16
+ 自动调度因同一个 Feature、License 或权限原因持续被拒绝时,仅在首次进入该拒绝状态时写入一条 `task.execute / denied`;相同任务恢复执行后,后续再次被拒绝会重新记录。人工触发属于独立的用户安全行为,仍逐次记录 `security.denied`。这样保留状态变化信号,同时避免高频任务用重复拒绝事件淹没业务审计。
17
+
18
+ 批量任务派发器每 5 秒轮询一次。定时执行返回 `claimed: false` 代表没有业务任务可领取,Scheduler 完成并立即丢弃这条 idle run,也不写 `task.execute` 审计;人工触发即使没有领取任务仍保留执行历史和 `task.trigger` / `task.execute`,真实领取、失败、重试和 Guard 拒绝同样完整留痕。idle 判定由任务定义显式声明,普通任务不会自动套用。
19
+
20
+ 审计页面使用操作者、动作和时间三个选择控件。操作者候选来自最近 100 条审计记录,动作候选来自 `@windy/shared` 的稳定动作目录,并以中文名称和说明展示;筛选请求继续传递稳定 action key。时间选择按最近 24 小时、7 天或 30 天换算为 ISO `occurredAfter`,内存与 PostgreSQL Reader 使用同一时间边界,非法时间值返回 `400 INVALID_AUDIT_TIME_RANGE`。
21
+
22
+ 常规审计列表在服务端固定排除 `system_scheduler` 执行身份产生的日志,客户端不能构造参数绕过;调度执行结果统一到定时任务的执行历史查看。审计导出提供“包含定时器日志”选项,默认关闭,只影响本次导出,不改变页面列表状态。
23
+
24
+ 动作列直接显示中文动作名,并使用 shadcn-vue / Reka UI Tooltip 零延迟展示稳定 action key、动作说明、操作对象和相关上下文。非空通用资源搜索记录 `data.search`,metadata 包含查询内容、资源和匹配数;审计列表自身不递归记录搜索。自由文本可能包含手机号或邮箱,因此部署方应把审计访问权限、保留期和导出权限视为敏感数据治理边界;默认字段名脱敏不等于自由文本内容脱敏。
25
+
26
+ 每次 PostgreSQL 写入默认最多尝试 3 次。重试间隔按指数增长,并受最大间隔约束,不会无限重试或无限阻塞请求。恢复队列也有最大条数;队列已满等同于队列不可用,关键动作会失败。
27
+
28
+ License 上传仍只记录候选摘要、可识别的 License ID、公钥 ID 和失败原因,不保存 License 正文或签名正文。可靠写入器还会在进入内存、PostgreSQL 或恢复文件前递归脱敏,默认覆盖 `password`、`token`、`secret`、`authorization`、`cookie`、`license`、`signature` 和 `privateKey` 等字段名;`AUDIT_REDACT_FIELDS` 只能追加字段,不能取消默认保护。
29
+
30
+ 这里的 fail closed 精确定义为请求不会返回业务成功;它不表示业务 Repository 写入与审计落库/本地文件天然处于同一原子事务。现有变更路径可能先完成业务写入再记录成功审计,因此数据库与恢复队列同时失败时,调用方必须先查询最终业务状态,再按幂等语义决定是否重试。需要强原子性的领域事实仍应像 License Authority 一样在领域事务内写追加事件,而不是依赖平台恢复队列补足事务边界。
31
+
32
+ ## 恢复与幂等
33
+
34
+ 关键事件在 PostgreSQL 持续失败后写入 `WINDY_AUDIT_QUEUE_FILE`:
35
+
36
+ 1. 队列文件使用同目录临时文件写入后原子重命名,文件权限为 `0600`。
37
+ 2. Server 启动、以及后续任一审计写入恢复成功时,会顺序重放队列。
38
+ 3. PostgreSQL 以事件 ID 幂等插入,连接超时后即使数据库实际已提交,重放也不会生成重复事件。
39
+ 4. 只有成功持久化的前缀会从队列移除;首次失败事件及其后续事件继续保留。
40
+
41
+ 恢复文件所在目录必须挂载到持久卷,并只允许 Server 运行账号访问。不要把它放到容器临时层、共享静态目录或备份公开目录。
42
+
43
+ ## 可观测状态
44
+
45
+ `GET /api/health` 的 `audit` 字段返回非敏感运行状态:
46
+
47
+ ```json
48
+ {
49
+ "state": "degraded",
50
+ "attempted": 12,
51
+ "persisted": 10,
52
+ "failedAttempts": 5,
53
+ "retries": 3,
54
+ "queued": 1,
55
+ "dropped": 1,
56
+ "lastFailureAt": "2026-07-10T08:00:00.000Z",
57
+ "lastSuccessAt": "2026-07-10T07:59:00.000Z",
58
+ "alert": "关键审计已进入可恢复队列"
59
+ }
60
+ ```
61
+
62
+ - `failedAttempts` 是底层尝试失败次数,包括随后成功的重试。
63
+ - `retries` 是已经执行的重试次数。
64
+ - `queued` 是当前仍待恢复的关键事件数。
65
+ - `dropped` 是 PostgreSQL 持续失败后未进入持久队列的普通事件数。
66
+ - `state=degraded` 或 `queued/dropped > 0` 应触发运维告警。
67
+
68
+ 进入降级状态时 Server 同时写入结构化 error 日志,日志只包含上述状态,不包含事件正文。
69
+
70
+ ## 环境变量
71
+
72
+ | 变量 | 默认值 | 说明 |
73
+ | --------------------------- | ---------------------------------- | ------------------------------------------- |
74
+ | `WINDY_AUDIT_MAX_ATTEMPTS` | `3` | 单次事件总尝试次数,包含首次写入,最大 `10` |
75
+ | `WINDY_AUDIT_RETRY_BASE_MS` | `50` | 指数退避基础间隔,最大 `60000` 毫秒 |
76
+ | `WINDY_AUDIT_RETRY_MAX_MS` | `500` | 单次重试最大等待时间,最大 `60000` 毫秒 |
77
+ | `WINDY_AUDIT_QUEUE_FILE` | `./data/audit/recovery-queue.json` | 关键事件恢复文件 |
78
+ | `WINDY_AUDIT_QUEUE_SIZE` | `1000` | 关键恢复队列最大事件数,上限 `100000` |
79
+ | `AUDIT_REDACT_FIELDS` | 空 | 在默认敏感字段之外追加的逗号分隔字段名 |
80
+
81
+ 生产环境未配置审计持久化 writer 时,关键动作不会回退为内存 best-effort,而是直接 fail closed。普通审计仍维持业务可用性,但健康状态会显示写入失败。
82
+
83
+ 恢复文件只适用于单实例独占写入。多副本部署必须为每个 Server 实例配置独立持久卷和独立 `WINDY_AUDIT_QUEUE_FILE`,再在监控侧聚合各实例状态;多个进程共享同一个恢复文件没有跨进程锁,会产生覆盖风险。
84
+
85
+ ## 故障处置
86
+
87
+ 1. 检查 `/api/health` 的 `audit` 状态和 Server 的“审计持久化进入降级状态”日志。
88
+ 2. 检查 PostgreSQL 连接、连接池容量、`audit_logs` 表和磁盘容量。
89
+ 3. 确认恢复文件所在持久卷可写、权限为 Server 账号私有,且队列未达到上限。
90
+ 4. 修复 PostgreSQL 后执行一个普通的已审计请求;写入成功会触发队列恢复。也可以重启 Server,在启动阶段恢复。
91
+ 5. 只有 `queued=0` 且状态恢复为 `healthy` 后才解除告警。`dropped` 是累计计数,不会自动归零,应结合故障窗口内的进程内事件和业务日志进行人工补查。
92
+
93
+ ## 验证覆盖
94
+
95
+ 自动测试覆盖瞬时故障后成功、退避上限、普通事件持续失败、关键事件入队、数据库恢复重放、数据库与队列同时失败、队列内容深层脱敏、License 损坏文件恢复上传入队,以及 PostgreSQL 事件 ID 幂等重放。真实 PostgreSQL 集成测试使用 `AUDIT_TEST_DATABASE_URL` 显式启用。