@ambasada/sdk 0.8.2 → 0.8.4

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.
package/dist/define.d.ts CHANGED
@@ -2,18 +2,39 @@
2
2
  * `ambasada.config.ts` (docs/PLATFORM.md §3). Types and checks only; the CLI reads the values
3
3
  * (`ambasada dev`, `deploy`, `link`, `check`). Add-ons add their own keys (the village: `idea`, `offerings`, `agent`).
4
4
  */
5
+ /**
6
+ * The app's Ambasada mini app (docs/MINI-APPS.md §15, decision 15.6): optional. With it, `ambasada dev` and `deploy`
7
+ * serve /.well-known/ambasada.json (from this and `id`, `name`, `description`), `ambasada check` runs the mini-app
8
+ * rules on the entry, and the deploy registers the app with the Ambasada app. `ambasada miniapp enable` adds it.
9
+ */
10
+ export interface MiniAppConfig {
11
+ /** The path the Ambasada app opens: "/app" (the in-app layout under it), or "/" for the whole site. */
12
+ entry: string;
13
+ /** A 1024×1024 opaque PNG, a path on the app (default "/icon.png"). */
14
+ icon?: string;
15
+ /** Manifest fields beyond the defaults (docs/MINI-APPS.md §2). */
16
+ category?: "shopping" | "food" | "events" | "tools" | "learning" | "community" | "games" | "finance" | "other";
17
+ accent?: string;
18
+ /** What the app asks the shell for (default: identity and notifications, which the templates' routes serve). */
19
+ scopes?: ("identity" | "notifications")[];
20
+ visibility?: "public" | "builders" | "unlisted" | `event:${string}`;
21
+ }
5
22
  export interface AppConfig {
6
23
  /** The app's slug (lowercase): it lives at https://<id>.ambasada.dev. */
7
24
  id: string;
8
25
  /** Display name. */
9
26
  name: string;
10
- /** One line about the app: the manifest's subtitle and description (`ambasada init` writes them from it). */
27
+ /** One line about the app (the mini app's subtitle and description, when there is one). */
11
28
  description?: string;
12
29
  /** Where the app runs; `ambasada link` sets it when you host elsewhere. */
13
30
  product?: {
14
31
  url?: string;
15
32
  };
33
+ /** The mini app inside the Ambasada app, at a path of this one. Off without it. */
34
+ miniapp?: MiniAppConfig;
16
35
  /** Add-ons to load besides the ones found in node_modules (package names, e.g. "@ambasada/village"). */
17
36
  addons?: string[];
18
37
  }
38
+ /** A path the mini app may open at: absolute, no query, hash, `..` or `//`. */
39
+ export declare const MINIAPP_ENTRY: RegExp;
19
40
  export declare function defineApp<T extends AppConfig>(config: T): T;
package/dist/errors.d.ts CHANGED
@@ -42,6 +42,7 @@ export declare const ERROR_STATUS: {
42
42
  readonly PROVIDER_DENIED: 502;
43
43
  readonly FROZEN: 403;
44
44
  readonly CAP_INBOX_RATE: 429;
45
+ readonly CAP_CHAT_RATE: 429;
45
46
  readonly NETWORK: 0;
46
47
  readonly CONFIG: 0;
47
48
  readonly RECEIPT_INVALID: 402;
@@ -10,7 +10,8 @@ export type * from "./types.js";
10
10
  export { getHeader } from "./headers.js";
11
11
  export type { HeaderSource } from "./headers.js";
12
12
  export { defineApp } from "./define.js";
13
- export type { AppConfig } from "./define.js";
13
+ export { MINIAPP_ENTRY } from "./define.js";
14
+ export type { AppConfig, MiniAppConfig } from "./define.js";
14
15
  export { AmbasadaAuth, AUTH_PATHS, JWKS_TTL_MS, SESSION_TTL_S } from "./auth.js";
15
16
  export type { AmbasadaUser, AuthConfig, LoginOptions, ShellUser, WithHeaders } from "./auth.js";
16
17
  export { AmbasadaApps, APP_SIGNATURE_HEADER, APP_TIMESTAMP_HEADER, appWebhookHeaders, signAppWebhook } from "./apps.js";
package/dist/platform.js CHANGED
@@ -173,6 +173,8 @@ var ERROR_STATUS = {
173
173
  FROZEN: 403,
174
174
  // Exchange stream: an agent sent too many inbox messages
175
175
  CAP_INBOX_RATE: 429,
176
+ // The CEO chat: too many turns for one company
177
+ CAP_CHAT_RATE: 429,
176
178
  // SDK-side
177
179
  NETWORK: 0,
178
180
  CONFIG: 0,
@@ -777,8 +779,18 @@ function getHeader(headers, name) {
777
779
  }
778
780
 
779
781
  // src/define.ts
782
+ var MINIAPP_ENTRY = /^\/(?:[A-Za-z0-9._~-]+(?:\/[A-Za-z0-9._~-]+)*)?$/;
780
783
  function defineApp(config) {
781
784
  if (typeof config.id !== "string" || !/^[a-z0-9][a-z0-9-]{0,62}$/.test(config.id)) throw new Error(`app id "${String(config.id)}" must be a lowercase slug (a-z, 0-9, -)`);
785
+ const m = config.miniapp;
786
+ if (m !== void 0) {
787
+ if (!m || typeof m !== "object") throw new Error(`${config.id}: miniapp must be { entry: "/app" }`);
788
+ if (typeof m.entry !== "string" || !MINIAPP_ENTRY.test(m.entry) || m.entry.split("/").includes("..")) {
789
+ throw new Error(`${config.id}: miniapp.entry must be a path like "/app" or "/" (got ${JSON.stringify(m.entry)})`);
790
+ }
791
+ if (m.icon !== void 0 && (typeof m.icon !== "string" || !m.icon.startsWith("/"))) throw new Error(`${config.id}: miniapp.icon must be a path like "/icon.png"`);
792
+ if (m.accent !== void 0 && !/^#[0-9a-fA-F]{6}$/.test(m.accent)) throw new Error(`${config.id}: miniapp.accent must be a #RRGGBB colour`);
793
+ }
782
794
  return config;
783
795
  }
784
796
 
@@ -796,6 +808,7 @@ export {
796
808
  DEFAULT_API_URL,
797
809
  ERROR_STATUS,
798
810
  JWKS_TTL_MS,
811
+ MINIAPP_ENTRY,
799
812
  SESSION_TTL_S,
800
813
  WebhookInvalidError,
801
814
  ambasada,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ambasada/sdk",
3
- "version": "0.8.2",
3
+ "version": "0.8.4",
4
4
  "description": "The Ambasada platform SDK: Sign in with Ambasada, mini-app notifications, the project store, files.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -27,7 +27,7 @@
27
27
  "node": ">=22"
28
28
  },
29
29
  "dependencies": {
30
- "@ambasada/village": "^0.8.2"
30
+ "@ambasada/village": "^0.8.4"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^22.20.5",