@jinion/core 0.5.0 → 0.5.2

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 (226) hide show
  1. package/dist/agent/agent.d.ts +3 -0
  2. package/dist/agent/agent.d.ts.map +1 -1
  3. package/dist/agent/agent.js.map +1 -1
  4. package/dist/agent/claude/backend.d.ts +1 -1
  5. package/dist/agent/claude/backend.d.ts.map +1 -1
  6. package/dist/agent/claude/backend.js +2 -1
  7. package/dist/agent/claude/backend.js.map +1 -1
  8. package/dist/agent/claude/jinion-tools.d.ts +3 -1
  9. package/dist/agent/claude/jinion-tools.d.ts.map +1 -1
  10. package/dist/agent/claude/jinion-tools.js +10 -1
  11. package/dist/agent/claude/jinion-tools.js.map +1 -1
  12. package/dist/agent/claude/options.d.ts +4 -1
  13. package/dist/agent/claude/options.d.ts.map +1 -1
  14. package/dist/agent/claude/options.js +4 -4
  15. package/dist/agent/claude/options.js.map +1 -1
  16. package/dist/agent/claude/prompt.d.ts +2 -1
  17. package/dist/agent/claude/prompt.d.ts.map +1 -1
  18. package/dist/agent/claude/prompt.js +3 -1
  19. package/dist/agent/claude/prompt.js.map +1 -1
  20. package/dist/agent/claude/session.d.ts +9 -1
  21. package/dist/agent/claude/session.d.ts.map +1 -1
  22. package/dist/agent/claude/session.js +13 -3
  23. package/dist/agent/claude/session.js.map +1 -1
  24. package/dist/agent/claude/tool-calls.d.ts.map +1 -1
  25. package/dist/agent/claude/tool-calls.js +11 -2
  26. package/dist/agent/claude/tool-calls.js.map +1 -1
  27. package/dist/agent/codex/backend.d.ts +1 -1
  28. package/dist/agent/codex/backend.d.ts.map +1 -1
  29. package/dist/agent/codex/backend.js +2 -1
  30. package/dist/agent/codex/backend.js.map +1 -1
  31. package/dist/agent/codex/events.d.ts.map +1 -1
  32. package/dist/agent/codex/events.js +7 -4
  33. package/dist/agent/codex/events.js.map +1 -1
  34. package/dist/agent/codex/jinion-tools.d.ts +27 -4
  35. package/dist/agent/codex/jinion-tools.d.ts.map +1 -1
  36. package/dist/agent/codex/jinion-tools.js +18 -4
  37. package/dist/agent/codex/jinion-tools.js.map +1 -1
  38. package/dist/agent/codex/session.d.ts +3 -0
  39. package/dist/agent/codex/session.d.ts.map +1 -1
  40. package/dist/agent/codex/session.js +5 -2
  41. package/dist/agent/codex/session.js.map +1 -1
  42. package/dist/agent/demo/agent.d.ts +1 -0
  43. package/dist/agent/demo/agent.d.ts.map +1 -1
  44. package/dist/agent/demo/agent.js +3 -0
  45. package/dist/agent/demo/agent.js.map +1 -1
  46. package/dist/agent/demo/scenarios/pricing-card.d.ts +3 -0
  47. package/dist/agent/demo/scenarios/pricing-card.d.ts.map +1 -0
  48. package/dist/agent/demo/scenarios/pricing-card.js +43 -0
  49. package/dist/agent/demo/scenarios/pricing-card.js.map +1 -0
  50. package/dist/agent/demo/sessions.d.ts.map +1 -1
  51. package/dist/agent/demo/sessions.js +26 -1
  52. package/dist/agent/demo/sessions.js.map +1 -1
  53. package/dist/agent/review.d.ts +8 -2
  54. package/dist/agent/review.d.ts.map +1 -1
  55. package/dist/agent/review.js +27 -7
  56. package/dist/agent/review.js.map +1 -1
  57. package/dist/api/client.d.ts +212 -0
  58. package/dist/api/client.d.ts.map +1 -1
  59. package/dist/api/connection.d.ts +52 -0
  60. package/dist/api/connection.d.ts.map +1 -1
  61. package/dist/api/connection.js +2 -0
  62. package/dist/api/connection.js.map +1 -1
  63. package/dist/api/fields.d.ts +229 -1
  64. package/dist/api/fields.d.ts.map +1 -1
  65. package/dist/api/fields.js +3 -1
  66. package/dist/api/fields.js.map +1 -1
  67. package/dist/api/json-schema.d.ts +864 -221
  68. package/dist/api/json-schema.d.ts.map +1 -1
  69. package/dist/api/methods/git.d.ts.map +1 -1
  70. package/dist/api/methods/git.js +11 -1
  71. package/dist/api/methods/git.js.map +1 -1
  72. package/dist/api/methods/sessions.d.ts.map +1 -1
  73. package/dist/api/methods/sessions.js +3 -2
  74. package/dist/api/methods/sessions.js.map +1 -1
  75. package/dist/api/methods/team.d.ts +4 -0
  76. package/dist/api/methods/team.d.ts.map +1 -0
  77. package/dist/api/methods/team.js +30 -0
  78. package/dist/api/methods/team.js.map +1 -0
  79. package/dist/api/protocol.d.ts +792 -2
  80. package/dist/api/protocol.d.ts.map +1 -1
  81. package/dist/api/protocol.js +41 -5
  82. package/dist/api/protocol.js.map +1 -1
  83. package/dist/api/schemas.d.ts +496 -0
  84. package/dist/api/schemas.d.ts.map +1 -1
  85. package/dist/api/schemas.js +6 -0
  86. package/dist/api/schemas.js.map +1 -1
  87. package/dist/commands/builtin.d.ts.map +1 -1
  88. package/dist/commands/builtin.js +3 -0
  89. package/dist/commands/builtin.js.map +1 -1
  90. package/dist/commands/team.d.ts +4 -0
  91. package/dist/commands/team.d.ts.map +1 -0
  92. package/dist/commands/team.js +11 -0
  93. package/dist/commands/team.js.map +1 -0
  94. package/dist/controllers/context.d.ts +4 -0
  95. package/dist/controllers/context.d.ts.map +1 -1
  96. package/dist/controllers/context.js +4 -0
  97. package/dist/controllers/context.js.map +1 -1
  98. package/dist/controllers/conversation.d.ts +16 -0
  99. package/dist/controllers/conversation.d.ts.map +1 -1
  100. package/dist/controllers/decision-view.d.ts +20 -0
  101. package/dist/controllers/decision-view.d.ts.map +1 -0
  102. package/dist/controllers/decision-view.js +59 -0
  103. package/dist/controllers/decision-view.js.map +1 -0
  104. package/dist/controllers/decisions.d.ts +29 -0
  105. package/dist/controllers/decisions.d.ts.map +1 -0
  106. package/dist/controllers/decisions.js +199 -0
  107. package/dist/controllers/decisions.js.map +1 -0
  108. package/dist/controllers/jinion.d.ts +17 -1
  109. package/dist/controllers/jinion.d.ts.map +1 -1
  110. package/dist/controllers/jinion.js +89 -5
  111. package/dist/controllers/jinion.js.map +1 -1
  112. package/dist/controllers/session.d.ts +21 -1
  113. package/dist/controllers/session.d.ts.map +1 -1
  114. package/dist/controllers/session.js +63 -1
  115. package/dist/controllers/session.js.map +1 -1
  116. package/dist/controllers/team.d.ts +216 -0
  117. package/dist/controllers/team.d.ts.map +1 -0
  118. package/dist/controllers/team.js +208 -0
  119. package/dist/controllers/team.js.map +1 -0
  120. package/dist/controllers/turns.d.ts +6 -0
  121. package/dist/controllers/turns.d.ts.map +1 -1
  122. package/dist/controllers/turns.js +17 -7
  123. package/dist/controllers/turns.js.map +1 -1
  124. package/dist/conversation/entries.d.ts +36 -0
  125. package/dist/conversation/entries.d.ts.map +1 -1
  126. package/dist/conversation/entries.js +26 -0
  127. package/dist/conversation/entries.js.map +1 -1
  128. package/dist/conversation/reducer.d.ts +132 -0
  129. package/dist/conversation/reducer.d.ts.map +1 -1
  130. package/dist/conversation/reducer.js +30 -1
  131. package/dist/conversation/reducer.js.map +1 -1
  132. package/dist/conversation/session.d.ts +24 -0
  133. package/dist/conversation/session.d.ts.map +1 -1
  134. package/dist/conversation/store.d.ts +13 -0
  135. package/dist/conversation/store.d.ts.map +1 -1
  136. package/dist/conversation/store.js +31 -7
  137. package/dist/conversation/store.js.map +1 -1
  138. package/dist/feedback/shared.d.ts +16 -0
  139. package/dist/feedback/shared.d.ts.map +1 -1
  140. package/dist/git/message.d.ts +4 -0
  141. package/dist/git/message.d.ts.map +1 -0
  142. package/dist/git/message.js +25 -0
  143. package/dist/git/message.js.map +1 -0
  144. package/dist/git/repos.d.ts.map +1 -1
  145. package/dist/git/repos.js +3 -1
  146. package/dist/git/repos.js.map +1 -1
  147. package/dist/git/staging.d.ts +6 -2
  148. package/dist/git/staging.d.ts.map +1 -1
  149. package/dist/git/staging.js +15 -3
  150. package/dist/git/staging.js.map +1 -1
  151. package/dist/git/types.d.ts +2 -0
  152. package/dist/git/types.d.ts.map +1 -1
  153. package/dist/git/types.js +2 -0
  154. package/dist/git/types.js.map +1 -1
  155. package/dist/jinion-account/account.d.ts +178 -0
  156. package/dist/jinion-account/account.d.ts.map +1 -1
  157. package/dist/jinion-account/account.js +30 -0
  158. package/dist/jinion-account/account.js.map +1 -1
  159. package/dist/jinion-account/api.d.ts +169 -0
  160. package/dist/jinion-account/api.d.ts.map +1 -1
  161. package/dist/jinion-account/api.js +39 -1
  162. package/dist/jinion-account/api.js.map +1 -1
  163. package/dist/jinion-account/user.d.ts +22 -0
  164. package/dist/jinion-account/user.d.ts.map +1 -1
  165. package/dist/jinion-account/user.js +9 -0
  166. package/dist/jinion-account/user.js.map +1 -1
  167. package/dist/map/review.d.ts +6 -4
  168. package/dist/map/review.d.ts.map +1 -1
  169. package/dist/map/review.js +21 -7
  170. package/dist/map/review.js.map +1 -1
  171. package/dist/state/jinion-account.d.ts +6 -0
  172. package/dist/state/jinion-account.d.ts.map +1 -1
  173. package/dist/state/session.d.ts +150 -0
  174. package/dist/state/session.d.ts.map +1 -1
  175. package/dist/state/session.js +2 -0
  176. package/dist/state/session.js.map +1 -1
  177. package/dist/state/team.d.ts +151 -0
  178. package/dist/state/team.d.ts.map +1 -0
  179. package/dist/state/team.js +4 -0
  180. package/dist/state/team.js.map +1 -0
  181. package/dist/team/anchoring.d.ts +9 -0
  182. package/dist/team/anchoring.d.ts.map +1 -0
  183. package/dist/team/anchoring.js +26 -0
  184. package/dist/team/anchoring.js.map +1 -0
  185. package/dist/team/config.d.ts +16 -0
  186. package/dist/team/config.d.ts.map +1 -0
  187. package/dist/team/config.js +37 -0
  188. package/dist/team/config.js.map +1 -0
  189. package/dist/team/decision.d.ts +255 -0
  190. package/dist/team/decision.d.ts.map +1 -0
  191. package/dist/team/decision.js +82 -0
  192. package/dist/team/decision.js.map +1 -0
  193. package/dist/team/decisions.d.ts +98 -0
  194. package/dist/team/decisions.d.ts.map +1 -0
  195. package/dist/team/decisions.js +166 -0
  196. package/dist/team/decisions.js.map +1 -0
  197. package/dist/team/history.d.ts +27 -0
  198. package/dist/team/history.d.ts.map +1 -0
  199. package/dist/team/history.js +49 -0
  200. package/dist/team/history.js.map +1 -0
  201. package/dist/team/prompt.d.ts +20 -0
  202. package/dist/team/prompt.d.ts.map +1 -0
  203. package/dist/team/prompt.js +44 -0
  204. package/dist/team/prompt.js.map +1 -0
  205. package/dist/team/repository.d.ts +12 -0
  206. package/dist/team/repository.d.ts.map +1 -0
  207. package/dist/team/repository.js +32 -0
  208. package/dist/team/repository.js.map +1 -0
  209. package/dist/team/secrets.d.ts +3 -0
  210. package/dist/team/secrets.d.ts.map +1 -0
  211. package/dist/team/secrets.js +18 -0
  212. package/dist/team/secrets.js.map +1 -0
  213. package/dist/team/tools.d.ts +82 -0
  214. package/dist/team/tools.d.ts.map +1 -0
  215. package/dist/team/tools.js +46 -0
  216. package/dist/team/tools.js.map +1 -0
  217. package/dist/team/types.d.ts +178 -0
  218. package/dist/team/types.d.ts.map +1 -0
  219. package/dist/team/types.js +60 -0
  220. package/dist/team/types.js.map +1 -0
  221. package/dist/team/visibility.d.ts +9 -0
  222. package/dist/team/visibility.d.ts.map +1 -0
  223. package/dist/team/visibility.js +36 -0
  224. package/dist/team/visibility.js.map +1 -0
  225. package/package.json +1 -1
  226. package/schema/api.json +4040 -1136
@@ -0,0 +1,255 @@
1
+ import { z } from 'zod';
2
+ /** `asked`: the user answered a question or approved a plan; `requested`: the user asked for it; `agent`: the agent's own call. */
3
+ export declare const DecisionOrigin: z.ZodEnum<{
4
+ agent: "agent";
5
+ asked: "asked";
6
+ requested: "requested";
7
+ }>;
8
+ export type DecisionOrigin = z.infer<typeof DecisionOrigin>;
9
+ /** How a decision came about, in the words its user reads in the apps. */
10
+ export declare const ORIGIN_WORDS: Record<DecisionOrigin, string>;
11
+ /** A `draft` is its author's alone until a commit carries it; `superseded` and `archived` bind no one. */
12
+ export declare const DecisionStatus: z.ZodEnum<{
13
+ active: "active";
14
+ archived: "archived";
15
+ draft: "draft";
16
+ superseded: "superseded";
17
+ }>;
18
+ export type DecisionStatus = z.infer<typeof DecisionStatus>;
19
+ /** A commit a decision is in; the pull request fields come from the GitHub App, when a project has it. */
20
+ export declare const DecisionAnchor: z.ZodObject<{
21
+ sha: z.ZodString;
22
+ kind: z.ZodEnum<{
23
+ commit: "commit";
24
+ merge: "merge";
25
+ }>;
26
+ pullRequest: z.ZodNullable<z.ZodNumber>;
27
+ pullRequestState: z.ZodNullable<z.ZodEnum<{
28
+ closed: "closed";
29
+ merged: "merged";
30
+ open: "open";
31
+ }>>;
32
+ baseBranch: z.ZodNullable<z.ZodString>;
33
+ }, z.core.$strip>;
34
+ export type DecisionAnchor = z.infer<typeof DecisionAnchor>;
35
+ /** Why a project's code is the way it is, as an agent recorded it, at api.jinion.co. */
36
+ export declare const Decision: z.ZodObject<{
37
+ id: z.ZodString;
38
+ title: z.ZodString;
39
+ decision: z.ZodString;
40
+ reason: z.ZodString;
41
+ turnedDown: z.ZodNullable<z.ZodString>;
42
+ origin: z.ZodEnum<{
43
+ agent: "agent";
44
+ asked: "asked";
45
+ requested: "requested";
46
+ }>;
47
+ status: z.ZodEnum<{
48
+ active: "active";
49
+ archived: "archived";
50
+ draft: "draft";
51
+ superseded: "superseded";
52
+ }>;
53
+ author: z.ZodNullable<z.ZodObject<{
54
+ id: z.ZodNumber;
55
+ name: z.ZodNullable<z.ZodString>;
56
+ email: z.ZodString;
57
+ }, z.core.$strip>>;
58
+ backend: z.ZodString;
59
+ model: z.ZodString;
60
+ branch: z.ZodNullable<z.ZodString>;
61
+ baseCommit: z.ZodNullable<z.ZodString>;
62
+ paths: z.ZodArray<z.ZodString>;
63
+ symbols: z.ZodArray<z.ZodString>;
64
+ supersedes: z.ZodNullable<z.ZodString>;
65
+ supersededBy: z.ZodNullable<z.ZodString>;
66
+ anchors: z.ZodArray<z.ZodObject<{
67
+ sha: z.ZodString;
68
+ kind: z.ZodEnum<{
69
+ commit: "commit";
70
+ merge: "merge";
71
+ }>;
72
+ pullRequest: z.ZodNullable<z.ZodNumber>;
73
+ pullRequestState: z.ZodNullable<z.ZodEnum<{
74
+ closed: "closed";
75
+ merged: "merged";
76
+ open: "open";
77
+ }>>;
78
+ baseBranch: z.ZodNullable<z.ZodString>;
79
+ }, z.core.$strip>>;
80
+ createdAt: z.ZodString;
81
+ updatedAt: z.ZodString;
82
+ version: z.ZodString;
83
+ }, z.core.$strip>;
84
+ export type Decision = z.infer<typeof Decision>;
85
+ /** What a client sends to record one; `anchors` when a commit already carries it, which makes it active at once. */
86
+ export declare const DecisionDraft: z.ZodObject<{
87
+ title: z.ZodString;
88
+ decision: z.ZodString;
89
+ reason: z.ZodString;
90
+ turnedDown: z.ZodOptional<z.ZodString>;
91
+ origin: z.ZodEnum<{
92
+ agent: "agent";
93
+ asked: "asked";
94
+ requested: "requested";
95
+ }>;
96
+ backend: z.ZodString;
97
+ model: z.ZodString;
98
+ branch: z.ZodOptional<z.ZodString>;
99
+ baseCommit: z.ZodOptional<z.ZodString>;
100
+ paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
101
+ symbols: z.ZodOptional<z.ZodArray<z.ZodString>>;
102
+ anchors: z.ZodOptional<z.ZodArray<z.ZodString>>;
103
+ supersedes: z.ZodOptional<z.ZodString>;
104
+ repository: z.ZodObject<{
105
+ remoteUrl: z.ZodString;
106
+ rootCommit: z.ZodString;
107
+ }, z.core.$strip>;
108
+ }, z.core.$strip>;
109
+ export type DecisionDraft = z.infer<typeof DecisionDraft>;
110
+ /** A decision deleted since a client synced it, which it drops from its copy. */
111
+ export declare const DecisionTombstone: z.ZodObject<{
112
+ id: z.ZodString;
113
+ deleted: z.ZodLiteral<true>;
114
+ version: z.ZodString;
115
+ }, z.core.$strip>;
116
+ export type DecisionTombstone = z.infer<typeof DecisionTombstone>;
117
+ /**
118
+ * Where a decision stands for the HEAD a session works on, from git alone. `binding`: a commit HEAD has carries it, so
119
+ * the agent keeps to it. `not-pulled`: the branch's upstream has it, as of the last fetch. `other-branch`: it waits on
120
+ * another branch or in a pull request. `dropped`: archived, superseded, or its pull request closed unmerged; not shown.
121
+ * `draft`: the user's own, not in a commit yet.
122
+ */
123
+ export declare const DecisionState: z.ZodEnum<{
124
+ binding: "binding";
125
+ draft: "draft";
126
+ dropped: "dropped";
127
+ "not-pulled": "not-pulled";
128
+ "other-branch": "other-branch";
129
+ }>;
130
+ export type DecisionState = z.infer<typeof DecisionState>;
131
+ /** A session's view of the project's decisions: those shown, in the order of their states, and how many are in each. */
132
+ export declare const SortedDecisions: z.ZodObject<{
133
+ decisions: z.ZodArray<z.ZodObject<{
134
+ id: z.ZodString;
135
+ title: z.ZodString;
136
+ decision: z.ZodString;
137
+ reason: z.ZodString;
138
+ turnedDown: z.ZodNullable<z.ZodString>;
139
+ origin: z.ZodEnum<{
140
+ agent: "agent";
141
+ asked: "asked";
142
+ requested: "requested";
143
+ }>;
144
+ status: z.ZodEnum<{
145
+ active: "active";
146
+ archived: "archived";
147
+ draft: "draft";
148
+ superseded: "superseded";
149
+ }>;
150
+ author: z.ZodNullable<z.ZodObject<{
151
+ id: z.ZodNumber;
152
+ name: z.ZodNullable<z.ZodString>;
153
+ email: z.ZodString;
154
+ }, z.core.$strip>>;
155
+ backend: z.ZodString;
156
+ model: z.ZodString;
157
+ branch: z.ZodNullable<z.ZodString>;
158
+ baseCommit: z.ZodNullable<z.ZodString>;
159
+ paths: z.ZodArray<z.ZodString>;
160
+ symbols: z.ZodArray<z.ZodString>;
161
+ supersedes: z.ZodNullable<z.ZodString>;
162
+ supersededBy: z.ZodNullable<z.ZodString>;
163
+ anchors: z.ZodArray<z.ZodObject<{
164
+ sha: z.ZodString;
165
+ kind: z.ZodEnum<{
166
+ commit: "commit";
167
+ merge: "merge";
168
+ }>;
169
+ pullRequest: z.ZodNullable<z.ZodNumber>;
170
+ pullRequestState: z.ZodNullable<z.ZodEnum<{
171
+ closed: "closed";
172
+ merged: "merged";
173
+ open: "open";
174
+ }>>;
175
+ baseBranch: z.ZodNullable<z.ZodString>;
176
+ }, z.core.$strip>>;
177
+ createdAt: z.ZodString;
178
+ updatedAt: z.ZodString;
179
+ version: z.ZodString;
180
+ state: z.ZodEnum<{
181
+ binding: "binding";
182
+ draft: "draft";
183
+ dropped: "dropped";
184
+ "not-pulled": "not-pulled";
185
+ "other-branch": "other-branch";
186
+ }>;
187
+ }, z.core.$strip>>;
188
+ counts: z.ZodRecord<z.ZodEnum<{
189
+ binding: "binding";
190
+ draft: "draft";
191
+ dropped: "dropped";
192
+ "not-pulled": "not-pulled";
193
+ "other-branch": "other-branch";
194
+ }>, z.ZodNumber>;
195
+ }, z.core.$strip>;
196
+ export type SortedDecisions = z.infer<typeof SortedDecisions>;
197
+ /** What changed since a cursor, oldest first; `more` asks for the next page from `cursor`. */
198
+ export declare const DecisionChanges: z.ZodObject<{
199
+ changes: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
200
+ id: z.ZodString;
201
+ title: z.ZodString;
202
+ decision: z.ZodString;
203
+ reason: z.ZodString;
204
+ turnedDown: z.ZodNullable<z.ZodString>;
205
+ origin: z.ZodEnum<{
206
+ agent: "agent";
207
+ asked: "asked";
208
+ requested: "requested";
209
+ }>;
210
+ status: z.ZodEnum<{
211
+ active: "active";
212
+ archived: "archived";
213
+ draft: "draft";
214
+ superseded: "superseded";
215
+ }>;
216
+ author: z.ZodNullable<z.ZodObject<{
217
+ id: z.ZodNumber;
218
+ name: z.ZodNullable<z.ZodString>;
219
+ email: z.ZodString;
220
+ }, z.core.$strip>>;
221
+ backend: z.ZodString;
222
+ model: z.ZodString;
223
+ branch: z.ZodNullable<z.ZodString>;
224
+ baseCommit: z.ZodNullable<z.ZodString>;
225
+ paths: z.ZodArray<z.ZodString>;
226
+ symbols: z.ZodArray<z.ZodString>;
227
+ supersedes: z.ZodNullable<z.ZodString>;
228
+ supersededBy: z.ZodNullable<z.ZodString>;
229
+ anchors: z.ZodArray<z.ZodObject<{
230
+ sha: z.ZodString;
231
+ kind: z.ZodEnum<{
232
+ commit: "commit";
233
+ merge: "merge";
234
+ }>;
235
+ pullRequest: z.ZodNullable<z.ZodNumber>;
236
+ pullRequestState: z.ZodNullable<z.ZodEnum<{
237
+ closed: "closed";
238
+ merged: "merged";
239
+ open: "open";
240
+ }>>;
241
+ baseBranch: z.ZodNullable<z.ZodString>;
242
+ }, z.core.$strip>>;
243
+ createdAt: z.ZodString;
244
+ updatedAt: z.ZodString;
245
+ version: z.ZodString;
246
+ }, z.core.$strip>, z.ZodObject<{
247
+ id: z.ZodString;
248
+ deleted: z.ZodLiteral<true>;
249
+ version: z.ZodString;
250
+ }, z.core.$strip>]>>;
251
+ cursor: z.ZodString;
252
+ more: z.ZodBoolean;
253
+ }, z.core.$strip>;
254
+ export type DecisionChanges = z.infer<typeof DecisionChanges>;
255
+ //# sourceMappingURL=decision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision.d.ts","sourceRoot":"","sources":["../../src/team/decision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,mIAAmI;AACnI,eAAO,MAAM,cAAc;;;;EAA0C,CAAC;AAEtE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D,0EAA0E;AAC1E,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAmF,CAAC;AAE5I,0GAA0G;AAC1G,eAAO,MAAM,cAAc;;;;;EAAwD,CAAC;AAEpF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D,0GAA0G;AAC1G,eAAO,MAAM,cAAc;;;;;;;;;;;;;iBAOzB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D,wFAAwF;AACxF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyBnB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEhD,oHAAoH;AACpH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;iBAgBxB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE1D,iFAAiF;AACjF,eAAO,MAAM,iBAAiB;;;;iBAA8E,CAAC;AAE7G,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE;;;;;GAKG;AACH,eAAO,MAAM,aAAa;;;;;;EAAwE,CAAC;AAEnG,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE1D,wHAAwH;AACxH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAG1B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,8FAA8F;AAC9F,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAI1B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { z } from 'zod';
2
+ /** `asked`: the user answered a question or approved a plan; `requested`: the user asked for it; `agent`: the agent's own call. */
3
+ export const DecisionOrigin = z.enum(['asked', 'requested', 'agent']);
4
+ /** How a decision came about, in the words its user reads in the apps. */
5
+ export const ORIGIN_WORDS = { requested: 'you asked for it', asked: 'from your answer', agent: 'its call' };
6
+ /** A `draft` is its author's alone until a commit carries it; `superseded` and `archived` bind no one. */
7
+ export const DecisionStatus = z.enum(['draft', 'active', 'superseded', 'archived']);
8
+ /** A commit a decision is in; the pull request fields come from the GitHub App, when a project has it. */
9
+ export const DecisionAnchor = z.object({
10
+ sha: z.string(),
11
+ /** `commit` from its author's client, `merge` from the GitHub App after a squash or rebase merge. */
12
+ kind: z.enum(['commit', 'merge']),
13
+ pullRequest: z.number().int().nullable(),
14
+ pullRequestState: z.enum(['open', 'merged', 'closed']).nullable(),
15
+ baseBranch: z.string().nullable(),
16
+ });
17
+ /** Why a project's code is the way it is, as an agent recorded it, at api.jinion.co. */
18
+ export const Decision = z.object({
19
+ id: z.string(),
20
+ title: z.string(),
21
+ decision: z.string(),
22
+ reason: z.string(),
23
+ /** The alternatives and why they lost. */
24
+ turnedDown: z.string().nullable(),
25
+ origin: DecisionOrigin,
26
+ status: DecisionStatus,
27
+ /** Null once its author's account is gone. */
28
+ author: z.object({ id: z.number(), name: z.string().nullable(), email: z.string() }).nullable(),
29
+ backend: z.string(),
30
+ model: z.string(),
31
+ /** Where it was made, and HEAD then. */
32
+ branch: z.string().nullable(),
33
+ baseCommit: z.string().nullable(),
34
+ paths: z.array(z.string()),
35
+ symbols: z.array(z.string()),
36
+ supersedes: z.string().nullable(),
37
+ supersededBy: z.string().nullable(),
38
+ anchors: z.array(DecisionAnchor),
39
+ createdAt: z.string(),
40
+ updatedAt: z.string(),
41
+ /** The sync cursor this change has; a later change has a larger one. */
42
+ version: z.string(),
43
+ });
44
+ /** What a client sends to record one; `anchors` when a commit already carries it, which makes it active at once. */
45
+ export const DecisionDraft = z.object({
46
+ title: z.string(),
47
+ decision: z.string(),
48
+ reason: z.string(),
49
+ turnedDown: z.string().optional(),
50
+ origin: DecisionOrigin,
51
+ backend: z.string(),
52
+ model: z.string(),
53
+ branch: z.string().optional(),
54
+ baseCommit: z.string().optional(),
55
+ paths: z.array(z.string()).optional(),
56
+ symbols: z.array(z.string()).optional(),
57
+ anchors: z.array(z.string()).optional(),
58
+ supersedes: z.string().optional(),
59
+ /** The clone it is written from, which has to be the project's repository. */
60
+ repository: z.object({ remoteUrl: z.string(), rootCommit: z.string() }),
61
+ });
62
+ /** A decision deleted since a client synced it, which it drops from its copy. */
63
+ export const DecisionTombstone = z.object({ id: z.string(), deleted: z.literal(true), version: z.string() });
64
+ /**
65
+ * Where a decision stands for the HEAD a session works on, from git alone. `binding`: a commit HEAD has carries it, so
66
+ * the agent keeps to it. `not-pulled`: the branch's upstream has it, as of the last fetch. `other-branch`: it waits on
67
+ * another branch or in a pull request. `dropped`: archived, superseded, or its pull request closed unmerged; not shown.
68
+ * `draft`: the user's own, not in a commit yet.
69
+ */
70
+ export const DecisionState = z.enum(['binding', 'not-pulled', 'other-branch', 'dropped', 'draft']);
71
+ /** A session's view of the project's decisions: those shown, in the order of their states, and how many are in each. */
72
+ export const SortedDecisions = z.object({
73
+ decisions: z.array(Decision.extend({ state: DecisionState })),
74
+ counts: z.record(DecisionState, z.number().int()),
75
+ });
76
+ /** What changed since a cursor, oldest first; `more` asks for the next page from `cursor`. */
77
+ export const DecisionChanges = z.object({
78
+ changes: z.array(z.union([Decision, DecisionTombstone])),
79
+ cursor: z.string(),
80
+ more: z.boolean(),
81
+ });
82
+ //# sourceMappingURL=decision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/team/decision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,mIAAmI;AACnI,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAItE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,YAAY,GAAmC,EAAE,SAAS,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAE5I,0GAA0G;AAC1G,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;AAIpF,0GAA0G;AAC1G,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,qGAAqG;IACrG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACxC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAIH,wFAAwF;AACxF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,0CAA0C;IAC1C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,cAAc;IACtB,8CAA8C;IAC9C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC/F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,wCAAwC;IACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,wEAAwE;IACxE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAIH,oHAAoH;AACpH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACrC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,8EAA8E;IAC9E,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;CACxE,CAAC,CAAC;AAIH,iFAAiF;AACjF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAI7G;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAInG,wHAAwH;AACxH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;CAClD,CAAC,CAAC;AAIH,8FAA8F;AAC9F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;CAClB,CAAC,CAAC"}
@@ -0,0 +1,98 @@
1
+ import type { JinionAccount } from '../jinion-account/account.js';
2
+ import type { Decision, DecisionDraft } from './decision.js';
3
+ import type { RepositoryIdentity } from './repository.js';
4
+ /**
5
+ * The project's decisions, as a copy under ~/.jinion that its sessions read without a network: never in the repository,
6
+ * kept up to date from api.jinion.co, and gone once the user loses access.
7
+ */
8
+ export declare class DecisionStore {
9
+ readonly projectId: string;
10
+ private readonly account;
11
+ /** After every change to the copy, such as one a sync took in. */
12
+ private readonly changed;
13
+ private readonly file;
14
+ constructor(projectId: string, account: JinionAccount,
15
+ /** After every change to the copy, such as one a sync took in. */
16
+ changed?: () => void);
17
+ all(): {
18
+ id: string;
19
+ title: string;
20
+ decision: string;
21
+ reason: string;
22
+ turnedDown: string | null;
23
+ origin: "agent" | "asked" | "requested";
24
+ status: "active" | "archived" | "draft" | "superseded";
25
+ author: {
26
+ id: number;
27
+ name: string | null;
28
+ email: string;
29
+ } | null;
30
+ backend: string;
31
+ model: string;
32
+ branch: string | null;
33
+ baseCommit: string | null;
34
+ paths: string[];
35
+ symbols: string[];
36
+ supersedes: string | null;
37
+ supersededBy: string | null;
38
+ anchors: {
39
+ sha: string;
40
+ kind: "commit" | "merge";
41
+ pullRequest: number | null;
42
+ pullRequestState: "closed" | "merged" | "open" | null;
43
+ baseBranch: string | null;
44
+ }[];
45
+ createdAt: string;
46
+ updatedAt: string;
47
+ version: string;
48
+ }[];
49
+ get(id: string): {
50
+ id: string;
51
+ title: string;
52
+ decision: string;
53
+ reason: string;
54
+ turnedDown: string | null;
55
+ origin: "agent" | "asked" | "requested";
56
+ status: "active" | "archived" | "draft" | "superseded";
57
+ author: {
58
+ id: number;
59
+ name: string | null;
60
+ email: string;
61
+ } | null;
62
+ backend: string;
63
+ model: string;
64
+ branch: string | null;
65
+ baseCommit: string | null;
66
+ paths: string[];
67
+ symbols: string[];
68
+ supersedes: string | null;
69
+ supersededBy: string | null;
70
+ anchors: {
71
+ sha: string;
72
+ kind: "commit" | "merge";
73
+ pullRequest: number | null;
74
+ pullRequestState: "closed" | "merged" | "open" | null;
75
+ baseBranch: string | null;
76
+ }[];
77
+ createdAt: string;
78
+ updatedAt: string;
79
+ version: string;
80
+ } | undefined;
81
+ /** Sends what waits, then takes in every change since the last sync. */
82
+ sync(): Promise<void>;
83
+ /** Sent at once; while the API can't be reached, kept here under a local id and sent with the next sync. */
84
+ record(draft: DecisionDraft): Promise<Decision>;
85
+ delete(id: string): Promise<void>;
86
+ /** Its author's client telling which commit carries it; offline, it is anchored again at the next check. */
87
+ anchor(id: string, shas: string[], repository: RepositoryIdentity): Promise<void>;
88
+ /** As the user lost access to the project, or signed out. */
89
+ purge(): void;
90
+ /** The waiting writes in order, until the API can't be reached again; one it refuses for good is dropped. */
91
+ private flush;
92
+ private send;
93
+ /** How a decision recorded offline shows until the API has it: its author's draft. */
94
+ private waiting;
95
+ private saved;
96
+ private update;
97
+ }
98
+ //# sourceMappingURL=decisions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisions.d.ts","sourceRoot":"","sources":["../../src/team/decisions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAgB1D;;;GAGG;AACH,qBAAa,aAAa;IAItB,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAE9B,YACW,SAAS,EAAE,MAAM,EACT,OAAO,EAAE,aAAa;IACvC,kEAAkE;IACjD,OAAO,GAAE,MAAM,IAAe,EAGhD;IAED,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAEF;IAED,GAAG,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAIb;IAED,wEAAwE;IAClE,IAAI,kBAmBT;IAED,4GAA4G;IACtG,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgBpD;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,iBAkBtB;IAED,4GAA4G;IACtG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,kBAAkB,iBAQtE;IAED,6DAA6D;IAC7D,KAAK,SAEJ;IAED,6GAA6G;YAC/F,KAAK;YAgBL,IAAI;IAYlB,sFAAsF;IACtF,OAAO,CAAC,OAAO;IA4Bf,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,MAAM;CAIf"}
@@ -0,0 +1,166 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { rmSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { ApiRefusal } from '../jinion-account/api.js';
5
+ import { readJson, updateJson } from '../lib/json-file.js';
6
+ import { jinionHome } from '../lib/paths.js';
7
+ const EMPTY = { cursor: '0', decisions: {}, queue: [], aliases: {} };
8
+ /**
9
+ * The project's decisions, as a copy under ~/.jinion that its sessions read without a network: never in the repository,
10
+ * kept up to date from api.jinion.co, and gone once the user loses access.
11
+ */
12
+ export class DecisionStore {
13
+ projectId;
14
+ account;
15
+ changed;
16
+ file;
17
+ constructor(projectId, account,
18
+ /** After every change to the copy, such as one a sync took in. */
19
+ changed = () => { }) {
20
+ this.projectId = projectId;
21
+ this.account = account;
22
+ this.changed = changed;
23
+ this.file = join(jinionHome(), 'team', projectId, 'decisions.json');
24
+ }
25
+ all() {
26
+ return Object.values(this.saved().decisions);
27
+ }
28
+ get(id) {
29
+ const saved = this.saved();
30
+ return saved.decisions[saved.aliases[id] ?? id];
31
+ }
32
+ /** Sends what waits, then takes in every change since the last sync. */
33
+ async sync() {
34
+ await this.flush();
35
+ for (let more = true; more;) {
36
+ const page = await this.account.decisionChanges(this.projectId, this.saved().cursor);
37
+ this.update((saved) => {
38
+ const decisions = { ...saved.decisions };
39
+ for (const change of page.changes) {
40
+ if ('deleted' in change)
41
+ delete decisions[change.id];
42
+ else
43
+ decisions[change.id] = change;
44
+ }
45
+ return { ...saved, decisions, cursor: page.cursor };
46
+ });
47
+ more = page.more;
48
+ }
49
+ }
50
+ /** Sent at once; while the API can't be reached, kept here under a local id and sent with the next sync. */
51
+ async record(draft) {
52
+ try {
53
+ const made = await this.account.recordDecision(this.projectId, draft);
54
+ this.update((saved) => ({ ...saved, decisions: { ...saved.decisions, [made.id]: made } }));
55
+ return made;
56
+ }
57
+ catch (error) {
58
+ if (!unreachable(error))
59
+ throw error;
60
+ const waiting = this.waiting(draft);
61
+ this.update((saved) => ({ ...saved, decisions: { ...saved.decisions, [waiting.id]: waiting }, queue: [...saved.queue, { kind: 'record', localId: waiting.id, draft }] }));
62
+ return waiting;
63
+ }
64
+ }
65
+ async delete(id) {
66
+ const saved = this.saved();
67
+ const known = saved.aliases[id] ?? id;
68
+ // Recorded and deleted while offline: the API never needs to hear of it.
69
+ if (saved.queue.some((write) => write.kind === 'record' && write.localId === known)) {
70
+ return this.update((current) => ({ ...current, decisions: without(current.decisions, known), queue: current.queue.filter((write) => write.kind !== 'record' || write.localId !== known) }));
71
+ }
72
+ this.update((current) => ({ ...current, decisions: without(current.decisions, known) }));
73
+ try {
74
+ await this.account.deleteDecision(this.projectId, known);
75
+ }
76
+ catch (error) {
77
+ if (!unreachable(error))
78
+ throw error;
79
+ this.update((current) => ({ ...current, queue: [...current.queue, { kind: 'delete', id: known }] }));
80
+ }
81
+ }
82
+ /** Its author's client telling which commit carries it; offline, it is anchored again at the next check. */
83
+ async anchor(id, shas, repository) {
84
+ try {
85
+ const anchored = await this.account.anchorDecision(this.projectId, id, shas, repository);
86
+ this.update((saved) => ({ ...saved, decisions: { ...saved.decisions, [anchored.id]: anchored } }));
87
+ }
88
+ catch (error) {
89
+ if (!unreachable(error))
90
+ throw error;
91
+ }
92
+ }
93
+ /** As the user lost access to the project, or signed out. */
94
+ purge() {
95
+ rmSync(join(this.file, '..'), { recursive: true, force: true });
96
+ }
97
+ /** The waiting writes in order, until the API can't be reached again; one it refuses for good is dropped. */
98
+ async flush() {
99
+ for (let write = this.saved().queue[0]; write; write = this.saved().queue[0]) {
100
+ try {
101
+ await this.send(write);
102
+ }
103
+ catch (error) {
104
+ if (unreachable(error))
105
+ return;
106
+ const refused = write;
107
+ if (refused.kind === 'record')
108
+ this.update((saved) => ({ ...saved, decisions: without(saved.decisions, refused.localId) }));
109
+ }
110
+ this.update((saved) => ({ ...saved, queue: saved.queue.slice(1) }));
111
+ }
112
+ }
113
+ async send(write) {
114
+ if (write.kind === 'delete')
115
+ return this.account.deleteDecision(this.projectId, write.id);
116
+ const made = await this.account.recordDecision(this.projectId, write.draft);
117
+ this.update((saved) => ({
118
+ ...saved,
119
+ decisions: { ...without(saved.decisions, write.localId), [made.id]: made },
120
+ aliases: { ...saved.aliases, [write.localId]: made.id },
121
+ }));
122
+ }
123
+ /** How a decision recorded offline shows until the API has it: its author's draft. */
124
+ waiting(draft) {
125
+ const user = this.account.user();
126
+ const now = new Date().toISOString();
127
+ return {
128
+ id: `local_${randomUUID()}`,
129
+ title: draft.title,
130
+ decision: draft.decision,
131
+ reason: draft.reason,
132
+ turnedDown: draft.turnedDown ?? null,
133
+ origin: draft.origin,
134
+ status: 'draft',
135
+ author: user && { id: user.id, name: user.name, email: user.email },
136
+ backend: draft.backend,
137
+ model: draft.model,
138
+ branch: draft.branch ?? null,
139
+ baseCommit: draft.baseCommit ?? null,
140
+ paths: draft.paths ?? [],
141
+ symbols: draft.symbols ?? [],
142
+ supersedes: draft.supersedes ?? null,
143
+ supersededBy: null,
144
+ anchors: [],
145
+ createdAt: now,
146
+ updatedAt: now,
147
+ version: '0',
148
+ };
149
+ }
150
+ saved() {
151
+ return readJson(this.file, EMPTY);
152
+ }
153
+ update(change) {
154
+ updateJson(this.file, EMPTY, change);
155
+ this.changed();
156
+ }
157
+ }
158
+ /** Offline, or api.jinion.co down; a refusal for what was sent is the caller's to hear. */
159
+ function unreachable(error) {
160
+ return !(error instanceof ApiRefusal) || error.status >= 500;
161
+ }
162
+ function without(decisions, id) {
163
+ const { [id]: _, ...rest } = decisions;
164
+ return rest;
165
+ }
166
+ //# sourceMappingURL=decisions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisions.js","sourceRoot":"","sources":["../../src/team/decisions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /** Runs git in `folder` and answers with what it printed; rejects when git fails. */
2
+ export type Git = (folder: string, args: string[]) => Promise<string>;
3
+ export declare function runGit(folder: string, args: string[]): Promise<string>;
4
+ /** Which commits a folder has: HEAD's, and those its branch's upstream has beyond them, as of the last fetch. */
5
+ export interface Ancestry {
6
+ head: string;
7
+ /** Missing when HEAD is detached. */
8
+ branch?: string;
9
+ /** HEAD and every commit it descends from. */
10
+ inHead: ReadonlySet<string>;
11
+ upstreamOnly: ReadonlySet<string>;
12
+ }
13
+ /**
14
+ * Each folder's ancestry, read in two passes of git rather than one check per decision, and kept until git says
15
+ * something moved, so sorting the decisions again costs no git at all.
16
+ */
17
+ export declare class History {
18
+ private readonly git;
19
+ private readonly read;
20
+ constructor(git?: Git);
21
+ /** Undefined outside git, or before a first commit. */
22
+ of(folder: string): Promise<Ancestry | undefined>;
23
+ /** As HEAD, a branch or a fetch moved. */
24
+ forget(): void;
25
+ private readAncestry;
26
+ }
27
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/team/history.ts"],"names":[],"mappings":"AAKA,qFAAqF;AACrF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEtE,wBAAsB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,mBAE1D;AAED,iHAAiH;AACjH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5B,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,OAAO;IAGN,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoD;IAEzE,YAA6B,GAAG,GAAE,GAAY,EAAI;IAElD,uDAAuD;IACvD,EAAE,CAAC,MAAM,EAAE,MAAM,iCAShB;IAED,0CAA0C;IAC1C,MAAM,SAEL;YAEa,YAAY;CAe3B"}