@every-app/sdk 0.3.0-rc.5 → 0.3.0-rc.7

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 (76) hide show
  1. package/dist/cloudflare/catalogSettings.generated.d.ts +1 -16
  2. package/dist/cloudflare/catalogSettings.generated.d.ts.map +1 -1
  3. package/dist/cloudflare/catalogSettings.generated.js +0 -49
  4. package/dist/cloudflare/worker.d.ts +14 -0
  5. package/dist/cloudflare/worker.d.ts.map +1 -1
  6. package/dist/cloudflare/worker.js +19 -6
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/internal/aiDefault.d.ts +70 -7
  10. package/dist/internal/aiDefault.d.ts.map +1 -1
  11. package/dist/internal/aiDefault.js +145 -15
  12. package/dist/internal/aiProviders.d.ts +3 -1
  13. package/dist/internal/aiProviders.d.ts.map +1 -1
  14. package/dist/internal/aiProviders.js +12 -3
  15. package/dist/internal/appSettings.d.ts +65 -5
  16. package/dist/internal/appSettings.d.ts.map +1 -1
  17. package/dist/internal/appSettings.js +141 -23
  18. package/dist/internal/capabilities.d.ts +52 -433
  19. package/dist/internal/capabilities.d.ts.map +1 -1
  20. package/dist/internal/capabilities.js +25 -558
  21. package/dist/internal/catalog/index.d.ts +6 -6
  22. package/dist/internal/catalog/inference.d.ts +6 -6
  23. package/dist/internal/catalog/inference.d.ts.map +1 -1
  24. package/dist/internal/catalog/inference.js +9 -6
  25. package/dist/internal/events.d.ts.map +1 -1
  26. package/dist/internal/events.js +1 -0
  27. package/dist/internal/gatewaySettings.d.ts +0 -6
  28. package/dist/internal/gatewaySettings.d.ts.map +1 -1
  29. package/dist/internal/gatewaySettings.js +1 -14
  30. package/dist/internal/identity.d.ts +12 -1
  31. package/dist/internal/identity.d.ts.map +1 -1
  32. package/dist/internal/identity.js +11 -1
  33. package/dist/internal/oauthClient.d.ts +10 -12
  34. package/dist/internal/oauthClient.d.ts.map +1 -1
  35. package/dist/internal/oauthClient.js +20 -81
  36. package/dist/internal/oauthPresets.d.ts +7 -3
  37. package/dist/internal/oauthPresets.d.ts.map +1 -1
  38. package/dist/internal/oauthPresets.js +533 -3
  39. package/dist/internal/oauthSpec.d.ts +44 -1
  40. package/dist/internal/oauthSpec.d.ts.map +1 -1
  41. package/dist/internal/oauthSpec.js +147 -34
  42. package/dist/internal/protocol.d.ts +14 -0
  43. package/dist/internal/protocol.d.ts.map +1 -1
  44. package/dist/internal/protocol.js +7 -0
  45. package/dist/internal/providerRegistry.d.ts +61 -1
  46. package/dist/internal/providerRegistry.d.ts.map +1 -1
  47. package/dist/internal/providerRegistry.js +127 -6
  48. package/dist/internal/providerSpec.d.ts +14 -7
  49. package/dist/internal/providerSpec.d.ts.map +1 -1
  50. package/dist/internal/providerSpec.js +306 -7
  51. package/dist/manifest.d.ts +25 -4
  52. package/dist/manifest.d.ts.map +1 -1
  53. package/dist/server/ai.d.ts +45 -0
  54. package/dist/server/ai.d.ts.map +1 -1
  55. package/dist/server/ai.js +77 -1
  56. package/dist/server/aiBinding.d.ts.map +1 -1
  57. package/dist/server/aiBinding.js +3 -3
  58. package/dist/server/authorizeUrl.d.ts +1 -1
  59. package/dist/server/authorizeUrl.d.ts.map +1 -1
  60. package/dist/server/authorizeUrl.js +2 -6
  61. package/dist/server/emailBinding.js +1 -1
  62. package/dist/server/emit.js +1 -1
  63. package/dist/server/gatewayFetch.d.ts.map +1 -1
  64. package/dist/server/gatewayFetch.js +20 -7
  65. package/dist/server/index.d.ts +3 -2
  66. package/dist/server/index.d.ts.map +1 -1
  67. package/dist/server/index.js +3 -2
  68. package/dist/server/integrationFetch.d.ts +4 -31
  69. package/dist/server/integrationFetch.d.ts.map +1 -1
  70. package/dist/server/integrationFetch.js +44 -42
  71. package/dist/server/listMembers.js +1 -1
  72. package/dist/server/refusal.d.ts +55 -0
  73. package/dist/server/refusal.d.ts.map +1 -0
  74. package/dist/server/refusal.js +193 -0
  75. package/dist/server/sendEmail.js +1 -1
  76. package/package.json +1 -1
@@ -6,11 +6,15 @@
6
6
  * JSON into an {@link ApiKeyCapability} or names every problem; nothing
7
7
  * here reads a value: a spec names Gateway settings, never holds one.
8
8
  *
9
- * Two kinds parse: API-key providers (`auth.kind` bearer, header, query
10
- * or basic) and OAuth providers (`auth.kind` oauth2-user, the half in
9
+ * Three kinds parse: API-key providers (`auth.kind` bearer, header, query
10
+ * or basic), OAuth providers (`auth.kind` oauth2-user, the half in
11
11
  * ./oauthSpec.ts: the Gateway runs the flow and holds the tokens,
12
- * docs/design/2026-10-oauth-providers.md). An AI provider is a catalog
13
- * entry only; the parser says so rather than guessing.
12
+ * docs/design/2026-10-oauth-providers.md), and OpenAI-compatible model
13
+ * providers (`mode: "ai"`: a `baseUrl`, the key's placement, the models
14
+ * it serves and the default, its inference routes; the AI proxy serves a
15
+ * row exactly as it serves a catalog `ai` entry, inference POSTs alone,
16
+ * `store: false` on chat, the usage tap, so a new model vendor is a
17
+ * registered spec, not a catalog release).
14
18
  *
15
19
  * The rules that make a row safe on a particular gateway (its secret names
16
20
  * are its own, its hosts are public, it shadows no catalog entry) are the
@@ -60,6 +64,15 @@ const RESERVED_HEADERS = new Set([
60
64
  ]);
61
65
  const MAX_HOSTS = 20;
62
66
  const MAX_ACCOUNT_WIDE_PATHS = 50;
67
+ /** An inference route an `ai` row names: `/v1/chat/completions`, segments of lowercase letters, digits, `_` and `-`. */
68
+ const AI_ROUTE = /^(?:\/[a-z0-9_-]+)+$/;
69
+ const MAX_AI_ROUTES = 20;
70
+ const MAX_MODELS = 100;
71
+ /** A model name as OpenAI-compatible APIs spell them: `gpt-6-luna`, `meta-llama/llama-4`, `claude-haiku-5-5:beta`. */
72
+ const MODEL_NAME = /^[A-Za-z0-9][A-Za-z0-9._:/@-]{0,199}$/;
73
+ /** What an `ai` row serves by default: chat, and embeddings when it names an embeddings model. */
74
+ export const AI_SPEC_CHAT_ROUTE = "/v1/chat/completions";
75
+ export const AI_SPEC_EMBEDDINGS_ROUTE = "/v1/embeddings";
63
76
  const KNOWN_FIELDS = new Set([
64
77
  "id",
65
78
  "mode",
@@ -87,7 +100,39 @@ const KNOWN_FIELDS = new Set([
87
100
  "scopeSets",
88
101
  "alwaysRequested",
89
102
  "tolerated",
103
+ // An `ai` spec's own.
104
+ "baseUrl",
105
+ "models",
106
+ "defaultModel",
107
+ "embeddingsModel",
108
+ "routes",
109
+ "chatRoute",
110
+ "embeddingsRoute",
90
111
  ]);
112
+ /** Fields only an `ai` spec has. */
113
+ const AI_ONLY_FIELDS = [
114
+ "baseUrl",
115
+ "models",
116
+ "defaultModel",
117
+ "embeddingsModel",
118
+ "routes",
119
+ "chatRoute",
120
+ "embeddingsRoute",
121
+ ];
122
+ /** Fields an `ai` spec never has: the key goes to one base URL, and the AI proxy's rules replace the capability proxy's. */
123
+ const NOT_AI_FIELDS = [
124
+ "hosts",
125
+ "hostSetting",
126
+ "data",
127
+ "access",
128
+ "readMethods",
129
+ "writeMethods",
130
+ "accountWidePaths",
131
+ ...OAUTH_ONLY_FIELDS_LIST(),
132
+ ];
133
+ function OAUTH_ONLY_FIELDS_LIST() {
134
+ return ["scopeSets", "alwaysRequested", "tolerated"];
135
+ }
91
136
  /** Fields an API-key spec has that an `oauth2-user` spec does not. */
92
137
  const API_KEY_ONLY_FIELDS = [
93
138
  "hostSetting",
@@ -624,13 +669,20 @@ export function parseProviderSpec(input) {
624
669
  });
625
670
  }
626
671
  const isOAuth = isRecord(input["auth"]) && input["auth"]["kind"] === "oauth2-user";
672
+ const isAi = input["mode"] === "ai";
627
673
  const expectedMode = isOAuth ? "oauth_client" : "api_key";
628
- if (input["mode"] !== undefined && input["mode"] !== expectedMode) {
674
+ if (!isAi && input["mode"] !== undefined && input["mode"] !== expectedMode) {
629
675
  problems.push({
630
676
  path: "mode",
631
677
  message: isOAuth
632
678
  ? "an oauth2-user spec's mode is oauth_client (or left out)"
633
- : "this gateway registers api_key and oauth_client (auth.kind oauth2-user) providers; an AI provider is a catalog entry",
679
+ : 'this gateway registers api_key, oauth_client (auth.kind oauth2-user) and ai (mode: "ai", an OpenAI-compatible model provider) providers',
680
+ });
681
+ }
682
+ if (isAi && isOAuth) {
683
+ problems.push({
684
+ path: "auth.kind",
685
+ message: "an ai spec's key is a bearer, header, query or basic key, never oauth2-user",
634
686
  });
635
687
  }
636
688
  const name = text(input["name"], "name", problems, { max: 64 });
@@ -659,6 +711,9 @@ export function parseProviderSpec(input) {
659
711
  }
660
712
  },
661
713
  });
714
+ if (isAi && !isOAuth) {
715
+ return parseAiSpec(input, problems, { id, name, description, docs, api });
716
+ }
662
717
  if (isOAuth) {
663
718
  const { access, readMethods, writeMethods } = grants(input, problems);
664
719
  const hint = text(input["hint"], "hint", problems, { max: 500 });
@@ -789,6 +844,197 @@ export function parseProviderSpec(input) {
789
844
  };
790
845
  return { ok: true, id, capability };
791
846
  }
847
+ /**
848
+ * The `ai` half of `parseProviderSpec`: an OpenAI-compatible model
849
+ * provider. `baseUrl` is where the app's path is joined (`https://api.groq.com/openai`:
850
+ * the origin, and a base path the proxy keeps in front of every route);
851
+ * `auth` places the key as an API-key spec does; `models` lists what the
852
+ * provider serves (1 to 100; the proxy refuses any other) with
853
+ * `defaultModel` the one the Gateway's default route fills in and
854
+ * `embeddingsModel` the one for `/api/ai/default/v1/embeddings`; `routes`
855
+ * are the inference paths apps may POST to (default chat, and embeddings
856
+ * with an embeddings model), `chatRoute` and `embeddingsRoute` which of
857
+ * them the default route maps onto. Chat answers are never stored
858
+ * (`store: false` on the chat route). `cost.responseField` is where the
859
+ * answer carries the call's price, read by the usage tap as OpenRouter's
860
+ * `usage.cost` is.
861
+ */
862
+ function parseAiSpec(input, problems, common) {
863
+ for (const field of NOT_AI_FIELDS) {
864
+ if (input[field] !== undefined) {
865
+ problems.push({ path: field, message: "not a field of an ai spec" });
866
+ }
867
+ }
868
+ const base = httpsUrl(input["baseUrl"], "baseUrl", problems);
869
+ let origin;
870
+ let basePath;
871
+ if (input["baseUrl"] === undefined) {
872
+ problems.push({
873
+ path: "baseUrl",
874
+ message: "required: the https URL the app's paths are joined onto (https://api.groq.com/openai)",
875
+ });
876
+ }
877
+ else if (base !== undefined) {
878
+ const url = new URL(base);
879
+ if (url.search || url.hash || url.username || url.password || url.port) {
880
+ problems.push({
881
+ path: "baseUrl",
882
+ message: "must be an https URL with no query, fragment, credentials or port",
883
+ });
884
+ }
885
+ else if (!PROVIDER_HOST.test(url.hostname)) {
886
+ problems.push({
887
+ path: "baseUrl",
888
+ message: "must name a public host with a dot (api.groq.com)",
889
+ });
890
+ }
891
+ else {
892
+ origin = url.origin;
893
+ const path = url.pathname.replace(/\/+$/, "");
894
+ if (path && !AI_ROUTE.test(path)) {
895
+ problems.push({
896
+ path: "baseUrl",
897
+ message: "its path must be segments of lowercase letters, digits, _ and -",
898
+ });
899
+ }
900
+ else if (path) {
901
+ basePath = path;
902
+ }
903
+ }
904
+ }
905
+ const parsedAuth = auth(input["auth"], problems);
906
+ if (input["auth"] === undefined) {
907
+ problems.push({ path: "auth", message: "required" });
908
+ }
909
+ const secrets = secretDetails(input["secrets"], parsedAuth ? authSettingNames(parsedAuth) : [], problems);
910
+ const models = stringList(input["models"], "models", problems, {
911
+ max: MAX_MODELS,
912
+ each: (model, at) => {
913
+ if (!MODEL_NAME.test(model)) {
914
+ problems.push({
915
+ path: at,
916
+ message: "must be a model name (gpt-6-luna, meta-llama/llama-4)",
917
+ });
918
+ }
919
+ },
920
+ });
921
+ if (input["models"] === undefined || (models && models.length === 0)) {
922
+ problems.push({
923
+ path: "models",
924
+ message: "required: the models the provider serves, at least one",
925
+ });
926
+ }
927
+ const defaultModel = text(input["defaultModel"], "defaultModel", problems, {
928
+ max: 200,
929
+ });
930
+ if (input["defaultModel"] === undefined) {
931
+ problems.push({
932
+ path: "defaultModel",
933
+ message: "required: the chat model the Gateway fills in when an app names none; one of models",
934
+ });
935
+ }
936
+ else if (defaultModel !== undefined &&
937
+ models &&
938
+ !models.includes(defaultModel)) {
939
+ problems.push({ path: "defaultModel", message: "must be one of models" });
940
+ }
941
+ const embeddingsModel = text(input["embeddingsModel"], "embeddingsModel", problems, { max: 200 });
942
+ if (embeddingsModel !== undefined &&
943
+ models &&
944
+ !models.includes(embeddingsModel)) {
945
+ problems.push({
946
+ path: "embeddingsModel",
947
+ message: "must be one of models",
948
+ });
949
+ }
950
+ const routeList = (value, path) => stringList(value, path, problems, {
951
+ max: MAX_AI_ROUTES,
952
+ each: (route, at) => {
953
+ if (!AI_ROUTE.test(route)) {
954
+ problems.push({
955
+ path: at,
956
+ message: "must be a path of lowercase segments starting with / (/v1/chat/completions)",
957
+ });
958
+ }
959
+ },
960
+ });
961
+ const chatRoute = text(input["chatRoute"], "chatRoute", problems, { max: 200 }) ??
962
+ AI_SPEC_CHAT_ROUTE;
963
+ const embeddingsRoute = text(input["embeddingsRoute"], "embeddingsRoute", problems, { max: 200 }) ??
964
+ AI_SPEC_EMBEDDINGS_ROUTE;
965
+ for (const [field, route] of [
966
+ ["chatRoute", chatRoute],
967
+ ["embeddingsRoute", embeddingsRoute],
968
+ ]) {
969
+ if (!AI_ROUTE.test(route)) {
970
+ problems.push({
971
+ path: field,
972
+ message: "must be a path of lowercase segments starting with /",
973
+ });
974
+ }
975
+ }
976
+ const routes = routeList(input["routes"], "routes") ?? [
977
+ chatRoute,
978
+ ...(embeddingsModel !== undefined ? [embeddingsRoute] : []),
979
+ ];
980
+ if (routes.length === 0) {
981
+ problems.push({ path: "routes", message: "must list a route" });
982
+ }
983
+ if (!routes.includes(chatRoute)) {
984
+ problems.push({ path: "chatRoute", message: "must be one of routes" });
985
+ }
986
+ if (embeddingsModel !== undefined && !routes.includes(embeddingsRoute)) {
987
+ problems.push({
988
+ path: "embeddingsRoute",
989
+ message: "must be one of routes",
990
+ });
991
+ }
992
+ const hint = text(input["hint"], "hint", problems, { max: 500 });
993
+ const smokeRequest = smoke(input["smoke"], origin ? [new URL(origin).host] : [], problems);
994
+ const parsedCost = cost(input["cost"], problems);
995
+ const parsedRate = rate(input["rate"], problems);
996
+ const example = text(input["example"], "example", problems, { max: 200 });
997
+ const parsedVerified = verified(input["verified"], problems);
998
+ const tags = tagList(input["tags"], problems);
999
+ const { id, name, description, docs, api } = common;
1000
+ if (problems.length > 0 ||
1001
+ typeof id !== "string" ||
1002
+ name === undefined ||
1003
+ docs === undefined ||
1004
+ origin === undefined ||
1005
+ !parsedAuth ||
1006
+ !models ||
1007
+ defaultModel === undefined) {
1008
+ return { ok: false, problems };
1009
+ }
1010
+ const capability = {
1011
+ mode: "ai",
1012
+ label: name,
1013
+ auth: parsedAuth,
1014
+ docs,
1015
+ origin,
1016
+ ...(basePath === undefined ? {} : { basePath }),
1017
+ inferenceRoutes: routes,
1018
+ unstoredRoutes: [chatRoute],
1019
+ shape: "openai",
1020
+ chat: { path: chatRoute, seedModel: defaultModel },
1021
+ ...(embeddingsModel === undefined
1022
+ ? {}
1023
+ : { embeddings: { path: embeddingsRoute, seedModel: embeddingsModel } }),
1024
+ models,
1025
+ ...(description === undefined ? {} : { description }),
1026
+ ...(api === undefined ? {} : { api }),
1027
+ ...(secrets === undefined ? {} : { secrets }),
1028
+ ...(hint === undefined ? {} : { hint }),
1029
+ ...(smokeRequest === undefined ? {} : { smoke: smokeRequest }),
1030
+ ...(parsedCost === undefined ? {} : { cost: parsedCost }),
1031
+ ...(parsedRate === undefined ? {} : { rate: parsedRate }),
1032
+ ...(example === undefined ? {} : { example }),
1033
+ ...(parsedVerified === undefined ? {} : { verified: parsedVerified }),
1034
+ ...(tags === undefined ? {} : { tags }),
1035
+ };
1036
+ return { ok: true, id, capability };
1037
+ }
792
1038
  /** The problems as one line: `auth.secret: must name a Gateway setting; hosts.0: …`. */
793
1039
  export function describeSpecProblems(problems) {
794
1040
  return problems
@@ -809,6 +1055,58 @@ export function providerSpecOf(id, capability) {
809
1055
  }
810
1056
  return spec;
811
1057
  }
1058
+ if (capability.mode === "ai") {
1059
+ if (!capability.chat || !capability.models) {
1060
+ throw new Error(`${id} is a catalog AI entry without a model list: it has no spec`);
1061
+ }
1062
+ return {
1063
+ id,
1064
+ mode: "ai",
1065
+ name: capability.label,
1066
+ ...(capability.description === undefined
1067
+ ? {}
1068
+ : { description: capability.description }),
1069
+ docs: capability.docs,
1070
+ ...(capability.api === undefined ? {} : { api: capability.api }),
1071
+ baseUrl: `${capability.origin}${capability.basePath ?? ""}`,
1072
+ auth: { ...capability.auth },
1073
+ ...(capability.secrets === undefined
1074
+ ? {}
1075
+ : { secrets: capability.secrets.map((detail) => ({ ...detail })) }),
1076
+ models: [...capability.models],
1077
+ defaultModel: capability.chat.seedModel,
1078
+ ...(capability.embeddings === undefined
1079
+ ? {}
1080
+ : { embeddingsModel: capability.embeddings.seedModel }),
1081
+ routes: [...capability.inferenceRoutes],
1082
+ chatRoute: capability.chat.path,
1083
+ ...(capability.embeddings === undefined
1084
+ ? {}
1085
+ : { embeddingsRoute: capability.embeddings.path }),
1086
+ ...(capability.hint === undefined ? {} : { hint: capability.hint }),
1087
+ ...(capability.smoke === undefined
1088
+ ? {}
1089
+ : {
1090
+ smoke: {
1091
+ ...capability.smoke,
1092
+ expect: [...capability.smoke.expect],
1093
+ },
1094
+ }),
1095
+ ...(capability.cost === undefined
1096
+ ? {}
1097
+ : { cost: { ...capability.cost } }),
1098
+ ...(capability.rate === undefined
1099
+ ? {}
1100
+ : { rate: { ...capability.rate } }),
1101
+ ...(capability.example === undefined
1102
+ ? {}
1103
+ : { example: capability.example }),
1104
+ ...(capability.verified === undefined
1105
+ ? {}
1106
+ : { verified: capability.verified }),
1107
+ ...(capability.tags === undefined ? {} : { tags: [...capability.tags] }),
1108
+ };
1109
+ }
812
1110
  return {
813
1111
  id,
814
1112
  name: capability.label,
@@ -851,5 +1149,6 @@ export function providerSpecOf(id, capability) {
851
1149
  }
852
1150
  /** The methods an app with `access: "write"` may use on `capability` besides its read methods. */
853
1151
  export function writeMethodsOf(capability) {
854
- return capability.writeMethods ?? DEFAULT_WRITE_METHODS;
1152
+ return ((capability.mode === "ai" ? undefined : capability.writeMethods) ??
1153
+ DEFAULT_WRITE_METHODS);
855
1154
  }
@@ -111,6 +111,24 @@ export interface EveryAppCapabilityEntry extends EveryAppSettingNeed {
111
111
  /** An OAuth client's scope sets, by name (`["gmail.read"]`). */
112
112
  readonly scopes?: readonly string[];
113
113
  }
114
+ /**
115
+ * One of the app's plain settings: a value that isn't a secret and
116
+ * differs per install (a PostHog host, a region), set with `everyapp
117
+ * configure <app>` and read from `env`.
118
+ */
119
+ export interface EveryAppSettingEntry {
120
+ readonly name: string;
121
+ /** Why the app needs it: what whoever installs the app reads. */
122
+ readonly why: string;
123
+ readonly docs?: string;
124
+ readonly optional?: boolean;
125
+ /** What it takes; text when not given. */
126
+ readonly type?: "text" | "url" | "number" | "boolean";
127
+ /** The values a text setting may take. */
128
+ readonly values?: readonly string[];
129
+ /** What the app reads while nobody has set it; the deploy writes it. */
130
+ readonly default?: string;
131
+ }
114
132
  /** One of the app's own secrets, with its need. */
115
133
  export interface EveryAppSecretEntry extends EveryAppSettingNeed {
116
134
  readonly name: string;
@@ -145,6 +163,11 @@ export interface EveryAppManifest {
145
163
  readonly limits?: EveryAppWorkerLimits;
146
164
  /** Routes open without a signed-in member. Default: none. */
147
165
  readonly public?: readonly EveryAppPublicRoute[];
166
+ /**
167
+ * Static files of the asset bundle anyone may fetch (favicons, icons, an
168
+ * OG image): path patterns, GET and HEAD, never Worker code.
169
+ */
170
+ readonly publicAssets?: readonly string[];
148
171
  /** AI providers the Gateway calls for the app, by id or with their need. */
149
172
  readonly providers?: readonly (string | (EveryAppSettingNeed & {
150
173
  readonly id: string;
@@ -155,10 +178,8 @@ export interface EveryAppManifest {
155
178
  };
156
179
  /** The app's own secrets, by name or with their need. */
157
180
  readonly secrets?: readonly (string | EveryAppSecretEntry)[];
158
- /** App-domain scopes personal access tokens may request, with descriptions. */
159
- readonly scopes?: {
160
- readonly [scope: string]: string;
161
- };
181
+ /** The app's plain settings: per-install values that aren't secrets. */
182
+ readonly settings?: readonly EveryAppSettingEntry[];
162
183
  readonly ai?: {
163
184
  /** Model ids the app may request; any other is `model_not_allowed`. */
164
185
  readonly models?: readonly string[];
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,9 @@
20
20
  * under `providers` and calling `/api/ai/<provider>/…`.
21
21
  */
22
22
  import { AI_DEFAULT_MODEL } from "../internal/index.js";
23
+ import { type GatewayCallFor } from "./attribution.js";
23
24
  import { type CreateGatewayFetchOptions } from "./gatewayFetch.js";
25
+ import type { SetupInfo } from "./refusal.js";
24
26
  export interface AiClient {
25
27
  /** `http://every-app-gateway.internal/api/ai/default/v1`: an OpenAI client's base URL. */
26
28
  baseURL: string;
@@ -45,6 +47,49 @@ export declare function ai(options: CreateGatewayFetchOptions & {
45
47
  optional: true;
46
48
  }): AiClient | null;
47
49
  export declare function ai(options: CreateGatewayFetchOptions): AiClient;
50
+ /** Whether model calls to a provider (or the default) would go through. */
51
+ export interface AiStatus extends SetupInfo {
52
+ /** The id asked about: `default`, or a provider's (`openrouter`, `workers-ai`, …). */
53
+ provider: string;
54
+ /** The manifest asks for it: `ai.chat` for `default`, else `providers`. */
55
+ requested: boolean;
56
+ /** The Gateway (in local dev, `.dev.vars`) holds every setting it needs. */
57
+ configured: boolean;
58
+ /** Calls would go through. */
59
+ ready: boolean;
60
+ /**
61
+ * For `default`: the provider and model calls go to now, or null while
62
+ * none is configured. Null for a named provider.
63
+ */
64
+ resolved: {
65
+ provider: string;
66
+ label: string;
67
+ model: string;
68
+ } | null;
69
+ }
70
+ /**
71
+ * Whether the app can use a model right now, without calling one: gate
72
+ * an AI feature and show `setup` ("A chat model isn't set up on this
73
+ * Gateway: it needs OPENROUTER_API_KEY. An admin runs: pnpm everyapp
74
+ * configure inbox") up front instead of failing mid-task. `provider`
75
+ * defaults to `default`, the Gateway's default model (`ai: { chat: true }`);
76
+ * name one the manifest lists under `providers` to ask about it instead.
77
+ * The Gateway owns the wording: show `setup` and `command` as they are.
78
+ *
79
+ * Over the binding it sends `GET /api/ai/<provider>`; in local dev it
80
+ * answers from `.dev.vars` by the same rule `createGatewayFetch()` uses.
81
+ */
82
+ export declare function aiStatus({ env, provider, for: explicitTarget, }: {
83
+ env: object;
84
+ provider?: string;
85
+ /**
86
+ * Whom the status is for: the default resolves on that organization's
87
+ * choice (`everyapp ai default`). Left out, the request `everyApp()` is
88
+ * serving or the organization `withOrganization()` named, as on every
89
+ * call.
90
+ */
91
+ for?: GatewayCallFor;
92
+ }): Promise<AiStatus>;
48
93
  /**
49
94
  * A provider's root behind the Gateway, `http://every-app-gateway.internal/api/ai/<provider>`:
50
95
  * join the provider's own paths onto it (`/api/v1/chat/completions` for
@@ -1 +1 @@
1
- {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/server/ai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EACL,gBAAgB,EAIjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,QAAQ;IACvB,0FAA0F;IAC1F,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,gFAAgF;IAChF,KAAK,EAAE,OAAO,gBAAgB,CAAC;IAC/B,qEAAqE;IACrE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,wDAAuD,CAAC;AAExF;;;;;GAKG;AACH,wBAAgB,EAAE,CAChB,OAAO,EAAE,yBAAyB,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GACtD,QAAQ,GAAG,IAAI,CAAC;AACnB,wBAAgB,EAAE,CAAC,OAAO,EAAE,yBAAyB,GAAG,QAAQ,CAAC;AAejE;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,QAAQ,GAAE,MAA4B,GAAG,MAAM,CAaxE"}
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/server/ai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EACL,gBAAgB,EAOjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGL,KAAK,yBAAyB,EAE/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,QAAQ;IACvB,0FAA0F;IAC1F,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,gFAAgF;IAChF,KAAK,EAAE,OAAO,gBAAgB,CAAC;IAC/B,qEAAqE;IACrE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,0EAA0E;AAC1E,eAAO,MAAM,mBAAmB,wDAAuD,CAAC;AAExF;;;;;GAKG;AACH,wBAAgB,EAAE,CAChB,OAAO,EAAE,yBAAyB,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GACtD,QAAQ,GAAG,IAAI,CAAC;AACnB,wBAAgB,EAAE,CAAC,OAAO,EAAE,yBAAyB,GAAG,QAAQ,CAAC;AAajE,2EAA2E;AAC3E,MAAM,WAAW,QAAS,SAAQ,SAAS;IACzC,sFAAsF;IACtF,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,SAAS,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,UAAU,EAAE,OAAO,CAAC;IACpB,8BAA8B;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAAC,EAC7B,GAAG,EACH,QAA8B,EAC9B,GAAG,EAAE,cAAc,GACpB,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,cAAc,CAAC;CACtB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiFpB;AAID;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,QAAQ,GAAE,MAA4B,GAAG,MAAM,CAaxE"}
package/dist/server/ai.js CHANGED
@@ -19,7 +19,8 @@
19
19
  * fallback). An app that needs one provider in particular keeps listing it
20
20
  * under `providers` and calling `/api/ai/<provider>/…`.
21
21
  */
22
- import { AI_DEFAULT_MODEL, AI_DEFAULT_PROVIDER, CATALOG, ConfigurationError, } from "../internal/index.js";
22
+ import { AI_DEFAULT_MODEL, AI_DEFAULT_PROVIDER, CATALOG, ConfigurationError, aiProviderSettings, devAiProvider, resolveAiDefault, } from "../internal/index.js";
23
+ import { applyAttribution, attributionFor, } from "./attribution.js";
23
24
  import { BINDING_ORIGIN, createGatewayFetch, } from "./gatewayFetch.js";
24
25
  /** The base URL of the default route, as the SDK and the docs name it. */
25
26
  export const AI_DEFAULT_BASE_URL = `${BINDING_ORIGIN}/api/ai/${AI_DEFAULT_PROVIDER}/v1`;
@@ -35,6 +36,81 @@ export function ai(options) {
35
36
  embeddingsUrl: `${AI_DEFAULT_BASE_URL}/embeddings`,
36
37
  };
37
38
  }
39
+ /**
40
+ * Whether the app can use a model right now, without calling one: gate
41
+ * an AI feature and show `setup` ("A chat model isn't set up on this
42
+ * Gateway: it needs OPENROUTER_API_KEY. An admin runs: pnpm everyapp
43
+ * configure inbox") up front instead of failing mid-task. `provider`
44
+ * defaults to `default`, the Gateway's default model (`ai: { chat: true }`);
45
+ * name one the manifest lists under `providers` to ask about it instead.
46
+ * The Gateway owns the wording: show `setup` and `command` as they are.
47
+ *
48
+ * Over the binding it sends `GET /api/ai/<provider>`; in local dev it
49
+ * answers from `.dev.vars` by the same rule `createGatewayFetch()` uses.
50
+ */
51
+ export async function aiStatus({ env, provider = AI_DEFAULT_PROVIDER, for: explicitTarget, }) {
52
+ const target = attributionFor(env, explicitTarget, "aiStatus");
53
+ const values = env;
54
+ const binding = values["EVERY_APP_GATEWAY"];
55
+ const unavailable = {
56
+ provider,
57
+ requested: false,
58
+ configured: false,
59
+ ready: false,
60
+ resolved: null,
61
+ settings: [],
62
+ setup: null,
63
+ command: null,
64
+ };
65
+ if (binding && typeof binding.fetch === "function") {
66
+ const headers = new Headers();
67
+ if (target !== undefined)
68
+ applyAttribution(headers, target);
69
+ const response = await binding.fetch(`${BINDING_ORIGIN}/api/ai/${encodeURIComponent(provider)}`, { headers });
70
+ if (!response.ok)
71
+ return unavailable;
72
+ const body = (await response.json());
73
+ return {
74
+ ...unavailable,
75
+ ...body,
76
+ provider,
77
+ settings: Array.isArray(body.settings) ? body.settings : [],
78
+ setup: typeof body.setup === "string" ? body.setup : null,
79
+ command: typeof body.command === "string" ? body.command : null,
80
+ resolved: body.resolved ?? null,
81
+ };
82
+ }
83
+ if (!values["EVERYAPP_DEV"])
84
+ return unavailable;
85
+ const isSet = (name) => typeof values[name] === "string" && values[name].trim() !== "";
86
+ const dev = (label, settings, configured, resolved, also = "") => ({
87
+ provider,
88
+ requested: true,
89
+ configured,
90
+ ready: configured,
91
+ resolved,
92
+ settings: configured ? [] : [...settings],
93
+ setup: configured
94
+ ? null
95
+ : `${label} isn't set up for local development: set ${settings.join(" and ")}${also} in .dev.vars.`,
96
+ command: null,
97
+ });
98
+ if (provider === AI_DEFAULT_PROVIDER) {
99
+ const resolution = resolveAiDefault({ provider: null, isSet });
100
+ return dev("A chat model", resolution.settings, resolution.configured, resolution.configured
101
+ ? {
102
+ provider: resolution.provider,
103
+ label: resolution.label,
104
+ model: resolution.model,
105
+ }
106
+ : null, " (or another model provider's key)");
107
+ }
108
+ const spec = devAiProvider(provider);
109
+ if (!spec)
110
+ return unavailable;
111
+ const settings = aiProviderSettings(spec);
112
+ return dev(CATALOG.get(provider)?.label ?? provider, settings, settings.every(isSet), null);
113
+ }
38
114
  const CHAT_COMPLETIONS = "/chat/completions";
39
115
  /**
40
116
  * A provider's root behind the Gateway, `http://every-app-gateway.internal/api/ai/<provider>`:
@@ -1 +1 @@
1
- {"version":3,"file":"aiBinding.d.ts","sourceRoot":"","sources":["../../src/server/aiBinding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAEL,mBAAmB,EAInB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAQvD,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,mBAAmB,CAAC;IACrD;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC3C;AAUD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,uBAA4B,GACpC,EAAE,CAoEJ"}
1
+ {"version":3,"file":"aiBinding.d.ts","sourceRoot":"","sources":["../../src/server/aiBinding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAEL,mBAAmB,EAInB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIvD,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,mBAAmB,CAAC;IACrD;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC3C;AAUD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,uBAA4B,GACpC,EAAE,CAoEJ"}
@@ -21,8 +21,8 @@
21
21
  * for Workers AI).
22
22
  */
23
23
  import { AI_DEFAULT_MODEL, AI_DEFAULT_PROVIDER, AI_DEFAULT_ROUTES, ConfigurationError, devAiProvider, } from "../internal/index.js";
24
- import { BINDING_ORIGIN, createGatewayFetch, } from "./gatewayFetch.js";
25
- import { GatewayRefusalError, gatewayRefusal } from "./integrationFetch.js";
24
+ import { BINDING_ORIGIN, createGatewayFetch } from "./gatewayFetch.js";
25
+ import { GatewayRefusalError, gatewayRefusal } from "./refusal.js";
26
26
  /**
27
27
  * A Workers AI binding (`Ai`) over the Gateway: pass it where code takes
28
28
  * `env.AI`. `run()` covers text generation (messages or prompt; tools;
@@ -63,7 +63,7 @@ export function gatewayAiBinding(env, options = {}) {
63
63
  ? { model: sent, input: inputs["text"] }
64
64
  : chatBody(sent, inputs);
65
65
  const gatewayFetch = createGatewayFetch({
66
- env: env,
66
+ env,
67
67
  for: options.for,
68
68
  });
69
69
  const response = await gatewayFetch(url, {
@@ -31,7 +31,7 @@ export interface AuthorizeUrlOptions {
31
31
  * `codeChallenge`, PKCE as S256. The app keeps its `state` and verifier
32
32
  * for the callback.
33
33
  *
34
- * A client without scope sets (LinkedIn, Mastodon, ...) is refused: the
34
+ * A client without scope sets is refused: the
35
35
  * registry's checklist for one isn't what the gateway holds a token to,
36
36
  * so an app builds that URL itself from the status's `clientId`.
37
37
  *
@@ -1 +1 @@
1
- {"version":3,"file":"authorizeUrl.d.ts","sourceRoot":"","sources":["../../src/server/authorizeUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,uBAAuB,EAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAE1E,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,QAAQ,EAAE,uBAAuB,CAAC;IAClC,iFAAiF;IACjF,MAAM,EAAE,4BAA4B,CAAC;IACrC,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAgCD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,MAAM,EACN,WAAW,EACX,KAAK,EACL,aAAa,EACb,MAAM,GACP,EAAE,mBAAmB,GAAG,GAAG,CA2D3B"}
1
+ {"version":3,"file":"authorizeUrl.d.ts","sourceRoot":"","sources":["../../src/server/authorizeUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,uBAAuB,EAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAE1E,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,QAAQ,EAAE,uBAAuB,CAAC;IAClC,iFAAiF;IACjF,MAAM,EAAE,4BAA4B,CAAC;IACrC,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAgCD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,MAAM,EACN,WAAW,EACX,KAAK,EACL,aAAa,EACb,MAAM,GACP,EAAE,mBAAmB,GAAG,GAAG,CAqD3B"}