@w6w/sdk 0.5.0 → 0.9.8

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 (132) hide show
  1. package/README.md +185 -32
  2. package/dist/mod.d.ts +10 -4
  3. package/dist/mod.d.ts.map +1 -1
  4. package/dist/mod.js +3 -0
  5. package/dist/mod.js.map +1 -1
  6. package/dist/src/client.d.ts +37 -5
  7. package/dist/src/client.d.ts.map +1 -1
  8. package/dist/src/client.js +40 -5
  9. package/dist/src/client.js.map +1 -1
  10. package/dist/src/config.d.ts +83 -6
  11. package/dist/src/config.d.ts.map +1 -1
  12. package/dist/src/config.js +41 -5
  13. package/dist/src/config.js.map +1 -1
  14. package/dist/src/connections.d.ts +3 -2
  15. package/dist/src/connections.d.ts.map +1 -1
  16. package/dist/src/connections.js +7 -2
  17. package/dist/src/connections.js.map +1 -1
  18. package/dist/src/console/aliases.d.ts +137 -0
  19. package/dist/src/console/aliases.d.ts.map +1 -0
  20. package/dist/src/console/aliases.js +113 -0
  21. package/dist/src/console/aliases.js.map +1 -0
  22. package/dist/src/console/api-calls.d.ts +4 -3
  23. package/dist/src/console/api-calls.d.ts.map +1 -1
  24. package/dist/src/console/api-calls.js +4 -3
  25. package/dist/src/console/api-calls.js.map +1 -1
  26. package/dist/src/console/apps.d.ts +181 -8
  27. package/dist/src/console/apps.d.ts.map +1 -1
  28. package/dist/src/console/apps.js +67 -12
  29. package/dist/src/console/apps.js.map +1 -1
  30. package/dist/src/console/auth.d.ts +245 -7
  31. package/dist/src/console/auth.d.ts.map +1 -1
  32. package/dist/src/console/auth.js +177 -8
  33. package/dist/src/console/auth.js.map +1 -1
  34. package/dist/src/console/commerce.d.ts +428 -0
  35. package/dist/src/console/commerce.d.ts.map +1 -0
  36. package/dist/src/console/commerce.js +220 -0
  37. package/dist/src/console/commerce.js.map +1 -0
  38. package/dist/src/console/dashboard.d.ts +8 -0
  39. package/dist/src/console/dashboard.d.ts.map +1 -1
  40. package/dist/src/console/dashboard.js.map +1 -1
  41. package/dist/src/console/endpoints.d.ts +79 -6
  42. package/dist/src/console/endpoints.d.ts.map +1 -1
  43. package/dist/src/console/endpoints.js.map +1 -1
  44. package/dist/src/console/functions.d.ts +35 -4
  45. package/dist/src/console/functions.d.ts.map +1 -1
  46. package/dist/src/console/functions.js +13 -0
  47. package/dist/src/console/functions.js.map +1 -1
  48. package/dist/src/console/mod.d.ts +32 -7
  49. package/dist/src/console/mod.d.ts.map +1 -1
  50. package/dist/src/console/mod.js +26 -1
  51. package/dist/src/console/mod.js.map +1 -1
  52. package/dist/src/console/otp.d.ts +127 -0
  53. package/dist/src/console/otp.d.ts.map +1 -0
  54. package/dist/src/console/otp.js +118 -0
  55. package/dist/src/console/otp.js.map +1 -0
  56. package/dist/src/console/passkeys.d.ts +246 -0
  57. package/dist/src/console/passkeys.d.ts.map +1 -0
  58. package/dist/src/console/passkeys.js +192 -0
  59. package/dist/src/console/passkeys.js.map +1 -0
  60. package/dist/src/console/reliability.d.ts +101 -6
  61. package/dist/src/console/reliability.d.ts.map +1 -1
  62. package/dist/src/console/reliability.js +16 -5
  63. package/dist/src/console/reliability.js.map +1 -1
  64. package/dist/src/console/step-tests.d.ts +7 -1
  65. package/dist/src/console/step-tests.d.ts.map +1 -1
  66. package/dist/src/console/step-tests.js +1 -1
  67. package/dist/src/console/step-tests.js.map +1 -1
  68. package/dist/src/console/subscriptions.d.ts +38 -16
  69. package/dist/src/console/subscriptions.d.ts.map +1 -1
  70. package/dist/src/console/subscriptions.js +7 -13
  71. package/dist/src/console/subscriptions.js.map +1 -1
  72. package/dist/src/console/tenant-login-flags.d.ts +106 -0
  73. package/dist/src/console/tenant-login-flags.d.ts.map +1 -0
  74. package/dist/src/console/tenant-login-flags.js +113 -0
  75. package/dist/src/console/tenant-login-flags.js.map +1 -0
  76. package/dist/src/console/tenant-oauth-apps.d.ts +75 -14
  77. package/dist/src/console/tenant-oauth-apps.d.ts.map +1 -1
  78. package/dist/src/console/tenant-oauth-apps.js +37 -11
  79. package/dist/src/console/tenant-oauth-apps.js.map +1 -1
  80. package/dist/src/console/tokens.d.ts +2 -0
  81. package/dist/src/console/tokens.d.ts.map +1 -1
  82. package/dist/src/console/tokens.js.map +1 -1
  83. package/dist/src/console/workflows.d.ts +14 -0
  84. package/dist/src/console/workflows.d.ts.map +1 -1
  85. package/dist/src/console/workflows.js +13 -0
  86. package/dist/src/console/workflows.js.map +1 -1
  87. package/dist/src/documents.d.ts +9 -5
  88. package/dist/src/documents.d.ts.map +1 -1
  89. package/dist/src/documents.js +6 -3
  90. package/dist/src/documents.js.map +1 -1
  91. package/dist/src/endpoints.d.ts +75 -0
  92. package/dist/src/endpoints.d.ts.map +1 -0
  93. package/dist/src/endpoints.js +47 -0
  94. package/dist/src/endpoints.js.map +1 -0
  95. package/dist/src/functions.d.ts +236 -0
  96. package/dist/src/functions.d.ts.map +1 -0
  97. package/dist/src/functions.js +201 -0
  98. package/dist/src/functions.js.map +1 -0
  99. package/dist/src/http.d.ts +58 -10
  100. package/dist/src/http.d.ts.map +1 -1
  101. package/dist/src/http.js +82 -11
  102. package/dist/src/http.js.map +1 -1
  103. package/dist/src/me.d.ts +3 -2
  104. package/dist/src/me.d.ts.map +1 -1
  105. package/dist/src/me.js +7 -2
  106. package/dist/src/me.js.map +1 -1
  107. package/dist/src/run.d.ts +19 -5
  108. package/dist/src/run.d.ts.map +1 -1
  109. package/dist/src/run.js +14 -4
  110. package/dist/src/run.js.map +1 -1
  111. package/dist/src/server/mod.d.ts +100 -0
  112. package/dist/src/server/mod.d.ts.map +1 -0
  113. package/dist/src/server/mod.js +121 -0
  114. package/dist/src/server/mod.js.map +1 -0
  115. package/dist/src/team.d.ts +204 -0
  116. package/dist/src/team.d.ts.map +1 -0
  117. package/dist/src/team.js +161 -0
  118. package/dist/src/team.js.map +1 -0
  119. package/dist/src/types.d.ts +143 -10
  120. package/dist/src/types.d.ts.map +1 -1
  121. package/dist/src/types.js +27 -0
  122. package/dist/src/types.js.map +1 -1
  123. package/dist/src/vars.d.ts +5 -3
  124. package/dist/src/vars.d.ts.map +1 -1
  125. package/dist/src/vars.js +14 -4
  126. package/dist/src/vars.js.map +1 -1
  127. package/dist/src/version.js +1 -1
  128. package/dist/src/workflows.d.ts +261 -9
  129. package/dist/src/workflows.d.ts.map +1 -1
  130. package/dist/src/workflows.js +246 -7
  131. package/dist/src/workflows.js.map +1 -1
  132. package/package.json +5 -1
@@ -8,6 +8,7 @@
8
8
  *
9
9
  * @module
10
10
  */
11
+ import { type ApiError } from "./errors.ts";
11
12
  /**
12
13
  * The API's base path, from the shared contract's `basePath`
13
14
  * (`packages/wrappers/endpoints.json`).
@@ -31,6 +32,28 @@ export declare const BASE_PATH = "";
31
32
  * narrower one), while a fake only has to accept a URL string.
32
33
  */
33
34
  export type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;
35
+ /**
36
+ * A per-request token supplier.
37
+ *
38
+ * Called **per request** — never cached after it settles, never resolved once
39
+ * at construction — so a host can rotate or mint a token out-of-band (a tenant
40
+ * exchange, a short-lived partner credential) and have the very next call pick
41
+ * it up. Requests that are in flight **concurrently** on one client share ONE
42
+ * supplier call (and its result); a request that starts after it settled calls
43
+ * the supplier again. Memoize the supplier yourself if minting is expensive.
44
+ * `ctx.forceRefresh` is set to `true` exactly once, on the single
45
+ * recovery retry a `401`/`unauthorized` triggers (`docs/implementation.md`
46
+ * §3); every ordinary per-request resolution omits it. A `string` `token` is
47
+ * the degenerate case of this shape — it behaves exactly as before.
48
+ *
49
+ * May return synchronously or return a `Promise`; either is awaited before the
50
+ * bearer is attached. A nullish or blank (after trimming) result is treated
51
+ * exactly like a nullish/blank static token — a {@linkcode ConfigError}, never
52
+ * a request sent with no credential.
53
+ */
54
+ export type TokenProvider = (ctx?: {
55
+ forceRefresh?: boolean;
56
+ }) => string | null | undefined | Promise<string | null | undefined>;
34
57
  /** Constructor options for a client. Every field is optional. */
35
58
  export interface W6WClientOptions {
36
59
  /**
@@ -42,8 +65,40 @@ export interface W6WClientOptions {
42
65
  * Overrides `W6W_BASE_URL`.
43
66
  */
44
67
  baseUrl?: string;
45
- /** Bearer token, sent on every request. Overrides `W6W_TOKEN`. */
46
- token?: string;
68
+ /**
69
+ * Bearer token, resolved on **every** request — not just once at
70
+ * construction. A plain `string` is sent verbatim on every call, exactly as
71
+ * before; a {@linkcode TokenProvider} function is called (and awaited)
72
+ * per request (concurrent requests share one in-flight call), so a host can hand back a token minted or rotated after
73
+ * this client was constructed. Overrides `W6W_TOKEN`, which stays a plain
74
+ * string (there is no environment-variable spelling of a supplier).
75
+ */
76
+ token?: string | TokenProvider;
77
+ /**
78
+ * Opt in to a single, one-shot recovery when a request fails with
79
+ * `401`/`unauthorized`: `token` (which must be a function for this to do
80
+ * anything) is called once more with `{forceRefresh: true}`, and if that
81
+ * yields a usable value the SAME request is re-sent once with it. Off
82
+ * (`false`) by default — the behaviour before this option existed. Never
83
+ * retries a second time, never retries any other status or code, and never
84
+ * applies to a `requireAuth: false` request.
85
+ */
86
+ refreshOnUnauthorized?: boolean;
87
+ /**
88
+ * Called with the terminal `401`/`unauthorized` {@linkcode ApiError} of a
89
+ * bearer request — after a failed recovery retry, or immediately when
90
+ * recovery is off or not possible (a static `token`) — at most once per
91
+ * call. Never called on success, never called twice, and never called for a
92
+ * `requireAuth: false` request.
93
+ */
94
+ onUnauthorized?: (error: ApiError) => void;
95
+ /**
96
+ * Default headers sent with every request. This is the **base** every
97
+ * per-request `headers` option builds on: a per-request header with the
98
+ * same name wins, and neither can ever displace the bearer this transport
99
+ * attaches (`authorization`) or the `content-type` it sets for a JSON body.
100
+ */
101
+ headers?: Record<string, string>;
47
102
  /**
48
103
  * Default project id for the project-scoped operations — `documents.*` and
49
104
  * `workflows.list`, which read it too.
@@ -69,8 +124,14 @@ export interface ResolvedConfig {
69
124
  * value that is not an absolute `http(s)` URL with a host.
70
125
  */
71
126
  readonly baseUrl: string;
72
- /** The bearer token, or `null` when none was configured. */
73
- readonly token: string | null;
127
+ /** The bearer token or supplier, or `null` when none was configured. */
128
+ readonly token: string | TokenProvider | null;
129
+ /** Opt-in one-shot 401 recovery. Defaults to `false`. */
130
+ readonly refreshOnUnauthorized: boolean;
131
+ /** Terminal-401 callback, or `null` when none was configured. */
132
+ readonly onUnauthorized: ((error: ApiError) => void) | null;
133
+ /** Default headers sent with every request. Defaults to `{}`. */
134
+ readonly headers: Record<string, string>;
74
135
  /** Default project id, or `null`. */
75
136
  readonly project: string | null;
76
137
  }
@@ -146,14 +207,30 @@ export declare function resolveConfig(options?: W6WClientOptions): ResolvedConfi
146
207
  * There are no anonymous operations in this surface
147
208
  * (`docs/implementation.md` §2).
148
209
  *
210
+ * **Resolved per call, never cached after it settles.** When `config.token` is
211
+ * a {@linkcode TokenProvider} it is called (and its result awaited) right here —
212
+ * a plain string is the degenerate case that needs no call at all. Ordinary
213
+ * calls (`ctx?.forceRefresh` not `true`) that overlap on one `config` share ONE
214
+ * in-flight supplier call; the slot is dropped when it settles, on success or
215
+ * failure, so nothing is cached. A forced refresh neither joins nor fills that
216
+ * slot. `ctx` is
217
+ * forwarded verbatim to the provider; passing `{forceRefresh: true}` is the
218
+ * one and only seam `request()`'s recovery retry uses (`docs/implementation.md`
219
+ * §3) — ordinary resolution never passes it.
220
+ *
149
221
  * A blank token counts as no token, for the same reason a blank base URL does:
150
222
  * `W6W_TOKEN=` is how a shell or a Dockerfile spells "I meant to set this and
151
223
  * did not", and `Authorization: Bearer ` would turn that into an opaque 401
152
- * instead of the one message that explains it.
224
+ * instead of the one message that explains it. The same rule applies to
225
+ * whatever a provider returns: nullish or blank is treated exactly like a
226
+ * nullish/blank static token — the error never echoes the value either way.
153
227
  *
154
228
  * @param config - The resolved configuration.
229
+ * @param ctx - Forwarded to a function-typed `token`; unused for a string one.
155
230
  * @returns The configured token, verbatim.
156
231
  * @throws {ConfigError} When no non-blank token is configured.
157
232
  */
158
- export declare function requireToken(config: ResolvedConfig): string;
233
+ export declare function requireToken(config: ResolvedConfig, ctx?: {
234
+ forceRefresh?: boolean;
235
+ }): Promise<string>;
159
236
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B;;;;;;;;;;GAUG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEjF,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAuBlD;AAkBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,cAAc,CAS5E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAS3D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,KAAK,QAAQ,EAAe,MAAM,aAAa,CAAC;AAEzD;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B;;;;;;;;;;GAUG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEjF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,KAC7B,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAEpE,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IAC/B;;;;;;;;OAQG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC3C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;IAC9C,yDAAyD;IACzD,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,iEAAiE;IACjE,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5D,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAuBlD;AAkBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,cAAc,CAY5E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,cAAc,EACtB,GAAG,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B,OAAO,CAAC,MAAM,CAAC,CAajB"}
@@ -86,7 +86,7 @@ export function joinBaseUrl(origin) {
86
86
  throw new ConfigError("No w6w base URL is configured. Pass one to the client " +
87
87
  '(new W6WClient({ baseUrl: "https://api.example.com" })) or set the ' +
88
88
  `${ENV_BASE_URL} environment variable. It holds the server's origin, ` +
89
- "e.g. \"https://api.example.com\" — the API is served at its root, so no " +
89
+ 'e.g. "https://api.example.com" — the API is served at its root, so no ' +
90
90
  "path is appended.");
91
91
  }
92
92
  if (!ABSOLUTE_HTTP_ORIGIN.test(trimmed) || !parses(trimmed)) {
@@ -138,6 +138,9 @@ export function resolveConfig(options = {}) {
138
138
  // never answer differently for the same input.
139
139
  baseUrl: joinBaseUrl(options.baseUrl ?? readEnv(ENV_BASE_URL) ?? ""),
140
140
  token: options.token ?? readEnv(ENV_TOKEN) ?? null,
141
+ refreshOnUnauthorized: options.refreshOnUnauthorized ?? false,
142
+ onUnauthorized: options.onUnauthorized ?? null,
143
+ headers: options.headers ?? {},
141
144
  project: options.project ?? null,
142
145
  };
143
146
  }
@@ -149,21 +152,54 @@ export function resolveConfig(options = {}) {
149
152
  * There are no anonymous operations in this surface
150
153
  * (`docs/implementation.md` §2).
151
154
  *
155
+ * **Resolved per call, never cached after it settles.** When `config.token` is
156
+ * a {@linkcode TokenProvider} it is called (and its result awaited) right here —
157
+ * a plain string is the degenerate case that needs no call at all. Ordinary
158
+ * calls (`ctx?.forceRefresh` not `true`) that overlap on one `config` share ONE
159
+ * in-flight supplier call; the slot is dropped when it settles, on success or
160
+ * failure, so nothing is cached. A forced refresh neither joins nor fills that
161
+ * slot. `ctx` is
162
+ * forwarded verbatim to the provider; passing `{forceRefresh: true}` is the
163
+ * one and only seam `request()`'s recovery retry uses (`docs/implementation.md`
164
+ * §3) — ordinary resolution never passes it.
165
+ *
152
166
  * A blank token counts as no token, for the same reason a blank base URL does:
153
167
  * `W6W_TOKEN=` is how a shell or a Dockerfile spells "I meant to set this and
154
168
  * did not", and `Authorization: Bearer ` would turn that into an opaque 401
155
- * instead of the one message that explains it.
169
+ * instead of the one message that explains it. The same rule applies to
170
+ * whatever a provider returns: nullish or blank is treated exactly like a
171
+ * nullish/blank static token — the error never echoes the value either way.
156
172
  *
157
173
  * @param config - The resolved configuration.
174
+ * @param ctx - Forwarded to a function-typed `token`; unused for a string one.
158
175
  * @returns The configured token, verbatim.
159
176
  * @throws {ConfigError} When no non-blank token is configured.
160
177
  */
161
- export function requireToken(config) {
162
- if (config.token === null || config.token.trim().length === 0) {
178
+ export function requireToken(config, ctx) {
179
+ if (typeof config.token !== "function" || ctx?.forceRefresh === true) {
180
+ return resolveToken(config, ctx);
181
+ }
182
+ const pending = inflightTokens.get(config);
183
+ if (pending)
184
+ return pending;
185
+ const flight = resolveToken(config, ctx);
186
+ inflightTokens.set(config, flight);
187
+ const clear = () => {
188
+ if (inflightTokens.get(config) === flight)
189
+ inflightTokens.delete(config);
190
+ };
191
+ flight.then(clear, clear);
192
+ return flight;
193
+ }
194
+ /** One in-flight ordinary supplier call per config (never a module-level slot). */
195
+ const inflightTokens = new WeakMap();
196
+ async function resolveToken(config, ctx) {
197
+ const raw = typeof config.token === "function" ? await config.token(ctx) : config.token;
198
+ if (raw === null || raw === undefined || raw.trim().length === 0) {
163
199
  throw new ConfigError("No w6w API token is configured. Pass one to the client " +
164
200
  '(new W6WClient({ token: "…" })) or set the ' +
165
201
  `${ENV_TOKEN} environment variable. Every w6w API operation is authenticated.`);
166
202
  }
167
- return config.token;
203
+ return raw;
168
204
  }
169
205
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AA4D5B;;;;;;;;;;GAUG;AACH,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,0EAA0E;IAC1E,8EAA8E;IAC9E,4DAA4D;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,WAAW,CACnB,wDAAwD;YACtD,qEAAqE;YACrE,GAAG,YAAY,uDAAuD;YACtE,0EAA0E;YAC1E,mBAAmB,CACtB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,WAAW,CACnB,qBAAqB,OAAO,oCAAoC;YAC9D,GAAG,YAAY,sEAAsE;YACrF,6EAA6E;YAC7E,oEAAoE,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,MAAM,CAAC,MAAc;IAC5B,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,aAAa,CAAC,UAA4B,EAAE;IAC1D,OAAO;QACL,6EAA6E;QAC7E,2EAA2E;QAC3E,+CAA+C;QAC/C,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QACpE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI;QAClD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;KACjC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,WAAW,CACnB,yDAAyD;YACvD,6CAA6C;YAC7C,GAAG,SAAS,kEAAkE,CACjF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,7 @@
19
19
  *
20
20
  * @module
21
21
  */
22
- import type { HttpResponse, RequestOptions } from "./http.ts";
22
+ import type { CallOptions, HttpResponse, RequestOptions } from "./http.ts";
23
23
  import { type ConnectionSummary } from "./types.ts";
24
24
  /**
25
25
  * The slice of `W6WClient` this namespace needs: the transport, and nothing
@@ -50,9 +50,10 @@ export declare class ConnectionsApi {
50
50
  /**
51
51
  * List the caller's connections.
52
52
  *
53
+ * @param options - Optional per-call transport options (`signal` to abort).
53
54
  * @returns The connections, unwrapped from the `connections` envelope.
54
55
  * @throws {ApiError} On any non-2xx.
55
56
  */
56
- list(): Promise<ConnectionSummary[]>;
57
+ list(options?: CallOptions): Promise<ConnectionSummary[]>;
57
58
  }
58
59
  //# sourceMappingURL=connections.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../src/connections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,KAAK,iBAAiB,EAAU,MAAM,YAAY,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/D;AAED;;;;;;;;;GASG;AACH,qBAAa,cAAc;;IAGzB;;OAEG;gBACS,IAAI,EAAE,eAAe;IAIjC;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAI3C"}
1
+ {"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../src/connections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,KAAK,iBAAiB,EAAU,MAAM,YAAY,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/D;AAED;;;;;;;;;GASG;AACH,qBAAa,cAAc;;IAGzB;;OAEG;gBACS,IAAI,EAAE,eAAe;IAIjC;;;;;;OAMG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAQhE"}
@@ -41,11 +41,16 @@ export class ConnectionsApi {
41
41
  /**
42
42
  * List the caller's connections.
43
43
  *
44
+ * @param options - Optional per-call transport options (`signal` to abort).
44
45
  * @returns The connections, unwrapped from the `connections` envelope.
45
46
  * @throws {ApiError} On any non-2xx.
46
47
  */
47
- async list() {
48
- const res = await this.#host.request({ method: "GET", path: "/connections" });
48
+ async list(options) {
49
+ const res = await this.#host.request({
50
+ method: "GET",
51
+ path: "/connections",
52
+ signal: options?.signal,
53
+ });
49
54
  return unwrap(res, "connections");
50
55
  }
51
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"connections.js","sourceRoot":"","sources":["../../src/connections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAA0B,MAAM,EAAE,MAAM,YAAY,CAAC;AAa5D;;;;;;;;;GASG;AACH,MAAM,OAAO,cAAc;IAChB,KAAK,CAAkB;IAEhC;;OAEG;IACH,YAAY,IAAqB;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAU,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACvF,OAAO,MAAM,CAAsB,GAAG,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC;CACF"}
1
+ {"version":3,"file":"connections.js","sourceRoot":"","sources":["../../src/connections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAA0B,MAAM,EAAE,MAAM,YAAY,CAAC;AAa5D;;;;;;;;;GASG;AACH,MAAM,OAAO,cAAc;IAChB,KAAK,CAAkB;IAEhC;;OAEG;IACH,YAAY,IAAqB;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,CAAC,OAAqB;QAC9B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAU;YAC5C,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CAAC,CAAC;QACH,OAAO,MAAM,CAAsB,GAAG,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC;CACF"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * `client.console.aliases.*` — account-scoped alias management
3
+ * (`list`/`get`/`upsert`/`delete`) for the names `run`'s URN dispatch
4
+ * resolves alongside its four `conn_…`/`wf_…`/`fn_…`/`ep_…` arms
5
+ * (`src/run.ts`).
6
+ *
7
+ * **Studio-internal, not the published partner contract.** This namespace
8
+ * lives under the `console` subpath export (`@w6w/sdk/console`), excluded
9
+ * from `endpoints.json` and from the root barrel (`mod.ts`) — see
10
+ * `docs/console.md` and HITL-2 in this project's contract. This surface is
11
+ * **new**: unlike `console.functions`/`console.endpoints`, there is no
12
+ * pre-existing `studio/src/api/client.ts` alias code being relocated here —
13
+ * Studio never had alias CRUD before this project. `@w6w/sdk`'s
14
+ * instance-state mechanism pin still applies here exactly as it does to
15
+ * every other namespace (`docs/implementation.md` §MECHANISM PIN — instance
16
+ * state, never globals): this class holds no state of its own beyond the
17
+ * injected host, so two clients in one process never share a credential.
18
+ *
19
+ * **`invoke`/`run` is deliberately NOT modeled here.** The base
20
+ * `client.run({urn: aliasName, payload})` (already-published surface,
21
+ * `endpoints.json`-named, exported from the root `mod.ts`) already reaches
22
+ * an alias's target — an alias name is one of `run`'s runnable `urn` arms,
23
+ * alongside `conn_…`/`wf_…`/`fn_…`/`ep_…` (`src/run.ts`). Adding a duplicate
24
+ * `console.aliases.invoke` would give a caller two ways to reach the same
25
+ * route — the exact anti-duplication defect `console/functions.ts:15-26`
26
+ * flags for Functions, applied here with alias/`run` substituted for
27
+ * function/`run`; `console.endpoints`/`console.workflows` follow the same
28
+ * precedent. No invoke method lives here, and none should be added later
29
+ * without re-litigating this reasoning.
30
+ *
31
+ * @module
32
+ */
33
+ import { type HttpResponse, type RequestOptions } from "../http.ts";
34
+ import type { EndpointTarget } from "./endpoints.ts";
35
+ /**
36
+ * The slice of `W6WClient` this namespace needs: the transport, and nothing
37
+ * else. Structural rather than a concrete client type, so the namespace
38
+ * stays independently constructible in a test and this module never
39
+ * imports the client back — mirrors `FunctionsHost` in `./functions.ts`.
40
+ */
41
+ export interface AliasesHost {
42
+ /** Perform one request. */
43
+ request<T>(options: RequestOptions): Promise<HttpResponse<T>>;
44
+ }
45
+ /**
46
+ * An alias definition — an account-scoped name bound to one runnable
47
+ * target, typed with the same {@linkcode EndpointTarget} union
48
+ * `console.endpoints` dispatches to. Unlike `EndpointDef.target`, an
49
+ * alias's `target` may also carry the `endpoint` arm
50
+ * ({@linkcode EndpointRefTarget}) — dispatching to another Endpoint by id is
51
+ * legal for an alias only, so `run`'s URN dispatch can resolve it by name
52
+ * instead of by id.
53
+ *
54
+ * `name` is **immutable after first save** (HITL-3): a save that changes
55
+ * `name` on an already-stored alias answers `409 alias_name_immutable`.
56
+ */
57
+ export interface AliasDef {
58
+ id: string;
59
+ name: string;
60
+ displayName?: string;
61
+ description?: string;
62
+ target: EndpointTarget;
63
+ }
64
+ /** One row of `list`'s result — an alias's summary, not its full definition. */
65
+ export interface AliasSummary {
66
+ id: string;
67
+ name: string;
68
+ displayName: string;
69
+ description: string;
70
+ updatedAt: string;
71
+ target: EndpointTarget;
72
+ }
73
+ /**
74
+ * The `console.aliases` namespace on a `W6WClient`.
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * const aliases = await client.console.aliases.list();
79
+ * const alias = await client.console.aliases.get(aliases[0].id);
80
+ * await client.console.aliases.upsert({ ...alias, description: "Send email" });
81
+ * await client.console.aliases.delete(alias.id);
82
+ * ```
83
+ */
84
+ export declare class AliasesApi {
85
+ #private;
86
+ /**
87
+ * @param host - The client this namespace issues requests through.
88
+ */
89
+ constructor(host: AliasesHost);
90
+ /**
91
+ * List the caller's aliases.
92
+ *
93
+ * @returns The aliases, unwrapped from the `aliases` envelope.
94
+ */
95
+ list(): Promise<AliasSummary[]>;
96
+ /**
97
+ * Fetch one alias's stored definition.
98
+ *
99
+ * No server-computed field to splice in — unlike
100
+ * {@linkcode FunctionsApi.get}'s `valid` merge, this returns
101
+ * `unwrap<AliasDef>(res, "alias")` plainly.
102
+ *
103
+ * @param id - The alias's `id`.
104
+ * @returns The alias definition, unwrapped from the `alias` envelope.
105
+ * @throws {ApiError} `404 unknown_alias` when there is no such id.
106
+ */
107
+ get(id: string): Promise<AliasDef>;
108
+ /**
109
+ * Register (create or overwrite) an alias definition.
110
+ *
111
+ * `definition` is the whole definition, sent verbatim as the request body
112
+ * — not wrapped in an envelope key.
113
+ *
114
+ * @param definition - The whole alias definition, forwarded verbatim.
115
+ * @returns The new/updated alias's id and name.
116
+ * @throws {ApiError} `400 invalid_alias` — structurally invalid body.
117
+ * @throws {ApiError} `409 alias_conflict` — another `(tenant,subject)` owns this id.
118
+ * @throws {ApiError} `409 alias_name_conflict` — another alias already owns this name.
119
+ * @throws {ApiError} `409 alias_name_immutable` — `name` changed on an already-stored alias (HITL-3).
120
+ */
121
+ upsert(definition: AliasDef): Promise<{
122
+ id: string;
123
+ name: string;
124
+ }>;
125
+ /**
126
+ * Delete an alias.
127
+ *
128
+ * Returns nothing: the server's `{ok: true}` carries no information a
129
+ * caller can use, mirroring `console.vault.delete`/`console.projects.delete`
130
+ * in this same package.
131
+ *
132
+ * @param id - The alias's `id`.
133
+ * @throws {ApiError} `404 unknown_alias` when there is no such id.
134
+ */
135
+ delete(id: string): Promise<void>;
136
+ }
137
+ //# sourceMappingURL=aliases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../../src/console/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAQ,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/D;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,gFAAgF;AAChF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,UAAU;;IAGrB;;OAEG;gBACS,IAAI,EAAE,WAAW;IAI7B;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAKrC;;;;;;;;;;OAUG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKxC;;;;;;;;;;;;OAYG;IACG,MAAM,CAAC,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IASzE;;;;;;;;;OASG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * `client.console.aliases.*` — account-scoped alias management
3
+ * (`list`/`get`/`upsert`/`delete`) for the names `run`'s URN dispatch
4
+ * resolves alongside its four `conn_…`/`wf_…`/`fn_…`/`ep_…` arms
5
+ * (`src/run.ts`).
6
+ *
7
+ * **Studio-internal, not the published partner contract.** This namespace
8
+ * lives under the `console` subpath export (`@w6w/sdk/console`), excluded
9
+ * from `endpoints.json` and from the root barrel (`mod.ts`) — see
10
+ * `docs/console.md` and HITL-2 in this project's contract. This surface is
11
+ * **new**: unlike `console.functions`/`console.endpoints`, there is no
12
+ * pre-existing `studio/src/api/client.ts` alias code being relocated here —
13
+ * Studio never had alias CRUD before this project. `@w6w/sdk`'s
14
+ * instance-state mechanism pin still applies here exactly as it does to
15
+ * every other namespace (`docs/implementation.md` §MECHANISM PIN — instance
16
+ * state, never globals): this class holds no state of its own beyond the
17
+ * injected host, so two clients in one process never share a credential.
18
+ *
19
+ * **`invoke`/`run` is deliberately NOT modeled here.** The base
20
+ * `client.run({urn: aliasName, payload})` (already-published surface,
21
+ * `endpoints.json`-named, exported from the root `mod.ts`) already reaches
22
+ * an alias's target — an alias name is one of `run`'s runnable `urn` arms,
23
+ * alongside `conn_…`/`wf_…`/`fn_…`/`ep_…` (`src/run.ts`). Adding a duplicate
24
+ * `console.aliases.invoke` would give a caller two ways to reach the same
25
+ * route — the exact anti-duplication defect `console/functions.ts:15-26`
26
+ * flags for Functions, applied here with alias/`run` substituted for
27
+ * function/`run`; `console.endpoints`/`console.workflows` follow the same
28
+ * precedent. No invoke method lives here, and none should be added later
29
+ * without re-litigating this reasoning.
30
+ *
31
+ * @module
32
+ */
33
+ import { path } from "../http.js";
34
+ import { unwrap } from "../types.js";
35
+ /**
36
+ * The `console.aliases` namespace on a `W6WClient`.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * const aliases = await client.console.aliases.list();
41
+ * const alias = await client.console.aliases.get(aliases[0].id);
42
+ * await client.console.aliases.upsert({ ...alias, description: "Send email" });
43
+ * await client.console.aliases.delete(alias.id);
44
+ * ```
45
+ */
46
+ export class AliasesApi {
47
+ #host;
48
+ /**
49
+ * @param host - The client this namespace issues requests through.
50
+ */
51
+ constructor(host) {
52
+ this.#host = host;
53
+ }
54
+ /**
55
+ * List the caller's aliases.
56
+ *
57
+ * @returns The aliases, unwrapped from the `aliases` envelope.
58
+ */
59
+ async list() {
60
+ const res = await this.#host.request({ method: "GET", path: "/aliases" });
61
+ return unwrap(res, "aliases");
62
+ }
63
+ /**
64
+ * Fetch one alias's stored definition.
65
+ *
66
+ * No server-computed field to splice in — unlike
67
+ * {@linkcode FunctionsApi.get}'s `valid` merge, this returns
68
+ * `unwrap<AliasDef>(res, "alias")` plainly.
69
+ *
70
+ * @param id - The alias's `id`.
71
+ * @returns The alias definition, unwrapped from the `alias` envelope.
72
+ * @throws {ApiError} `404 unknown_alias` when there is no such id.
73
+ */
74
+ async get(id) {
75
+ const res = await this.#host.request({ method: "GET", path: path `/aliases/${id}` });
76
+ return unwrap(res, "alias");
77
+ }
78
+ /**
79
+ * Register (create or overwrite) an alias definition.
80
+ *
81
+ * `definition` is the whole definition, sent verbatim as the request body
82
+ * — not wrapped in an envelope key.
83
+ *
84
+ * @param definition - The whole alias definition, forwarded verbatim.
85
+ * @returns The new/updated alias's id and name.
86
+ * @throws {ApiError} `400 invalid_alias` — structurally invalid body.
87
+ * @throws {ApiError} `409 alias_conflict` — another `(tenant,subject)` owns this id.
88
+ * @throws {ApiError} `409 alias_name_conflict` — another alias already owns this name.
89
+ * @throws {ApiError} `409 alias_name_immutable` — `name` changed on an already-stored alias (HITL-3).
90
+ */
91
+ async upsert(definition) {
92
+ const res = await this.#host.request({
93
+ method: "POST",
94
+ path: "/aliases",
95
+ body: definition,
96
+ });
97
+ return unwrap(res, "alias");
98
+ }
99
+ /**
100
+ * Delete an alias.
101
+ *
102
+ * Returns nothing: the server's `{ok: true}` carries no information a
103
+ * caller can use, mirroring `console.vault.delete`/`console.projects.delete`
104
+ * in this same package.
105
+ *
106
+ * @param id - The alias's `id`.
107
+ * @throws {ApiError} `404 unknown_alias` when there is no such id.
108
+ */
109
+ async delete(id) {
110
+ await this.#host.request({ method: "DELETE", path: path `/aliases/${id}` });
111
+ }
112
+ }
113
+ //# sourceMappingURL=aliases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aliases.js","sourceRoot":"","sources":["../../../src/console/aliases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAqB,IAAI,EAAuB,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AA4CrC;;;;;;;;;;GAUG;AACH,MAAM,OAAO,UAAU;IACZ,KAAK,CAAc;IAE5B;;OAEG;IACH,YAAY,IAAiB;QAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAU,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACnF,OAAO,MAAM,CAAiB,GAAG,EAAE,SAAS,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAU,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAA,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7F,OAAO,MAAM,CAAW,GAAG,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,MAAM,CAAC,UAAoB;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAU;YAC5C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QACH,OAAO,MAAM,CAA+B,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAA,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IACtF,CAAC;CACF"}
@@ -20,9 +20,9 @@
20
20
  * result type) and `console/mod.ts` already re-exports it — this module
21
21
  * imports it as a type and uses it verbatim as `list`'s return element type.
22
22
  *
23
- * `api-calls` is scoped to the caller by the server's own repo, not by a
24
- * `project` query param — so `ApiCallsHost` needs only the transport,
25
- * mirroring `VarsHost`/`ProjectsHost`, not `DocumentsHost`.
23
+ * `api-calls` is scoped to the caller and can be narrowed to one project. The
24
+ * reliability detail page always supplies that project so its drill-down rows
25
+ * are the same rows that produced the reliability numbers.
26
26
  *
27
27
  * @module
28
28
  */
@@ -46,6 +46,7 @@ export interface ApiCallsHost {
46
46
  * values.
47
47
  */
48
48
  export interface ApiCallsFilter {
49
+ project?: string;
49
50
  appId?: string;
50
51
  actionKey?: string;
51
52
  connectionId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"api-calls.d.ts","sourceRoot":"","sources":["../../../src/console/api-calls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAK/C,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/D;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,qBAAa,WAAW;;IAGtB;;OAEG;gBACS,IAAI,EAAE,YAAY;IAI9B;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAc9D"}
1
+ {"version":3,"file":"api-calls.d.ts","sourceRoot":"","sources":["../../../src/console/api-calls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAK/C,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/D;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,qBAAa,WAAW;;IAGtB;;OAEG;gBACS,IAAI,EAAE,YAAY;IAI9B;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAe9D"}
@@ -20,9 +20,9 @@
20
20
  * result type) and `console/mod.ts` already re-exports it — this module
21
21
  * imports it as a type and uses it verbatim as `list`'s return element type.
22
22
  *
23
- * `api-calls` is scoped to the caller by the server's own repo, not by a
24
- * `project` query param — so `ApiCallsHost` needs only the transport,
25
- * mirroring `VarsHost`/`ProjectsHost`, not `DocumentsHost`.
23
+ * `api-calls` is scoped to the caller and can be narrowed to one project. The
24
+ * reliability detail page always supplies that project so its drill-down rows
25
+ * are the same rows that produced the reliability numbers.
26
26
  *
27
27
  * @module
28
28
  */
@@ -57,6 +57,7 @@ export class ApiCallsApi {
57
57
  path: "/api-calls",
58
58
  query: {
59
59
  appId: filter?.appId,
60
+ project: filter?.project,
60
61
  actionKey: filter?.actionKey,
61
62
  connectionId: filter?.connectionId,
62
63
  sessionId: filter?.sessionId,
@@ -1 +1 @@
1
- {"version":3,"file":"api-calls.js","sourceRoot":"","sources":["../../../src/console/api-calls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAkCrC;;;;;;;GAOG;AACH,MAAM,OAAO,WAAW;IACb,KAAK,CAAe;IAE7B;;OAEG;IACH,YAAY,IAAkB;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,IAAI,CAAC,MAAuB;QAChC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAU;YAC5C,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE;gBACL,KAAK,EAAE,MAAM,EAAE,KAAK;gBACpB,SAAS,EAAE,MAAM,EAAE,SAAS;gBAC5B,YAAY,EAAE,MAAM,EAAE,YAAY;gBAClC,SAAS,EAAE,MAAM,EAAE,SAAS;gBAC5B,KAAK,EAAE,MAAM,EAAE,KAAK;aACrB;SACF,CAAC,CAAC;QACH,OAAO,MAAM,CAAkB,GAAG,EAAE,UAAU,CAAC,CAAC;IAClD,CAAC;CACF"}
1
+ {"version":3,"file":"api-calls.js","sourceRoot":"","sources":["../../../src/console/api-calls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAmCrC;;;;;;;GAOG;AACH,MAAM,OAAO,WAAW;IACb,KAAK,CAAe;IAE7B;;OAEG;IACH,YAAY,IAAkB;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,IAAI,CAAC,MAAuB;QAChC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAU;YAC5C,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE;gBACL,KAAK,EAAE,MAAM,EAAE,KAAK;gBACpB,OAAO,EAAE,MAAM,EAAE,OAAO;gBACxB,SAAS,EAAE,MAAM,EAAE,SAAS;gBAC5B,YAAY,EAAE,MAAM,EAAE,YAAY;gBAClC,SAAS,EAAE,MAAM,EAAE,SAAS;gBAC5B,KAAK,EAAE,MAAM,EAAE,KAAK;aACrB;SACF,CAAC,CAAC;QACH,OAAO,MAAM,CAAkB,GAAG,EAAE,UAAU,CAAC,CAAC;IAClD,CAAC;CACF"}