@asturiu/v0-sdk 0.0.0-stage → 1.0.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 (239) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +5 -0
  4. package/README.md +82 -2
  5. package/contract/assertion-vectors.json +90 -0
  6. package/contract/schemas/branding.schema.json +46 -0
  7. package/contract/schemas/definitions.schema.json +376 -0
  8. package/contract/schemas/portal.schema.json +56 -0
  9. package/contract/tenant-api-routes.json +165 -0
  10. package/dist/branding.d.ts +131 -0
  11. package/dist/branding.d.ts.map +1 -0
  12. package/dist/branding.js +206 -0
  13. package/dist/branding.js.map +1 -0
  14. package/dist/changesets.d.ts +58 -0
  15. package/dist/changesets.d.ts.map +1 -0
  16. package/dist/changesets.js +18 -0
  17. package/dist/changesets.js.map +1 -0
  18. package/dist/cli/bin.d.ts +3 -0
  19. package/dist/cli/bin.d.ts.map +1 -0
  20. package/dist/cli/bin.js +12 -0
  21. package/dist/cli/bin.js.map +1 -0
  22. package/dist/cli/changesets.d.ts +14 -0
  23. package/dist/cli/changesets.d.ts.map +1 -0
  24. package/dist/cli/changesets.js +252 -0
  25. package/dist/cli/changesets.js.map +1 -0
  26. package/dist/cli/cli.d.ts +37 -0
  27. package/dist/cli/cli.d.ts.map +1 -0
  28. package/dist/cli/cli.js +415 -0
  29. package/dist/cli/cli.js.map +1 -0
  30. package/dist/cli/context.d.ts +147 -0
  31. package/dist/cli/context.d.ts.map +1 -0
  32. package/dist/cli/context.js +258 -0
  33. package/dist/cli/context.js.map +1 -0
  34. package/dist/cli/engine.d.ts +59 -0
  35. package/dist/cli/engine.d.ts.map +1 -0
  36. package/dist/cli/engine.js +85 -0
  37. package/dist/cli/engine.js.map +1 -0
  38. package/dist/cli/feedback.d.ts +40 -0
  39. package/dist/cli/feedback.d.ts.map +1 -0
  40. package/dist/cli/feedback.js +420 -0
  41. package/dist/cli/feedback.js.map +1 -0
  42. package/dist/cli/files.d.ts +83 -0
  43. package/dist/cli/files.d.ts.map +1 -0
  44. package/dist/cli/files.js +389 -0
  45. package/dist/cli/files.js.map +1 -0
  46. package/dist/cli/index.d.ts +8 -0
  47. package/dist/cli/index.d.ts.map +1 -0
  48. package/dist/cli/index.js +8 -0
  49. package/dist/cli/index.js.map +1 -0
  50. package/dist/cli/overview.d.ts +6 -0
  51. package/dist/cli/overview.d.ts.map +1 -0
  52. package/dist/cli/overview.js +379 -0
  53. package/dist/cli/overview.js.map +1 -0
  54. package/dist/cli/parts.d.ts +5 -0
  55. package/dist/cli/parts.d.ts.map +1 -0
  56. package/dist/cli/parts.js +414 -0
  57. package/dist/cli/parts.js.map +1 -0
  58. package/dist/cli/sources.d.ts +37 -0
  59. package/dist/cli/sources.d.ts.map +1 -0
  60. package/dist/cli/sources.js +91 -0
  61. package/dist/cli/sources.js.map +1 -0
  62. package/dist/cli/terminal.d.ts +135 -0
  63. package/dist/cli/terminal.d.ts.map +1 -0
  64. package/dist/cli/terminal.js +353 -0
  65. package/dist/cli/terminal.js.map +1 -0
  66. package/dist/cli/ui-page.d.ts +8 -0
  67. package/dist/cli/ui-page.d.ts.map +1 -0
  68. package/dist/cli/ui-page.js +216 -0
  69. package/dist/cli/ui-page.js.map +1 -0
  70. package/dist/cli/ui.d.ts +54 -0
  71. package/dist/cli/ui.d.ts.map +1 -0
  72. package/dist/cli/ui.js +251 -0
  73. package/dist/cli/ui.js.map +1 -0
  74. package/dist/client.d.ts +88 -0
  75. package/dist/client.d.ts.map +1 -0
  76. package/dist/client.js +165 -0
  77. package/dist/client.js.map +1 -0
  78. package/dist/contacts.d.ts +43 -0
  79. package/dist/contacts.d.ts.map +1 -0
  80. package/dist/contacts.js +46 -0
  81. package/dist/contacts.js.map +1 -0
  82. package/dist/definition-set.d.ts +731 -0
  83. package/dist/definition-set.d.ts.map +1 -0
  84. package/dist/definition-set.js +659 -0
  85. package/dist/definition-set.js.map +1 -0
  86. package/dist/definitions.d.ts +42 -0
  87. package/dist/definitions.d.ts.map +1 -0
  88. package/dist/definitions.js +154 -0
  89. package/dist/definitions.js.map +1 -0
  90. package/dist/enrolment.d.ts +9 -0
  91. package/dist/enrolment.d.ts.map +1 -0
  92. package/dist/enrolment.js +8 -0
  93. package/dist/enrolment.js.map +1 -0
  94. package/dist/fill.d.ts +73 -0
  95. package/dist/fill.d.ts.map +1 -0
  96. package/dist/fill.js +46 -0
  97. package/dist/fill.js.map +1 -0
  98. package/dist/index.d.ts +39 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +39 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/notifications.d.ts +33 -0
  103. package/dist/notifications.d.ts.map +1 -0
  104. package/dist/notifications.js +36 -0
  105. package/dist/notifications.js.map +1 -0
  106. package/dist/oidc.d.ts +122 -0
  107. package/dist/oidc.d.ts.map +1 -0
  108. package/dist/oidc.js +150 -0
  109. package/dist/oidc.js.map +1 -0
  110. package/dist/overlay.d.ts +109 -0
  111. package/dist/overlay.d.ts.map +1 -0
  112. package/dist/overlay.js +58 -0
  113. package/dist/overlay.js.map +1 -0
  114. package/dist/passes.d.ts +95 -0
  115. package/dist/passes.d.ts.map +1 -0
  116. package/dist/passes.js +140 -0
  117. package/dist/passes.js.map +1 -0
  118. package/dist/portal-options.d.ts +65 -0
  119. package/dist/portal-options.d.ts.map +1 -0
  120. package/dist/portal-options.js +120 -0
  121. package/dist/portal-options.js.map +1 -0
  122. package/dist/reads.d.ts +41 -0
  123. package/dist/reads.d.ts.map +1 -0
  124. package/dist/reads.js +44 -0
  125. package/dist/reads.js.map +1 -0
  126. package/dist/recovery-words.d.ts +8 -0
  127. package/dist/recovery-words.d.ts.map +1 -0
  128. package/dist/recovery-words.js +136 -0
  129. package/dist/recovery-words.js.map +1 -0
  130. package/dist/recovery.d.ts +198 -0
  131. package/dist/recovery.d.ts.map +1 -0
  132. package/dist/recovery.js +112 -0
  133. package/dist/recovery.js.map +1 -0
  134. package/dist/reveal.d.ts +35 -0
  135. package/dist/reveal.d.ts.map +1 -0
  136. package/dist/reveal.js +66 -0
  137. package/dist/reveal.js.map +1 -0
  138. package/dist/seal.d.ts +15 -0
  139. package/dist/seal.d.ts.map +1 -0
  140. package/dist/seal.js +0 -0
  141. package/dist/seal.js.map +1 -0
  142. package/dist/session.d.ts +66 -0
  143. package/dist/session.d.ts.map +1 -0
  144. package/dist/session.js +61 -0
  145. package/dist/session.js.map +1 -0
  146. package/dist/signing-in-mark.d.ts +14 -0
  147. package/dist/signing-in-mark.d.ts.map +1 -0
  148. package/dist/signing-in-mark.js +24 -0
  149. package/dist/signing-in-mark.js.map +1 -0
  150. package/dist/signing-in.d.ts +22 -0
  151. package/dist/signing-in.d.ts.map +1 -0
  152. package/dist/signing-in.js +203 -0
  153. package/dist/signing-in.js.map +1 -0
  154. package/dist/tags.d.ts +96 -0
  155. package/dist/tags.d.ts.map +1 -0
  156. package/dist/tags.js +88 -0
  157. package/dist/tags.js.map +1 -0
  158. package/dist/tenant-subscription.d.ts +47 -0
  159. package/dist/tenant-subscription.d.ts.map +1 -0
  160. package/dist/tenant-subscription.js +7 -0
  161. package/dist/tenant-subscription.js.map +1 -0
  162. package/dist/testing/index.d.ts +125 -0
  163. package/dist/testing/index.d.ts.map +1 -0
  164. package/dist/testing/index.js +320 -0
  165. package/dist/testing/index.js.map +1 -0
  166. package/dist/theme.d.ts +237 -0
  167. package/dist/theme.d.ts.map +1 -0
  168. package/dist/theme.js +504 -0
  169. package/dist/theme.js.map +1 -0
  170. package/dist/tickets.d.ts +152 -0
  171. package/dist/tickets.d.ts.map +1 -0
  172. package/dist/tickets.js +65 -0
  173. package/dist/tickets.js.map +1 -0
  174. package/dist/tiers.d.ts +168 -0
  175. package/dist/tiers.d.ts.map +1 -0
  176. package/dist/tiers.js +341 -0
  177. package/dist/tiers.js.map +1 -0
  178. package/dist/types.d.ts +885 -0
  179. package/dist/types.d.ts.map +1 -0
  180. package/dist/types.js +12 -0
  181. package/dist/types.js.map +1 -0
  182. package/dist/urlid.d.ts +50 -0
  183. package/dist/urlid.d.ts.map +1 -0
  184. package/dist/urlid.js +78 -0
  185. package/dist/urlid.js.map +1 -0
  186. package/dist/version.d.ts +15 -0
  187. package/dist/version.d.ts.map +1 -0
  188. package/dist/version.js +15 -0
  189. package/dist/version.js.map +1 -0
  190. package/make/asturiu.mk +43 -0
  191. package/package.json +63 -4
  192. package/src/branding.ts +221 -0
  193. package/src/changesets.ts +61 -0
  194. package/src/cli/bin.ts +12 -0
  195. package/src/cli/changesets.ts +233 -0
  196. package/src/cli/cli.ts +425 -0
  197. package/src/cli/context.ts +299 -0
  198. package/src/cli/engine.ts +112 -0
  199. package/src/cli/feedback.ts +406 -0
  200. package/src/cli/files.ts +371 -0
  201. package/src/cli/index.ts +7 -0
  202. package/src/cli/overview.ts +343 -0
  203. package/src/cli/parts.ts +371 -0
  204. package/src/cli/sources.ts +111 -0
  205. package/src/cli/terminal.ts +384 -0
  206. package/src/cli/ui-page.ts +215 -0
  207. package/src/cli/ui.ts +266 -0
  208. package/src/client.ts +202 -0
  209. package/src/contacts.ts +61 -0
  210. package/src/definition-set.ts +965 -0
  211. package/src/definitions.ts +156 -0
  212. package/src/enrolment.ts +10 -0
  213. package/src/fill.ts +83 -0
  214. package/src/index.ts +38 -0
  215. package/src/notifications.ts +55 -0
  216. package/src/oidc.ts +199 -0
  217. package/src/overlay.ts +137 -0
  218. package/src/passes.ts +168 -0
  219. package/src/portal-options.ts +125 -0
  220. package/src/reads.ts +71 -0
  221. package/src/recovery-words.ts +137 -0
  222. package/src/recovery.ts +269 -0
  223. package/src/reveal.ts +72 -0
  224. package/src/seal.ts +0 -0
  225. package/src/session.ts +93 -0
  226. package/src/signing-in-mark.ts +23 -0
  227. package/src/signing-in.ts +213 -0
  228. package/src/tags.ts +146 -0
  229. package/src/tenant-subscription.ts +44 -0
  230. package/src/testing/index.ts +337 -0
  231. package/src/theme.ts +628 -0
  232. package/src/tickets.ts +195 -0
  233. package/src/tiers.ts +397 -0
  234. package/src/types.ts +847 -0
  235. package/src/urlid.ts +77 -0
  236. package/src/version.ts +15 -0
  237. package/templates/asturiu/branding.json +4 -0
  238. package/templates/asturiu/definitions.json +23 -0
  239. package/templates/asturiu/portal.json +16 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The `/v0` surface as a Frontend sees it (components/05-interface-api.md
3
+ * §API, §Representation): the ARID is the only identifier that crosses the
4
+ * boundary. These types mirror what the Interface API serialises; they hold
5
+ * no Engine internals and pull in no Engine dependency.
6
+ */
7
+ /** What an Entry is (ADR-014). The Engine's Definition schema checks the same list; a test there fails when they differ. */
8
+ export const ENTRY_KINDS = ["file", "folder"];
9
+ /** What a Field's value is. The Engine's Definition schema checks the same list; a test there fails when they differ. */
10
+ export const FIELD_VALUE_TYPES = ["text", "password", "number", "boolean", "date", "datetime", "email", "phone", "url", "json", "attachment"];
11
+ export const CAPABILITIES = ["read", "reveal", "update", "delete", "share", "transfer"];
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,4HAA4H;AAC5H,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAU,CAAC;AAGvD,yHAAyH;AACzH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAU,CAAC;AAIvJ,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The ARID type tokens (ADR-008). The Engine's `arid` module keeps the same
3
+ * list; a test there fails when they differ.
4
+ */
5
+ export declare const ARID_TYPE_TOKENS: readonly ["tnt", "usr", "cst", "vlt", "prn", "grp", "pfl", "wlt", "ent", "fld", "att", "wdf", "edf", "fdf", "grt", "trg", "evt", "ntf", "rcv", "trf", "cnt", "msg", "ovl", "pss", "tkt", "sbs"];
6
+ /** The type token a route fixes (ADR-008). */
7
+ export type ResourceType = (typeof ARID_TYPE_TOKENS)[number];
8
+ /**
9
+ * The URL spelling of an ARID (components/02 §Resource URLs).
10
+ *
11
+ * A browser URL names a resource by its `ResourceID` alone when the Issuer is
12
+ * `global`, and by `<issuer>~<ResourceID>` otherwise:
13
+ *
14
+ * /wallets/01M25QTXZNCXBE3DCYZQWAMB72 ARID:0:global:wlt:01M25Q…
15
+ * /wallets/device-a~01M25QTXZNCXBE3DCYZQWAMB72 ARID:0:device-a:wlt:01M25Q…
16
+ *
17
+ * This is a *rendering* of the ARID, never an identifier of its own: the route
18
+ * fixes the type, the form fixes the ARID version, and the page rebuilds the
19
+ * full ARID before anything else sees it. Four rules keep that safe:
20
+ *
21
+ * 1. One route family per resource type. A route that could show two types
22
+ * cannot rebuild the ARID.
23
+ * 2. URL forms are added, never retired. A later ARID version gets its own
24
+ * form; every form ever linked keeps resolving.
25
+ * 3. Only a browser URL ever carries this form. Nothing stores, logs, HMACs or
26
+ * emits it — those carry the ARID. No Engine component imports this file,
27
+ * with one exception (ADR-048): a link to a frontend page that the Engine
28
+ * sends to a person — today only the Operations API's approval link of a
29
+ * waiting Definition plan. A new case needs an ADR.
30
+ * 4. A route that moves keeps a redirect from the old path.
31
+ *
32
+ * `~` is an RFC 3986 unreserved character that neither the Issuer grammar
33
+ * (`[a-z0-9-]`) nor a ULID (uppercase Crockford base32) contains, so the form
34
+ * needs no percent-encoding and parses without lookahead. The grammar is
35
+ * repeated here rather than imported: the Frontend kit must stay free of
36
+ * `node:` imports (ADR-013), and `../arid.js` pulls in `node:crypto`.
37
+ */
38
+ /** The Issuer a bare `ResourceID` stands for. Fixed, not per deployment: a link must mean the same thing everywhere. */
39
+ export declare const URL_DEFAULT_ISSUER = "global";
40
+ /** The URL segment for an ARID. Throws on a malformed ARID: only a value the Engine issued belongs in a link. */
41
+ export declare function aridToUrlId(arid: string): string;
42
+ /**
43
+ * The ARID a route segment names, for the type the route fixes. Accepts the
44
+ * canonical form, a lower-cased `ResourceID` (Crockford base32 is
45
+ * case-insensitive) and a full ARID of the same type; `null` for anything
46
+ * else. Compare the segment with `aridToUrlId(result)` to decide whether to
47
+ * redirect to the canonical spelling.
48
+ */
49
+ export declare function aridFromUrlId(type: ResourceType, segment: string): string | null;
50
+ //# sourceMappingURL=urlid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urlid.d.ts","sourceRoot":"","sources":["../src/urlid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,gBAAgB,iMAAkM,CAAC;AAChO,8CAA8C;AAC9C,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,wHAAwH;AACxH,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAO3C,iHAAiH;AACjH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAahF"}
package/dist/urlid.js ADDED
@@ -0,0 +1,78 @@
1
+ /**
2
+ * The ARID type tokens (ADR-008). The Engine's `arid` module keeps the same
3
+ * list; a test there fails when they differ.
4
+ */
5
+ export const ARID_TYPE_TOKENS = ["tnt", "usr", "cst", "vlt", "prn", "grp", "pfl", "wlt", "ent", "fld", "att", "wdf", "edf", "fdf", "grt", "trg", "evt", "ntf", "rcv", "trf", "cnt", "msg", "ovl", "pss", "tkt", "sbs"];
6
+ /**
7
+ * The URL spelling of an ARID (components/02 §Resource URLs).
8
+ *
9
+ * A browser URL names a resource by its `ResourceID` alone when the Issuer is
10
+ * `global`, and by `<issuer>~<ResourceID>` otherwise:
11
+ *
12
+ * /wallets/01M25QTXZNCXBE3DCYZQWAMB72 ARID:0:global:wlt:01M25Q…
13
+ * /wallets/device-a~01M25QTXZNCXBE3DCYZQWAMB72 ARID:0:device-a:wlt:01M25Q…
14
+ *
15
+ * This is a *rendering* of the ARID, never an identifier of its own: the route
16
+ * fixes the type, the form fixes the ARID version, and the page rebuilds the
17
+ * full ARID before anything else sees it. Four rules keep that safe:
18
+ *
19
+ * 1. One route family per resource type. A route that could show two types
20
+ * cannot rebuild the ARID.
21
+ * 2. URL forms are added, never retired. A later ARID version gets its own
22
+ * form; every form ever linked keeps resolving.
23
+ * 3. Only a browser URL ever carries this form. Nothing stores, logs, HMACs or
24
+ * emits it — those carry the ARID. No Engine component imports this file,
25
+ * with one exception (ADR-048): a link to a frontend page that the Engine
26
+ * sends to a person — today only the Operations API's approval link of a
27
+ * waiting Definition plan. A new case needs an ADR.
28
+ * 4. A route that moves keeps a redirect from the old path.
29
+ *
30
+ * `~` is an RFC 3986 unreserved character that neither the Issuer grammar
31
+ * (`[a-z0-9-]`) nor a ULID (uppercase Crockford base32) contains, so the form
32
+ * needs no percent-encoding and parses without lookahead. The grammar is
33
+ * repeated here rather than imported: the Frontend kit must stay free of
34
+ * `node:` imports (ADR-013), and `../arid.js` pulls in `node:crypto`.
35
+ */
36
+ /** The Issuer a bare `ResourceID` stands for. Fixed, not per deployment: a link must mean the same thing everywhere. */
37
+ export const URL_DEFAULT_ISSUER = "global";
38
+ const URL_ISSUER_SEPARATOR = "~";
39
+ const ARID_VERSION = "0";
40
+ const ISSUER_REGEX = /^[a-z0-9][a-z0-9-]{0,62}$/;
41
+ const ULID_REGEX = /^[0-9A-HJKMNP-TV-Z]{26}$/;
42
+ const TYPE_REGEX = /^[a-z]{3}$/;
43
+ /** The URL segment for an ARID. Throws on a malformed ARID: only a value the Engine issued belongs in a link. */
44
+ export function aridToUrlId(arid) {
45
+ const parts = arid.split(":");
46
+ if (parts.length !== 5 || parts[0] !== "ARID" || parts[1] !== ARID_VERSION)
47
+ throw new Error("malformed ARID");
48
+ const [, , issuer, , id] = parts;
49
+ if (!ISSUER_REGEX.test(issuer) || !ULID_REGEX.test(id))
50
+ throw new Error("malformed ARID");
51
+ return issuer === URL_DEFAULT_ISSUER ? id : `${issuer}${URL_ISSUER_SEPARATOR}${id}`;
52
+ }
53
+ /**
54
+ * The ARID a route segment names, for the type the route fixes. Accepts the
55
+ * canonical form, a lower-cased `ResourceID` (Crockford base32 is
56
+ * case-insensitive) and a full ARID of the same type; `null` for anything
57
+ * else. Compare the segment with `aridToUrlId(result)` to decide whether to
58
+ * redirect to the canonical spelling.
59
+ */
60
+ export function aridFromUrlId(type, segment) {
61
+ if (!TYPE_REGEX.test(type))
62
+ return null;
63
+ if (segment.startsWith("ARID:")) {
64
+ const parts = segment.split(":");
65
+ if (parts.length !== 5 || parts[1] !== ARID_VERSION || parts[3] !== type)
66
+ return null;
67
+ if (!ISSUER_REGEX.test(parts[2]) || !ULID_REGEX.test(parts[4]))
68
+ return null;
69
+ return segment;
70
+ }
71
+ const at = segment.indexOf(URL_ISSUER_SEPARATOR);
72
+ const issuer = at < 0 ? URL_DEFAULT_ISSUER : segment.slice(0, at);
73
+ const id = (at < 0 ? segment : segment.slice(at + 1)).toUpperCase();
74
+ if (!ISSUER_REGEX.test(issuer) || !ULID_REGEX.test(id))
75
+ return null;
76
+ return `ARID:${ARID_VERSION}:${issuer}:${type}:${id}`;
77
+ }
78
+ //# sourceMappingURL=urlid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urlid.js","sourceRoot":"","sources":["../src/urlid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The SDK's own version (ADR-074 §4): a semantic version of its own, separate
3
+ * from the Engine's. A test checks it against `package.json`. The Asturiu
4
+ * generation is in the name, never in the number.
5
+ */
6
+ export declare const SDK_NAME = "@asturiu/v0-sdk";
7
+ export declare const SDK_VERSION = "1.0.0";
8
+ /**
9
+ * What every Tenant API call sends as its `User-Agent`. The Tenant API
10
+ * forwards the version as `X-Asturiu-Sdk-Version`, and the Engine records it
11
+ * on the key as `last_sdk_version`: how an administrator sees what a
12
+ * Tenant's server runs.
13
+ */
14
+ export declare const SDK_USER_AGENT = "asturiu-v0-sdk/1.0.0";
15
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,QAAQ,oBAAoB,CAAC;AAC1C,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,yBAAkC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The SDK's own version (ADR-074 §4): a semantic version of its own, separate
3
+ * from the Engine's. A test checks it against `package.json`. The Asturiu
4
+ * generation is in the name, never in the number.
5
+ */
6
+ export const SDK_NAME = "@asturiu/v0-sdk";
7
+ export const SDK_VERSION = "1.0.0";
8
+ /**
9
+ * What every Tenant API call sends as its `User-Agent`. The Tenant API
10
+ * forwards the version as `X-Asturiu-Sdk-Version`, and the Engine records it
11
+ * on the key as `last_sdk_version`: how an administrator sees what a
12
+ * Tenant's server runs.
13
+ */
14
+ export const SDK_USER_AGENT = `asturiu-v0-sdk/${SDK_VERSION}`;
15
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,iBAAiB,CAAC;AAC1C,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,WAAW,EAAE,CAAC"}
@@ -0,0 +1,43 @@
1
+ # Make targets for the Tenant command line (ADR-074 §6). Include this file from your Makefile:
2
+ #
3
+ # include node_modules/@asturiu/v0-sdk/make/asturiu.mk
4
+ #
5
+ # Each target runs one command of the installed asturiu-v0-tenant, with no logic, no secret and no default of its own.
6
+ # `npx --no-install asturiu-v0-tenant` runs only the installed version and never downloads one. The key stays in ASTURIU_TENANT_KEY.
7
+
8
+ .PHONY: asturiu-status asturiu-doctor asturiu-definitions asturiu-branding asturiu-apply asturiu-pull asturiu-changesets asturiu-changeset asturiu-feedback-queue asturiu-feedback-send asturiu-ui
9
+
10
+ asturiu-status:
11
+ npx --no-install asturiu-v0-tenant status
12
+
13
+ asturiu-doctor:
14
+ npx --no-install asturiu-v0-tenant doctor
15
+
16
+ asturiu-definitions:
17
+ npx --no-install asturiu-v0-tenant definitions
18
+
19
+ asturiu-branding:
20
+ npx --no-install asturiu-v0-tenant branding
21
+
22
+ # PARTS=definitions, branding or portal, separated by spaces; none sends all three.
23
+ asturiu-apply:
24
+ npx --no-install asturiu-v0-tenant apply $(PARTS)
25
+
26
+ asturiu-pull:
27
+ npx --no-install asturiu-v0-tenant pull
28
+
29
+ asturiu-changesets:
30
+ npx --no-install asturiu-v0-tenant changesets
31
+
32
+ # N=<changeset> shows one; with STATUS=<status> it reports where you stand, with NOTE= and REASON= when needed.
33
+ asturiu-changeset:
34
+ npx --no-install asturiu-v0-tenant changeset $(N) $(STATUS) --note "$(NOTE)" --reason "$(REASON)"
35
+
36
+ asturiu-feedback-queue:
37
+ npx --no-install asturiu-v0-tenant feedback queue
38
+
39
+ asturiu-feedback-send:
40
+ npx --no-install asturiu-v0-tenant feedback send
41
+
42
+ asturiu-ui:
43
+ npx --no-install asturiu-v0-tenant ui
package/package.json CHANGED
@@ -1,6 +1,65 @@
1
1
  {
2
2
  "name": "@asturiu/v0-sdk",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "The Tenant SDK for Asturiu v0: the /v0 client and types, sign-in, the Definition set, branding and portal files, the signed Tenant API calls, and the asturiu-v0-tenant command line.",
5
+ "keywords": [
6
+ "asturiu",
7
+ "tenant",
8
+ "sdk",
9
+ "cli"
10
+ ],
11
+ "homepage": "https://asturiu.com",
12
+ "license": "Apache-2.0",
13
+ "author": "MB \"Solcus\" (https://www.solcus.com)",
14
+ "type": "module",
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ },
22
+ "./testing": {
23
+ "types": "./dist/testing/index.d.ts",
24
+ "import": "./dist/testing/index.js"
25
+ },
26
+ "./package.json": "./package.json",
27
+ "./contract/*": "./contract/*",
28
+ "./make/*": "./make/*",
29
+ "./templates/*": "./templates/*"
30
+ },
31
+ "bin": {
32
+ "asturiu-v0-tenant": "./dist/cli/bin.js"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "src",
37
+ "!src/**/*.test.ts",
38
+ "contract",
39
+ "make",
40
+ "templates",
41
+ "CHANGELOG.md",
42
+ "README.md",
43
+ "LICENSE",
44
+ "NOTICE"
45
+ ],
46
+ "sideEffects": false,
47
+ "scripts": {
48
+ "build": "tsc -p tsconfig.json && node scripts/after-build.mjs",
49
+ "test": "vitest run",
50
+ "contract": "node scripts/contract.mjs",
51
+ "prepack": "node scripts/package-files.mjs",
52
+ "check": "node scripts/contract.mjs --check"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^22.10.2",
56
+ "typescript": "^5.7.2",
57
+ "vitest": "^2.1.8"
58
+ },
59
+ "engines": {
60
+ "node": ">=22"
61
+ },
62
+ "publishConfig": {
63
+ "access": "public"
64
+ }
65
+ }
@@ -0,0 +1,221 @@
1
+ /**
2
+ * What a Tenant's repository may set of its branding and portal options, and
3
+ * the rule for branding images (ADR-038, ADR-039). Pure and dependency-free:
4
+ * the Engine checks writes with these, the Admin UI and a Tenant's
5
+ * application prepare them.
6
+ */
7
+ import { PORTAL_PAGES, PORTAL_SWITCHES, type PortalOptions, type PortalPage, type PortalSwitch, defaultPortalOptions, resolvePortalOptions } from "./portal-options.js";
8
+ import type { PortalThemeSpec } from "./theme.js";
9
+
10
+ /** Who edits a tab: a person in the Admin UI, or the Tenant's application (ADR-038, decision 3). */
11
+ export const TENANT_SOURCES = ["admin_ui", "repository"] as const;
12
+ export type TenantSource = (typeof TENANT_SOURCES)[number];
13
+ export interface TenantSources {
14
+ branding: TenantSource;
15
+ portal: TenantSource;
16
+ /** ADR-061 §10. */
17
+ tiers: TenantSource;
18
+ }
19
+
20
+ /** A Tenant's sources, `admin_ui` where unset or unreadable. */
21
+ export function tenantSourcesOf(raw: { sources?: unknown } | null | undefined): TenantSources {
22
+ const s = raw?.sources && typeof raw.sources === "object" ? (raw.sources as Record<string, unknown>) : {};
23
+ const one = (v: unknown): TenantSource => (v === "repository" ? "repository" : "admin_ui");
24
+ return { branding: one(s.branding), portal: one(s.portal), tiers: one(s.tiers) };
25
+ }
26
+
27
+ /**
28
+ * The branding keys a repository sets (ADR-038, decision 2). Everything else
29
+ * — `portal_url`, `product_url`, `app_url`, `billing_url`, the support
30
+ * addresses — decides where a customer is sent and stays with an administrator.
31
+ */
32
+ export const BRANDING_REPOSITORY_KEYS = ["theme", "primary_color", "logo_url", "logo_dark_url", "favicon_url"] as const;
33
+ export type BrandingRepositoryKey = (typeof BRANDING_REPOSITORY_KEYS)[number];
34
+
35
+ /**
36
+ * What `PUT /tenant/v0/branding` takes and `GET /tenant/v0/branding` answers:
37
+ * the whole look of the portal, as the Admin UI's Branding tab edits it, and
38
+ * no address. A key left out of a `PUT` is cleared.
39
+ */
40
+ export interface RepositoryBranding {
41
+ /** The portal theme (ADR-033): a preset and overrides from the kit's closed lists (`THEME_*`). */
42
+ theme?: PortalThemeSpec;
43
+ /** `#rrggbb`. Used only while no theme is set. */
44
+ primary_color?: string;
45
+ /** Inline images (`inlineImage(bytes, type)`), at most `INLINE_IMAGE_MAX_BYTES` each. */
46
+ logo_url?: string;
47
+ /** The logo drawn on dark backgrounds. */
48
+ logo_dark_url?: string;
49
+ favicon_url?: string;
50
+ }
51
+
52
+ /**
53
+ * The page modes a repository sets (ADR-039): whether a page shows. A
54
+ * `redirect` carries the address a customer is sent to and stays with an
55
+ * administrator.
56
+ */
57
+ export const PORTAL_REPOSITORY_PAGE_MODES = ["portal", "off"] as const;
58
+ export type PortalRepositoryPageMode = (typeof PORTAL_REPOSITORY_PAGE_MODES)[number];
59
+
60
+ /**
61
+ * What `PUT /tenant/v0/portal` takes: every switch (one left out is on) and
62
+ * which pages show (one left out is back to its default). A page an administrator
63
+ * moved to the Tenant's application keeps its redirect.
64
+ */
65
+ export type RepositoryPortal = Partial<Record<PortalSwitch, boolean>> & { pages?: Partial<Record<PortalPage, { mode: PortalRepositoryPageMode }>> };
66
+
67
+ /** The portal options a repository sets: the switches and which pages show. Redirects and their URLs stay with an administrator. */
68
+ export const PORTAL_REPOSITORY_KEYS = [...PORTAL_SWITCHES, "pages"] as const;
69
+
70
+ const isObj = (v: unknown): v is Record<string, unknown> => !!v && typeof v === "object" && !Array.isArray(v);
71
+
72
+ /**
73
+ * The repository's part of a stored branding, as `GET /tenant/v0/branding`
74
+ * answers it and `PUT` takes it back: the theme, the colour and the images,
75
+ * images only when inline (a link stored before ADR-038 is not shown anyway).
76
+ */
77
+ export function repositoryBrandingOf(branding: unknown): RepositoryBranding {
78
+ const b = isObj(branding) ? branding : {};
79
+ const out: RepositoryBranding = {};
80
+ if (isObj(b.theme) && Object.keys(b.theme).length) {
81
+ const theme = JSON.parse(JSON.stringify(b.theme)) as Record<string, unknown>;
82
+ for (const part of ["background", "sign_in"]) {
83
+ const p = theme[part];
84
+ if (!isObj(p)) continue;
85
+ if (p.image_url !== undefined && inlineImageBytes(p.image_url) === null) delete p.image_url;
86
+ if (!Object.keys(p).length) delete theme[part];
87
+ }
88
+ if (Object.keys(theme).length) out.theme = theme as PortalThemeSpec;
89
+ }
90
+ if (typeof b.primary_color === "string" && b.primary_color) out.primary_color = b.primary_color;
91
+ for (const k of ["logo_url", "logo_dark_url", "favicon_url"] as const) if (inlineImageBytes(b[k]) !== null) out[k] = b[k] as string;
92
+ return out;
93
+ }
94
+
95
+ /**
96
+ * The repository's part of stored portal options, as `GET /tenant/v0/portal`
97
+ * answers it: every switch, every page that is not redirected, and the pages
98
+ * an administrator moved to the Tenant's application (without their URLs).
99
+ */
100
+ export function repositoryPortalOf(portal: unknown, ctx: { collection?: string } = {}): { portal: Record<PortalSwitch, boolean> & { pages: Partial<Record<PortalPage, { mode: PortalRepositoryPageMode }>> }; redirected: PortalPage[] } {
101
+ const o = resolvePortalOptions(portal, ctx);
102
+ const pages: Partial<Record<PortalPage, { mode: PortalRepositoryPageMode }>> = {};
103
+ const redirected: PortalPage[] = [];
104
+ for (const p of PORTAL_PAGES) {
105
+ const mode = o.pages[p].mode;
106
+ if (mode === "redirect") redirected.push(p);
107
+ else pages[p] = { mode };
108
+ }
109
+ const switches = Object.fromEntries(PORTAL_SWITCHES.map((k) => [k, o[k]])) as Record<PortalSwitch, boolean>;
110
+ return { portal: { ...switches, pages }, redirected };
111
+ }
112
+
113
+ /**
114
+ * A repository's portal options over the stored ones (ADR-039): the switches
115
+ * and page modes it sends replace the stored ones, one left out is back to
116
+ * its default, and a page an administrator redirected keeps its redirect
117
+ * (`kept`, when the body names it). `problems` are what the body may not
118
+ * hold, each with its path; the record's own rules (security and privacy
119
+ * never off, plan not off while the platform bills) are the Tenant schema's.
120
+ */
121
+ export function mergeRepositoryPortal(stored: unknown, body: Record<string, unknown>): { portal: Record<string, unknown>; kept: PortalPage[]; problems: { path: string; message: string }[] } {
122
+ const problems: { path: string; message: string }[] = [];
123
+ for (const k of Object.keys(body))
124
+ if (!(PORTAL_REPOSITORY_KEYS as readonly string[]).includes(k)) problems.push({ path: `portal.${k}`, message: `set in the Admin UI, not from a repository; accepted here: ${PORTAL_REPOSITORY_KEYS.join(", ")}` });
125
+ for (const k of PORTAL_SWITCHES) if (k in body && typeof body[k] !== "boolean") problems.push({ path: `portal.${k}`, message: "must be true or false" });
126
+ const s = isObj(stored) ? stored : {};
127
+ const storedPages = isObj(s.pages) ? s.pages : {};
128
+ if (body.pages !== undefined && !isObj(body.pages)) problems.push({ path: "portal.pages", message: "an object with a { mode } per page" });
129
+ const wanted = isObj(body.pages) ? body.pages : {};
130
+ for (const p of Object.keys(wanted)) if (!(PORTAL_PAGES as readonly string[]).includes(p)) problems.push({ path: `portal.pages.${p}`, message: `not a page; the pages are ${PORTAL_PAGES.join(", ")}` });
131
+ const pages: Record<string, unknown> = {};
132
+ const kept: PortalPage[] = [];
133
+ const defaults = defaultPortalOptions().pages;
134
+ for (const p of PORTAL_PAGES) {
135
+ const w = wanted[p];
136
+ let mode: PortalRepositoryPageMode = defaults[p].mode === "off" ? "off" : "portal";
137
+ if (w !== undefined) {
138
+ if (!isObj(w) || Object.keys(w).some((k) => k !== "mode")) problems.push({ path: `portal.pages.${p}`, message: "must be { mode: portal | off }; a URL is set by an administrator" });
139
+ else if (w.mode === "redirect") problems.push({ path: `portal.pages.${p}.mode`, message: "moving a page to the Tenant's application takes its address, which an administrator sets in the Admin UI" });
140
+ else if (!(PORTAL_REPOSITORY_PAGE_MODES as readonly unknown[]).includes(w.mode)) problems.push({ path: `portal.pages.${p}.mode`, message: "must be portal or off" });
141
+ else mode = w.mode as PortalRepositoryPageMode;
142
+ }
143
+ const st = storedPages[p];
144
+ if (isObj(st) && st.mode === "redirect") {
145
+ pages[p] = st;
146
+ if (w !== undefined) kept.push(p);
147
+ } else pages[p] = { mode };
148
+ }
149
+ const rest = Object.fromEntries(Object.entries(s).filter(([k]) => !(PORTAL_REPOSITORY_KEYS as readonly string[]).includes(k)));
150
+ const switches = Object.fromEntries(PORTAL_SWITCHES.filter((k) => typeof body[k] === "boolean").map((k) => [k, body[k]]));
151
+ return { portal: { ...rest, ...switches, pages }, kept, problems };
152
+ }
153
+
154
+ /**
155
+ * Pages an administrator may not change while the Portal tab comes from the
156
+ * repository (ADR-039): an administrator moves a page to the Tenant's
157
+ * application, or brings a redirected page back to the portal; whether a page
158
+ * that is not redirected shows is the repository's.
159
+ */
160
+ export function adminPageConflicts(stored: PortalOptions, patchPages: unknown): PortalPage[] {
161
+ if (!isObj(patchPages)) return [];
162
+ const out: PortalPage[] = [];
163
+ for (const p of PORTAL_PAGES) {
164
+ const w = patchPages[p];
165
+ if (!isObj(w)) continue;
166
+ const from = stored.pages[p].mode;
167
+ if (w.mode === "redirect" || (from === "redirect" && w.mode === "portal")) continue;
168
+ if (w.mode !== from) out.push(p);
169
+ }
170
+ return out;
171
+ }
172
+
173
+ /** Every image in `branding`, as a path into it (ADR-038, decision 6). */
174
+ export const BRANDING_IMAGE_PATHS = [["logo_url"], ["logo_dark_url"], ["favicon_url"], ["theme", "background", "image_url"], ["theme", "sign_in", "image_url"]] as const;
175
+
176
+ /** An inline base64 image of a type a browser shows in `<img>` and CSS. */
177
+ export const INLINE_IMAGE_PATTERN = /^data:image\/(png|jpeg|gif|webp|svg\+xml|x-icon|vnd\.microsoft\.icon);base64,[A-Za-z0-9+/]+={0,2}$/;
178
+ export const INLINE_IMAGE_TYPES = ["image/png", "image/jpeg", "image/gif", "image/webp", "image/svg+xml", "image/x-icon", "image/vnd.microsoft.icon"] as const;
179
+ /** The most an image may weigh, decoded. */
180
+ export const INLINE_IMAGE_MAX_BYTES = 256 * 1024;
181
+
182
+ /** The decoded size of an inline image, or null when the value is not one. */
183
+ export function inlineImageBytes(v: unknown): number | null {
184
+ if (typeof v !== "string" || !INLINE_IMAGE_PATTERN.test(v)) return null;
185
+ const data = v.slice(v.indexOf(",") + 1);
186
+ const pad = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0;
187
+ return Math.floor((data.length * 3) / 4) - pad;
188
+ }
189
+
190
+ /** The MIME type of an inline image, or null. */
191
+ export function inlineImageType(v: unknown): string | null {
192
+ return typeof v === "string" && INLINE_IMAGE_PATTERN.test(v) ? v.slice(5, v.indexOf(";")) : null;
193
+ }
194
+
195
+ /** An image file as the inline value `branding` takes: `inlineImage(await readFile("brand/logo.png"), "image/png")`. */
196
+ export function inlineImage(bytes: Uint8Array, type: string): string {
197
+ if (!(INLINE_IMAGE_TYPES as readonly string[]).includes(type)) throw new Error(`an image of type ${type} is not accepted; use one of ${INLINE_IMAGE_TYPES.join(", ")}`);
198
+ let bin = "";
199
+ for (let i = 0; i < bytes.length; i += 0x8000) bin += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
200
+ return `data:${type};base64,${btoa(bin)}`;
201
+ }
202
+
203
+ /**
204
+ * Images that break the rule: every image is inline and at most
205
+ * `INLINE_IMAGE_MAX_BYTES`, so the portal serves it from its own host and no
206
+ * other host sees who opens a portal page. A URL or a path on the Tenant's
207
+ * site is refused when it is written.
208
+ */
209
+ export function brandingImageProblems(branding: unknown): { path: string[]; message: string }[] {
210
+ if (!branding || typeof branding !== "object") return [];
211
+ const out: { path: string[]; message: string }[] = [];
212
+ for (const path of BRANDING_IMAGE_PATHS) {
213
+ let v: unknown = branding;
214
+ for (const k of path) v = v && typeof v === "object" ? (v as Record<string, unknown>)[k] : undefined;
215
+ if (v === undefined || v === null || v === "") continue;
216
+ const bytes = inlineImageBytes(v);
217
+ if (bytes === null) out.push({ path: [...path], message: "must be an inline base64 image (data:image/png;base64,…); a URL or a path on the Tenant's site is not accepted (ADR-038)" });
218
+ else if (bytes > INLINE_IMAGE_MAX_BYTES) out.push({ path: [...path], message: `must be at most ${INLINE_IMAGE_MAX_BYTES / 1024} KB; this one is ${Math.ceil(bytes / 1024)} KB` });
219
+ }
220
+ return out;
221
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Tenant changesets (ADR-054 §7, ADR-059 §2, ADR-074 §9): what changed on the
3
+ * Tenant-facing surface, Engine release by Engine release. The documents are
4
+ * the Engine's: published on the Engine site and listed by
5
+ * `GET /tenant/v0/changesets`. The SDK carries none of them, only the shape of
6
+ * the answer, so an SDK installed months ago never holds a stale list.
7
+ */
8
+
9
+
10
+ export interface ChangesetEntry {
11
+ number: number;
12
+ slug: string;
13
+ /** `<nnn>-<slug>.md`, under `/changesets/` on the Engine site. */
14
+ file: string;
15
+ date: string;
16
+ title: string;
17
+ /** What it applies to, as the document's header says it. */
18
+ applies_to: string;
19
+ /** The Engine decisions it follows from (`ADR-058`). */
20
+ decisions: string[];
21
+ /** Whether a Tenant may have to act: anything but a plain "No" in the header. */
22
+ action_required: boolean;
23
+ /** From when the old behaviour is gone, a date or an Engine version, when the change comes with a window. */
24
+ deadline: string | null;
25
+ /** The first SDK release that carries the change (ADR-074 §4); null for "No SDK change" or a changeset from before the row. */
26
+ sdk_version: string | null;
27
+ }
28
+
29
+ /** A changeset's status for one Tenant: its ticket's (ADR-059 §2). */
30
+ export const CHANGESET_STATUSES = ["new", "acknowledged", "in_progress", "on_hold", "resolved", "canceled"] as const;
31
+
32
+ export type ChangesetStatus = (typeof CHANGESET_STATUSES)[number];
33
+
34
+ /** One changeset as a Tenant reads it from `GET /tenant/v0/changesets`: the entry, its address, and this Tenant's ticket when it has one. */
35
+ export interface TenantChangeset extends ChangesetEntry {
36
+ url: string | null;
37
+ ticket: string | null;
38
+ status: ChangesetStatus | null;
39
+ }
40
+
41
+ /** The published document's address on the Engine site, or null when the site is not configured. */
42
+ export function changesetUrl(site: string | null | undefined, c: Pick<ChangesetEntry, "file">): string | null {
43
+ return site ? `${site.replace(/\/+$/, "")}/changesets/${c.file}` : null;
44
+ }
45
+
46
+ /** The Tenant's feedback (ADR-054 §7, ADR-059 §3): what the agent sends when the Engine cannot do what the application needs. */
47
+ export const FEEDBACK_KINDS = ["limitation", "defect", "question"] as const;
48
+
49
+ export type FeedbackKind = (typeof FEEDBACK_KINDS)[number];
50
+
51
+ /** The platform's ticket type each feedback kind opens (ADR-058 §3). */
52
+ export const FEEDBACK_TYPE: Record<FeedbackKind, "engine_limitation" | "engine_defect" | "engine_question"> = { limitation: "engine_limitation", defect: "engine_defect", question: "engine_question" };
53
+
54
+ export interface FeedbackReport {
55
+ kind: FeedbackKind;
56
+ area: string;
57
+ summary: string;
58
+ detail: string;
59
+ context: { engine?: string; changeset?: number | null; skill?: string };
60
+ refusal?: { status: number; type?: string; detail?: string };
61
+ }