dsh-live-teams 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/LICENSE +176 -0
  2. package/NOTICE +11 -0
  3. package/README.md +85 -0
  4. package/cordis.patch.yml +25 -0
  5. package/lib/binding.d.ts +18 -0
  6. package/lib/binding.js +42 -0
  7. package/lib/changed-paths.d.ts +26 -0
  8. package/lib/changed-paths.js +69 -0
  9. package/lib/client.js +6753 -0
  10. package/lib/command-queue.d.ts +60 -0
  11. package/lib/command-queue.js +185 -0
  12. package/lib/compatibility.js +109 -0
  13. package/lib/context-provider.d.ts +110 -0
  14. package/lib/context-provider.js +249 -0
  15. package/lib/dispatch.d.ts +174 -0
  16. package/lib/dispatch.js +624 -0
  17. package/lib/errors.d.ts +36 -0
  18. package/lib/errors.js +103 -0
  19. package/lib/git-artifacts.d.ts +50 -0
  20. package/lib/git-artifacts.js +242 -0
  21. package/lib/index.d.ts +14 -0
  22. package/lib/index.js +14 -0
  23. package/lib/mailbox.d.ts +274 -0
  24. package/lib/mailbox.js +721 -0
  25. package/lib/member-tools.d.ts +57 -0
  26. package/lib/member-tools.js +1265 -0
  27. package/lib/migrations.d.ts +17 -0
  28. package/lib/migrations.js +47 -0
  29. package/lib/plugin.d.ts +106 -0
  30. package/lib/plugin.js +1003 -0
  31. package/lib/roles.d.ts +35 -0
  32. package/lib/roles.js +284 -0
  33. package/lib/routes.d.ts +586 -0
  34. package/lib/routes.js +2816 -0
  35. package/lib/scope.d.ts +62 -0
  36. package/lib/scope.js +133 -0
  37. package/lib/session-bridge.d.ts +76 -0
  38. package/lib/session-bridge.js +147 -0
  39. package/lib/session-title.js +35 -0
  40. package/lib/storage.d.ts +9 -0
  41. package/lib/storage.js +65 -0
  42. package/lib/task-store.d.ts +729 -0
  43. package/lib/task-store.js +2205 -0
  44. package/lib/team-store.d.ts +216 -0
  45. package/lib/team-store.js +765 -0
  46. package/lib/tree-snapshot.d.ts +28 -0
  47. package/lib/tree-snapshot.js +80 -0
  48. package/lib/types/client/TeamView.d.ts +26 -0
  49. package/lib/types/client/TeamView.dom.test.d.ts +1 -0
  50. package/lib/types/client/api.d.ts +522 -0
  51. package/lib/types/client/api.test.d.ts +1 -0
  52. package/lib/types/client/attention.d.ts +65 -0
  53. package/lib/types/client/attention.test.d.ts +1 -0
  54. package/lib/types/client/index.d.ts +31 -0
  55. package/lib/types/client/locales.d.ts +577 -0
  56. package/lib/types/client/member-name.d.ts +14 -0
  57. package/lib/types/client/member-name.test.d.ts +1 -0
  58. package/lib/types/client/roster.d.ts +26 -0
  59. package/lib/types/client/roster.test.d.ts +1 -0
  60. package/lib/types/client/styles.d.ts +3 -0
  61. package/package.json +104 -0
  62. package/roles/builder.md +40 -0
  63. package/roles/delegate.md +36 -0
  64. package/roles/lead.md +46 -0
  65. package/roles/oracle.md +36 -0
  66. package/roles/researcher.md +37 -0
  67. package/roles/reviewer.md +45 -0
  68. package/roles/scout.md +36 -0
  69. package/roles/verifier.md +36 -0
@@ -0,0 +1,577 @@
1
+ export declare const NS = "dsh-live-teams";
2
+ declare const en: {
3
+ readonly tab: "Team";
4
+ readonly title: "Workspace team";
5
+ readonly briefing: "Briefing";
6
+ readonly briefingHint: "The lead maintains the team operating order.";
7
+ readonly briefingEmpty: "No briefing; built-in order applies.";
8
+ readonly openBriefing: "Open file";
9
+ readonly briefingOpened: "Briefing file opened";
10
+ readonly openBriefingFailed: "Unable to open briefing file";
11
+ readonly lead: "Lead";
12
+ readonly leadUnset: "Not set";
13
+ readonly leadLoadFailed: "Could not read the team lead; reopen the tab.";
14
+ readonly leadUpdated: "Lead updated";
15
+ readonly note: "Note";
16
+ readonly noNote: "No note";
17
+ readonly headerCaption: "Live roster and availability at a glance";
18
+ readonly journalTitle: "Activity journal";
19
+ readonly journalCaption: "Recent team activity";
20
+ readonly journalEmpty: "No activity yet";
21
+ readonly journalFilters: "Activity filters";
22
+ readonly journalFilterMessage: "Messages";
23
+ readonly journalFilterDelivery: "Delivery";
24
+ readonly journalFilterTask: "Tasks";
25
+ readonly journalFilterReview: "Reviews";
26
+ readonly journalFilterContact: "Contacts";
27
+ readonly journalFilterTeam: "Team";
28
+ readonly journalFilterMember: "Members";
29
+ readonly journalFilterOther: "Other";
30
+ readonly journalRound: "Round";
31
+ readonly rolesCount: "roles";
32
+ readonly summaryTitle: "Team overview";
33
+ readonly summaryCaption: "Current snapshot";
34
+ readonly totalMembers: "Members";
35
+ readonly liveMembers: "Live";
36
+ readonly pausedMembers: "Paused";
37
+ readonly unboundMembers: "Unbound";
38
+ readonly activeTasks: "Active";
39
+ readonly awaitingLead: "Awaiting lead";
40
+ readonly membersTitle: "Members";
41
+ readonly members: "Members";
42
+ readonly membersCaption: "Manage roles and availability";
43
+ readonly addMember: "Add member";
44
+ readonly addMemberTitle: "Add team member";
45
+ readonly addMemberDescription: "Pick a Session of this workspace or create a new one, then assign its role.";
46
+ readonly candidatesEmpty: "No listed Session is free to join in this workspace";
47
+ readonly workspaceNotRegistered: "This folder is not a DSH workspace yet. Add it as a workspace in DSH first.";
48
+ readonly candidateSession: "Session";
49
+ readonly candidateState: "State";
50
+ readonly candidateNewSession: "New session";
51
+ readonly candidateNewSessionHint: "Creates a Session in this workspace and titles it after the member. DSH lists it once it has activity.";
52
+ readonly createMember: "Create member";
53
+ readonly memberCreated: "Member added";
54
+ readonly addMemberFailed: "Unable to add team member";
55
+ readonly addMemberSessionMissing: "That Session no longer exists. Reopen the dialog to list the current Sessions.";
56
+ readonly addMemberSessionElsewhere: "That Session works in another folder, so it cannot join this team.";
57
+ readonly addMemberAlreadyMember: "That Session is already a member, or the request was rejected as invalid.";
58
+ readonly addMemberUnknownRole: "That role is not in the registry. Reopen the dialog and pick a listed role.";
59
+ readonly stateUnavailable: "The team state is unavailable right now. Try again in a moment.";
60
+ readonly refresh: "Refresh";
61
+ readonly teamOffTitle: "Team mode is off for this workspace";
62
+ readonly teamOffHint: "Turn it on to create a team here, name it, and add members from Sessions in this workspace.";
63
+ readonly existingTeamHint: "This workspace already has a team:";
64
+ readonly adoptTeam: "Enable this team";
65
+ readonly createNewTeam: "Create a new empty team";
66
+ readonly candidateUnusable: "unusable";
67
+ readonly existingTeamFound: "An existing team was found; choose it or create a new team.";
68
+ readonly teamAdopted: "Team adopted";
69
+ readonly teamNameLabel: "Team name";
70
+ readonly enableTeam: "Enable team mode";
71
+ readonly teamEnabled: "Team mode is on";
72
+ readonly disableTeam: "Disable team mode";
73
+ readonly disableTeamTitle: "Disable team mode";
74
+ readonly disableTeamDescription: "This team will be switched off for this workspace.";
75
+ readonly disableTeamKeeps: "Members, roles and the audit are kept, and switching it back on restores them.";
76
+ readonly teamDisabled: "Team mode is off";
77
+ readonly compatibilityIncompatible: "This DSH is not compatible with the team plugin";
78
+ readonly compatibilityDegraded: "The team runs without some host surfaces";
79
+ readonly teamRenamed: "Team renamed";
80
+ readonly teamActionFailed: "Unable to change the team";
81
+ readonly renameTeam: "Rename team";
82
+ readonly loading: "Loading team…";
83
+ readonly unavailable: "Team state unavailable";
84
+ readonly empty: "The team has no members";
85
+ readonly name: "Name";
86
+ readonly editName: "Edit member name";
87
+ readonly save: "Save";
88
+ readonly cancel: "Cancel";
89
+ readonly nameRequired: "Enter a name before saving";
90
+ readonly role: "Role";
91
+ readonly availability: "Availability";
92
+ readonly available: "Available";
93
+ readonly pausedState: "Paused";
94
+ readonly binding: "Session";
95
+ readonly state: "State";
96
+ readonly bound: "Bound";
97
+ readonly unbound: "Unbound";
98
+ readonly live: "Live";
99
+ readonly notLive: "Not live";
100
+ readonly idle: "Idle";
101
+ readonly running: "Running";
102
+ readonly unknown: "Unknown";
103
+ readonly loadFailed: "Unable to load team state";
104
+ readonly apply: "Apply";
105
+ readonly pause: "Pause";
106
+ readonly resume: "Resume";
107
+ readonly teamChanged: "The team changed; current state is shown";
108
+ readonly mutationFailed: "Unable to change team member";
109
+ readonly openSession: "Open this member's Session";
110
+ readonly openSessionAction: "Open Session";
111
+ readonly roster: "Team roster";
112
+ readonly attention: "Team attention";
113
+ readonly attentionWaiting: "is waiting for you — open their Session";
114
+ readonly permittedContacts: "Permitted contacts";
115
+ readonly contactGrantLeadOnly: "Only the lead can change peer access.";
116
+ readonly noPeerContact: "Contact with colleagues is not allowed";
117
+ readonly chooseContact: "Choose a contact";
118
+ readonly grant: "Allow";
119
+ readonly revoke: "Remove access";
120
+ readonly grantFailed: "Unable to update contact permission";
121
+ readonly roles: "Roles";
122
+ readonly rolesCaption: "Shipped roles and workspace customizations";
123
+ readonly chooseRole: "Choose a role";
124
+ readonly unknownRole: "unavailable";
125
+ readonly openGlobalRoles: "Open global roles folder";
126
+ readonly openWorkspaceRoles: "Open workspace roles folder";
127
+ readonly customizeRole: "Customize in this workspace";
128
+ readonly openRoleFile: "Open file";
129
+ readonly roleGlobal: "global";
130
+ readonly roleCustomized: "customized in this workspace";
131
+ readonly rolesOpened: "Roles location opened";
132
+ readonly openRolesFailed: "Unable to open roles location";
133
+ readonly roleOverridden: "Role copied into this workspace";
134
+ readonly roleAlreadyOverridden: "Role is already customized";
135
+ readonly overrideFailed: "Unable to customize role";
136
+ readonly removeMember: "Remove from team";
137
+ readonly removeMemberTitle: "Remove team member";
138
+ readonly removeMemberDescription: "This member will leave the team.";
139
+ readonly sessionContinues: "Their Session keeps running and is not interrupted.";
140
+ readonly auditRecorded: "This change is recorded in the team audit.";
141
+ readonly removeMemberConfirm: "Remove from team";
142
+ readonly memberRemoved: "Member removed from team";
143
+ readonly interruptTurn: "Interrupt turn";
144
+ readonly interruptTurnTitle: "Interrupt the current turn?";
145
+ readonly interruptTurnDescription: "The turn stops. Availability, membership and the Session itself are unchanged.";
146
+ readonly interruptTurnKeeps: "This only stops the current turn; it does not change availability or team membership.";
147
+ readonly turnInterrupted: "Turn interrupted";
148
+ readonly noRunningTurn: "Nothing to interrupt: this member is not running a turn right now";
149
+ readonly interruptFailed: "Unable to interrupt turn";
150
+ readonly messagesTitle: "Messages";
151
+ readonly messagesShow: "Show";
152
+ readonly unread: "unread";
153
+ readonly messagesCaption: "Send a distinct message, direction or comment and review your inbox.";
154
+ readonly messageRecipient: "Recipient";
155
+ readonly chooseRecipient: "Choose a recipient";
156
+ readonly wholeTeam: "Entire team";
157
+ readonly messageKind: "Kind";
158
+ readonly chooseMessageKind: "Choose what this does";
159
+ readonly messageKindMessage: "Message";
160
+ readonly messageKindMessageHint: "starts or queues a turn";
161
+ readonly messageKindDirection: "Direction";
162
+ readonly messageKindDirectionHint: "steers at a safe boundary, otherwise queues";
163
+ readonly messageKindComment: "Comment";
164
+ readonly messageKindCommentHint: "stored for later context; wakes nobody";
165
+ readonly messageContent: "Content";
166
+ readonly sendMessage: "Send";
167
+ readonly messageSent: "Message sent";
168
+ readonly messageSendFailed: "Unable to send message";
169
+ readonly messageDeliveryFailed: "Delivery failed";
170
+ readonly messageAcknowledgeFailed: "Unable to acknowledge message";
171
+ readonly inboxEmpty: "Your inbox is empty";
172
+ readonly tasksTitle: "Tasks";
173
+ readonly taskFilters: "Task filters";
174
+ readonly tasksFilteractive: "Active";
175
+ readonly tasksFilterwaiting: "Waiting";
176
+ readonly tasksFilterarchived: "Archived";
177
+ readonly taskStatusdraft: "Draft";
178
+ readonly taskStatusready: "Ready";
179
+ readonly taskStatusclaimed: "Claimed";
180
+ readonly taskStatusin_progress: "In progress";
181
+ readonly taskStatuswaiting: "Waiting";
182
+ readonly taskStatusneeds_human: "Needs human";
183
+ readonly taskStatuscompleted: "Completed";
184
+ readonly taskStatusfailed: "Failed";
185
+ readonly taskStatuscancelled: "Cancelled";
186
+ readonly tasksEmpty: "No tasks in this view";
187
+ readonly tasksLoadFailed: "Unable to load tasks";
188
+ readonly taskLoadFailed: "Unable to load task";
189
+ readonly taskActionFailed: "Unable to change task";
190
+ readonly taskAssignee: "Assignee";
191
+ readonly taskBlocked: "Blocked";
192
+ readonly taskBlockedBy: "Blocked by";
193
+ readonly dispatchPause: "Pause dispatch";
194
+ readonly dispatchResume: "Resume dispatch";
195
+ readonly dispatchPaused: "Automatic dispatch is paused";
196
+ readonly dispatchPausedBy: "Paused by";
197
+ readonly dispatchActionFailed: "Unable to change dispatch";
198
+ readonly taskQueuedMemberPaused: "Queued · member paused";
199
+ readonly taskQueuedMemberBusy: "Queued · member busy";
200
+ readonly taskQueuedNoSession: "Queued · no session";
201
+ readonly taskQueuedRevoking: "Revocation in flight";
202
+ readonly taskQueuedDeparted: "Assignee has left";
203
+ readonly taskQueuedCoding: "Code · manual dispatch";
204
+ readonly taskQueuedNoPaths: "Paths · not declared";
205
+ readonly taskQueuedPathsOverlap: "Paths · overlap";
206
+ readonly taskQueuedPathsShared: "Paths · shared file";
207
+ readonly taskAttempts: "Attempts";
208
+ readonly taskNoAttempts: "No attempts yet";
209
+ readonly attemptStatusactive: "active";
210
+ readonly attemptStatusrevoking: "revoking";
211
+ readonly attemptStatusrevoked: "revoked";
212
+ readonly attemptStatuscompleted: "completed";
213
+ readonly attemptStatusfailed: "failed";
214
+ readonly attemptHumanIntervened: "a human wrote into this session directly";
215
+ readonly taskIntervened: "human intervened";
216
+ readonly taskTitleLabel: "Title";
217
+ readonly journalBody: "What was sent";
218
+ readonly journalTask: "The task";
219
+ readonly copy: "Copy";
220
+ readonly copied: "Copied";
221
+ readonly markdownFootnotes: "Footnotes";
222
+ readonly journalRaw: "Raw";
223
+ readonly journalRendered: "Rendered";
224
+ readonly taskKindimplementation: "Implementation";
225
+ readonly taskKindresearch: "Research";
226
+ readonly taskKindrequirements: "Requirements";
227
+ readonly taskKindverification: "Verification";
228
+ readonly taskKindrepair: "Repair";
229
+ readonly taskKindintegration: "Integration";
230
+ readonly taskKindwork: "Work";
231
+ readonly taskNew: "New task";
232
+ readonly taskEditContract: "Edit contract";
233
+ readonly taskEditTitle: "Change the contract";
234
+ readonly taskNewTitle: "Create a task";
235
+ readonly taskDraftDescription: "The task starts as soon as its assignee is free. Declared paths are the write contract: two writers may run together only when their paths do not intersect.";
236
+ readonly taskKind: "Kind";
237
+ readonly taskRoute: "Route";
238
+ readonly taskRouteReport: "Report to the human";
239
+ readonly taskRouteReview: "Review by a member";
240
+ readonly taskReviewer: "Reviewer";
241
+ readonly taskPaths: "Declared paths (comma separated)";
242
+ readonly taskAcceptanceLabel: "Acceptance, one per line";
243
+ readonly taskChecksLabel: "Checks, one per line";
244
+ readonly taskBodyLabel: "Task document";
245
+ readonly taskSave: "Save";
246
+ readonly taskSaved: "Task saved.";
247
+ readonly taskRelease: "Release attempt";
248
+ readonly taskReleaseTitle: "Release the attempt?";
249
+ readonly taskReleaseDescription: "The attempt is revoked, the task returns to the assignee and the dispatcher may start it again. Work already written to the tree stays.";
250
+ readonly taskReleaseReason: "Why";
251
+ readonly taskReleased: "Attempt released.";
252
+ readonly taskStalled: "silent";
253
+ readonly taskStalledUnacknowledged: "never acknowledged the assignment";
254
+ readonly taskStalledIdle: "idle with nothing submitted";
255
+ readonly taskQueuedIntervened: "Human · change unrecorded";
256
+ readonly taskAcceptance: "Acceptance";
257
+ readonly taskDocument: "Document";
258
+ readonly taskDocumentMissing: "Document is missing; the task remains available for revision.";
259
+ readonly taskSubmissions: "Submissions";
260
+ readonly scopeClean: "Scope · clean";
261
+ readonly scopeViolation: "Scope · outside the declaration";
262
+ readonly scopeSharedTree: "Scope · shared tree moved";
263
+ readonly scopeUnchecked: "Scope · unchecked";
264
+ readonly scopeUnexpected: "changed outside the declaration";
265
+ readonly scopeSharedTreeNote: "another active task declared that area";
266
+ readonly scopeDeclared: "declared";
267
+ readonly scopeModeGit: "observed via git";
268
+ readonly scopeModeFiles: "observed via file fingerprints";
269
+ readonly scopeReasonNoRepository: "no version control: the declaration could not be checked";
270
+ readonly scopeReasonTooManyFiles: "the folder is too large to watch";
271
+ readonly scopeReasonNoSnapshot: "no fingerprint was taken when the work started";
272
+ readonly scopeReasonUnreadable: "the workspace could not be read";
273
+ readonly taskNoSubmissions: "No submissions";
274
+ readonly taskReviewRounds: "Review rounds";
275
+ readonly taskNoRounds: "No review rounds";
276
+ readonly taskAccept: "Accept";
277
+ readonly taskRevise: "Revise";
278
+ readonly taskAcceptTitle: "Accept this task?";
279
+ readonly taskReviseTitle: "Revise this task?";
280
+ readonly taskAcceptDescription: "This completes the task, archives its document, completes the attempt and sends a closing message.";
281
+ readonly taskReviseDescription: "This returns the task to in progress and sends instructions to the assignee.";
282
+ readonly taskAcceptNote: "Optional note";
283
+ readonly taskReviseInstructions: "Instructions";
284
+ readonly acknowledge: "Acknowledge";
285
+ readonly acknowledged: "Acknowledged";
286
+ };
287
+ export declare const dictionaries: {
288
+ readonly en: {
289
+ readonly tab: "Team";
290
+ readonly title: "Workspace team";
291
+ readonly briefing: "Briefing";
292
+ readonly briefingHint: "The lead maintains the team operating order.";
293
+ readonly briefingEmpty: "No briefing; built-in order applies.";
294
+ readonly openBriefing: "Open file";
295
+ readonly briefingOpened: "Briefing file opened";
296
+ readonly openBriefingFailed: "Unable to open briefing file";
297
+ readonly lead: "Lead";
298
+ readonly leadUnset: "Not set";
299
+ readonly leadLoadFailed: "Could not read the team lead; reopen the tab.";
300
+ readonly leadUpdated: "Lead updated";
301
+ readonly note: "Note";
302
+ readonly noNote: "No note";
303
+ readonly headerCaption: "Live roster and availability at a glance";
304
+ readonly journalTitle: "Activity journal";
305
+ readonly journalCaption: "Recent team activity";
306
+ readonly journalEmpty: "No activity yet";
307
+ readonly journalFilters: "Activity filters";
308
+ readonly journalFilterMessage: "Messages";
309
+ readonly journalFilterDelivery: "Delivery";
310
+ readonly journalFilterTask: "Tasks";
311
+ readonly journalFilterReview: "Reviews";
312
+ readonly journalFilterContact: "Contacts";
313
+ readonly journalFilterTeam: "Team";
314
+ readonly journalFilterMember: "Members";
315
+ readonly journalFilterOther: "Other";
316
+ readonly journalRound: "Round";
317
+ readonly rolesCount: "roles";
318
+ readonly summaryTitle: "Team overview";
319
+ readonly summaryCaption: "Current snapshot";
320
+ readonly totalMembers: "Members";
321
+ readonly liveMembers: "Live";
322
+ readonly pausedMembers: "Paused";
323
+ readonly unboundMembers: "Unbound";
324
+ readonly activeTasks: "Active";
325
+ readonly awaitingLead: "Awaiting lead";
326
+ readonly membersTitle: "Members";
327
+ readonly members: "Members";
328
+ readonly membersCaption: "Manage roles and availability";
329
+ readonly addMember: "Add member";
330
+ readonly addMemberTitle: "Add team member";
331
+ readonly addMemberDescription: "Pick a Session of this workspace or create a new one, then assign its role.";
332
+ readonly candidatesEmpty: "No listed Session is free to join in this workspace";
333
+ readonly workspaceNotRegistered: "This folder is not a DSH workspace yet. Add it as a workspace in DSH first.";
334
+ readonly candidateSession: "Session";
335
+ readonly candidateState: "State";
336
+ readonly candidateNewSession: "New session";
337
+ readonly candidateNewSessionHint: "Creates a Session in this workspace and titles it after the member. DSH lists it once it has activity.";
338
+ readonly createMember: "Create member";
339
+ readonly memberCreated: "Member added";
340
+ readonly addMemberFailed: "Unable to add team member";
341
+ readonly addMemberSessionMissing: "That Session no longer exists. Reopen the dialog to list the current Sessions.";
342
+ readonly addMemberSessionElsewhere: "That Session works in another folder, so it cannot join this team.";
343
+ readonly addMemberAlreadyMember: "That Session is already a member, or the request was rejected as invalid.";
344
+ readonly addMemberUnknownRole: "That role is not in the registry. Reopen the dialog and pick a listed role.";
345
+ readonly stateUnavailable: "The team state is unavailable right now. Try again in a moment.";
346
+ readonly refresh: "Refresh";
347
+ readonly teamOffTitle: "Team mode is off for this workspace";
348
+ readonly teamOffHint: "Turn it on to create a team here, name it, and add members from Sessions in this workspace.";
349
+ readonly existingTeamHint: "This workspace already has a team:";
350
+ readonly adoptTeam: "Enable this team";
351
+ readonly createNewTeam: "Create a new empty team";
352
+ readonly candidateUnusable: "unusable";
353
+ readonly existingTeamFound: "An existing team was found; choose it or create a new team.";
354
+ readonly teamAdopted: "Team adopted";
355
+ readonly teamNameLabel: "Team name";
356
+ readonly enableTeam: "Enable team mode";
357
+ readonly teamEnabled: "Team mode is on";
358
+ readonly disableTeam: "Disable team mode";
359
+ readonly disableTeamTitle: "Disable team mode";
360
+ readonly disableTeamDescription: "This team will be switched off for this workspace.";
361
+ readonly disableTeamKeeps: "Members, roles and the audit are kept, and switching it back on restores them.";
362
+ readonly teamDisabled: "Team mode is off";
363
+ readonly compatibilityIncompatible: "This DSH is not compatible with the team plugin";
364
+ readonly compatibilityDegraded: "The team runs without some host surfaces";
365
+ readonly teamRenamed: "Team renamed";
366
+ readonly teamActionFailed: "Unable to change the team";
367
+ readonly renameTeam: "Rename team";
368
+ readonly loading: "Loading team…";
369
+ readonly unavailable: "Team state unavailable";
370
+ readonly empty: "The team has no members";
371
+ readonly name: "Name";
372
+ readonly editName: "Edit member name";
373
+ readonly save: "Save";
374
+ readonly cancel: "Cancel";
375
+ readonly nameRequired: "Enter a name before saving";
376
+ readonly role: "Role";
377
+ readonly availability: "Availability";
378
+ readonly available: "Available";
379
+ readonly pausedState: "Paused";
380
+ readonly binding: "Session";
381
+ readonly state: "State";
382
+ readonly bound: "Bound";
383
+ readonly unbound: "Unbound";
384
+ readonly live: "Live";
385
+ readonly notLive: "Not live";
386
+ readonly idle: "Idle";
387
+ readonly running: "Running";
388
+ readonly unknown: "Unknown";
389
+ readonly loadFailed: "Unable to load team state";
390
+ readonly apply: "Apply";
391
+ readonly pause: "Pause";
392
+ readonly resume: "Resume";
393
+ readonly teamChanged: "The team changed; current state is shown";
394
+ readonly mutationFailed: "Unable to change team member";
395
+ readonly openSession: "Open this member's Session";
396
+ readonly openSessionAction: "Open Session";
397
+ readonly roster: "Team roster";
398
+ readonly attention: "Team attention";
399
+ readonly attentionWaiting: "is waiting for you — open their Session";
400
+ readonly permittedContacts: "Permitted contacts";
401
+ readonly contactGrantLeadOnly: "Only the lead can change peer access.";
402
+ readonly noPeerContact: "Contact with colleagues is not allowed";
403
+ readonly chooseContact: "Choose a contact";
404
+ readonly grant: "Allow";
405
+ readonly revoke: "Remove access";
406
+ readonly grantFailed: "Unable to update contact permission";
407
+ readonly roles: "Roles";
408
+ readonly rolesCaption: "Shipped roles and workspace customizations";
409
+ readonly chooseRole: "Choose a role";
410
+ readonly unknownRole: "unavailable";
411
+ readonly openGlobalRoles: "Open global roles folder";
412
+ readonly openWorkspaceRoles: "Open workspace roles folder";
413
+ readonly customizeRole: "Customize in this workspace";
414
+ readonly openRoleFile: "Open file";
415
+ readonly roleGlobal: "global";
416
+ readonly roleCustomized: "customized in this workspace";
417
+ readonly rolesOpened: "Roles location opened";
418
+ readonly openRolesFailed: "Unable to open roles location";
419
+ readonly roleOverridden: "Role copied into this workspace";
420
+ readonly roleAlreadyOverridden: "Role is already customized";
421
+ readonly overrideFailed: "Unable to customize role";
422
+ readonly removeMember: "Remove from team";
423
+ readonly removeMemberTitle: "Remove team member";
424
+ readonly removeMemberDescription: "This member will leave the team.";
425
+ readonly sessionContinues: "Their Session keeps running and is not interrupted.";
426
+ readonly auditRecorded: "This change is recorded in the team audit.";
427
+ readonly removeMemberConfirm: "Remove from team";
428
+ readonly memberRemoved: "Member removed from team";
429
+ readonly interruptTurn: "Interrupt turn";
430
+ readonly interruptTurnTitle: "Interrupt the current turn?";
431
+ readonly interruptTurnDescription: "The turn stops. Availability, membership and the Session itself are unchanged.";
432
+ readonly interruptTurnKeeps: "This only stops the current turn; it does not change availability or team membership.";
433
+ readonly turnInterrupted: "Turn interrupted";
434
+ readonly noRunningTurn: "Nothing to interrupt: this member is not running a turn right now";
435
+ readonly interruptFailed: "Unable to interrupt turn";
436
+ readonly messagesTitle: "Messages";
437
+ readonly messagesShow: "Show";
438
+ readonly unread: "unread";
439
+ readonly messagesCaption: "Send a distinct message, direction or comment and review your inbox.";
440
+ readonly messageRecipient: "Recipient";
441
+ readonly chooseRecipient: "Choose a recipient";
442
+ readonly wholeTeam: "Entire team";
443
+ readonly messageKind: "Kind";
444
+ readonly chooseMessageKind: "Choose what this does";
445
+ readonly messageKindMessage: "Message";
446
+ readonly messageKindMessageHint: "starts or queues a turn";
447
+ readonly messageKindDirection: "Direction";
448
+ readonly messageKindDirectionHint: "steers at a safe boundary, otherwise queues";
449
+ readonly messageKindComment: "Comment";
450
+ readonly messageKindCommentHint: "stored for later context; wakes nobody";
451
+ readonly messageContent: "Content";
452
+ readonly sendMessage: "Send";
453
+ readonly messageSent: "Message sent";
454
+ readonly messageSendFailed: "Unable to send message";
455
+ readonly messageDeliveryFailed: "Delivery failed";
456
+ readonly messageAcknowledgeFailed: "Unable to acknowledge message";
457
+ readonly inboxEmpty: "Your inbox is empty";
458
+ readonly tasksTitle: "Tasks";
459
+ readonly taskFilters: "Task filters";
460
+ readonly tasksFilteractive: "Active";
461
+ readonly tasksFilterwaiting: "Waiting";
462
+ readonly tasksFilterarchived: "Archived";
463
+ readonly taskStatusdraft: "Draft";
464
+ readonly taskStatusready: "Ready";
465
+ readonly taskStatusclaimed: "Claimed";
466
+ readonly taskStatusin_progress: "In progress";
467
+ readonly taskStatuswaiting: "Waiting";
468
+ readonly taskStatusneeds_human: "Needs human";
469
+ readonly taskStatuscompleted: "Completed";
470
+ readonly taskStatusfailed: "Failed";
471
+ readonly taskStatuscancelled: "Cancelled";
472
+ readonly tasksEmpty: "No tasks in this view";
473
+ readonly tasksLoadFailed: "Unable to load tasks";
474
+ readonly taskLoadFailed: "Unable to load task";
475
+ readonly taskActionFailed: "Unable to change task";
476
+ readonly taskAssignee: "Assignee";
477
+ readonly taskBlocked: "Blocked";
478
+ readonly taskBlockedBy: "Blocked by";
479
+ readonly dispatchPause: "Pause dispatch";
480
+ readonly dispatchResume: "Resume dispatch";
481
+ readonly dispatchPaused: "Automatic dispatch is paused";
482
+ readonly dispatchPausedBy: "Paused by";
483
+ readonly dispatchActionFailed: "Unable to change dispatch";
484
+ readonly taskQueuedMemberPaused: "Queued · member paused";
485
+ readonly taskQueuedMemberBusy: "Queued · member busy";
486
+ readonly taskQueuedNoSession: "Queued · no session";
487
+ readonly taskQueuedRevoking: "Revocation in flight";
488
+ readonly taskQueuedDeparted: "Assignee has left";
489
+ readonly taskQueuedCoding: "Code · manual dispatch";
490
+ readonly taskQueuedNoPaths: "Paths · not declared";
491
+ readonly taskQueuedPathsOverlap: "Paths · overlap";
492
+ readonly taskQueuedPathsShared: "Paths · shared file";
493
+ readonly taskAttempts: "Attempts";
494
+ readonly taskNoAttempts: "No attempts yet";
495
+ readonly attemptStatusactive: "active";
496
+ readonly attemptStatusrevoking: "revoking";
497
+ readonly attemptStatusrevoked: "revoked";
498
+ readonly attemptStatuscompleted: "completed";
499
+ readonly attemptStatusfailed: "failed";
500
+ readonly attemptHumanIntervened: "a human wrote into this session directly";
501
+ readonly taskIntervened: "human intervened";
502
+ readonly taskTitleLabel: "Title";
503
+ readonly journalBody: "What was sent";
504
+ readonly journalTask: "The task";
505
+ readonly copy: "Copy";
506
+ readonly copied: "Copied";
507
+ readonly markdownFootnotes: "Footnotes";
508
+ readonly journalRaw: "Raw";
509
+ readonly journalRendered: "Rendered";
510
+ readonly taskKindimplementation: "Implementation";
511
+ readonly taskKindresearch: "Research";
512
+ readonly taskKindrequirements: "Requirements";
513
+ readonly taskKindverification: "Verification";
514
+ readonly taskKindrepair: "Repair";
515
+ readonly taskKindintegration: "Integration";
516
+ readonly taskKindwork: "Work";
517
+ readonly taskNew: "New task";
518
+ readonly taskEditContract: "Edit contract";
519
+ readonly taskEditTitle: "Change the contract";
520
+ readonly taskNewTitle: "Create a task";
521
+ readonly taskDraftDescription: "The task starts as soon as its assignee is free. Declared paths are the write contract: two writers may run together only when their paths do not intersect.";
522
+ readonly taskKind: "Kind";
523
+ readonly taskRoute: "Route";
524
+ readonly taskRouteReport: "Report to the human";
525
+ readonly taskRouteReview: "Review by a member";
526
+ readonly taskReviewer: "Reviewer";
527
+ readonly taskPaths: "Declared paths (comma separated)";
528
+ readonly taskAcceptanceLabel: "Acceptance, one per line";
529
+ readonly taskChecksLabel: "Checks, one per line";
530
+ readonly taskBodyLabel: "Task document";
531
+ readonly taskSave: "Save";
532
+ readonly taskSaved: "Task saved.";
533
+ readonly taskRelease: "Release attempt";
534
+ readonly taskReleaseTitle: "Release the attempt?";
535
+ readonly taskReleaseDescription: "The attempt is revoked, the task returns to the assignee and the dispatcher may start it again. Work already written to the tree stays.";
536
+ readonly taskReleaseReason: "Why";
537
+ readonly taskReleased: "Attempt released.";
538
+ readonly taskStalled: "silent";
539
+ readonly taskStalledUnacknowledged: "never acknowledged the assignment";
540
+ readonly taskStalledIdle: "idle with nothing submitted";
541
+ readonly taskQueuedIntervened: "Human · change unrecorded";
542
+ readonly taskAcceptance: "Acceptance";
543
+ readonly taskDocument: "Document";
544
+ readonly taskDocumentMissing: "Document is missing; the task remains available for revision.";
545
+ readonly taskSubmissions: "Submissions";
546
+ readonly scopeClean: "Scope · clean";
547
+ readonly scopeViolation: "Scope · outside the declaration";
548
+ readonly scopeSharedTree: "Scope · shared tree moved";
549
+ readonly scopeUnchecked: "Scope · unchecked";
550
+ readonly scopeUnexpected: "changed outside the declaration";
551
+ readonly scopeSharedTreeNote: "another active task declared that area";
552
+ readonly scopeDeclared: "declared";
553
+ readonly scopeModeGit: "observed via git";
554
+ readonly scopeModeFiles: "observed via file fingerprints";
555
+ readonly scopeReasonNoRepository: "no version control: the declaration could not be checked";
556
+ readonly scopeReasonTooManyFiles: "the folder is too large to watch";
557
+ readonly scopeReasonNoSnapshot: "no fingerprint was taken when the work started";
558
+ readonly scopeReasonUnreadable: "the workspace could not be read";
559
+ readonly taskNoSubmissions: "No submissions";
560
+ readonly taskReviewRounds: "Review rounds";
561
+ readonly taskNoRounds: "No review rounds";
562
+ readonly taskAccept: "Accept";
563
+ readonly taskRevise: "Revise";
564
+ readonly taskAcceptTitle: "Accept this task?";
565
+ readonly taskReviseTitle: "Revise this task?";
566
+ readonly taskAcceptDescription: "This completes the task, archives its document, completes the attempt and sends a closing message.";
567
+ readonly taskReviseDescription: "This returns the task to in progress and sends instructions to the assignee.";
568
+ readonly taskAcceptNote: "Optional note";
569
+ readonly taskReviseInstructions: "Instructions";
570
+ readonly acknowledge: "Acknowledge";
571
+ readonly acknowledged: "Acknowledged";
572
+ };
573
+ readonly ru: Record<"idle" | "running" | "unknown" | "acknowledged" | "roles" | "role" | "availability" | "live" | "permittedContacts" | "note" | "title" | "name" | "briefing" | "state" | "attention" | "members" | "available" | "empty" | "unavailable" | "unread" | "tab" | "briefingHint" | "briefingEmpty" | "openBriefing" | "briefingOpened" | "openBriefingFailed" | "lead" | "leadUnset" | "leadLoadFailed" | "leadUpdated" | "noNote" | "headerCaption" | "journalTitle" | "journalCaption" | "journalEmpty" | "journalFilters" | "journalFilterMessage" | "journalFilterDelivery" | "journalFilterTask" | "journalFilterReview" | "journalFilterContact" | "journalFilterTeam" | "journalFilterMember" | "journalFilterOther" | "journalRound" | "rolesCount" | "summaryTitle" | "summaryCaption" | "totalMembers" | "liveMembers" | "pausedMembers" | "unboundMembers" | "activeTasks" | "awaitingLead" | "membersTitle" | "membersCaption" | "addMember" | "addMemberTitle" | "addMemberDescription" | "candidatesEmpty" | "workspaceNotRegistered" | "candidateSession" | "candidateState" | "candidateNewSession" | "candidateNewSessionHint" | "createMember" | "memberCreated" | "addMemberFailed" | "addMemberSessionMissing" | "addMemberSessionElsewhere" | "addMemberAlreadyMember" | "addMemberUnknownRole" | "stateUnavailable" | "refresh" | "teamOffTitle" | "teamOffHint" | "existingTeamHint" | "adoptTeam" | "createNewTeam" | "candidateUnusable" | "existingTeamFound" | "teamAdopted" | "teamNameLabel" | "enableTeam" | "teamEnabled" | "disableTeam" | "disableTeamTitle" | "disableTeamDescription" | "disableTeamKeeps" | "teamDisabled" | "compatibilityIncompatible" | "compatibilityDegraded" | "teamRenamed" | "teamActionFailed" | "renameTeam" | "loading" | "editName" | "save" | "cancel" | "nameRequired" | "pausedState" | "binding" | "bound" | "unbound" | "notLive" | "loadFailed" | "apply" | "pause" | "resume" | "teamChanged" | "mutationFailed" | "openSession" | "openSessionAction" | "roster" | "attentionWaiting" | "contactGrantLeadOnly" | "noPeerContact" | "chooseContact" | "grant" | "revoke" | "grantFailed" | "rolesCaption" | "chooseRole" | "unknownRole" | "openGlobalRoles" | "openWorkspaceRoles" | "customizeRole" | "openRoleFile" | "roleGlobal" | "roleCustomized" | "rolesOpened" | "openRolesFailed" | "roleOverridden" | "roleAlreadyOverridden" | "overrideFailed" | "removeMember" | "removeMemberTitle" | "removeMemberDescription" | "sessionContinues" | "auditRecorded" | "removeMemberConfirm" | "memberRemoved" | "interruptTurn" | "interruptTurnTitle" | "interruptTurnDescription" | "interruptTurnKeeps" | "turnInterrupted" | "noRunningTurn" | "interruptFailed" | "messagesTitle" | "messagesShow" | "messagesCaption" | "messageRecipient" | "chooseRecipient" | "wholeTeam" | "messageKind" | "chooseMessageKind" | "messageKindMessage" | "messageKindMessageHint" | "messageKindDirection" | "messageKindDirectionHint" | "messageKindComment" | "messageKindCommentHint" | "messageContent" | "sendMessage" | "messageSent" | "messageSendFailed" | "messageDeliveryFailed" | "messageAcknowledgeFailed" | "inboxEmpty" | "tasksTitle" | "taskFilters" | "tasksFilteractive" | "tasksFilterwaiting" | "tasksFilterarchived" | "taskStatusdraft" | "taskStatusready" | "taskStatusclaimed" | "taskStatusin_progress" | "taskStatuswaiting" | "taskStatusneeds_human" | "taskStatuscompleted" | "taskStatusfailed" | "taskStatuscancelled" | "tasksEmpty" | "tasksLoadFailed" | "taskLoadFailed" | "taskActionFailed" | "taskAssignee" | "taskBlocked" | "taskBlockedBy" | "dispatchPause" | "dispatchResume" | "dispatchPaused" | "dispatchPausedBy" | "dispatchActionFailed" | "taskQueuedMemberPaused" | "taskQueuedMemberBusy" | "taskQueuedNoSession" | "taskQueuedRevoking" | "taskQueuedDeparted" | "taskQueuedCoding" | "taskQueuedNoPaths" | "taskQueuedPathsOverlap" | "taskQueuedPathsShared" | "taskAttempts" | "taskNoAttempts" | "attemptStatusactive" | "attemptStatusrevoking" | "attemptStatusrevoked" | "attemptStatuscompleted" | "attemptStatusfailed" | "attemptHumanIntervened" | "taskIntervened" | "taskTitleLabel" | "journalBody" | "journalTask" | "copy" | "copied" | "markdownFootnotes" | "journalRaw" | "journalRendered" | "taskKindimplementation" | "taskKindresearch" | "taskKindrequirements" | "taskKindverification" | "taskKindrepair" | "taskKindintegration" | "taskKindwork" | "taskNew" | "taskEditContract" | "taskEditTitle" | "taskNewTitle" | "taskDraftDescription" | "taskKind" | "taskRoute" | "taskRouteReport" | "taskRouteReview" | "taskReviewer" | "taskPaths" | "taskAcceptanceLabel" | "taskChecksLabel" | "taskBodyLabel" | "taskSave" | "taskSaved" | "taskRelease" | "taskReleaseTitle" | "taskReleaseDescription" | "taskReleaseReason" | "taskReleased" | "taskStalled" | "taskStalledUnacknowledged" | "taskStalledIdle" | "taskQueuedIntervened" | "taskAcceptance" | "taskDocument" | "taskDocumentMissing" | "taskSubmissions" | "scopeClean" | "scopeViolation" | "scopeSharedTree" | "scopeUnchecked" | "scopeUnexpected" | "scopeSharedTreeNote" | "scopeDeclared" | "scopeModeGit" | "scopeModeFiles" | "scopeReasonNoRepository" | "scopeReasonTooManyFiles" | "scopeReasonNoSnapshot" | "scopeReasonUnreadable" | "taskNoSubmissions" | "taskReviewRounds" | "taskNoRounds" | "taskAccept" | "taskRevise" | "taskAcceptTitle" | "taskReviseTitle" | "taskAcceptDescription" | "taskReviseDescription" | "taskAcceptNote" | "taskReviseInstructions" | "acknowledge", string>;
574
+ };
575
+ export type LocaleKey = keyof typeof en;
576
+ export type Dictionary = Record<LocaleKey, string>;
577
+ export {};
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The inverse of the server's Session-title convention.
3
+ *
4
+ * A member named `Builder` owns a Session titled `Builder - B1 Check`
5
+ * (`sessionTitleFor` in `../session-title.ts`). The add-member dialog prefills
6
+ * the member name from the picked Session's title while the server re-derives
7
+ * the title from that name, so without this strip the two feed each other and
8
+ * every add appends the team name again — the live audit shows exactly that:
9
+ * `Builder - B1 Check` → `Builder-2 - B1 Check` → `Builder-2 - B1 Check - B1 Check`.
10
+ *
11
+ * Repeat stripping is deliberate: it also repairs names that already carry more
12
+ * than one team suffix.
13
+ */
14
+ export declare function memberNameFromTitle(title: string | null | undefined, teamName: string | null | undefined): string;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import type { TeamMember, TeamSnapshot } from './api.js';
3
+ import type { LocaleKey } from './locales.js';
4
+ import './styles.js';
5
+ export type RosterContext = {
6
+ readonly sessions: {
7
+ open(sessionId: string): void;
8
+ };
9
+ readonly t: (key: LocaleKey) => string;
10
+ };
11
+ export type RosterProps = {
12
+ readonly ctx?: RosterContext;
13
+ };
14
+ export declare function rosterIsVisible(snapshot: TeamSnapshot | null, sessions?: unknown): boolean;
15
+ export declare function liveMemberCount(snapshot: TeamSnapshot): number;
16
+ export declare function memberMarkerLabel(member: TeamMember, t: (key: LocaleKey) => string): string;
17
+ export declare function canOpenMember(member: TeamMember): boolean;
18
+ export declare function openMember(member: TeamMember, sessions: RosterContext['sessions']): void;
19
+ export type RosterRowProps = {
20
+ readonly member: TeamMember;
21
+ readonly sessions: RosterContext['sessions'];
22
+ readonly t: (key: LocaleKey) => string;
23
+ };
24
+ export declare function RosterRow(props: RosterRowProps): React.ReactElement;
25
+ export declare function Roster(props: RosterProps): React.ReactElement | null;
26
+ export default Roster;
@@ -0,0 +1 @@
1
+ export {};