@skillcdn/console 0.3.2 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/README.md +4 -3
  2. package/dist/api.d.ts +2 -2
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +2 -2
  5. package/dist/api.js.map +1 -1
  6. package/dist/cli/cli.d.ts.map +1 -1
  7. package/dist/cli/cli.js +132 -18
  8. package/dist/cli/cli.js.map +1 -1
  9. package/dist/cli/format.d.ts.map +1 -1
  10. package/dist/cli/format.js +6 -4
  11. package/dist/cli/format.js.map +1 -1
  12. package/dist/cli/help.d.ts.map +1 -1
  13. package/dist/cli/help.js +72 -21
  14. package/dist/cli/help.js.map +1 -1
  15. package/dist/cli/pack.d.ts +7 -2
  16. package/dist/cli/pack.d.ts.map +1 -1
  17. package/dist/cli/pack.js +16 -2
  18. package/dist/cli/pack.js.map +1 -1
  19. package/dist/client.d.ts +19 -3
  20. package/dist/client.d.ts.map +1 -1
  21. package/dist/client.js +11 -1
  22. package/dist/client.js.map +1 -1
  23. package/dist/compat.d.ts +1 -1
  24. package/dist/compat.js +2 -2
  25. package/dist/components/board.d.ts +12 -1
  26. package/dist/components/board.d.ts.map +1 -1
  27. package/dist/components/board.js +52 -4
  28. package/dist/components/board.js.map +1 -1
  29. package/dist/components/calendar.d.ts +4 -0
  30. package/dist/components/calendar.d.ts.map +1 -1
  31. package/dist/components/calendar.js +61 -22
  32. package/dist/components/calendar.js.map +1 -1
  33. package/dist/components/decision-form.d.ts +12 -4
  34. package/dist/components/decision-form.d.ts.map +1 -1
  35. package/dist/components/decision-form.js +24 -6
  36. package/dist/components/decision-form.js.map +1 -1
  37. package/dist/components/decision-list.d.ts +4 -0
  38. package/dist/components/decision-list.d.ts.map +1 -1
  39. package/dist/components/decision-list.js +9 -6
  40. package/dist/components/decision-list.js.map +1 -1
  41. package/dist/components/documents.d.ts.map +1 -1
  42. package/dist/components/documents.js +3 -3
  43. package/dist/components/documents.js.map +1 -1
  44. package/dist/components/event-feed.d.ts.map +1 -1
  45. package/dist/components/event-feed.js +63 -8
  46. package/dist/components/event-feed.js.map +1 -1
  47. package/dist/components/markdown.d.ts.map +1 -1
  48. package/dist/components/markdown.js +6 -3
  49. package/dist/components/markdown.js.map +1 -1
  50. package/dist/components/my-decisions.d.ts +20 -0
  51. package/dist/components/my-decisions.d.ts.map +1 -0
  52. package/dist/components/my-decisions.js +36 -0
  53. package/dist/components/my-decisions.js.map +1 -0
  54. package/dist/components/pack-connect.d.ts +3 -1
  55. package/dist/components/pack-connect.d.ts.map +1 -1
  56. package/dist/components/pack-connect.js +4 -4
  57. package/dist/components/pack-connect.js.map +1 -1
  58. package/dist/components/pack-token.d.ts +3 -1
  59. package/dist/components/pack-token.d.ts.map +1 -1
  60. package/dist/components/pack-token.js +1 -1
  61. package/dist/components/pack-token.js.map +1 -1
  62. package/dist/components/people.d.ts.map +1 -1
  63. package/dist/components/people.js +14 -3
  64. package/dist/components/people.js.map +1 -1
  65. package/dist/components/projects.d.ts.map +1 -1
  66. package/dist/components/projects.js +3 -3
  67. package/dist/components/projects.js.map +1 -1
  68. package/dist/components/remote-pictures.d.ts +6 -0
  69. package/dist/components/remote-pictures.d.ts.map +1 -0
  70. package/dist/components/remote-pictures.js +8 -0
  71. package/dist/components/remote-pictures.js.map +1 -0
  72. package/dist/components/roadmap.js +1 -1
  73. package/dist/components/roadmap.js.map +1 -1
  74. package/dist/components/runs.d.ts.map +1 -1
  75. package/dist/components/runs.js +1 -1
  76. package/dist/components/runs.js.map +1 -1
  77. package/dist/components/shell.d.ts.map +1 -1
  78. package/dist/components/shell.js +36 -1
  79. package/dist/components/shell.js.map +1 -1
  80. package/dist/components/sign-in.d.ts.map +1 -1
  81. package/dist/components/sign-in.js +49 -2
  82. package/dist/components/sign-in.js.map +1 -1
  83. package/dist/components/task-list.js +1 -1
  84. package/dist/components/task-list.js.map +1 -1
  85. package/dist/components/task-view.d.ts.map +1 -1
  86. package/dist/components/task-view.js +2 -2
  87. package/dist/components/task-view.js.map +1 -1
  88. package/dist/components/ui.d.ts +13 -2
  89. package/dist/components/ui.d.ts.map +1 -1
  90. package/dist/components/ui.js +21 -14
  91. package/dist/components/ui.js.map +1 -1
  92. package/dist/console.css +1686 -425
  93. package/dist/console.d.ts.map +1 -1
  94. package/dist/console.js +83 -13
  95. package/dist/console.js.map +1 -1
  96. package/dist/data.d.ts +15 -2
  97. package/dist/data.d.ts.map +1 -1
  98. package/dist/data.js +18 -19
  99. package/dist/data.js.map +1 -1
  100. package/dist/i18n/en.d.ts +48 -1
  101. package/dist/i18n/en.d.ts.map +1 -1
  102. package/dist/i18n/en.js +50 -3
  103. package/dist/i18n/en.js.map +1 -1
  104. package/dist/i18n/ko.d.ts.map +1 -1
  105. package/dist/i18n/ko.js +47 -4
  106. package/dist/i18n/ko.js.map +1 -1
  107. package/dist/index.d.ts +3 -2
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/index.js +3 -2
  110. package/dist/index.js.map +1 -1
  111. package/dist/limits.d.ts +14 -0
  112. package/dist/limits.d.ts.map +1 -1
  113. package/dist/limits.js +14 -0
  114. package/dist/limits.js.map +1 -1
  115. package/dist/router.d.ts +9 -1
  116. package/dist/router.d.ts.map +1 -1
  117. package/dist/router.js +12 -0
  118. package/dist/router.js.map +1 -1
  119. package/dist/routes.d.ts +5 -1
  120. package/dist/routes.d.ts.map +1 -1
  121. package/dist/routes.js +5 -1
  122. package/dist/routes.js.map +1 -1
  123. package/dist/rules.js +1 -1
  124. package/dist/rules.js.map +1 -1
  125. package/dist/schemas.d.ts +272 -4
  126. package/dist/schemas.d.ts.map +1 -1
  127. package/dist/schemas.js +33 -8
  128. package/dist/schemas.js.map +1 -1
  129. package/dist/web.d.ts.map +1 -1
  130. package/dist/web.js +3 -2
  131. package/dist/web.js.map +1 -1
  132. package/docs/specs/cli.md +11 -10
  133. package/docs/specs/rest.md +33 -17
  134. package/package.json +2 -2
  135. package/skills/building-a-console/SKILL.md +5 -5
  136. package/skills/building-a-console/references/the-default-console.md +4 -4
  137. package/skills/building-a-console/references/the-look-from-a-website.md +5 -5
  138. package/skills/working-the-board/SKILL.md +6 -4
  139. package/skills/working-the-board/references/setting-up.md +1 -1
  140. package/skills/working-the-board/references/terms.md +1 -1
  141. package/src/api.ts +10 -0
  142. package/src/cli/cli.ts +162 -19
  143. package/src/cli/format.ts +11 -4
  144. package/src/cli/help.ts +79 -20
  145. package/src/cli/pack.ts +17 -1
  146. package/src/client.ts +51 -2
  147. package/src/compat.ts +2 -2
  148. package/src/components/board.tsx +114 -21
  149. package/src/components/calendar.tsx +207 -102
  150. package/src/components/decision-form.tsx +71 -23
  151. package/src/components/decision-list.tsx +30 -3
  152. package/src/components/documents.tsx +27 -11
  153. package/src/components/event-feed.tsx +116 -33
  154. package/src/components/markdown.tsx +6 -3
  155. package/src/components/my-decisions.tsx +138 -0
  156. package/src/components/pack-connect.tsx +10 -7
  157. package/src/components/pack-token.tsx +4 -1
  158. package/src/components/people.tsx +20 -8
  159. package/src/components/projects.tsx +7 -5
  160. package/src/components/remote-pictures.ts +19 -0
  161. package/src/components/roadmap.tsx +1 -1
  162. package/src/components/runs.tsx +5 -1
  163. package/src/components/shell.tsx +36 -1
  164. package/src/components/sign-in.tsx +114 -13
  165. package/src/components/task-list.tsx +1 -1
  166. package/src/components/task-view.tsx +48 -47
  167. package/src/components/ui.tsx +70 -14
  168. package/src/console.tsx +153 -32
  169. package/src/data.ts +37 -20
  170. package/src/i18n/en.ts +53 -3
  171. package/src/i18n/ko.ts +50 -4
  172. package/src/index.ts +3 -0
  173. package/src/limits.ts +14 -0
  174. package/src/router.ts +18 -1
  175. package/src/routes.ts +5 -1
  176. package/src/rules.ts +1 -1
  177. package/src/schemas.ts +37 -8
  178. package/src/styles/console.css +1686 -425
  179. package/src/web.ts +3 -2
package/src/i18n/ko.ts CHANGED
@@ -93,6 +93,7 @@ export const ko: Messages = {
93
93
  nav: {
94
94
  projects: "프로젝트",
95
95
  work: "내 작업",
96
+ myDecisions: "내 결정",
96
97
  people: "사람들",
97
98
  agents: "에이전트",
98
99
  board: "보드",
@@ -118,7 +119,13 @@ export const ko: Messages = {
118
119
 
119
120
  signIn: {
120
121
  lead: "AI 에이전트로 이뤄진 조직에 합류하세요.",
121
- continueWith: (provider) => `${provider}로 계속`,
122
+ signInWith: (provider) => `${provider}로 로그인`,
123
+ going: (provider) => `${provider}로 가는 중…`,
124
+ admits: {
125
+ organization: (name) => `GitHub 조직 ${name}의 멤버가 로그인할 수 있습니다.`,
126
+ domains: (domains) => `${domains} 계정이 로그인할 수 있습니다.`,
127
+ listed: "관리자가 추가한 사람이 로그인할 수 있습니다.",
128
+ },
122
129
  nobody: {
123
130
  title: "아직 아무도 로그인할 수 없습니다",
124
131
  body: "이 콘솔에는 로그인이 설정되어 있지 않습니다. 운영자가 deploy/README.md에 따라 설정합니다.",
@@ -137,6 +144,8 @@ export const ko: Messages = {
137
144
  empty: {
138
145
  title: "아직 프로젝트가 없습니다",
139
146
  body: "첫 프로젝트를 만드세요. 무엇을 위한 것인지, 누가 함께하는지. 또는 소유자에게 추가를 요청하세요.",
147
+ bodyMember:
148
+ "프로젝트는 관리자가 만듭니다. 관리자에게 첫 프로젝트를, 또는 소유자에게 추가를 요청하세요.",
140
149
  },
141
150
  list: "프로젝트",
142
151
  private: "비공개",
@@ -239,8 +248,11 @@ export const ko: Messages = {
239
248
  menu: "작업 메뉴",
240
249
  decisions: (n) => `결정 ${n}건`,
241
250
  decisionsTitle: "사람을 기다리는 결정",
251
+ unfold: (column) => `${column} 펼치기`,
252
+ fold: (column) => `${column} 접기`,
242
253
  filters: {
243
254
  aria: "보드 좁혀 보기",
255
+ words: "제목, 번호, 사람",
244
256
  everyone: "모두",
245
257
  mine: "내 작업",
246
258
  anyCategory: "모든 카테고리",
@@ -340,6 +352,8 @@ export const ko: Messages = {
340
352
  record: "기록",
341
353
  openRecord: "열기",
342
354
  waitingForPerson: "사람을 기다리는 중입니다.",
355
+ waitingFor: (name) => `${name}의 답을 기다리는 중입니다.`,
356
+ peopleLabel: (asker, decider) => `올린 사람 ${asker}, 답할 사람 ${decider}`,
343
357
  options: "선택지",
344
358
  notePlaceholder: "덧붙일 말이 있다면",
345
359
  own: "직접 입력",
@@ -362,6 +376,9 @@ export const ko: Messages = {
362
376
  contextPlaceholder: "답하려면 알아야 할 것, Markdown으로.",
363
377
  about: "관련 작업",
364
378
  noTask: "특정 작업 없음",
379
+ decider: "결정할 사람",
380
+ deciderPlaceholder: "지정하지 않으면 본인",
381
+ me: "(나)",
365
382
  options: "선택지",
366
383
  option: (n) => `선택지 ${n}`,
367
384
  addOption: "선택지 추가",
@@ -369,6 +386,23 @@ export const ko: Messages = {
369
386
  },
370
387
  },
371
388
 
389
+ myDecisions: {
390
+ title: "내 결정",
391
+ loading: "내 결정을 불러오는 중",
392
+ couldNotLoad: "내 결정을 불러올 수 없습니다.",
393
+ empty: {
394
+ title: "내 결정이 없습니다",
395
+ body: "내게 온 결정과 내가 다른 사람에게 올린 결정이 여기에 모입니다. 내가 올린 결정은 내 에이전트가 올린 것을 포함합니다.",
396
+ },
397
+ waiting: "내 답을 기다리는 중",
398
+ noneWaiting: "내 답을 기다리는 결정이 없습니다.",
399
+ raised: "내가 다른 사람에게 올린 결정",
400
+ noneRaised: "다른 사람에게 올린 결정이 없습니다.",
401
+ answered: "답변됨",
402
+ noneAnswered: "아직 답한 결정이 없습니다.",
403
+ more: "더 보기",
404
+ },
405
+
372
406
  calendar: {
373
407
  title: "캘린더",
374
408
  grid: "이 달",
@@ -381,6 +415,11 @@ export const ko: Messages = {
381
415
  nothingOverdue: "기한이 지난 작업이 없습니다.",
382
416
  unscheduled: "날짜 없음",
383
417
  allScheduled: "열린 작업마다 날짜가 있습니다.",
418
+ more: (n) => `${n}개 더`,
419
+ fewer: "접기",
420
+ onDay: (day) => `${day}의 작업`,
421
+ nothingOnDay: "이 날에 잡힌 작업이 없습니다.",
422
+ close: "닫기",
384
423
  week: {
385
424
  title: "이 주",
386
425
  previous: "이전 주",
@@ -389,7 +428,7 @@ export const ko: Messages = {
389
428
  nothing: "이 주에 잡힌 작업이 없습니다.",
390
429
  },
391
430
  workload: {
392
- title: "누가 무엇을",
431
+ title: "담당자별 작업 현황",
393
432
  person: "사람",
394
433
  open: "열림",
395
434
  inProgress: "진행 중",
@@ -471,8 +510,8 @@ export const ko: Messages = {
471
510
  thisWeek: "이번 주 마감",
472
511
  later: "그 뒤",
473
512
  noDay: "날짜 없음",
474
- decisions: "사람을 기다리는 결정",
475
- noDecisions: "기다리는 결정이 없습니다.",
513
+ decisions: "내 답을 기다리는 결정",
514
+ noDecisions: "내 답을 기다리는 결정이 없습니다.",
476
515
  inProject: (project) => `${project}에서`,
477
516
  },
478
517
 
@@ -632,6 +671,8 @@ export const ko: Messages = {
632
671
  runFinished: (task) => `${task}을(를) 끝냈습니다`,
633
672
  runFailed: (task) => `${task}에 실패했습니다`,
634
673
  runAbandoned: (task) => `${task}을(를) 포기했습니다`,
674
+ runUnheard: (task, agent) =>
675
+ `${task}의 ${agent} 런을 끝냈습니다. 너무 오래 소식이 없었습니다`,
635
676
  documentWritten: (page, version) =>
636
677
  `${page}을(를) 썼습니다${version === undefined ? "" : `, 버전 ${version}`}`,
637
678
  documentArchived: (page) => `${page}을(를) 보관했습니다`,
@@ -757,6 +798,7 @@ export const ko: Messages = {
757
798
  version: (n) => `v${n}`,
758
799
  versionWord: "버전",
759
800
  writtenBy: "작성:",
801
+ author: "작성",
760
802
  versionOf: (n, of) => `버전 ${n} / ${of}`,
761
803
  showLatest: "최신 버전 보기",
762
804
  archivedNotice: "이 페이지는 보관됐습니다. 폴더와 검색에서 빠지고, 쓸 수 없습니다.",
@@ -769,6 +811,8 @@ export const ko: Messages = {
769
811
  decisionPrefix: "결정: ",
770
812
  files: "파일",
771
813
  fileToAttach: "첨부할 파일",
814
+ chooseFile: "파일 선택",
815
+ noFileChosen: "선택된 파일 없음",
772
816
  labelPlaceholder: "파일 이름 대신 부를 이름",
773
817
  attach: "첨부",
774
818
  by: "첨부:",
@@ -808,6 +852,8 @@ export const ko: Messages = {
808
852
  domain: "도메인의 계정",
809
853
  listed: "관리자가 추가함",
810
854
  },
855
+ ofOrganization: (name) => `${name} 조직의 구성원`,
856
+ ofDomain: (domain) => `${domain} 도메인의 계정`,
811
857
  at: { gh: "GitHub", google: "Google" },
812
858
  organization: (name) => `GitHub 조직 ${name}이(가) 구성원을 정합니다.`,
813
859
  organizationRead: "마지막으로 읽음",
package/src/index.ts CHANGED
@@ -11,6 +11,7 @@ export {
11
11
  type BoardProps,
12
12
  byDue,
13
13
  columnStateOf,
14
+ FOLDED_STATES,
14
15
  filterTasks,
15
16
  TaskCard,
16
17
  } from "./components/board.js";
@@ -82,6 +83,7 @@ export {
82
83
  goalMonth,
83
84
  } from "./components/goals.js";
84
85
  export { Markdown, type MarkdownProps } from "./components/markdown.js";
86
+ export { MyDecisions, type MyDecisionsProps } from "./components/my-decisions.js";
85
87
  export {
86
88
  PackConnect,
87
89
  type PackConnectProps,
@@ -207,6 +209,7 @@ export {
207
209
  formatBytes,
208
210
  formatInstant,
209
211
  GoalStateBadge,
212
+ LinkButton,
210
213
  PersonChip,
211
214
  PRIORITY_LABELS,
212
215
  PriorityBadge,
package/src/limits.ts CHANGED
@@ -79,3 +79,17 @@ export const MAX_PROJECT_SYMBOL_LENGTH = 8;
79
79
  export const MAX_PROJECT_ICON_BYTES = 512 * 1024;
80
80
  /** How many items a listing answers with when none is asked for, and the most one may ask for. */
81
81
  export const DEFAULT_PAGE_LIMIT = 50;
82
+ /**
83
+ * How many projects one workspace holds, how many tasks, goals, decisions and pages one project
84
+ * holds, and how many runs one task carries, those put away included: bounds a runaway script
85
+ * meets and real work does not.
86
+ */
87
+ export const MAX_PROJECTS_PER_WORKSPACE = 500;
88
+ export const MAX_TASKS_PER_PROJECT = 20_000;
89
+ export const MAX_GOALS_PER_PROJECT = 1_000;
90
+ export const MAX_DECISIONS_PER_PROJECT = 20_000;
91
+ export const MAX_DOCUMENTS_PER_PROJECT = 5_000;
92
+ export const MAX_RUNS_PER_TASK = 500;
93
+ /** How many streams of the live feed one person holds at once, across their tabs, and how many one process of the console holds for everyone. */
94
+ export const MAX_STREAMS_PER_PERSON = 20;
95
+ export const MAX_STREAMS = 1_000;
package/src/router.ts CHANGED
@@ -21,15 +21,20 @@ export type DocsView =
21
21
  /**
22
22
  * What the board is narrowed to (ADR-0019), from the query: a category by its key (`""` for
23
23
  * the tasks with none), a goal by its id (`""` for the tasks with none), a person by their id,
24
- * or the person's own.
24
+ * the person's own, or words (`q`), as they are typed, each of which a task's title, number,
25
+ * owner, worker or category must contain.
25
26
  */
26
27
  export interface BoardFilter {
27
28
  readonly category?: string | undefined;
28
29
  readonly goal?: string | undefined;
29
30
  readonly person?: string | undefined;
30
31
  readonly mine?: boolean | undefined;
32
+ readonly words?: string | undefined;
31
33
  }
32
34
 
35
+ /** As much of the words as the address keeps: enough for any search, bounded as every input is. */
36
+ const BOARD_WORDS_LENGTH = 200;
37
+
33
38
  export type Route =
34
39
  | { readonly name: "projects" }
35
40
  | { readonly name: "new-project" }
@@ -100,6 +105,8 @@ export type Route =
100
105
  /** What is on the person's plate across their projects. */
101
106
  /** What is on the person's plate: a day of the week shown at the top, or today's when the address names none. */
102
107
  | { readonly name: "work"; readonly week: string | undefined }
108
+ /** The decisions addressed to the person (ADR-0042), across the projects they may see. */
109
+ | { readonly name: "my-decisions" }
103
110
  /** The categories tasks are sorted into; an administrator keeps them here. */
104
111
  | { readonly name: "categories" }
105
112
  /** Where a person approves an agent's connection, by the code it showed, or types one. */
@@ -136,6 +143,8 @@ export const PATHS = {
136
143
  newProject: "/projects/new",
137
144
  /** What is on the person's plate, across the projects they may see. */
138
145
  work: "/work",
146
+ /** The decisions addressed to the person (ADR-0042), across the projects they may see. */
147
+ decisions: "/decisions",
139
148
  people: "/people",
140
149
  /** The form where an administrator lets someone in by login. */
141
150
  newListing: "/people/new",
@@ -187,11 +196,13 @@ const boardFilterOf = (params: URLSearchParams): BoardFilter => {
187
196
  const category = params.get("category");
188
197
  const goal = params.get("goal");
189
198
  const person = params.get("person");
199
+ const q = params.get("q");
190
200
  return {
191
201
  ...(category !== null && (category === "" || PROJECT_KEY.test(category)) ? { category } : {}),
192
202
  ...(goal !== null && (goal === "" || UUID.test(goal)) ? { goal } : {}),
193
203
  ...(person !== null && UUID.test(person) ? { person } : {}),
194
204
  ...(params.has("mine") ? { mine: true } : {}),
205
+ ...(q !== null && q.trim() !== "" ? { words: q.slice(0, BOARD_WORDS_LENGTH) } : {}),
195
206
  };
196
207
  };
197
208
 
@@ -239,6 +250,9 @@ export function matchRoute(pathname: string, search = ""): Route {
239
250
  const shown = weekShown(params);
240
251
  return shown === undefined ? NOT_FOUND : { name: "work", ...shown };
241
252
  }
253
+ if (path === PATHS.decisions) {
254
+ return { name: "my-decisions" };
255
+ }
242
256
  if (path === PATHS.people) {
243
257
  return { name: "people" };
244
258
  }
@@ -462,6 +476,9 @@ function filterParts(filter: BoardFilter): string[] {
462
476
  if (filter.mine === true) {
463
477
  parts.push("mine");
464
478
  }
479
+ if (filter.words !== undefined) {
480
+ parts.push(`q=${encodeURIComponent(filter.words)}`);
481
+ }
465
482
  return parts;
466
483
  }
467
484
 
package/src/routes.ts CHANGED
@@ -9,6 +9,8 @@ export const REST_ROUTES = {
9
9
  me: "/api/v1/me",
10
10
  /** The token a request is made with, for it to give itself up. */
11
11
  meToken: "/api/v1/me/token",
12
+ /** A picture from elsewhere, fetched by the console for a page (ADR-0048); `?src=` names it. */
13
+ pictures: "/api/v1/pictures",
12
14
  /** The workspace's settings (ADR-0035), changed by an administrator; read through `me`. */
13
15
  workspace: "/api/v1/workspace",
14
16
  /** The SkillCDN token the organization's pack is read with (ADR-0036), an administrator's; `/connect` under it connects one with a code. */
@@ -27,8 +29,10 @@ export const REST_ROUTES = {
27
29
  connect: "/api/v1/connect",
28
30
  /** The categories tasks are sorted into (ADR-0019): the workspace's vocabulary, kept by an administrator. */
29
31
  categories: "/api/v1/categories",
30
- /** What is on the asker's plate across the projects they may see: their open tasks, and the decisions waiting. */
32
+ /** What is on the asker's plate across the projects they may see: their open tasks, and the decisions waiting for them. */
31
33
  work: "/api/v1/work",
34
+ /** The decisions addressed to the asker (ADR-0042) across the projects they may see: the waiting first, then the record. */
35
+ decisions: "/api/v1/decisions",
32
36
  /** The rules of the board (ADR-0023): the console's own until an administrator writes the organization's. */
33
37
  rules: "/api/v1/rules",
34
38
  } as const;
package/src/rules.ts CHANGED
@@ -41,7 +41,7 @@ export const REFERENCE_RULES = [
41
41
  "",
42
42
  "## Decide alone, or ask",
43
43
  "",
44
- "Alone: how to do what the task settles, which skill to load, what to write on pages, and a commit or a push where the repository's agreement allows it. On the board, with `console ask`: a trade-off the task leaves open, a change of scope or of the plan, anything that costs money, anything that deletes. Answered once, never asked again.",
44
+ "Alone: how to do what the task settles, which skill to load, what to write on pages, and a commit or a push where the repository's agreement allows it. On the board, with `console ask`: a trade-off the task leaves open, a change of scope or of the plan, anything that costs money, anything that deletes. Answered once, never asked again. A decision is the record of a choice that is a person's to make, wherever they make it: an answer given to you in chat, in a meeting or by changing the task is written on the decision in the person's name (`console answer`), with where it was said, so that the board shows as waiting only what is still open and a run waits on the record, not on memory. Asked what is on a person's plate, or for a briefing, start from the decisions waiting for their answer (`console work`), each with what waits on it and since when, before the tasks.",
45
45
  "",
46
46
  "## Reports",
47
47
  "",
package/src/schemas.ts CHANGED
@@ -167,6 +167,18 @@ export const restProviderSchema = z.object({
167
167
  key: z.enum(PROVIDER_KEYS),
168
168
  /** What people read on the button. */
169
169
  label: z.string(),
170
+ /**
171
+ * Who this way in lets in, for the line under the button: the organization at the git host
172
+ * whose members are in, the Workspace domains whose accounts are, or neither, where only the
173
+ * logins an administrator listed get in. Answered from 0.4.1; read as optional, so that a
174
+ * console built on this package reads an older console's answer.
175
+ */
176
+ admits: z.optional(
177
+ z.object({
178
+ organization: z.nullable(z.string()),
179
+ domains: z.array(z.string()),
180
+ }),
181
+ ),
170
182
  });
171
183
  export type RestProvider = z.infer<typeof restProviderSchema>;
172
184
 
@@ -652,6 +664,8 @@ export const restDecisionSchema = z.object({
652
664
  /** The task's number, when there is a task, or `null`. */
653
665
  taskNumber: z.nullable(z.int()),
654
666
  raisedBy: restPersonSchema,
667
+ /** Who is to answer (ADR-0042): the raiser, unless another person of the project was named. */
668
+ decider: restPersonSchema,
655
669
  /** The run that raised it, as the agent asked, or `null` when a person did. */
656
670
  run: z.nullable(z.object({ id: uuid, agent: z.string() })),
657
671
  /** The answer, with who gave it and when; `null` while the decision waits. */
@@ -690,9 +704,9 @@ const projectRef = z.object({
690
704
 
691
705
  /**
692
706
  * `GET /api/v1/work`: what is on the asker's plate across the projects they may see (ADR-0019):
693
- * the open tasks they work on, and the decisions that wait for a person, each with its
694
- * project; and, for the week on the plate, `closed`, the tasks they work on that are done
695
- * or dropped and not yet put away. Left out by a console older than it.
707
+ * the open tasks they work on, and the decisions that wait for their answer (ADR-0042), each
708
+ * with its project; and, for the week on the plate, `closed`, the tasks they work on that are
709
+ * done or dropped and not yet put away. Left out by a console older than it.
696
710
  */
697
711
  export const restWorkSchema = z.object({
698
712
  tasks: z.array(z.object({ project: projectRef, task: restTaskSchema })),
@@ -701,6 +715,17 @@ export const restWorkSchema = z.object({
701
715
  });
702
716
  export type RestWork = z.infer<typeof restWorkSchema>;
703
717
 
718
+ /**
719
+ * `GET /api/v1/decisions`: a page of the decisions addressed to the asker (ADR-0042) across the
720
+ * projects they may see, each with its project: the ones that wait first, oldest first among
721
+ * them, then the answered, newest first; and whether there is more.
722
+ */
723
+ export const restMyDecisionsSchema = z.object({
724
+ items: z.array(z.object({ project: projectRef, decision: restDecisionSchema })),
725
+ more: z.boolean(),
726
+ });
727
+ export type RestMyDecisions = z.infer<typeof restMyDecisionsSchema>;
728
+
704
729
  /**
705
730
  * What `GET /api/v1/people/<id>/work` answers: another person's open tasks, and their closed
706
731
  * ones for the week, within the projects the asker may see, for whoever oversees them. No
@@ -722,6 +747,8 @@ export const restDecisionInputSchema = z.object({
722
747
  taskId: z.optional(z.nullable(uuid)),
723
748
  /** The run that asks, when an agent does: the decision is about its task, and it waits for the answer. */
724
749
  runId: z.optional(z.nullable(uuid)),
750
+ /** Who is to answer (ADR-0042): a person who may work in the project; the asker when left out. */
751
+ deciderId: z.optional(uuid),
725
752
  });
726
753
  export type RestDecisionInput = z.infer<typeof restDecisionInputSchema>;
727
754
 
@@ -779,8 +806,9 @@ export const restEventDataSchema = z.object({
779
806
  name: z.optional(z.string()),
780
807
  /** For what an agent did: what it calls itself. */
781
808
  agent: z.optional(z.string()),
782
- /** For `run.ended`: how. */
809
+ /** For `run.ended`: how, and, when the console ended the run itself, why (ADR-0041). */
783
810
  status: z.optional(z.enum(RUN_STATUSES)),
811
+ reason: z.optional(z.literal("unheard")),
784
812
  /** For `run.handed_in`: what the artifact is called. */
785
813
  label: z.optional(z.string()),
786
814
  /** For `run.reported` and `task.commented`: the first words of what was written. */
@@ -1079,9 +1107,10 @@ export const restPackConnectStartedSchema = z.object({
1079
1107
  export type RestPackConnectStarted = z.infer<typeof restPackConnectStartedSchema>;
1080
1108
 
1081
1109
  /**
1082
- * `GET .../pack-token/connect`: how the connection stands. Nothing asked; waiting for the
1083
- * person, with what they were shown; connected, the token kept and the project as it stands; or
1084
- * ended short of a token, and why.
1110
+ * `GET .../pack-token/connect` and `POST .../pack-token/connect/claim`: how the connection
1111
+ * stands. Nothing asked; waiting for the person, with what they were shown; connected, which
1112
+ * only the claim answers (ADR-0046), the token kept and the project as it stands; or ended
1113
+ * short of a token, and why.
1085
1114
  */
1086
1115
  const packConnectNone = z.object({ status: z.literal("none") });
1087
1116
  const packConnectPending = z.object({
@@ -1103,7 +1132,7 @@ export const restPackConnectSchema = z.union([
1103
1132
  ]);
1104
1133
  export type RestPackConnect = z.infer<typeof restPackConnectSchema>;
1105
1134
 
1106
- /** `GET /api/v1/workspace/pack-token/connect`: the same, for the workspace's token, with the workspace as it stands once connected. */
1135
+ /** `GET /api/v1/workspace/pack-token/connect` and `POST .../connect/claim`: the same, for the workspace's token, with the workspace as it stands once connected. */
1107
1136
  export const restWorkspacePackConnectSchema = z.union([
1108
1137
  packConnectNone,
1109
1138
  packConnectPending,