@things-factory/worklist 10.1.248 → 10.1.249

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 (696) hide show
  1. package/dist-client/activity-cells.d.ts +21 -0
  2. package/dist-client/activity-cells.js +117 -0
  3. package/dist-client/activity-cells.js.map +1 -0
  4. package/dist-client/activity-state-counts.d.ts +6 -0
  5. package/dist-client/activity-state-counts.js +23 -0
  6. package/dist-client/activity-state-counts.js.map +1 -0
  7. package/dist-client/activity-summary-generator.d.ts +2 -0
  8. package/dist-client/activity-summary-generator.js +155 -0
  9. package/dist-client/activity-summary-generator.js.map +1 -0
  10. package/dist-client/approval-progress.d.ts +18 -0
  11. package/dist-client/approval-progress.js +31 -0
  12. package/dist-client/approval-progress.js.map +1 -0
  13. package/dist-client/bootstrap.d.ts +5 -0
  14. package/dist-client/bootstrap.js +63 -0
  15. package/dist-client/bootstrap.js.map +1 -0
  16. package/dist-client/chip-counts.d.ts +7 -0
  17. package/dist-client/chip-counts.js +11 -0
  18. package/dist-client/chip-counts.js.map +1 -0
  19. package/dist-client/chip-filters.d.ts +60 -0
  20. package/dist-client/chip-filters.js +102 -0
  21. package/dist-client/chip-filters.js.map +1 -0
  22. package/dist-client/components/activity-/bowner-view.d.ts +1 -0
  23. package/dist-client/components/activity-/bowner-view.js +104 -0
  24. package/dist-client/components/activity-/bowner-view.js.map +1 -0
  25. package/dist-client/components/activity-approval-ribon.d.ts +31 -0
  26. package/dist-client/components/activity-approval-ribon.js +103 -0
  27. package/dist-client/components/activity-approval-ribon.js.map +1 -0
  28. package/dist-client/components/activity-fields.d.ts +77 -0
  29. package/dist-client/components/activity-fields.js +424 -0
  30. package/dist-client/components/activity-fields.js.map +1 -0
  31. package/dist-client/components/activity-instance-preview.d.ts +2 -0
  32. package/dist-client/components/activity-instance-preview.js +177 -0
  33. package/dist-client/components/activity-instance-preview.js.map +1 -0
  34. package/dist-client/components/activity-instance-ribon.d.ts +32 -0
  35. package/dist-client/components/activity-instance-ribon.js +91 -0
  36. package/dist-client/components/activity-instance-ribon.js.map +1 -0
  37. package/dist-client/components/activity-intro-view.d.ts +1 -0
  38. package/dist-client/components/activity-intro-view.js +104 -0
  39. package/dist-client/components/activity-intro-view.js.map +1 -0
  40. package/dist-client/components/activity-reporter-view.d.ts +1 -0
  41. package/dist-client/components/activity-reporter-view.js +103 -0
  42. package/dist-client/components/activity-reporter-view.js.map +1 -0
  43. package/dist-client/components/activity-starter-form.d.ts +19 -0
  44. package/dist-client/components/activity-starter-form.js +264 -0
  45. package/dist-client/components/activity-starter-form.js.map +1 -0
  46. package/dist-client/components/activity-thread-ribon.d.ts +38 -0
  47. package/dist-client/components/activity-thread-ribon.js +95 -0
  48. package/dist-client/components/activity-thread-ribon.js.map +1 -0
  49. package/dist-client/components/activity-thread-timeline.d.ts +28 -0
  50. package/dist-client/components/activity-thread-timeline.js +339 -0
  51. package/dist-client/components/activity-thread-timeline.js.map +1 -0
  52. package/dist-client/components/can-pick.d.ts +15 -0
  53. package/dist-client/components/can-pick.js +16 -0
  54. package/dist-client/components/can-pick.js.map +1 -0
  55. package/dist-client/components/decision-content.d.ts +35 -0
  56. package/dist-client/components/decision-content.js +331 -0
  57. package/dist-client/components/decision-content.js.map +1 -0
  58. package/dist-client/components/decision-slots.d.ts +153 -0
  59. package/dist-client/components/decision-slots.js +152 -0
  60. package/dist-client/components/decision-slots.js.map +1 -0
  61. package/dist-client/components/mutation-outcome.d.ts +57 -0
  62. package/dist-client/components/mutation-outcome.js +78 -0
  63. package/dist-client/components/mutation-outcome.js.map +1 -0
  64. package/dist-client/components/say-outcome.d.ts +25 -0
  65. package/dist-client/components/say-outcome.js +51 -0
  66. package/dist-client/components/say-outcome.js.map +1 -0
  67. package/dist-client/components/state-ribon.d.ts +48 -0
  68. package/dist-client/components/state-ribon.js +225 -0
  69. package/dist-client/components/state-ribon.js.map +1 -0
  70. package/dist-client/components/timeline-entries.d.ts +38 -0
  71. package/dist-client/components/timeline-entries.js +62 -0
  72. package/dist-client/components/timeline-entries.js.map +1 -0
  73. package/dist-client/components/work-box-groups.d.ts +25 -0
  74. package/dist-client/components/work-box-groups.js +98 -0
  75. package/dist-client/components/work-box-groups.js.map +1 -0
  76. package/dist-client/due.d.ts +16 -0
  77. package/dist-client/due.js +78 -0
  78. package/dist-client/due.js.map +1 -0
  79. package/dist-client/entity360/person-open-work-section.d.ts +23 -0
  80. package/dist-client/entity360/person-open-work-section.js +79 -0
  81. package/dist-client/entity360/person-open-work-section.js.map +1 -0
  82. package/dist-client/grist-editor/grist-editor-activity-search-key.d.ts +12 -0
  83. package/dist-client/grist-editor/grist-editor-activity-search-key.js +70 -0
  84. package/dist-client/grist-editor/grist-editor-activity-search-key.js.map +1 -0
  85. package/dist-client/grist-editor/grist-renderer-activity-search-key.d.ts +3 -0
  86. package/dist-client/grist-editor/grist-renderer-activity-search-key.js +25 -0
  87. package/dist-client/grist-editor/grist-renderer-activity-search-key.js.map +1 -0
  88. package/dist-client/grist-editor/popup-activity-search-keys-input.d.ts +17 -0
  89. package/dist-client/grist-editor/popup-activity-search-keys-input.js +175 -0
  90. package/dist-client/grist-editor/popup-activity-search-keys-input.js.map +1 -0
  91. package/dist-client/index.d.ts +6 -0
  92. package/dist-client/index.js +7 -0
  93. package/dist-client/index.js.map +1 -0
  94. package/dist-client/my-work-menus.d.ts +90 -0
  95. package/dist-client/my-work-menus.js +20 -0
  96. package/dist-client/my-work-menus.js.map +1 -0
  97. package/dist-client/pages/activity/activity-list-page.d.ts +53 -0
  98. package/dist-client/pages/activity/activity-list-page.js +600 -0
  99. package/dist-client/pages/activity/activity-list-page.js.map +1 -0
  100. package/dist-client/pages/activity/activity-model-item-list.d.ts +24 -0
  101. package/dist-client/pages/activity/activity-model-item-list.js +292 -0
  102. package/dist-client/pages/activity/activity-model-item-list.js.map +1 -0
  103. package/dist-client/pages/activity/activity-page.d.ts +56 -0
  104. package/dist-client/pages/activity/activity-page.js +396 -0
  105. package/dist-client/pages/activity/activity-page.js.map +1 -0
  106. package/dist-client/pages/activity/activity-partial-view.d.ts +13 -0
  107. package/dist-client/pages/activity/activity-partial-view.js +56 -0
  108. package/dist-client/pages/activity/activity-partial-view.js.map +1 -0
  109. package/dist-client/pages/activity/assignee-roles-cell.d.ts +32 -0
  110. package/dist-client/pages/activity/assignee-roles-cell.js +26 -0
  111. package/dist-client/pages/activity/assignee-roles-cell.js.map +1 -0
  112. package/dist-client/pages/activity/starter-list-page.d.ts +31 -0
  113. package/dist-client/pages/activity/starter-list-page.js +172 -0
  114. package/dist-client/pages/activity/starter-list-page.js.map +1 -0
  115. package/dist-client/pages/activity-approval/activity-approval-importer.d.ts +23 -0
  116. package/dist-client/pages/activity-approval/activity-approval-importer.js +94 -0
  117. package/dist-client/pages/activity-approval/activity-approval-importer.js.map +1 -0
  118. package/dist-client/pages/activity-approval/activity-approval-list-page.d.ts +55 -0
  119. package/dist-client/pages/activity-approval/activity-approval-list-page.js +253 -0
  120. package/dist-client/pages/activity-approval/activity-approval-list-page.js.map +1 -0
  121. package/dist-client/pages/activity-approval/activity-approval-page.d.ts +158 -0
  122. package/dist-client/pages/activity-approval/activity-approval-page.js +875 -0
  123. package/dist-client/pages/activity-approval/activity-approval-page.js.map +1 -0
  124. package/dist-client/pages/activity-approval/approval-gate.d.ts +29 -0
  125. package/dist-client/pages/activity-approval/approval-gate.js +21 -0
  126. package/dist-client/pages/activity-approval/approval-gate.js.map +1 -0
  127. package/dist-client/pages/activity-catalog/activity-catalog-page.d.ts +31 -0
  128. package/dist-client/pages/activity-catalog/activity-catalog-page.js +420 -0
  129. package/dist-client/pages/activity-catalog/activity-catalog-page.js.map +1 -0
  130. package/dist-client/pages/activity-catalog/activity-detail-actions.d.ts +34 -0
  131. package/dist-client/pages/activity-catalog/activity-detail-actions.js +18 -0
  132. package/dist-client/pages/activity-catalog/activity-detail-actions.js.map +1 -0
  133. package/dist-client/pages/activity-catalog/activity-detail-page.d.ts +90 -0
  134. package/dist-client/pages/activity-catalog/activity-detail-page.js +525 -0
  135. package/dist-client/pages/activity-catalog/activity-detail-page.js.map +1 -0
  136. package/dist-client/pages/activity-catalog/activity-guide.d.ts +16 -0
  137. package/dist-client/pages/activity-catalog/activity-guide.js +5 -0
  138. package/dist-client/pages/activity-catalog/activity-guide.js.map +1 -0
  139. package/dist-client/pages/activity-catalog/activity-panels.d.ts +80 -0
  140. package/dist-client/pages/activity-catalog/activity-panels.js +53 -0
  141. package/dist-client/pages/activity-catalog/activity-panels.js.map +1 -0
  142. package/dist-client/pages/activity-catalog/activity-stage.d.ts +31 -0
  143. package/dist-client/pages/activity-catalog/activity-stage.js +44 -0
  144. package/dist-client/pages/activity-catalog/activity-stage.js.map +1 -0
  145. package/dist-client/pages/activity-instance/activity-instance-list-page.d.ts +42 -0
  146. package/dist-client/pages/activity-instance/activity-instance-list-page.js +306 -0
  147. package/dist-client/pages/activity-instance/activity-instance-list-page.js.map +1 -0
  148. package/dist-client/pages/activity-instance/activity-instance-search-page.d.ts +69 -0
  149. package/dist-client/pages/activity-instance/activity-instance-search-page.js +309 -0
  150. package/dist-client/pages/activity-instance/activity-instance-search-page.js.map +1 -0
  151. package/dist-client/pages/activity-instance/activity-instance-start-page.d.ts +54 -0
  152. package/dist-client/pages/activity-instance/activity-instance-start-page.js +557 -0
  153. package/dist-client/pages/activity-instance/activity-instance-start-page.js.map +1 -0
  154. package/dist-client/pages/activity-instance/activity-instance-view.d.ts +36 -0
  155. package/dist-client/pages/activity-instance/activity-instance-view.js +494 -0
  156. package/dist-client/pages/activity-instance/activity-instance-view.js.map +1 -0
  157. package/dist-client/pages/activity-instance/discard-offer.d.ts +11 -0
  158. package/dist-client/pages/activity-instance/discard-offer.js +11 -0
  159. package/dist-client/pages/activity-instance/discard-offer.js.map +1 -0
  160. package/dist-client/pages/activity-stats/activity-stats-importer.d.ts +23 -0
  161. package/dist-client/pages/activity-stats/activity-stats-importer.js +94 -0
  162. package/dist-client/pages/activity-stats/activity-stats-importer.js.map +1 -0
  163. package/dist-client/pages/activity-stats/activity-stats-list-page.d.ts +55 -0
  164. package/dist-client/pages/activity-stats/activity-stats-list-page.js +253 -0
  165. package/dist-client/pages/activity-stats/activity-stats-list-page.js.map +1 -0
  166. package/dist-client/pages/activity-store/activity-store-page.d.ts +41 -0
  167. package/dist-client/pages/activity-store/activity-store-page.js +210 -0
  168. package/dist-client/pages/activity-store/activity-store-page.js.map +1 -0
  169. package/dist-client/pages/activity-supervisor/reporter-list-page.d.ts +30 -0
  170. package/dist-client/pages/activity-supervisor/reporter-list-page.js +190 -0
  171. package/dist-client/pages/activity-supervisor/reporter-list-page.js.map +1 -0
  172. package/dist-client/pages/activity-template/activity-template-importer.d.ts +11 -0
  173. package/dist-client/pages/activity-template/activity-template-importer.js +98 -0
  174. package/dist-client/pages/activity-template/activity-template-importer.js.map +1 -0
  175. package/dist-client/pages/activity-template/activity-template-list-page.d.ts +53 -0
  176. package/dist-client/pages/activity-template/activity-template-list-page.js +377 -0
  177. package/dist-client/pages/activity-template/activity-template-list-page.js.map +1 -0
  178. package/dist-client/pages/activity-template/activity-template-model-item-list.d.ts +1 -0
  179. package/dist-client/pages/activity-template/activity-template-model-item-list.js +41 -0
  180. package/dist-client/pages/activity-template/activity-template-model-item-list.js.map +1 -0
  181. package/dist-client/pages/activity-thread/activity-thread-importer.d.ts +11 -0
  182. package/dist-client/pages/activity-thread/activity-thread-importer.js +96 -0
  183. package/dist-client/pages/activity-thread/activity-thread-importer.js.map +1 -0
  184. package/dist-client/pages/activity-thread/activity-thread-list-page.d.ts +52 -0
  185. package/dist-client/pages/activity-thread/activity-thread-list-page.js +248 -0
  186. package/dist-client/pages/activity-thread/activity-thread-list-page.js.map +1 -0
  187. package/dist-client/pages/activity-thread/activity-thread-page.d.ts +91 -0
  188. package/dist-client/pages/activity-thread/activity-thread-page.js +593 -0
  189. package/dist-client/pages/activity-thread/activity-thread-page.js.map +1 -0
  190. package/dist-client/pages/activity-thread/activity-thread-view-page.d.ts +56 -0
  191. package/dist-client/pages/activity-thread/activity-thread-view-page.js +385 -0
  192. package/dist-client/pages/activity-thread/activity-thread-view-page.js.map +1 -0
  193. package/dist-client/pages/activity-thread/activity-thread-view.d.ts +31 -0
  194. package/dist-client/pages/activity-thread/activity-thread-view.js +134 -0
  195. package/dist-client/pages/activity-thread/activity-thread-view.js.map +1 -0
  196. package/dist-client/pages/activity-thread/thread-sections.d.ts +34 -0
  197. package/dist-client/pages/activity-thread/thread-sections.js +36 -0
  198. package/dist-client/pages/activity-thread/thread-sections.js.map +1 -0
  199. package/dist-client/pages/installable-activity/installable-activity-list-page.d.ts +64 -0
  200. package/dist-client/pages/installable-activity/installable-activity-list-page.js +424 -0
  201. package/dist-client/pages/installable-activity/installable-activity-list-page.js.map +1 -0
  202. package/dist-client/pages/installable-activity/installable-activity-model-item-list.d.ts +1 -0
  203. package/dist-client/pages/installable-activity/installable-activity-model-item-list.js +20 -0
  204. package/dist-client/pages/installable-activity/installable-activity-model-item-list.js.map +1 -0
  205. package/dist-client/pages/todo/approval-done-list-page.d.ts +42 -0
  206. package/dist-client/pages/todo/approval-done-list-page.js +365 -0
  207. package/dist-client/pages/todo/approval-done-list-page.js.map +1 -0
  208. package/dist-client/pages/todo/approval-pending-list-page.d.ts +79 -0
  209. package/dist-client/pages/todo/approval-pending-list-page.js +683 -0
  210. package/dist-client/pages/todo/approval-pending-list-page.js.map +1 -0
  211. package/dist-client/pages/todo/done-list-calendar-page.d.ts +47 -0
  212. package/dist-client/pages/todo/done-list-calendar-page.js +379 -0
  213. package/dist-client/pages/todo/done-list-calendar-page.js.map +1 -0
  214. package/dist-client/pages/todo/draft-list-page.d.ts +64 -0
  215. package/dist-client/pages/todo/draft-list-page.js +404 -0
  216. package/dist-client/pages/todo/draft-list-page.js.map +1 -0
  217. package/dist-client/pages/todo/list-thumbnail.d.ts +25 -0
  218. package/dist-client/pages/todo/list-thumbnail.js +25 -0
  219. package/dist-client/pages/todo/list-thumbnail.js.map +1 -0
  220. package/dist-client/pages/todo/pickable-list-page.d.ts +37 -0
  221. package/dist-client/pages/todo/pickable-list-page.js +271 -0
  222. package/dist-client/pages/todo/pickable-list-page.js.map +1 -0
  223. package/dist-client/pages/todo/todo-list-page.d.ts +66 -0
  224. package/dist-client/pages/todo/todo-list-page.js +503 -0
  225. package/dist-client/pages/todo/todo-list-page.js.map +1 -0
  226. package/dist-client/pages/todo/work-box.d.ts +52 -0
  227. package/dist-client/pages/todo/work-box.js +54 -0
  228. package/dist-client/pages/todo/work-box.js.map +1 -0
  229. package/dist-client/pages/work-door/door-links.d.ts +22 -0
  230. package/dist-client/pages/work-door/door-links.js +20 -0
  231. package/dist-client/pages/work-door/door-links.js.map +1 -0
  232. package/dist-client/pages/work-door/door-sentence.d.ts +75 -0
  233. package/dist-client/pages/work-door/door-sentence.js +107 -0
  234. package/dist-client/pages/work-door/door-sentence.js.map +1 -0
  235. package/dist-client/pages/work-door/door-words.d.ts +48 -0
  236. package/dist-client/pages/work-door/door-words.js +84 -0
  237. package/dist-client/pages/work-door/door-words.js.map +1 -0
  238. package/dist-client/route.d.ts +1 -0
  239. package/dist-client/route.js +77 -0
  240. package/dist-client/route.js.map +1 -0
  241. package/dist-client/templates/activity-approval-context-template.d.ts +3 -0
  242. package/dist-client/templates/activity-approval-context-template.js +105 -0
  243. package/dist-client/templates/activity-approval-context-template.js.map +1 -0
  244. package/dist-client/templates/activity-instance-context-template.d.ts +3 -0
  245. package/dist-client/templates/activity-instance-context-template.js +118 -0
  246. package/dist-client/templates/activity-instance-context-template.js.map +1 -0
  247. package/dist-client/templates/activity-thread-context-template.d.ts +3 -0
  248. package/dist-client/templates/activity-thread-context-template.js +74 -0
  249. package/dist-client/templates/activity-thread-context-template.js.map +1 -0
  250. package/dist-client/templates/context-panel.d.ts +26 -0
  251. package/dist-client/templates/context-panel.js +182 -0
  252. package/dist-client/templates/context-panel.js.map +1 -0
  253. package/dist-client/tsconfig.tsbuildinfo +1 -0
  254. package/dist-client/types/activity-approval.d.ts +36 -0
  255. package/dist-client/types/activity-approval.js +17 -0
  256. package/dist-client/types/activity-approval.js.map +1 -0
  257. package/dist-client/types/activity-instance-type.d.ts +77 -0
  258. package/dist-client/types/activity-instance-type.js +11 -0
  259. package/dist-client/types/activity-instance-type.js.map +1 -0
  260. package/dist-client/types/activity-instance.d.ts +72 -0
  261. package/dist-client/types/activity-instance.js +36 -0
  262. package/dist-client/types/activity-instance.js.map +1 -0
  263. package/dist-client/types/activity-model-type.d.ts +31 -0
  264. package/dist-client/types/activity-model-type.js +18 -0
  265. package/dist-client/types/activity-model-type.js.map +1 -0
  266. package/dist-client/types/activity-search-key-item-type.d.ts +6 -0
  267. package/dist-client/types/activity-search-key-item-type.js +3 -0
  268. package/dist-client/types/activity-search-key-item-type.js.map +1 -0
  269. package/dist-client/types/activity-thread-history.d.ts +28 -0
  270. package/dist-client/types/activity-thread-history.js +7 -0
  271. package/dist-client/types/activity-thread-history.js.map +1 -0
  272. package/dist-client/types/activity-thread-type.d.ts +15 -0
  273. package/dist-client/types/activity-thread-type.js +7 -0
  274. package/dist-client/types/activity-thread-type.js.map +1 -0
  275. package/dist-client/types/activity-thread.d.ts +39 -0
  276. package/dist-client/types/activity-thread.js +18 -0
  277. package/dist-client/types/activity-thread.js.map +1 -0
  278. package/dist-client/types/activity.d.ts +68 -0
  279. package/dist-client/types/activity.js +40 -0
  280. package/dist-client/types/activity.js.map +1 -0
  281. package/dist-client/types/types.d.ts +23 -0
  282. package/dist-client/types/types.js +42 -0
  283. package/dist-client/types/types.js.map +1 -0
  284. package/dist-client/when.d.ts +4 -0
  285. package/dist-client/when.js +72 -0
  286. package/dist-client/when.js.map +1 -0
  287. package/dist-client/work-calendar-sources.d.ts +96 -0
  288. package/dist-client/work-calendar-sources.js +88 -0
  289. package/dist-client/work-calendar-sources.js.map +1 -0
  290. package/dist-server/controllers/activity-approval/_abort.d.ts +5 -0
  291. package/dist-server/controllers/activity-approval/_abort.js +29 -0
  292. package/dist-server/controllers/activity-approval/_abort.js.map +1 -0
  293. package/dist-server/controllers/activity-approval/abort.d.ts +5 -0
  294. package/dist-server/controllers/activity-approval/abort.js +35 -0
  295. package/dist-server/controllers/activity-approval/abort.js.map +1 -0
  296. package/dist-server/controllers/activity-approval/approval-line.d.ts +138 -0
  297. package/dist-server/controllers/activity-approval/approval-line.js +186 -0
  298. package/dist-server/controllers/activity-approval/approval-line.js.map +1 -0
  299. package/dist-server/controllers/activity-approval/approve.d.ts +5 -0
  300. package/dist-server/controllers/activity-approval/approve.js +142 -0
  301. package/dist-server/controllers/activity-approval/approve.js.map +1 -0
  302. package/dist-server/controllers/activity-approval/check-authority.d.ts +8 -0
  303. package/dist-server/controllers/activity-approval/check-authority.js +29 -0
  304. package/dist-server/controllers/activity-approval/check-authority.js.map +1 -0
  305. package/dist-server/controllers/activity-approval/claim.d.ts +42 -0
  306. package/dist-server/controllers/activity-approval/claim.js +77 -0
  307. package/dist-server/controllers/activity-approval/claim.js.map +1 -0
  308. package/dist-server/controllers/activity-approval/create-approval.d.ts +41 -0
  309. package/dist-server/controllers/activity-approval/create-approval.js +85 -0
  310. package/dist-server/controllers/activity-approval/create-approval.js.map +1 -0
  311. package/dist-server/controllers/activity-approval/delegate.d.ts +23 -0
  312. package/dist-server/controllers/activity-approval/delegate.js +113 -0
  313. package/dist-server/controllers/activity-approval/delegate.js.map +1 -0
  314. package/dist-server/controllers/activity-approval/delegation.d.ts +21 -0
  315. package/dist-server/controllers/activity-approval/delegation.js +17 -0
  316. package/dist-server/controllers/activity-approval/delegation.js.map +1 -0
  317. package/dist-server/controllers/activity-approval/opinion.d.ts +10 -0
  318. package/dist-server/controllers/activity-approval/opinion.js +43 -0
  319. package/dist-server/controllers/activity-approval/opinion.js.map +1 -0
  320. package/dist-server/controllers/activity-approval/reject.d.ts +5 -0
  321. package/dist-server/controllers/activity-approval/reject.js +93 -0
  322. package/dist-server/controllers/activity-approval/reject.js.map +1 -0
  323. package/dist-server/controllers/activity-approval/resolve-judgeable-seats.d.ts +21 -0
  324. package/dist-server/controllers/activity-approval/resolve-judgeable-seats.js +60 -0
  325. package/dist-server/controllers/activity-approval/resolve-judgeable-seats.js.map +1 -0
  326. package/dist-server/controllers/activity-approval/save.d.ts +5 -0
  327. package/dist-server/controllers/activity-approval/save.js +56 -0
  328. package/dist-server/controllers/activity-approval/save.js.map +1 -0
  329. package/dist-server/controllers/activity-approval/seat-standing.d.ts +66 -0
  330. package/dist-server/controllers/activity-approval/seat-standing.js +57 -0
  331. package/dist-server/controllers/activity-approval/seat-standing.js.map +1 -0
  332. package/dist-server/controllers/activity-installation/activity-installation-controller.d.ts +79 -0
  333. package/dist-server/controllers/activity-installation/activity-installation-controller.js +99 -0
  334. package/dist-server/controllers/activity-installation/activity-installation-controller.js.map +1 -0
  335. package/dist-server/controllers/activity-installation/call-webhook.d.ts +3 -0
  336. package/dist-server/controllers/activity-installation/call-webhook.js +42 -0
  337. package/dist-server/controllers/activity-installation/call-webhook.js.map +1 -0
  338. package/dist-server/controllers/activity-installation/installable-to-activity.d.ts +77 -0
  339. package/dist-server/controllers/activity-installation/installable-to-activity.js +68 -0
  340. package/dist-server/controllers/activity-installation/installable-to-activity.js.map +1 -0
  341. package/dist-server/controllers/activity-installation/registry-conflict.d.ts +47 -0
  342. package/dist-server/controllers/activity-installation/registry-conflict.js +47 -0
  343. package/dist-server/controllers/activity-installation/registry-conflict.js.map +1 -0
  344. package/dist-server/controllers/activity-instance/abort.d.ts +5 -0
  345. package/dist-server/controllers/activity-instance/abort.js +62 -0
  346. package/dist-server/controllers/activity-instance/abort.js.map +1 -0
  347. package/dist-server/controllers/activity-instance/approval-expectation.d.ts +34 -0
  348. package/dist-server/controllers/activity-instance/approval-expectation.js +18 -0
  349. package/dist-server/controllers/activity-instance/approval-expectation.js.map +1 -0
  350. package/dist-server/controllers/activity-instance/approval-line-input.d.ts +29 -0
  351. package/dist-server/controllers/activity-instance/approval-line-input.js +44 -0
  352. package/dist-server/controllers/activity-instance/approval-line-input.js.map +1 -0
  353. package/dist-server/controllers/activity-instance/assign.d.ts +8 -0
  354. package/dist-server/controllers/activity-instance/assign.js +152 -0
  355. package/dist-server/controllers/activity-instance/assign.js.map +1 -0
  356. package/dist-server/controllers/activity-instance/assignee-input.d.ts +25 -0
  357. package/dist-server/controllers/activity-instance/assignee-input.js +28 -0
  358. package/dist-server/controllers/activity-instance/assignee-input.js.map +1 -0
  359. package/dist-server/controllers/activity-instance/claim-draft.d.ts +17 -0
  360. package/dist-server/controllers/activity-instance/claim-draft.js +30 -0
  361. package/dist-server/controllers/activity-instance/claim-draft.js.map +1 -0
  362. package/dist-server/controllers/activity-instance/discard-draft.d.ts +22 -0
  363. package/dist-server/controllers/activity-instance/discard-draft.js +54 -0
  364. package/dist-server/controllers/activity-instance/discard-draft.js.map +1 -0
  365. package/dist-server/controllers/activity-instance/draft.d.ts +3 -0
  366. package/dist-server/controllers/activity-instance/draft.js +93 -0
  367. package/dist-server/controllers/activity-instance/draft.js.map +1 -0
  368. package/dist-server/controllers/activity-instance/end.d.ts +6 -0
  369. package/dist-server/controllers/activity-instance/end.js +65 -0
  370. package/dist-server/controllers/activity-instance/end.js.map +1 -0
  371. package/dist-server/controllers/activity-instance/entitlement.d.ts +25 -0
  372. package/dist-server/controllers/activity-instance/entitlement.js +110 -0
  373. package/dist-server/controllers/activity-instance/entitlement.js.map +1 -0
  374. package/dist-server/controllers/activity-instance/index.d.ts +6 -0
  375. package/dist-server/controllers/activity-instance/index.js +10 -0
  376. package/dist-server/controllers/activity-instance/index.js.map +1 -0
  377. package/dist-server/controllers/activity-instance/issue.d.ts +3 -0
  378. package/dist-server/controllers/activity-instance/issue.js +272 -0
  379. package/dist-server/controllers/activity-instance/issue.js.map +1 -0
  380. package/dist-server/controllers/activity-instance/pick.d.ts +2 -0
  381. package/dist-server/controllers/activity-instance/pick.js +112 -0
  382. package/dist-server/controllers/activity-instance/pick.js.map +1 -0
  383. package/dist-server/controllers/activity-read/assert-may-read.d.ts +20 -0
  384. package/dist-server/controllers/activity-read/assert-may-read.js +108 -0
  385. package/dist-server/controllers/activity-read/assert-may-read.js.map +1 -0
  386. package/dist-server/controllers/activity-read/participates.d.ts +41 -0
  387. package/dist-server/controllers/activity-read/participates.js +42 -0
  388. package/dist-server/controllers/activity-read/participates.js.map +1 -0
  389. package/dist-server/controllers/activity-thread/_abort.d.ts +5 -0
  390. package/dist-server/controllers/activity-thread/_abort.js +36 -0
  391. package/dist-server/controllers/activity-thread/_abort.js.map +1 -0
  392. package/dist-server/controllers/activity-thread/abort.d.ts +5 -0
  393. package/dist-server/controllers/activity-thread/abort.js +45 -0
  394. package/dist-server/controllers/activity-thread/abort.js.map +1 -0
  395. package/dist-server/controllers/activity-thread/check-authority.d.ts +2 -0
  396. package/dist-server/controllers/activity-thread/check-authority.js +65 -0
  397. package/dist-server/controllers/activity-thread/check-authority.js.map +1 -0
  398. package/dist-server/controllers/activity-thread/delegate.d.ts +7 -0
  399. package/dist-server/controllers/activity-thread/delegate.js +66 -0
  400. package/dist-server/controllers/activity-thread/delegate.js.map +1 -0
  401. package/dist-server/controllers/activity-thread/end.d.ts +6 -0
  402. package/dist-server/controllers/activity-thread/end.js +44 -0
  403. package/dist-server/controllers/activity-thread/end.js.map +1 -0
  404. package/dist-server/controllers/activity-thread/index.d.ts +7 -0
  405. package/dist-server/controllers/activity-thread/index.js +11 -0
  406. package/dist-server/controllers/activity-thread/index.js.map +1 -0
  407. package/dist-server/controllers/activity-thread/restart.d.ts +2 -0
  408. package/dist-server/controllers/activity-thread/restart.js +63 -0
  409. package/dist-server/controllers/activity-thread/restart.js.map +1 -0
  410. package/dist-server/controllers/activity-thread/save.d.ts +3 -0
  411. package/dist-server/controllers/activity-thread/save.js +45 -0
  412. package/dist-server/controllers/activity-thread/save.js.map +1 -0
  413. package/dist-server/controllers/activity-thread/start.d.ts +2 -0
  414. package/dist-server/controllers/activity-thread/start.js +43 -0
  415. package/dist-server/controllers/activity-thread/start.js.map +1 -0
  416. package/dist-server/controllers/activity-thread/submit.d.ts +6 -0
  417. package/dist-server/controllers/activity-thread/submit.js +90 -0
  418. package/dist-server/controllers/activity-thread/submit.js.map +1 -0
  419. package/dist-server/controllers/common.d.ts +34 -0
  420. package/dist-server/controllers/common.js +346 -0
  421. package/dist-server/controllers/common.js.map +1 -0
  422. package/dist-server/controllers/index.d.ts +5 -0
  423. package/dist-server/controllers/index.js +18 -0
  424. package/dist-server/controllers/index.js.map +1 -0
  425. package/dist-server/index.d.ts +6 -0
  426. package/dist-server/index.js +18 -0
  427. package/dist-server/index.js.map +1 -0
  428. package/dist-server/role-tasks.d.ts +2 -0
  429. package/dist-server/role-tasks.js +16 -0
  430. package/dist-server/role-tasks.js.map +1 -0
  431. package/dist-server/routes.d.ts +1 -0
  432. package/dist-server/routes.js +57 -0
  433. package/dist-server/routes.js.map +1 -0
  434. package/dist-server/service/activity/activity-decision-key-item-type.d.ts +206 -0
  435. package/dist-server/service/activity/activity-decision-key-item-type.js +182 -0
  436. package/dist-server/service/activity/activity-decision-key-item-type.js.map +1 -0
  437. package/dist-server/service/activity/activity-history.d.ts +44 -0
  438. package/dist-server/service/activity/activity-history.js +220 -0
  439. package/dist-server/service/activity/activity-history.js.map +1 -0
  440. package/dist-server/service/activity/activity-model-type.d.ts +49 -0
  441. package/dist-server/service/activity/activity-model-type.js +138 -0
  442. package/dist-server/service/activity/activity-model-type.js.map +1 -0
  443. package/dist-server/service/activity/activity-mutation.d.ts +12 -0
  444. package/dist-server/service/activity/activity-mutation.js +416 -0
  445. package/dist-server/service/activity/activity-mutation.js.map +1 -0
  446. package/dist-server/service/activity/activity-query.d.ts +24 -0
  447. package/dist-server/service/activity/activity-query.js +310 -0
  448. package/dist-server/service/activity/activity-query.js.map +1 -0
  449. package/dist-server/service/activity/activity-search-key-item-type.d.ts +6 -0
  450. package/dist-server/service/activity/activity-search-key-item-type.js +28 -0
  451. package/dist-server/service/activity/activity-search-key-item-type.js.map +1 -0
  452. package/dist-server/service/activity/activity-type.d.ts +84 -0
  453. package/dist-server/service/activity/activity-type.js +269 -0
  454. package/dist-server/service/activity/activity-type.js.map +1 -0
  455. package/dist-server/service/activity/activity.d.ts +135 -0
  456. package/dist-server/service/activity/activity.js +328 -0
  457. package/dist-server/service/activity/activity.js.map +1 -0
  458. package/dist-server/service/activity/approval-line-seats.d.ts +12 -0
  459. package/dist-server/service/activity/approval-line-seats.js +68 -0
  460. package/dist-server/service/activity/approval-line-seats.js.map +1 -0
  461. package/dist-server/service/activity/credential-field.d.ts +35 -0
  462. package/dist-server/service/activity/credential-field.js +89 -0
  463. package/dist-server/service/activity/credential-field.js.map +1 -0
  464. package/dist-server/service/activity/decision-key-declaration.d.ts +106 -0
  465. package/dist-server/service/activity/decision-key-declaration.js +181 -0
  466. package/dist-server/service/activity/decision-key-declaration.js.map +1 -0
  467. package/dist-server/service/activity/declaration-guard-subscriber.d.ts +24 -0
  468. package/dist-server/service/activity/declaration-guard-subscriber.js +46 -0
  469. package/dist-server/service/activity/declaration-guard-subscriber.js.map +1 -0
  470. package/dist-server/service/activity/event-subscriber.d.ts +7 -0
  471. package/dist-server/service/activity/event-subscriber.js +21 -0
  472. package/dist-server/service/activity/event-subscriber.js.map +1 -0
  473. package/dist-server/service/activity/freeze-decision-sentences-for.d.ts +11 -0
  474. package/dist-server/service/activity/freeze-decision-sentences-for.js +18 -0
  475. package/dist-server/service/activity/freeze-decision-sentences-for.js.map +1 -0
  476. package/dist-server/service/activity/index.d.ts +9 -0
  477. package/dist-server/service/activity/index.js +13 -0
  478. package/dist-server/service/activity/index.js.map +1 -0
  479. package/dist-server/service/activity/search-key-declaration.d.ts +38 -0
  480. package/dist-server/service/activity/search-key-declaration.js +49 -0
  481. package/dist-server/service/activity/search-key-declaration.js.map +1 -0
  482. package/dist-server/service/activity-approval/activity-approval-mutation.d.ts +8 -0
  483. package/dist-server/service/activity-approval/activity-approval-mutation.js +81 -0
  484. package/dist-server/service/activity-approval/activity-approval-mutation.js.map +1 -0
  485. package/dist-server/service/activity-approval/activity-approval-query.d.ts +42 -0
  486. package/dist-server/service/activity-approval/activity-approval-query.js +391 -0
  487. package/dist-server/service/activity-approval/activity-approval-query.js.map +1 -0
  488. package/dist-server/service/activity-approval/activity-approval-subscription.d.ts +6 -0
  489. package/dist-server/service/activity-approval/activity-approval-subscription.js +39 -0
  490. package/dist-server/service/activity-approval/activity-approval-subscription.js.map +1 -0
  491. package/dist-server/service/activity-approval/activity-approval-type.d.ts +10 -0
  492. package/dist-server/service/activity-approval/activity-approval-type.js +39 -0
  493. package/dist-server/service/activity-approval/activity-approval-type.js.map +1 -0
  494. package/dist-server/service/activity-approval/activity-approval.d.ts +67 -0
  495. package/dist-server/service/activity-approval/activity-approval.js +183 -0
  496. package/dist-server/service/activity-approval/activity-approval.js.map +1 -0
  497. package/dist-server/service/activity-approval/event-subscriber.d.ts +7 -0
  498. package/dist-server/service/activity-approval/event-subscriber.js +46 -0
  499. package/dist-server/service/activity-approval/event-subscriber.js.map +1 -0
  500. package/dist-server/service/activity-approval/index.d.ts +8 -0
  501. package/dist-server/service/activity-approval/index.js +12 -0
  502. package/dist-server/service/activity-approval/index.js.map +1 -0
  503. package/dist-server/service/activity-approval/my-pending-approvals.d.ts +33 -0
  504. package/dist-server/service/activity-approval/my-pending-approvals.js +52 -0
  505. package/dist-server/service/activity-approval/my-pending-approvals.js.map +1 -0
  506. package/dist-server/service/activity-instance/activity-instance-history.d.ts +60 -0
  507. package/dist-server/service/activity-instance/activity-instance-history.js +294 -0
  508. package/dist-server/service/activity-instance/activity-instance-history.js.map +1 -0
  509. package/dist-server/service/activity-instance/activity-instance-mutation.d.ts +16 -0
  510. package/dist-server/service/activity-instance/activity-instance-mutation.js +185 -0
  511. package/dist-server/service/activity-instance/activity-instance-mutation.js.map +1 -0
  512. package/dist-server/service/activity-instance/activity-instance-query.d.ts +27 -0
  513. package/dist-server/service/activity-instance/activity-instance-query.js +386 -0
  514. package/dist-server/service/activity-instance/activity-instance-query.js.map +1 -0
  515. package/dist-server/service/activity-instance/activity-instance-subscription.d.ts +6 -0
  516. package/dist-server/service/activity-instance/activity-instance-subscription.js +39 -0
  517. package/dist-server/service/activity-instance/activity-instance-subscription.js.map +1 -0
  518. package/dist-server/service/activity-instance/activity-instance-type.d.ts +107 -0
  519. package/dist-server/service/activity-instance/activity-instance-type.js +301 -0
  520. package/dist-server/service/activity-instance/activity-instance-type.js.map +1 -0
  521. package/dist-server/service/activity-instance/activity-instance.d.ts +81 -0
  522. package/dist-server/service/activity-instance/activity-instance.js +324 -0
  523. package/dist-server/service/activity-instance/activity-instance.js.map +1 -0
  524. package/dist-server/service/activity-instance/assignee-pool.d.ts +59 -0
  525. package/dist-server/service/activity-instance/assignee-pool.js +99 -0
  526. package/dist-server/service/activity-instance/assignee-pool.js.map +1 -0
  527. package/dist-server/service/activity-instance/draft-list-states.d.ts +39 -0
  528. package/dist-server/service/activity-instance/draft-list-states.js +51 -0
  529. package/dist-server/service/activity-instance/draft-list-states.js.map +1 -0
  530. package/dist-server/service/activity-instance/event-subscriber.d.ts +21 -0
  531. package/dist-server/service/activity-instance/event-subscriber.js +59 -0
  532. package/dist-server/service/activity-instance/event-subscriber.js.map +1 -0
  533. package/dist-server/service/activity-instance/index.d.ts +9 -0
  534. package/dist-server/service/activity-instance/index.js +13 -0
  535. package/dist-server/service/activity-instance/index.js.map +1 -0
  536. package/dist-server/service/activity-instance/request-box.d.ts +2 -0
  537. package/dist-server/service/activity-instance/request-box.js +18 -0
  538. package/dist-server/service/activity-instance/request-box.js.map +1 -0
  539. package/dist-server/service/activity-stats/activity-stats-query.d.ts +9 -0
  540. package/dist-server/service/activity-stats/activity-stats-query.js +230 -0
  541. package/dist-server/service/activity-stats/activity-stats-query.js.map +1 -0
  542. package/dist-server/service/activity-stats/activity-stats-type.d.ts +27 -0
  543. package/dist-server/service/activity-stats/activity-stats-type.js +74 -0
  544. package/dist-server/service/activity-stats/activity-stats-type.js.map +1 -0
  545. package/dist-server/service/activity-stats/event-placement.d.ts +55 -0
  546. package/dist-server/service/activity-stats/event-placement.js +82 -0
  547. package/dist-server/service/activity-stats/event-placement.js.map +1 -0
  548. package/dist-server/service/activity-stats/index.d.ts +2 -0
  549. package/dist-server/service/activity-stats/index.js +6 -0
  550. package/dist-server/service/activity-stats/index.js.map +1 -0
  551. package/dist-server/service/activity-summary/activity-summary-query.d.ts +8 -0
  552. package/dist-server/service/activity-summary/activity-summary-query.js +137 -0
  553. package/dist-server/service/activity-summary/activity-summary-query.js.map +1 -0
  554. package/dist-server/service/activity-summary/activity-summary.d.ts +6 -0
  555. package/dist-server/service/activity-summary/activity-summary.js +28 -0
  556. package/dist-server/service/activity-summary/activity-summary.js.map +1 -0
  557. package/dist-server/service/activity-summary/index.d.ts +5 -0
  558. package/dist-server/service/activity-summary/index.js +9 -0
  559. package/dist-server/service/activity-summary/index.js.map +1 -0
  560. package/dist-server/service/activity-summary/open-work.d.ts +4 -0
  561. package/dist-server/service/activity-summary/open-work.js +51 -0
  562. package/dist-server/service/activity-summary/open-work.js.map +1 -0
  563. package/dist-server/service/activity-summary/person-open-work.d.ts +17 -0
  564. package/dist-server/service/activity-summary/person-open-work.js +68 -0
  565. package/dist-server/service/activity-summary/person-open-work.js.map +1 -0
  566. package/dist-server/service/activity-template/activity-template-history.d.ts +32 -0
  567. package/dist-server/service/activity-template/activity-template-history.js +165 -0
  568. package/dist-server/service/activity-template/activity-template-history.js.map +1 -0
  569. package/dist-server/service/activity-template/activity-template-mutation.d.ts +10 -0
  570. package/dist-server/service/activity-template/activity-template-mutation.js +194 -0
  571. package/dist-server/service/activity-template/activity-template-mutation.js.map +1 -0
  572. package/dist-server/service/activity-template/activity-template-query.d.ts +14 -0
  573. package/dist-server/service/activity-template/activity-template-query.js +112 -0
  574. package/dist-server/service/activity-template/activity-template-query.js.map +1 -0
  575. package/dist-server/service/activity-template/activity-template-type.d.ts +44 -0
  576. package/dist-server/service/activity-template/activity-template-type.js +164 -0
  577. package/dist-server/service/activity-template/activity-template-type.js.map +1 -0
  578. package/dist-server/service/activity-template/activity-template.d.ts +36 -0
  579. package/dist-server/service/activity-template/activity-template.js +154 -0
  580. package/dist-server/service/activity-template/activity-template.js.map +1 -0
  581. package/dist-server/service/activity-template/event-subscriber.d.ts +7 -0
  582. package/dist-server/service/activity-template/event-subscriber.js +21 -0
  583. package/dist-server/service/activity-template/event-subscriber.js.map +1 -0
  584. package/dist-server/service/activity-template/index.d.ts +8 -0
  585. package/dist-server/service/activity-template/index.js +12 -0
  586. package/dist-server/service/activity-template/index.js.map +1 -0
  587. package/dist-server/service/activity-thread/activity-thread-history-query.d.ts +10 -0
  588. package/dist-server/service/activity-thread/activity-thread-history-query.js +69 -0
  589. package/dist-server/service/activity-thread/activity-thread-history-query.js.map +1 -0
  590. package/dist-server/service/activity-thread/activity-thread-history.d.ts +39 -0
  591. package/dist-server/service/activity-thread/activity-thread-history.js +211 -0
  592. package/dist-server/service/activity-thread/activity-thread-history.js.map +1 -0
  593. package/dist-server/service/activity-thread/activity-thread-mutation.d.ts +20 -0
  594. package/dist-server/service/activity-thread/activity-thread-mutation.js +115 -0
  595. package/dist-server/service/activity-thread/activity-thread-mutation.js.map +1 -0
  596. package/dist-server/service/activity-thread/activity-thread-query.d.ts +24 -0
  597. package/dist-server/service/activity-thread/activity-thread-query.js +276 -0
  598. package/dist-server/service/activity-thread/activity-thread-query.js.map +1 -0
  599. package/dist-server/service/activity-thread/activity-thread-subscription.d.ts +6 -0
  600. package/dist-server/service/activity-thread/activity-thread-subscription.js +38 -0
  601. package/dist-server/service/activity-thread/activity-thread-subscription.js.map +1 -0
  602. package/dist-server/service/activity-thread/activity-thread-type.d.ts +15 -0
  603. package/dist-server/service/activity-thread/activity-thread-type.js +50 -0
  604. package/dist-server/service/activity-thread/activity-thread-type.js.map +1 -0
  605. package/dist-server/service/activity-thread/activity-thread.d.ts +47 -0
  606. package/dist-server/service/activity-thread/activity-thread.js +197 -0
  607. package/dist-server/service/activity-thread/activity-thread.js.map +1 -0
  608. package/dist-server/service/activity-thread/event-subscriber.d.ts +13 -0
  609. package/dist-server/service/activity-thread/event-subscriber.js +45 -0
  610. package/dist-server/service/activity-thread/event-subscriber.js.map +1 -0
  611. package/dist-server/service/activity-thread/index.d.ts +10 -0
  612. package/dist-server/service/activity-thread/index.js +14 -0
  613. package/dist-server/service/activity-thread/index.js.map +1 -0
  614. package/dist-server/service/activity-thread/my-open-threads.d.ts +33 -0
  615. package/dist-server/service/activity-thread/my-open-threads.js +85 -0
  616. package/dist-server/service/activity-thread/my-open-threads.js.map +1 -0
  617. package/dist-server/service/activity-thread/todo-order.d.ts +49 -0
  618. package/dist-server/service/activity-thread/todo-order.js +70 -0
  619. package/dist-server/service/activity-thread/todo-order.js.map +1 -0
  620. package/dist-server/service/approval-notice/approval-notice-rules.d.ts +67 -0
  621. package/dist-server/service/approval-notice/approval-notice-rules.js +67 -0
  622. package/dist-server/service/approval-notice/approval-notice-rules.js.map +1 -0
  623. package/dist-server/service/approval-notice/approval-notice.d.ts +11 -0
  624. package/dist-server/service/approval-notice/approval-notice.js +76 -0
  625. package/dist-server/service/approval-notice/approval-notice.js.map +1 -0
  626. package/dist-server/service/index.d.ts +23 -0
  627. package/dist-server/service/index.js +75 -0
  628. package/dist-server/service/index.js.map +1 -0
  629. package/dist-server/service/installable-activity/activity-readiness.d.ts +58 -0
  630. package/dist-server/service/installable-activity/activity-readiness.js +105 -0
  631. package/dist-server/service/installable-activity/activity-readiness.js.map +1 -0
  632. package/dist-server/service/installable-activity/index.d.ts +6 -0
  633. package/dist-server/service/installable-activity/index.js +10 -0
  634. package/dist-server/service/installable-activity/index.js.map +1 -0
  635. package/dist-server/service/installable-activity/installable-activity-mutation.d.ts +11 -0
  636. package/dist-server/service/installable-activity/installable-activity-mutation.js +83 -0
  637. package/dist-server/service/installable-activity/installable-activity-mutation.js.map +1 -0
  638. package/dist-server/service/installable-activity/installable-activity-query.d.ts +22 -0
  639. package/dist-server/service/installable-activity/installable-activity-query.js +127 -0
  640. package/dist-server/service/installable-activity/installable-activity-query.js.map +1 -0
  641. package/dist-server/service/installable-activity/installable-activity-type.d.ts +5 -0
  642. package/dist-server/service/installable-activity/installable-activity-type.js +21 -0
  643. package/dist-server/service/installable-activity/installable-activity-type.js.map +1 -0
  644. package/dist-server/service/installable-activity/installable-activity.d.ts +92 -0
  645. package/dist-server/service/installable-activity/installable-activity.js +140 -0
  646. package/dist-server/service/installable-activity/installable-activity.js.map +1 -0
  647. package/dist-server/service/nulls-last.d.ts +30 -0
  648. package/dist-server/service/nulls-last.js +37 -0
  649. package/dist-server/service/nulls-last.js.map +1 -0
  650. package/dist-server/service/subscription/roles-of.d.ts +9 -0
  651. package/dist-server/service/subscription/roles-of.js +17 -0
  652. package/dist-server/service/subscription/roles-of.js.map +1 -0
  653. package/dist-server/service/subscription/subscription-filters.d.ts +47 -0
  654. package/dist-server/service/subscription/subscription-filters.js +57 -0
  655. package/dist-server/service/subscription/subscription-filters.js.map +1 -0
  656. package/dist-server/service/work-door/activity-lookup.d.ts +70 -0
  657. package/dist-server/service/work-door/activity-lookup.js +110 -0
  658. package/dist-server/service/work-door/activity-lookup.js.map +1 -0
  659. package/dist-server/service/work-door/approval-line-standing.d.ts +106 -0
  660. package/dist-server/service/work-door/approval-line-standing.js +65 -0
  661. package/dist-server/service/work-door/approval-line-standing.js.map +1 -0
  662. package/dist-server/service/work-door/index.d.ts +15 -0
  663. package/dist-server/service/work-door/index.js +20 -0
  664. package/dist-server/service/work-door/index.js.map +1 -0
  665. package/dist-server/service/work-door/pass-work-door.d.ts +74 -0
  666. package/dist-server/service/work-door/pass-work-door.js +45 -0
  667. package/dist-server/service/work-door/pass-work-door.js.map +1 -0
  668. package/dist-server/service/work-door/work-door-declaration.d.ts +135 -0
  669. package/dist-server/service/work-door/work-door-declaration.js +87 -0
  670. package/dist-server/service/work-door/work-door-declaration.js.map +1 -0
  671. package/dist-server/service/work-door/work-door-event.d.ts +20 -0
  672. package/dist-server/service/work-door/work-door-event.js +25 -0
  673. package/dist-server/service/work-door/work-door-event.js.map +1 -0
  674. package/dist-server/service/work-door/work-door-journal-service.d.ts +47 -0
  675. package/dist-server/service/work-door/work-door-journal-service.js +75 -0
  676. package/dist-server/service/work-door/work-door-journal-service.js.map +1 -0
  677. package/dist-server/service/work-door/work-door-journal.d.ts +30 -0
  678. package/dist-server/service/work-door/work-door-journal.js +94 -0
  679. package/dist-server/service/work-door/work-door-journal.js.map +1 -0
  680. package/dist-server/service/work-door/work-door-not-used.d.ts +39 -0
  681. package/dist-server/service/work-door/work-door-not-used.js +86 -0
  682. package/dist-server/service/work-door/work-door-not-used.js.map +1 -0
  683. package/dist-server/service/work-door/work-door-resolver.d.ts +32 -0
  684. package/dist-server/service/work-door/work-door-resolver.js +152 -0
  685. package/dist-server/service/work-door/work-door-resolver.js.map +1 -0
  686. package/dist-server/service/work-door/work-door-service.d.ts +36 -0
  687. package/dist-server/service/work-door/work-door-service.js +127 -0
  688. package/dist-server/service/work-door/work-door-service.js.map +1 -0
  689. package/dist-server/service/work-door/work-door-type.d.ts +88 -0
  690. package/dist-server/service/work-door/work-door-type.js +206 -0
  691. package/dist-server/service/work-door/work-door-type.js.map +1 -0
  692. package/dist-server/service/work-door/work-door.d.ts +187 -0
  693. package/dist-server/service/work-door/work-door.js +119 -0
  694. package/dist-server/service/work-door/work-door.js.map +1 -0
  695. package/dist-server/tsconfig.tsbuildinfo +1 -0
  696. package/package.json +2 -2
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TERMINATED_JUDGMENTS = exports.FIRST_ORDER = void 0;
4
+ exports.isApprovalStep = isApprovalStep;
5
+ exports.isReferenceStep = isReferenceStep;
6
+ exports.lineItemFor = lineItemFor;
7
+ exports.firstApprovalOrder = firstApprovalOrder;
8
+ exports.referenceSteps = referenceSteps;
9
+ exports.referencesToNotify = referencesToNotify;
10
+ exports.nextApproval = nextApproval;
11
+ exports.isLastApproval = isLastApproval;
12
+ exports.needsApproval = needsApproval;
13
+ exports.isApproved = isApproved;
14
+ exports.isTerminated = isTerminated;
15
+ exports.isReferenceOrder = isReferenceOrder;
16
+ /**
17
+ * 결재선에서 다음 결재자를 찾는다.
18
+ *
19
+ * ── 왜 따로 뺐나 ───────────────────────────────────────────────────────────
20
+ * 같은 규칙이 두 파일에 나뉘어 있었다.
21
+ *
22
+ * submit.ts 첫 결재를 `order: 1` 로 만들고 `approvalLine[0]` 을 넣는다
23
+ * approve.ts `order` 를 승인하면 `approvalLine[order]` 를 다음 결재자로 삼는다
24
+ *
25
+ * `order` 와 배열 자리가 1만큼 다르다. 지금은 맞게 짝이 맞는데, 한쪽만 고치면 결재자가 한 명 빠지거나
26
+ * 같은 사람이 두 번 들어간다. 그리고 **오류가 안 난다** — 결재가 다 끝나고 나서야 안다.
27
+ *
28
+ * 그래서 한 자리에 적고 양쪽이 이것을 부른다.
29
+ *
30
+ * `order` 는 사람이 세는 수다 — 1차 결재, 2차 결재. 배열은 0부터이므로 그 차이를 여기서만 다룬다.
31
+ */
32
+ /**
33
+ * 이 항목이 **결재**인가 — 비어 있으면 결재다.
34
+ *
35
+ * 지금 도는 결재선에는 이 칸이 없다(gangsters·dataset·quotation·accounting). 그 항목들이 전부 결재자로
36
+ * 읽혀야 거동이 안 바뀐다. 그래서 「참조라고 적힌 것만 참조」다.
37
+ */
38
+ function isApprovalStep(item) {
39
+ return !!item && item.participation !== 'reference';
40
+ }
41
+ /** 이 항목이 참조인가 — 의견만 내고 결재를 막지 않는다. */
42
+ function isReferenceStep(item) {
43
+ return !!item && item.participation === 'reference';
44
+ }
45
+ /**
46
+ * 이 차례의 결재자는 결재선의 어느 줄인가. `order` 는 1부터.
47
+ *
48
+ * **참조 항목도 자리를 차지한다.** `order` 는 배열 자리 그대로다 — 다시 매기면 이미 쌓인 행의 뜻이
49
+ * 바뀐다. 그래서 결재자의 차례가 1·3·4 처럼 띄엄띄엄해질 수 있고, 그것이 맞다.
50
+ *
51
+ * 이 함수는 그 자리에 무엇이 있든 돌려준다. 결재인지 아닌지는 부르는 쪽이 본다(§`nextApproval`).
52
+ */
53
+ function lineItemFor(approvalLine, order) {
54
+ if (!approvalLine?.length || order < 1) {
55
+ return undefined;
56
+ }
57
+ return approvalLine[order - 1];
58
+ }
59
+ /**
60
+ * 첫 **결재자**는 몇 번째 자리인가 — 앞에 참조가 있으면 건너뛴다.
61
+ *
62
+ * 결재선이 참조로만 이루어져 있으면 `undefined` 다. 그때는 결재 없이 끝난다(§`needsApproval`).
63
+ */
64
+ function firstApprovalOrder(approvalLine) {
65
+ if (!approvalLine?.length)
66
+ return undefined;
67
+ const index = approvalLine.findIndex(isApprovalStep);
68
+ return index < 0 ? undefined : index + 1;
69
+ }
70
+ /**
71
+ * 이 결재선의 참조들 — **언제 알릴지와 함께.**
72
+ *
73
+ * `notifyAfter` 가 없으면 `0` 으로 답한다. 0 은 「상신 즉시」다 — 아직 아무 결재도 끝나지 않은 시점.
74
+ */
75
+ function referenceSteps(approvalLine) {
76
+ if (!approvalLine?.length)
77
+ return [];
78
+ return approvalLine
79
+ .map((item, index) => ({ item, order: index + 1, notifyAfter: Number(item.notifyAfter ?? 0) || 0 }))
80
+ .filter(x => isReferenceStep(x.item));
81
+ }
82
+ /** 이번에 알려야 할 참조들 — `afterOrder` 번째 결재가 막 끝났을 때. 상신 직후는 `0`. */
83
+ function referencesToNotify(approvalLine, afterOrder) {
84
+ return referenceSteps(approvalLine)
85
+ .filter(x => x.notifyAfter === afterOrder)
86
+ .map(({ item, order }) => ({ item, order }));
87
+ }
88
+ /** 첫 결재의 차례. */
89
+ exports.FIRST_ORDER = 1;
90
+ /**
91
+ * 이 차례를 승인하면 다음 결재자가 있나. 없으면 이것이 마지막이다.
92
+ *
93
+ * **참조는 건너뛴다.** 참조자가 아직 안 읽었어도 결재는 다음 결재자로 넘어간다 — 막게 만들면 그 사람이
94
+ * 휴가일 때 결재가 선다. 막아야 하는 자격은 합의이고, 그것은 아직 없다.
95
+ */
96
+ function nextApproval(approvalLine, order) {
97
+ if (!approvalLine?.length)
98
+ return undefined;
99
+ for (let next = order + 1; next <= approvalLine.length; next++) {
100
+ const item = lineItemFor(approvalLine, next);
101
+ if (isApprovalStep(item))
102
+ return { item: item, order: next };
103
+ }
104
+ return undefined;
105
+ }
106
+ /** 이 차례가 마지막인가. */
107
+ function isLastApproval(approvalLine, order) {
108
+ return !nextApproval(approvalLine, order);
109
+ }
110
+ /**
111
+ * 결재가 필요한가 — **결재자가 하나라도 있어야 한다.**
112
+ *
113
+ * 비어 있으면 결재 없이 끝난다. 그리고 **참조만 있는 결재선도 결재 없이 끝난다** — 참조는 막지 않으므로
114
+ * 기다릴 것이 없다. 참조가 있다고 결재를 기다리게 하면, 그 사람이 승인 권한도 없이 결재를 세운다.
115
+ */
116
+ function needsApproval(approvalLine) {
117
+ return firstApprovalOrder(approvalLine) !== undefined;
118
+ }
119
+ /**
120
+ * 이 판정이 「승인했다」인가.
121
+ *
122
+ * ── 옛 표기를 여기서 흡수한다 ──────────────────────────────────────────────
123
+ * 2026-08-31 전에는 다음 결재자가 있으면 승인을 `escalated` 로 적었다. **그 행은 고치지 않는다** —
124
+ * 승인 기록을 뒤에서 고쳐 쓰는 것은 규제 산업이 금지하는 바로 그 행위다.
125
+ *
126
+ * 대신 읽는 자리 하나에서 옛 표기를 새 뜻으로 읽는다. 이 규율이 두 곳으로 늘어나면 한쪽만 고쳐지는
127
+ * 날이 온다. 「승인했나」를 묻는 코드는 전부 이것을 부른다.
128
+ */
129
+ function isApproved(judgment) {
130
+ return judgment === 'approved' || judgment === 'escalated';
131
+ }
132
+ /**
133
+ * 더 기다릴 것이 없는 판정들 — **목록 질의와 이 파일이 같은 값을 본다.**
134
+ *
135
+ * 목록 질의가 이 배열을 그대로 쓴다. 두 벌로 두면 값이 늘 때 한쪽만 늘고, 그 판정을 받은 행이 대기
136
+ * 목록에 영원히 남는다 — 실제로 그렇게 됐다(아래).
137
+ */
138
+ exports.TERMINATED_JUDGMENTS = ['approved', 'escalated', 'delegated', 'rejected', 'aborted', 'closed'];
139
+ /**
140
+ * 이 판정이 끝난 것인가 — 더 기다릴 것이 없나.
141
+ *
142
+ * ── `aborted` 가 빠져 있었다 (2026-09-01) ─────────────────────────────────
143
+ * 스레드를 중단하면 그 스레드의 대기 결재가 `aborted` 로 닫힌다(§`activity-thread/_abort.ts`).
144
+ * 그런데 **목록 질의도 이 함수도 그 값을 「끝난 것」으로 세지 않았다.**
145
+ *
146
+ * 그래서 중단된 건의 결재가 그 사람의 **승인 대기 목록에 영원히 남았다.** 눌러 봐야 이미 끝난 건이고,
147
+ * 목록에서 사라지지도 않는다. 닫는 쪽은 제대로 닫았는데 읽는 쪽이 그것을 못 읽었다.
148
+ */
149
+ function isTerminated(judgment) {
150
+ return exports.TERMINATED_JUDGMENTS.includes(judgment ?? '');
151
+ }
152
+ /**
153
+ * Is the seat at this turn declared as a **reference** — someone who comments but does not decide?
154
+ *
155
+ * ── Why this is a function and not two inline calls ────────────────────────
156
+ * ApprovalParticipation has said from the start that a reference only comments and does not affect
157
+ * the judgment. create-approval, the escalation in approve(), and both list queries honour that.
158
+ * The two places where a person presses a button did not: approve() and reject() never asked whether
159
+ * the row they are about to stamp is an approver's row.
160
+ *
161
+ * A reference row is created with judgment Pending, so it passes every check those two functions do
162
+ * make. Approving one stamps it as a real approval and then nextApproval() picks the approver that
163
+ * sits *after* that seat, which moves the approval a step forward. With no approver after it, one
164
+ * reference ends the whole thread. Rejecting is worse: an activity with rejectionIsFinal cannot be
165
+ * restarted, so the case closes for good.
166
+ *
167
+ * Writing the check inline in both callers would put the rule back in two places, which is the
168
+ * reason this file exists.
169
+ *
170
+ * ── The approval line is the authority, not the row ───────────────────────
171
+ * The capacity is also copied onto ActivityApproval.participation. approve() already lets the
172
+ * approval line decide who comes next (nextApproval(approvalLine, order)); letting the row decide
173
+ * who may judge would put two authorities in one function, with nothing to settle a disagreement.
174
+ * The line is loaded either way, so this costs no extra read. (2026-09-09, architect's ruling)
175
+ *
176
+ * ── False when the seat is not in the line ────────────────────────────────
177
+ * That answers "not declared a reference", which is not the same as "is an approver". One boolean
178
+ * cannot carry both facts, so this function reports only what is written down and the caller
179
+ * refuses on a definite yes. A missing seat means the line grew shorter after submission; telling
180
+ * that person they are a reference would state something the data does not say. Whether the line
181
+ * can be edited after submission is being measured separately.
182
+ */
183
+ function isReferenceOrder(approvalLine, order) {
184
+ return isReferenceStep(lineItemFor(approvalLine, order));
185
+ }
186
+ //# sourceMappingURL=approval-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-line.js","sourceRoot":"","sources":["../../../server/controllers/activity-approval/approval-line.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * **타입만 가져온다.** 값으로 가져오면 `@things-factory/organization` 이 실려 오고, 그것이 auth-base 의\n * 라우터까지 끌고 온다. 순수 규칙 하나를 시험하려는데 서버가 통째로 뜬다.\n */\nimport type { ApprovalLineItem } from '@things-factory/organization'\n\n/**\n * 결재선에서 다음 결재자를 찾는다.\n *\n * ── 왜 따로 뺐나 ───────────────────────────────────────────────────────────\n * 같은 규칙이 두 파일에 나뉘어 있었다.\n *\n * submit.ts 첫 결재를 `order: 1` 로 만들고 `approvalLine[0]` 을 넣는다\n * approve.ts `order` 를 승인하면 `approvalLine[order]` 를 다음 결재자로 삼는다\n *\n * `order` 와 배열 자리가 1만큼 다르다. 지금은 맞게 짝이 맞는데, 한쪽만 고치면 결재자가 한 명 빠지거나\n * 같은 사람이 두 번 들어간다. 그리고 **오류가 안 난다** — 결재가 다 끝나고 나서야 안다.\n *\n * 그래서 한 자리에 적고 양쪽이 이것을 부른다.\n *\n * `order` 는 사람이 세는 수다 — 1차 결재, 2차 결재. 배열은 0부터이므로 그 차이를 여기서만 다룬다.\n */\n\n/**\n * 이 항목이 **결재**인가 — 비어 있으면 결재다.\n *\n * 지금 도는 결재선에는 이 칸이 없다(gangsters·dataset·quotation·accounting). 그 항목들이 전부 결재자로\n * 읽혀야 거동이 안 바뀐다. 그래서 「참조라고 적힌 것만 참조」다.\n */\nexport function isApprovalStep(item: ApprovalLineItem | undefined): boolean {\n return !!item && (item as any).participation !== 'reference'\n}\n\n/** 이 항목이 참조인가 — 의견만 내고 결재를 막지 않는다. */\nexport function isReferenceStep(item: ApprovalLineItem | undefined): boolean {\n return !!item && (item as any).participation === 'reference'\n}\n\n/**\n * 이 차례의 결재자는 결재선의 어느 줄인가. `order` 는 1부터.\n *\n * **참조 항목도 자리를 차지한다.** `order` 는 배열 자리 그대로다 — 다시 매기면 이미 쌓인 행의 뜻이\n * 바뀐다. 그래서 결재자의 차례가 1·3·4 처럼 띄엄띄엄해질 수 있고, 그것이 맞다.\n *\n * 이 함수는 그 자리에 무엇이 있든 돌려준다. 결재인지 아닌지는 부르는 쪽이 본다(§`nextApproval`).\n */\nexport function lineItemFor(approvalLine: ApprovalLineItem[] | undefined, order: number): ApprovalLineItem | undefined {\n if (!approvalLine?.length || order < 1) {\n return undefined\n }\n\n return approvalLine[order - 1]\n}\n\n/**\n * 첫 **결재자**는 몇 번째 자리인가 — 앞에 참조가 있으면 건너뛴다.\n *\n * 결재선이 참조로만 이루어져 있으면 `undefined` 다. 그때는 결재 없이 끝난다(§`needsApproval`).\n */\nexport function firstApprovalOrder(approvalLine: ApprovalLineItem[] | undefined): number | undefined {\n if (!approvalLine?.length) return undefined\n\n const index = approvalLine.findIndex(isApprovalStep)\n return index < 0 ? undefined : index + 1\n}\n\n/**\n * 이 결재선의 참조들 — **언제 알릴지와 함께.**\n *\n * `notifyAfter` 가 없으면 `0` 으로 답한다. 0 은 「상신 즉시」다 — 아직 아무 결재도 끝나지 않은 시점.\n */\nexport function referenceSteps(\n approvalLine: ApprovalLineItem[] | undefined\n): { item: ApprovalLineItem; order: number; notifyAfter: number }[] {\n if (!approvalLine?.length) return []\n\n return approvalLine\n .map((item, index) => ({ item, order: index + 1, notifyAfter: Number((item as any).notifyAfter ?? 0) || 0 }))\n .filter(x => isReferenceStep(x.item))\n}\n\n/** 이번에 알려야 할 참조들 — `afterOrder` 번째 결재가 막 끝났을 때. 상신 직후는 `0`. */\nexport function referencesToNotify(\n approvalLine: ApprovalLineItem[] | undefined,\n afterOrder: number\n): { item: ApprovalLineItem; order: number }[] {\n return referenceSteps(approvalLine)\n .filter(x => x.notifyAfter === afterOrder)\n .map(({ item, order }) => ({ item, order }))\n}\n\n/** 첫 결재의 차례. */\nexport const FIRST_ORDER = 1\n\n/**\n * 이 차례를 승인하면 다음 결재자가 있나. 없으면 이것이 마지막이다.\n *\n * **참조는 건너뛴다.** 참조자가 아직 안 읽었어도 결재는 다음 결재자로 넘어간다 — 막게 만들면 그 사람이\n * 휴가일 때 결재가 선다. 막아야 하는 자격은 합의이고, 그것은 아직 없다.\n */\nexport function nextApproval(\n approvalLine: ApprovalLineItem[] | undefined,\n order: number\n): { item: ApprovalLineItem; order: number } | undefined {\n if (!approvalLine?.length) return undefined\n\n for (let next = order + 1; next <= approvalLine.length; next++) {\n const item = lineItemFor(approvalLine, next)\n if (isApprovalStep(item)) return { item: item!, order: next }\n }\n\n return undefined\n}\n\n/** 이 차례가 마지막인가. */\nexport function isLastApproval(approvalLine: ApprovalLineItem[] | undefined, order: number): boolean {\n return !nextApproval(approvalLine, order)\n}\n\n/**\n * 결재가 필요한가 — **결재자가 하나라도 있어야 한다.**\n *\n * 비어 있으면 결재 없이 끝난다. 그리고 **참조만 있는 결재선도 결재 없이 끝난다** — 참조는 막지 않으므로\n * 기다릴 것이 없다. 참조가 있다고 결재를 기다리게 하면, 그 사람이 승인 권한도 없이 결재를 세운다.\n */\nexport function needsApproval(approvalLine: ApprovalLineItem[] | undefined): boolean {\n return firstApprovalOrder(approvalLine) !== undefined\n}\n\n/**\n * 이 판정이 「승인했다」인가.\n *\n * ── 옛 표기를 여기서 흡수한다 ──────────────────────────────────────────────\n * 2026-08-31 전에는 다음 결재자가 있으면 승인을 `escalated` 로 적었다. **그 행은 고치지 않는다** —\n * 승인 기록을 뒤에서 고쳐 쓰는 것은 규제 산업이 금지하는 바로 그 행위다.\n *\n * 대신 읽는 자리 하나에서 옛 표기를 새 뜻으로 읽는다. 이 규율이 두 곳으로 늘어나면 한쪽만 고쳐지는\n * 날이 온다. 「승인했나」를 묻는 코드는 전부 이것을 부른다.\n */\nexport function isApproved(judgment: string | undefined): boolean {\n return judgment === 'approved' || judgment === 'escalated'\n}\n\n/**\n * 더 기다릴 것이 없는 판정들 — **목록 질의와 이 파일이 같은 값을 본다.**\n *\n * 목록 질의가 이 배열을 그대로 쓴다. 두 벌로 두면 값이 늘 때 한쪽만 늘고, 그 판정을 받은 행이 대기\n * 목록에 영원히 남는다 — 실제로 그렇게 됐다(아래).\n */\nexport const TERMINATED_JUDGMENTS = ['approved', 'escalated', 'delegated', 'rejected', 'aborted', 'closed'] as const\n\n/**\n * 이 판정이 끝난 것인가 — 더 기다릴 것이 없나.\n *\n * ── `aborted` 가 빠져 있었다 (2026-09-01) ─────────────────────────────────\n * 스레드를 중단하면 그 스레드의 대기 결재가 `aborted` 로 닫힌다(§`activity-thread/_abort.ts`).\n * 그런데 **목록 질의도 이 함수도 그 값을 「끝난 것」으로 세지 않았다.**\n *\n * 그래서 중단된 건의 결재가 그 사람의 **승인 대기 목록에 영원히 남았다.** 눌러 봐야 이미 끝난 건이고,\n * 목록에서 사라지지도 않는다. 닫는 쪽은 제대로 닫았는데 읽는 쪽이 그것을 못 읽었다.\n */\nexport function isTerminated(judgment: string | undefined): boolean {\n return (TERMINATED_JUDGMENTS as readonly string[]).includes(judgment ?? '')\n}\n\n/**\n * Is the seat at this turn declared as a **reference** — someone who comments but does not decide?\n *\n * ── Why this is a function and not two inline calls ────────────────────────\n * ApprovalParticipation has said from the start that a reference only comments and does not affect\n * the judgment. create-approval, the escalation in approve(), and both list queries honour that.\n * The two places where a person presses a button did not: approve() and reject() never asked whether\n * the row they are about to stamp is an approver's row.\n *\n * A reference row is created with judgment Pending, so it passes every check those two functions do\n * make. Approving one stamps it as a real approval and then nextApproval() picks the approver that\n * sits *after* that seat, which moves the approval a step forward. With no approver after it, one\n * reference ends the whole thread. Rejecting is worse: an activity with rejectionIsFinal cannot be\n * restarted, so the case closes for good.\n *\n * Writing the check inline in both callers would put the rule back in two places, which is the\n * reason this file exists.\n *\n * ── The approval line is the authority, not the row ───────────────────────\n * The capacity is also copied onto ActivityApproval.participation. approve() already lets the\n * approval line decide who comes next (nextApproval(approvalLine, order)); letting the row decide\n * who may judge would put two authorities in one function, with nothing to settle a disagreement.\n * The line is loaded either way, so this costs no extra read. (2026-09-09, architect's ruling)\n *\n * ── False when the seat is not in the line ────────────────────────────────\n * That answers \"not declared a reference\", which is not the same as \"is an approver\". One boolean\n * cannot carry both facts, so this function reports only what is written down and the caller\n * refuses on a definite yes. A missing seat means the line grew shorter after submission; telling\n * that person they are a reference would state something the data does not say. Whether the line\n * can be edited after submission is being measured separately.\n */\nexport function isReferenceOrder(approvalLine: ApprovalLineItem[] | undefined, order: number): boolean {\n return isReferenceStep(lineItemFor(approvalLine, order))\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { ActivityApproval } from '../../service/activity-approval/activity-approval.js';
2
+ export declare function approve({ id, comment }: {
3
+ id: string;
4
+ comment: string;
5
+ }, context: ResolverContext): Promise<ActivityApproval>;
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.approve = approve;
4
+ const opinion_js_1 = require("./opinion.js");
5
+ const activity_thread_js_1 = require("../../service/activity-thread/activity-thread.js");
6
+ const activity_approval_js_1 = require("../../service/activity-approval/activity-approval.js");
7
+ const common_js_1 = require("../common.js");
8
+ const check_authority_js_1 = require("./check-authority.js");
9
+ const approval_line_js_1 = require("./approval-line.js");
10
+ const create_approval_js_1 = require("./create-approval.js");
11
+ const claim_js_1 = require("./claim.js");
12
+ const approval_notice_js_1 = require("../../service/approval-notice/approval-notice.js");
13
+ async function approve({ id, comment }, context) {
14
+ const { domain, user, tx } = context.state;
15
+ var repository = tx.getRepository(activity_approval_js_1.ActivityApproval);
16
+ var activityApproval = await repository.findOne({
17
+ where: { domain: { id: domain.id }, id }
18
+ });
19
+ if (!activityApproval) {
20
+ throw new Error(context.t('error.activity-approval not found', {
21
+ activityApproval: id
22
+ }));
23
+ }
24
+ await (0, check_authority_js_1.checkAuthority)(activityApproval, context);
25
+ /*
26
+ Prerequisite of Approval
27
+ - Previous judgment should be 'pending'
28
+ */
29
+ if (activityApproval.judgment !== activity_approval_js_1.ActivityApprovalJudgment.Pending) {
30
+ throw new Error(context.t(`error.activity-approval is already terminated`, {
31
+ activityApproval: id,
32
+ actual: activityApproval.judgment
33
+ }));
34
+ }
35
+ var activityThread = await tx.getRepository(activity_thread_js_1.ActivityThread).findOne({
36
+ where: { domain: { id: domain.id }, id: activityApproval.activityThreadId },
37
+ relations: ['activityInstance']
38
+ });
39
+ /*
40
+ * 여기까지 오면 스레드가 있어야 한다. 없는 채로 아래를 읽으면 `TypeError` 가 나고, 그 오류로는
41
+ * 무엇이 없는지 알 수 없다.
42
+ */
43
+ if (!activityThread) {
44
+ throw new Error(context.t('error.activity-thread not found', { activityThread: activityApproval.activityThreadId }));
45
+ }
46
+ if (!activityThread.activityInstance) {
47
+ throw new Error(context.t('error.activity-instance not found', { activityThread: activityThread.id }));
48
+ }
49
+ const approvalLine = activityThread.activityInstance.approvalLine;
50
+ const order = activityApproval.order;
51
+ /*
52
+ * A reference does not judge.
53
+ *
54
+ * The three checks above all pass for a reference row: it exists, checkAuthority says it belongs
55
+ * to this user, and its judgment is still Pending. Without this refusal the approval is recorded
56
+ * as real and nextApproval() then picks the approver sitting after that seat, moving the approval
57
+ * a step forward; with no approver after it, one reference ends the thread.
58
+ *
59
+ * This stands before claimPendingApproval, the first write. Throwing after the claim would leave
60
+ * the row already stamped with a judgment.
61
+ *
62
+ * The message says what this person can do instead of reporting a missing permission. A reference
63
+ * seat is a different seat, not a blocked one — comments are theirs to leave.
64
+ */
65
+ if ((0, approval_line_js_1.isReferenceOrder)(approvalLine, order)) {
66
+ throw new Error(context.t('error.activity-approval is reference only'));
67
+ }
68
+ /* 다음 결재자가 누구인지는 한 자리가 정한다 — `approval-line.ts`. */
69
+ const next = (0, approval_line_js_1.nextApproval)(approvalLine, order);
70
+ /*
71
+ * **여기서 잡는다.** 위의 검사는 읽은 시점의 것이라 그 사이에 남이 처리할 수 있다. 잡기가 첫 쓰기여야
72
+ * 진 쪽이 다음 결재자를 만들기 전에 물러난다.
73
+ */
74
+ if (!(await (0, claim_js_1.claimPendingApproval)(tx, activityApproval, activity_approval_js_1.ActivityApprovalJudgment.Approved))) {
75
+ /* 「이미 끝났다」보다 **그 사람이 할 일**을 말한다 — 목록을 새로 읽으면 지금 상태가 보인다. */
76
+ throw new Error(context.t('error.activity-approval taken by someone else', { activityApproval: id }));
77
+ }
78
+ /*
79
+ * **승인한 사람은 승인한 것이다** (2026-08-31, 아키텍트 확인).
80
+ *
81
+ * 앞서는 다음 결재자가 있으면 `Escalated` 로 적었다. 그러면 「누가 승인했나」를 물을 때 중간 결재자가
82
+ * 전부 「상신함」으로 나오고, **승인한 것과 그냥 넘긴 것이 구별되지 않는다.** 규제 산업에서는 결재
83
+ * 이력이 곧 근거라 이것이 결함이다.
84
+ *
85
+ * 다음으로 넘어간 사실은 `transaction` 이 그대로 들고 있으므로 잃는 것이 없다.
86
+ */
87
+ const result = await tx.getRepository(activity_approval_js_1.ActivityApproval).save({
88
+ ...activityApproval,
89
+ judgment: activity_approval_js_1.ActivityApprovalJudgment.Approved,
90
+ ...(0, opinion_js_1.stampedComment)(comment),
91
+ transaction: next ? 'escalate' : 'approve',
92
+ /*
93
+ * **누가 처리했는지 남긴다.**
94
+ *
95
+ * 역할로 걸린 결재는 `approver` 가 비어 있고 `approverRole` 만 있다. 처리해도 그 자리가 비어 있으면
96
+ * 두 가지가 함께 무너진다 — 그 역할을 가진 사람들의 **대기 목록에 영원히 남고**(`approver IS NULL`
97
+ * 로 걸리므로), 정작 처리한 사람의 **완료 목록에는 안 나온다**(`approver = 나` 로 거르므로).
98
+ *
99
+ * 그리고 결재 이력에서 「누가 승인했나」는 역할이 아니라 사람이어야 한다.
100
+ */
101
+ approver: activityApproval.approver ?? user,
102
+ updater: user,
103
+ terminatedAt: new Date(),
104
+ terminator: user
105
+ });
106
+ /*
107
+ * **이번 결재가 끝나서 알릴 참조들.** `notifyAfter` 가 이 차례를 가리키는 참조가 여기 온다.
108
+ *
109
+ * 다음 결재자를 세우는 것과 **무관하게** 만든다 — 참조는 막지 않으므로, 이것이 실패해도 결재는 간다.
110
+ */
111
+ const refs = await (0, create_approval_js_1.createReferences)({ references: (0, approval_line_js_1.referencesToNotify)(approvalLine, order), activityThread }, context);
112
+ for (const f of refs.failed) {
113
+ console.warn(`[worklist] 참조자를 세우지 못했다 (결재선 ${f.order}번째) — ${f.reason}`);
114
+ }
115
+ if (next) {
116
+ /* 다음 결재자에게 넘긴다 — 행을 만드는 자리는 한 곳이다(§`create-approval.ts`). */
117
+ await (0, create_approval_js_1.createApproval)({ item: next.item, order: next.order, participation: 'approval', activityThread, transaction: 'escalate' }, context);
118
+ activityThread = await tx.getRepository(activity_thread_js_1.ActivityThread).save({
119
+ ...activityThread,
120
+ transaction: 'escalate',
121
+ reason: comment,
122
+ state: activity_thread_js_1.ActivityThreadStatus.Escalated,
123
+ updater: user
124
+ });
125
+ }
126
+ else {
127
+ activityThread = await tx.getRepository(activity_thread_js_1.ActivityThread).save({
128
+ ...activityThread,
129
+ transaction: 'approve',
130
+ reason: comment,
131
+ state: activity_thread_js_1.ActivityThreadStatus.Ended,
132
+ terminatedAt: new Date(),
133
+ terminator: user,
134
+ updater: user
135
+ });
136
+ /* The last approval ended it - the requester is told (ADR-0164). The next approver's turn is told where its row is made. */
137
+ await (0, approval_notice_js_1.noticeApproval)(context, { kind: 'approved', approvalId: result.id });
138
+ }
139
+ await (0, common_js_1.updateActivityInstanceState)(activityThread.activityInstanceId, { causedBy: [activityThread] }, context);
140
+ return result;
141
+ }
142
+ //# sourceMappingURL=approve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.js","sourceRoot":"","sources":["../../../server/controllers/activity-approval/approve.ts"],"names":[],"mappings":"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","sourcesContent":["import { ApprovalLineItem } from '@things-factory/organization'\nimport { stampedComment } from './opinion.js'\nimport { ActivityThread, ActivityThreadStatus } from '../../service/activity-thread/activity-thread.js'\nimport { ActivityApproval, ActivityApprovalJudgment } from '../../service/activity-approval/activity-approval.js'\nimport { updateActivityInstanceState } from '../common.js'\nimport { checkAuthority } from './check-authority.js'\nimport { isReferenceOrder, nextApproval, referencesToNotify } from './approval-line.js'\nimport { createApproval, createReferences } from './create-approval.js'\nimport { claimPendingApproval } from './claim.js'\nimport { noticeApproval } from '../../service/approval-notice/approval-notice.js'\n\nexport async function approve(\n { id, comment }: { id: string; comment: string },\n context: ResolverContext\n): Promise<ActivityApproval> {\n const { domain, user, tx } = context.state\n\n var repository = tx.getRepository(ActivityApproval)\n\n var activityApproval = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n if (!activityApproval) {\n throw new Error(\n context.t('error.activity-approval not found', {\n activityApproval: id\n })\n )\n }\n\n await checkAuthority(activityApproval, context)\n\n /* \n Prerequisite of Approval\n - Previous judgment should be 'pending'\n */\n if (activityApproval.judgment !== ActivityApprovalJudgment.Pending) {\n throw new Error(\n context.t(`error.activity-approval is already terminated`, {\n activityApproval: id,\n actual: activityApproval.judgment\n })\n )\n }\n\n var activityThread = await tx.getRepository(ActivityThread).findOne({\n where: { domain: { id: domain.id }, id: activityApproval.activityThreadId },\n relations: ['activityInstance']\n })\n\n /*\n * 여기까지 오면 스레드가 있어야 한다. 없는 채로 아래를 읽으면 `TypeError` 가 나고, 그 오류로는\n * 무엇이 없는지 알 수 없다.\n */\n if (!activityThread) {\n throw new Error(context.t('error.activity-thread not found', { activityThread: activityApproval.activityThreadId }))\n }\n\n if (!activityThread.activityInstance) {\n throw new Error(context.t('error.activity-instance not found', { activityThread: activityThread.id }))\n }\n\n const approvalLine: ApprovalLineItem[] = activityThread.activityInstance.approvalLine\n const order = activityApproval.order\n\n /*\n * A reference does not judge.\n *\n * The three checks above all pass for a reference row: it exists, checkAuthority says it belongs\n * to this user, and its judgment is still Pending. Without this refusal the approval is recorded\n * as real and nextApproval() then picks the approver sitting after that seat, moving the approval\n * a step forward; with no approver after it, one reference ends the thread.\n *\n * This stands before claimPendingApproval, the first write. Throwing after the claim would leave\n * the row already stamped with a judgment.\n *\n * The message says what this person can do instead of reporting a missing permission. A reference\n * seat is a different seat, not a blocked one — comments are theirs to leave.\n */\n if (isReferenceOrder(approvalLine, order)) {\n throw new Error(context.t('error.activity-approval is reference only'))\n }\n\n /* 다음 결재자가 누구인지는 한 자리가 정한다 — `approval-line.ts`. */\n const next = nextApproval(approvalLine, order)\n\n /*\n * **여기서 잡는다.** 위의 검사는 읽은 시점의 것이라 그 사이에 남이 처리할 수 있다. 잡기가 첫 쓰기여야\n * 진 쪽이 다음 결재자를 만들기 전에 물러난다.\n */\n if (!(await claimPendingApproval(tx, activityApproval, ActivityApprovalJudgment.Approved))) {\n /* 「이미 끝났다」보다 **그 사람이 할 일**을 말한다 — 목록을 새로 읽으면 지금 상태가 보인다. */\n throw new Error(context.t('error.activity-approval taken by someone else', { activityApproval: id }))\n }\n\n /*\n * **승인한 사람은 승인한 것이다** (2026-08-31, 아키텍트 확인).\n *\n * 앞서는 다음 결재자가 있으면 `Escalated` 로 적었다. 그러면 「누가 승인했나」를 물을 때 중간 결재자가\n * 전부 「상신함」으로 나오고, **승인한 것과 그냥 넘긴 것이 구별되지 않는다.** 규제 산업에서는 결재\n * 이력이 곧 근거라 이것이 결함이다.\n *\n * 다음으로 넘어간 사실은 `transaction` 이 그대로 들고 있으므로 잃는 것이 없다.\n */\n const result = await tx.getRepository(ActivityApproval).save({\n ...activityApproval,\n judgment: ActivityApprovalJudgment.Approved,\n ...stampedComment(comment),\n transaction: next ? 'escalate' : 'approve',\n /*\n * **누가 처리했는지 남긴다.**\n *\n * 역할로 걸린 결재는 `approver` 가 비어 있고 `approverRole` 만 있다. 처리해도 그 자리가 비어 있으면\n * 두 가지가 함께 무너진다 — 그 역할을 가진 사람들의 **대기 목록에 영원히 남고**(`approver IS NULL`\n * 로 걸리므로), 정작 처리한 사람의 **완료 목록에는 안 나온다**(`approver = 나` 로 거르므로).\n *\n * 그리고 결재 이력에서 「누가 승인했나」는 역할이 아니라 사람이어야 한다.\n */\n approver: activityApproval.approver ?? user,\n updater: user,\n terminatedAt: new Date(),\n terminator: user\n })\n\n /*\n * **이번 결재가 끝나서 알릴 참조들.** `notifyAfter` 가 이 차례를 가리키는 참조가 여기 온다.\n *\n * 다음 결재자를 세우는 것과 **무관하게** 만든다 — 참조는 막지 않으므로, 이것이 실패해도 결재는 간다.\n */\n const refs = await createReferences(\n { references: referencesToNotify(approvalLine, order), activityThread },\n context\n )\n for (const f of refs.failed) {\n console.warn(`[worklist] 참조자를 세우지 못했다 (결재선 ${f.order}번째) — ${f.reason}`)\n }\n\n if (next) {\n /* 다음 결재자에게 넘긴다 — 행을 만드는 자리는 한 곳이다(§`create-approval.ts`). */\n await createApproval(\n { item: next.item, order: next.order, participation: 'approval', activityThread, transaction: 'escalate' },\n context\n )\n\n activityThread = await tx.getRepository(ActivityThread).save({\n ...activityThread,\n transaction: 'escalate',\n reason: comment,\n state: ActivityThreadStatus.Escalated,\n updater: user\n })\n } else {\n activityThread = await tx.getRepository(ActivityThread).save({\n ...activityThread,\n transaction: 'approve',\n reason: comment,\n state: ActivityThreadStatus.Ended,\n terminatedAt: new Date(),\n terminator: user,\n updater: user\n })\n\n /* The last approval ended it - the requester is told (ADR-0164). The next approver's turn is told where its row is made. */\n await noticeApproval(context, { kind: 'approved', approvalId: result.id })\n }\n\n await updateActivityInstanceState(activityThread.activityInstanceId, { causedBy: [activityThread] }, context)\n\n return result\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { ActivityApproval } from '../../service/activity-approval/activity-approval.js';
2
+ /**
3
+ * 이 사람이 이 결재 행을 다룰 수 있나 — approve · reject · abort · delegate · save 가 함께 쓴다.
4
+ *
5
+ * 그 자리의 결재자이거나, 역할로 걸린 자리면 그 역할을 가진 사람이다. 상신자인지는 묻지 않는다 —
6
+ * 상신자도 결재 자리에 서면 결재한다(2026-10-23 사용자, ADR-0052 ② 를 거둠).
7
+ */
8
+ export declare function checkAuthority(activityApproval: ActivityApproval, context: ResolverContext): Promise<void>;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkAuthority = checkAuthority;
4
+ const shell_1 = require("@things-factory/shell");
5
+ const auth_base_1 = require("@things-factory/auth-base");
6
+ /**
7
+ * 이 사람이 이 결재 행을 다룰 수 있나 — approve · reject · abort · delegate · save 가 함께 쓴다.
8
+ *
9
+ * 그 자리의 결재자이거나, 역할로 걸린 자리면 그 역할을 가진 사람이다. 상신자인지는 묻지 않는다 —
10
+ * 상신자도 결재 자리에 서면 결재한다(2026-10-23 사용자, ADR-0052 ② 를 거둠).
11
+ */
12
+ async function checkAuthority(activityApproval, context) {
13
+ const { user, tx } = context.state;
14
+ if (activityApproval.approverId && activityApproval.approverId === user.id) {
15
+ return;
16
+ }
17
+ if (!activityApproval.approver && activityApproval.approverRoleId) {
18
+ const roles = (await (0, shell_1.getRepository)(auth_base_1.User, tx).findOne({
19
+ where: { id: user.id },
20
+ relations: ['roles']
21
+ }))?.roles;
22
+ if (roles.find(role => role.id == activityApproval.approverRoleId)) {
23
+ activityApproval.approver = user;
24
+ return;
25
+ }
26
+ }
27
+ throw new Error(context.t(`error.not authorized to handle this task`));
28
+ }
29
+ //# sourceMappingURL=check-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-authority.js","sourceRoot":"","sources":["../../../server/controllers/activity-approval/check-authority.ts"],"names":[],"mappings":";;AAUA,wCAsBC;AAhCD,iDAAqD;AACrD,yDAAgD;AAGhD;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAAC,gBAAkC,EAAE,OAAwB;IAC/F,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAElC,IAAI,gBAAgB,CAAC,UAAU,IAAI,gBAAgB,CAAC,UAAU,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3E,OAAM;IACR,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,IAAI,gBAAgB,CAAC,cAAc,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,CACZ,MAAM,IAAA,qBAAa,EAAC,gBAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC;YACpC,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;YACtB,SAAS,EAAE,CAAC,OAAO,CAAC;SACrB,CAAC,CACH,EAAE,KAAK,CAAA;QAER,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,gBAAgB,CAAC,cAAc,CAAC,EAAE,CAAC;YACnE,gBAAgB,CAAC,QAAQ,GAAG,IAAI,CAAA;YAChC,OAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAA;AACxE,CAAC","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { ActivityApproval } from '../../service/activity-approval/activity-approval.js'\n\n/**\n * 이 사람이 이 결재 행을 다룰 수 있나 — approve · reject · abort · delegate · save 가 함께 쓴다.\n *\n * 그 자리의 결재자이거나, 역할로 걸린 자리면 그 역할을 가진 사람이다. 상신자인지는 묻지 않는다 —\n * 상신자도 결재 자리에 서면 결재한다(2026-10-23 사용자, ADR-0052 ② 를 거둠).\n */\nexport async function checkAuthority(activityApproval: ActivityApproval, context: ResolverContext) {\n const { user, tx } = context.state\n\n if (activityApproval.approverId && activityApproval.approverId === user.id) {\n return\n }\n\n if (!activityApproval.approver && activityApproval.approverRoleId) {\n const roles = (\n await getRepository(User, tx).findOne({\n where: { id: user.id },\n relations: ['roles']\n })\n )?.roles\n\n if (roles.find(role => role.id == activityApproval.approverRoleId)) {\n activityApproval.approver = user\n return\n }\n }\n\n throw new Error(context.t(`error.not authorized to handle this task`))\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import { EntityManager } from 'typeorm';
2
+ import { ActivityApproval, ActivityApprovalJudgment } from '../../service/activity-approval/activity-approval.js';
3
+ /**
4
+ * 이 결재를 내가 잡는다 — **대기 중인 것만, 한 번만.**
5
+ *
6
+ * ── 왜 필요한가 ────────────────────────────────────────────────────────────
7
+ * 승인·반려·위임이 다 같은 모양으로 시작한다. 읽고 → 「대기 중인가」 보고 → 저장한다. 그 사이에 아무
8
+ * 잠금이 없다.
9
+ *
10
+ * 역할로 걸린 결재는 **여러 명이 같은 건을 본다.** 대기 목록에 뜬 것을 두 사람이 누르는 것은 공유
11
+ * 대기열의 평범한 실패 방식이다. 지금은 둘 다 검사를 통과하고 **둘 다 다음 결재자를 만든다** — 같은
12
+ * 차례의 결재가 두 벌 서서 결재선이 갈라진다. 오류는 안 난다.
13
+ *
14
+ * ── 검사와 쓰기를 한 문장으로 ──────────────────────────────────────────────
15
+ * `WHERE judgment = ''` 를 갱신에 붙인다. 늦게 온 쪽은 0줄을 고치고, 그것으로 「남이 먼저 처리했다」를
16
+ * 안다.
17
+ *
18
+ * 두 트랜잭션이 겹치면 뒤엣것이 행 잠금 앞에서 멈춰 섰다가, 앞엣것이 커밋한 뒤 조건을 **다시 보고**
19
+ * 0줄을 얻는다. 세 드라이버 다 그렇게 동작한다 — postgres 는 잠금이 풀린 뒤 조건을 다시 보고, mysql
20
+ * InnoDB 는 갱신 시 최신 커밋본을 읽고, sqlite 는 쓰기를 아예 직렬화한다.
21
+ *
22
+ * ── 잡고 나면 그 행은 이 트랜잭션 것이다 ───────────────────────────────────
23
+ * 잡는 순간 행 잠금을 쥐므로, 나머지는 평범하게 저장해도 된다. 그래서 여기서는 **판정 하나만** 원자적으로
24
+ * 바꾼다 — 지키려는 규칙이 「대기 중인 것만 처리할 수 있다」 하나이기 때문이다.
25
+ *
26
+ * ── 왜 `@VersionColumn` 이 아닌가 ──────────────────────────────────────────
27
+ * 버전 칸은 컬럼을 늘려 마이그레이션이 필요하고, 이 규칙과 무관한 저장(의견 수정)까지 충돌시킨다.
28
+ * 이미 코드에 있는 검사를 그대로 갱신 문장으로 옮기는 편이 정확하고, 스키마를 안 건드려 배포해도
29
+ * 기존 데이터에 영향이 없다. (2026-08-31, 사용자 결정)
30
+ *
31
+ * ── 잡은 뒤의 저장은 안전하다 ─────────────────────────────────────────────
32
+ * 부르는 쪽은 잡기 뒤에 `save({ ...approval, judgment, comment, … })` 로 나머지를 쓴다. 손에 든
33
+ * `approval` 은 잡기 **전에** 읽은 것이라 판정이 낡았는데, 그 저장이 판정을 다시 명시하므로 되돌리지
34
+ * 않는다. 그리고 잡는 순간 행 잠금을 쥐었으므로 그 사이에 남이 끼어들 수 없다.
35
+ *
36
+ * 한 문장으로 합치지 않은 이유는 관계 칸 때문이다 — `updater`·`terminator`·`originalApproval` 이
37
+ * 엔티티 객체이고, `save()` 는 이것을 FK 로 풀어 주지만 `UpdateQueryBuilder.set()` 은 버전에 따라
38
+ * 다르다. 풀리지 않으면 「누가 처리했나」가 비고 **오류는 안 난다.**
39
+ *
40
+ * @returns 잡았으면 참. 거짓이면 **남이 먼저 처리했다** — 부르는 쪽이 던져서 트랜잭션을 물려야 한다.
41
+ */
42
+ export declare function claimPendingApproval(tx: EntityManager, approval: ActivityApproval, judgment: ActivityApprovalJudgment): Promise<boolean>;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.claimPendingApproval = claimPendingApproval;
4
+ const activity_approval_js_1 = require("../../service/activity-approval/activity-approval.js");
5
+ /**
6
+ * 이 결재를 내가 잡는다 — **대기 중인 것만, 한 번만.**
7
+ *
8
+ * ── 왜 필요한가 ────────────────────────────────────────────────────────────
9
+ * 승인·반려·위임이 다 같은 모양으로 시작한다. 읽고 → 「대기 중인가」 보고 → 저장한다. 그 사이에 아무
10
+ * 잠금이 없다.
11
+ *
12
+ * 역할로 걸린 결재는 **여러 명이 같은 건을 본다.** 대기 목록에 뜬 것을 두 사람이 누르는 것은 공유
13
+ * 대기열의 평범한 실패 방식이다. 지금은 둘 다 검사를 통과하고 **둘 다 다음 결재자를 만든다** — 같은
14
+ * 차례의 결재가 두 벌 서서 결재선이 갈라진다. 오류는 안 난다.
15
+ *
16
+ * ── 검사와 쓰기를 한 문장으로 ──────────────────────────────────────────────
17
+ * `WHERE judgment = ''` 를 갱신에 붙인다. 늦게 온 쪽은 0줄을 고치고, 그것으로 「남이 먼저 처리했다」를
18
+ * 안다.
19
+ *
20
+ * 두 트랜잭션이 겹치면 뒤엣것이 행 잠금 앞에서 멈춰 섰다가, 앞엣것이 커밋한 뒤 조건을 **다시 보고**
21
+ * 0줄을 얻는다. 세 드라이버 다 그렇게 동작한다 — postgres 는 잠금이 풀린 뒤 조건을 다시 보고, mysql
22
+ * InnoDB 는 갱신 시 최신 커밋본을 읽고, sqlite 는 쓰기를 아예 직렬화한다.
23
+ *
24
+ * ── 잡고 나면 그 행은 이 트랜잭션 것이다 ───────────────────────────────────
25
+ * 잡는 순간 행 잠금을 쥐므로, 나머지는 평범하게 저장해도 된다. 그래서 여기서는 **판정 하나만** 원자적으로
26
+ * 바꾼다 — 지키려는 규칙이 「대기 중인 것만 처리할 수 있다」 하나이기 때문이다.
27
+ *
28
+ * ── 왜 `@VersionColumn` 이 아닌가 ──────────────────────────────────────────
29
+ * 버전 칸은 컬럼을 늘려 마이그레이션이 필요하고, 이 규칙과 무관한 저장(의견 수정)까지 충돌시킨다.
30
+ * 이미 코드에 있는 검사를 그대로 갱신 문장으로 옮기는 편이 정확하고, 스키마를 안 건드려 배포해도
31
+ * 기존 데이터에 영향이 없다. (2026-08-31, 사용자 결정)
32
+ *
33
+ * ── 잡은 뒤의 저장은 안전하다 ─────────────────────────────────────────────
34
+ * 부르는 쪽은 잡기 뒤에 `save({ ...approval, judgment, comment, … })` 로 나머지를 쓴다. 손에 든
35
+ * `approval` 은 잡기 **전에** 읽은 것이라 판정이 낡았는데, 그 저장이 판정을 다시 명시하므로 되돌리지
36
+ * 않는다. 그리고 잡는 순간 행 잠금을 쥐었으므로 그 사이에 남이 끼어들 수 없다.
37
+ *
38
+ * 한 문장으로 합치지 않은 이유는 관계 칸 때문이다 — `updater`·`terminator`·`originalApproval` 이
39
+ * 엔티티 객체이고, `save()` 는 이것을 FK 로 풀어 주지만 `UpdateQueryBuilder.set()` 은 버전에 따라
40
+ * 다르다. 풀리지 않으면 「누가 처리했나」가 비고 **오류는 안 난다.**
41
+ *
42
+ * @returns 잡았으면 참. 거짓이면 **남이 먼저 처리했다** — 부르는 쪽이 던져서 트랜잭션을 물려야 한다.
43
+ */
44
+ async function claimPendingApproval(tx, approval, judgment) {
45
+ /*
46
+ * 대기로 잡으면 조건이 통과하는데 판정이 그대로라 **두 번째 호출도 통과한다.** 잡는 뜻이 없어진다.
47
+ *
48
+ * `Pending` 은 빈 문자열이라 이 한 줄에 함께 걸린다 — 타입 검사도 그렇게 좁혀 준다.
49
+ */
50
+ if (!judgment) {
51
+ throw new Error('claimPendingApproval: a claim must move the judgment out of pending');
52
+ }
53
+ const result = await tx
54
+ .createQueryBuilder()
55
+ .update(activity_approval_js_1.ActivityApproval)
56
+ .set({ judgment })
57
+ .where('id = :id', { id: approval.id })
58
+ /*
59
+ * 대기 중은 빈 문자열이다(`ActivityApprovalJudgment.Pending`). `IS NULL` 도 함께 보는 이유는 기본값이
60
+ * 안 들어간 옛 행이 있을 수 있어서다 — 그런 행을 못 잡으면 그 결재는 영영 처리되지 않는다.
61
+ */
62
+ .andWhere('(judgment = :pending OR judgment IS NULL)', { pending: activity_approval_js_1.ActivityApprovalJudgment.Pending })
63
+ .execute();
64
+ /*
65
+ * `?? 0` here is deliberate, and it is the opposite of the same expression elsewhere.
66
+ *
67
+ * A missing row count means we do not know whether this claim took. For a conditional update
68
+ * that hands one person an approval, not knowing has to read as "did not get it": refusing a
69
+ * claim costs a retry, while granting one on an unknown result lets two people judge the same
70
+ * request. The unknown value maps to the conservative answer on purpose.
71
+ *
72
+ * Elsewhere the same `?? 0` was a defect — a missing count drawn as 「0 waiting」 — so the two
73
+ * are worth telling apart rather than tidying into one habit.
74
+ */
75
+ return (result.affected ?? 0) > 0;
76
+ }
77
+ //# sourceMappingURL=claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../../server/controllers/activity-approval/claim.ts"],"names":[],"mappings":";;AA2CA,oDAsCC;AA/ED,+FAAiH;AAEjH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACI,KAAK,UAAU,oBAAoB,CACxC,EAAiB,EACjB,QAA0B,EAC1B,QAAkC;IAElC;;;;OAIG;IACH,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAA;IACxF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,EAAE;SACpB,kBAAkB,EAAE;SACpB,MAAM,CAAC,uCAAgB,CAAC;SACxB,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;SACjB,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;QACvC;;;WAGG;SACF,QAAQ,CAAC,2CAA2C,EAAE,EAAE,OAAO,EAAE,+CAAwB,CAAC,OAAO,EAAE,CAAC;SACpG,OAAO,EAAE,CAAA;IAEZ;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;AACnC,CAAC","sourcesContent":["import { EntityManager } from 'typeorm'\n\nimport { ActivityApproval, ActivityApprovalJudgment } from '../../service/activity-approval/activity-approval.js'\n\n/**\n * 이 결재를 내가 잡는다 — **대기 중인 것만, 한 번만.**\n *\n * ── 왜 필요한가 ────────────────────────────────────────────────────────────\n * 승인·반려·위임이 다 같은 모양으로 시작한다. 읽고 → 「대기 중인가」 보고 → 저장한다. 그 사이에 아무\n * 잠금이 없다.\n *\n * 역할로 걸린 결재는 **여러 명이 같은 건을 본다.** 대기 목록에 뜬 것을 두 사람이 누르는 것은 공유\n * 대기열의 평범한 실패 방식이다. 지금은 둘 다 검사를 통과하고 **둘 다 다음 결재자를 만든다** — 같은\n * 차례의 결재가 두 벌 서서 결재선이 갈라진다. 오류는 안 난다.\n *\n * ── 검사와 쓰기를 한 문장으로 ──────────────────────────────────────────────\n * `WHERE judgment = ''` 를 갱신에 붙인다. 늦게 온 쪽은 0줄을 고치고, 그것으로 「남이 먼저 처리했다」를\n * 안다.\n *\n * 두 트랜잭션이 겹치면 뒤엣것이 행 잠금 앞에서 멈춰 섰다가, 앞엣것이 커밋한 뒤 조건을 **다시 보고**\n * 0줄을 얻는다. 세 드라이버 다 그렇게 동작한다 — postgres 는 잠금이 풀린 뒤 조건을 다시 보고, mysql\n * InnoDB 는 갱신 시 최신 커밋본을 읽고, sqlite 는 쓰기를 아예 직렬화한다.\n *\n * ── 잡고 나면 그 행은 이 트랜잭션 것이다 ───────────────────────────────────\n * 잡는 순간 행 잠금을 쥐므로, 나머지는 평범하게 저장해도 된다. 그래서 여기서는 **판정 하나만** 원자적으로\n * 바꾼다 — 지키려는 규칙이 「대기 중인 것만 처리할 수 있다」 하나이기 때문이다.\n *\n * ── 왜 `@VersionColumn` 이 아닌가 ──────────────────────────────────────────\n * 버전 칸은 컬럼을 늘려 마이그레이션이 필요하고, 이 규칙과 무관한 저장(의견 수정)까지 충돌시킨다.\n * 이미 코드에 있는 검사를 그대로 갱신 문장으로 옮기는 편이 정확하고, 스키마를 안 건드려 배포해도\n * 기존 데이터에 영향이 없다. (2026-08-31, 사용자 결정)\n *\n * ── 잡은 뒤의 저장은 안전하다 ─────────────────────────────────────────────\n * 부르는 쪽은 잡기 뒤에 `save({ ...approval, judgment, comment, … })` 로 나머지를 쓴다. 손에 든\n * `approval` 은 잡기 **전에** 읽은 것이라 판정이 낡았는데, 그 저장이 판정을 다시 명시하므로 되돌리지\n * 않는다. 그리고 잡는 순간 행 잠금을 쥐었으므로 그 사이에 남이 끼어들 수 없다.\n *\n * 한 문장으로 합치지 않은 이유는 관계 칸 때문이다 — `updater`·`terminator`·`originalApproval` 이\n * 엔티티 객체이고, `save()` 는 이것을 FK 로 풀어 주지만 `UpdateQueryBuilder.set()` 은 버전에 따라\n * 다르다. 풀리지 않으면 「누가 처리했나」가 비고 **오류는 안 난다.**\n *\n * @returns 잡았으면 참. 거짓이면 **남이 먼저 처리했다** — 부르는 쪽이 던져서 트랜잭션을 물려야 한다.\n */\nexport async function claimPendingApproval(\n tx: EntityManager,\n approval: ActivityApproval,\n judgment: ActivityApprovalJudgment\n): Promise<boolean> {\n /*\n * 대기로 잡으면 조건이 통과하는데 판정이 그대로라 **두 번째 호출도 통과한다.** 잡는 뜻이 없어진다.\n *\n * `Pending` 은 빈 문자열이라 이 한 줄에 함께 걸린다 — 타입 검사도 그렇게 좁혀 준다.\n */\n if (!judgment) {\n throw new Error('claimPendingApproval: a claim must move the judgment out of pending')\n }\n\n const result = await tx\n .createQueryBuilder()\n .update(ActivityApproval)\n .set({ judgment })\n .where('id = :id', { id: approval.id })\n /*\n * 대기 중은 빈 문자열이다(`ActivityApprovalJudgment.Pending`). `IS NULL` 도 함께 보는 이유는 기본값이\n * 안 들어간 옛 행이 있을 수 있어서다 — 그런 행을 못 잡으면 그 결재는 영영 처리되지 않는다.\n */\n .andWhere('(judgment = :pending OR judgment IS NULL)', { pending: ActivityApprovalJudgment.Pending })\n .execute()\n\n /*\n * `?? 0` here is deliberate, and it is the opposite of the same expression elsewhere.\n *\n * A missing row count means we do not know whether this claim took. For a conditional update\n * that hands one person an approval, not knowing has to read as \"did not get it\": refusing a\n * claim costs a retry, while granting one on an unknown result lets two people judge the same\n * request. The unknown value maps to the conservative answer on purpose.\n *\n * Elsewhere the same `?? 0` was a defect — a missing count drawn as 「0 waiting」 — so the two\n * are worth telling apart rather than tidying into one habit.\n */\n return (result.affected ?? 0) > 0\n}\n"]}
@@ -0,0 +1,41 @@
1
+ import type { ApprovalLineItem } from '@things-factory/organization';
2
+ import { ActivityApproval } from '../../service/activity-approval/activity-approval.js';
3
+ import type { ActivityThread } from '../../service/activity-thread/activity-thread.js';
4
+ /** 이 항목이 무슨 자격으로 서나 — 행에도 적는다(목록 질의가 참조를 걸러야 한다). */
5
+ export type Participation = 'approval' | 'reference';
6
+ /**
7
+ * 결재선 항목 하나로 행을 만든다.
8
+ *
9
+ * 역할로 걸린 것은 `approverRole` 만 채워지고 `approver` 는 비어 있다 — 그 역할을 가진 사람 여럿이 같은
10
+ * 건을 본다. 처리하는 사람이 정해지는 것은 누른 순간이다(§`approve.ts`).
11
+ */
12
+ export declare function createApproval(args: {
13
+ item: ApprovalLineItem;
14
+ order: number;
15
+ participation: Participation;
16
+ activityThread: ActivityThread;
17
+ /** 이 행이 왜 생겼나 — `submit` · `escalate` · `notify`. */
18
+ transaction: string;
19
+ }, context: ResolverContext): Promise<ActivityApproval>;
20
+ /**
21
+ * 이번에 알려야 할 참조들의 행을 만든다 — **하나가 실패해도 결재를 세우지 않는다.**
22
+ *
23
+ * 참조는 막지 않는 자격이다. 그런데 참조자를 못 찾아 던지면 그 예외가 상신·승인을 통째로 물린다 —
24
+ * 막지 않기로 한 것이 막게 된다.
25
+ *
26
+ * 그래서 실패를 삼키지 않되 **던지지도 않는다.** 못 만든 참조를 이유와 함께 돌려주고, 부르는 쪽이
27
+ * 그것을 기록한다.
28
+ */
29
+ export declare function createReferences(args: {
30
+ references: {
31
+ item: ApprovalLineItem;
32
+ order: number;
33
+ }[];
34
+ activityThread: ActivityThread;
35
+ }, context: ResolverContext): Promise<{
36
+ created: ActivityApproval[];
37
+ failed: {
38
+ order: number;
39
+ reason: string;
40
+ }[];
41
+ }>;