@nocobase/app-plugin-releases 0.1.0-beta.19 → 0.1.0-beta.20

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 (180) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/LICENSE.txt +129 -0
  3. package/README.md +9 -5
  4. package/dist/client/components/page-header.d.ts.map +1 -1
  5. package/dist/client/components/page-header.js +1 -1
  6. package/dist/client/components/page-header.js.map +1 -1
  7. package/dist/client/components/release-badges.d.ts.map +1 -1
  8. package/dist/client/components/release-badges.js +3 -0
  9. package/dist/client/components/release-badges.js.map +1 -1
  10. package/dist/client/components/runtime-state.d.ts +6 -0
  11. package/dist/client/components/runtime-state.d.ts.map +1 -0
  12. package/dist/client/components/runtime-state.js +67 -0
  13. package/dist/client/components/runtime-state.js.map +1 -0
  14. package/dist/client/components/shared-host.d.ts +20 -0
  15. package/dist/client/components/shared-host.d.ts.map +1 -0
  16. package/dist/client/components/shared-host.js +88 -0
  17. package/dist/client/components/shared-host.js.map +1 -0
  18. package/dist/client/components/ui/progress.d.ts +9 -0
  19. package/dist/client/components/ui/progress.d.ts.map +1 -0
  20. package/dist/client/components/ui/progress.js +20 -0
  21. package/dist/client/components/ui/progress.js.map +1 -0
  22. package/dist/client/hooks/use-releases.d.ts +4 -1
  23. package/dist/client/hooks/use-releases.d.ts.map +1 -1
  24. package/dist/client/hooks/use-releases.js +6 -2
  25. package/dist/client/hooks/use-releases.js.map +1 -1
  26. package/dist/client/lib/app-state.d.ts +2 -2
  27. package/dist/client/lib/app-state.d.ts.map +1 -1
  28. package/dist/client/lib/app-state.js +9 -2
  29. package/dist/client/lib/app-state.js.map +1 -1
  30. package/dist/client/lib/format.d.ts +2 -0
  31. package/dist/client/lib/format.d.ts.map +1 -1
  32. package/dist/client/lib/format.js +7 -0
  33. package/dist/client/lib/format.js.map +1 -1
  34. package/dist/client/lib/paths.d.ts +5 -0
  35. package/dist/client/lib/paths.d.ts.map +1 -1
  36. package/dist/client/lib/paths.js +10 -0
  37. package/dist/client/lib/paths.js.map +1 -1
  38. package/dist/client/lib/permissions.d.ts +5 -0
  39. package/dist/client/lib/permissions.d.ts.map +1 -1
  40. package/dist/client/lib/permissions.js +8 -0
  41. package/dist/client/lib/permissions.js.map +1 -1
  42. package/dist/client/lib/runtime-state.d.ts +25 -0
  43. package/dist/client/lib/runtime-state.d.ts.map +1 -0
  44. package/dist/client/lib/runtime-state.js +58 -0
  45. package/dist/client/lib/runtime-state.js.map +1 -0
  46. package/dist/client/locales/de-DE.d.ts.map +1 -1
  47. package/dist/client/locales/de-DE.js +70 -19
  48. package/dist/client/locales/de-DE.js.map +1 -1
  49. package/dist/client/locales/en-US.d.ts +59 -8
  50. package/dist/client/locales/en-US.d.ts.map +1 -1
  51. package/dist/client/locales/en-US.js +59 -8
  52. package/dist/client/locales/en-US.js.map +1 -1
  53. package/dist/client/locales/es-ES.d.ts.map +1 -1
  54. package/dist/client/locales/es-ES.js +69 -18
  55. package/dist/client/locales/es-ES.js.map +1 -1
  56. package/dist/client/locales/fr-FR.d.ts.map +1 -1
  57. package/dist/client/locales/fr-FR.js +59 -8
  58. package/dist/client/locales/fr-FR.js.map +1 -1
  59. package/dist/client/locales/id-ID.d.ts.map +1 -1
  60. package/dist/client/locales/id-ID.js +61 -10
  61. package/dist/client/locales/id-ID.js.map +1 -1
  62. package/dist/client/locales/index.d.ts.map +1 -1
  63. package/dist/client/locales/index.js +2 -0
  64. package/dist/client/locales/index.js.map +1 -1
  65. package/dist/client/locales/ja-JP.d.ts.map +1 -1
  66. package/dist/client/locales/ja-JP.js +70 -19
  67. package/dist/client/locales/ja-JP.js.map +1 -1
  68. package/dist/client/locales/ko-KR.d.ts +5 -0
  69. package/dist/client/locales/ko-KR.d.ts.map +1 -0
  70. package/dist/client/locales/ko-KR.js +879 -0
  71. package/dist/client/locales/ko-KR.js.map +1 -0
  72. package/dist/client/locales/pt-BR.d.ts.map +1 -1
  73. package/dist/client/locales/pt-BR.js +70 -19
  74. package/dist/client/locales/pt-BR.js.map +1 -1
  75. package/dist/client/locales/ru-RU.d.ts +5 -0
  76. package/dist/client/locales/ru-RU.d.ts.map +1 -0
  77. package/dist/client/locales/ru-RU.js +891 -0
  78. package/dist/client/locales/ru-RU.js.map +1 -0
  79. package/dist/client/locales/vi-VN.d.ts.map +1 -1
  80. package/dist/client/locales/vi-VN.js +67 -16
  81. package/dist/client/locales/vi-VN.js.map +1 -1
  82. package/dist/client/locales/zh-CN.d.ts.map +1 -1
  83. package/dist/client/locales/zh-CN.js +62 -8
  84. package/dist/client/locales/zh-CN.js.map +1 -1
  85. package/dist/client/locales/zh-TW.d.ts.map +1 -1
  86. package/dist/client/locales/zh-TW.js +60 -9
  87. package/dist/client/locales/zh-TW.js.map +1 -1
  88. package/dist/client/pages/app-page.d.ts.map +1 -1
  89. package/dist/client/pages/app-page.js +2 -1
  90. package/dist/client/pages/app-page.js.map +1 -1
  91. package/dist/client/pages/apps-outlet.d.ts +8 -0
  92. package/dist/client/pages/apps-outlet.d.ts.map +1 -0
  93. package/dist/client/pages/apps-outlet.js +9 -0
  94. package/dist/client/pages/apps-outlet.js.map +1 -0
  95. package/dist/client/pages/environment-page.d.ts.map +1 -1
  96. package/dist/client/pages/environment-page.js +111 -23
  97. package/dist/client/pages/environment-page.js.map +1 -1
  98. package/dist/client/pages/environments-page.d.ts.map +1 -1
  99. package/dist/client/pages/environments-page.js +43 -7
  100. package/dist/client/pages/environments-page.js.map +1 -1
  101. package/dist/client/pages/new-app-page.d.ts +2 -4
  102. package/dist/client/pages/new-app-page.d.ts.map +1 -1
  103. package/dist/client/pages/new-app-page.js +15 -17
  104. package/dist/client/pages/new-app-page.js.map +1 -1
  105. package/dist/client/pages/new-app-redirect.d.ts +7 -0
  106. package/dist/client/pages/new-app-redirect.d.ts.map +1 -0
  107. package/dist/client/pages/new-app-redirect.js +8 -0
  108. package/dist/client/pages/new-app-redirect.js.map +1 -0
  109. package/dist/client/pages/request-page.js +1 -1
  110. package/dist/client/pages.d.ts +2 -1
  111. package/dist/client/pages.d.ts.map +1 -1
  112. package/dist/client/pages.js +7 -4
  113. package/dist/client/pages.js.map +1 -1
  114. package/dist/client/routes.d.ts.map +1 -1
  115. package/dist/client/routes.js +27 -15
  116. package/dist/client/routes.js.map +1 -1
  117. package/dist/server/access/caller.d.ts +6 -0
  118. package/dist/server/access/caller.d.ts.map +1 -1
  119. package/dist/server/access/caller.js +36 -0
  120. package/dist/server/access/caller.js.map +1 -1
  121. package/dist/server/config.d.ts +7 -5
  122. package/dist/server/config.d.ts.map +1 -1
  123. package/dist/server/drivers/host/driver.d.ts +6 -3
  124. package/dist/server/drivers/host/driver.d.ts.map +1 -1
  125. package/dist/server/drivers/host/driver.js +340 -105
  126. package/dist/server/drivers/host/driver.js.map +1 -1
  127. package/dist/server/drivers/types.d.ts +71 -0
  128. package/dist/server/drivers/types.d.ts.map +1 -1
  129. package/dist/server/drivers/types.js +6 -0
  130. package/dist/server/drivers/types.js.map +1 -1
  131. package/dist/server/locales/de-DE.js +2 -2
  132. package/dist/server/locales/de-DE.js.map +1 -1
  133. package/dist/server/locales/es-ES.js +1 -1
  134. package/dist/server/locales/es-ES.js.map +1 -1
  135. package/dist/server/locales/id-ID.d.ts.map +1 -1
  136. package/dist/server/locales/id-ID.js +1 -1
  137. package/dist/server/locales/id-ID.js.map +1 -1
  138. package/dist/server/locales/index.d.ts.map +1 -1
  139. package/dist/server/locales/index.js +2 -0
  140. package/dist/server/locales/index.js.map +1 -1
  141. package/dist/server/locales/ja-JP.js +1 -1
  142. package/dist/server/locales/ja-JP.js.map +1 -1
  143. package/dist/server/locales/ko-KR.d.ts +5 -0
  144. package/dist/server/locales/ko-KR.d.ts.map +1 -0
  145. package/dist/server/locales/ko-KR.js +133 -0
  146. package/dist/server/locales/ko-KR.js.map +1 -0
  147. package/dist/server/locales/pt-BR.js +2 -2
  148. package/dist/server/locales/pt-BR.js.map +1 -1
  149. package/dist/server/locales/ru-RU.d.ts +5 -0
  150. package/dist/server/locales/ru-RU.d.ts.map +1 -0
  151. package/dist/server/locales/ru-RU.js +133 -0
  152. package/dist/server/locales/ru-RU.js.map +1 -0
  153. package/dist/server/locales/vi-VN.js +2 -2
  154. package/dist/server/locales/vi-VN.js.map +1 -1
  155. package/dist/server/providers/releases.d.ts.map +1 -1
  156. package/dist/server/providers/releases.js +1 -0
  157. package/dist/server/providers/releases.js.map +1 -1
  158. package/dist/server/routes/api.d.ts.map +1 -1
  159. package/dist/server/routes/api.js +28 -6
  160. package/dist/server/routes/api.js.map +1 -1
  161. package/dist/server/routes/schemas.d.ts +5 -2
  162. package/dist/server/routes/schemas.d.ts.map +1 -1
  163. package/dist/server/routes/schemas.js +75 -2
  164. package/dist/server/routes/schemas.js.map +1 -1
  165. package/dist/server/services/releases.d.ts +24 -1
  166. package/dist/server/services/releases.d.ts.map +1 -1
  167. package/dist/server/services/releases.js +180 -30
  168. package/dist/server/services/releases.js.map +1 -1
  169. package/dist/server/tokens.d.ts +6 -2
  170. package/dist/server/tokens.d.ts.map +1 -1
  171. package/dist/server/tokens.js.map +1 -1
  172. package/dist/shared/releases.d.ts +70 -0
  173. package/dist/shared/releases.d.ts.map +1 -1
  174. package/dist/shared/releases.js +32 -0
  175. package/dist/shared/releases.js.map +1 -1
  176. package/package.json +7 -7
  177. package/dist/client/pages/apps-page.d.ts +0 -4
  178. package/dist/client/pages/apps-page.d.ts.map +0 -1
  179. package/dist/client/pages/apps-page.js +0 -116
  180. package/dist/client/pages/apps-page.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # @nocobase/app-plugin-releases
2
2
 
3
+ ## 0.1.0-beta.20
4
+
5
+ ### Minor Changes
6
+
7
+ - f8bbdf9: Apps are listed and created on their environment's page; there is no separate apps list or menu entry, and the apps path alone (`/releases` by default) leads to the environments. An environment's apps show each app's runtime state (why on hover or a tap), filter by it and page through 100 at a time, kept in the address (`?runtimeState=`, `?page=`). The environments pages open to either the `rel.environments` `read` setting or the apps page grant (`page:rel-apps`), so environment readers and app readers both keep an entry: the route declares no grant (`authz: 'skip'`, its menu entry shown to every signed-in user) and the page turns away anyone with neither. An environment's apps and Create App need the apps grants; the Variables tab, the connection check, managing environments and the capacity card still need the setting. Create App opens there (`<environments>/:environmentId/apps/new`, for those with `rel.apps/create`) with the environment fixed; the old `<apps>/new` address leads to the environment its `?environmentId=` names, or to the environments (`ReleasesNewAppRedirect`), and Create App no longer fails when the page under it hands no outlet context. A shared host's capacity card splits its running apps by environment (`environments[].running` in `GET /api/releases/hosts`), each linking to that environment filtered to its running and starting apps. `ReleasesAppsPage` is removed.
8
+ - 437f24f: Show each shared app host once on the environments page as a capacity card — apps running against its limit, heap and process memory, restart state — linking to its running apps in the apps list (`GET /api/releases/hosts`, which needs the `rel.environments` `read` setting). The apps list shows each app's runtime state, with why on hover or a tap, and filters by environment and runtime state (`environmentId` and `runtimeState`, repeatable, applied before paging). An app's page says in one line why the host affects it — waiting for a slot or memory, not restored after the host restarted (`runtime.unrestored`), or the host restarting — instead of repeating the whole host. The App Host reports its `maxActiveApps` limit in its status counters.
9
+ - a2a6385: Add Russian (ru-RU) and Korean (ko-KR) to the plugins Studio uses, and correct terminology in their existing translations: an issue is a task (it was translated as a magazine issue or a problem in several languages), a runtime is an execution environment, Agent and My Agent stay consistent, and an issue's executor and the backlog status read correctly. The remaining English strings in the agents plugin's translations are translated. Calendars follow Russian and Korean, and a browser asking for Traditional Chinese (zh-HK, zh-Hant-TW) now lands on zh-TW instead of zh-CN.
10
+
11
+ ### Patch Changes
12
+
13
+ - 8b82537: Admit preview applications by fixed capacity slots without rejecting transient heap usage, and force Host rotation through a single maximum-wait timer.
14
+ - fb4659d: Use live memory headroom and serialized bounded cold starts instead of static application slots, and recycle shared Hosts under memory pressure with whole-Host busy protection, atomic ingress handoff, bounded request drain after the maximum wait, background recovery that keeps management available, one retry for capacity-rejected deployments, status-aware idle activity and retryable proxy responses during Host restart/recovery.
15
+ - b2fd67a: Let page descriptions use the available header width while preserving space for actions.
16
+ - fb4659d: Show who shares an App's app host: a section on the App page lists the Apps of every environment running, starting, waiting or failed on it, why each holds a slot or waits (requests, connections, always running, recent use; not enough memory, the active App limit, a pending host restart), the shared process's memory as one total, a pending or running host restart, and environments whose Apps could not be restored. App badges show a refused start as waiting for a free slot, memory or the host restart.
17
+ - Updated dependencies [fb4659d]
18
+ - Updated dependencies [7508a76]
19
+ - Updated dependencies [8b82537]
20
+ - Updated dependencies [fb4659d]
21
+ - Updated dependencies [fb4659d]
22
+ - Updated dependencies [6fbf389]
23
+ - Updated dependencies [1cda4c3]
24
+ - Updated dependencies [7d970d6]
25
+ - Updated dependencies [fb4659d]
26
+ - Updated dependencies [437f24f]
27
+ - Updated dependencies [bb1dff2]
28
+ - Updated dependencies [a2a6385]
29
+ - @nocobase/app-host@0.1.0-beta.21
30
+ - @nocobase/app-plugin-authentication@2.0.0-beta.20
31
+ - @nocobase/app-server@5.0.0-beta.2
32
+ - @nocobase/app-plugin-authorization@1.0.0-beta.37
33
+ - @nocobase/db@1.0.0-beta.26
34
+ - @nocobase/i18n@2.0.0-beta.2
35
+ - @nocobase/app-client@4.0.0-beta.9
36
+
3
37
  ## 0.1.0-beta.19
4
38
 
5
39
  ### Minor Changes
package/LICENSE.txt ADDED
@@ -0,0 +1,129 @@
1
+ Updated Date: November 7, 2026
2
+
3
+ NocoBase License Agreement
4
+
5
+ NOCOBASE PTE. LTD., a Singaporean Exempt Private Company Limited by Shares with its principal place of business located at 112 ROBINSON ROAD, #03-01, SINGAPORE ("The Company") https://www.nocobase.com/ issues this License Agreement ("Agreement") to you. You, as an individual or a company ("The User"), will be deemed to voluntarily accept all terms of this Agreement by using NocoBase (including but not limited to obtaining NocoBase source code, installation package, or image in any form, installing and using NocoBase, developing Applications with NocoBase, purchasing NocoBase commercial license and services). If the User does not agree to any term of this Agreement, or cannot accurately understand our interpretation of the relevant terms, please stop using it immediately.
6
+
7
+ This Agreement applies to any use, quotation, contract, invoice, and all software delivered by the Company. The User and the Company or NocoBase's agents need not sign a separate license agreement for the sale and delivery of the software.
8
+
9
+ This Agreement applies to NocoBase 3 and later versions. NocoBase 2 and earlier versions are independent products and remain subject to their original license agreement. Where a NocoBase 2 Commercial Edition user uses NocoBase 3 or later versions under a policy announced by the Company, that use is subject to this Agreement.
10
+
11
+ The Company reserves the right to formulate and modify this Agreement from time to time as needed. If there are changes, the Company will announce them in the form of website announcements, without further individual notification. The changed Agreement will automatically take effect once it is announced, becoming part of this Agreement.
12
+
13
+ ==============
14
+ 1. Definitions
15
+ ==============
16
+
17
+ 1.1 "Software" refers to NocoBase, consisting of Core, Studio, and Commercial Plugins, including their source code, installation packages, images, and all their modifications, updates, and upgrades.
18
+
19
+ 1.2 "Core" refers to NocoBase Core, the open source application foundation released by the Company, including the runtime, plugins, application templates, development standards, and development skills placed in the same code repository.
20
+
21
+ 1.3 "Studio" refers to NocoBase Studio, the governance platform for people and agents building software together, provided in the Commercial Edition.
22
+
23
+ 1.4 "Commercial Plugins" refers to the plugins provided in the Commercial Edition that extend the capabilities of Core, such as advanced approvals and enterprise SSO.
24
+
25
+ 1.5 "Community Edition" refers to the free version of the Software provided to the User through public channels, namely Core.
26
+
27
+ 1.6 "Commercial Edition" refers to the paid version of the Software purchased by the User from the Company or its agents, downloaded through exclusive channels, and includes additional benefits. In addition to Core, it includes Studio and Commercial Plugins, and consists of two versions: Professional Edition and Enterprise Edition.
28
+
29
+ 1.7 "Application" refers to a specific business use case application serving internal or external customers of the User, developed based on the Software, such as ERP/CRM. Studio is a development tool and is not part of any Application.
30
+
31
+ 1.8 "Customer" refers to the clients who commission the User to develop Applications or purchase the User's Applications.
32
+
33
+ 1.9 "Agent" refers to an AI agent that works with the Software, including the coding agents the User uses to develop Applications and the business agents in Applications.
34
+
35
+ 1.10 "Third-Party Services" refers to the large models, coding agents, cloud services, and other third-party products and services that the User chooses to use with the Software.
36
+
37
+ 1.11 "Third-Party Open Source Software" refers to open source software provided with the Software. They are licensed through various published open source software licenses or copyright notices accompanying such software.
38
+
39
+ ===================================
40
+ 2. Intellectual Property Protection
41
+ ===================================
42
+
43
+ Except for Third-Party Open Source Software, the Company owns all copyrights, trademark rights, patent rights, trade secrets, and other intellectual property rights of the Software, and has registered and protected them in relevant countries and regions according to the "Paris Convention" or "TRIPS Agreement", ensuring that the intellectual property rights of the Software are internationally recognized and protected.
44
+
45
+ The Company claims no intellectual property rights in the business code written by the User or by Agents when developing Applications, or in the User's business data, skills, and knowledge bases. The parts of the Software contained in an Application remain the intellectual property of the Company and are subject to this Agreement.
46
+
47
+ =============
48
+ 3. Disclaimer
49
+ =============
50
+
51
+ 3.1 The User shall not use the Software to engage in activities that contravene applicable laws and regulations or offend against public order or religious prohibitions. All legal liabilities and consequences arising from the User's use shall be borne by the User.
52
+
53
+ 3.2 The Company shall not be liable for any direct, indirect, special, incidental, or consequential damages (including but not limited to loss of profits, business interruption, data loss, or business information disclosure) caused by the User's use of the Software, even if it has been previously informed of the possibility of such damages.
54
+
55
+ 3.3 Code written, content generated, and actions taken by Agents shall be reviewed and accepted by the User before being used in production. All consequences arising from the use of the work of Agents shall be borne by the User.
56
+
57
+ 3.4 Third-Party Services are chosen and paid for by the User and are subject to their own terms. The Company shall not be liable for the availability, output, or data handling of Third-Party Services.
58
+
59
+ ===============
60
+ 4. License Type
61
+ ===============
62
+
63
+ 4.1 This Agreement serves as the unified license agreement for NocoBase Software, applying to both the Community Edition and the Commercial Editions.
64
+
65
+ 4.2 Core is open source software. This Agreement incorporates and references the full text of the Apache License, Version 2.0 ("Apache-2.0", available at: https://www.apache.org/licenses/LICENSE-2.0 ). Users of Core must comply with the Apache-2.0 License as well as the supplementary terms set forth in this Agreement. In case of any inconsistency between Apache-2.0 and this Agreement, the supplementary terms of this Agreement shall prevail.
66
+
67
+ 4.3 Studio and Commercial Plugins are commercial software of the Company and are not licensed under Apache-2.0. They can only be used under the Commercial License and in accordance with this Agreement.
68
+
69
+ ================================================
70
+ 5. Rights and Obligations of Open Source License
71
+ ================================================
72
+
73
+ 5.1 The Community Edition can be used for commercial purposes, including developing Applications for Customers.
74
+
75
+ 5.2 It is not allowed to remove or change the NocoBase statement "AI + NocoBase" and "Build reliable business systems", or its link to https://www.nocobase.com/, at the bottom left of the interface of any Application, including Applications delivered to Customers, even though the code that displays the statement is part of the Application. If the default layout is replaced, the statement shall be kept at an equally visible position on the main interface of the Application. Pages that can be accessed without signing in and pages embedded in other systems are not subject to this requirement. When the sidebar is collapsed, showing the statement as an icon with a tooltip, as provided by default, meets this requirement. The main LOGO in the upper left corner of the page, the version number, and other information on the interface can be changed.
76
+
77
+ 5.3 It is not allowed to remove or change all intellectual property statements about NocoBase in the code.
78
+
79
+ 5.4 It is not allowed to provide to the public any form of AI application development platform or agent development platform SaaS/PaaS products using the original or modified Software.
80
+
81
+ ===============================
82
+ 6. Rights of Commercial License
83
+ ===============================
84
+
85
+ 6.1 Obtain a permanent commercial license of the Software.
86
+
87
+ 6.2 Can develop Applications for Customers, deploy the completed Applications, including the Commercial Plugins they use, on Customers' servers, or host them and provide them to Customers as a service. This does not include Studio.
88
+
89
+ 6.3 Customers can use the Commercial Plugins in the Applications delivered to them, within those Applications only, and can continue to develop those Applications on their own or through others.
90
+
91
+ 6.4 Get software upgrades and exclusive technical support during the upgrade validity period. Upgrades and technical support are provided to the User only, and the User can upgrade the Commercial Plugins in Applications delivered to Customers during this period.
92
+
93
+ 6.5 The licensed Software can be used for commercial purposes with no restrictions on the number of Applications, Customers, users, and Agents.
94
+
95
+ 6.6 Can remove or change the NocoBase statement described in 5.2, and the brand, name, link, and other information about NocoBase on the interface of Applications.
96
+
97
+ 6.7 If there are other agreements in the contract for the above rights, the contract agreement shall prevail.
98
+
99
+ ====================================
100
+ 7. Obligations of Commercial License
101
+ ====================================
102
+
103
+ 7.1 It is not allowed to remove or change all intellectual property statements about NocoBase in the code.
104
+
105
+ 7.2 It is not allowed to sell, transfer, lease, share, gift, or distribute the Commercial License. Deploying Applications for Customers under 6.2 is not considered sharing the Commercial License, but the license key, access token, or other credentials of the Commercial License shall not be provided to Customers for any purpose other than deploying and running the Applications delivered to them.
106
+
107
+ 7.3 It is not allowed to sell, transfer, lease, share, or distribute any form of AI application development platform, agent development platform, or developer tools developed based on Software.
108
+
109
+ 7.4 It is not allowed to provide any form of AI application development platform or agent development platform SaaS/PaaS products to the public using the original or modified Software.
110
+
111
+ 7.5 Studio can only be used by the User holding the Commercial License, on servers owned or rented by the User. It is not allowed to deploy Studio for Customers, or to provide Studio to Customers or any third party in any form, including as a hosted service. Customers that need Studio shall purchase their own Commercial License.
112
+
113
+ 7.6 Customer personnel can take part in requirement confirmation, acceptance, and release approval in the User's Studio for the Applications the User develops for them. This is not considered providing Studio to Customers, but it is not allowed to let Customers use Studio to develop their own projects.
114
+
115
+ 7.7 If there is a violation of the above obligations or the terms of this Agreement, the rights owned by the User will be immediately terminated, the paid fees will not be refunded, and the Company reserves the right to pursue the User's legal responsibility.
116
+
117
+ 7.8 If there are other agreements in the contract for the above obligations, the contract agreement shall prevail.
118
+
119
+ =============================================================
120
+ 8. Legal Jurisdiction, Interpretation, and Dispute Resolution
121
+ =============================================================
122
+
123
+ 8.1 Except for Mainland China, the interpretation, application, and all matters related to this agreement are subject to the jurisdiction of Singapore law.
124
+
125
+ 8.2 Any dispute related to this Agreement should first be resolved through friendly negotiation. If the negotiation fails to resolve the dispute, the dispute should be submitted to the International Chamber of Commerce (ICC) for arbitration. The arbitration venue should be Singapore, conducted in English.
126
+
127
+ 8.3 All terms and conditions of this Agreement shall be deemed enforceable to the maximum extent permitted by applicable law. If any term of this Agreement is deemed invalid by any applicable law, the invalidity of that term does not affect the validity of any other term of this Agreement, and it should be deemed that the invalid term has been modified as much as possible to make it valid and enforceable, or if the term cannot be modified, it should be deemed to have been deleted from this Agreement.
128
+
129
+ 8.4 The arbitration award is final, binding on both parties, and can be enforced in any court with jurisdiction.
package/README.md CHANGED
@@ -22,9 +22,13 @@ Client: list `@nocobase/app-plugin-releases/client`. Pass `routes: false` and us
22
22
 
23
23
  ## Shared Host capacity and rotation
24
24
 
25
- `releases.host.memoryBudget` forwards `targetRatio`, `baseMemoryMb` and `appMemoryMb` to the in-process Host; defaults are 70% of V8's heap limit, a 256 MiB minimum baseline and a 256 MiB estimate per App. `maxActiveApps`, when set, is an additional ceiling. These values do not change the Node heap limit or the Docker backend's capacity.
25
+ `releases.host.memoryBudget` forwards live-admission settings to the in-process Host: `targetRatio` (0.7), `appMemoryMb` (320 MiB cold-start headroom), `reserveMb` (0, no extra OS/process reserve), optional `rssBudgetMb` (0 disables), `startupTimeoutMs` (120000) and `maxPendingStarts` (32). `baseMemoryMb` is accepted but ignored. The Host samples heap, RSS and available memory on each serialized cold start and never adds heap to RSS. `maxActiveApps` is an optional manual count ceiling; deployed/stopped records do not occupy it. The 320 MiB startup headroom covers measured non-first cold-start peaks of 284 MiB heap and 293 MiB RSS. The optional system reserve has not been measured on the target server; operators who need to protect the primary Studio process and database can explicitly set `releases.host.memoryBudget.reserveMb`, using the `available` column of `free -m` as a guide. These settings do not change the Node heap limit or Docker capacity.
26
26
 
27
- With `restartAfterChurn` enabled, idle stops, dormancies and capacity stops count towards rotation; retained heap pressure also requests rotation. An App that is running without requests or connections is idle for rotation. Otherwise `restartMaxWaitMs` defaults to five minutes from the first detected threshold, regardless of later traffic, in-flight deployments or failed status reads. At rotation the driver closes ingress and queues new management work, and the supervisor sends SIGTERM so the child drains existing work and closes sockets. `restartDrainMs` defaults to 30 seconds before SIGKILL. The existing check interval adds up to 60 seconds to threshold detection; starting the new child takes additional time. Timed-out requests, deployments and sockets can be interrupted. The complete desired set is restored afterwards, with on-demand Apps left stopped until visited.
27
+ A successful deployment (including the first) requests one rotation check, not an unconditional restart. Rotation becomes pending when recyclable churn exists and either `restartAfterChurn` is reached or live heap reaches `restartHeapRatio` (0.55 when count rotation is enabled; 0 disables memory triggering). Idle stops, dormancies, capacity stops and timed-out startups also count. The 0.55 heap line leaves room for another measured cold start with the observed heap limit. The batch guard includes durable outcome settlement, so replay cannot select an older release while the control plane is still saving success. Checks use the whole Host, including resident Apps and other environments. Startup, deployment operations and artifact cleanup always defer rotation. Before `restartMaxWaitMs` (300000), HTTP requests and WebSocket connections defer it too. At that limit, new revision loads pause and a child-side handshake gates incoming traffic with 503 and `Retry-After`; current responses may finish for `restartDrainMs` (30000), then remaining HTTP connections close and the process rotates. The old proxy target stays available during this request drain, and new deployment/start operations wait for the handoff. The supervisor has its own `restartDrainMs` shutdown allowance for cleanup and sockets after the request drain. Failed desired-set replays retry in the background on the existing check interval (60000), including when automatic rotation is disabled; cancel, progress and status remain available during recovery. Mutations wait for an already running replay to settle before submission, so an older desired set cannot overwrite a newer deployment. A failed replay does not trigger another foreground attempt or prevent a repair deployment. During process restart and the initial desired-set recovery triggered by child readiness, the local proxy target remains unavailable until that recovery settles, including automatic child restarts. A failed environment does not gate the entire Host, and all environments are attempted even if one cannot restore; background retries and explicit environment restores do not suspend healthy traffic. The stable application listener responds with 503 and `Retry-After: 2`; connection-refused/reset races also receive retryable responses. Production preview origins should stay pointed directly at the Host port to isolate them from the control plane's routes. Their front proxy must translate upstream connection failures into 503 with Retry-After while the child is down; do not point that origin at the control-plane listener. On-demand Apps restore stopped and resident Apps restore running.
28
+
29
+ A capacity-rejected deployment may wait for one shared rotation and retry admission once. Its wait is bounded by the maximum wait, request drain, shutdown allowance and one check interval, and can be cancelled. The Host permits `retryCapacity` only for recorded failures with `APP_CAPACITY_EXCEEDED`; successful operations stay deduplicated. If no reclaimable content exists, rotation cannot complete safely, or admission still fails, the result remains a retryable capacity failure. Existing version preflight refuses an update before stopping its runtime when there is already insufficient memory. Health checks still must pass for deployment success.
30
+
31
+ The environments page shows each shared Host once, below the list, as a capacity card: how many Apps run or start against its `maxActiveApps` limit (a failed App holds nothing and is not counted), its heap and process memory as totals of the whole process, and whether it is to restart or restarting (`GET /api/releases/hosts`, requiring the `rel.environments` `read` setting; an environment's restore error only reaches those who manage environments). Its counts are the whole Host's, every environment on it included. Its footer splits those Apps by environment (`environments[].running`), each linking to the environment's page filtered to its running and starting Apps (`?runtimeState=running&runtimeState=starting`), which lists only the Apps the reader may view. There is no separate Apps list: an environment's page lists its Apps with each one's runtime state — why it holds a slot, what its start waits for, its error and last visit on hover, focus or a tap — and filters them by runtime state (`?runtimeState=`, repeatable, kept in the address; `GET /api/releases/apps?environmentId=&runtimeState=`, applied before the page is cut, 100 a page with further pages in the address, `?page=`). The Apps path (`/releases` by default) has no page of its own and leads to the environments. The Apps route opens with the Apps page grant (`page:rel-apps`). The environments open to either that grant or the `rel.environments` `read` setting, as the server reads environments for either: a route names a single grant, so theirs declares none (`authz: 'skip'`, its menu entry shown to every signed-in user) and the page turns away anyone with neither. An environment's Apps section and Create App need the Apps grants; the Variables tab, the connection check, managing environments and the capacity card keep requiring the setting. An App's page mentions its Host only while the Host affects it — the App waits for a slot, memory or a restart, the Host restarted and could not put it back (`runtime.unrestored`, set per App by the driver), or the Host restarts or is to restart — in one line, linking to the Host's card for those who may read the environments page.
28
32
 
29
33
  ## Artifact storage
30
34
 
@@ -126,11 +130,11 @@ Each App has a runtime policy (`activation`, `idleStopMinutes`, `dormantAfterHou
126
130
 
127
131
  An App created without `idleStopMinutes` or `dormantAfterHours` takes its environment's `defaultIdleStopMinutes` and `defaultDormantAfterHours` (null: never), and an environment holds at most `maxApps` Apps. Each environment has a `purpose`, `preview` (pull request previews) or `test`, set when it is created (`test` by default) and editable; the plugin behaves the same for both, and an application groups its environments by it. The environments list answers each one's `appCount`, and `EnvironmentsSettings` takes a `title` and `description` for an application that names the page in its own words.
128
132
 
129
- A changed policy reaches the runtime without restarting the App. The App summary's `runtime.state` adds `starting` and `dormant`, and `runtime.lastAccessedAt` tells when it was last requested. A driver declares `capabilities.onDemand` when it honours the policy; the local Host driver does, and on other drivers the policy is stored but the App keeps running. Removing an App and its data is always an explicit `DELETE`, never a timer: Apps do not expire. Stops and dormancies count towards the Host's `restartAfterChurn`, which waits while an on-demand App is running; the Host settings `sweepIntervalSeconds`, `activationHoldMs` and `activationWaitMs` tune how often timers are checked and how long requests wait for a starting App.
133
+ A changed policy reaches the runtime without restarting the App. The App summary's `runtime.state` adds `starting` and `dormant`, and `runtime.lastAccessedAt` tells when it was last requested. A driver declares `capabilities.onDemand` when it honours the policy; the local Host driver does, and on other drivers the policy is stored but the App keeps running. Removing an App and its data is always an explicit `DELETE`, never a timer: Apps do not expire. Stops and dormancies count towards the Host's `restartAfterChurn`, which protects requests, startup and deployment work on all Apps sharing the Host; the Host settings `sweepIntervalSeconds`, `activationHoldMs` and `activationWaitMs` tune how often timers are checked and how long requests wait for a starting App.
130
134
 
131
- Labels are opaque to the plugin. An assembling application that adds labels of its own may provide `ReleasesSystemLabelsContext` (client) with `explain(key, value)`; Apps lists and an App's page then leave those labels out (showing the application's `Summary`, below, in their place), its Settings tab shows them read-only with the explanation on hover, and editing the others keeps them. The create and upload dialogs and an App's Settings tab edit labels as rows of a name and a value under "Advanced (optional)".
135
+ Labels are opaque to the plugin. An assembling application that adds labels of its own may provide `ReleasesSystemLabelsContext` (client) with `explain(key, value)`; an App's page then leaves those labels out (showing the application's `Summary`, below, in their place), its Settings tab shows them read-only with the explanation on hover, and editing the others keeps them. The create and upload dialogs and an App's Settings tab edit labels as rows of a name and a value under "Advanced (optional)".
132
136
 
133
- Create App opens over the Apps page at `new`, so an App may not be called `new` or `requests`. A deployment request opens as a dialog (`ReleasesRequestPage`) over its App's page at `:appId/requests/:requestId`, and over the Apps page at `requests/:requestId` for older links. An App's pending request (there is at most one) is the first row of its deployments, on the Overview and the Deployments tab, with Review for an approver and View for anyone else; an approver also sees a one-line notice under the App's header. The dialog says what would run where and who asked, and an approver adds an optional comment and approves or rejects there; the comment is the decision note the requester is told. The Apps list marks an App with a pending request "Pending approval" beside its state. An application that builds Apps from something of its own may say where an App comes from by providing `ReleasesAppOriginContext` (client) with an `Origin` component, which the App's Overview renders under its details, and optionally a `Summary` component, a one-line description lists and the App's header show in place of its system labels; each renders nothing for an App it does not know. The assembling application uses them to name the repository that builds the App, and a preview's pull request.
137
+ Create App opens over an environment's page at `apps/new` (`ReleasesNewAppPage`), for those with the `rel.apps/create` grant, and creates the App in that environment. Create App's old address below the Apps path, `new` (`ReleasesNewAppRedirect`), leads to the environment its `?environmentId=` names, or to the environments; an App may not be called `new` or `requests`. A deployment request opens as a dialog (`ReleasesRequestPage`) over its App's page at `:appId/requests/:requestId`, and below the Apps path at `requests/:requestId` for older links. An App's pending request (there is at most one) is the first row of its deployments, on the Overview and the Deployments tab, with Review for an approver and View for anyone else; an approver also sees a one-line notice under the App's header. The dialog says what would run where and who asked, and an approver adds an optional comment and approves or rejects there; the comment is the decision note the requester is told. An environment's Apps mark an App with a pending request "Pending approval" beside its state. An application that builds Apps from something of its own may say where an App comes from by providing `ReleasesAppOriginContext` (client) with an `Origin` component, which the App's Overview renders under its details, and optionally a `Summary` component, a one-line description lists and the App's header show in place of its system labels; each renders nothing for an App it does not know. The assembling application uses them to name the repository that builds the App, and a preview's pull request.
134
138
 
135
139
  Such an application may also say what deleting an App affects beyond the plugin's records by providing `ReleasesDeleteAppImpactContext` (client) with an `Impact` component, given the App's ID. The Delete App confirmation shows it under its own description; the component loads and words what it needs and renders nothing when nothing uses the App. The plugin's `app.removed` event is where the application then cleans up after the App.
136
140
 
@@ -1 +1 @@
1
- {"version":3,"file":"page-header.d.ts","sourceRoot":"","sources":["../../../client/components/page-header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,WAAW,EACX,KAAK,GACN,EAAE,eAAe,GAAG,YAAY,CAoBhC"}
1
+ {"version":3,"file":"page-header.d.ts","sourceRoot":"","sources":["../../../client/components/page-header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,WAAW,EACX,KAAK,GACN,EAAE,eAAe,GAAG,YAAY,CAkBhC"}
@@ -5,6 +5,6 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  * actions vertically centred on the right with the one primary action last.
6
6
  */
7
7
  export function PageHeader({ actions, description, title, }) {
8
- return (_jsxs("header", { className: 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between', children: [_jsxs("div", { className: 'min-w-0', children: [_jsx("h1", { className: 'font-heading text-2xl font-semibold tracking-tight', children: title }), description ? (_jsx("p", { className: 'mt-1.5 max-w-3xl text-sm text-muted-foreground', children: description })) : null] }), actions ? (_jsx("div", { className: 'flex flex-wrap items-center gap-2 sm:shrink-0 sm:flex-nowrap', children: actions })) : null] }));
8
+ return (_jsxs("header", { className: 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between', children: [_jsxs("div", { className: 'min-w-0 flex-1', children: [_jsx("h1", { className: 'font-heading text-2xl font-semibold tracking-tight', children: title }), description ? (_jsx("p", { className: 'mt-1.5 text-sm text-muted-foreground', children: description })) : null] }), actions ? (_jsx("div", { className: 'flex flex-wrap items-center gap-2 sm:shrink-0 sm:flex-nowrap', children: actions })) : null] }));
9
9
  }
10
10
  //# sourceMappingURL=page-header.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"page-header.js","sourceRoot":"","sources":["../../../client/components/page-header.tsx"],"names":[],"mappings":";AASA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,OAAO,EACP,WAAW,EACX,KAAK,GACW;IAChB,OAAO,CACL,kBAAQ,SAAS,EAAC,oEAAoE,aACpF,eAAK,SAAS,EAAC,SAAS,aACtB,aAAI,SAAS,EAAC,oDAAoD,YAC/D,KAAK,GACH,EACJ,WAAW,CAAC,CAAC,CAAC,CACb,YAAG,SAAS,EAAC,gDAAgD,YAC1D,WAAW,GACV,CACL,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,OAAO,CAAC,CAAC,CAAC,CACT,cAAK,SAAS,EAAC,8DAA8D,YAC1E,OAAO,GACJ,CACP,CAAC,CAAC,CAAC,IAAI,IACD,CACV,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"page-header.js","sourceRoot":"","sources":["../../../client/components/page-header.tsx"],"names":[],"mappings":";AASA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,OAAO,EACP,WAAW,EACX,KAAK,GACW;IAChB,OAAO,CACL,kBAAQ,SAAS,EAAC,oEAAoE,aACpF,eAAK,SAAS,EAAC,gBAAgB,aAC7B,aAAI,SAAS,EAAC,oDAAoD,YAC/D,KAAK,GACH,EACJ,WAAW,CAAC,CAAC,CAAC,CACb,YAAG,SAAS,EAAC,sCAAsC,YAAE,WAAW,GAAK,CACtE,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,OAAO,CAAC,CAAC,CAAC,CACT,cAAK,SAAS,EAAC,8DAA8D,YAC1E,OAAO,GACJ,CACP,CAAC,CAAC,CAAC,IAAI,IACD,CACV,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"release-badges.d.ts","sourceRoot":"","sources":["../../../client/components/release-badges.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAGtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAuBnE,4GAA4G;AAC5G,wBAAgB,aAAa,CAAC,EAC5B,OAAO,GACR,EAAE;IACD,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;CAC9B,GAAG,YAAY,CAsBf;AAkBD,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,OAAO,GACR,EAAE;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,GAAG,YAAY,CAOf;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EAAE,WAAmB,GAC/B,EAAE;IACD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,YAAY,GAAG,IAAI,CAItB;AAED,kHAAkH;AAClH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,SAAS,EAAE,WAAmB,GAC/B,EAAE;IACD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,YAAY,CA0Bf;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,GACP,EAAE;IACD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACnD,GAAG,YAAY,CA0Bf;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,MAAM,GACP,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,YAAY,CAmCf;AAED,kHAAkH;AAClH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,MAAM,GACP,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,YAAY,GAAG,IAAI,CAWtB"}
1
+ {"version":3,"file":"release-badges.d.ts","sourceRoot":"","sources":["../../../client/components/release-badges.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAGtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AA0BnE,4GAA4G;AAC5G,wBAAgB,aAAa,CAAC,EAC5B,OAAO,GACR,EAAE;IACD,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;CAC9B,GAAG,YAAY,CAsBf;AAkBD,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,OAAO,GACR,EAAE;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,GAAG,YAAY,CAOf;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EAAE,WAAmB,GAC/B,EAAE;IACD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,YAAY,GAAG,IAAI,CAItB;AAED,kHAAkH;AAClH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,SAAS,EAAE,WAAmB,GAC/B,EAAE;IACD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,YAAY,CA0Bf;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,GACP,EAAE;IACD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACnD,GAAG,YAAY,CA0Bf;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,MAAM,GACP,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,YAAY,CAmCf;AAED,kHAAkH;AAClH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,MAAM,GACP,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,YAAY,GAAG,IAAI,CAWtB"}
@@ -21,6 +21,9 @@ const APP_STATE_TONE = {
21
21
  stopped: 'grey',
22
22
  stoppedOnDemand: 'grey',
23
23
  dormant: 'violet',
24
+ waitingCapacity: 'amber',
25
+ waitingMemory: 'amber',
26
+ waitingRecycle: 'amber',
24
27
  failed: 'red',
25
28
  unknown: 'grey',
26
29
  };
@@ -1 +1 @@
1
- {"version":3,"file":"release-badges.js","sourceRoot":"","sources":["../../../client/components/release-badges.tsx"],"names":[],"mappings":";AAAA,yGAAyG;AACzG,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAqB,MAAM,OAAO,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAa,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,cAAc,GAAmC;IACrD,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,OAAO;IACnB,OAAO,EAAE,MAAM;IACf,eAAe,EAAE,MAAM;IACvB,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,4GAA4G;AAC5G,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,GAGR;IACC,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CACL,KAAC,GAAG,IACF,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,MAAM,EACrC,GAAG,QACH,KAAK,EACH,OAAO,CAAC,OAAO,CAAC,KAAK;YACnB,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;YACvC,CAAC,CAAC,SAAS,YAGd,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE,UAAU,IAAI,IAAI;YAClE,CAAC,CAAC,CAAC,CAAC,2BAA2B,EAAE;gBAC7B,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,UAAU;aAC5C,CAAC;YACJ,CAAC,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACxC,CAAC,CAAC,CAAC,CAAC,2BAA2B,KAAK,EAAE,CAAC;gBACvC,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,EAAE,CAAC,GACxB,CACP,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAmC;IAClD,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,OAAO;IACnB,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,OAAO;IAClB,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,MAAM;IACjB,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,OAAO;CACjB,CAAC;AAEF,sFAAsF;AACtF,MAAM,UAAU,SAAS,CAAC,EACxB,MAAM,EACN,OAAO,GAIR;IACC,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC/C,OAAO,CACL,KAAC,GAAG,IAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE,GAAG,kBAC1C,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,GAChD,CACP,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,iBAAiB,CAAC,EAChC,SAAS,EAAE,WAAW,GAAG,KAAK,GAG/B;IACC,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC/C,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,KAAC,GAAG,IAAC,IAAI,EAAC,OAAO,YAAE,CAAC,CAAC,2BAA2B,CAAC,GAAO,CAAC;AAClE,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,eAAe,CAAC,EAC9B,IAAI,EACJ,SAAS,EAAE,WAAW,GAAG,KAAK,GAI/B;IACC,MAAM,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAC7C,OAAO,CACL,gBAAM,SAAS,EAAC,qDAAqD,aACnE,eAAM,SAAS,EAAC,UAAU,EAAC,KAAK,EAAE,IAAI,YACnC,IAAI,GACA,EACN,WAAW,CAAC,CAAC,CAAC,CACb,MAAC,OAAO,eACN,MAAC,cAAc,IACb,MAAM,EACJ,eACE,QAAQ,EAAE,CAAC,EACX,SAAS,EAAC,iHAAiH,GAC3H,aAGJ,KAAC,UAAU,IAAC,SAAS,EAAC,QAAQ,iBAAa,MAAM,GAAG,EACpD,eAAM,SAAS,EAAC,SAAS,YAAE,KAAK,GAAQ,IACzB,EACjB,KAAC,cAAc,cAAE,KAAK,GAAkB,IAChC,CACX,CAAC,CAAC,CAAC,IAAI,IACH,CACR,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,MAAM,GAGP;IACC,MAAM,MAAM,GAAG,UAAU,CAAC,2BAA2B,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QACtB,OAAO,eAAM,SAAS,EAAC,uBAAuB,uBAAS,CAAC;IAC1D,OAAO,CACL,eAAM,SAAS,EAAC,sBAAsB,YACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC5B,MAAM,WAAW,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;YACxD,OAAO,WAAW,CAAC,CAAC,CAAC,CACnB,KAAC,eAAe,IAEd,IAAI,EAAE,GAAG,GAAG,IAAI,KAAK,EAAE,EACvB,WAAW,EAAE,WAAW,IAFnB,GAAG,CAGR,CACH,CAAC,CAAC,CAAC,CACF,eAEE,SAAS,EAAC,wFAAwF,YAEjG,GAAG,GAAG,IAAI,KAAK,EAAE,IAHb,GAAG,CAIH,CACR,CAAC;QACJ,CAAC,CAAC,GACG,CACR,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,MAAM,GAIP;IACC,MAAM,MAAM,GAAG,UAAU,CAAC,2BAA2B,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,UAAU,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAC5B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3B,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CACtD,CACF,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,OAAO,CACL,gBAAM,SAAS,EAAC,qBAAqB,aAClC,OAAO,CAAC,CAAC,CAAC,CAET,eACE,SAAS,EAAC,iDAAiD,eACjD,aAAa,YAEvB,KAAC,OAAO,IAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAI,GACpC,CACR,CAAC,CAAC,CAAC,IAAI,EACP,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,UAAU,IAAC,MAAM,EAAE,GAAG,GAAI,CAC5B,CAAC,CAAC,CAAC,CACF,eACE,SAAS,EACP,OAAO;oBACL,CAAC,CAAC,gDAAgD;oBAClD,CAAC,CAAC,uBAAuB,uBAIxB,CACR,IACI,CACR,CAAC;AACJ,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,MAAM,GAIP;IACC,MAAM,OAAO,GAAG,UAAU,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAC9D,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,CACL,eACE,SAAS,EAAC,oDAA+C,eAC/C,aAAa,YAEvB,KAAC,OAAO,IAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAI,GACpC,CACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"release-badges.js","sourceRoot":"","sources":["../../../client/components/release-badges.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type ReactElement } from 'react';
2
+ import type { RuntimeStatus } from '../../shared/releases.js';
3
+ export declare function RuntimeStateBadge({ runtime, }: {
4
+ readonly runtime: RuntimeStatus;
5
+ }): ReactElement;
6
+ //# sourceMappingURL=runtime-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../../../client/components/runtime-state.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAoB9D,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,GACR,EAAE;IACD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;CACjC,GAAG,YAAY,CAkEf"}
@@ -0,0 +1,67 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * An App's runtime state as an environment's Apps show it: a tag with the runtime alone (a deployment in progress is marked
4
+ * beside it), and why it is in that state — what holds it on its runtime, what its start waits for, its error and its
5
+ * last visit — on hover or focus, and on a tap where there is no hover.
6
+ */
7
+ import { useTranslation } from '@nocobase/i18n/client';
8
+ import { useRef, useState } from 'react';
9
+ import { ACCESS_NAMESPACE } from '../../shared/access.js';
10
+ import { messageText } from '../lib/errors.js';
11
+ import { formatDate } from '../lib/format.js';
12
+ import { runtimeReasons, runtimeStateKey } from '../lib/runtime-state.js';
13
+ import { Tag } from './tag.js';
14
+ import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip.js';
15
+ const TONE = {
16
+ running: 'green',
17
+ pending: 'grey',
18
+ starting: 'blue',
19
+ stopped: 'grey',
20
+ dormant: 'violet',
21
+ waitingCapacity: 'amber',
22
+ waitingMemory: 'amber',
23
+ waitingRecycle: 'amber',
24
+ failed: 'red',
25
+ unknown: 'grey',
26
+ };
27
+ export function RuntimeStateBadge({ runtime, }) {
28
+ const { t, i18n } = useTranslation(ACCESS_NAMESPACE);
29
+ const [open, setOpen] = useState(false);
30
+ // Opened by a press (a tap where there is no hover): the pointer leaving does not close it.
31
+ const pressedRef = useRef(false);
32
+ const key = runtimeStateKey(runtime);
33
+ const tag = (_jsx(Tag, { tone: TONE[key] ?? 'grey', dot: true, children: key === 'pending'
34
+ ? t('ui.apps.runStates.pending')
35
+ : t(`ui.state.${key}`) }));
36
+ const reasons = runtimeReasons(runtime).map((reason) => t(reason));
37
+ const details = [
38
+ ...reasons,
39
+ ...(runtime.error ? [messageText(t, runtime.error)] : []),
40
+ ...(runtime.lastAccessedAt
41
+ ? [
42
+ t('ui.runtime.lastVisit', {
43
+ time: formatDate(runtime.lastAccessedAt, i18n.language),
44
+ }),
45
+ ]
46
+ : []),
47
+ ];
48
+ if (details.length === 0)
49
+ return tag;
50
+ return (_jsxs(Tooltip, { open: open, onOpenChange: (next, details) => {
51
+ // A press opens it (below) rather than closing it; a press elsewhere, Escape or leaving the focus closes it.
52
+ if (details.reason === 'trigger-press')
53
+ return;
54
+ if (!next && details.reason === 'trigger-hover' && pressedRef.current)
55
+ return;
56
+ if (!next)
57
+ pressedRef.current = false;
58
+ setOpen(next);
59
+ }, children: [_jsxs(TooltipTrigger, { render: _jsx("button", { type: 'button', "data-slot": 'runtime-state', className: 'inline-flex rounded-md outline-none focus-visible:ring-2 focus-visible:ring-ring',
60
+ // A tap opens it where there is no hover; on the list it does not open the row.
61
+ onClick: (event) => {
62
+ event.stopPropagation();
63
+ pressedRef.current = true;
64
+ setOpen(true);
65
+ } }), children: [tag, _jsx("span", { className: 'sr-only', children: details.join('. ') })] }), _jsx(TooltipContent, { className: 'flex-col items-start gap-0.5', "aria-hidden": true, children: details.map((line) => (_jsx("span", { className: 'wrap-anywhere', children: line }, line))) })] }));
66
+ }
67
+ //# sourceMappingURL=runtime-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../../../client/components/runtime-state.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ReactElement } from 'react';
2
+ import type { AppSummary, SharedHostView } from '../../shared/releases.js';
3
+ /**
4
+ * One line on an App's page while its shared host affects it, null otherwise. `canReadEnvironments` adds the link to
5
+ * the host's block on the environments page, which needs the `rel.environments` `read` setting.
6
+ */
7
+ export declare function SharedHostNotice({ summary, canReadEnvironments, }: {
8
+ readonly summary: AppSummary;
9
+ readonly canReadEnvironments: boolean;
10
+ }): ReactElement | null;
11
+ /**
12
+ * One host's capacity card. Its counts are the whole host's, every environment on it included. Its footer splits the
13
+ * running or starting Apps by environment, each linking `canViewApps` readers to the environment's Apps filtered to
14
+ * them; the server counts with the same states the filter keeps, so the two agree.
15
+ */
16
+ export declare function SharedHostSection({ host, canViewApps, }: {
17
+ readonly host: SharedHostView;
18
+ readonly canViewApps: boolean;
19
+ }): ReactElement;
20
+ //# sourceMappingURL=shared-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-host.d.ts","sourceRoot":"","sources":["../../../client/components/shared-host.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAI1C,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAgB3E;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,mBAAmB,GACpB,EAAE;IACD,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC,GAAG,YAAY,GAAG,IAAI,CAyBtB;AAiDD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,WAAW,GACZ,EAAE;IACD,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B,GAAG,YAAY,CA2If"}
@@ -0,0 +1,88 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * A shared app host: the environments page shows each one once as a capacity card (`SharedHostSection`) — how many
4
+ * Apps run or start against its limit, the shared process's memory as one total (it cannot be divided among the Apps),
5
+ * its restart state and the environments it could not restore — with those Apps by environment, each linking to the
6
+ * environment's Apps filtered to them. An App's
7
+ * page mentions its host only when the host affects it (`SharedHostNotice`), linking to the card for those who may read
8
+ * the environments page.
9
+ */
10
+ import { useTranslation } from '@nocobase/i18n/client';
11
+ import { RefreshCwIcon, TriangleAlertIcon } from 'lucide-react';
12
+ import { Link } from 'react-router';
13
+ import { ACCESS_NAMESPACE } from '../../shared/access.js';
14
+ import { messageText } from '../lib/errors.js';
15
+ import { formatMemory } from '../lib/format.js';
16
+ import { useReleasesLinks, useReleasesPaths } from '../lib/paths.js';
17
+ import { hostNoticeOf, sharedHostAnchor } from '../lib/runtime-state.js';
18
+ import { Alert, AlertDescription, AlertTitle } from './ui/alert.js';
19
+ import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from './ui/card.js';
20
+ import { Progress } from './ui/progress.js';
21
+ /**
22
+ * One line on an App's page while its shared host affects it, null otherwise. `canReadEnvironments` adds the link to
23
+ * the host's block on the environments page, which needs the `rel.environments` `read` setting.
24
+ */
25
+ export function SharedHostNotice({ summary, canReadEnvironments, }) {
26
+ const { t } = useTranslation(ACCESS_NAMESPACE);
27
+ const paths = useReleasesPaths();
28
+ const notice = hostNoticeOf(summary);
29
+ if (!notice || !summary.host)
30
+ return null;
31
+ return (_jsxs(Alert, { role: 'status', "data-slot": 'shared-host-notice', children: [notice.startsWith('ui.sharedHost.recycling.') ? (_jsx(RefreshCwIcon, {})) : (_jsx(TriangleAlertIcon, {})), _jsxs(AlertTitle, { className: 'flex flex-wrap items-baseline gap-x-3 gap-y-1 font-normal', children: [_jsx("span", { children: t(notice) }), canReadEnvironments ? (_jsx(Link, { to: `${paths.environments}#${sharedHostAnchor(summary.host.id)}`, className: 'text-primary underline-offset-4 hover:underline', children: t('ui.sharedHost.view') })) : null] })] }));
32
+ }
33
+ /**
34
+ * One of the card's metrics, all built alike so their bars line up: a short label and its value on one line (the label
35
+ * truncates rather than wrapping), then the bar. Without a `max` (no limit) a blank track keeps the line's height.
36
+ */
37
+ function Meter({ label, value, used, max, }) {
38
+ const head = (_jsxs("div", { className: 'flex min-w-0 items-baseline justify-between gap-3 text-sm', children: [_jsx("span", { className: 'min-w-0 truncate text-muted-foreground', children: label }), _jsx("span", { className: 'shrink-0 font-medium whitespace-nowrap tabular-nums', children: value })] }));
39
+ if (!max)
40
+ return (_jsxs("div", { className: 'grid gap-1.5', "data-slot": 'shared-host-metric', children: [head, _jsx("div", { className: 'h-1 rounded-full bg-muted', "aria-hidden": true })] }));
41
+ return (_jsx(Progress, { value: Math.min(100, (used / max) * 100), getAriaValueText: () => value, "aria-label": label, className: 'grid gap-1.5', "data-slot": 'shared-host-metric', children: head }));
42
+ }
43
+ /** An environment's Apps filtered to those the card counts: running or starting. */
44
+ const RUNNING_SEARCH = '?runtimeState=running&runtimeState=starting';
45
+ /**
46
+ * One host's capacity card. Its counts are the whole host's, every environment on it included. Its footer splits the
47
+ * running or starting Apps by environment, each linking `canViewApps` readers to the environment's Apps filtered to
48
+ * them; the server counts with the same states the filter keeps, so the two agree.
49
+ */
50
+ export function SharedHostSection({ host, canViewApps, }) {
51
+ const { t } = useTranslation(ACCESS_NAMESPACE);
52
+ const links = useReleasesLinks();
53
+ const memory = host.memory;
54
+ return (_jsxs(Card, { id: sharedHostAnchor(host.id), className: 'scroll-mt-4', children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: t('ui.sharedHost.title') }), _jsx(CardDescription, { children: host.environments.length > 0
55
+ ? t('ui.sharedHost.environments', {
56
+ names: host.environments
57
+ .map((environment) => environment.name)
58
+ .join(', '),
59
+ })
60
+ : t('ui.sharedHost.description') })] }), _jsxs(CardContent, { className: 'space-y-4', children: [_jsxs("div", { className: 'grid gap-x-6 gap-y-4 sm:grid-cols-2 lg:grid-cols-3', children: [_jsx(Meter, { label: t('ui.sharedHost.appsLabel'), value: host.maxActive
61
+ ? t('ui.sharedHost.ratio', {
62
+ used: host.running,
63
+ limit: host.maxActive,
64
+ })
65
+ : t('ui.sharedHost.runningUnlimited', { running: host.running }), used: host.running, max: host.maxActive }), memory ? (_jsxs(_Fragment, { children: [_jsx(Meter, { label: t('ui.sharedHost.heapLabel'), value: t('ui.sharedHost.ratio', {
66
+ used: formatMemory(memory.heapUsed),
67
+ limit: formatMemory(memory.heapLimit),
68
+ }), used: memory.heapUsed, max: memory.heapLimit }), _jsx(Meter, { label: t('ui.sharedHost.processLabel'), value: t('ui.sharedHost.ratio', {
69
+ used: formatMemory(memory.rss),
70
+ limit: formatMemory(memory.rss + memory.available),
71
+ }), used: memory.rss, max: memory.rss + memory.available })] })) : null] }), _jsx("p", { className: 'text-xs text-muted-foreground', children: [
72
+ t('ui.sharedHost.deployed', { count: host.deployed }),
73
+ ...(memory
74
+ ? [
75
+ t('ui.sharedHost.available', {
76
+ available: formatMemory(memory.available),
77
+ }),
78
+ ]
79
+ : []),
80
+ t('ui.sharedHost.wholeHost'),
81
+ ].join(' · ') }), host.recycling ? (_jsxs(Alert, { role: 'status', "data-slot": 'shared-host-recycling', children: [_jsx(RefreshCwIcon, {}), _jsx(AlertTitle, { className: 'font-normal', children: t(`ui.sharedHost.recycling.${host.recycling}`) })] })) : null, host.failedEnvironments.map((environment) => (_jsxs(Alert, { variant: 'destructive', "data-slot": 'shared-host-restore-failed', children: [_jsx(TriangleAlertIcon, {}), _jsx(AlertTitle, { className: 'font-normal', children: t('ui.sharedHost.restoreFailed', {
82
+ name: environment.name ?? environment.id,
83
+ }) }), environment.error ? (_jsx(AlertDescription, { className: 'break-words', children: messageText(t, environment.error) })) : null] }, environment.id)))] }), host.environments.length > 0 ? (_jsxs(CardFooter, { className: 'flex flex-wrap items-baseline gap-x-3 gap-y-1', "data-host-environments": '', children: [_jsx("span", { className: 'text-sm text-muted-foreground', children: t('ui.sharedHost.byEnvironment') }), _jsx("ul", { className: 'flex flex-wrap items-baseline gap-x-3 gap-y-1 text-sm', children: host.environments.map((environment) => {
84
+ const label = (_jsxs(_Fragment, { children: [environment.name, ' ', _jsx("span", { className: 'tabular-nums', children: environment.running })] }));
85
+ return (_jsx("li", { children: canViewApps ? (_jsx(Link, { to: `${links.environment(environment.id)}${RUNNING_SEARCH}`, className: 'text-primary underline-offset-4 hover:underline', children: label })) : (label) }, environment.id));
86
+ }) }), canViewApps ? (_jsx("span", { className: 'text-xs text-muted-foreground', children: t('ui.sharedHost.viewAppsNote') })) : null] })) : null] }));
87
+ }
88
+ //# sourceMappingURL=shared-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-host.js","sourceRoot":"","sources":["../../../client/components/shared-host.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ReactElement } from 'react';
2
+ import { Progress as ProgressPrimitive } from '@base-ui/react/progress';
3
+ declare function Progress({ className, children, value, ...props }: ProgressPrimitive.Root.Props): ReactElement;
4
+ declare function ProgressTrack({ className, ...props }: ProgressPrimitive.Track.Props): ReactElement;
5
+ declare function ProgressIndicator({ className, ...props }: ProgressPrimitive.Indicator.Props): ReactElement;
6
+ declare function ProgressLabel({ className, ...props }: ProgressPrimitive.Label.Props): ReactElement;
7
+ declare function ProgressValue({ className, ...props }: ProgressPrimitive.Value.Props): ReactElement;
8
+ export { Progress, ProgressTrack, ProgressIndicator, ProgressLabel, ProgressValue, };
9
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../../client/components/ui/progress.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGxE,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,QAAQ,EACR,KAAK,EACL,GAAG,KAAK,EACT,EAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,GAAG,YAAY,CAc7C;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,CAW9C;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,iBAAiB,CAAC,SAAS,CAAC,KAAK,GAAG,YAAY,CAQlD;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,CAQ9C;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,CAW9C;AAED,OAAO,EACL,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,aAAa,GACd,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Progress as ProgressPrimitive } from '@base-ui/react/progress';
3
+ import { cn } from 'cn';
4
+ function Progress({ className, children, value, ...props }) {
5
+ return (_jsxs(ProgressPrimitive.Root, { value: value, "data-slot": 'progress', className: cn('flex flex-wrap gap-3', className), ...props, children: [children, _jsx(ProgressTrack, { children: _jsx(ProgressIndicator, {}) })] }));
6
+ }
7
+ function ProgressTrack({ className, ...props }) {
8
+ return (_jsx(ProgressPrimitive.Track, { className: cn('relative flex h-1 w-full items-center overflow-x-hidden rounded-full bg-muted', className), "data-slot": 'progress-track', ...props }));
9
+ }
10
+ function ProgressIndicator({ className, ...props }) {
11
+ return (_jsx(ProgressPrimitive.Indicator, { "data-slot": 'progress-indicator', className: cn('h-full bg-primary transition-all', className), ...props }));
12
+ }
13
+ function ProgressLabel({ className, ...props }) {
14
+ return (_jsx(ProgressPrimitive.Label, { className: cn('text-sm font-medium', className), "data-slot": 'progress-label', ...props }));
15
+ }
16
+ function ProgressValue({ className, ...props }) {
17
+ return (_jsx(ProgressPrimitive.Value, { className: cn('ml-auto text-sm text-muted-foreground tabular-nums', className), "data-slot": 'progress-value', ...props }));
18
+ }
19
+ export { Progress, ProgressTrack, ProgressIndicator, ProgressLabel, ProgressValue, };
20
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../../client/components/ui/progress.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,CAAC;AAExB,SAAS,QAAQ,CAAC,EAChB,SAAS,EACT,QAAQ,EACR,KAAK,EACL,GAAG,KAAK,EACqB;IAC7B,OAAO,CACL,MAAC,iBAAiB,CAAC,IAAI,IACrB,KAAK,EAAE,KAAK,eACF,UAAU,EACpB,SAAS,EAAE,EAAE,CAAC,sBAAsB,EAAE,SAAS,CAAC,KAC5C,KAAK,aAER,QAAQ,EACT,KAAC,aAAa,cACZ,KAAC,iBAAiB,KAAG,GACP,IACO,CAC1B,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,SAAS,EACT,GAAG,KAAK,EACsB;IAC9B,OAAO,CACL,KAAC,iBAAiB,CAAC,KAAK,IACtB,SAAS,EAAE,EAAE,CACX,+EAA+E,EAC/E,SAAS,CACV,eACS,gBAAgB,KACtB,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EAC0B;IAClC,OAAO,CACL,KAAC,iBAAiB,CAAC,SAAS,iBAChB,oBAAoB,EAC9B,SAAS,EAAE,EAAE,CAAC,kCAAkC,EAAE,SAAS,CAAC,KACxD,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,SAAS,EACT,GAAG,KAAK,EACsB;IAC9B,OAAO,CACL,KAAC,iBAAiB,CAAC,KAAK,IACtB,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,eACrC,gBAAgB,KACtB,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,SAAS,EACT,GAAG,KAAK,EACsB;IAC9B,OAAO,CACL,KAAC,iBAAiB,CAAC,KAAK,IACtB,SAAS,EAAE,EAAE,CACX,oDAAoD,EACpD,SAAS,CACV,eACS,gBAAgB,KACtB,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EACL,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,aAAa,GACd,CAAC"}
@@ -6,7 +6,8 @@ export interface Me {
6
6
  readonly permissions: ReleasesPermissions;
7
7
  }
8
8
  type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
9
- type Query = Record<string, string | number | boolean | undefined>;
9
+ /** A repeated parameter (`?environmentId=a&environmentId=b`) is an array. */
10
+ type Query = Record<string, string | number | boolean | readonly string[] | undefined>;
10
11
  /** A list answer: its items, and what `meta` says about them (`total`, and `page`/`pageSize` when it pages). */
11
12
  export interface ListResult<T> {
12
13
  readonly items: readonly T[];
@@ -38,5 +39,7 @@ export interface Loaded<T> {
38
39
  export declare function useLoad<T>(load: () => Promise<T>, key: string): Loaded<T>;
39
40
  /** The signed-in user's permissions; nothing until they are known. */
40
41
  export declare function useMe(): Me;
42
+ /** The signed-in user's permissions with whether they are known yet, for a page that decides who may enter it. */
43
+ export declare function useMeLoad(): Loaded<Me>;
41
44
  export {};
42
45
  //# sourceMappingURL=use-releases.d.ts.map