@skillcdn/console 0.4.3 → 0.4.4

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 (231) hide show
  1. package/README.md +4 -4
  2. package/dist/api.d.ts +3 -3
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +3 -3
  5. package/dist/api.js.map +1 -1
  6. package/dist/cli/cli.d.ts.map +1 -1
  7. package/dist/cli/cli.js +95 -20
  8. package/dist/cli/cli.js.map +1 -1
  9. package/dist/cli/format.d.ts +4 -2
  10. package/dist/cli/format.d.ts.map +1 -1
  11. package/dist/cli/format.js +32 -9
  12. package/dist/cli/format.js.map +1 -1
  13. package/dist/cli/help.d.ts.map +1 -1
  14. package/dist/cli/help.js +17 -14
  15. package/dist/cli/help.js.map +1 -1
  16. package/dist/cli/plugin-check.d.ts +5 -1
  17. package/dist/cli/plugin-check.d.ts.map +1 -1
  18. package/dist/cli/plugin-check.js +23 -4
  19. package/dist/cli/plugin-check.js.map +1 -1
  20. package/dist/cli/plugin-cli.d.ts.map +1 -1
  21. package/dist/cli/plugin-cli.js +10 -1
  22. package/dist/cli/plugin-cli.js.map +1 -1
  23. package/dist/cli/plugin-init.d.ts +2 -0
  24. package/dist/cli/plugin-init.d.ts.map +1 -1
  25. package/dist/cli/plugin-init.js +6 -0
  26. package/dist/cli/plugin-init.js.map +1 -1
  27. package/dist/client.d.ts +4 -0
  28. package/dist/client.d.ts.map +1 -1
  29. package/dist/client.js +2 -0
  30. package/dist/client.js.map +1 -1
  31. package/dist/compat.js +1 -1
  32. package/dist/components/board.d.ts +8 -0
  33. package/dist/components/board.d.ts.map +1 -1
  34. package/dist/components/board.js +3 -3
  35. package/dist/components/board.js.map +1 -1
  36. package/dist/components/decision-form.d.ts +6 -0
  37. package/dist/components/decision-form.d.ts.map +1 -1
  38. package/dist/components/decision-form.js +23 -5
  39. package/dist/components/decision-form.js.map +1 -1
  40. package/dist/components/decision-list.d.ts +5 -1
  41. package/dist/components/decision-list.d.ts.map +1 -1
  42. package/dist/components/decision-list.js +25 -5
  43. package/dist/components/decision-list.js.map +1 -1
  44. package/dist/components/event-feed.d.ts.map +1 -1
  45. package/dist/components/event-feed.js +7 -1
  46. package/dist/components/event-feed.js.map +1 -1
  47. package/dist/components/goals.d.ts.map +1 -1
  48. package/dist/components/goals.js +2 -2
  49. package/dist/components/goals.js.map +1 -1
  50. package/dist/components/home.d.ts +35 -0
  51. package/dist/components/home.d.ts.map +1 -0
  52. package/dist/components/home.js +326 -0
  53. package/dist/components/home.js.map +1 -0
  54. package/dist/components/pack-connect.d.ts.map +1 -1
  55. package/dist/components/pack-connect.js +5 -4
  56. package/dist/components/pack-connect.js.map +1 -1
  57. package/dist/components/people.d.ts +2 -0
  58. package/dist/components/people.d.ts.map +1 -1
  59. package/dist/components/people.js +15 -2
  60. package/dist/components/people.js.map +1 -1
  61. package/dist/components/plugin-frame.d.ts +3 -12
  62. package/dist/components/plugin-frame.d.ts.map +1 -1
  63. package/dist/components/plugin-frame.js +53 -20
  64. package/dist/components/plugin-frame.js.map +1 -1
  65. package/dist/components/plugin-settings.d.ts.map +1 -1
  66. package/dist/components/plugin-settings.js +151 -26
  67. package/dist/components/plugin-settings.js.map +1 -1
  68. package/dist/components/projects.d.ts +0 -8
  69. package/dist/components/projects.d.ts.map +1 -1
  70. package/dist/components/projects.js +1 -13
  71. package/dist/components/projects.js.map +1 -1
  72. package/dist/components/task-view.d.ts.map +1 -1
  73. package/dist/components/task-view.js +2 -1
  74. package/dist/components/task-view.js.map +1 -1
  75. package/dist/components/ui.d.ts.map +1 -1
  76. package/dist/components/ui.js +5 -2
  77. package/dist/components/ui.js.map +1 -1
  78. package/dist/connect-page.d.ts.map +1 -1
  79. package/dist/connect-page.js +5 -6
  80. package/dist/connect-page.js.map +1 -1
  81. package/dist/console.css +761 -191
  82. package/dist/console.d.ts +10 -3
  83. package/dist/console.d.ts.map +1 -1
  84. package/dist/console.js +33 -13
  85. package/dist/console.js.map +1 -1
  86. package/dist/data.d.ts +4 -2
  87. package/dist/data.d.ts.map +1 -1
  88. package/dist/data.js +5 -0
  89. package/dist/data.js.map +1 -1
  90. package/dist/docs-page.d.ts.map +1 -1
  91. package/dist/docs-page.js +6 -5
  92. package/dist/docs-page.js.map +1 -1
  93. package/dist/home-tiles.d.ts +92 -0
  94. package/dist/home-tiles.d.ts.map +1 -0
  95. package/dist/home-tiles.js +294 -0
  96. package/dist/home-tiles.js.map +1 -0
  97. package/dist/i18n/en.d.ts +174 -0
  98. package/dist/i18n/en.d.ts.map +1 -1
  99. package/dist/i18n/en.js +175 -1
  100. package/dist/i18n/en.js.map +1 -1
  101. package/dist/i18n/index.d.ts +4 -2
  102. package/dist/i18n/index.d.ts.map +1 -1
  103. package/dist/i18n/index.js +10 -11
  104. package/dist/i18n/index.js.map +1 -1
  105. package/dist/i18n/ko.d.ts.map +1 -1
  106. package/dist/i18n/ko.js +170 -3
  107. package/dist/i18n/ko.js.map +1 -1
  108. package/dist/index.d.ts +4 -3
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +4 -3
  111. package/dist/index.js.map +1 -1
  112. package/dist/limits.d.ts +6 -0
  113. package/dist/limits.d.ts.map +1 -1
  114. package/dist/limits.js +6 -0
  115. package/dist/limits.js.map +1 -1
  116. package/dist/plugin/bridge.d.ts +44 -3
  117. package/dist/plugin/bridge.d.ts.map +1 -1
  118. package/dist/plugin/bridge.js +26 -0
  119. package/dist/plugin/bridge.js.map +1 -1
  120. package/dist/plugin/capabilities.d.ts +7 -1
  121. package/dist/plugin/capabilities.d.ts.map +1 -1
  122. package/dist/plugin/capabilities.js +14 -1
  123. package/dist/plugin/capabilities.js.map +1 -1
  124. package/dist/plugin/context.d.ts +18 -1
  125. package/dist/plugin/context.d.ts.map +1 -1
  126. package/dist/plugin/define.d.ts +1 -0
  127. package/dist/plugin/define.d.ts.map +1 -1
  128. package/dist/plugin/define.js +1 -1
  129. package/dist/plugin/define.js.map +1 -1
  130. package/dist/plugin/limits.d.ts +5 -2
  131. package/dist/plugin/limits.d.ts.map +1 -1
  132. package/dist/plugin/limits.js +5 -2
  133. package/dist/plugin/limits.js.map +1 -1
  134. package/dist/plugin/manifest.d.ts +83 -6
  135. package/dist/plugin/manifest.d.ts.map +1 -1
  136. package/dist/plugin/manifest.js +111 -7
  137. package/dist/plugin/manifest.js.map +1 -1
  138. package/dist/plugin/rest-schemas.d.ts +76 -0
  139. package/dist/plugin/rest-schemas.d.ts.map +1 -1
  140. package/dist/plugin/rest-schemas.js +23 -2
  141. package/dist/plugin/rest-schemas.js.map +1 -1
  142. package/dist/plugin/sandbox.d.ts +4 -3
  143. package/dist/plugin/sandbox.d.ts.map +1 -1
  144. package/dist/plugin/sandbox.js +33 -6
  145. package/dist/plugin/sandbox.js.map +1 -1
  146. package/dist/plugin/semver.d.ts +26 -0
  147. package/dist/plugin/semver.d.ts.map +1 -0
  148. package/dist/plugin/semver.js +76 -0
  149. package/dist/plugin/semver.js.map +1 -0
  150. package/dist/plugin/testing.d.ts.map +1 -1
  151. package/dist/plugin/testing.js +2 -1
  152. package/dist/plugin/testing.js.map +1 -1
  153. package/dist/plugin/web.d.ts +10 -1
  154. package/dist/plugin/web.d.ts.map +1 -1
  155. package/dist/plugin/web.js +34 -0
  156. package/dist/plugin/web.js.map +1 -1
  157. package/dist/plugin.d.ts +3 -2
  158. package/dist/plugin.d.ts.map +1 -1
  159. package/dist/plugin.js +3 -2
  160. package/dist/plugin.js.map +1 -1
  161. package/dist/rules.d.ts +2 -2
  162. package/dist/rules.js +3 -3
  163. package/dist/schemas.d.ts +497 -2
  164. package/dist/schemas.d.ts.map +1 -1
  165. package/dist/schemas.js +96 -9
  166. package/dist/schemas.js.map +1 -1
  167. package/dist/use-action.d.ts +8 -2
  168. package/dist/use-action.d.ts.map +1 -1
  169. package/dist/use-action.js +13 -6
  170. package/dist/use-action.js.map +1 -1
  171. package/dist/vocabulary.d.ts +3 -1
  172. package/dist/vocabulary.d.ts.map +1 -1
  173. package/dist/vocabulary.js +3 -0
  174. package/dist/vocabulary.js.map +1 -1
  175. package/docs/specs/cli.md +4 -3
  176. package/docs/specs/plugins.md +46 -33
  177. package/docs/specs/rest.md +16 -15
  178. package/package.json +1 -1
  179. package/skills/building-a-plugin/SKILL.md +8 -7
  180. package/skills/planning-the-board/references/setting-up.md +2 -1
  181. package/skills/working-the-board/SKILL.md +3 -3
  182. package/src/api.ts +6 -0
  183. package/src/cli/cli.ts +124 -19
  184. package/src/cli/format.ts +42 -9
  185. package/src/cli/help.ts +17 -13
  186. package/src/cli/plugin-check.ts +41 -2
  187. package/src/cli/plugin-cli.ts +10 -1
  188. package/src/cli/plugin-init.ts +8 -0
  189. package/src/client.ts +8 -0
  190. package/src/compat.ts +1 -1
  191. package/src/components/board.tsx +3 -3
  192. package/src/components/decision-form.tsx +75 -19
  193. package/src/components/decision-list.tsx +45 -13
  194. package/src/components/event-feed.tsx +7 -1
  195. package/src/components/goals.tsx +4 -1
  196. package/src/components/home.tsx +615 -0
  197. package/src/components/pack-connect.tsx +5 -4
  198. package/src/components/people.tsx +136 -54
  199. package/src/components/plugin-frame.tsx +62 -63
  200. package/src/components/plugin-settings.tsx +428 -87
  201. package/src/components/projects.tsx +0 -55
  202. package/src/components/task-view.tsx +7 -0
  203. package/src/components/ui.tsx +6 -2
  204. package/src/connect-page.tsx +5 -6
  205. package/src/console.tsx +80 -30
  206. package/src/data.ts +9 -2
  207. package/src/docs-page.tsx +6 -5
  208. package/src/home-tiles.ts +438 -0
  209. package/src/i18n/en.ts +178 -0
  210. package/src/i18n/index.ts +17 -14
  211. package/src/i18n/ko.ts +174 -3
  212. package/src/index.ts +7 -5
  213. package/src/limits.ts +6 -0
  214. package/src/plugin/bridge.ts +77 -1
  215. package/src/plugin/capabilities.ts +17 -1
  216. package/src/plugin/context.ts +18 -1
  217. package/src/plugin/define.ts +4 -1
  218. package/src/plugin/limits.ts +5 -2
  219. package/src/plugin/manifest.ts +154 -10
  220. package/src/plugin/rest-schemas.ts +27 -1
  221. package/src/plugin/sandbox.ts +36 -8
  222. package/src/plugin/semver.ts +89 -0
  223. package/src/plugin/testing.ts +2 -1
  224. package/src/plugin/web.ts +49 -0
  225. package/src/plugin.ts +18 -0
  226. package/src/rules.ts +3 -3
  227. package/src/schemas.ts +118 -10
  228. package/src/styles/console.css +761 -191
  229. package/src/use-action.ts +16 -7
  230. package/src/vocabulary.ts +4 -0
  231. package/template/plugin/console-plugin.json +3 -1
package/src/i18n/en.ts CHANGED
@@ -137,6 +137,133 @@ export const en = {
137
137
  },
138
138
  },
139
139
 
140
+ /**
141
+ * What a failure says, by the code the server answers with. The server's own message is English
142
+ * and for programs; the pages read the code here, and a test holds every code the server can
143
+ * answer to having its words.
144
+ */
145
+ errors: {
146
+ internal: "Something went wrong on the console. Try again later.",
147
+ invalid_response: "The console gave an answer that could not be read.",
148
+ network: "The console could not be reached.",
149
+ no_project: "This page is on no project.",
150
+ not_found: "There is nothing at this address.",
151
+ "auth.deactivated": "This account has been deactivated.",
152
+ "auth.forbidden": "You don't have permission to do this.",
153
+ "auth.forbidden_origin": "This request must come from the console's own pages.",
154
+ "auth.invalid_token": "The token is not valid. It may have expired or been removed.",
155
+ "auth.not_admitted": "This account has not been added to the console. Ask an administrator.",
156
+ "auth.required": "Sign in to continue.",
157
+ "auth.session_required": "This can only be done signed in on the console's own pages.",
158
+ "category.in_use": "Tasks or goals use this category. Move them to another one first.",
159
+ "category.key_taken": "A category with this key already exists.",
160
+ "category.not_found": "The category was not found.",
161
+ "category.too_many": "The workspace has as many categories as it can hold.",
162
+ "client.outdated": "This command is too old for the console. Update it.",
163
+ "client.too_new": "This command is too new for the console.",
164
+ "comment.empty": "Write something or attach a file.",
165
+ "comment.too_many": "The task has as many comments as it can hold.",
166
+ "comment.too_many_files": "The comment has too many files.",
167
+ "connect.approved": "This connection has already been approved.",
168
+ "connect.not_found": "No connection is waiting under this code.",
169
+ "connect.too_many": "Too many agents are asking to connect. Try again in a moment.",
170
+ "credentials.unavailable": "The console's credentials could not be read. Try again later.",
171
+ "decision.answered": "This decision has already been answered.",
172
+ "decision.invalid_decider": "The person named to decide can't work in this project.",
173
+ "decision.invalid_run": "The run is not the asker's, or it has ended.",
174
+ "decision.invalid_task": "The task is not in this project.",
175
+ "decision.no_such_option": "That option is not one of the decision's.",
176
+ "decision.not_found": "The decision was not found.",
177
+ "decision.too_many": "The project has as many decisions as it can hold.",
178
+ "decision.too_many_deciders": "Too many people were named to decide.",
179
+ "decision.too_many_files": "The decision has too many files.",
180
+ "document.archived": "This page is archived.",
181
+ "document.conflict":
182
+ "The page changed while you were writing. Load it again and redo your change.",
183
+ "document.invalid_path": "That is not a path a page can have.",
184
+ "document.not_found": "The page was not found.",
185
+ "document.too_many": "The project has as many pages as it can hold.",
186
+ "document.too_many_files": "The page has as many files as it can hold.",
187
+ "document.too_many_versions": "The page has as many versions as it can hold.",
188
+ "document.version_not_found": "The page has no such version.",
189
+ "feed.too_many": "Too many live views are open. Close a tab and try again.",
190
+ "file.not_found": "The file was not found.",
191
+ "file.not_served": "This file is not served.",
192
+ "file.not_text": "This file can't be read as text.",
193
+ "file.store_unavailable": "Files can't be reached right now. Try again later.",
194
+ "file.too_large": "The file is too large.",
195
+ "goal.invalid_category": "The category is not one of the workspace's.",
196
+ "goal.invalid_dates": "The target day is before the start.",
197
+ "goal.not_found": "The goal was not found.",
198
+ "goal.too_many": "The project has as many goals as it can hold.",
199
+ "index.failed": "The pack could not be read.",
200
+ "index.indexing": "The pack is still being read. Try again in a moment.",
201
+ "listing.exists": "This login has already been added, or is already a member.",
202
+ "listing.not_found": "This login is not on the list.",
203
+ "listing.unknown_host": "Nobody signs in through that provider here.",
204
+ "member.exists": "This person is already in the project.",
205
+ "member.invalid_person": "This person is not in the workspace.",
206
+ "member.not_found": "This person is not in the project.",
207
+ "member.open_project": "The project is open to the workspace, so everyone is already a member.",
208
+ "mount.ref_not_found": "That version of the pack was not found.",
209
+ "mount.repo_not_found": "The pack was not found.",
210
+ "person.invalid_manager":
211
+ "A manager must be another active person, and not one of this person's own team.",
212
+ "person.last_admin": "The workspace needs at least one administrator.",
213
+ "person.not_found": "The person was not found.",
214
+ "person.of_organization": "The organization decides who is in. This can't be changed here.",
215
+ "picture.refused": "This picture can't be shown.",
216
+ "picture.unavailable": "The picture could not be fetched. Try again later.",
217
+ "plugin.conflict": "This has already been done, or something changed in the meantime.",
218
+ "plugin.disabled": "The plugin is off.",
219
+ "plugin.failed": "The plugin ran into a problem.",
220
+ "plugin.forbidden": "The plugin can't do this.",
221
+ "plugin.invalid_args": "Check what you entered and try again.",
222
+ "plugin.needs_consent": "An administrator must first agree to what the plugin asks.",
223
+ "plugin.not_found": "The plugin was not found.",
224
+ "plugin.rate_limited": "The plugin is sending too many requests. Try again in a moment.",
225
+ "plugin.required_by": "Another plugin needs this one. Turn that one off first.",
226
+ "plugin.requires": "This plugin needs another plugin that is not on.",
227
+ "plugin.timeout": "The plugin took too long to answer.",
228
+ "plugin.too_many": "The plugin has reached a limit.",
229
+ "plugin.unavailable": "The plugin can't be reached right now.",
230
+ "project.invalid_address": "That is not the address of a pack.",
231
+ "project.invalid_icon": "That file can't be used as the project's image.",
232
+ "project.key_taken": "A project with this key already exists.",
233
+ "project.no_icon": "The project has no image.",
234
+ "project.not_found": "The project was not found.",
235
+ "project.pack_connect_refused": "SkillCDN refused the connection.",
236
+ "project.pack_connect_unsupported": "This console can't connect a pack.",
237
+ "project.pack_token_refused": "SkillCDN doesn't serve the pack to this token.",
238
+ "project.pack_token_unsupported": "This console can't keep a pack token.",
239
+ "project.too_many": "The workspace has as many projects as it can hold.",
240
+ "project.too_many_bytes": "The project's files have used up the room it has.",
241
+ "request.invalid": "Check what you entered and try again.",
242
+ "request.too_large": "That is too large to send.",
243
+ "run.not_found": "The run was not found.",
244
+ "run.not_yours": "This run is another person's.",
245
+ "run.over": "This run has ended.",
246
+ "run.task_closed": "The task is done or dropped.",
247
+ "run.task_not_found": "The task is not in this project.",
248
+ "run.too_many": "The task has been taken as many times as it can be.",
249
+ "run.too_many_artifacts": "The run has as many results as it can hold.",
250
+ "run.too_many_reports": "The run has as many reports as it can hold.",
251
+ "skills.unavailable": "SkillCDN could not be reached. Try again later.",
252
+ "task.invalid_category": "The category is not one of the workspace's.",
253
+ "task.invalid_dates": "The due day is before the start.",
254
+ "task.invalid_goal": "The goal is not in this project.",
255
+ "task.invalid_parent": "The parent is not a task of this project, or would make a loop.",
256
+ "task.invalid_worker": "A worker must be someone who can work in the project.",
257
+ "task.not_found": "The task was not found.",
258
+ "task.too_many": "The project has as many tasks as it can hold.",
259
+ "token.expiry_at_most": "A token can't last that many days here.",
260
+ "token.not_found": "The token was not found.",
261
+ "token.too_many": "You have as many tokens as you can hold. Remove one first.",
262
+ "workspace.pack_connect_refused": "SkillCDN refused the connection.",
263
+ "workspace.pack_connect_unsupported": "This console can't connect a pack.",
264
+ "workspace.pack_token_refused": "SkillCDN doesn't serve the pack to this token.",
265
+ "workspace.pack_token_unsupported": "This console can't keep a pack token.",
266
+ },
140
267
  nav: {
141
268
  projects: "Projects",
142
269
  work: "My work",
@@ -179,6 +306,11 @@ export const en = {
179
306
  problems: "Why it cannot run",
180
307
  nothing: "None",
181
308
  capabilities: "Capabilities",
309
+ required: "Required",
310
+ requiredHint: "The plugin can't work without these, so they stay on.",
311
+ optional: "Optional",
312
+ optionalHint: "Turn on what you want it to use. You can change this later.",
313
+ newCapability: "New",
182
314
  board: "Board project",
183
315
  boardHint: "Where its decisions, tasks and pages go.",
184
316
  boardNone: "None",
@@ -221,7 +353,15 @@ export const en = {
221
353
  purged: "Purged.",
222
354
  agentNote: "For agents",
223
355
  operations: "Commands and queries",
356
+ console: "Console versions",
357
+ consoleRange: (range: string) => `console ${range}`,
358
+ timeZoneHint: "In the workspace's time zone.",
359
+ addItem: "Add",
360
+ itemPlaceholder: "Type, then add",
361
+ choose: "Choose…",
224
362
  },
363
+ /** What stands in for a frame the console has nothing to show in. */
364
+ frameUnavailable: "This can't be shown right now.",
225
365
  /** The capabilities (docs/specs/plugins.md, "Capabilities"), each by a name and the sentence of what it opens, as an administrator reads them before consenting. */
226
366
  capability: {
227
367
  files: {
@@ -275,6 +415,11 @@ export const en = {
275
415
  name: "Own database schema",
276
416
  opens: "Gets a schema and a login role of its own in the console's database.",
277
417
  },
418
+ "outbound:webrtc": {
419
+ name: "WebRTC on its pages",
420
+ opens:
421
+ "Its pages connect from each person's browser to any address, past the console: what they show, and the person's network address, can go anywhere.",
422
+ },
278
423
  outbound: (host: string) => ({
279
424
  name: `Requests to ${host}`,
280
425
  opens: `Sends https requests to ${host}.`,
@@ -464,6 +609,7 @@ export const en = {
464
609
  },
465
610
  partOf: "Part of",
466
611
  owner: "Owner",
612
+ writtenThrough: "Written through",
467
613
  workers: "Workers",
468
614
  written: "Written",
469
615
  changed: "Changed",
@@ -547,11 +693,14 @@ export const en = {
547
693
  askedThrough: (agent: string) => `asked through ${agent}`,
548
694
  about: "about",
549
695
  answeredBy: "answered",
696
+ answeredThrough: (agent: string) => `answered through ${agent}`,
550
697
  context: "Context",
551
698
  files: "Files",
552
699
  picture: (name: string) => `The picture ${name}`,
553
700
  whatFollowed: "What followed",
554
701
  nothingWritten: "Nothing written yet.",
702
+ wroteWhatFollowed: "wrote what followed",
703
+ wroteWhatFollowedThrough: (agent: string) => `wrote what followed through ${agent}`,
555
704
  outcomePlaceholder: "What was done with the answer, and what came of it, in Markdown.",
556
705
  writeWhatFollowed: "Write what followed",
557
706
  changeIt: "Change it",
@@ -568,6 +717,8 @@ export const en = {
568
717
  noTask: "No task in particular",
569
718
  decider: "Who decides",
570
719
  deciderPlaceholder: "You, unless you name someone",
720
+ addDecider: "Add a person",
721
+ decidersHint: "Any of them may answer; the first answer ends it.",
571
722
  me: "(you)",
572
723
  options: "Options",
573
724
  option: (n: number) => `Option ${n}`,
@@ -658,6 +809,7 @@ export const en = {
658
809
  target: "Target",
659
810
  noTarget: "No target day",
660
811
  setBy: "Set by",
812
+ setThrough: (agent: string) => `through ${agent}`,
661
813
  state: "State",
662
814
  nothingMore: "Nothing more was written about it.",
663
815
  about: "What reaching it means",
@@ -846,6 +998,8 @@ export const en = {
846
998
  personUnlisted: (login: string) => `took ${login} off the list`,
847
999
  personDeactivated: (login: string) => `deactivated ${login}`,
848
1000
  personReactivated: (login: string) => `reactivated ${login}`,
1001
+ managerChanged: (login: string, manager: string) => `set ${login}'s manager to ${manager}`,
1002
+ managerCleared: (login: string) => `cleared ${login}'s manager`,
849
1003
  projectCreated: (project: string) => `made the project ${project}`,
850
1004
  projectUpdated: (fields: string, project: string) =>
851
1005
  `changed ${fields} of the project ${project}`,
@@ -888,6 +1042,7 @@ export const en = {
888
1042
  fileAttached: (label: string, page: string) => `attached ${label} to ${page}`,
889
1043
  pluginEnabled: (plugin: string) => `enabled the plugin ${plugin}`,
890
1044
  pluginDisabled: (plugin: string) => `disabled the plugin ${plugin}`,
1045
+ pluginConsented: (plugin: string) => `changed the capabilities of the plugin ${plugin}`,
891
1046
  pluginConfigured: (fields: string, plugin: string) =>
892
1047
  `changed ${fields} of the plugin ${plugin}`,
893
1048
  pluginGranted: (role: string, who: string, plugin: string) =>
@@ -1057,11 +1212,34 @@ export const en = {
1057
1212
  },
1058
1213
  },
1059
1214
 
1215
+ /** The front page as the person arranges it (ADR-0061). */
1216
+ home: {
1217
+ edit: "Edit layout",
1218
+ hint: "Drag to move. Pick a size at the top right; × takes a tile off this page.",
1219
+ done: "Done",
1220
+ add: "Add",
1221
+ remove: "Remove from this page",
1222
+ size: "Size",
1223
+ sizes: {
1224
+ icon: "Icon",
1225
+ small: "Small",
1226
+ medium: "Medium",
1227
+ large: "Large",
1228
+ wide: "Wide",
1229
+ full: "Full",
1230
+ },
1231
+ },
1232
+
1060
1233
  people: {
1061
1234
  title: "People",
1062
1235
  list: "People",
1063
1236
  narrowed: "The people you share a project with, and the administrators.",
1064
1237
  roleOf: (name: string) => `Role of ${name}`,
1238
+ role: "Role",
1239
+ manager: "Manager",
1240
+ managerOf: (name: string) => `Manager of ${name}`,
1241
+ team: "Team",
1242
+ nobody: "None",
1065
1243
  letIn: "Add a person",
1066
1244
  letInAria: "Add a person",
1067
1245
  notSignedIn: "Added, not signed in yet",
package/src/i18n/index.ts CHANGED
@@ -52,25 +52,28 @@ export function packFor(
52
52
  );
53
53
  }
54
54
 
55
- /**
56
- * The language to speak: the person's choice when it names a pack, else the first of the
57
- * browser's languages that does, else the first pack.
58
- */
59
- export function chooseLanguage(
60
- chosen: string | null | undefined,
55
+ /** The first of the browser's languages a pack speaks, or nothing. */
56
+ export function browserPack(
61
57
  browser: readonly string[],
62
- packs: readonly LanguagePack[] = DEFAULT_LANGUAGES,
63
- ): LanguagePack {
64
- const first = packs[0] ?? ENGLISH;
65
- const own = packFor(chosen, packs);
66
- if (own !== undefined) {
67
- return own;
68
- }
58
+ packs: readonly LanguagePack[],
59
+ ): LanguagePack | undefined {
69
60
  for (const tag of browser) {
70
61
  const found = packFor(tag, packs);
71
62
  if (found !== undefined) {
72
63
  return found;
73
64
  }
74
65
  }
75
- return first;
66
+ return undefined;
67
+ }
68
+
69
+ /**
70
+ * The language to speak: the person's own when it names a pack, else the first of the browser's
71
+ * languages that does, else the first pack.
72
+ */
73
+ export function chooseLanguage(
74
+ chosen: string | null | undefined,
75
+ browser: readonly string[],
76
+ packs: readonly LanguagePack[] = DEFAULT_LANGUAGES,
77
+ ): LanguagePack {
78
+ return packFor(chosen, packs) ?? browserPack(browser, packs) ?? packs[0] ?? ENGLISH;
76
79
  }
package/src/i18n/ko.ts CHANGED
@@ -98,6 +98,128 @@ export const ko: Messages = {
98
98
  },
99
99
  },
100
100
 
101
+ errors: {
102
+ internal: "콘솔에 문제가 생겼습니다. 잠시 후 다시 시도하세요.",
103
+ invalid_response: "콘솔의 응답을 읽을 수 없습니다.",
104
+ network: "콘솔에 연결할 수 없습니다.",
105
+ no_project: "이 페이지는 프로젝트에 속해 있지 않습니다.",
106
+ not_found: "이 주소에는 아무것도 없습니다.",
107
+ "auth.deactivated": "비활성화된 계정입니다.",
108
+ "auth.forbidden": "이 작업을 할 권한이 없습니다.",
109
+ "auth.forbidden_origin": "콘솔 화면에서 보낸 요청이 아닙니다.",
110
+ "auth.invalid_token": "토큰이 유효하지 않습니다. 만료되었거나 삭제되었을 수 있습니다.",
111
+ "auth.not_admitted": "콘솔에 추가되지 않은 계정입니다. 관리자에게 문의하세요.",
112
+ "auth.required": "로그인해 주세요.",
113
+ "auth.session_required": "콘솔 화면에 직접 로그인해야 할 수 있는 작업입니다.",
114
+ "category.in_use":
115
+ "이 카테고리를 쓰는 작업이나 목표가 있습니다. 먼저 다른 카테고리로 옮기세요.",
116
+ "category.key_taken": "같은 키의 카테고리가 이미 있습니다.",
117
+ "category.not_found": "카테고리를 찾을 수 없습니다.",
118
+ "category.too_many": "워크스페이스에 만들 수 있는 카테고리 수를 다 채웠습니다.",
119
+ "client.outdated": "명령어가 콘솔보다 오래되었습니다. 업데이트하세요.",
120
+ "client.too_new": "명령어가 콘솔보다 새 버전입니다.",
121
+ "comment.empty": "내용을 쓰거나 파일을 첨부하세요.",
122
+ "comment.too_many": "이 작업에 달 수 있는 댓글 수를 다 채웠습니다.",
123
+ "comment.too_many_files": "댓글에 파일이 너무 많습니다.",
124
+ "connect.approved": "이미 승인된 연결입니다.",
125
+ "connect.not_found": "이 코드로 기다리는 연결이 없습니다.",
126
+ "connect.too_many": "연결을 요청하는 에이전트가 너무 많습니다. 잠시 후 다시 시도하세요.",
127
+ "credentials.unavailable": "콘솔의 인증 정보를 읽을 수 없습니다. 잠시 후 다시 시도하세요.",
128
+ "decision.answered": "이미 답한 결정입니다.",
129
+ "decision.invalid_decider": "결정할 사람으로 지정한 사람이 이 프로젝트에서 일할 수 없습니다.",
130
+ "decision.invalid_run": "요청한 사람의 실행이 아니거나 이미 끝난 실행입니다.",
131
+ "decision.invalid_task": "이 프로젝트의 작업이 아닙니다.",
132
+ "decision.no_such_option": "이 결정에 없는 선택지입니다.",
133
+ "decision.not_found": "결정을 찾을 수 없습니다.",
134
+ "decision.too_many": "프로젝트에 올릴 수 있는 결정 수를 다 채웠습니다.",
135
+ "decision.too_many_deciders": "결정할 사람을 너무 많이 지정했습니다.",
136
+ "decision.too_many_files": "결정에 파일이 너무 많습니다.",
137
+ "document.archived": "보관된 문서입니다.",
138
+ "document.conflict": "작성하는 사이 문서가 바뀌었습니다. 다시 불러온 뒤 수정하세요.",
139
+ "document.invalid_path": "문서에 쓸 수 없는 경로입니다.",
140
+ "document.not_found": "문서를 찾을 수 없습니다.",
141
+ "document.too_many": "프로젝트에 만들 수 있는 문서 수를 다 채웠습니다.",
142
+ "document.too_many_files": "문서에 첨부할 수 있는 파일 수를 다 채웠습니다.",
143
+ "document.too_many_versions": "문서에 남길 수 있는 버전 수를 다 채웠습니다.",
144
+ "document.version_not_found": "문서에 그런 버전이 없습니다.",
145
+ "feed.too_many": "실시간 화면이 너무 많이 열려 있습니다. 탭을 닫고 다시 시도하세요.",
146
+ "file.not_found": "파일을 찾을 수 없습니다.",
147
+ "file.not_served": "제공되지 않는 파일입니다.",
148
+ "file.not_text": "글로 읽을 수 없는 파일입니다.",
149
+ "file.store_unavailable": "지금은 파일을 불러올 수 없습니다. 잠시 후 다시 시도하세요.",
150
+ "file.too_large": "파일이 너무 큽니다.",
151
+ "goal.invalid_category": "워크스페이스에 없는 카테고리입니다.",
152
+ "goal.invalid_dates": "목표일이 시작일보다 빠릅니다.",
153
+ "goal.not_found": "목표를 찾을 수 없습니다.",
154
+ "goal.too_many": "프로젝트에 세울 수 있는 목표 수를 다 채웠습니다.",
155
+ "index.failed": "팩을 읽지 못했습니다.",
156
+ "index.indexing": "팩을 읽는 중입니다. 잠시 후 다시 시도하세요.",
157
+ "listing.exists": "이미 추가된 로그인이거나 이미 멤버인 사람입니다.",
158
+ "listing.not_found": "목록에 없는 로그인입니다.",
159
+ "listing.unknown_host": "이 콘솔에서는 그 제공자로 로그인할 수 없습니다.",
160
+ "member.exists": "이미 프로젝트에 있는 사람입니다.",
161
+ "member.invalid_person": "워크스페이스에 없는 사람입니다.",
162
+ "member.not_found": "프로젝트에 없는 사람입니다.",
163
+ "member.open_project": "공개 프로젝트라서 워크스페이스의 모든 사람이 이미 멤버입니다.",
164
+ "mount.ref_not_found": "팩의 그 버전을 찾을 수 없습니다.",
165
+ "mount.repo_not_found": "팩을 찾을 수 없습니다.",
166
+ "person.invalid_manager": "본인, 본인의 팀원, 비활성화된 사람은 매니저로 지정할 수 없습니다.",
167
+ "person.last_admin": "관리자가 한 명은 있어야 합니다.",
168
+ "person.not_found": "사람을 찾을 수 없습니다.",
169
+ "person.of_organization": "조직 설정으로 정해지는 사람이라 여기서 바꿀 수 없습니다.",
170
+ "picture.refused": "표시할 수 없는 이미지입니다.",
171
+ "picture.unavailable": "이미지를 불러오지 못했습니다. 잠시 후 다시 시도하세요.",
172
+ "plugin.conflict": "이미 처리되었거나 그사이에 바뀌었습니다.",
173
+ "plugin.disabled": "꺼져 있는 플러그인입니다.",
174
+ "plugin.failed": "플러그인에 문제가 생겼습니다.",
175
+ "plugin.forbidden": "플러그인이 할 수 없는 작업입니다.",
176
+ "plugin.invalid_args": "입력한 내용을 확인한 뒤 다시 시도하세요.",
177
+ "plugin.needs_consent": "플러그인이 요청한 권한에 관리자가 먼저 동의해야 합니다.",
178
+ "plugin.not_found": "플러그인을 찾을 수 없습니다.",
179
+ "plugin.rate_limited": "플러그인의 요청이 너무 많습니다. 잠시 후 다시 시도하세요.",
180
+ "plugin.required_by":
181
+ "이 플러그인이 필요한 다른 플러그인이 있습니다. 그 플러그인을 먼저 끄세요.",
182
+ "plugin.requires": "이 플러그인에 필요한 다른 플러그인이 켜져 있지 않습니다.",
183
+ "plugin.timeout": "플러그인의 응답이 너무 늦습니다.",
184
+ "plugin.too_many": "플러그인이 한도에 도달했습니다.",
185
+ "plugin.unavailable": "지금은 플러그인을 쓸 수 없습니다.",
186
+ "project.invalid_address": "팩 주소가 아닙니다.",
187
+ "project.invalid_icon": "프로젝트 이미지로 쓸 수 없는 파일입니다.",
188
+ "project.key_taken": "같은 키의 프로젝트가 이미 있습니다.",
189
+ "project.no_icon": "프로젝트에 이미지가 없습니다.",
190
+ "project.not_found": "프로젝트를 찾을 수 없습니다.",
191
+ "project.pack_connect_refused": "SkillCDN이 연결을 거부했습니다.",
192
+ "project.pack_connect_unsupported": "이 콘솔에서는 팩을 연결할 수 없습니다.",
193
+ "project.pack_token_refused": "SkillCDN이 이 토큰으로는 팩을 제공하지 않습니다.",
194
+ "project.pack_token_unsupported": "이 콘솔에서는 팩 토큰을 보관할 수 없습니다.",
195
+ "project.too_many": "워크스페이스에 만들 수 있는 프로젝트 수를 다 채웠습니다.",
196
+ "project.too_many_bytes": "프로젝트의 파일 용량을 다 썼습니다.",
197
+ "request.invalid": "입력한 내용을 확인한 뒤 다시 시도하세요.",
198
+ "request.too_large": "보내기에 너무 큽니다.",
199
+ "run.not_found": "실행을 찾을 수 없습니다.",
200
+ "run.not_yours": "다른 사람의 실행입니다.",
201
+ "run.over": "이미 끝난 실행입니다.",
202
+ "run.task_closed": "완료되었거나 중단된 작업입니다.",
203
+ "run.task_not_found": "이 프로젝트의 작업이 아닙니다.",
204
+ "run.too_many": "이 작업을 맡을 수 있는 횟수를 다 채웠습니다.",
205
+ "run.too_many_artifacts": "실행에 남길 수 있는 결과물 수를 다 채웠습니다.",
206
+ "run.too_many_reports": "실행에 남길 수 있는 보고 수를 다 채웠습니다.",
207
+ "skills.unavailable": "SkillCDN에 연결할 수 없습니다. 잠시 후 다시 시도하세요.",
208
+ "task.invalid_category": "워크스페이스에 없는 카테고리입니다.",
209
+ "task.invalid_dates": "마감일이 시작일보다 빠릅니다.",
210
+ "task.invalid_goal": "이 프로젝트의 목표가 아닙니다.",
211
+ "task.invalid_parent": "이 프로젝트의 작업이 아니거나, 상위 작업으로 두면 순환이 생깁니다.",
212
+ "task.invalid_worker": "이 프로젝트에서 일할 수 있는 사람만 담당자로 지정할 수 있습니다.",
213
+ "task.not_found": "작업을 찾을 수 없습니다.",
214
+ "task.too_many": "프로젝트에 만들 수 있는 작업 수를 다 채웠습니다.",
215
+ "token.expiry_at_most": "이 콘솔에서는 토큰을 그렇게 오래 쓰도록 만들 수 없습니다.",
216
+ "token.not_found": "토큰을 찾을 수 없습니다.",
217
+ "token.too_many": "만들 수 있는 토큰 수를 다 채웠습니다. 먼저 하나를 삭제하세요.",
218
+ "workspace.pack_connect_refused": "SkillCDN이 연결을 거부했습니다.",
219
+ "workspace.pack_connect_unsupported": "이 콘솔에서는 팩을 연결할 수 없습니다.",
220
+ "workspace.pack_token_refused": "SkillCDN이 이 토큰으로는 팩을 제공하지 않습니다.",
221
+ "workspace.pack_token_unsupported": "이 콘솔에서는 팩 토큰을 보관할 수 없습니다.",
222
+ },
101
223
  nav: {
102
224
  projects: "프로젝트",
103
225
  work: "내 작업",
@@ -139,6 +261,11 @@ export const ko: Messages = {
139
261
  problems: "실행할 수 없는 이유",
140
262
  nothing: "없음",
141
263
  capabilities: "권한",
264
+ required: "필수",
265
+ requiredHint: "플러그인이 동작하려면 꼭 필요해서 끌 수 없습니다.",
266
+ optional: "선택",
267
+ optionalHint: "쓰려는 것만 켜세요. 나중에 바꿀 수 있습니다.",
268
+ newCapability: "새 권한",
142
269
  board: "보드 프로젝트",
143
270
  boardHint: "플러그인의 결정, 태스크, 문서가 가는 곳입니다.",
144
271
  boardNone: "없음",
@@ -180,7 +307,14 @@ export const ko: Messages = {
180
307
  purged: "삭제했습니다.",
181
308
  agentNote: "에이전트에게",
182
309
  operations: "명령과 조회",
183
- },
310
+ console: "콘솔 버전",
311
+ consoleRange: (range) => `콘솔 ${range}`,
312
+ timeZoneHint: "워크스페이스 시간대 기준입니다.",
313
+ addItem: "추가",
314
+ itemPlaceholder: "입력한 뒤 추가",
315
+ choose: "선택…",
316
+ },
317
+ frameUnavailable: "지금은 표시할 수 없습니다.",
184
318
  capability: {
185
319
  files: { name: "파일", opens: "레코드에 파일을 붙입니다. 배포가 허용한 용량까지." },
186
320
  "people:read": { name: "사람 읽기", opens: "보는 사람이 볼 수 있는 사람들을 읽습니다." },
@@ -223,6 +357,11 @@ export const ko: Messages = {
223
357
  name: "전용 데이터베이스 스키마",
224
358
  opens: "콘솔 데이터베이스에 전용 스키마와 로그인 역할을 갖습니다.",
225
359
  },
360
+ "outbound:webrtc": {
361
+ name: "페이지의 WebRTC 연결",
362
+ opens:
363
+ "페이지가 콘솔을 거치지 않고 각 사람의 브라우저에서 어떤 주소로든 연결합니다. 화면에 보여 주는 내용과 그 사람의 네트워크 주소가 어디로든 나갈 수 있습니다.",
364
+ },
226
365
  outbound: (host) => ({ name: `${host}로 요청`, opens: `${host}에 https 요청을 보냅니다.` }),
227
366
  plugins: (key) => ({
228
367
  name: `플러그인 ${key} 호출`,
@@ -405,6 +544,7 @@ export const ko: Messages = {
405
544
  },
406
545
  partOf: "상위 작업:",
407
546
  owner: "담당자",
547
+ writtenThrough: "작성한 에이전트",
408
548
  workers: "작업자",
409
549
  written: "작성",
410
550
  changed: "변경",
@@ -488,11 +628,14 @@ export const ko: Messages = {
488
628
  askedThrough: (agent) => `${agent}을(를) 통해 질문`,
489
629
  about: "관련 작업:",
490
630
  answeredBy: "답변",
631
+ answeredThrough: (agent) => `${agent}을(를) 통해 답변`,
491
632
  context: "맥락",
492
633
  files: "파일",
493
634
  picture: (name) => `그림 ${name}`,
494
635
  whatFollowed: "그 뒤에 일어난 일",
495
636
  nothingWritten: "아직 적힌 것이 없습니다.",
637
+ wroteWhatFollowed: "그 뒤에 일어난 일을 적음",
638
+ wroteWhatFollowedThrough: (agent) => `${agent}을(를) 통해 그 뒤에 일어난 일을 적음`,
496
639
  outcomePlaceholder: "답변으로 무엇을 했고 무엇이 됐는지, Markdown으로.",
497
640
  writeWhatFollowed: "그 뒤에 일어난 일 쓰기",
498
641
  changeIt: "고치기",
@@ -509,6 +652,8 @@ export const ko: Messages = {
509
652
  noTask: "특정 작업 없음",
510
653
  decider: "결정할 사람",
511
654
  deciderPlaceholder: "지정하지 않으면 본인",
655
+ addDecider: "사람 추가",
656
+ decidersHint: "누구든 답할 수 있고, 첫 답으로 끝납니다.",
512
657
  me: "(나)",
513
658
  options: "선택지",
514
659
  option: (n) => `선택지 ${n}`,
@@ -599,6 +744,7 @@ export const ko: Messages = {
599
744
  target: "목표일",
600
745
  noTarget: "목표일 없음",
601
746
  setBy: "세운 사람",
747
+ setThrough: (agent) => `${agent}을(를) 통해`,
602
748
  state: "상태",
603
749
  nothingMore: "더 적힌 내용이 없습니다.",
604
750
  about: "이루면 무엇이 달라지나",
@@ -784,6 +930,8 @@ export const ko: Messages = {
784
930
  personUnlisted: (login) => `${login}을(를) 목록에서 뺐습니다`,
785
931
  personDeactivated: (login) => `${login}을(를) 비활성화했습니다`,
786
932
  personReactivated: (login) => `${login}을(를) 다시 활성화했습니다`,
933
+ managerChanged: (login, manager) => `${login}의 매니저를 ${manager}(으)로 지정했습니다`,
934
+ managerCleared: (login) => `${login}의 매니저 지정을 해제했습니다`,
787
935
  projectCreated: (project) => `프로젝트 ${project}을(를) 만들었습니다`,
788
936
  projectUpdated: (fields, project) => `프로젝트 ${project}의 ${fields}을(를) 바꿨습니다`,
789
937
  memberAdded: (login, project, role) =>
@@ -823,11 +971,12 @@ export const ko: Messages = {
823
971
  fileAttached: (label, page) => `${page}에 ${label}을(를) 첨부했습니다`,
824
972
  pluginEnabled: (plugin) => `플러그인 ${plugin}을(를) 활성화했습니다`,
825
973
  pluginDisabled: (plugin) => `플러그인 ${plugin}을(를) 비활성화했습니다`,
974
+ pluginConsented: (plugin) => `플러그인 ${plugin}의 권한을 바꿨습니다`,
826
975
  pluginConfigured: (fields, plugin) => `플러그인 ${plugin}의 ${fields}을(를) 바꿨습니다`,
827
976
  pluginGranted: (role, who, plugin) =>
828
- `${who}에게 플러그인 ${plugin}의 ${role} 역할을 주었습니다`,
977
+ `${who}에게 플러그인 ${plugin}의 ${role} 역할을 부여했습니다`,
829
978
  pluginRevoked: (role, who, plugin) =>
830
- `${who}에게서 플러그인 ${plugin}의 ${role} 역할을 거두었습니다`,
979
+ `${who}에게서 플러그인 ${plugin}의 ${role} 역할을 제거했습니다`,
831
980
  pluginUpgraded: (plugin, version) => `플러그인 ${plugin}을(를) ${version}으로 올렸습니다`,
832
981
  pluginCommand: (command, plugin, outcome) =>
833
982
  `플러그인 ${plugin}의 ${command}을(를) 실행했습니다: ${outcome}`,
@@ -990,11 +1139,33 @@ export const ko: Messages = {
990
1139
  },
991
1140
  },
992
1141
 
1142
+ home: {
1143
+ edit: "화면 편집",
1144
+ hint: "끌어서 옮기세요. 크기는 오른쪽 위에서 고르고, ×로 화면에서 뺍니다.",
1145
+ done: "완료",
1146
+ add: "추가",
1147
+ remove: "화면에서 제거",
1148
+ size: "크기",
1149
+ sizes: {
1150
+ icon: "아이콘",
1151
+ small: "소형",
1152
+ medium: "중형",
1153
+ large: "대형",
1154
+ wide: "와이드",
1155
+ full: "전체",
1156
+ },
1157
+ },
1158
+
993
1159
  people: {
994
1160
  title: "사람들",
995
1161
  list: "사람들",
996
1162
  narrowed: "같은 프로젝트에 속한 사람들과 관리자입니다.",
997
1163
  roleOf: (name) => `${name}의 역할`,
1164
+ role: "역할",
1165
+ manager: "매니저",
1166
+ managerOf: (name) => `${name}의 매니저`,
1167
+ team: "팀원",
1168
+ nobody: "없음",
998
1169
  letIn: "사람 추가",
999
1170
  letInAria: "사람 추가",
1000
1171
  notSignedIn: "추가됨, 아직 로그인하지 않음",
package/src/index.ts CHANGED
@@ -82,6 +82,12 @@ export {
82
82
  type GoalViewProps,
83
83
  goalMonth,
84
84
  } from "./components/goals.js";
85
+ export {
86
+ HomeGrid,
87
+ type HomeGridProps,
88
+ ProjectTile,
89
+ type ProjectTileProps,
90
+ } from "./components/home.js";
85
91
  export { Markdown, type MarkdownProps } from "./components/markdown.js";
86
92
  export { MyDecisions, type MyDecisionsProps } from "./components/my-decisions.js";
87
93
  export {
@@ -135,8 +141,6 @@ export {
135
141
  BridgeRefusal,
136
142
  PluginFrame,
137
143
  type PluginFrameProps,
138
- PluginWidgets,
139
- type PluginWidgetsProps,
140
144
  performBridgeCall,
141
145
  readTheme,
142
146
  } from "./components/plugin-frame.js";
@@ -149,8 +153,6 @@ export {
149
153
  PROJECT_ROLE_LABELS,
150
154
  ProjectForm,
151
155
  type ProjectFormProps,
152
- ProjectList,
153
- type ProjectListProps,
154
156
  ProjectMark,
155
157
  ProjectRoleBadge,
156
158
  VISIBILITY_LABELS,
@@ -326,4 +328,4 @@ export {
326
328
  workHref,
327
329
  } from "./router.js";
328
330
  export { CONSOLE_TOKENS } from "./tokens.js";
329
- export { errorWords, useAction } from "./use-action.js";
331
+ export { errorWords, useAction, wordsForFailure } from "./use-action.js";
package/src/limits.ts CHANGED
@@ -11,6 +11,12 @@ export const MAX_BODY_LENGTH = 20_000;
11
11
  export const MAX_LINKS = 20;
12
12
  /** How many people may be at work on one task at a time (ADR-0037): a crew, not a mailing list. */
13
13
  export const MAX_WORKERS = 20;
14
+ /** How many people one decision may be addressed to (ADR-0057): the approvers of a team, any of whom may answer. */
15
+ export const MAX_DECIDERS = 10;
16
+ /** How many tiles a person keeps at a width of their front page, and how many they took off it (ADR-0061). */
17
+ export const MAX_HOME_TILES = 200;
18
+ /** How far down the front page a tile may stand, in rows. */
19
+ export const MAX_HOME_ROW = 1000;
14
20
  export const MAX_LINK_LABEL_LENGTH = 120;
15
21
  export const MAX_URL_LENGTH = 2048;
16
22
  /** The options of a decision, and how a person words each. */