@kernhq/module-inventory 0.1.2 → 0.3.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 (213) hide show
  1. package/README.md +134 -9
  2. package/dist/contract/capabilities.d.ts +49 -0
  3. package/dist/contract/capabilities.d.ts.map +1 -0
  4. package/dist/contract/capabilities.js +94 -0
  5. package/dist/contract/capabilities.js.map +1 -0
  6. package/dist/contract/events.d.ts +76 -0
  7. package/dist/contract/events.d.ts.map +1 -0
  8. package/dist/contract/events.js +62 -0
  9. package/dist/contract/events.js.map +1 -0
  10. package/dist/contract/index.d.ts +16 -0
  11. package/dist/contract/index.d.ts.map +1 -0
  12. package/dist/contract/index.js +16 -0
  13. package/dist/contract/index.js.map +1 -0
  14. package/dist/contract/models.d.ts +468 -0
  15. package/dist/contract/models.d.ts.map +1 -0
  16. package/dist/contract/models.js +320 -0
  17. package/dist/contract/models.js.map +1 -0
  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 +72 -0
  23. package/dist/contract/permissions.d.ts.map +1 -0
  24. package/dist/contract/permissions.js +79 -0
  25. package/dist/contract/permissions.js.map +1 -0
  26. package/dist/contract/router.d.ts +1378 -0
  27. package/dist/contract/router.d.ts.map +1 -0
  28. package/dist/contract/router.js +266 -0
  29. package/dist/contract/router.js.map +1 -0
  30. package/dist/contract/settings.d.ts +20 -0
  31. package/dist/contract/settings.d.ts.map +1 -0
  32. package/dist/contract/settings.js +49 -0
  33. package/dist/contract/settings.js.map +1 -0
  34. package/dist/server/index.d.ts +8 -1
  35. package/dist/server/index.d.ts.map +1 -1
  36. package/dist/server/index.js +288 -8
  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 +1789 -0
  43. package/dist/server/router.d.ts.map +1 -0
  44. package/dist/server/router.js +439 -0
  45. package/dist/server/router.js.map +1 -0
  46. package/dist/server/schema.d.ts +156 -9
  47. package/dist/server/schema.d.ts.map +1 -1
  48. package/dist/server/schema.js +183 -11
  49. package/dist/server/schema.js.map +1 -1
  50. package/dist/server/services/assets.d.ts +139 -0
  51. package/dist/server/services/assets.d.ts.map +1 -0
  52. package/dist/server/services/assets.js +429 -0
  53. package/dist/server/services/assets.js.map +1 -0
  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 +57 -0
  63. package/dist/server/services/categories.d.ts.map +1 -0
  64. package/dist/server/services/categories.js +124 -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 +26 -0
  79. package/dist/server/services/index.d.ts.map +1 -0
  80. package/dist/server/services/index.js +39 -0
  81. package/dist/server/services/index.js.map +1 -0
  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 +105 -0
  87. package/dist/server/services/notify.d.ts.map +1 -0
  88. package/dist/server/services/notify.js +147 -0
  89. package/dist/server/services/notify.js.map +1 -0
  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/0000_init.sql +12 -3
  111. package/migrations/0001_rls.sql +24 -0
  112. package/migrations/0002_custody_and_categories.sql +23 -0
  113. package/migrations/0003_repairs.sql +23 -0
  114. package/migrations/0004_platform_surfaces.sql +51 -0
  115. package/migrations/0005_repair_dates.sql +35 -0
  116. package/migrations/0006_workspace_registry_read.sql +50 -0
  117. package/migrations/0007_history_sequence.sql +83 -0
  118. package/migrations/meta/0000_snapshot.json +40 -13
  119. package/migrations/meta/0002_snapshot.json +1054 -0
  120. package/migrations/meta/0003_snapshot.json +1070 -0
  121. package/migrations/meta/0004_snapshot.json +1130 -0
  122. package/migrations/meta/0005_snapshot.json +1135 -0
  123. package/migrations/meta/_journal.json +44 -2
  124. package/package.json +5 -4
  125. package/src/client/api-instance.ts +27 -2
  126. package/src/client/api.ts +1 -1
  127. package/src/client/bidi.test.ts +148 -0
  128. package/src/client/bidi.ts +85 -0
  129. package/src/client/components/AssetDetailPanel.svelte +614 -0
  130. package/src/client/components/AssetFormDialog.svelte +191 -59
  131. package/src/client/components/AssetPhoto.svelte +178 -0
  132. package/src/client/components/AttachmentsSection.svelte +327 -0
  133. package/src/client/components/CustodyDialog.svelte +201 -0
  134. package/src/client/components/RepairDialog.svelte +271 -0
  135. package/src/client/components/RepairsSection.svelte +318 -0
  136. package/src/client/components/Timeline.svelte +347 -0
  137. package/src/client/components/TimelineText.svelte +124 -0
  138. package/src/client/core-api.ts +71 -0
  139. package/src/client/custody.test.ts +31 -0
  140. package/src/client/custody.ts +34 -0
  141. package/src/client/errors.test.ts +365 -0
  142. package/src/client/errors.ts +201 -0
  143. package/src/client/i18n.ts +11 -166
  144. package/src/client/index.ts +8 -1
  145. package/src/client/links.test.ts +74 -0
  146. package/src/client/links.ts +44 -0
  147. package/src/client/members.test.ts +132 -0
  148. package/src/client/members.ts +116 -0
  149. package/src/client/messages.test.ts +296 -0
  150. package/src/client/messages.ts +1424 -0
  151. package/src/client/mock.test.ts +555 -0
  152. package/src/client/mock.ts +1261 -52
  153. package/src/client/module.ts +76 -2
  154. package/src/client/pages/AssetsPage.svelte +638 -145
  155. package/src/client/permissions.ts +8 -1
  156. package/src/client/price.test.ts +254 -0
  157. package/src/client/price.ts +279 -0
  158. package/src/client/query.test.ts +58 -0
  159. package/src/client/query.ts +51 -2
  160. package/src/client/repairs.test.ts +38 -0
  161. package/src/client/repairs.ts +38 -0
  162. package/src/client/settings/CategoriesSettings.svelte +421 -0
  163. package/src/client/settings/GeneralSettings.svelte +403 -0
  164. package/src/client/status.ts +29 -0
  165. package/src/client/timeline.test.ts +175 -0
  166. package/src/client/timeline.ts +206 -0
  167. package/src/client/widgets/OverviewWidget.svelte +140 -26
  168. package/src/client/widgets/RepairsWidget.svelte +124 -0
  169. package/src/contract/capabilities.ts +99 -0
  170. package/src/contract/events.ts +83 -0
  171. package/src/contract/index.ts +16 -0
  172. package/src/contract/models.ts +360 -0
  173. package/src/contract/notifications.ts +73 -0
  174. package/src/contract/permissions.ts +79 -0
  175. package/src/contract/router.ts +300 -0
  176. package/src/contract/settings.ts +50 -0
  177. package/src/module.test.ts +330 -7
  178. package/src/server/index.ts +318 -8
  179. package/src/server/inventory.int.test.ts +4374 -0
  180. package/src/server/jobs.ts +444 -0
  181. package/src/server/migrations.test.ts +251 -0
  182. package/src/server/router.ts +574 -0
  183. package/src/server/schema.ts +184 -10
  184. package/src/server/services/assets.ts +528 -0
  185. package/src/server/services/attachments.ts +215 -0
  186. package/src/server/services/audience.ts +77 -0
  187. package/src/server/services/categories.ts +136 -0
  188. package/src/server/services/cursor.ts +104 -0
  189. package/src/server/services/custody.ts +471 -0
  190. package/src/server/services/db-errors.ts +42 -0
  191. package/src/server/services/index.ts +56 -0
  192. package/src/server/services/members.ts +54 -0
  193. package/src/server/services/notify.ts +196 -0
  194. package/src/server/services/offboarding.ts +150 -0
  195. package/src/server/services/repairs.ts +567 -0
  196. package/src/server/services/search.ts +166 -0
  197. package/src/server/services/stats.ts +88 -0
  198. package/src/server/services/status.test.ts +34 -0
  199. package/src/server/services/status.ts +143 -0
  200. package/tsconfig.base.json +22 -0
  201. package/tsconfig.client.json +1 -1
  202. package/tsconfig.json +1 -1
  203. package/vitest.config.ts +18 -3
  204. package/dist/contract.d.ts +0 -387
  205. package/dist/contract.d.ts.map +0 -1
  206. package/dist/contract.js +0 -119
  207. package/dist/contract.js.map +0 -1
  208. package/dist/server/_impl.d.ts +0 -427
  209. package/dist/server/_impl.d.ts.map +0 -1
  210. package/dist/server/_impl.js +0 -204
  211. package/dist/server/_impl.js.map +0 -1
  212. package/src/contract.ts +0 -143
  213. package/src/server/_impl.ts +0 -275
@@ -0,0 +1,1378 @@
1
+ import { z } from 'zod';
2
+ export declare const inventoryContract: {
3
+ assets: {
4
+ list: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
5
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
6
+ q: z.ZodOptional<z.ZodString>;
7
+ categoryId: z.ZodOptional<z.ZodUUID>;
8
+ status: z.ZodOptional<z.ZodEnum<{
9
+ in_stock: "in_stock";
10
+ assigned: "assigned";
11
+ reserved: "reserved";
12
+ under_repair: "under_repair";
13
+ lost: "lost";
14
+ retired: "retired";
15
+ }>>;
16
+ custodianUserId: z.ZodOptional<z.ZodUUID>;
17
+ archived: z.ZodDefault<z.ZodBoolean>;
18
+ sort: z.ZodDefault<z.ZodEnum<{
19
+ code: "code";
20
+ name: "name";
21
+ recent: "recent";
22
+ }>>;
23
+ cursor: z.ZodOptional<z.ZodString>;
24
+ limit: z.ZodDefault<z.ZodNumber>;
25
+ }, z.core.$strip>, z.ZodObject<{
26
+ items: z.ZodArray<z.ZodObject<{
27
+ id: z.ZodUUID;
28
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
29
+ code: z.ZodString;
30
+ name: z.ZodString;
31
+ description: z.ZodString;
32
+ categoryId: z.ZodNullable<z.ZodUUID>;
33
+ status: z.ZodEnum<{
34
+ in_stock: "in_stock";
35
+ assigned: "assigned";
36
+ reserved: "reserved";
37
+ under_repair: "under_repair";
38
+ lost: "lost";
39
+ retired: "retired";
40
+ }>;
41
+ custodianUserId: z.ZodNullable<z.ZodUUID>;
42
+ custodySince: z.ZodNullable<z.ZodString>;
43
+ serialNumber: z.ZodNullable<z.ZodString>;
44
+ location: z.ZodNullable<z.ZodString>;
45
+ purchasedOn: z.ZodNullable<z.ZodString>;
46
+ purchasedFrom: z.ZodNullable<z.ZodString>;
47
+ priceMinor: z.ZodNullable<z.ZodNumber>;
48
+ currency: z.ZodNullable<z.ZodString>;
49
+ warrantyUntil: z.ZodNullable<z.ZodString>;
50
+ photoFileId: z.ZodNullable<z.ZodUUID>;
51
+ custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
52
+ createdAt: z.ZodString;
53
+ updatedAt: z.ZodString;
54
+ archivedAt: z.ZodNullable<z.ZodString>;
55
+ }, z.core.$strip>>;
56
+ nextCursor: z.ZodNullable<z.ZodString>;
57
+ total: z.ZodOptional<z.ZodNumber>;
58
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
59
+ BAD_REQUEST: {
60
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
61
+ };
62
+ UNAUTHORIZED: {};
63
+ FORBIDDEN: {
64
+ data: z.ZodOptional<z.ZodObject<{
65
+ permission: z.ZodOptional<z.ZodString>;
66
+ }, z.core.$strip>>;
67
+ };
68
+ NOT_FOUND: {};
69
+ CONFLICT: {
70
+ data: z.ZodOptional<z.ZodObject<{
71
+ reason: z.ZodOptional<z.ZodString>;
72
+ }, z.core.$strip>>;
73
+ };
74
+ RATE_LIMITED: {};
75
+ MODULE_DISABLED: {
76
+ data: z.ZodObject<{
77
+ module: z.ZodString;
78
+ }, z.core.$strip>;
79
+ };
80
+ }>, Record<never, never>>;
81
+ get: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
82
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
83
+ assetId: z.ZodUUID;
84
+ }, z.core.$strip>, z.ZodObject<{
85
+ id: z.ZodUUID;
86
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
87
+ code: z.ZodString;
88
+ name: z.ZodString;
89
+ description: z.ZodString;
90
+ categoryId: z.ZodNullable<z.ZodUUID>;
91
+ status: z.ZodEnum<{
92
+ in_stock: "in_stock";
93
+ assigned: "assigned";
94
+ reserved: "reserved";
95
+ under_repair: "under_repair";
96
+ lost: "lost";
97
+ retired: "retired";
98
+ }>;
99
+ custodianUserId: z.ZodNullable<z.ZodUUID>;
100
+ custodySince: z.ZodNullable<z.ZodString>;
101
+ serialNumber: z.ZodNullable<z.ZodString>;
102
+ location: z.ZodNullable<z.ZodString>;
103
+ purchasedOn: z.ZodNullable<z.ZodString>;
104
+ purchasedFrom: z.ZodNullable<z.ZodString>;
105
+ priceMinor: z.ZodNullable<z.ZodNumber>;
106
+ currency: z.ZodNullable<z.ZodString>;
107
+ warrantyUntil: z.ZodNullable<z.ZodString>;
108
+ photoFileId: z.ZodNullable<z.ZodUUID>;
109
+ custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
110
+ createdAt: z.ZodString;
111
+ updatedAt: z.ZodString;
112
+ archivedAt: z.ZodNullable<z.ZodString>;
113
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
114
+ BAD_REQUEST: {
115
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
116
+ };
117
+ UNAUTHORIZED: {};
118
+ FORBIDDEN: {
119
+ data: z.ZodOptional<z.ZodObject<{
120
+ permission: z.ZodOptional<z.ZodString>;
121
+ }, z.core.$strip>>;
122
+ };
123
+ NOT_FOUND: {};
124
+ CONFLICT: {
125
+ data: z.ZodOptional<z.ZodObject<{
126
+ reason: z.ZodOptional<z.ZodString>;
127
+ }, z.core.$strip>>;
128
+ };
129
+ RATE_LIMITED: {};
130
+ MODULE_DISABLED: {
131
+ data: z.ZodObject<{
132
+ module: z.ZodString;
133
+ }, z.core.$strip>;
134
+ };
135
+ }>, Record<never, never>>;
136
+ create: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
137
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
138
+ name: z.ZodString;
139
+ categoryId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
140
+ serialNumber: z.ZodOptional<z.ZodNullable<z.ZodString>>;
141
+ location: z.ZodOptional<z.ZodNullable<z.ZodString>>;
142
+ purchasedFrom: z.ZodOptional<z.ZodNullable<z.ZodString>>;
143
+ purchasedOn: z.ZodOptional<z.ZodNullable<z.ZodISODate>>;
144
+ warrantyUntil: z.ZodOptional<z.ZodNullable<z.ZodISODate>>;
145
+ priceMinor: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
146
+ currency: z.ZodOptional<z.ZodNullable<z.ZodString>>;
147
+ photoFileId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
148
+ description: z.ZodDefault<z.ZodString>;
149
+ }, z.core.$strip>, z.ZodObject<{
150
+ id: z.ZodUUID;
151
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
152
+ code: z.ZodString;
153
+ name: z.ZodString;
154
+ description: z.ZodString;
155
+ categoryId: z.ZodNullable<z.ZodUUID>;
156
+ status: z.ZodEnum<{
157
+ in_stock: "in_stock";
158
+ assigned: "assigned";
159
+ reserved: "reserved";
160
+ under_repair: "under_repair";
161
+ lost: "lost";
162
+ retired: "retired";
163
+ }>;
164
+ custodianUserId: z.ZodNullable<z.ZodUUID>;
165
+ custodySince: z.ZodNullable<z.ZodString>;
166
+ serialNumber: z.ZodNullable<z.ZodString>;
167
+ location: z.ZodNullable<z.ZodString>;
168
+ purchasedOn: z.ZodNullable<z.ZodString>;
169
+ purchasedFrom: z.ZodNullable<z.ZodString>;
170
+ priceMinor: z.ZodNullable<z.ZodNumber>;
171
+ currency: z.ZodNullable<z.ZodString>;
172
+ warrantyUntil: z.ZodNullable<z.ZodString>;
173
+ photoFileId: z.ZodNullable<z.ZodUUID>;
174
+ custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
175
+ createdAt: z.ZodString;
176
+ updatedAt: z.ZodString;
177
+ archivedAt: z.ZodNullable<z.ZodString>;
178
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
179
+ BAD_REQUEST: {
180
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
181
+ };
182
+ UNAUTHORIZED: {};
183
+ FORBIDDEN: {
184
+ data: z.ZodOptional<z.ZodObject<{
185
+ permission: z.ZodOptional<z.ZodString>;
186
+ }, z.core.$strip>>;
187
+ };
188
+ NOT_FOUND: {};
189
+ CONFLICT: {
190
+ data: z.ZodOptional<z.ZodObject<{
191
+ reason: z.ZodOptional<z.ZodString>;
192
+ }, z.core.$strip>>;
193
+ };
194
+ RATE_LIMITED: {};
195
+ MODULE_DISABLED: {
196
+ data: z.ZodObject<{
197
+ module: z.ZodString;
198
+ }, z.core.$strip>;
199
+ };
200
+ }>, Record<never, never>>;
201
+ update: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
202
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
203
+ name: z.ZodOptional<z.ZodString>;
204
+ description: z.ZodOptional<z.ZodOptional<z.ZodString>>;
205
+ categoryId: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodUUID>>>;
206
+ serialNumber: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
207
+ location: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
208
+ purchasedFrom: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
209
+ purchasedOn: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodISODate>>>;
210
+ warrantyUntil: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodISODate>>>;
211
+ priceMinor: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodNumber>>>;
212
+ currency: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
213
+ photoFileId: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodUUID>>>;
214
+ assetId: z.ZodUUID;
215
+ }, z.core.$strip>, z.ZodObject<{
216
+ id: z.ZodUUID;
217
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
218
+ code: z.ZodString;
219
+ name: z.ZodString;
220
+ description: z.ZodString;
221
+ categoryId: z.ZodNullable<z.ZodUUID>;
222
+ status: z.ZodEnum<{
223
+ in_stock: "in_stock";
224
+ assigned: "assigned";
225
+ reserved: "reserved";
226
+ under_repair: "under_repair";
227
+ lost: "lost";
228
+ retired: "retired";
229
+ }>;
230
+ custodianUserId: z.ZodNullable<z.ZodUUID>;
231
+ custodySince: z.ZodNullable<z.ZodString>;
232
+ serialNumber: z.ZodNullable<z.ZodString>;
233
+ location: z.ZodNullable<z.ZodString>;
234
+ purchasedOn: z.ZodNullable<z.ZodString>;
235
+ purchasedFrom: z.ZodNullable<z.ZodString>;
236
+ priceMinor: z.ZodNullable<z.ZodNumber>;
237
+ currency: z.ZodNullable<z.ZodString>;
238
+ warrantyUntil: z.ZodNullable<z.ZodString>;
239
+ photoFileId: z.ZodNullable<z.ZodUUID>;
240
+ custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
241
+ createdAt: z.ZodString;
242
+ updatedAt: z.ZodString;
243
+ archivedAt: z.ZodNullable<z.ZodString>;
244
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
245
+ BAD_REQUEST: {
246
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
247
+ };
248
+ UNAUTHORIZED: {};
249
+ FORBIDDEN: {
250
+ data: z.ZodOptional<z.ZodObject<{
251
+ permission: z.ZodOptional<z.ZodString>;
252
+ }, z.core.$strip>>;
253
+ };
254
+ NOT_FOUND: {};
255
+ CONFLICT: {
256
+ data: z.ZodOptional<z.ZodObject<{
257
+ reason: z.ZodOptional<z.ZodString>;
258
+ }, z.core.$strip>>;
259
+ };
260
+ RATE_LIMITED: {};
261
+ MODULE_DISABLED: {
262
+ data: z.ZodObject<{
263
+ module: z.ZodString;
264
+ }, z.core.$strip>;
265
+ };
266
+ }>, Record<never, never>>;
267
+ archive: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
268
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
269
+ assetId: z.ZodUUID;
270
+ archived: z.ZodDefault<z.ZodBoolean>;
271
+ }, z.core.$strip>, z.ZodObject<{
272
+ id: z.ZodUUID;
273
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
274
+ code: z.ZodString;
275
+ name: z.ZodString;
276
+ description: z.ZodString;
277
+ categoryId: z.ZodNullable<z.ZodUUID>;
278
+ status: z.ZodEnum<{
279
+ in_stock: "in_stock";
280
+ assigned: "assigned";
281
+ reserved: "reserved";
282
+ under_repair: "under_repair";
283
+ lost: "lost";
284
+ retired: "retired";
285
+ }>;
286
+ custodianUserId: z.ZodNullable<z.ZodUUID>;
287
+ custodySince: z.ZodNullable<z.ZodString>;
288
+ serialNumber: z.ZodNullable<z.ZodString>;
289
+ location: z.ZodNullable<z.ZodString>;
290
+ purchasedOn: z.ZodNullable<z.ZodString>;
291
+ purchasedFrom: z.ZodNullable<z.ZodString>;
292
+ priceMinor: z.ZodNullable<z.ZodNumber>;
293
+ currency: z.ZodNullable<z.ZodString>;
294
+ warrantyUntil: z.ZodNullable<z.ZodString>;
295
+ photoFileId: z.ZodNullable<z.ZodUUID>;
296
+ custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
297
+ createdAt: z.ZodString;
298
+ updatedAt: z.ZodString;
299
+ archivedAt: z.ZodNullable<z.ZodString>;
300
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
301
+ BAD_REQUEST: {
302
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
303
+ };
304
+ UNAUTHORIZED: {};
305
+ FORBIDDEN: {
306
+ data: z.ZodOptional<z.ZodObject<{
307
+ permission: z.ZodOptional<z.ZodString>;
308
+ }, z.core.$strip>>;
309
+ };
310
+ NOT_FOUND: {};
311
+ CONFLICT: {
312
+ data: z.ZodOptional<z.ZodObject<{
313
+ reason: z.ZodOptional<z.ZodString>;
314
+ }, z.core.$strip>>;
315
+ };
316
+ RATE_LIMITED: {};
317
+ MODULE_DISABLED: {
318
+ data: z.ZodObject<{
319
+ module: z.ZodString;
320
+ }, z.core.$strip>;
321
+ };
322
+ }>, Record<never, never>>;
323
+ /**
324
+ * The asset's own timeline, newest first.
325
+ *
326
+ * Paged with the same keyset discipline `assets.list` uses and the same cursor codec, because a
327
+ * second bookmark format is a second set of the three bugs the first one had. The bookmark is a
328
+ * row id; the ordering is by id, which for a uuidv7 is the clock and, unlike `created_at`, is
329
+ * unique — two entries written in one transaction (a create and its first custody row) share a
330
+ * timestamp and a page boundary between them would repeat or drop one.
331
+ *
332
+ * Reads on `inventory.asset.view`. See `permissions.ts` for why custody is not gated separately.
333
+ */
334
+ history: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
335
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
336
+ cursor: z.ZodOptional<z.ZodString>;
337
+ limit: z.ZodDefault<z.ZodNumber>;
338
+ assetId: z.ZodUUID;
339
+ }, z.core.$strip>, z.ZodObject<{
340
+ items: z.ZodArray<z.ZodObject<{
341
+ id: z.ZodUUID;
342
+ assetId: z.ZodUUID;
343
+ actorId: z.ZodNullable<z.ZodUUID>;
344
+ action: z.ZodString;
345
+ changes: z.ZodArray<z.ZodObject<{
346
+ field: z.ZodString;
347
+ from: z.ZodUnknown;
348
+ to: z.ZodUnknown;
349
+ }, z.core.$strip>>;
350
+ data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
351
+ occurredAt: z.ZodString;
352
+ }, z.core.$strip>>;
353
+ nextCursor: z.ZodNullable<z.ZodString>;
354
+ total: z.ZodOptional<z.ZodNumber>;
355
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
356
+ BAD_REQUEST: {
357
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
358
+ };
359
+ UNAUTHORIZED: {};
360
+ FORBIDDEN: {
361
+ data: z.ZodOptional<z.ZodObject<{
362
+ permission: z.ZodOptional<z.ZodString>;
363
+ }, z.core.$strip>>;
364
+ };
365
+ NOT_FOUND: {};
366
+ CONFLICT: {
367
+ data: z.ZodOptional<z.ZodObject<{
368
+ reason: z.ZodOptional<z.ZodString>;
369
+ }, z.core.$strip>>;
370
+ };
371
+ RATE_LIMITED: {};
372
+ MODULE_DISABLED: {
373
+ data: z.ZodObject<{
374
+ module: z.ZodString;
375
+ }, z.core.$strip>;
376
+ };
377
+ }>, Record<never, never>>;
378
+ };
379
+ /**
380
+ * Who is holding what.
381
+ *
382
+ * Four verbs rather than one, because "hand it to somebody" and "hand it on to somebody else" are
383
+ * different questions with different failure modes: assigning something already out is a mistake
384
+ * worth refusing, and transferring something nobody holds is a different mistake. One procedure
385
+ * taking `userId | null` would answer both by silently doing whatever the row happened to allow.
386
+ */
387
+ custody: {
388
+ /** Hand a free item to a member. Refuses if somebody already has it — that is `transfer`. */
389
+ assign: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
390
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
391
+ assetId: z.ZodUUID;
392
+ userId: z.ZodUUID;
393
+ note: z.ZodOptional<z.ZodNullable<z.ZodString>>;
394
+ }, z.core.$strip>, z.ZodObject<{
395
+ asset: z.ZodObject<{
396
+ id: z.ZodUUID;
397
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
398
+ code: z.ZodString;
399
+ name: z.ZodString;
400
+ description: z.ZodString;
401
+ categoryId: z.ZodNullable<z.ZodUUID>;
402
+ status: z.ZodEnum<{
403
+ in_stock: "in_stock";
404
+ assigned: "assigned";
405
+ reserved: "reserved";
406
+ under_repair: "under_repair";
407
+ lost: "lost";
408
+ retired: "retired";
409
+ }>;
410
+ custodianUserId: z.ZodNullable<z.ZodUUID>;
411
+ custodySince: z.ZodNullable<z.ZodString>;
412
+ serialNumber: z.ZodNullable<z.ZodString>;
413
+ location: z.ZodNullable<z.ZodString>;
414
+ purchasedOn: z.ZodNullable<z.ZodString>;
415
+ purchasedFrom: z.ZodNullable<z.ZodString>;
416
+ priceMinor: z.ZodNullable<z.ZodNumber>;
417
+ currency: z.ZodNullable<z.ZodString>;
418
+ warrantyUntil: z.ZodNullable<z.ZodString>;
419
+ photoFileId: z.ZodNullable<z.ZodUUID>;
420
+ custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
421
+ createdAt: z.ZodString;
422
+ updatedAt: z.ZodString;
423
+ archivedAt: z.ZodNullable<z.ZodString>;
424
+ }, z.core.$strip>;
425
+ period: z.ZodNullable<z.ZodObject<{
426
+ id: z.ZodUUID;
427
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
428
+ assetId: z.ZodUUID;
429
+ userId: z.ZodUUID;
430
+ note: z.ZodNullable<z.ZodString>;
431
+ effectiveFrom: z.ZodString;
432
+ effectiveTo: z.ZodNullable<z.ZodString>;
433
+ createdBy: z.ZodNullable<z.ZodUUID>;
434
+ createdAt: z.ZodString;
435
+ }, z.core.$strip>>;
436
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
437
+ BAD_REQUEST: {
438
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
439
+ };
440
+ UNAUTHORIZED: {};
441
+ FORBIDDEN: {
442
+ data: z.ZodOptional<z.ZodObject<{
443
+ permission: z.ZodOptional<z.ZodString>;
444
+ }, z.core.$strip>>;
445
+ };
446
+ NOT_FOUND: {};
447
+ CONFLICT: {
448
+ data: z.ZodOptional<z.ZodObject<{
449
+ reason: z.ZodOptional<z.ZodString>;
450
+ }, z.core.$strip>>;
451
+ };
452
+ RATE_LIMITED: {};
453
+ MODULE_DISABLED: {
454
+ data: z.ZodObject<{
455
+ module: z.ZodString;
456
+ }, z.core.$strip>;
457
+ };
458
+ }>, Record<never, never>>;
459
+ /** Take it back. Closes the open period and puts the asset back in stock. */
460
+ return: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
461
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
462
+ assetId: z.ZodUUID;
463
+ note: z.ZodOptional<z.ZodNullable<z.ZodString>>;
464
+ }, z.core.$strip>, z.ZodObject<{
465
+ asset: z.ZodObject<{
466
+ id: z.ZodUUID;
467
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
468
+ code: z.ZodString;
469
+ name: z.ZodString;
470
+ description: z.ZodString;
471
+ categoryId: z.ZodNullable<z.ZodUUID>;
472
+ status: z.ZodEnum<{
473
+ in_stock: "in_stock";
474
+ assigned: "assigned";
475
+ reserved: "reserved";
476
+ under_repair: "under_repair";
477
+ lost: "lost";
478
+ retired: "retired";
479
+ }>;
480
+ custodianUserId: z.ZodNullable<z.ZodUUID>;
481
+ custodySince: z.ZodNullable<z.ZodString>;
482
+ serialNumber: z.ZodNullable<z.ZodString>;
483
+ location: z.ZodNullable<z.ZodString>;
484
+ purchasedOn: z.ZodNullable<z.ZodString>;
485
+ purchasedFrom: z.ZodNullable<z.ZodString>;
486
+ priceMinor: z.ZodNullable<z.ZodNumber>;
487
+ currency: z.ZodNullable<z.ZodString>;
488
+ warrantyUntil: z.ZodNullable<z.ZodString>;
489
+ photoFileId: z.ZodNullable<z.ZodUUID>;
490
+ custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
491
+ createdAt: z.ZodString;
492
+ updatedAt: z.ZodString;
493
+ archivedAt: z.ZodNullable<z.ZodString>;
494
+ }, z.core.$strip>;
495
+ period: z.ZodNullable<z.ZodObject<{
496
+ id: z.ZodUUID;
497
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
498
+ assetId: z.ZodUUID;
499
+ userId: z.ZodUUID;
500
+ note: z.ZodNullable<z.ZodString>;
501
+ effectiveFrom: z.ZodString;
502
+ effectiveTo: z.ZodNullable<z.ZodString>;
503
+ createdBy: z.ZodNullable<z.ZodUUID>;
504
+ createdAt: z.ZodString;
505
+ }, z.core.$strip>>;
506
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
507
+ BAD_REQUEST: {
508
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
509
+ };
510
+ UNAUTHORIZED: {};
511
+ FORBIDDEN: {
512
+ data: z.ZodOptional<z.ZodObject<{
513
+ permission: z.ZodOptional<z.ZodString>;
514
+ }, z.core.$strip>>;
515
+ };
516
+ NOT_FOUND: {};
517
+ CONFLICT: {
518
+ data: z.ZodOptional<z.ZodObject<{
519
+ reason: z.ZodOptional<z.ZodString>;
520
+ }, z.core.$strip>>;
521
+ };
522
+ RATE_LIMITED: {};
523
+ MODULE_DISABLED: {
524
+ data: z.ZodObject<{
525
+ module: z.ZodString;
526
+ }, z.core.$strip>;
527
+ };
528
+ }>, Record<never, never>>;
529
+ /**
530
+ * Hand it straight on: one transaction, not a return followed by an assign.
531
+ *
532
+ * Two calls would leave the asset `in_stock` with no custodian in between — visible to anybody
533
+ * reading the list at that moment, and permanently visible in the timeline as a return that
534
+ * nobody performed.
535
+ */
536
+ transfer: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
537
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
538
+ assetId: z.ZodUUID;
539
+ userId: z.ZodUUID;
540
+ note: z.ZodOptional<z.ZodNullable<z.ZodString>>;
541
+ }, z.core.$strip>, z.ZodObject<{
542
+ asset: z.ZodObject<{
543
+ id: z.ZodUUID;
544
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
545
+ code: z.ZodString;
546
+ name: z.ZodString;
547
+ description: z.ZodString;
548
+ categoryId: z.ZodNullable<z.ZodUUID>;
549
+ status: z.ZodEnum<{
550
+ in_stock: "in_stock";
551
+ assigned: "assigned";
552
+ reserved: "reserved";
553
+ under_repair: "under_repair";
554
+ lost: "lost";
555
+ retired: "retired";
556
+ }>;
557
+ custodianUserId: z.ZodNullable<z.ZodUUID>;
558
+ custodySince: z.ZodNullable<z.ZodString>;
559
+ serialNumber: z.ZodNullable<z.ZodString>;
560
+ location: z.ZodNullable<z.ZodString>;
561
+ purchasedOn: z.ZodNullable<z.ZodString>;
562
+ purchasedFrom: z.ZodNullable<z.ZodString>;
563
+ priceMinor: z.ZodNullable<z.ZodNumber>;
564
+ currency: z.ZodNullable<z.ZodString>;
565
+ warrantyUntil: z.ZodNullable<z.ZodString>;
566
+ photoFileId: z.ZodNullable<z.ZodUUID>;
567
+ custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
568
+ createdAt: z.ZodString;
569
+ updatedAt: z.ZodString;
570
+ archivedAt: z.ZodNullable<z.ZodString>;
571
+ }, z.core.$strip>;
572
+ period: z.ZodNullable<z.ZodObject<{
573
+ id: z.ZodUUID;
574
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
575
+ assetId: z.ZodUUID;
576
+ userId: z.ZodUUID;
577
+ note: z.ZodNullable<z.ZodString>;
578
+ effectiveFrom: z.ZodString;
579
+ effectiveTo: z.ZodNullable<z.ZodString>;
580
+ createdBy: z.ZodNullable<z.ZodUUID>;
581
+ createdAt: z.ZodString;
582
+ }, z.core.$strip>>;
583
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
584
+ BAD_REQUEST: {
585
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
586
+ };
587
+ UNAUTHORIZED: {};
588
+ FORBIDDEN: {
589
+ data: z.ZodOptional<z.ZodObject<{
590
+ permission: z.ZodOptional<z.ZodString>;
591
+ }, z.core.$strip>>;
592
+ };
593
+ NOT_FOUND: {};
594
+ CONFLICT: {
595
+ data: z.ZodOptional<z.ZodObject<{
596
+ reason: z.ZodOptional<z.ZodString>;
597
+ }, z.core.$strip>>;
598
+ };
599
+ RATE_LIMITED: {};
600
+ MODULE_DISABLED: {
601
+ data: z.ZodObject<{
602
+ module: z.ZodString;
603
+ }, z.core.$strip>;
604
+ };
605
+ }>, Record<never, never>>;
606
+ /**
607
+ * Every period for one asset, newest first — "who had this laptop before me".
608
+ *
609
+ * An array rather than a page, like HR's `employment.history`: the rows are bounded by how many
610
+ * times one item changed hands, which is tens over its life. `limit` caps it rather than
611
+ * paging, so the answer is never unbounded and the caller never has a cursor to keep.
612
+ */
613
+ history: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
614
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
615
+ assetId: z.ZodUUID;
616
+ limit: z.ZodDefault<z.ZodNumber>;
617
+ }, z.core.$strip>, z.ZodArray<z.ZodObject<{
618
+ id: z.ZodUUID;
619
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
620
+ assetId: z.ZodUUID;
621
+ userId: z.ZodUUID;
622
+ note: z.ZodNullable<z.ZodString>;
623
+ effectiveFrom: z.ZodString;
624
+ effectiveTo: z.ZodNullable<z.ZodString>;
625
+ createdBy: z.ZodNullable<z.ZodUUID>;
626
+ createdAt: z.ZodString;
627
+ }, z.core.$strip>>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
628
+ BAD_REQUEST: {
629
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
630
+ };
631
+ UNAUTHORIZED: {};
632
+ FORBIDDEN: {
633
+ data: z.ZodOptional<z.ZodObject<{
634
+ permission: z.ZodOptional<z.ZodString>;
635
+ }, z.core.$strip>>;
636
+ };
637
+ NOT_FOUND: {};
638
+ CONFLICT: {
639
+ data: z.ZodOptional<z.ZodObject<{
640
+ reason: z.ZodOptional<z.ZodString>;
641
+ }, z.core.$strip>>;
642
+ };
643
+ RATE_LIMITED: {};
644
+ MODULE_DISABLED: {
645
+ data: z.ZodObject<{
646
+ module: z.ZodString;
647
+ }, z.core.$strip>;
648
+ };
649
+ }>, Record<never, never>>;
650
+ /**
651
+ * What one person is holding right now.
652
+ *
653
+ * Answered from `assets.custodian_user_id` — denormalised inside the same transaction that
654
+ * writes the period, and indexed — rather than from an open-period join, so the offboarding
655
+ * question ("what does Ada still have?") is one indexed read.
656
+ */
657
+ byUser: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
658
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
659
+ cursor: z.ZodOptional<z.ZodString>;
660
+ limit: z.ZodDefault<z.ZodNumber>;
661
+ userId: z.ZodUUID;
662
+ }, z.core.$strip>, z.ZodObject<{
663
+ items: z.ZodArray<z.ZodObject<{
664
+ id: z.ZodUUID;
665
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
666
+ code: z.ZodString;
667
+ name: z.ZodString;
668
+ description: z.ZodString;
669
+ categoryId: z.ZodNullable<z.ZodUUID>;
670
+ status: z.ZodEnum<{
671
+ in_stock: "in_stock";
672
+ assigned: "assigned";
673
+ reserved: "reserved";
674
+ under_repair: "under_repair";
675
+ lost: "lost";
676
+ retired: "retired";
677
+ }>;
678
+ custodianUserId: z.ZodNullable<z.ZodUUID>;
679
+ custodySince: z.ZodNullable<z.ZodString>;
680
+ serialNumber: z.ZodNullable<z.ZodString>;
681
+ location: z.ZodNullable<z.ZodString>;
682
+ purchasedOn: z.ZodNullable<z.ZodString>;
683
+ purchasedFrom: z.ZodNullable<z.ZodString>;
684
+ priceMinor: z.ZodNullable<z.ZodNumber>;
685
+ currency: z.ZodNullable<z.ZodString>;
686
+ warrantyUntil: z.ZodNullable<z.ZodString>;
687
+ photoFileId: z.ZodNullable<z.ZodUUID>;
688
+ custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
689
+ createdAt: z.ZodString;
690
+ updatedAt: z.ZodString;
691
+ archivedAt: z.ZodNullable<z.ZodString>;
692
+ }, z.core.$strip>>;
693
+ nextCursor: z.ZodNullable<z.ZodString>;
694
+ total: z.ZodOptional<z.ZodNumber>;
695
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
696
+ BAD_REQUEST: {
697
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
698
+ };
699
+ UNAUTHORIZED: {};
700
+ FORBIDDEN: {
701
+ data: z.ZodOptional<z.ZodObject<{
702
+ permission: z.ZodOptional<z.ZodString>;
703
+ }, z.core.$strip>>;
704
+ };
705
+ NOT_FOUND: {};
706
+ CONFLICT: {
707
+ data: z.ZodOptional<z.ZodObject<{
708
+ reason: z.ZodOptional<z.ZodString>;
709
+ }, z.core.$strip>>;
710
+ };
711
+ RATE_LIMITED: {};
712
+ MODULE_DISABLED: {
713
+ data: z.ZodObject<{
714
+ module: z.ZodString;
715
+ }, z.core.$strip>;
716
+ };
717
+ }>, Record<never, never>>;
718
+ };
719
+ /**
720
+ * How a workspace groups what it owns.
721
+ *
722
+ * Not paged: a workspace has tens of categories, and every one of them has to be in the picker
723
+ * anyway. A cursor here would be a page boundary in a dropdown.
724
+ */
725
+ categories: {
726
+ list: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
727
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
728
+ archived: z.ZodDefault<z.ZodBoolean>;
729
+ }, z.core.$strip>, z.ZodArray<z.ZodObject<{
730
+ id: z.ZodUUID;
731
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
732
+ name: z.ZodString;
733
+ order: z.ZodNumber;
734
+ createdAt: z.ZodString;
735
+ updatedAt: z.ZodString;
736
+ archivedAt: z.ZodNullable<z.ZodString>;
737
+ }, z.core.$strip>>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
738
+ BAD_REQUEST: {
739
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
740
+ };
741
+ UNAUTHORIZED: {};
742
+ FORBIDDEN: {
743
+ data: z.ZodOptional<z.ZodObject<{
744
+ permission: z.ZodOptional<z.ZodString>;
745
+ }, z.core.$strip>>;
746
+ };
747
+ NOT_FOUND: {};
748
+ CONFLICT: {
749
+ data: z.ZodOptional<z.ZodObject<{
750
+ reason: z.ZodOptional<z.ZodString>;
751
+ }, z.core.$strip>>;
752
+ };
753
+ RATE_LIMITED: {};
754
+ MODULE_DISABLED: {
755
+ data: z.ZodObject<{
756
+ module: z.ZodString;
757
+ }, z.core.$strip>;
758
+ };
759
+ }>, Record<never, never>>;
760
+ create: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
761
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
762
+ name: z.ZodString;
763
+ order: z.ZodOptional<z.ZodNumber>;
764
+ }, z.core.$strip>, z.ZodObject<{
765
+ id: z.ZodUUID;
766
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
767
+ name: z.ZodString;
768
+ order: z.ZodNumber;
769
+ createdAt: z.ZodString;
770
+ updatedAt: z.ZodString;
771
+ archivedAt: z.ZodNullable<z.ZodString>;
772
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
773
+ BAD_REQUEST: {
774
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
775
+ };
776
+ UNAUTHORIZED: {};
777
+ FORBIDDEN: {
778
+ data: z.ZodOptional<z.ZodObject<{
779
+ permission: z.ZodOptional<z.ZodString>;
780
+ }, z.core.$strip>>;
781
+ };
782
+ NOT_FOUND: {};
783
+ CONFLICT: {
784
+ data: z.ZodOptional<z.ZodObject<{
785
+ reason: z.ZodOptional<z.ZodString>;
786
+ }, z.core.$strip>>;
787
+ };
788
+ RATE_LIMITED: {};
789
+ MODULE_DISABLED: {
790
+ data: z.ZodObject<{
791
+ module: z.ZodString;
792
+ }, z.core.$strip>;
793
+ };
794
+ }>, Record<never, never>>;
795
+ update: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
796
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
797
+ name: z.ZodOptional<z.ZodString>;
798
+ order: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
799
+ categoryId: z.ZodUUID;
800
+ }, z.core.$strip>, z.ZodObject<{
801
+ id: z.ZodUUID;
802
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
803
+ name: z.ZodString;
804
+ order: z.ZodNumber;
805
+ createdAt: z.ZodString;
806
+ updatedAt: z.ZodString;
807
+ archivedAt: z.ZodNullable<z.ZodString>;
808
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
809
+ BAD_REQUEST: {
810
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
811
+ };
812
+ UNAUTHORIZED: {};
813
+ FORBIDDEN: {
814
+ data: z.ZodOptional<z.ZodObject<{
815
+ permission: z.ZodOptional<z.ZodString>;
816
+ }, z.core.$strip>>;
817
+ };
818
+ NOT_FOUND: {};
819
+ CONFLICT: {
820
+ data: z.ZodOptional<z.ZodObject<{
821
+ reason: z.ZodOptional<z.ZodString>;
822
+ }, z.core.$strip>>;
823
+ };
824
+ RATE_LIMITED: {};
825
+ MODULE_DISABLED: {
826
+ data: z.ZodObject<{
827
+ module: z.ZodString;
828
+ }, z.core.$strip>;
829
+ };
830
+ }>, Record<never, never>>;
831
+ /**
832
+ * Archive, not delete — and the same procedure restores.
833
+ *
834
+ * `assets.category_id` carries no foreign key, so a delete would leave every asset filed under
835
+ * it pointing at nothing: a blank column, and a timeline entry that recorded the move losing
836
+ * the name it recorded. Archiving is reversible and destroys nothing.
837
+ */
838
+ archive: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
839
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
840
+ categoryId: z.ZodUUID;
841
+ archived: z.ZodDefault<z.ZodBoolean>;
842
+ }, z.core.$strip>, z.ZodObject<{
843
+ id: z.ZodUUID;
844
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
845
+ name: z.ZodString;
846
+ order: z.ZodNumber;
847
+ createdAt: z.ZodString;
848
+ updatedAt: z.ZodString;
849
+ archivedAt: z.ZodNullable<z.ZodString>;
850
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
851
+ BAD_REQUEST: {
852
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
853
+ };
854
+ UNAUTHORIZED: {};
855
+ FORBIDDEN: {
856
+ data: z.ZodOptional<z.ZodObject<{
857
+ permission: z.ZodOptional<z.ZodString>;
858
+ }, z.core.$strip>>;
859
+ };
860
+ NOT_FOUND: {};
861
+ CONFLICT: {
862
+ data: z.ZodOptional<z.ZodObject<{
863
+ reason: z.ZodOptional<z.ZodString>;
864
+ }, z.core.$strip>>;
865
+ };
866
+ RATE_LIMITED: {};
867
+ MODULE_DISABLED: {
868
+ data: z.ZodObject<{
869
+ module: z.ZodString;
870
+ }, z.core.$strip>;
871
+ };
872
+ }>, Record<never, never>>;
873
+ };
874
+ /**
875
+ * What went away to be fixed.
876
+ *
877
+ * **Behind the `repairs` capability**, which is this module's first switchable one — so every
878
+ * procedure here answers **404** rather than 403 in a workspace that has it off. 403 would say
879
+ * "this exists and you may not have it", which is false for a company that does not record
880
+ * repairs, and it would contradict a panel that has already hidden the tab.
881
+ *
882
+ * Writing takes `inventory.repair.manage`; reading rides `inventory.asset.view`, for the reason
883
+ * custody does — "where is the projector" is the question the register exists to answer.
884
+ */
885
+ repairs: {
886
+ /**
887
+ * One asset's repairs, or the whole workspace's — the same procedure, because they are the same
888
+ * query with one filter and a second one would be a second thing to keep in step.
889
+ *
890
+ * `open: true` is the "what is away right now" question a dashboard card asks, and it is a
891
+ * filter rather than a procedure of its own for the same reason.
892
+ *
893
+ * Paged, unlike `custody.history`: one asset's repairs are bounded by how often it breaks, but
894
+ * a workspace's are not. Ordered newest-logged first, by row id — a uuidv7 already carries the
895
+ * clock and is unique, where `sent_on` is a date two repairs logged the same day share.
896
+ */
897
+ list: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
898
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
899
+ assetId: z.ZodOptional<z.ZodUUID>;
900
+ open: z.ZodOptional<z.ZodBoolean>;
901
+ cursor: z.ZodOptional<z.ZodString>;
902
+ limit: z.ZodDefault<z.ZodNumber>;
903
+ }, z.core.$strip>, z.ZodObject<{
904
+ items: z.ZodArray<z.ZodObject<{
905
+ id: z.ZodUUID;
906
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
907
+ assetId: z.ZodUUID;
908
+ summary: z.ZodString;
909
+ detail: z.ZodNullable<z.ZodString>;
910
+ vendor: z.ZodNullable<z.ZodString>;
911
+ costMinor: z.ZodNullable<z.ZodNumber>;
912
+ currency: z.ZodNullable<z.ZodString>;
913
+ sentOn: z.ZodString;
914
+ returnedOn: z.ZodNullable<z.ZodString>;
915
+ createdBy: z.ZodNullable<z.ZodUUID>;
916
+ createdAt: z.ZodString;
917
+ updatedAt: z.ZodString;
918
+ assetCode: z.ZodString;
919
+ assetName: z.ZodString;
920
+ }, z.core.$strip>>;
921
+ nextCursor: z.ZodNullable<z.ZodString>;
922
+ total: z.ZodOptional<z.ZodNumber>;
923
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
924
+ BAD_REQUEST: {
925
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
926
+ };
927
+ UNAUTHORIZED: {};
928
+ FORBIDDEN: {
929
+ data: z.ZodOptional<z.ZodObject<{
930
+ permission: z.ZodOptional<z.ZodString>;
931
+ }, z.core.$strip>>;
932
+ };
933
+ NOT_FOUND: {};
934
+ CONFLICT: {
935
+ data: z.ZodOptional<z.ZodObject<{
936
+ reason: z.ZodOptional<z.ZodString>;
937
+ }, z.core.$strip>>;
938
+ };
939
+ RATE_LIMITED: {};
940
+ MODULE_DISABLED: {
941
+ data: z.ZodObject<{
942
+ module: z.ZodString;
943
+ }, z.core.$strip>;
944
+ };
945
+ }>, Record<never, never>>;
946
+ /**
947
+ * Send it away. Refuses when the item is already at a repairer — one open repair per asset, and
948
+ * `inventory_repairs_one_open_uq` is what makes that true in the database rather than merely
949
+ * likely in the service.
950
+ *
951
+ * `sentOn` is optional and defaults to today **on the server**: a browser clock is not a fact
952
+ * this module is willing to record, and the same reasoning already keeps asset tags server-side.
953
+ */
954
+ create: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
955
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
956
+ summary: z.ZodString;
957
+ detail: z.ZodOptional<z.ZodNullable<z.ZodString>>;
958
+ vendor: z.ZodOptional<z.ZodNullable<z.ZodString>>;
959
+ costMinor: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
960
+ currency: z.ZodOptional<z.ZodNullable<z.ZodString>>;
961
+ sentOn: z.ZodOptional<z.ZodISODate>;
962
+ assetId: z.ZodUUID;
963
+ }, z.core.$strip>, z.ZodObject<{
964
+ repair: z.ZodObject<{
965
+ id: z.ZodUUID;
966
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
967
+ assetId: z.ZodUUID;
968
+ summary: z.ZodString;
969
+ detail: z.ZodNullable<z.ZodString>;
970
+ vendor: z.ZodNullable<z.ZodString>;
971
+ costMinor: z.ZodNullable<z.ZodNumber>;
972
+ currency: z.ZodNullable<z.ZodString>;
973
+ sentOn: z.ZodString;
974
+ returnedOn: z.ZodNullable<z.ZodString>;
975
+ createdBy: z.ZodNullable<z.ZodUUID>;
976
+ createdAt: z.ZodString;
977
+ updatedAt: z.ZodString;
978
+ }, z.core.$strip>;
979
+ asset: z.ZodObject<{
980
+ id: z.ZodUUID;
981
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
982
+ code: z.ZodString;
983
+ name: z.ZodString;
984
+ description: z.ZodString;
985
+ categoryId: z.ZodNullable<z.ZodUUID>;
986
+ status: z.ZodEnum<{
987
+ in_stock: "in_stock";
988
+ assigned: "assigned";
989
+ reserved: "reserved";
990
+ under_repair: "under_repair";
991
+ lost: "lost";
992
+ retired: "retired";
993
+ }>;
994
+ custodianUserId: z.ZodNullable<z.ZodUUID>;
995
+ custodySince: z.ZodNullable<z.ZodString>;
996
+ serialNumber: z.ZodNullable<z.ZodString>;
997
+ location: z.ZodNullable<z.ZodString>;
998
+ purchasedOn: z.ZodNullable<z.ZodString>;
999
+ purchasedFrom: z.ZodNullable<z.ZodString>;
1000
+ priceMinor: z.ZodNullable<z.ZodNumber>;
1001
+ currency: z.ZodNullable<z.ZodString>;
1002
+ warrantyUntil: z.ZodNullable<z.ZodString>;
1003
+ photoFileId: z.ZodNullable<z.ZodUUID>;
1004
+ custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
1005
+ createdAt: z.ZodString;
1006
+ updatedAt: z.ZodString;
1007
+ archivedAt: z.ZodNullable<z.ZodString>;
1008
+ }, z.core.$strip>;
1009
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
1010
+ BAD_REQUEST: {
1011
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1012
+ };
1013
+ UNAUTHORIZED: {};
1014
+ FORBIDDEN: {
1015
+ data: z.ZodOptional<z.ZodObject<{
1016
+ permission: z.ZodOptional<z.ZodString>;
1017
+ }, z.core.$strip>>;
1018
+ };
1019
+ NOT_FOUND: {};
1020
+ CONFLICT: {
1021
+ data: z.ZodOptional<z.ZodObject<{
1022
+ reason: z.ZodOptional<z.ZodString>;
1023
+ }, z.core.$strip>>;
1024
+ };
1025
+ RATE_LIMITED: {};
1026
+ MODULE_DISABLED: {
1027
+ data: z.ZodObject<{
1028
+ module: z.ZodString;
1029
+ }, z.core.$strip>;
1030
+ };
1031
+ }>, Record<never, never>>;
1032
+ /**
1033
+ * Correct what was recorded — a vendor, a cost that arrived with the invoice a week later.
1034
+ *
1035
+ * Deliberately cannot set `returnedOn`: that one column decides whether the asset reads as
1036
+ * `under_repair`, so exactly one procedure moves it and the derived status has one door rather
1037
+ * than two.
1038
+ */
1039
+ update: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
1040
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
1041
+ summary: z.ZodOptional<z.ZodString>;
1042
+ detail: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
1043
+ vendor: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
1044
+ costMinor: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodNumber>>>;
1045
+ currency: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
1046
+ sentOn: z.ZodOptional<z.ZodOptional<z.ZodISODate>>;
1047
+ repairId: z.ZodUUID;
1048
+ }, z.core.$strip>, z.ZodObject<{
1049
+ repair: z.ZodObject<{
1050
+ id: z.ZodUUID;
1051
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
1052
+ assetId: z.ZodUUID;
1053
+ summary: z.ZodString;
1054
+ detail: z.ZodNullable<z.ZodString>;
1055
+ vendor: z.ZodNullable<z.ZodString>;
1056
+ costMinor: z.ZodNullable<z.ZodNumber>;
1057
+ currency: z.ZodNullable<z.ZodString>;
1058
+ sentOn: z.ZodString;
1059
+ returnedOn: z.ZodNullable<z.ZodString>;
1060
+ createdBy: z.ZodNullable<z.ZodUUID>;
1061
+ createdAt: z.ZodString;
1062
+ updatedAt: z.ZodString;
1063
+ }, z.core.$strip>;
1064
+ asset: z.ZodObject<{
1065
+ id: z.ZodUUID;
1066
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
1067
+ code: z.ZodString;
1068
+ name: z.ZodString;
1069
+ description: z.ZodString;
1070
+ categoryId: z.ZodNullable<z.ZodUUID>;
1071
+ status: z.ZodEnum<{
1072
+ in_stock: "in_stock";
1073
+ assigned: "assigned";
1074
+ reserved: "reserved";
1075
+ under_repair: "under_repair";
1076
+ lost: "lost";
1077
+ retired: "retired";
1078
+ }>;
1079
+ custodianUserId: z.ZodNullable<z.ZodUUID>;
1080
+ custodySince: z.ZodNullable<z.ZodString>;
1081
+ serialNumber: z.ZodNullable<z.ZodString>;
1082
+ location: z.ZodNullable<z.ZodString>;
1083
+ purchasedOn: z.ZodNullable<z.ZodString>;
1084
+ purchasedFrom: z.ZodNullable<z.ZodString>;
1085
+ priceMinor: z.ZodNullable<z.ZodNumber>;
1086
+ currency: z.ZodNullable<z.ZodString>;
1087
+ warrantyUntil: z.ZodNullable<z.ZodString>;
1088
+ photoFileId: z.ZodNullable<z.ZodUUID>;
1089
+ custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
1090
+ createdAt: z.ZodString;
1091
+ updatedAt: z.ZodString;
1092
+ archivedAt: z.ZodNullable<z.ZodString>;
1093
+ }, z.core.$strip>;
1094
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
1095
+ BAD_REQUEST: {
1096
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1097
+ };
1098
+ UNAUTHORIZED: {};
1099
+ FORBIDDEN: {
1100
+ data: z.ZodOptional<z.ZodObject<{
1101
+ permission: z.ZodOptional<z.ZodString>;
1102
+ }, z.core.$strip>>;
1103
+ };
1104
+ NOT_FOUND: {};
1105
+ CONFLICT: {
1106
+ data: z.ZodOptional<z.ZodObject<{
1107
+ reason: z.ZodOptional<z.ZodString>;
1108
+ }, z.core.$strip>>;
1109
+ };
1110
+ RATE_LIMITED: {};
1111
+ MODULE_DISABLED: {
1112
+ data: z.ZodObject<{
1113
+ module: z.ZodString;
1114
+ }, z.core.$strip>;
1115
+ };
1116
+ }>, Record<never, never>>;
1117
+ /**
1118
+ * It came back. Closes the repair and puts the asset back to `assigned` if somebody still holds
1119
+ * it, or `in_stock` if nobody does — never blindly to `in_stock`, which would quietly release
1120
+ * whoever is answerable for it.
1121
+ *
1122
+ * Takes the cost, because that is when the invoice usually arrives.
1123
+ */
1124
+ complete: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
1125
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
1126
+ repairId: z.ZodUUID;
1127
+ returnedOn: z.ZodOptional<z.ZodISODate>;
1128
+ costMinor: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1129
+ currency: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1130
+ }, z.core.$strip>, z.ZodObject<{
1131
+ repair: z.ZodObject<{
1132
+ id: z.ZodUUID;
1133
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
1134
+ assetId: z.ZodUUID;
1135
+ summary: z.ZodString;
1136
+ detail: z.ZodNullable<z.ZodString>;
1137
+ vendor: z.ZodNullable<z.ZodString>;
1138
+ costMinor: z.ZodNullable<z.ZodNumber>;
1139
+ currency: z.ZodNullable<z.ZodString>;
1140
+ sentOn: z.ZodString;
1141
+ returnedOn: z.ZodNullable<z.ZodString>;
1142
+ createdBy: z.ZodNullable<z.ZodUUID>;
1143
+ createdAt: z.ZodString;
1144
+ updatedAt: z.ZodString;
1145
+ }, z.core.$strip>;
1146
+ asset: z.ZodObject<{
1147
+ id: z.ZodUUID;
1148
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
1149
+ code: z.ZodString;
1150
+ name: z.ZodString;
1151
+ description: z.ZodString;
1152
+ categoryId: z.ZodNullable<z.ZodUUID>;
1153
+ status: z.ZodEnum<{
1154
+ in_stock: "in_stock";
1155
+ assigned: "assigned";
1156
+ reserved: "reserved";
1157
+ under_repair: "under_repair";
1158
+ lost: "lost";
1159
+ retired: "retired";
1160
+ }>;
1161
+ custodianUserId: z.ZodNullable<z.ZodUUID>;
1162
+ custodySince: z.ZodNullable<z.ZodString>;
1163
+ serialNumber: z.ZodNullable<z.ZodString>;
1164
+ location: z.ZodNullable<z.ZodString>;
1165
+ purchasedOn: z.ZodNullable<z.ZodString>;
1166
+ purchasedFrom: z.ZodNullable<z.ZodString>;
1167
+ priceMinor: z.ZodNullable<z.ZodNumber>;
1168
+ currency: z.ZodNullable<z.ZodString>;
1169
+ warrantyUntil: z.ZodNullable<z.ZodString>;
1170
+ photoFileId: z.ZodNullable<z.ZodUUID>;
1171
+ custom: z.ZodRecord<z.ZodString, z.ZodUnknown>;
1172
+ createdAt: z.ZodString;
1173
+ updatedAt: z.ZodString;
1174
+ archivedAt: z.ZodNullable<z.ZodString>;
1175
+ }, z.core.$strip>;
1176
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
1177
+ BAD_REQUEST: {
1178
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1179
+ };
1180
+ UNAUTHORIZED: {};
1181
+ FORBIDDEN: {
1182
+ data: z.ZodOptional<z.ZodObject<{
1183
+ permission: z.ZodOptional<z.ZodString>;
1184
+ }, z.core.$strip>>;
1185
+ };
1186
+ NOT_FOUND: {};
1187
+ CONFLICT: {
1188
+ data: z.ZodOptional<z.ZodObject<{
1189
+ reason: z.ZodOptional<z.ZodString>;
1190
+ }, z.core.$strip>>;
1191
+ };
1192
+ RATE_LIMITED: {};
1193
+ MODULE_DISABLED: {
1194
+ data: z.ZodObject<{
1195
+ module: z.ZodString;
1196
+ }, z.core.$strip>;
1197
+ };
1198
+ }>, Record<never, never>>;
1199
+ };
1200
+ /**
1201
+ * Receipts, warranties, manuals — and the asset's photo, which is an `Asset` field rather than one
1202
+ * of these.
1203
+ *
1204
+ * **Behind the `attachments` capability**, so these answer 404 in a workspace that has it off.
1205
+ *
1206
+ * **A module does not upload.** The browser sends the bytes to core's file service and hands this
1207
+ * module the id core gave it; `add` records that this asset has that file. Nothing here streams,
1208
+ * signs or stores anything, and `remove` detaches rather than deleting core's file — the same
1209
+ * bytes may be attached elsewhere, and a module has no standing to destroy another module's row.
1210
+ */
1211
+ attachments: {
1212
+ /**
1213
+ * Every file on one asset, its repairs' included, each carrying its own `repairId`.
1214
+ *
1215
+ * Not paged and not filtered by repair: one asset's files are bounded and entirely loaded, so
1216
+ * the panel groups them in the browser. That is the one case where filtering client-side is
1217
+ * right, and it is the opposite of what `assets.list` may do.
1218
+ */
1219
+ list: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
1220
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
1221
+ assetId: z.ZodUUID;
1222
+ }, z.core.$strip>, z.ZodArray<z.ZodObject<{
1223
+ id: z.ZodUUID;
1224
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
1225
+ assetId: z.ZodUUID;
1226
+ repairId: z.ZodNullable<z.ZodUUID>;
1227
+ fileId: z.ZodUUID;
1228
+ name: z.ZodString;
1229
+ mimeType: z.ZodNullable<z.ZodString>;
1230
+ size: z.ZodNullable<z.ZodNumber>;
1231
+ uploadedBy: z.ZodNullable<z.ZodUUID>;
1232
+ createdAt: z.ZodString;
1233
+ }, z.core.$strip>>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
1234
+ BAD_REQUEST: {
1235
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1236
+ };
1237
+ UNAUTHORIZED: {};
1238
+ FORBIDDEN: {
1239
+ data: z.ZodOptional<z.ZodObject<{
1240
+ permission: z.ZodOptional<z.ZodString>;
1241
+ }, z.core.$strip>>;
1242
+ };
1243
+ NOT_FOUND: {};
1244
+ CONFLICT: {
1245
+ data: z.ZodOptional<z.ZodObject<{
1246
+ reason: z.ZodOptional<z.ZodString>;
1247
+ }, z.core.$strip>>;
1248
+ };
1249
+ RATE_LIMITED: {};
1250
+ MODULE_DISABLED: {
1251
+ data: z.ZodObject<{
1252
+ module: z.ZodString;
1253
+ }, z.core.$strip>;
1254
+ };
1255
+ }>, Record<never, never>>;
1256
+ /** Attach files core already holds. `repairId` files them under one repair instead of the asset. */
1257
+ add: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
1258
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
1259
+ assetId: z.ZodUUID;
1260
+ fileIds: z.ZodArray<z.ZodUUID>;
1261
+ repairId: z.ZodOptional<z.ZodNullable<z.ZodUUID>>;
1262
+ }, z.core.$strip>, z.ZodArray<z.ZodObject<{
1263
+ id: z.ZodUUID;
1264
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
1265
+ assetId: z.ZodUUID;
1266
+ repairId: z.ZodNullable<z.ZodUUID>;
1267
+ fileId: z.ZodUUID;
1268
+ name: z.ZodString;
1269
+ mimeType: z.ZodNullable<z.ZodString>;
1270
+ size: z.ZodNullable<z.ZodNumber>;
1271
+ uploadedBy: z.ZodNullable<z.ZodUUID>;
1272
+ createdAt: z.ZodString;
1273
+ }, z.core.$strip>>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
1274
+ BAD_REQUEST: {
1275
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1276
+ };
1277
+ UNAUTHORIZED: {};
1278
+ FORBIDDEN: {
1279
+ data: z.ZodOptional<z.ZodObject<{
1280
+ permission: z.ZodOptional<z.ZodString>;
1281
+ }, z.core.$strip>>;
1282
+ };
1283
+ NOT_FOUND: {};
1284
+ CONFLICT: {
1285
+ data: z.ZodOptional<z.ZodObject<{
1286
+ reason: z.ZodOptional<z.ZodString>;
1287
+ }, z.core.$strip>>;
1288
+ };
1289
+ RATE_LIMITED: {};
1290
+ MODULE_DISABLED: {
1291
+ data: z.ZodObject<{
1292
+ module: z.ZodString;
1293
+ }, z.core.$strip>;
1294
+ };
1295
+ }>, Record<never, never>>;
1296
+ /** Answers with the id it detached, so a client can drop exactly that row without re-reading. */
1297
+ remove: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
1298
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
1299
+ attachmentId: z.ZodUUID;
1300
+ }, z.core.$strip>, z.ZodObject<{
1301
+ id: z.ZodUUID;
1302
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
1303
+ BAD_REQUEST: {
1304
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1305
+ };
1306
+ UNAUTHORIZED: {};
1307
+ FORBIDDEN: {
1308
+ data: z.ZodOptional<z.ZodObject<{
1309
+ permission: z.ZodOptional<z.ZodString>;
1310
+ }, z.core.$strip>>;
1311
+ };
1312
+ NOT_FOUND: {};
1313
+ CONFLICT: {
1314
+ data: z.ZodOptional<z.ZodObject<{
1315
+ reason: z.ZodOptional<z.ZodString>;
1316
+ }, z.core.$strip>>;
1317
+ };
1318
+ RATE_LIMITED: {};
1319
+ MODULE_DISABLED: {
1320
+ data: z.ZodObject<{
1321
+ module: z.ZodString;
1322
+ }, z.core.$strip>;
1323
+ };
1324
+ }>, Record<never, never>>;
1325
+ };
1326
+ /**
1327
+ * The register in numbers.
1328
+ *
1329
+ * One procedure rather than a `total` on `assets.list`, because they answer different questions:
1330
+ * a list's total describes the filter you asked for, and this describes the workspace. The assets
1331
+ * page needs both — "showing 50 of 214" is two numbers from two places.
1332
+ *
1333
+ * Not behind a capability: it counts assets, which is `core`. `outForRepair` comes back null
1334
+ * rather than 0 where `repairs` is off — see `InventoryStats`.
1335
+ */
1336
+ stats: {
1337
+ summary: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
1338
+ workspaceId: z.core.$ZodBranded<z.ZodUUID, "WorkspaceId", "out">;
1339
+ }, z.core.$strip>, z.ZodObject<{
1340
+ total: z.ZodNumber;
1341
+ archived: z.ZodNumber;
1342
+ byStatus: z.ZodRecord<z.ZodEnum<{
1343
+ in_stock: "in_stock";
1344
+ assigned: "assigned";
1345
+ reserved: "reserved";
1346
+ under_repair: "under_repair";
1347
+ lost: "lost";
1348
+ retired: "retired";
1349
+ }>, z.ZodNumber>;
1350
+ outForRepair: z.ZodNullable<z.ZodNumber>;
1351
+ unassigned: z.ZodNumber;
1352
+ }, z.core.$strip>, import("@orpc/contract").MergedErrorMap<Record<never, never>, {
1353
+ BAD_REQUEST: {
1354
+ data: z.ZodOptional<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1355
+ };
1356
+ UNAUTHORIZED: {};
1357
+ FORBIDDEN: {
1358
+ data: z.ZodOptional<z.ZodObject<{
1359
+ permission: z.ZodOptional<z.ZodString>;
1360
+ }, z.core.$strip>>;
1361
+ };
1362
+ NOT_FOUND: {};
1363
+ CONFLICT: {
1364
+ data: z.ZodOptional<z.ZodObject<{
1365
+ reason: z.ZodOptional<z.ZodString>;
1366
+ }, z.core.$strip>>;
1367
+ };
1368
+ RATE_LIMITED: {};
1369
+ MODULE_DISABLED: {
1370
+ data: z.ZodObject<{
1371
+ module: z.ZodString;
1372
+ }, z.core.$strip>;
1373
+ };
1374
+ }>, Record<never, never>>;
1375
+ };
1376
+ };
1377
+ export type InventoryContract = typeof inventoryContract;
1378
+ //# sourceMappingURL=router.d.ts.map