@kernhq/module-inventory 0.2.0 → 0.4.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 (198) hide show
  1. package/README.md +106 -25
  2. package/dist/contract/capabilities.d.ts +4 -4
  3. package/dist/contract/capabilities.d.ts.map +1 -1
  4. package/dist/contract/capabilities.js +51 -9
  5. package/dist/contract/capabilities.js.map +1 -1
  6. package/dist/contract/events.d.ts +43 -0
  7. package/dist/contract/events.d.ts.map +1 -1
  8. package/dist/contract/events.js +40 -0
  9. package/dist/contract/events.js.map +1 -1
  10. package/dist/contract/index.d.ts +1 -0
  11. package/dist/contract/index.d.ts.map +1 -1
  12. package/dist/contract/index.js +1 -0
  13. package/dist/contract/index.js.map +1 -1
  14. package/dist/contract/models.d.ts +345 -0
  15. package/dist/contract/models.d.ts.map +1 -1
  16. package/dist/contract/models.js +245 -0
  17. package/dist/contract/models.js.map +1 -1
  18. package/dist/contract/notifications.d.ts +24 -0
  19. package/dist/contract/notifications.d.ts.map +1 -0
  20. package/dist/contract/notifications.js +72 -0
  21. package/dist/contract/notifications.js.map +1 -0
  22. package/dist/contract/permissions.d.ts +52 -2
  23. package/dist/contract/permissions.d.ts.map +1 -1
  24. package/dist/contract/permissions.js +55 -2
  25. package/dist/contract/permissions.js.map +1 -1
  26. package/dist/contract/router.d.ts +1108 -0
  27. package/dist/contract/router.d.ts.map +1 -1
  28. package/dist/contract/router.js +253 -1
  29. package/dist/contract/router.js.map +1 -1
  30. package/dist/contract/settings.d.ts +2 -0
  31. package/dist/contract/settings.d.ts.map +1 -1
  32. package/dist/contract/settings.js +24 -4
  33. package/dist/contract/settings.js.map +1 -1
  34. package/dist/server/index.d.ts +8 -4
  35. package/dist/server/index.d.ts.map +1 -1
  36. package/dist/server/index.js +289 -5
  37. package/dist/server/index.js.map +1 -1
  38. package/dist/server/jobs.d.ts +48 -0
  39. package/dist/server/jobs.d.ts.map +1 -0
  40. package/dist/server/jobs.js +358 -0
  41. package/dist/server/jobs.js.map +1 -0
  42. package/dist/server/router.d.ts +1392 -0
  43. package/dist/server/router.d.ts.map +1 -1
  44. package/dist/server/router.js +385 -7
  45. package/dist/server/router.js.map +1 -1
  46. package/dist/server/schema.d.ts +134 -1
  47. package/dist/server/schema.d.ts.map +1 -1
  48. package/dist/server/schema.js +169 -4
  49. package/dist/server/schema.js.map +1 -1
  50. package/dist/server/services/assets.d.ts +69 -3
  51. package/dist/server/services/assets.d.ts.map +1 -1
  52. package/dist/server/services/assets.js +199 -31
  53. package/dist/server/services/assets.js.map +1 -1
  54. package/dist/server/services/attachments.d.ts +80 -0
  55. package/dist/server/services/attachments.d.ts.map +1 -0
  56. package/dist/server/services/attachments.js +182 -0
  57. package/dist/server/services/attachments.js.map +1 -0
  58. package/dist/server/services/audience.d.ts +15 -0
  59. package/dist/server/services/audience.d.ts.map +1 -0
  60. package/dist/server/services/audience.js +64 -0
  61. package/dist/server/services/audience.js.map +1 -0
  62. package/dist/server/services/categories.d.ts +157 -0
  63. package/dist/server/services/categories.d.ts.map +1 -0
  64. package/dist/server/services/categories.js +309 -0
  65. package/dist/server/services/categories.js.map +1 -0
  66. package/dist/server/services/cursor.d.ts +68 -0
  67. package/dist/server/services/cursor.d.ts.map +1 -0
  68. package/dist/server/services/cursor.js +39 -0
  69. package/dist/server/services/cursor.js.map +1 -0
  70. package/dist/server/services/custody.d.ts +175 -0
  71. package/dist/server/services/custody.d.ts.map +1 -0
  72. package/dist/server/services/custody.js +367 -0
  73. package/dist/server/services/custody.js.map +1 -0
  74. package/dist/server/services/db-errors.d.ts +7 -0
  75. package/dist/server/services/db-errors.d.ts.map +1 -0
  76. package/dist/server/services/db-errors.js +32 -0
  77. package/dist/server/services/db-errors.js.map +1 -0
  78. package/dist/server/services/index.d.ts +16 -0
  79. package/dist/server/services/index.d.ts.map +1 -1
  80. package/dist/server/services/index.js +25 -1
  81. package/dist/server/services/index.js.map +1 -1
  82. package/dist/server/services/members.d.ts +27 -0
  83. package/dist/server/services/members.d.ts.map +1 -0
  84. package/dist/server/services/members.js +39 -0
  85. package/dist/server/services/members.js.map +1 -0
  86. package/dist/server/services/notify.d.ts +43 -1
  87. package/dist/server/services/notify.d.ts.map +1 -1
  88. package/dist/server/services/notify.js +47 -5
  89. package/dist/server/services/notify.js.map +1 -1
  90. package/dist/server/services/offboarding.d.ts +70 -0
  91. package/dist/server/services/offboarding.d.ts.map +1 -0
  92. package/dist/server/services/offboarding.js +116 -0
  93. package/dist/server/services/offboarding.js.map +1 -0
  94. package/dist/server/services/repairs.d.ts +204 -0
  95. package/dist/server/services/repairs.d.ts.map +1 -0
  96. package/dist/server/services/repairs.js +476 -0
  97. package/dist/server/services/repairs.js.map +1 -0
  98. package/dist/server/services/search.d.ts +85 -0
  99. package/dist/server/services/search.d.ts.map +1 -0
  100. package/dist/server/services/search.js +142 -0
  101. package/dist/server/services/search.js.map +1 -0
  102. package/dist/server/services/stats.d.ts +42 -0
  103. package/dist/server/services/stats.d.ts.map +1 -0
  104. package/dist/server/services/stats.js +80 -0
  105. package/dist/server/services/stats.js.map +1 -0
  106. package/dist/server/services/status.d.ts +102 -0
  107. package/dist/server/services/status.d.ts.map +1 -0
  108. package/dist/server/services/status.js +71 -0
  109. package/dist/server/services/status.js.map +1 -0
  110. package/migrations/0002_custody_and_categories.sql +23 -0
  111. package/migrations/0003_repairs.sql +23 -0
  112. package/migrations/0004_platform_surfaces.sql +51 -0
  113. package/migrations/0005_repair_dates.sql +35 -0
  114. package/migrations/0006_workspace_registry_read.sql +50 -0
  115. package/migrations/0007_history_sequence.sql +83 -0
  116. package/migrations/0008_category_order_unique.sql +71 -0
  117. package/migrations/meta/0002_snapshot.json +1054 -0
  118. package/migrations/meta/0003_snapshot.json +1070 -0
  119. package/migrations/meta/0004_snapshot.json +1130 -0
  120. package/migrations/meta/0005_snapshot.json +1135 -0
  121. package/migrations/meta/_journal.json +49 -0
  122. package/package.json +2 -1
  123. package/src/client/api-instance.ts +27 -2
  124. package/src/client/bidi.test.ts +148 -0
  125. package/src/client/bidi.ts +85 -0
  126. package/src/client/components/AssetDetailPanel.svelte +614 -0
  127. package/src/client/components/AssetFormDialog.svelte +71 -22
  128. package/src/client/components/AssetPhoto.svelte +178 -0
  129. package/src/client/components/AttachmentsSection.svelte +327 -0
  130. package/src/client/components/CustodyDialog.svelte +201 -0
  131. package/src/client/components/RepairDialog.svelte +271 -0
  132. package/src/client/components/RepairsSection.svelte +318 -0
  133. package/src/client/components/Timeline.svelte +347 -0
  134. package/src/client/components/TimelineText.svelte +124 -0
  135. package/src/client/core-api.ts +71 -0
  136. package/src/client/custody.test.ts +31 -0
  137. package/src/client/custody.ts +34 -0
  138. package/src/client/errors.test.ts +395 -0
  139. package/src/client/errors.ts +229 -0
  140. package/src/client/links.test.ts +74 -0
  141. package/src/client/links.ts +44 -0
  142. package/src/client/members.test.ts +132 -0
  143. package/src/client/members.ts +116 -0
  144. package/src/client/messages.test.ts +127 -0
  145. package/src/client/messages.ts +1106 -18
  146. package/src/client/mock.test.ts +465 -1
  147. package/src/client/mock.ts +1105 -79
  148. package/src/client/module.ts +73 -1
  149. package/src/client/pages/AssetsPage.svelte +317 -45
  150. package/src/client/permissions.ts +7 -0
  151. package/src/client/price.test.ts +151 -3
  152. package/src/client/price.ts +155 -11
  153. package/src/client/query.ts +36 -0
  154. package/src/client/reorder.test.ts +100 -0
  155. package/src/client/reorder.ts +79 -0
  156. package/src/client/repairs.test.ts +38 -0
  157. package/src/client/repairs.ts +38 -0
  158. package/src/client/sequence.test.ts +248 -0
  159. package/src/client/sequence.ts +185 -0
  160. package/src/client/settings/CategoriesSettings.svelte +746 -0
  161. package/src/client/settings/GeneralSettings.svelte +0 -0
  162. package/src/client/status.ts +29 -0
  163. package/src/client/timeline.test.ts +175 -0
  164. package/src/client/timeline.ts +206 -0
  165. package/src/client/widgets/OverviewWidget.svelte +127 -26
  166. package/src/client/widgets/RepairsWidget.svelte +124 -0
  167. package/src/contract/capabilities.ts +53 -9
  168. package/src/contract/events.ts +49 -0
  169. package/src/contract/index.ts +1 -0
  170. package/src/contract/models.ts +270 -0
  171. package/src/contract/notifications.ts +73 -0
  172. package/src/contract/permissions.ts +55 -2
  173. package/src/contract/router.ts +284 -1
  174. package/src/contract/settings.ts +24 -4
  175. package/src/module.test.ts +217 -4
  176. package/src/server/index.ts +311 -4
  177. package/src/server/inventory.int.test.ts +4109 -19
  178. package/src/server/jobs.ts +444 -0
  179. package/src/server/migrations.test.ts +253 -2
  180. package/src/server/router.ts +486 -6
  181. package/src/server/schema.ts +171 -3
  182. package/src/server/services/assets.ts +214 -54
  183. package/src/server/services/attachments.ts +215 -0
  184. package/src/server/services/audience.ts +77 -0
  185. package/src/server/services/categories.ts +337 -0
  186. package/src/server/services/cursor.ts +104 -0
  187. package/src/server/services/custody.ts +471 -0
  188. package/src/server/services/db-errors.ts +42 -0
  189. package/src/server/services/index.ts +34 -1
  190. package/src/server/services/members.ts +54 -0
  191. package/src/server/services/notify.ts +52 -7
  192. package/src/server/services/offboarding.ts +150 -0
  193. package/src/server/services/repairs.ts +567 -0
  194. package/src/server/services/search.ts +166 -0
  195. package/src/server/services/stats.ts +88 -0
  196. package/src/server/services/status.test.ts +34 -0
  197. package/src/server/services/status.ts +143 -0
  198. package/src/client/settings/core-api.ts +0 -32
@@ -0,0 +1,204 @@
1
+ import { type Tx } from '@kernhq/kernel';
2
+ import type { RepairInput, RepairListItem, Repair as RepairModel, RepairPatchInput } from '../../contract/models.js';
3
+ import { assets, repairs } from '../schema.js';
4
+ import type { HistoryInput, NotifyService } from './notify.js';
5
+ type Row = typeof repairs.$inferSelect;
6
+ type AssetRow = typeof assets.$inferSelect;
7
+ /** The wire shape: drizzle gives Date objects for timestamps, the contract promises ISO strings. */
8
+ export declare function toRepair(row: Row): RepairModel;
9
+ /**
10
+ * What one repair mutation wrote, and what may only leave the module once it has committed.
11
+ *
12
+ * The asset comes back beside the repair because sending an item away moves `assets.status`, and a
13
+ * caller that fetched the asset again afterwards would be reading a row somebody else may have
14
+ * changed in between — the panel would then show a repair that has already been completed.
15
+ */
16
+ export interface RepairWritten {
17
+ repair: Row;
18
+ asset: AssetRow;
19
+ /** `null` when nothing happened worth recording, which is what an edit that changed nothing is. */
20
+ activity: HistoryInput | null;
21
+ }
22
+ export interface RepairListInput {
23
+ limit: number;
24
+ cursor?: string;
25
+ assetId?: string;
26
+ /** `true` for still away, `false` for finished, absent for both. */
27
+ open?: boolean;
28
+ }
29
+ /**
30
+ * What went away to be fixed, and what came back.
31
+ *
32
+ * Three things happen in one transaction on every change here, and the point of the class is that
33
+ * they cannot come apart: the repair row moves, `assets.status` is brought into step with it through
34
+ * `deriveStatus`, and an `asset_history` entry records it.
35
+ *
36
+ * **The database is the arbiter of "already away", not this file.** There is deliberately no
37
+ * `select … for update` on the asset *before* the repair row is written:
38
+ * `inventory_repairs_one_open_uq` — a unique index on `(asset_id) where returned_on is null` — is
39
+ * what makes two open repairs impossible, so two people pressing *Send for repair* on the same
40
+ * laptop in the same instant both read "it is here", both insert, and Postgres refuses exactly one
41
+ * of them. Checking first and inserting after is the race, not the fix. What this file owes the
42
+ * loser is a sentence they can act on rather than drizzle's "Failed query: insert into
43
+ * mod_inventory.repairs …".
44
+ *
45
+ * **`restamp` does lock it, afterwards, and that is a different job.** `assets.status` is derived
46
+ * from this module's repair rows *and* from custody, which another service writes, so the winner
47
+ * still has to compute an answer nobody can overwrite from a stale snapshot. See `lockAsset` in
48
+ * `status.ts`: the index decides the contest, the lock orders the bookkeeping that follows it.
49
+ *
50
+ * **Repairs do not touch custody.** An item at the repairer is still somebody's responsibility; see
51
+ * `status.ts`, where that rule is argued in full.
52
+ */
53
+ export declare class RepairService {
54
+ private readonly notify;
55
+ constructor(notify: NotifyService);
56
+ /**
57
+ * Today, as this module means it: the UTC date.
58
+ *
59
+ * Not the browser's date, and not a workspace time zone — a repair is dated to the day, and the
60
+ * two hours a workspace in Istanbul is ahead of UTC would put an evening repair on tomorrow for
61
+ * one reader and today for another. One clock, the server's, the same reasoning that keeps asset
62
+ * tags server-side. A workspace that needs the exact day sends `sentOn` itself.
63
+ */
64
+ private static today;
65
+ /** The one error a lost race produces, in every place a race can be lost. */
66
+ private static alreadyAway;
67
+ /**
68
+ * A repair cannot come back before it was sent — checked on every path that writes either date.
69
+ *
70
+ * `complete` has always refused a return date before the send date, and `update` did not: it took
71
+ * `sentOn` from the patch and wrote it whatever the row already said, so correcting the send date
72
+ * of a *finished* repair could move it past the day the item came back. What that stores is a
73
+ * repair that ended before it started — every "how long was it away" answer negative, the overdue
74
+ * sweep measuring from a date in the future, and nothing anywhere to say which of the two dates is
75
+ * the wrong one.
76
+ *
77
+ * Both are `date` columns, so they read back as `YYYY-MM-DD` and compare correctly as text.
78
+ *
79
+ * The database holds the same rule (`inventory_repairs_returned_after_sent`), because two
80
+ * transactions can each pass this check and still write a pair that fails it: one moving `sent_on`
81
+ * while the other logs the item back. This runs first so the ordinary case gets a sentence rather
82
+ * than a constraint violation; `outOfOrder` is what the loser of that race gets.
83
+ */
84
+ private static requireInOrder;
85
+ private static outOfOrder;
86
+ /**
87
+ * One day past today, which is the whole tolerance a date typed by a person needs.
88
+ *
89
+ * `today()` is UTC — one clock, the server's, for the reason it documents — and a workspace in
90
+ * Auckland is up to fourteen hours ahead of it, so *their* today is UTC's tomorrow for a large
91
+ * part of their working day. Refusing at exactly UTC-today would refuse the ordinary case in half
92
+ * the world's offices. A day is enough for every real time zone and is nowhere near enough to be
93
+ * the defect below.
94
+ */
95
+ private static readonly FUTURE_GRACE_DAYS;
96
+ /**
97
+ * A repair cannot be sent from the future — checked on every path that writes `sent_on`.
98
+ *
99
+ * `sentOn` is a date a person types, and nothing bounded it. A repair dated 2030 is one the
100
+ * overdue sweep can never find: it looks for `sent_on <= today - repairOverdueDays`, so a send
101
+ * date years ahead is permanently outside the window and the chase never fires. Not for a while —
102
+ * **ever**, for the life of that row, and silently, because a sweep that finds nothing looks
103
+ * exactly like a sweep with nothing to do. It also makes every "how long has it been away" answer
104
+ * negative and puts the item at the top of a list ordered by when it left.
105
+ *
106
+ * A typo is the likely cause and a deliberate one is the dangerous case: this is the one field
107
+ * that decides whether anybody is ever reminded that a vendor still has the company's laptop.
108
+ *
109
+ * Bounded on the *server*, not in the contract, and both halves of that are deliberate. The
110
+ * contract is shared with the browser, so a `refine` there would compare against the reader's own
111
+ * clock — and a client whose date is a day ahead would refuse a date the server accepts, or the
112
+ * other way round. And it is a sentence rather than a bare `invalid_string`, because "a repair
113
+ * cannot be sent in the future" is something a person can act on.
114
+ *
115
+ * **A `BAD_REQUEST` with no `reason`, like `checkPhoto`'s refusal and the category check in
116
+ * `AssetService`.** The date is malformed rather than contested — nothing raced, no state
117
+ * changed underneath anybody, the value simply cannot be true — and `CONFLICT` is this module's
118
+ * word for losing a race. The cost is that the sentence reaches a Persian or Turkish reader in
119
+ * English: a translated refusal needs a stable `reason` **and** its five bundles in
120
+ * `src/client/errors.ts`, and the two have to arrive together or `errors.test.ts` fails from
121
+ * whichever side is ahead.
122
+ */
123
+ private static requireNotFuture;
124
+ private asset;
125
+ get(tx: Tx, workspaceId: string, repairId: string): Promise<Row>;
126
+ /**
127
+ * One asset's repairs, or the whole workspace's — one query with one filter, because they are one
128
+ * question asked at two scopes and a second query answering it would be a second one to keep in
129
+ * step.
130
+ *
131
+ * **Paged by id, newest logged first.** An id is uuidv7, so it already carries the clock, and it
132
+ * is unique where `sent_on` is a date two repairs logged on the same day share — a page boundary
133
+ * between two rows that share a sort key repeats one and drops the other. The same reasoning
134
+ * `assets.list` gives for `sort: 'recent'` and `assets.history` gives for ordering on the row id.
135
+ */
136
+ list(tx: Tx, workspaceId: string, input: RepairListInput): Promise<{
137
+ items: RepairListItem[];
138
+ nextCursor: string | null;
139
+ }>;
140
+ /**
141
+ * The currency to store, given what the caller said and what is already there.
142
+ *
143
+ * A cost with no unit is not a cost, so an amount recorded with no currency inherits the asset's.
144
+ * **Inheritance fires in exactly one case** — an amount is being recorded and the repair has no
145
+ * currency at all — and getting that wrong is silent in both directions:
146
+ *
147
+ * - inheriting whenever a cost *exists* rather than whenever one *arrives* means an unrelated
148
+ * edit (correcting a vendor) silently gives the asset's currency back to a repair whose
149
+ * currency somebody deliberately cleared;
150
+ * - inheriting over a currency the repair already has means recording an amount in dollars on an
151
+ * asset priced in euros quietly relabels it as euros.
152
+ *
153
+ * `undefined` means "not mentioned" and an explicit `null` means "no currency", which a workspace
154
+ * that records amounts and not currencies genuinely means. Collapsing the two is the mistake
155
+ * `assets.update` documents one file over.
156
+ */
157
+ private static currencyFor;
158
+ /** Send it away. Refuses when it is already at a repairer — that is what `complete` is for. */
159
+ create(tx: Tx, workspaceId: string, actorId: string | null, assetId: string, input: RepairInput): Promise<RepairWritten>;
160
+ /**
161
+ * Correct what was recorded — a vendor, or a cost that arrived with the invoice a week later.
162
+ *
163
+ * **`returnedOn` is deliberately not patchable.** That one column decides whether the asset reads
164
+ * as `under_repair`, so exactly one procedure moves it and the derived status has one door rather
165
+ * than two. Editing a finished repair is allowed all the same: the invoice usually arrives after
166
+ * the item does.
167
+ *
168
+ * **No `actorId`, because nothing here records one.** This writes no timeline entry — see the
169
+ * bottom of the method — and a parameter kept for symmetry with `create` and `complete` would be
170
+ * a parameter every caller has to supply and nothing reads.
171
+ */
172
+ update(tx: Tx, workspaceId: string, repairId: string, patch: RepairPatchInput): Promise<RepairWritten>;
173
+ /**
174
+ * It came back.
175
+ *
176
+ * `and returned_on is null` in the predicate is the optimistic guard, exactly as
177
+ * `CustodyService.close` uses: under READ COMMITTED a concurrent complete blocks this statement,
178
+ * and when it resumes the row no longer matches, so zero rows come back rather than a second
179
+ * completion silently overwriting the first one's date.
180
+ */
181
+ complete(tx: Tx, workspaceId: string, actorId: string | null, repairId: string, input: {
182
+ returnedOn?: string;
183
+ costMinor?: number | null;
184
+ currency?: string | null;
185
+ }): Promise<RepairWritten>;
186
+ /**
187
+ * Bring `assets.status` back into step with the facts, inside the same transaction.
188
+ *
189
+ * Both facts are **read** rather than assumed — the open repair as it now stands, and the
190
+ * custodian as the asset row carries it — and `deriveStatus` decides. Assuming `under_repair`
191
+ * after an insert and `in_stock` after a completion is the version of this that silently released
192
+ * whoever was still holding the item.
193
+ *
194
+ * **The asset is locked and re-read here, rather than passed in.** It used to take the row the
195
+ * caller had already fetched, which is a snapshot from before the repair was written and before
196
+ * anything else that touched the asset in between: a handover committing in that window was
197
+ * invisible, so this derived a status from a custodian that had stopped being current and wrote it
198
+ * over the handover's answer. Taking the row under the lock is what makes "read both facts, then
199
+ * derive" true rather than merely intended. `lockAsset` argues it in full.
200
+ */
201
+ private restamp;
202
+ }
203
+ export {};
204
+ //# sourceMappingURL=repairs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repairs.d.ts","sourceRoot":"","sources":["../../../src/server/services/repairs.ts"],"names":[],"mappings":"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"}