@usine/gateway 0.0.0-stage → 0.1.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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -2
  3. package/dist/admin/api.d.ts +206 -0
  4. package/dist/admin/api.d.ts.map +1 -0
  5. package/dist/admin/api.js +105 -0
  6. package/dist/admin/api.js.map +1 -0
  7. package/dist/admin/server.d.ts +10 -0
  8. package/dist/admin/server.d.ts.map +1 -0
  9. package/dist/admin/server.js +79 -0
  10. package/dist/admin/server.js.map +1 -0
  11. package/dist/attachment/attachment.d.ts +77 -0
  12. package/dist/attachment/attachment.d.ts.map +1 -0
  13. package/dist/attachment/attachment.js +57 -0
  14. package/dist/attachment/attachment.js.map +1 -0
  15. package/dist/attachment/store.d.ts +27 -0
  16. package/dist/attachment/store.d.ts.map +1 -0
  17. package/dist/attachment/store.js +101 -0
  18. package/dist/attachment/store.js.map +1 -0
  19. package/dist/caller/caller.d.ts +60 -0
  20. package/dist/caller/caller.d.ts.map +1 -0
  21. package/dist/caller/caller.js +130 -0
  22. package/dist/caller/caller.js.map +1 -0
  23. package/dist/egress/client-hello.d.ts +120 -0
  24. package/dist/egress/client-hello.d.ts.map +1 -0
  25. package/dist/egress/client-hello.js +155 -0
  26. package/dist/egress/client-hello.js.map +1 -0
  27. package/dist/egress/egress.d.ts +66 -0
  28. package/dist/egress/egress.d.ts.map +1 -0
  29. package/dist/egress/egress.js +114 -0
  30. package/dist/egress/egress.js.map +1 -0
  31. package/dist/gateway.d.ts +23 -0
  32. package/dist/gateway.d.ts.map +1 -0
  33. package/dist/gateway.js +23 -0
  34. package/dist/gateway.js.map +1 -0
  35. package/dist/github/github.d.ts +43 -0
  36. package/dist/github/github.d.ts.map +1 -0
  37. package/dist/github/github.js +88 -0
  38. package/dist/github/github.js.map +1 -0
  39. package/dist/llm/llm.d.ts +64 -0
  40. package/dist/llm/llm.d.ts.map +1 -0
  41. package/dist/llm/llm.js +92 -0
  42. package/dist/llm/llm.js.map +1 -0
  43. package/dist/node/egress-proxy.d.ts +30 -0
  44. package/dist/node/egress-proxy.d.ts.map +1 -0
  45. package/dist/node/egress-proxy.js +491 -0
  46. package/dist/node/egress-proxy.js.map +1 -0
  47. package/dist/node/environment.d.ts +108 -0
  48. package/dist/node/environment.d.ts.map +1 -0
  49. package/dist/node/environment.js +113 -0
  50. package/dist/node/environment.js.map +1 -0
  51. package/dist/node/main.d.ts +3 -0
  52. package/dist/node/main.d.ts.map +1 -0
  53. package/dist/node/main.js +13 -0
  54. package/dist/node/main.js.map +1 -0
  55. package/dist/node/node.d.ts +29 -0
  56. package/dist/node/node.d.ts.map +1 -0
  57. package/dist/node/node.js +82 -0
  58. package/dist/node/node.js.map +1 -0
  59. package/dist/node/reload.d.ts +26 -0
  60. package/dist/node/reload.d.ts.map +1 -0
  61. package/dist/node/reload.js +142 -0
  62. package/dist/node/reload.js.map +1 -0
  63. package/dist/proxy/forward.d.ts +12 -0
  64. package/dist/proxy/forward.d.ts.map +1 -0
  65. package/dist/proxy/forward.js +44 -0
  66. package/dist/proxy/forward.js.map +1 -0
  67. package/dist/proxy/proxy.d.ts +28 -0
  68. package/dist/proxy/proxy.d.ts.map +1 -0
  69. package/dist/proxy/proxy.js +189 -0
  70. package/dist/proxy/proxy.js.map +1 -0
  71. package/dist/settings.d.ts +52 -0
  72. package/dist/settings.d.ts.map +1 -0
  73. package/dist/settings.js +27 -0
  74. package/dist/settings.js.map +1 -0
  75. package/dist/upstream.d.ts +5 -0
  76. package/dist/upstream.d.ts.map +1 -0
  77. package/dist/upstream.js +6 -0
  78. package/dist/upstream.js.map +1 -0
  79. package/package.json +58 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"egress-proxy.js","sourceRoot":"","sources":["../../src/node/egress-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import { GatewayDomain } from "@usine/core/worker";
2
+ import { Config, ConfigProvider, Effect, FileSystem, Layer, Option, Schema } from "effect";
3
+ import { AnthropicProvider, OpenAiProvider } from "../llm/llm.ts";
4
+ import { AdminToken, CallerKey, GatewaySettings } from "../settings.ts";
5
+ /** The allowlist path if `USINE_GATEWAY_EGRESS_ALLOWLIST` isn't set. */
6
+ export declare const DEFAULT_EGRESS_ALLOWLIST_PATH = "/etc/usine-gateway/egress-allowlist";
7
+ declare const ConflictingAnthropicCredentials_base: Schema.Class<ConflictingAnthropicCredentials, Schema.TaggedStruct<"ConflictingAnthropicCredentials", {
8
+ readonly message: Schema.String;
9
+ }>, import("effect/Cause").YieldableError>;
10
+ /** The error when both an Anthropic API key and a subscription token are set. */
11
+ export declare class ConflictingAnthropicCredentials extends ConflictingAnthropicCredentials_base {
12
+ }
13
+ declare const EnvironmentFileError_base: Schema.Class<EnvironmentFileError, Schema.TaggedStruct<"EnvironmentFileError", {
14
+ readonly path: Schema.String;
15
+ readonly message: Schema.String;
16
+ }>, import("effect/Cause").YieldableError>;
17
+ /** The error when a file listed in `USINE_GATEWAY_ENVIRONMENT_FILES` can't be read. */
18
+ export declare class EnvironmentFileError extends EnvironmentFileError_base {
19
+ }
20
+ /** The Gateway's settings source: its environment files layered over the process environment. */
21
+ export interface SettingsSource {
22
+ /** The environment files in read order; empty if none is listed. */
23
+ readonly files: ReadonlyArray<string>;
24
+ readonly provider: ConfigProvider.ConfigProvider;
25
+ }
26
+ /**
27
+ * Reads the `:`-separated environment files listed in `USINE_GATEWAY_ENVIRONMENT_FILES` in
28
+ * `base`, one `KEY=value` per line, and layers them over `base`. Later files override earlier
29
+ * ones, as with systemd's `EnvironmentFile=`. Without that variable, returns `base` alone.
30
+ */
31
+ export declare const readSettingsSource: (base: ConfigProvider.ConfigProvider) => Effect.Effect<{
32
+ files: string[] | readonly string[];
33
+ provider: ConfigProvider.ConfigProvider;
34
+ }, Config.ConfigError | EnvironmentFileError, FileSystem.FileSystem>;
35
+ /** The LLM providers and credentials from the settings. */
36
+ export declare const llmProviders: Effect.Effect<{
37
+ anthropic: Option.Option<AnthropicProvider>;
38
+ openai: Option.Option<OpenAiProvider>;
39
+ }, Config.ConfigError | ConflictingAnthropicCredentials, never>;
40
+ export declare const egressAllowlistPath: Config.Config<string>;
41
+ /** Reads and parses the allowlist file at `path`. */
42
+ export declare const readEgressAllowlist: (path: string) => Effect.Effect<import("../egress/egress.ts").EgressAllowlist, import("../egress/egress.ts").EgressAllowlistError | import("effect/PlatformError").PlatformError, FileSystem.FileSystem>;
43
+ export interface Listener {
44
+ readonly host: string;
45
+ readonly port: number;
46
+ }
47
+ /** The listeners for the reverse proxy (GitHub and LLMs), the forward proxy (allowlisted hosts), and the admin API (executor). */
48
+ export interface GatewayListeners {
49
+ readonly proxy: Listener;
50
+ readonly egress: Listener;
51
+ readonly admin: Listener;
52
+ }
53
+ /**
54
+ * Listeners from the environment. The proxies default to loopback, so an unconfigured Gateway
55
+ * is unreachable; the VM's unit sets its private address.
56
+ */
57
+ export declare const listenersFromEnvironment: Config.Config<{
58
+ proxy: {
59
+ host: string;
60
+ port: number;
61
+ };
62
+ egress: {
63
+ host: string;
64
+ port: number;
65
+ };
66
+ admin: {
67
+ host: string;
68
+ port: number;
69
+ };
70
+ }>;
71
+ /** The settings that only a restart changes: the domain, the listeners, the admin token, and the caller key that signs all caller tokens. */
72
+ export interface RestartSettings {
73
+ readonly domain: GatewayDomain;
74
+ readonly adminToken: AdminToken;
75
+ readonly callerKey: CallerKey;
76
+ readonly listeners: GatewayListeners;
77
+ }
78
+ export declare const restartSettings: Config.Config<RestartSettings>;
79
+ export interface StartupSettings {
80
+ readonly settings: GatewaySettings["Service"];
81
+ readonly listeners: GatewayListeners;
82
+ }
83
+ /**
84
+ * Reads the Gateway's settings from `source`. Fails on a missing secret, an invalid value, or
85
+ * an unreadable allowlist, so the Gateway stops before it listens.
86
+ */
87
+ export declare const readStartupSettings: (source: SettingsSource) => Effect.Effect<{
88
+ settings: {
89
+ domain: string & import("effect/Brand").Brand<"GatewayDomain">;
90
+ github: import("../github/github.ts").GitHubOrigins;
91
+ providers: {
92
+ anthropic: Option.Option<AnthropicProvider>;
93
+ openai: Option.Option<OpenAiProvider>;
94
+ };
95
+ egress: import("../egress/egress.ts").EgressAllowlist;
96
+ adminToken: import("effect/Redacted").Redacted<string>;
97
+ callerKey: import("effect/Redacted").Redacted<string>;
98
+ };
99
+ listeners: GatewayListeners;
100
+ }, Config.ConfigError | ConflictingAnthropicCredentials | import("../egress/egress.ts").EgressAllowlistError | import("effect/PlatformError").PlatformError, FileSystem.FileSystem>;
101
+ /**
102
+ * The Gateway's settings, read once at startup from the files in
103
+ * `USINE_GATEWAY_ENVIRONMENT_FILES` over the process environment, plus the egress allowlist
104
+ * file. Fails on a missing secret, an invalid value, or an unreadable file.
105
+ */
106
+ export declare const settingsFromEnvironment: Layer.Layer<GatewaySettings, Config.ConfigError | ConflictingAnthropicCredentials | import("../egress/egress.ts").EgressAllowlistError | EnvironmentFileError | import("effect/PlatformError").PlatformError, FileSystem.FileSystem>;
107
+ export {};
108
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/node/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAG3F,OAAO,EAEL,iBAAiB,EAGjB,cAAc,EACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGxE,wEAAwE;AACxE,eAAO,MAAM,6BAA6B,wCAAwC,CAAC;;;;AAOnF,iFAAiF;AACjF,qBAAa,+BAAgC,SAAQ,oCAGpD;CAAG;;;;;AAEJ,uFAAuF;AACvF,qBAAa,oBAAqB,SAAQ,yBAGzC;CAAG;AAEJ,iGAAiG;AACjG,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,cAAc,CAAC;CAClD;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;oEAmB7B,CAAC;AAEH,2DAA2D;AAC3D,eAAO,MAAM,YAAY;;;+DA2BvB,CAAC;AAEH,eAAO,MAAM,mBAAmB,uBAE/B,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,mBAAmB,0MAM9B,CAAC;AAEH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,kIAAkI;AAClI,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;CAC1B;AAQD;;;GAGG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;EAInC,CAAC;AAEH,6IAA6I;AAC7I,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;CACtC;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAKzD,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;CACtC;AAmBD;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;mLAO9B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,sOAOnC,CAAC"}
@@ -0,0 +1,113 @@
1
+ import { GatewayDomain } from "@usine/core/worker";
2
+ import { Config, ConfigProvider, Effect, FileSystem, Layer, Option, Schema } from "effect";
3
+ import { parseEgressAllowlist } from "../egress/egress.js";
4
+ import { GITHUB_ORIGINS } from "../github/github.js";
5
+ import { AnthropicApiKey, AnthropicProvider, AnthropicSubscriptionToken, OpenAiProvider, } from "../llm/llm.js";
6
+ import { AdminToken, CallerKey, GatewaySettings } from "../settings.js";
7
+ import { UpstreamBase } from "../upstream.js";
8
+ /** The allowlist path if `USINE_GATEWAY_EGRESS_ALLOWLIST` isn't set. */
9
+ export const DEFAULT_EGRESS_ALLOWLIST_PATH = "/etc/usine-gateway/egress-allowlist";
10
+ const Secret = Schema.RedactedFromValue(Schema.NonEmptyString);
11
+ const upstream = (name, fallback) => Config.schema(UpstreamBase, name).pipe(Config.withDefault(UpstreamBase.make(fallback)));
12
+ /** The error when both an Anthropic API key and a subscription token are set. */
13
+ export class ConflictingAnthropicCredentials extends Schema.TaggedError()("ConflictingAnthropicCredentials", { message: Schema.String }) {
14
+ }
15
+ /** The error when a file listed in `USINE_GATEWAY_ENVIRONMENT_FILES` can't be read. */
16
+ export class EnvironmentFileError extends Schema.TaggedError()("EnvironmentFileError", { path: Schema.String, message: Schema.String }) {
17
+ }
18
+ /**
19
+ * Reads the `:`-separated environment files listed in `USINE_GATEWAY_ENVIRONMENT_FILES` in
20
+ * `base`, one `KEY=value` per line, and layers them over `base`. Later files override earlier
21
+ * ones, as with systemd's `EnvironmentFile=`. Without that variable, returns `base` alone.
22
+ */
23
+ export const readSettingsSource = Effect.fn("GatewayNode.readSettingsSource")(function* (base) {
24
+ const fs = yield* FileSystem.FileSystem;
25
+ const named = yield* Config.option(Config.string("USINE_GATEWAY_ENVIRONMENT_FILES")).parse(base);
26
+ const files = Option.match(named, {
27
+ onNone: () => [],
28
+ onSome: (value) => value.split(":").filter((path) => path !== ""),
29
+ });
30
+ const contents = yield* Effect.forEach(files, (path) => fs
31
+ .readFileString(path)
32
+ .pipe(Effect.mapError((error) => new EnvironmentFileError({ path, message: error.message }))));
33
+ const provider = contents.reduce((below, text) => ConfigProvider.fromDotEnvContents(text).pipe(ConfigProvider.orElse(below)), base);
34
+ return { files, provider };
35
+ });
36
+ /** The LLM providers and credentials from the settings. */
37
+ export const llmProviders = Effect.gen(function* () {
38
+ const anthropicKey = yield* Config.option(Config.schema(Secret, "ANTHROPIC_API_KEY"));
39
+ const subscription = yield* Config.option(Config.schema(Secret, "USINE_GATEWAY_ANTHROPIC_SUBSCRIPTION_TOKEN"));
40
+ const openAiKey = yield* Config.option(Config.schema(Secret, "OPENAI_API_KEY"));
41
+ const anthropicUpstream = yield* upstream("USINE_GATEWAY_ANTHROPIC_UPSTREAM", "https://api.anthropic.com");
42
+ const openAiUpstream = yield* upstream("USINE_GATEWAY_OPENAI_UPSTREAM", "https://api.openai.com");
43
+ if (Option.isSome(anthropicKey) && Option.isSome(subscription))
44
+ return yield* new ConflictingAnthropicCredentials({
45
+ message: "ANTHROPIC_API_KEY and USINE_GATEWAY_ANTHROPIC_SUBSCRIPTION_TOKEN are both set, and the gateway sends only one Anthropic credential. Unset one of them.",
46
+ });
47
+ const anthropicCredential = Option.orElse(Option.map(anthropicKey, (key) => new AnthropicApiKey({ key })), () => Option.map(subscription, (token) => new AnthropicSubscriptionToken({ token })));
48
+ return {
49
+ anthropic: Option.map(anthropicCredential, (credential) => new AnthropicProvider({ upstream: anthropicUpstream, credential })),
50
+ openai: Option.map(openAiKey, (key) => new OpenAiProvider({ upstream: openAiUpstream, key })),
51
+ };
52
+ });
53
+ export const egressAllowlistPath = Config.string("USINE_GATEWAY_EGRESS_ALLOWLIST").pipe(Config.withDefault(DEFAULT_EGRESS_ALLOWLIST_PATH));
54
+ /** Reads and parses the allowlist file at `path`. */
55
+ export const readEgressAllowlist = Effect.fn("GatewayNode.readEgressAllowlist")(function* (path) {
56
+ const fs = yield* FileSystem.FileSystem;
57
+ const text = yield* fs.readFileString(path);
58
+ return yield* Effect.fromResult(parseEgressAllowlist(text));
59
+ });
60
+ const listener = (prefix, host, port) => Config.all({
61
+ host: Config.string(`${prefix}_HOST`).pipe(Config.withDefault(host)),
62
+ port: Config.port(`${prefix}_PORT`).pipe(Config.withDefault(port)),
63
+ });
64
+ /**
65
+ * Listeners from the environment. The proxies default to loopback, so an unconfigured Gateway
66
+ * is unreachable; the VM's unit sets its private address.
67
+ */
68
+ export const listenersFromEnvironment = Config.all({
69
+ proxy: listener("USINE_GATEWAY_PROXY", "127.0.0.1", 80),
70
+ egress: listener("USINE_GATEWAY_EGRESS", "127.0.0.1", 3128),
71
+ admin: listener("USINE_GATEWAY_ADMIN", "127.0.0.1", 7070),
72
+ });
73
+ export const restartSettings = Config.all({
74
+ domain: Config.schema(GatewayDomain, "USINE_GATEWAY_DOMAIN"),
75
+ adminToken: Config.schema(AdminToken, "USINE_GATEWAY_ADMIN_TOKEN"),
76
+ callerKey: Config.schema(CallerKey, "USINE_GATEWAY_CALLER_KEY"),
77
+ listeners: listenersFromEnvironment,
78
+ });
79
+ const startupSettings = Effect.gen(function* () {
80
+ const { domain, adminToken, callerKey, listeners } = yield* restartSettings;
81
+ const path = yield* egressAllowlistPath;
82
+ const egress = yield* readEgressAllowlist(path);
83
+ yield* Effect.logInfo("Loaded the egress allowlist", { path, rules: egress.rules.length });
84
+ const providers = yield* llmProviders;
85
+ yield* Effect.logInfo("Configured LLM providers", {
86
+ anthropic: Option.match(providers.anthropic, {
87
+ onNone: () => "none",
88
+ onSome: (provider) => provider.credential._tag,
89
+ }),
90
+ openai: Option.isSome(providers.openai) ? "OpenAiApiKey" : "none",
91
+ });
92
+ const settings = { domain, github: GITHUB_ORIGINS, providers, egress, adminToken, callerKey };
93
+ return { settings, listeners };
94
+ });
95
+ /**
96
+ * Reads the Gateway's settings from `source`. Fails on a missing secret, an invalid value, or
97
+ * an unreadable allowlist, so the Gateway stops before it listens.
98
+ */
99
+ export const readStartupSettings = Effect.fn("GatewayNode.readStartupSettings")(function* (source) {
100
+ yield* Effect.logInfo("Reading the gateway settings", { environmentFiles: source.files });
101
+ return yield* startupSettings.pipe(Effect.provideService(ConfigProvider.ConfigProvider, source.provider));
102
+ });
103
+ /**
104
+ * The Gateway's settings, read once at startup from the files in
105
+ * `USINE_GATEWAY_ENVIRONMENT_FILES` over the process environment, plus the egress allowlist
106
+ * file. Fails on a missing secret, an invalid value, or an unreadable file.
107
+ */
108
+ export const settingsFromEnvironment = Layer.effect(GatewaySettings, Effect.gen(function* () {
109
+ const source = yield* readSettingsSource(yield* ConfigProvider.ConfigProvider);
110
+ const { settings } = yield* readStartupSettings(source);
111
+ return settings;
112
+ }));
113
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/node/environment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/node/main.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import { NodeRuntime, NodeServices } from "@effect/platform-node";
3
+ import { Cause, Effect, Exit, Layer, Logger, Runtime } from "effect";
4
+ import { gatewayFromEnvironment } from "./node.js";
5
+ // One JSON object per line, so `journalctl -o cat | jq` can filter journald output.
6
+ const logger = Logger.layer([Logger.consoleJson]);
7
+ NodeRuntime.runMain(Layer.launch(gatewayFromEnvironment).pipe(Effect.provide(Layer.mergeAll(NodeServices.layer, logger))), {
8
+ // The Gateway runs until a signal interrupts it, so systemd records the stop as a success.
9
+ teardown: (exit, onExit) => Exit.isFailure(exit) && Cause.hasInterruptsOnly(exit.cause)
10
+ ? onExit(0)
11
+ : Runtime.defaultTeardown(exit, onExit),
12
+ });
13
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/node/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEnD,oFAAoF;AACpF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AAElD,WAAW,CAAC,OAAO,CACjB,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CACvC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAC3D,EACD;IACE,2FAA2F;IAC3F,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;QACzD,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACX,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC;CAC5C,CACF,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { Context, Layer } from "effect";
2
+ import { Attachments } from "../attachment/store.ts";
3
+ import { CallerTokens } from "../caller/caller.ts";
4
+ import { GatewaySettings, SettingsInForce } from "../settings.ts";
5
+ import { type GatewayListeners, type Listener } from "./environment.ts";
6
+ export { ConflictingAnthropicCredentials, DEFAULT_EGRESS_ALLOWLIST_PATH, EnvironmentFileError, type GatewayListeners, type Listener, listenersFromEnvironment, settingsFromEnvironment, } from "./environment.ts";
7
+ export { EgressProxyListenError } from "./egress-proxy.ts";
8
+ export { GatewayReload } from "./reload.ts";
9
+ declare const GatewayAddresses_base: Context.ServiceClass<GatewayAddresses, "@usine/gateway/node/GatewayAddresses", {
10
+ readonly proxy: Listener;
11
+ readonly egress: Listener;
12
+ readonly admin: Listener;
13
+ }>;
14
+ /** The bound addresses of the Gateway's three servers, with any port 0 replaced by the assigned port. */
15
+ export declare class GatewayAddresses extends GatewayAddresses_base {
16
+ }
17
+ /**
18
+ * The Gateway on Node: the reverse proxy, forward proxy, and admin API on their listeners,
19
+ * sharing one attachment store, caller token signer, and settings. Upstream requests use
20
+ * undici, which doesn't change `content-encoding`, so compressed bodies pass through unchanged.
21
+ */
22
+ export declare const gatewayLayer: (listeners: GatewayListeners) => Layer.Layer<Attachments | CallerTokens | GatewayAddresses | SettingsInForce, import("./egress-proxy.ts").EgressProxyListenError | import("effect/unstable/http/HttpServerError").ServeError, GatewaySettings>;
23
+ /**
24
+ * The Gateway configured from its environment files, the process environment, and its
25
+ * allowlist file, as run by the `usine-gateway` command. On SIGHUP, reloads the egress
26
+ * allowlist and LLM providers with `GatewayReload`.
27
+ */
28
+ export declare const gatewayFromEnvironment: Layer.Layer<Attachments | CallerTokens | GatewayAddresses | import("./reload.ts").GatewayReload | SettingsInForce, import("effect/Config").ConfigError | import("./environment.ts").ConflictingAnthropicCredentials | import("../gateway.ts").EgressAllowlistError | import("./egress-proxy.ts").EgressProxyListenError | import("./environment.ts").EnvironmentFileError | import("effect/PlatformError").PlatformError | import("effect/unstable/http/HttpServerError").ServeError, import("effect/FileSystem").FileSystem>;
29
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/node/node.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,OAAO,EAAU,KAAK,EAAU,MAAM,QAAQ,CAAC;AAUxE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EAGd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,+BAA+B,EAC/B,6BAA6B,EAC7B,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;;oBAKxB,QAAQ;qBAAmB,QAAQ;oBAAkB,QAAQ;;AAHjF,yGAAyG;AACzG,qBAAa,gBAAiB,SAAQ,qBAGK;CAAG;AA2D9C;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAe,gBAAgB,kNAmBrD,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,+fAUlC,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { createServer } from "node:http";
2
+ import { NodeHttpClient, NodeHttpServer, NodeHttpServerRequest } from "@effect/platform-node";
3
+ import { ConfigProvider, Context, Effect, Layer, Stream } from "effect";
4
+ import { HttpMiddleware, HttpBody, HttpRouter, HttpServer, HttpServerRequest, HttpServerResponse, } from "effect/unstable/http";
5
+ import { adminRoutes } from "../admin/server.js";
6
+ import { Attachments } from "../attachment/store.js";
7
+ import { CallerTokens } from "../caller/caller.js";
8
+ import { GatewayProxy } from "../proxy/proxy.js";
9
+ import { GatewaySettings, SettingsInForce } from "../settings.js";
10
+ import { serveEgressProxy } from "./egress-proxy.js";
11
+ import { readSettingsSource, readStartupSettings, } from "./environment.js";
12
+ import { gatewayReloadLayer, reloadOnHangup } from "./reload.js";
13
+ export { ConflictingAnthropicCredentials, DEFAULT_EGRESS_ALLOWLIST_PATH, EnvironmentFileError, listenersFromEnvironment, settingsFromEnvironment, } from "./environment.js";
14
+ export { EgressProxyListenError } from "./egress-proxy.js";
15
+ export { GatewayReload } from "./reload.js";
16
+ /** The bound addresses of the Gateway's three servers, with any port 0 replaced by the assigned port. */
17
+ export class GatewayAddresses extends Context.Service()("@usine/gateway/node/GatewayAddresses") {
18
+ }
19
+ const boundTo = (address, requested) => address._tag === "TcpAddress" ? { host: address.hostname, port: address.port } : requested;
20
+ /** Returns an address this process can connect to for `listener`, which may be bound to all interfaces. */
21
+ const reachable = (listener) => listener.host === "0.0.0.0" || listener.host === "::"
22
+ ? { host: "127.0.0.1", port: listener.port }
23
+ : listener;
24
+ const serveProxy = Effect.fn("GatewayNode.serveProxy")(function* (listener) {
25
+ const proxy = yield* GatewayProxy;
26
+ // A git push or a long model response can exceed Node's default request timeout.
27
+ const server = yield* NodeHttpServer.make(() => createServer({ requestTimeout: 0 }), listener);
28
+ yield* server.serve(Effect.gen(function* () {
29
+ const request = yield* HttpServerRequest.HttpServerRequest;
30
+ const response = yield* proxy.handle;
31
+ if (response.body._tag !== "Stream")
32
+ return response;
33
+ // effect 4.0.0-rc.111 ends a failed stream normally after sending headers. Destroying it first keeps a
34
+ // partial download or model response from looking complete to the Worker.
35
+ const body = response.body.stream.pipe(Stream.onError(() => Effect.gen(function* () {
36
+ yield* Effect.logError("The reverse proxy response body failed", {
37
+ host: request.headers.host,
38
+ method: request.method,
39
+ path: request.url.split("?")[0],
40
+ error: "UpstreamBodyFailure",
41
+ });
42
+ NodeHttpServerRequest.toServerResponse(request).destroy();
43
+ }).pipe(Effect.uninterruptible)));
44
+ return HttpServerResponse.setBody(response, HttpBody.stream(body, response.body.contentType, response.body.contentLength));
45
+ }));
46
+ const bound = boundTo(server.address, listener);
47
+ yield* Effect.logInfo("The gateway proxy is listening", bound);
48
+ return bound;
49
+ });
50
+ const serveAdmin = Effect.fn("GatewayNode.serveAdmin")(function* (listener) {
51
+ const server = yield* NodeHttpServer.make(() => createServer(), listener);
52
+ yield* Layer.build(HttpRouter.serve(adminRoutes, { disableListenLog: true }).pipe(Layer.provide(Layer.succeed(HttpServer.HttpServer)(server)), Layer.provide(NodeHttpServer.layerHttpServices)));
53
+ const bound = boundTo(server.address, listener);
54
+ yield* Effect.logInfo("The gateway admin API is listening", bound);
55
+ return bound;
56
+ });
57
+ /**
58
+ * The Gateway on Node: the reverse proxy, forward proxy, and admin API on their listeners,
59
+ * sharing one attachment store, caller token signer, and settings. Upstream requests use
60
+ * undici, which doesn't change `content-encoding`, so compressed bodies pass through unchanged.
61
+ */
62
+ export const gatewayLayer = (listeners) => Layer.effect(GatewayAddresses, Effect.gen(function* () {
63
+ const proxy = yield* serveProxy(listeners.proxy);
64
+ const egress = yield* serveEgressProxy(listeners.egress, reachable(proxy));
65
+ const admin = yield* serveAdmin(listeners.admin);
66
+ return { proxy, egress, admin };
67
+ })).pipe(Layer.provide(GatewayProxy.layer), Layer.provideMerge(Layer.mergeAll(Attachments.layer, CallerTokens.layer, SettingsInForce.layer)), Layer.provide(NodeHttpClient.layerUndici),
68
+ // effect 4.0.0-rc.111 reads header redaction settings after the request fiber may have cleared its
69
+ // context, so automatic HTTP spans are disabled. Named Gateway spans still record safe fields
70
+ // without incoming credentials.
71
+ Layer.provide(Layer.succeed(HttpMiddleware.TracerDisabledWhen)(() => true)));
72
+ /**
73
+ * The Gateway configured from its environment files, the process environment, and its
74
+ * allowlist file, as run by the `usine-gateway` command. On SIGHUP, reloads the egress
75
+ * allowlist and LLM providers with `GatewayReload`.
76
+ */
77
+ export const gatewayFromEnvironment = Layer.unwrap(Effect.gen(function* () {
78
+ const base = yield* ConfigProvider.ConfigProvider;
79
+ const started = yield* readStartupSettings(yield* readSettingsSource(base));
80
+ return reloadOnHangup.pipe(Layer.provideMerge(gatewayReloadLayer(started, base)), Layer.provideMerge(gatewayLayer(started.listeners)), Layer.provide(Layer.succeed(GatewaySettings)(started.settings)));
81
+ }));
82
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/node/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { ConfigProvider, Context, Effect, FileSystem, Layer } from "effect";
2
+ import { SettingsInForce } from "../settings.ts";
3
+ import { type StartupSettings } from "./environment.ts";
4
+ declare const GatewayReload_base: Context.ServiceClass<GatewayReload, "@usine/gateway/node/GatewayReload", {
5
+ /**
6
+ * Reloads once, after any reload in progress. Never fails: an unreadable or invalid file keeps
7
+ * the current settings, restart-only settings are unchanged, and both cases are logged.
8
+ */
9
+ readonly reload: Effect.Effect<void>;
10
+ }>;
11
+ /**
12
+ * The service that reloads the egress allowlist and LLM providers from the startup environment
13
+ * and allowlist files. Attachments, the admin API, listeners, and open tunnels are unchanged.
14
+ * `usine-gateway` runs it on SIGHUP.
15
+ */
16
+ export declare class GatewayReload extends GatewayReload_base {
17
+ }
18
+ /** Returns the reload for a Gateway started with `started`, reading settings from the environment files over `base`. */
19
+ export declare const gatewayReloadLayer: (started: StartupSettings, base: ConfigProvider.ConfigProvider) => Layer.Layer<GatewayReload, never, FileSystem.FileSystem | SettingsInForce>;
20
+ /**
21
+ * Runs the reload on each SIGHUP while the layer is in scope, one at a time; signals during a
22
+ * reload trigger one more. The listener also prevents Node's default exit on SIGHUP.
23
+ */
24
+ export declare const reloadOnHangup: Layer.Layer<never, never, GatewayReload>;
25
+ export {};
26
+ //# sourceMappingURL=reload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload.d.ts","sourceRoot":"","sources":["../../src/node/reload.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,OAAO,EACP,MAAM,EACN,UAAU,EACV,KAAK,EAKN,MAAM,QAAQ,CAAC;AAGhB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAQL,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;;IAUtB;;;OAGG;qBACc,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;AAZxC;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,kBASK;CAAG;AA2G3C,wHAAwH;AACxH,eAAO,MAAM,kBAAkB,YAAa,eAAe,QAAQ,cAAc,CAAC,cAAc,+EAiE7F,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,cAAc,0CAoB1B,CAAC"}
@@ -0,0 +1,142 @@
1
+ import { Cause, ConfigProvider, Context, Effect, FileSystem, Layer, Option, Queue, Redacted, Semaphore, } from "effect";
2
+ import { SettingsInForce } from "../settings.js";
3
+ import { egressAllowlistPath, llmProviders, readEgressAllowlist, readSettingsSource, restartSettings, } from "./environment.js";
4
+ /**
5
+ * The service that reloads the egress allowlist and LLM providers from the startup environment
6
+ * and allowlist files. Attachments, the admin API, listeners, and open tunnels are unchanged.
7
+ * `usine-gateway` runs it on SIGHUP.
8
+ */
9
+ export class GatewayReload extends Context.Service()("@usine/gateway/node/GatewayReload") {
10
+ }
11
+ /** Returns each restart-only setting as text, keyed by its variable. */
12
+ const restartValues = ({ domain, adminToken, callerKey, listeners }) => ({
13
+ USINE_GATEWAY_DOMAIN: domain,
14
+ USINE_GATEWAY_ADMIN_TOKEN: Redacted.value(adminToken),
15
+ USINE_GATEWAY_CALLER_KEY: Redacted.value(callerKey),
16
+ USINE_GATEWAY_PROXY_HOST: listeners.proxy.host,
17
+ USINE_GATEWAY_PROXY_PORT: String(listeners.proxy.port),
18
+ USINE_GATEWAY_EGRESS_HOST: listeners.egress.host,
19
+ USINE_GATEWAY_EGRESS_PORT: String(listeners.egress.port),
20
+ USINE_GATEWAY_ADMIN_HOST: listeners.admin.host,
21
+ USINE_GATEWAY_ADMIN_PORT: String(listeners.admin.port),
22
+ });
23
+ /** Returns each credential variable with its value, or `None` if unset. */
24
+ const credentialValues = ({ anthropic, openai }) => {
25
+ const credential = Option.getOrUndefined(Option.map(anthropic, (provider) => provider.credential));
26
+ return {
27
+ ANTHROPIC_API_KEY: credential?._tag === "AnthropicApiKey" ? Redacted.value(credential.key) : undefined,
28
+ USINE_GATEWAY_ANTHROPIC_SUBSCRIPTION_TOKEN: credential?._tag === "AnthropicSubscriptionToken"
29
+ ? Redacted.value(credential.token)
30
+ : undefined,
31
+ OPENAI_API_KEY: Option.getOrUndefined(Option.map(openai, (provider) => Redacted.value(provider.key))),
32
+ };
33
+ };
34
+ /** Returns the upstream variables that changed, for providers with a credential before and after. */
35
+ const changedUpstreams = (before, after) => {
36
+ const differs = (was, is) => Option.getOrElse(Option.zipWith(was, is, (left, right) => left.upstream !== right.upstream), () => false);
37
+ return [
38
+ ...(differs(before.anthropic, after.anthropic) ? ["USINE_GATEWAY_ANTHROPIC_UPSTREAM"] : []),
39
+ ...(differs(before.openai, after.openai) ? ["USINE_GATEWAY_OPENAI_UPSTREAM"] : []),
40
+ ];
41
+ };
42
+ /** Returns the names of the variables whose values differ, never the values. */
43
+ const changedVariables = (before, after) => Object.keys(before).filter((name) => before[name] !== after[name]);
44
+ /** Logs a warning for restart-only settings that changed or no longer parse. */
45
+ const checkRestartSettings = (started) => restartSettings.pipe(Effect.flatMap((now) => {
46
+ const changed = changedVariables(restartValues(started), restartValues(now));
47
+ return changed.length === 0
48
+ ? Effect.void
49
+ : Effect.logWarning("Settings changed that take effect only after a restart", {
50
+ settings: changed,
51
+ });
52
+ }), Effect.catchTag("ConfigError", (error) => Effect.logWarning("A restart would fail: a setting only a restart reads is invalid", {
53
+ error: error.message,
54
+ })));
55
+ /** Returns the allowlist path and its new contents, or `None` if it can't be read or parsed. */
56
+ const nextAllowlist = (previous) => Effect.gen(function* () {
57
+ // The path has a default, so reading it fails only if the settings source fails, which an in-memory source doesn't.
58
+ const path = yield* Effect.orDie(egressAllowlistPath);
59
+ const kept = (fields) => Effect.logError("Kept the previous egress allowlist", {
60
+ path,
61
+ ...fields,
62
+ rules: previous.rules.length,
63
+ }).pipe(Effect.as({ path, egress: Option.none() }));
64
+ return yield* readEgressAllowlist(path).pipe(Effect.map((egress) => ({ path, egress: Option.some(egress) })), Effect.catchTags({
65
+ EgressAllowlistError: ({ line, message }) => kept({ line, error: message }),
66
+ PlatformError: (error) => kept({ error: error.message }),
67
+ }));
68
+ });
69
+ const keptProviders = (error) => Effect.logError("Kept the previous LLM providers", { error }).pipe(Effect.as(Option.none()));
70
+ /** The new LLM providers, or `None` if they're invalid. */
71
+ const nextProviders = llmProviders.pipe(Effect.map(Option.some), Effect.catchTags({
72
+ ConfigError: ({ message }) => keptProviders(message),
73
+ ConflictingAnthropicCredentials: ({ message }) => keptProviders(message),
74
+ }));
75
+ /** Returns the reload for a Gateway started with `started`, reading settings from the environment files over `base`. */
76
+ export const gatewayReloadLayer = (started, base) => Layer.effect(GatewayReload, Effect.gen(function* () {
77
+ const inForce = yield* SettingsInForce;
78
+ const fileSystem = yield* FileSystem.FileSystem;
79
+ const oneAtATime = yield* Semaphore.make(1);
80
+ const { domain, adminToken, callerKey } = started.settings;
81
+ const startedRestartSettings = {
82
+ domain,
83
+ adminToken,
84
+ callerKey,
85
+ listeners: started.listeners,
86
+ };
87
+ const reloadFrom = (source) => Effect.gen(function* () {
88
+ yield* checkRestartSettings(startedRestartSettings);
89
+ const previous = yield* inForce.current;
90
+ const allowlist = yield* nextAllowlist(previous.egress);
91
+ const providers = yield* nextProviders;
92
+ const next = {
93
+ egress: Option.getOrElse(allowlist.egress, () => previous.egress),
94
+ providers: Option.getOrElse(providers, () => previous.providers),
95
+ };
96
+ yield* inForce.replace(next);
97
+ yield* Effect.logInfo("Reloaded the gateway settings", {
98
+ environmentFiles: source.files,
99
+ allowlist: Option.isSome(allowlist.egress) ? "reloaded" : "kept",
100
+ path: allowlist.path,
101
+ rules: next.egress.rules.length,
102
+ providers: Option.isSome(providers) ? "reloaded" : "kept",
103
+ changed: [
104
+ ...changedVariables(credentialValues(previous.providers), credentialValues(next.providers)),
105
+ ...changedUpstreams(previous.providers, next.providers),
106
+ ],
107
+ });
108
+ }).pipe(Effect.provideService(ConfigProvider.ConfigProvider, source.provider));
109
+ const reload = Effect.fn("GatewayNode.reload")(function* () {
110
+ yield* readSettingsSource(base).pipe(Effect.flatMap(reloadFrom), Effect.catchTags({
111
+ EnvironmentFileError: ({ path, message }) => Effect.logError("Kept the gateway settings: an environment file could not be read", {
112
+ path,
113
+ error: message,
114
+ }),
115
+ ConfigError: ({ message }) => Effect.logError("Kept the gateway settings: the environment could not be read", {
116
+ error: message,
117
+ }),
118
+ }));
119
+ });
120
+ return {
121
+ reload: oneAtATime
122
+ .withPermits(1)(reload())
123
+ .pipe(Effect.provideService(FileSystem.FileSystem, fileSystem)),
124
+ };
125
+ }));
126
+ /**
127
+ * Runs the reload on each SIGHUP while the layer is in scope, one at a time; signals during a
128
+ * reload trigger one more. The listener also prevents Node's default exit on SIGHUP.
129
+ */
130
+ export const reloadOnHangup = Layer.effectDiscard(Effect.gen(function* () {
131
+ const { reload } = yield* GatewayReload;
132
+ const hangups = yield* Queue.sliding(1);
133
+ const onHangup = () => {
134
+ Queue.offerUnsafe(hangups, undefined);
135
+ };
136
+ yield* Effect.acquireRelease(Effect.sync(() => process.on("SIGHUP", onHangup)), () => Effect.sync(() => process.off("SIGHUP", onHangup)));
137
+ const reloadOnce = Effect.logInfo("Reloading the gateway settings on SIGHUP").pipe(Effect.andThen(reload),
138
+ // Logs a defect in one reload; the next SIGHUP reloads again.
139
+ Effect.catchCause((cause) => Effect.logError("A reload failed", { cause: Cause.pretty(cause) })));
140
+ yield* Queue.take(hangups).pipe(Effect.andThen(reloadOnce), Effect.forever, Effect.forkScoped);
141
+ }));
142
+ //# sourceMappingURL=reload.js.map