@almadar/std 15.15.0 → 15.15.1

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 (273) hide show
  1. package/behaviors/registry/app/atoms/std-ap-bill.orb +423 -171
  2. package/behaviors/registry/app/atoms/std-applicant.orb +207 -165
  3. package/behaviors/registry/app/atoms/std-application.orb +300 -188
  4. package/behaviors/registry/app/atoms/std-approval-request.orb +370 -215
  5. package/behaviors/registry/app/atoms/std-campaign-goal.orb +382 -167
  6. package/behaviors/registry/app/atoms/std-change-order.orb +458 -194
  7. package/behaviors/registry/app/atoms/std-chart-of-accounts.orb +201 -130
  8. package/behaviors/registry/app/atoms/std-checkin.orb +215 -151
  9. package/behaviors/registry/app/atoms/std-checkout-terminal.orb +322 -133
  10. package/behaviors/registry/app/atoms/std-class-roster.orb +343 -170
  11. package/behaviors/registry/app/atoms/std-class-session.orb +321 -190
  12. package/behaviors/registry/app/atoms/std-court-deadline.orb +353 -182
  13. package/behaviors/registry/app/atoms/std-customer-account.orb +376 -157
  14. package/behaviors/registry/app/atoms/std-donation-receipt.orb +214 -143
  15. package/behaviors/registry/app/atoms/std-donor.orb +191 -156
  16. package/behaviors/registry/app/atoms/std-drip-sequence.orb +409 -170
  17. package/behaviors/registry/app/atoms/std-driver.orb +440 -202
  18. package/behaviors/registry/app/atoms/std-dunning.orb +431 -167
  19. package/behaviors/registry/app/atoms/std-email-broadcast.orb +386 -143
  20. package/behaviors/registry/app/atoms/std-event.orb +309 -178
  21. package/behaviors/registry/app/atoms/std-form-builder.orb +353 -220
  22. package/behaviors/registry/app/atoms/std-health-score.orb +218 -183
  23. package/behaviors/registry/app/atoms/std-help-article.orb +425 -162
  24. package/behaviors/registry/app/atoms/std-help-category.orb +409 -166
  25. package/behaviors/registry/app/atoms/std-interview-slot.orb +311 -138
  26. package/behaviors/registry/app/atoms/std-invoice.orb +349 -211
  27. package/behaviors/registry/app/atoms/std-kitchen-display.orb +308 -184
  28. package/behaviors/registry/app/atoms/std-lease.orb +411 -178
  29. package/behaviors/registry/app/atoms/std-ledger-entry.orb +266 -195
  30. package/behaviors/registry/app/atoms/std-maintenance-request.orb +396 -177
  31. package/behaviors/registry/app/atoms/std-matter.orb +415 -189
  32. package/behaviors/registry/app/atoms/std-membership.orb +387 -167
  33. package/behaviors/registry/app/atoms/std-menu.orb +232 -175
  34. package/behaviors/registry/app/atoms/std-modifier-group.orb +224 -167
  35. package/behaviors/registry/app/atoms/std-nps-survey.orb +390 -138
  36. package/behaviors/registry/app/atoms/std-offer-letter.orb +242 -133
  37. package/behaviors/registry/app/atoms/std-payout-ledger.orb +428 -176
  38. package/behaviors/registry/app/atoms/std-question-bank.orb +211 -145
  39. package/behaviors/registry/app/atoms/std-receipt.orb +248 -177
  40. package/behaviors/registry/app/atoms/std-recurring-charge.orb +421 -149
  41. package/behaviors/registry/app/atoms/std-renewal-risk.orb +382 -153
  42. package/behaviors/registry/app/atoms/std-rent-charge.orb +476 -176
  43. package/behaviors/registry/app/atoms/std-reorder-rule.orb +246 -176
  44. package/behaviors/registry/app/atoms/std-response-collector.orb +213 -150
  45. package/behaviors/registry/app/atoms/std-rfi.orb +365 -210
  46. package/behaviors/registry/app/atoms/std-route-optimize.orb +195 -146
  47. package/behaviors/registry/app/atoms/std-segment.orb +173 -139
  48. package/behaviors/registry/app/atoms/std-stock-level.orb +205 -135
  49. package/behaviors/registry/app/atoms/std-submittal.orb +323 -166
  50. package/behaviors/registry/app/atoms/std-table-map.orb +187 -63
  51. package/behaviors/registry/app/atoms/std-technician-dispatch.orb +290 -202
  52. package/behaviors/registry/app/atoms/std-telematics-event.orb +156 -128
  53. package/behaviors/registry/app/atoms/std-template-editor.orb +255 -189
  54. package/behaviors/registry/app/atoms/std-tenant.orb +375 -147
  55. package/behaviors/registry/app/atoms/std-ticket-tier.orb +463 -150
  56. package/behaviors/registry/app/atoms/std-time-entry.orb +259 -150
  57. package/behaviors/registry/app/atoms/std-timesheet.orb +292 -183
  58. package/behaviors/registry/app/atoms/std-trial.orb +401 -183
  59. package/behaviors/registry/app/atoms/std-vehicle.orb +447 -205
  60. package/behaviors/registry/app/atoms/std-vendor-onboarding.orb +289 -245
  61. package/behaviors/registry/app/atoms/std-waitlist.orb +308 -177
  62. package/behaviors/registry/app/atoms/std-warehouse.orb +211 -141
  63. package/behaviors/registry/app/atoms/std-work-order.orb +374 -219
  64. package/behaviors/registry/app/organisms/std-subscription-billing.orb +282 -195
  65. package/behaviors/registry/core/atoms/std-approval-gate.orb +703 -0
  66. package/behaviors/registry/core/atoms/std-audit-capture.orb +150 -64
  67. package/behaviors/registry/core/atoms/std-data-erasure.orb +546 -0
  68. package/behaviors/registry/core/atoms/std-lifecycle.orb +343 -0
  69. package/behaviors/registry/core/atoms/std-notify-on-event.orb +132 -46
  70. package/behaviors/registry/core/atoms/std-reminder-scheduler.orb +330 -0
  71. package/behaviors/registry/marketing/atoms/std-marketing-article.orb +96 -0
  72. package/behaviors/registry/marketing/atoms/std-marketing-case-studies.orb +243 -0
  73. package/behaviors/registry/marketing/atoms/std-marketing-community.orb +134 -0
  74. package/behaviors/registry/marketing/atoms/std-marketing-cta.orb +206 -0
  75. package/behaviors/registry/marketing/atoms/std-marketing-features.orb +193 -0
  76. package/behaviors/registry/marketing/atoms/std-marketing-footer.orb +192 -0
  77. package/behaviors/registry/marketing/atoms/std-marketing-hero.orb +262 -0
  78. package/behaviors/registry/marketing/atoms/std-marketing-nav.orb +190 -0
  79. package/behaviors/registry/marketing/atoms/std-marketing-pricing.orb +232 -0
  80. package/behaviors/registry/marketing/atoms/std-marketing-showcase.orb +276 -0
  81. package/behaviors/registry/marketing/atoms/std-marketing-split.orb +135 -0
  82. package/behaviors/registry/marketing/atoms/std-marketing-stats.orb +120 -0
  83. package/behaviors/registry/marketing/atoms/std-marketing-steps.orb +179 -0
  84. package/behaviors/registry/marketing/atoms/std-marketing-team.orb +192 -0
  85. package/behaviors/registry/marketing/atoms/std-marketing-testimonials.orb +124 -0
  86. package/behaviors/registry/marketing/molecules/std-about-page.orb +440 -0
  87. package/behaviors/registry/marketing/molecules/std-feature-detail-page.orb +371 -0
  88. package/behaviors/registry/marketing/molecules/std-landing-page.orb +521 -0
  89. package/behaviors/registry/marketing/molecules/std-pricing-page.orb +406 -0
  90. package/behaviors/registry/marketing/organisms/std-marketing-site.orb +1654 -0
  91. package/dist/behaviors/behaviors-registry.json +2913 -156
  92. package/dist/behaviors/registry/app/atoms/std-ap-bill.orb +423 -171
  93. package/dist/behaviors/registry/app/atoms/std-applicant.orb +207 -165
  94. package/dist/behaviors/registry/app/atoms/std-application.orb +300 -188
  95. package/dist/behaviors/registry/app/atoms/std-approval-request.orb +370 -215
  96. package/dist/behaviors/registry/app/atoms/std-campaign-goal.orb +382 -167
  97. package/dist/behaviors/registry/app/atoms/std-change-order.orb +458 -194
  98. package/dist/behaviors/registry/app/atoms/std-chart-of-accounts.orb +201 -130
  99. package/dist/behaviors/registry/app/atoms/std-checkin.orb +215 -151
  100. package/dist/behaviors/registry/app/atoms/std-checkout-terminal.orb +322 -133
  101. package/dist/behaviors/registry/app/atoms/std-class-roster.orb +343 -170
  102. package/dist/behaviors/registry/app/atoms/std-class-session.orb +321 -190
  103. package/dist/behaviors/registry/app/atoms/std-court-deadline.orb +353 -182
  104. package/dist/behaviors/registry/app/atoms/std-customer-account.orb +376 -157
  105. package/dist/behaviors/registry/app/atoms/std-donation-receipt.orb +214 -143
  106. package/dist/behaviors/registry/app/atoms/std-donor.orb +191 -156
  107. package/dist/behaviors/registry/app/atoms/std-drip-sequence.orb +409 -170
  108. package/dist/behaviors/registry/app/atoms/std-driver.orb +440 -202
  109. package/dist/behaviors/registry/app/atoms/std-dunning.orb +431 -167
  110. package/dist/behaviors/registry/app/atoms/std-email-broadcast.orb +386 -143
  111. package/dist/behaviors/registry/app/atoms/std-event.orb +309 -178
  112. package/dist/behaviors/registry/app/atoms/std-form-builder.orb +353 -220
  113. package/dist/behaviors/registry/app/atoms/std-health-score.orb +218 -183
  114. package/dist/behaviors/registry/app/atoms/std-help-article.orb +425 -162
  115. package/dist/behaviors/registry/app/atoms/std-help-category.orb +409 -166
  116. package/dist/behaviors/registry/app/atoms/std-interview-slot.orb +311 -138
  117. package/dist/behaviors/registry/app/atoms/std-invoice.orb +349 -211
  118. package/dist/behaviors/registry/app/atoms/std-kitchen-display.orb +308 -184
  119. package/dist/behaviors/registry/app/atoms/std-lease.orb +411 -178
  120. package/dist/behaviors/registry/app/atoms/std-ledger-entry.orb +266 -195
  121. package/dist/behaviors/registry/app/atoms/std-maintenance-request.orb +396 -177
  122. package/dist/behaviors/registry/app/atoms/std-matter.orb +415 -189
  123. package/dist/behaviors/registry/app/atoms/std-membership.orb +387 -167
  124. package/dist/behaviors/registry/app/atoms/std-menu.orb +232 -175
  125. package/dist/behaviors/registry/app/atoms/std-modifier-group.orb +224 -167
  126. package/dist/behaviors/registry/app/atoms/std-nps-survey.orb +390 -138
  127. package/dist/behaviors/registry/app/atoms/std-offer-letter.orb +242 -133
  128. package/dist/behaviors/registry/app/atoms/std-payout-ledger.orb +428 -176
  129. package/dist/behaviors/registry/app/atoms/std-question-bank.orb +211 -145
  130. package/dist/behaviors/registry/app/atoms/std-receipt.orb +248 -177
  131. package/dist/behaviors/registry/app/atoms/std-recurring-charge.orb +421 -149
  132. package/dist/behaviors/registry/app/atoms/std-renewal-risk.orb +382 -153
  133. package/dist/behaviors/registry/app/atoms/std-rent-charge.orb +476 -176
  134. package/dist/behaviors/registry/app/atoms/std-reorder-rule.orb +246 -176
  135. package/dist/behaviors/registry/app/atoms/std-response-collector.orb +213 -150
  136. package/dist/behaviors/registry/app/atoms/std-rfi.orb +365 -210
  137. package/dist/behaviors/registry/app/atoms/std-route-optimize.orb +195 -146
  138. package/dist/behaviors/registry/app/atoms/std-segment.orb +173 -139
  139. package/dist/behaviors/registry/app/atoms/std-stock-level.orb +205 -135
  140. package/dist/behaviors/registry/app/atoms/std-submittal.orb +323 -166
  141. package/dist/behaviors/registry/app/atoms/std-table-map.orb +187 -63
  142. package/dist/behaviors/registry/app/atoms/std-technician-dispatch.orb +290 -202
  143. package/dist/behaviors/registry/app/atoms/std-telematics-event.orb +156 -128
  144. package/dist/behaviors/registry/app/atoms/std-template-editor.orb +255 -189
  145. package/dist/behaviors/registry/app/atoms/std-tenant.orb +375 -147
  146. package/dist/behaviors/registry/app/atoms/std-ticket-tier.orb +463 -150
  147. package/dist/behaviors/registry/app/atoms/std-time-entry.orb +259 -150
  148. package/dist/behaviors/registry/app/atoms/std-timesheet.orb +292 -183
  149. package/dist/behaviors/registry/app/atoms/std-trial.orb +401 -183
  150. package/dist/behaviors/registry/app/atoms/std-vehicle.orb +447 -205
  151. package/dist/behaviors/registry/app/atoms/std-vendor-onboarding.orb +289 -245
  152. package/dist/behaviors/registry/app/atoms/std-waitlist.orb +308 -177
  153. package/dist/behaviors/registry/app/atoms/std-warehouse.orb +211 -141
  154. package/dist/behaviors/registry/app/atoms/std-work-order.orb +374 -219
  155. package/dist/behaviors/registry/app/organisms/std-subscription-billing.orb +282 -195
  156. package/dist/behaviors/registry/core/atoms/std-approval-gate.orb +703 -0
  157. package/dist/behaviors/registry/core/atoms/std-audit-capture.orb +150 -64
  158. package/dist/behaviors/registry/core/atoms/std-data-erasure.orb +546 -0
  159. package/dist/behaviors/registry/core/atoms/std-lifecycle.orb +343 -0
  160. package/dist/behaviors/registry/core/atoms/std-notify-on-event.orb +132 -46
  161. package/dist/behaviors/registry/core/atoms/std-reminder-scheduler.orb +330 -0
  162. package/dist/behaviors/registry/marketing/atoms/std-marketing-article.orb +96 -0
  163. package/dist/behaviors/registry/marketing/atoms/std-marketing-case-studies.orb +243 -0
  164. package/dist/behaviors/registry/marketing/atoms/std-marketing-community.orb +134 -0
  165. package/dist/behaviors/registry/marketing/atoms/std-marketing-cta.orb +206 -0
  166. package/dist/behaviors/registry/marketing/atoms/std-marketing-features.orb +193 -0
  167. package/dist/behaviors/registry/marketing/atoms/std-marketing-footer.orb +192 -0
  168. package/dist/behaviors/registry/marketing/atoms/std-marketing-hero.orb +262 -0
  169. package/dist/behaviors/registry/marketing/atoms/std-marketing-nav.orb +190 -0
  170. package/dist/behaviors/registry/marketing/atoms/std-marketing-pricing.orb +232 -0
  171. package/dist/behaviors/registry/marketing/atoms/std-marketing-showcase.orb +276 -0
  172. package/dist/behaviors/registry/marketing/atoms/std-marketing-split.orb +135 -0
  173. package/dist/behaviors/registry/marketing/atoms/std-marketing-stats.orb +120 -0
  174. package/dist/behaviors/registry/marketing/atoms/std-marketing-steps.orb +179 -0
  175. package/dist/behaviors/registry/marketing/atoms/std-marketing-team.orb +192 -0
  176. package/dist/behaviors/registry/marketing/atoms/std-marketing-testimonials.orb +124 -0
  177. package/dist/behaviors/registry/marketing/molecules/std-about-page.orb +440 -0
  178. package/dist/behaviors/registry/marketing/molecules/std-feature-detail-page.orb +371 -0
  179. package/dist/behaviors/registry/marketing/molecules/std-landing-page.orb +521 -0
  180. package/dist/behaviors/registry/marketing/molecules/std-pricing-page.orb +406 -0
  181. package/dist/behaviors/registry/marketing/organisms/std-marketing-site.orb +1654 -0
  182. package/dist/behaviors-registry.json +2913 -156
  183. package/dist/registry/app/atoms/std-ap-bill.orb +423 -171
  184. package/dist/registry/app/atoms/std-applicant.orb +207 -165
  185. package/dist/registry/app/atoms/std-application.orb +300 -188
  186. package/dist/registry/app/atoms/std-approval-request.orb +370 -215
  187. package/dist/registry/app/atoms/std-campaign-goal.orb +382 -167
  188. package/dist/registry/app/atoms/std-change-order.orb +458 -194
  189. package/dist/registry/app/atoms/std-chart-of-accounts.orb +201 -130
  190. package/dist/registry/app/atoms/std-checkin.orb +215 -151
  191. package/dist/registry/app/atoms/std-checkout-terminal.orb +322 -133
  192. package/dist/registry/app/atoms/std-class-roster.orb +343 -170
  193. package/dist/registry/app/atoms/std-class-session.orb +321 -190
  194. package/dist/registry/app/atoms/std-court-deadline.orb +353 -182
  195. package/dist/registry/app/atoms/std-customer-account.orb +376 -157
  196. package/dist/registry/app/atoms/std-donation-receipt.orb +214 -143
  197. package/dist/registry/app/atoms/std-donor.orb +191 -156
  198. package/dist/registry/app/atoms/std-drip-sequence.orb +409 -170
  199. package/dist/registry/app/atoms/std-driver.orb +440 -202
  200. package/dist/registry/app/atoms/std-dunning.orb +431 -167
  201. package/dist/registry/app/atoms/std-email-broadcast.orb +386 -143
  202. package/dist/registry/app/atoms/std-event.orb +309 -178
  203. package/dist/registry/app/atoms/std-form-builder.orb +353 -220
  204. package/dist/registry/app/atoms/std-health-score.orb +218 -183
  205. package/dist/registry/app/atoms/std-help-article.orb +425 -162
  206. package/dist/registry/app/atoms/std-help-category.orb +409 -166
  207. package/dist/registry/app/atoms/std-interview-slot.orb +311 -138
  208. package/dist/registry/app/atoms/std-invoice.orb +349 -211
  209. package/dist/registry/app/atoms/std-kitchen-display.orb +308 -184
  210. package/dist/registry/app/atoms/std-lease.orb +411 -178
  211. package/dist/registry/app/atoms/std-ledger-entry.orb +266 -195
  212. package/dist/registry/app/atoms/std-maintenance-request.orb +396 -177
  213. package/dist/registry/app/atoms/std-matter.orb +415 -189
  214. package/dist/registry/app/atoms/std-membership.orb +387 -167
  215. package/dist/registry/app/atoms/std-menu.orb +232 -175
  216. package/dist/registry/app/atoms/std-modifier-group.orb +224 -167
  217. package/dist/registry/app/atoms/std-nps-survey.orb +390 -138
  218. package/dist/registry/app/atoms/std-offer-letter.orb +242 -133
  219. package/dist/registry/app/atoms/std-payout-ledger.orb +428 -176
  220. package/dist/registry/app/atoms/std-question-bank.orb +211 -145
  221. package/dist/registry/app/atoms/std-receipt.orb +248 -177
  222. package/dist/registry/app/atoms/std-recurring-charge.orb +421 -149
  223. package/dist/registry/app/atoms/std-renewal-risk.orb +382 -153
  224. package/dist/registry/app/atoms/std-rent-charge.orb +476 -176
  225. package/dist/registry/app/atoms/std-reorder-rule.orb +246 -176
  226. package/dist/registry/app/atoms/std-response-collector.orb +213 -150
  227. package/dist/registry/app/atoms/std-rfi.orb +365 -210
  228. package/dist/registry/app/atoms/std-route-optimize.orb +195 -146
  229. package/dist/registry/app/atoms/std-segment.orb +173 -139
  230. package/dist/registry/app/atoms/std-stock-level.orb +205 -135
  231. package/dist/registry/app/atoms/std-submittal.orb +323 -166
  232. package/dist/registry/app/atoms/std-table-map.orb +187 -63
  233. package/dist/registry/app/atoms/std-technician-dispatch.orb +290 -202
  234. package/dist/registry/app/atoms/std-telematics-event.orb +156 -128
  235. package/dist/registry/app/atoms/std-template-editor.orb +255 -189
  236. package/dist/registry/app/atoms/std-tenant.orb +375 -147
  237. package/dist/registry/app/atoms/std-ticket-tier.orb +463 -150
  238. package/dist/registry/app/atoms/std-time-entry.orb +259 -150
  239. package/dist/registry/app/atoms/std-timesheet.orb +292 -183
  240. package/dist/registry/app/atoms/std-trial.orb +401 -183
  241. package/dist/registry/app/atoms/std-vehicle.orb +447 -205
  242. package/dist/registry/app/atoms/std-vendor-onboarding.orb +289 -245
  243. package/dist/registry/app/atoms/std-waitlist.orb +308 -177
  244. package/dist/registry/app/atoms/std-warehouse.orb +211 -141
  245. package/dist/registry/app/atoms/std-work-order.orb +374 -219
  246. package/dist/registry/app/organisms/std-subscription-billing.orb +282 -195
  247. package/dist/registry/core/atoms/std-approval-gate.orb +703 -0
  248. package/dist/registry/core/atoms/std-audit-capture.orb +150 -64
  249. package/dist/registry/core/atoms/std-data-erasure.orb +546 -0
  250. package/dist/registry/core/atoms/std-lifecycle.orb +343 -0
  251. package/dist/registry/core/atoms/std-notify-on-event.orb +132 -46
  252. package/dist/registry/core/atoms/std-reminder-scheduler.orb +330 -0
  253. package/dist/registry/marketing/atoms/std-marketing-article.orb +96 -0
  254. package/dist/registry/marketing/atoms/std-marketing-case-studies.orb +243 -0
  255. package/dist/registry/marketing/atoms/std-marketing-community.orb +134 -0
  256. package/dist/registry/marketing/atoms/std-marketing-cta.orb +206 -0
  257. package/dist/registry/marketing/atoms/std-marketing-features.orb +193 -0
  258. package/dist/registry/marketing/atoms/std-marketing-footer.orb +192 -0
  259. package/dist/registry/marketing/atoms/std-marketing-hero.orb +262 -0
  260. package/dist/registry/marketing/atoms/std-marketing-nav.orb +190 -0
  261. package/dist/registry/marketing/atoms/std-marketing-pricing.orb +232 -0
  262. package/dist/registry/marketing/atoms/std-marketing-showcase.orb +276 -0
  263. package/dist/registry/marketing/atoms/std-marketing-split.orb +135 -0
  264. package/dist/registry/marketing/atoms/std-marketing-stats.orb +120 -0
  265. package/dist/registry/marketing/atoms/std-marketing-steps.orb +179 -0
  266. package/dist/registry/marketing/atoms/std-marketing-team.orb +192 -0
  267. package/dist/registry/marketing/atoms/std-marketing-testimonials.orb +124 -0
  268. package/dist/registry/marketing/molecules/std-about-page.orb +440 -0
  269. package/dist/registry/marketing/molecules/std-feature-detail-page.orb +371 -0
  270. package/dist/registry/marketing/molecules/std-landing-page.orb +521 -0
  271. package/dist/registry/marketing/molecules/std-pricing-page.orb +406 -0
  272. package/dist/registry/marketing/organisms/std-marketing-site.orb +1654 -0
  273. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "std-approval-request",
3
- "version": "1.3.0",
4
- "description": "std-approval-request — approver inbox / triage queue. Browses many pending approval requests in a list (data-grid), opens one at a time for detail with Approve / Reject / Request Info / Withdraw. Pick this when the user is an approver working through a queue. For single-item N-step sequential approval (manager finance → exec on ONE item), use std-approval-chain instead. Agents tune the list shape via `config.fields` + `config.itemActions`.",
3
+ "version": "1.4.0",
4
+ "description": "std-approval-request — approver inbox/triage queue (use std-approval-chain for sequential single-item approvals). Listens for SET_STATUS so std-lifecycle can auto-withdraw stale requests. Exposes Service/Operations knobs (responseTimeMinutes, resolutionSLAHours, …).",
5
5
  "orbitals": [
6
6
  {
7
7
  "name": "ApprovalRequestOrbital",
@@ -327,6 +327,22 @@
327
327
  }
328
328
  ]
329
329
  },
330
+ {
331
+ "key": "SET_STATUS",
332
+ "name": "Set Status",
333
+ "payloadSchema": [
334
+ {
335
+ "name": "entityId",
336
+ "type": "string",
337
+ "required": true
338
+ },
339
+ {
340
+ "name": "newStatus",
341
+ "type": "string",
342
+ "required": true
343
+ }
344
+ ]
345
+ },
330
346
  {
331
347
  "key": "CLOSE_REQUEST",
332
348
  "name": "Close Request"
@@ -405,8 +421,8 @@
405
421
  "ApprovalRequest",
406
422
  {
407
423
  "emit": {
408
- "failure": "ApprovalRequestLoadFailed",
409
- "success": "ApprovalRequestLoaded"
424
+ "success": "ApprovalRequestLoaded",
425
+ "failure": "ApprovalRequestLoadFailed"
410
426
  }
411
427
  }
412
428
  ],
@@ -414,22 +430,22 @@
414
430
  "render-ui",
415
431
  "main",
416
432
  {
417
- "align": "center",
418
433
  "children": [
419
434
  {
420
435
  "type": "spinner"
421
436
  },
422
437
  {
423
- "type": "typography",
424
438
  "variant": "caption",
439
+ "content": "Loading approval requests…",
425
440
  "color": "muted",
426
- "content": "Loading approval requests…"
441
+ "type": "typography"
427
442
  }
428
443
  ],
429
- "gap": "md",
430
444
  "className": "py-12",
431
445
  "type": "stack",
432
- "direction": "vertical"
446
+ "direction": "vertical",
447
+ "gap": "md",
448
+ "align": "center"
433
449
  }
434
450
  ]
435
451
  ]
@@ -443,53 +459,52 @@
443
459
  "render-ui",
444
460
  "main",
445
461
  {
446
- "type": "stack",
447
462
  "direction": "vertical",
448
463
  "children": [
449
464
  {
450
- "align": "center",
451
465
  "type": "stack",
466
+ "gap": "sm",
467
+ "direction": "horizontal",
468
+ "align": "center",
452
469
  "children": [
453
470
  {
454
- "name": "check-circle",
455
- "type": "icon"
471
+ "type": "icon",
472
+ "name": "check-circle"
456
473
  },
457
474
  {
458
475
  "content": "@config.title",
459
- "variant": "h3",
460
- "type": "typography"
476
+ "type": "typography",
477
+ "variant": "h3"
461
478
  }
462
- ],
463
- "direction": "horizontal",
464
- "gap": "sm"
479
+ ]
465
480
  },
466
481
  {
467
482
  "type": "simple-grid",
468
483
  "cols": 4.0,
469
484
  "children": [
470
485
  {
471
- "type": "stat-display",
472
486
  "icon": "inbox",
473
- "label": "Total requests",
474
- "value": "@payload.data.length"
487
+ "value": "@payload.data.length",
488
+ "type": "stat-display",
489
+ "label": "Total requests"
475
490
  },
476
491
  {
477
492
  "label": "Pending",
478
493
  "value": "14",
479
- "type": "stat-display",
480
- "icon": "clock"
494
+ "icon": "clock",
495
+ "type": "stat-display"
481
496
  },
482
497
  {
483
- "type": "stat-display",
484
498
  "value": "82%",
499
+ "type": "stat-display",
485
500
  "label": "Approved",
486
501
  "icon": "check-circle"
487
502
  },
488
503
  {
489
504
  "label": "Avg cycle",
490
- "icon": "timer",
491
505
  "type": "stat-display",
492
- "value": "1.4 days"
506
+ "value": "1.4 days",
507
+ "icon": "timer"
493
508
  }
494
509
  ]
495
510
  },
@@ -497,15 +512,16 @@
497
512
  "type": "divider"
498
513
  },
499
514
  {
500
- "fields": "@config.fields",
501
- "itemActions": "@config.itemActions",
502
- "entity": "@payload.data",
503
515
  "type": "data-grid",
504
- "cols": 1.0,
505
- "gap": "sm"
516
+ "entity": "@payload.data",
517
+ "itemActions": "@config.itemActions",
518
+ "gap": "sm",
519
+ "fields": "@config.fields",
520
+ "cols": 1.0
506
521
  }
507
522
  ],
508
- "gap": "md"
523
+ "gap": "md",
524
+ "type": "stack"
509
525
  }
510
526
  ]
511
527
  ]
@@ -519,9 +535,9 @@
519
535
  "render-ui",
520
536
  "main",
521
537
  {
538
+ "type": "alert",
522
539
  "variant": "error",
523
- "message": "@payload.message",
524
- "type": "alert"
540
+ "message": "@payload.message"
525
541
  }
526
542
  ]
527
543
  ]
@@ -591,26 +607,25 @@
591
607
  "main",
592
608
  {
593
609
  "type": "stack",
594
- "direction": "vertical",
595
- "gap": "md",
596
610
  "children": [
597
611
  {
612
+ "gap": "sm",
598
613
  "align": "center",
599
614
  "children": [
600
615
  {
601
- "variant": "ghost",
602
- "action": "CLOSE_REQUEST",
603
616
  "label": "Back",
604
- "type": "button"
617
+ "action": "CLOSE_REQUEST",
618
+ "type": "button",
619
+ "variant": "ghost"
605
620
  },
606
621
  {
607
622
  "type": "icon",
608
623
  "name": "check-circle"
609
624
  },
610
625
  {
611
- "type": "typography",
612
626
  "variant": "h3",
613
- "content": "@entity.title"
627
+ "content": "@entity.title",
628
+ "type": "typography"
614
629
  },
615
630
  {
616
631
  "type": "badge",
@@ -623,9 +638,8 @@
623
638
  "label": "@entity.approverDecision"
624
639
  }
625
640
  ],
626
- "type": "stack",
627
- "gap": "sm",
628
- "direction": "horizontal"
641
+ "direction": "horizontal",
642
+ "type": "stack"
629
643
  },
630
644
  {
631
645
  "type": "divider"
@@ -638,79 +652,79 @@
638
652
  {
639
653
  "children": [
640
654
  {
641
- "color": "muted",
642
655
  "type": "typography",
643
- "content": "Target",
644
- "variant": "caption"
656
+ "color": "muted",
657
+ "variant": "caption",
658
+ "content": "Target"
645
659
  },
646
660
  {
647
- "variant": "body",
648
661
  "type": "typography",
662
+ "variant": "body",
649
663
  "content": "@entity.targetType"
650
664
  },
651
665
  {
652
- "content": "@entity.targetId",
653
666
  "type": "typography",
667
+ "content": "@entity.targetId",
654
668
  "variant": "body"
655
669
  }
656
670
  ],
657
671
  "type": "stack",
658
- "gap": "md",
659
- "direction": "horizontal"
672
+ "direction": "horizontal",
673
+ "gap": "md"
660
674
  },
661
675
  {
662
- "type": "stack",
663
676
  "direction": "horizontal",
664
- "gap": "md",
665
677
  "children": [
666
678
  {
667
679
  "type": "typography",
668
- "content": "Requested by",
669
680
  "variant": "caption",
670
- "color": "muted"
681
+ "color": "muted",
682
+ "content": "Requested by"
671
683
  },
672
684
  {
673
685
  "variant": "body",
674
- "content": "@entity.requestedBy",
675
- "type": "typography"
686
+ "type": "typography",
687
+ "content": "@entity.requestedBy"
676
688
  }
677
- ]
689
+ ],
690
+ "gap": "md",
691
+ "type": "stack"
678
692
  },
679
693
  {
680
694
  "direction": "horizontal",
681
- "gap": "md",
682
695
  "type": "stack",
696
+ "gap": "md",
683
697
  "children": [
684
698
  {
699
+ "color": "muted",
685
700
  "variant": "caption",
686
- "content": "Approver",
687
701
  "type": "typography",
688
- "color": "muted"
702
+ "content": "Approver"
689
703
  },
690
704
  {
691
- "variant": "body",
692
705
  "type": "typography",
706
+ "variant": "body",
693
707
  "content": "@entity.assignedApprover"
694
708
  }
695
709
  ]
696
710
  },
697
711
  {
712
+ "direction": "horizontal",
698
713
  "type": "stack",
699
714
  "gap": "md",
700
715
  "children": [
701
716
  {
702
- "content": "Comment",
703
717
  "color": "muted",
704
718
  "type": "typography",
719
+ "content": "Comment",
705
720
  "variant": "caption"
706
721
  },
707
722
  {
708
723
  "type": "typography",
709
- "content": "@entity.comment",
710
- "variant": "body"
724
+ "variant": "body",
725
+ "content": "@entity.comment"
711
726
  }
712
- ],
713
- "direction": "horizontal"
727
+ ]
714
728
  }
715
729
  ]
716
730
  },
@@ -719,67 +733,69 @@
719
733
  },
720
734
  {
721
735
  "cols": 2.0,
736
+ "type": "simple-grid",
722
737
  "children": [
723
738
  {
724
- "value": "@entity.requestedAt",
725
- "icon": "calendar",
726
739
  "type": "stat-display",
727
- "label": "Requested at"
740
+ "label": "Requested at",
741
+ "icon": "calendar",
742
+ "value": "@entity.requestedAt"
728
743
  },
729
744
  {
730
- "label": "Decided at",
731
- "type": "stat-display",
745
+ "value": "@entity.decidedAt",
732
746
  "icon": "calendar-check",
733
- "value": "@entity.decidedAt"
747
+ "type": "stat-display",
748
+ "label": "Decided at"
734
749
  }
735
- ],
736
- "type": "simple-grid"
750
+ ]
737
751
  },
738
752
  {
753
+ "align": "center",
754
+ "type": "stack",
755
+ "direction": "horizontal",
739
756
  "children": [
740
757
  {
741
- "variant": "primary",
742
- "type": "button",
743
- "action": "APPROVE",
744
- "label": "Approve",
745
758
  "actionPayload": {
746
759
  "id": "@entity.id"
747
- }
760
+ },
761
+ "type": "button",
762
+ "variant": "primary",
763
+ "action": "APPROVE",
764
+ "label": "Approve"
748
765
  },
749
766
  {
767
+ "action": "REJECT",
768
+ "label": "Reject",
769
+ "type": "button",
750
770
  "actionPayload": {
751
771
  "id": "@entity.id"
752
772
  },
753
- "type": "button",
754
- "label": "Reject",
755
- "variant": "danger",
756
- "action": "REJECT"
773
+ "variant": "danger"
757
774
  },
758
775
  {
759
- "label": "Request Info",
760
- "variant": "secondary",
761
- "type": "button",
762
776
  "action": "REQUEST_INFO",
777
+ "variant": "secondary",
763
778
  "actionPayload": {
764
779
  "id": "@entity.id"
765
- }
780
+ },
781
+ "type": "button",
782
+ "label": "Request Info"
766
783
  },
767
784
  {
768
785
  "label": "Withdraw",
769
786
  "action": "WITHDRAW",
770
- "variant": "ghost",
787
+ "type": "button",
771
788
  "actionPayload": {
772
789
  "id": "@entity.id"
773
790
  },
774
- "type": "button"
791
+ "variant": "ghost"
775
792
  }
776
793
  ],
777
- "type": "stack",
778
- "align": "center",
779
- "gap": "sm",
780
- "direction": "horizontal"
794
+ "gap": "sm"
781
795
  }
782
- ]
796
+ ],
797
+ "gap": "md",
798
+ "direction": "vertical"
783
799
  }
784
800
  ]
785
801
  ]
@@ -808,22 +824,73 @@
808
824
  "render-ui",
809
825
  "main",
810
826
  {
811
- "direction": "vertical",
812
- "className": "py-12",
813
827
  "children": [
814
828
  {
815
829
  "type": "spinner"
816
830
  },
817
831
  {
818
- "variant": "caption",
819
- "color": "muted",
820
832
  "content": "Withdrawing request…",
821
- "type": "typography"
833
+ "type": "typography",
834
+ "color": "muted",
835
+ "variant": "caption"
822
836
  }
823
837
  ],
838
+ "gap": "md",
824
839
  "type": "stack",
840
+ "className": "py-12",
841
+ "align": "center",
842
+ "direction": "vertical"
843
+ }
844
+ ]
845
+ ]
846
+ },
847
+ {
848
+ "from": "browsing",
849
+ "to": "loading",
850
+ "event": "SET_STATUS",
851
+ "effects": [
852
+ [
853
+ "set",
854
+ "@entity.id",
855
+ "@payload.entityId"
856
+ ],
857
+ [
858
+ "set",
859
+ "@entity.status",
860
+ "@payload.newStatus"
861
+ ],
862
+ [
863
+ "persist",
864
+ "update",
865
+ "ApprovalRequest",
866
+ "@entity",
867
+ {
868
+ "emit": {
869
+ "failure": "ApprovalRequestLoadFailed",
870
+ "success": "ApprovalRequestLoaded"
871
+ }
872
+ }
873
+ ],
874
+ [
875
+ "render-ui",
876
+ "main",
877
+ {
878
+ "direction": "vertical",
879
+ "align": "center",
825
880
  "gap": "md",
826
- "align": "center"
881
+ "className": "py-12",
882
+ "children": [
883
+ {
884
+ "type": "spinner"
885
+ },
886
+ {
887
+ "color": "muted",
888
+ "content": "Updating approval status…",
889
+ "type": "typography",
890
+ "variant": "caption"
891
+ }
892
+ ],
893
+ "type": "stack"
827
894
  }
828
895
  ]
829
896
  ]
@@ -847,22 +914,22 @@
847
914
  "render-ui",
848
915
  "main",
849
916
  {
917
+ "className": "py-12",
850
918
  "children": [
851
919
  {
852
920
  "type": "spinner"
853
921
  },
854
922
  {
855
- "type": "typography",
856
- "variant": "caption",
923
+ "color": "muted",
857
924
  "content": "Loading approval requests…",
858
- "color": "muted"
925
+ "type": "typography",
926
+ "variant": "caption"
859
927
  }
860
928
  ],
861
- "className": "py-12",
862
929
  "direction": "vertical",
863
- "type": "stack",
930
+ "gap": "md",
864
931
  "align": "center",
865
- "gap": "md"
932
+ "type": "stack"
866
933
  }
867
934
  ]
868
935
  ]
@@ -882,8 +949,8 @@
882
949
  "ApprovalRequest",
883
950
  {
884
951
  "emit": {
885
- "success": "ApprovalRequestLoaded",
886
- "failure": "ApprovalRequestLoadFailed"
952
+ "failure": "ApprovalRequestLoadFailed",
953
+ "success": "ApprovalRequestLoaded"
887
954
  }
888
955
  }
889
956
  ],
@@ -891,22 +958,22 @@
891
958
  "render-ui",
892
959
  "main",
893
960
  {
894
- "className": "py-12",
895
961
  "direction": "vertical",
896
- "gap": "md",
897
- "type": "stack",
898
- "align": "center",
899
962
  "children": [
900
963
  {
901
964
  "type": "spinner"
902
965
  },
903
966
  {
904
967
  "variant": "caption",
968
+ "color": "muted",
905
969
  "content": "Recording approval…",
906
- "type": "typography",
907
- "color": "muted"
970
+ "type": "typography"
908
971
  }
909
- ]
972
+ ],
973
+ "className": "py-12",
974
+ "gap": "md",
975
+ "type": "stack",
976
+ "align": "center"
910
977
  }
911
978
  ]
912
979
  ]
@@ -931,8 +998,8 @@
931
998
  "ApprovalRequest",
932
999
  {
933
1000
  "emit": {
934
- "success": "ApprovalRequestLoaded",
935
- "failure": "ApprovalRequestLoadFailed"
1001
+ "failure": "ApprovalRequestLoadFailed",
1002
+ "success": "ApprovalRequestLoaded"
936
1003
  }
937
1004
  }
938
1005
  ],
@@ -940,22 +1007,22 @@
940
1007
  "render-ui",
941
1008
  "main",
942
1009
  {
943
- "direction": "vertical",
944
1010
  "children": [
945
1011
  {
946
1012
  "type": "spinner"
947
1013
  },
948
1014
  {
1015
+ "color": "muted",
949
1016
  "content": "Recording rejection…",
950
1017
  "variant": "caption",
951
- "type": "typography",
952
- "color": "muted"
1018
+ "type": "typography"
953
1019
  }
954
1020
  ],
955
1021
  "type": "stack",
956
- "className": "py-12",
1022
+ "align": "center",
957
1023
  "gap": "md",
958
- "align": "center"
1024
+ "className": "py-12",
1025
+ "direction": "vertical"
959
1026
  }
960
1027
  ]
961
1028
  ]
@@ -984,35 +1051,33 @@
984
1051
  "render-ui",
985
1052
  "main",
986
1053
  {
987
- "type": "stack",
988
1054
  "direction": "vertical",
989
- "gap": "md",
990
1055
  "children": [
991
1056
  {
1057
+ "align": "center",
992
1058
  "type": "stack",
993
1059
  "direction": "horizontal",
994
- "align": "center",
995
- "gap": "sm",
996
1060
  "children": [
997
1061
  {
998
- "name": "x-circle",
999
- "type": "icon"
1062
+ "type": "icon",
1063
+ "name": "x-circle"
1000
1064
  },
1001
1065
  {
1002
1066
  "type": "typography",
1003
1067
  "content": "Reject request",
1004
1068
  "variant": "h3"
1005
1069
  }
1006
- ]
1070
+ ],
1071
+ "gap": "sm"
1007
1072
  },
1008
1073
  {
1009
1074
  "type": "divider"
1010
1075
  },
1011
1076
  {
1012
- "variant": "caption",
1013
- "color": "muted",
1014
1077
  "type": "typography",
1015
- "content": "Provide a reason for rejecting this request."
1078
+ "variant": "caption",
1079
+ "content": "Provide a reason for rejecting this request.",
1080
+ "color": "muted"
1016
1081
  },
1017
1082
  {
1018
1083
  "action": "EDIT_COMMENT",
@@ -1020,31 +1085,33 @@
1020
1085
  "placeholder": "Reason for rejection"
1021
1086
  },
1022
1087
  {
1023
- "type": "stack",
1024
1088
  "children": [
1025
1089
  {
1026
- "variant": "danger",
1027
1090
  "type": "button",
1091
+ "variant": "danger",
1092
+ "action": "SUBMIT_REJECTION",
1028
1093
  "actionPayload": {
1029
- "id": "@entity.id",
1030
- "comment": "@entity.comment"
1094
+ "comment": "@entity.comment",
1095
+ "id": "@entity.id"
1031
1096
  },
1032
- "action": "SUBMIT_REJECTION",
1033
- "label": "Submit rejection",
1034
- "icon": "send"
1097
+ "icon": "send",
1098
+ "label": "Submit rejection"
1035
1099
  },
1036
1100
  {
1101
+ "label": "Cancel",
1102
+ "variant": "ghost",
1037
1103
  "action": "CANCEL_REJECTION",
1038
- "type": "button",
1039
1104
  "icon": "x",
1040
- "label": "Cancel",
1041
- "variant": "ghost"
1105
+ "type": "button"
1042
1106
  }
1043
1107
  ],
1044
- "gap": "sm",
1045
- "direction": "horizontal"
1108
+ "type": "stack",
1109
+ "direction": "horizontal",
1110
+ "gap": "sm"
1046
1111
  }
1047
- ]
1112
+ ],
1113
+ "gap": "md",
1114
+ "type": "stack"
1048
1115
  }
1049
1116
  ]
1050
1117
  ]
@@ -1073,22 +1140,22 @@
1073
1140
  "render-ui",
1074
1141
  "main",
1075
1142
  {
1076
- "direction": "vertical",
1077
- "className": "py-12",
1078
- "align": "center",
1079
- "gap": "md",
1080
1143
  "children": [
1081
1144
  {
1082
1145
  "type": "spinner"
1083
1146
  },
1084
1147
  {
1085
- "content": "Requesting more info…",
1086
1148
  "variant": "caption",
1087
1149
  "color": "muted",
1088
- "type": "typography"
1150
+ "type": "typography",
1151
+ "content": "Requesting more info…"
1089
1152
  }
1090
1153
  ],
1091
- "type": "stack"
1154
+ "direction": "vertical",
1155
+ "type": "stack",
1156
+ "align": "center",
1157
+ "gap": "md",
1158
+ "className": "py-12"
1092
1159
  }
1093
1160
  ]
1094
1161
  ]
@@ -1108,8 +1175,8 @@
1108
1175
  "ApprovalRequest",
1109
1176
  {
1110
1177
  "emit": {
1111
- "success": "ApprovalRequestLoaded",
1112
- "failure": "ApprovalRequestLoadFailed"
1178
+ "failure": "ApprovalRequestLoadFailed",
1179
+ "success": "ApprovalRequestLoaded"
1113
1180
  }
1114
1181
  }
1115
1182
  ],
@@ -1117,22 +1184,22 @@
1117
1184
  "render-ui",
1118
1185
  "main",
1119
1186
  {
1120
- "align": "center",
1187
+ "gap": "md",
1188
+ "type": "stack",
1121
1189
  "children": [
1122
1190
  {
1123
1191
  "type": "spinner"
1124
1192
  },
1125
1193
  {
1126
- "type": "typography",
1127
- "color": "muted",
1128
1194
  "variant": "caption",
1129
- "content": "Withdrawing request…"
1195
+ "color": "muted",
1196
+ "content": "Withdrawing request…",
1197
+ "type": "typography"
1130
1198
  }
1131
1199
  ],
1132
1200
  "direction": "vertical",
1133
1201
  "className": "py-12",
1134
- "gap": "md",
1135
- "type": "stack"
1202
+ "align": "center"
1136
1203
  }
1137
1204
  ]
1138
1205
  ]
@@ -1173,22 +1240,22 @@
1173
1240
  "render-ui",
1174
1241
  "main",
1175
1242
  {
1176
- "type": "stack",
1177
1243
  "align": "center",
1178
1244
  "className": "py-12",
1179
- "direction": "vertical",
1180
- "gap": "md",
1181
1245
  "children": [
1182
1246
  {
1183
1247
  "type": "spinner"
1184
1248
  },
1185
1249
  {
1250
+ "color": "muted",
1186
1251
  "variant": "caption",
1187
- "type": "typography",
1188
1252
  "content": "Recording rejection…",
1189
- "color": "muted"
1253
+ "type": "typography"
1190
1254
  }
1191
- ]
1255
+ ],
1256
+ "direction": "vertical",
1257
+ "type": "stack",
1258
+ "gap": "md"
1192
1259
  }
1193
1260
  ]
1194
1261
  ]
@@ -1212,22 +1279,22 @@
1212
1279
  "render-ui",
1213
1280
  "main",
1214
1281
  {
1215
- "direction": "vertical",
1216
- "gap": "md",
1282
+ "className": "py-12",
1217
1283
  "children": [
1218
1284
  {
1219
1285
  "type": "spinner"
1220
1286
  },
1221
1287
  {
1222
- "content": "Loading approval requests…",
1288
+ "color": "muted",
1223
1289
  "variant": "caption",
1224
- "type": "typography",
1225
- "color": "muted"
1290
+ "content": "Loading approval requests…",
1291
+ "type": "typography"
1226
1292
  }
1227
1293
  ],
1294
+ "gap": "md",
1228
1295
  "type": "stack",
1229
- "align": "center",
1230
- "className": "py-12"
1296
+ "direction": "vertical",
1297
+ "align": "center"
1231
1298
  }
1232
1299
  ]
1233
1300
  ]
@@ -1260,6 +1327,96 @@
1260
1327
  ]
1261
1328
  },
1262
1329
  "config": {
1330
+ "responseTimeMinutes": {
1331
+ "type": "number",
1332
+ "default": 240.0,
1333
+ "label": "Response time SLA (min)",
1334
+ "description": "Target minutes from request submitted to first approver acknowledgement.",
1335
+ "tier": "essential"
1336
+ },
1337
+ "requireCommentOnReject": {
1338
+ "type": "boolean",
1339
+ "default": false,
1340
+ "label": "Require reject comment",
1341
+ "description": "Force approvers to enter a reason when rejecting",
1342
+ "tier": "customization"
1343
+ },
1344
+ "serviceAreaRadius": {
1345
+ "type": "number",
1346
+ "default": 0.0,
1347
+ "label": "Service area radius (mi)",
1348
+ "description": "Geographic distance limit for assignable approvers. Zero = no restriction.",
1349
+ "tier": "customization"
1350
+ },
1351
+ "serviceZones": {
1352
+ "type": "[string]",
1353
+ "default": [],
1354
+ "label": "Service zones",
1355
+ "description": "Named approver pools (e.g. by region, department, business unit).",
1356
+ "tier": "customization",
1357
+ "items": {
1358
+ "type": "string"
1359
+ }
1360
+ },
1361
+ "skillsRequired": {
1362
+ "type": "[string]",
1363
+ "default": [],
1364
+ "label": "Required skills",
1365
+ "description": "Capability tags an approver must hold (e.g. 'finance', 'legal', 'security').",
1366
+ "tier": "customization",
1367
+ "items": {
1368
+ "type": "string"
1369
+ }
1370
+ },
1371
+ "resolutionSLAHours": {
1372
+ "type": "number",
1373
+ "default": 48.0,
1374
+ "label": "Resolution SLA (hours)",
1375
+ "description": "Target hours from submitted to decided. Compose std-lifecycle to auto-escalate.",
1376
+ "tier": "essential"
1377
+ },
1378
+ "escalationThresholdHours": {
1379
+ "type": "number",
1380
+ "default": 72.0,
1381
+ "label": "Escalation threshold (hours)",
1382
+ "description": "Hours after which a pending request auto-escalates to backup approvers.",
1383
+ "tier": "customization"
1384
+ },
1385
+ "requirePhotoOnComplete": {
1386
+ "type": "boolean",
1387
+ "default": false,
1388
+ "label": "Require photo on complete",
1389
+ "description": "Block APPROVE unless supporting evidence is attached.",
1390
+ "tier": "customization"
1391
+ },
1392
+ "requireSignatureOnComplete": {
1393
+ "type": "boolean",
1394
+ "default": false,
1395
+ "label": "Require approver signature on complete",
1396
+ "description": "Block APPROVE unless approver signature is captured (compose std-signature-capture).",
1397
+ "tier": "customization"
1398
+ },
1399
+ "customerVisibleStatuses": {
1400
+ "type": "[string]",
1401
+ "default": [
1402
+ "submitted",
1403
+ "approved",
1404
+ "rejected"
1405
+ ],
1406
+ "label": "Customer-visible statuses",
1407
+ "description": "Subset of statuses the requester sees in their tracking view.",
1408
+ "tier": "customization",
1409
+ "items": {
1410
+ "type": "string"
1411
+ }
1412
+ },
1413
+ "title": {
1414
+ "type": "string",
1415
+ "default": "Approval Requests",
1416
+ "label": "Section title",
1417
+ "description": "Heading shown above the approval queue",
1418
+ "tier": "customization"
1419
+ },
1263
1420
  "fields": {
1264
1421
  "type": "[FieldSpec]",
1265
1422
  "default": [
@@ -1269,14 +1426,14 @@
1269
1426
  "variant": "caption"
1270
1427
  },
1271
1428
  {
1272
- "name": "targetType",
1429
+ "variant": "badge",
1273
1430
  "label": "Target",
1274
- "variant": "badge"
1431
+ "name": "targetType"
1275
1432
  },
1276
1433
  {
1434
+ "label": "Requested By",
1277
1435
  "variant": "caption",
1278
- "name": "requestedBy",
1279
- "label": "Requested By"
1436
+ "name": "requestedBy"
1280
1437
  },
1281
1438
  {
1282
1439
  "name": "assignedApprover",
@@ -1285,17 +1442,17 @@
1285
1442
  },
1286
1443
  {
1287
1444
  "name": "approverDecision",
1288
- "variant": "badge",
1289
- "label": "Decision"
1445
+ "label": "Decision",
1446
+ "variant": "badge"
1290
1447
  },
1291
1448
  {
1292
1449
  "variant": "badge",
1293
- "name": "status",
1294
- "label": "Status"
1450
+ "label": "Status",
1451
+ "name": "status"
1295
1452
  },
1296
1453
  {
1297
- "name": "decidedAt",
1298
1454
  "label": "Decided",
1455
+ "name": "decidedAt",
1299
1456
  "variant": "caption"
1300
1457
  }
1301
1458
  ],
@@ -1305,8 +1462,8 @@
1305
1462
  "items": {
1306
1463
  "type": "object",
1307
1464
  "properties": {
1308
- "format": {
1309
- "name": "format",
1465
+ "key": {
1466
+ "name": "key",
1310
1467
  "type": "string",
1311
1468
  "required": false
1312
1469
  },
@@ -1315,6 +1472,11 @@
1315
1472
  "type": "string",
1316
1473
  "required": false
1317
1474
  },
1475
+ "icon": {
1476
+ "name": "icon",
1477
+ "type": "string",
1478
+ "required": false
1479
+ },
1318
1480
  "label": {
1319
1481
  "name": "label",
1320
1482
  "type": "string",
@@ -1325,39 +1487,27 @@
1325
1487
  "type": "string",
1326
1488
  "required": true
1327
1489
  },
1328
- "icon": {
1329
- "name": "icon",
1330
- "type": "string",
1331
- "required": false
1332
- },
1333
1490
  "variant": {
1334
1491
  "name": "variant",
1335
1492
  "type": "string",
1336
1493
  "required": false
1337
1494
  },
1338
- "key": {
1339
- "name": "key",
1495
+ "format": {
1496
+ "name": "format",
1340
1497
  "type": "string",
1341
1498
  "required": false
1342
1499
  }
1343
1500
  }
1344
1501
  }
1345
1502
  },
1346
- "requireCommentOnReject": {
1347
- "type": "boolean",
1348
- "default": false,
1349
- "label": "Require reject comment",
1350
- "description": "Force approvers to enter a reason when rejecting",
1351
- "tier": "customization"
1352
- },
1353
1503
  "itemActions": {
1354
1504
  "type": "[ItemAction]",
1355
1505
  "default": [
1356
1506
  {
1507
+ "variant": "primary",
1357
1508
  "label": "Open",
1358
- "event": "OPEN_REQUEST",
1359
1509
  "icon": "arrow-right",
1360
- "variant": "primary"
1510
+ "event": "OPEN_REQUEST"
1361
1511
  },
1362
1512
  {
1363
1513
  "variant": "danger",
@@ -1371,35 +1521,40 @@
1371
1521
  "items": {
1372
1522
  "type": "object",
1373
1523
  "properties": {
1374
- "variant": {
1375
- "name": "variant",
1524
+ "label": {
1525
+ "name": "label",
1376
1526
  "type": "string",
1377
- "required": false
1527
+ "required": true
1378
1528
  },
1379
1529
  "event": {
1380
1530
  "name": "event",
1381
1531
  "type": "string",
1382
1532
  "required": true
1383
1533
  },
1384
- "label": {
1385
- "name": "label",
1386
- "type": "string",
1387
- "required": true
1388
- },
1389
1534
  "icon": {
1390
1535
  "name": "icon",
1391
1536
  "type": "string",
1392
1537
  "required": false
1538
+ },
1539
+ "variant": {
1540
+ "name": "variant",
1541
+ "type": "string",
1542
+ "required": false
1393
1543
  }
1394
1544
  }
1395
1545
  }
1396
1546
  },
1397
- "title": {
1547
+ "dispatchStrategy": {
1398
1548
  "type": "string",
1399
- "default": "Approval Requests",
1400
- "label": "Section title",
1401
- "description": "Heading shown above the approval queue",
1402
- "tier": "customization"
1549
+ "default": "manual",
1550
+ "label": "Dispatch strategy",
1551
+ "description": "How approvers are assigned to incoming requests.",
1552
+ "tier": "customization",
1553
+ "values": [
1554
+ "nearest",
1555
+ "round-robin",
1556
+ "manual"
1557
+ ]
1403
1558
  }
1404
1559
  },
1405
1560
  "scope": "collection"
@@ -1418,4 +1573,4 @@
1418
1573
  ]
1419
1574
  }
1420
1575
  ]
1421
- }
1576
+ }