@velum-labs/routekit-daemon 1.3.2 → 1.5.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 (172) hide show
  1. package/dist/account-enroll-service.d.ts +1 -3
  2. package/dist/account-enroll-service.js +262 -262
  3. package/dist/account-mutation-service.d.ts +1 -3
  4. package/dist/account-mutation-service.js +302 -283
  5. package/dist/account-query-service.d.ts +1 -3
  6. package/dist/account-query-service.js +88 -86
  7. package/dist/call-attribution-store.js +544 -1
  8. package/dist/control-dispatch.js +9 -15
  9. package/dist/daemon-bootstrap-preflight.js +1 -1
  10. package/dist/daemon-control-handlers.d.ts +1 -1
  11. package/dist/daemon-control-handlers.js +24 -27
  12. package/dist/daemon-generations.d.ts +14 -28
  13. package/dist/daemon-generations.js +114 -53
  14. package/dist/daemon-lifecycle-service.d.ts +1 -3
  15. package/dist/daemon-lifecycle-service.js +88 -94
  16. package/dist/daemon-maintenance.d.ts +27 -49
  17. package/dist/daemon-maintenance.js +5 -1
  18. package/dist/daemon-options.d.ts +3 -2
  19. package/dist/daemon-policy-context.d.ts +1 -0
  20. package/dist/daemon-policy-context.js +1 -0
  21. package/dist/daemon-runtime-state.d.ts +1 -1
  22. package/dist/daemon-runtime-state.js +2 -3
  23. package/dist/daemon-state-context.d.ts +1 -1
  24. package/dist/daemon-state-context.js +1 -38
  25. package/dist/doctor-service.d.ts +1 -3
  26. package/dist/doctor-service.js +87 -91
  27. package/dist/effect/daemon-live.d.ts +7 -6
  28. package/dist/effect/daemon-live.js +57 -135
  29. package/dist/eval-routing-service.d.ts +1 -3
  30. package/dist/eval-routing-service.js +45 -69
  31. package/dist/eval-session-execution-store.d.ts +24 -0
  32. package/dist/eval-session-execution-store.js +253 -0
  33. package/dist/host-protocol.d.ts +1 -0
  34. package/dist/host.js +3 -0
  35. package/dist/internal-providers/provider-anthropic/index.d.ts +23 -0
  36. package/dist/internal-providers/provider-anthropic/index.js +42 -0
  37. package/dist/internal-providers/provider-anthropic/test/provider.test.js +33 -0
  38. package/dist/internal-providers/provider-azure/index.d.ts +25 -0
  39. package/dist/internal-providers/provider-azure/index.js +101 -0
  40. package/dist/internal-providers/provider-azure/test/provider.test.js +83 -0
  41. package/dist/internal-providers/provider-bedrock/codec.d.ts +11 -0
  42. package/dist/internal-providers/provider-bedrock/codec.js +484 -0
  43. package/dist/internal-providers/provider-bedrock/connection-settings.d.ts +6 -0
  44. package/dist/internal-providers/provider-bedrock/connection-settings.js +41 -0
  45. package/dist/internal-providers/provider-bedrock/connection.d.ts +17 -0
  46. package/dist/internal-providers/provider-bedrock/connection.js +143 -0
  47. package/dist/internal-providers/provider-bedrock/index.d.ts +27 -0
  48. package/dist/internal-providers/provider-bedrock/index.js +47 -0
  49. package/dist/internal-providers/provider-bedrock/source.d.ts +39 -0
  50. package/dist/internal-providers/provider-bedrock/source.js +454 -0
  51. package/dist/internal-providers/provider-bedrock/test/bedrock-source.test.d.ts +1 -0
  52. package/dist/internal-providers/provider-bedrock/test/bedrock-source.test.js +786 -0
  53. package/dist/internal-providers/provider-bedrock/test/connection.test.d.ts +1 -0
  54. package/dist/internal-providers/provider-bedrock/test/connection.test.js +249 -0
  55. package/dist/internal-providers/provider-bedrock/test/workload-credentials.test.d.ts +1 -0
  56. package/dist/internal-providers/provider-bedrock/test/workload-credentials.test.js +29 -0
  57. package/dist/internal-providers/provider-bedrock/workload-credentials.d.ts +5 -0
  58. package/dist/internal-providers/provider-bedrock/workload-credentials.js +14 -0
  59. package/dist/internal-providers/provider-claude-code/index.d.ts +6 -0
  60. package/dist/internal-providers/provider-claude-code/index.js +4 -0
  61. package/dist/internal-providers/provider-claude-code/module-api.d.ts +25 -0
  62. package/dist/internal-providers/provider-claude-code/module-api.js +31 -0
  63. package/dist/internal-providers/provider-claude-code/relay.d.ts +20 -0
  64. package/dist/internal-providers/provider-claude-code/relay.js +115 -0
  65. package/dist/internal-providers/provider-claude-code/subscription.d.ts +2 -0
  66. package/dist/internal-providers/provider-claude-code/subscription.js +194 -0
  67. package/dist/internal-providers/provider-claude-code/test/http-submission.test.d.ts +1 -0
  68. package/dist/internal-providers/provider-claude-code/test/http-submission.test.js +140 -0
  69. package/dist/internal-providers/provider-claude-code/test/relay.test.d.ts +1 -0
  70. package/dist/internal-providers/provider-claude-code/test/relay.test.js +379 -0
  71. package/dist/internal-providers/provider-claude-code/test/subscription.test.d.ts +1 -0
  72. package/dist/internal-providers/provider-claude-code/test/subscription.test.js +256 -0
  73. package/dist/internal-providers/provider-cliproxy/index.d.ts +9 -0
  74. package/dist/internal-providers/provider-cliproxy/index.js +15 -0
  75. package/dist/internal-providers/provider-codex/index.d.ts +6 -0
  76. package/dist/internal-providers/provider-codex/index.js +7 -0
  77. package/dist/internal-providers/provider-codex/module-api.d.ts +25 -0
  78. package/dist/internal-providers/provider-codex/module-api.js +31 -0
  79. package/dist/internal-providers/provider-codex/relay.d.ts +123 -0
  80. package/dist/internal-providers/provider-codex/relay.js +261 -0
  81. package/dist/internal-providers/provider-codex/subscription.d.ts +2 -0
  82. package/dist/internal-providers/provider-codex/subscription.js +555 -0
  83. package/dist/internal-providers/provider-codex/test/http-submission.test.d.ts +1 -0
  84. package/dist/internal-providers/provider-codex/test/http-submission.test.js +142 -0
  85. package/dist/internal-providers/provider-codex/test/relay.test.d.ts +1 -0
  86. package/dist/internal-providers/provider-codex/test/relay.test.js +600 -0
  87. package/dist/internal-providers/provider-codex/test/subscription.test.d.ts +1 -0
  88. package/dist/internal-providers/provider-codex/test/subscription.test.js +70 -0
  89. package/dist/internal-providers/provider-codex/test/translated-content.test.d.ts +1 -0
  90. package/dist/internal-providers/provider-codex/test/translated-content.test.js +91 -0
  91. package/dist/internal-providers/provider-custom/index.d.ts +9 -0
  92. package/dist/internal-providers/provider-custom/index.js +15 -0
  93. package/dist/internal-providers/provider-google/index.d.ts +23 -0
  94. package/dist/internal-providers/provider-google/index.js +43 -0
  95. package/dist/internal-providers/provider-google/test/provider.test.d.ts +1 -0
  96. package/dist/internal-providers/provider-google/test/provider.test.js +34 -0
  97. package/dist/internal-providers/provider-google-vertex/index.d.ts +28 -0
  98. package/dist/internal-providers/provider-google-vertex/index.js +137 -0
  99. package/dist/internal-providers/provider-google-vertex/test/provider.test.d.ts +1 -0
  100. package/dist/internal-providers/provider-google-vertex/test/provider.test.js +85 -0
  101. package/dist/internal-providers/provider-openai/documented-reasoning.d.ts +9 -0
  102. package/dist/internal-providers/provider-openai/documented-reasoning.js +26 -0
  103. package/dist/internal-providers/provider-openai/index.d.ts +23 -0
  104. package/dist/internal-providers/provider-openai/index.js +74 -0
  105. package/dist/internal-providers/provider-openai/test/provider.test.d.ts +1 -0
  106. package/dist/internal-providers/provider-openai/test/provider.test.js +268 -0
  107. package/dist/internal-providers/provider-openai-compatible/index.d.ts +9 -0
  108. package/dist/internal-providers/provider-openai-compatible/index.js +15 -0
  109. package/dist/internal-providers/provider-openai-compatible/test/provider.test.d.ts +1 -0
  110. package/dist/internal-providers/provider-openai-compatible/test/provider.test.js +40 -0
  111. package/dist/internal-providers/provider-openrouter/connection.d.ts +5 -0
  112. package/dist/internal-providers/provider-openrouter/connection.js +143 -0
  113. package/dist/internal-providers/provider-openrouter/index.d.ts +28 -0
  114. package/dist/internal-providers/provider-openrouter/index.js +42 -0
  115. package/dist/internal-providers/provider-openrouter/pricing.d.ts +4 -0
  116. package/dist/internal-providers/provider-openrouter/pricing.js +108 -0
  117. package/dist/internal-providers/provider-openrouter/test/connection.test.d.ts +1 -0
  118. package/dist/internal-providers/provider-openrouter/test/connection.test.js +71 -0
  119. package/dist/internal-providers/provider-openrouter/test/pricing.test.d.ts +1 -0
  120. package/dist/internal-providers/provider-openrouter/test/pricing.test.js +45 -0
  121. package/dist/internal-providers/provider-openrouter/test/provider.test.d.ts +1 -0
  122. package/dist/internal-providers/provider-openrouter/test/provider.test.js +141 -0
  123. package/dist/internal-providers/provider-openrouter/test/validation.test.d.ts +1 -0
  124. package/dist/internal-providers/provider-openrouter/test/validation.test.js +225 -0
  125. package/dist/launcher-service.d.ts +3 -7
  126. package/dist/launcher-service.js +144 -133
  127. package/dist/provider-modules.d.ts +6 -0
  128. package/dist/provider-modules.js +55 -0
  129. package/dist/provider-query-service.d.ts +1 -3
  130. package/dist/provider-query-service.js +140 -143
  131. package/dist/router-generation-service.d.ts +1 -3
  132. package/dist/router-generation-service.js +83 -78
  133. package/dist/services/eval-session/service.d.ts +20 -8
  134. package/dist/services/eval-session/service.js +410 -40
  135. package/dist/services/gateway-generation/service.d.ts +7 -3
  136. package/dist/services/gateway-generation/service.js +126 -63
  137. package/dist/services/generations/service.d.ts +3 -3
  138. package/dist/services/generations/service.js +5 -1
  139. package/dist/telemetry-application-service.d.ts +1 -3
  140. package/dist/telemetry-application-service.js +41 -45
  141. package/dist/test/call-attribution-store.test.js +186 -0
  142. package/dist/test/daemon-accounts.test.js +2 -2
  143. package/dist/test/daemon-data-plane.test.js +24 -45
  144. package/dist/test/daemon-fixtures.js +1 -1
  145. package/dist/test/daemon-generation-transaction.test.js +66 -2
  146. package/dist/test/daemon-runtime-state.test.js +28 -1
  147. package/dist/test/effect-daemon.test.js +38 -0
  148. package/dist/test/eval-routing-application-service.test.js +6 -6
  149. package/dist/test/eval-session-execution.test.d.ts +1 -0
  150. package/dist/test/eval-session-execution.test.js +356 -0
  151. package/dist/test/eval-session-service.test.js +70 -1
  152. package/dist/test/host-worker-session.test.js +1 -0
  153. package/dist/test/launcher-session.test.d.ts +1 -0
  154. package/dist/test/launcher-session.test.js +87 -0
  155. package/dist/test/leaderboard.test.js +25 -1
  156. package/dist/test/provider-modules.test.d.ts +1 -0
  157. package/dist/test/provider-modules.test.js +65 -0
  158. package/dist/test/routekit-upstream-sources.test.d.ts +1 -0
  159. package/dist/test/routekit-upstream-sources.test.js +40 -0
  160. package/dist/test/runtime-composition-types.test.js +11 -0
  161. package/dist/token-application-service.d.ts +1 -3
  162. package/dist/token-application-service.js +38 -44
  163. package/dist/worker.js +5 -3
  164. package/package.json +35 -11
  165. package/dist/application-services.d.ts +0 -10
  166. package/dist/application-services.js +0 -22
  167. package/dist/daemon-lifecycle.d.ts +0 -54
  168. package/dist/daemon-lifecycle.js +0 -177
  169. package/dist/test/application-services.test.js +0 -135
  170. package/dist/test/daemon-lifecycle.test.js +0 -182
  171. /package/dist/{test/application-services.test.d.ts → internal-providers/provider-anthropic/test/provider.test.d.ts} +0 -0
  172. /package/dist/{test/daemon-lifecycle.test.d.ts → internal-providers/provider-azure/test/provider.test.d.ts} +0 -0
@@ -0,0 +1,142 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtemp, rm, writeFile } from "node:fs/promises";
3
+ import { createServer } from "node:http";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { test } from "node:test";
7
+ import { SubscriptionAccountSet } from "@velum-labs/routekit-accounts";
8
+ import { HttpSubmissionAuthority, HttpSubmissionError, runRouteKitEffect, toRouteKitFailure } from "@velum-labs/routekit-runtime/effect";
9
+ import { Effect } from "effect";
10
+ import { CodexBackendRelay } from "../relay.js";
11
+ import { codexProvider } from "../subscription.js";
12
+ const MODEL = "gpt-5.3-codex";
13
+ const TOKEN = "offline-native-codex-token";
14
+ for (const disconnect of [false, true]) {
15
+ test(`native managed Codex relay observes ${disconnect ? "unknown without retry" : "raw completion"} at its credential-owning POST`, async (t) => {
16
+ const directory = await mkdtemp(join(tmpdir(), "routekit-native-codex-submission-"));
17
+ const intents = [];
18
+ const outcomes = [];
19
+ const posts = [];
20
+ const errors = [];
21
+ let accounts;
22
+ const wire = [
23
+ 'event: response.output_text.delta\ndata: {"type":"response.output_text.delta","delta":"offline codex"}\n\n',
24
+ 'event: response.completed\ndata: {"type":"response.completed","response":{"id":"offline-codex","status":"completed","output":[]}}\n\n'
25
+ ].join("");
26
+ const server = createServer((request, response) => {
27
+ void (async () => {
28
+ const chunks = [];
29
+ for await (const chunk of request)
30
+ chunks.push(Buffer.from(chunk));
31
+ posts.push({
32
+ body: JSON.parse(Buffer.concat(chunks).toString("utf8")),
33
+ complete: request.complete,
34
+ authorization: request.headers.authorization,
35
+ accountId: request.headers["chatgpt-account-id"],
36
+ intentsBeforePost: intents.length
37
+ });
38
+ assert.equal(request.url, "/responses");
39
+ if (disconnect) {
40
+ response.destroy();
41
+ return;
42
+ }
43
+ response.writeHead(200, { "content-type": "text/event-stream" });
44
+ response.end(wire);
45
+ })().catch((cause) => {
46
+ errors.push(cause);
47
+ response.destroy();
48
+ });
49
+ });
50
+ t.after(async () => {
51
+ try {
52
+ if (accounts !== undefined)
53
+ await runRouteKitEffect(accounts.close());
54
+ }
55
+ finally {
56
+ try {
57
+ await new Promise((resolve, reject) => {
58
+ server.close((error) => (error === undefined ? resolve() : reject(error)));
59
+ server.closeAllConnections();
60
+ });
61
+ }
62
+ finally {
63
+ await rm(directory, { recursive: true, force: true });
64
+ }
65
+ }
66
+ assert.deepEqual(errors, []);
67
+ });
68
+ await new Promise((resolve, reject) => {
69
+ server.once("error", reject);
70
+ server.listen(0, "127.0.0.1", resolve);
71
+ });
72
+ const address = server.address();
73
+ assert.ok(address !== null && typeof address === "object");
74
+ await writeFile(join(directory, "account.json"), JSON.stringify({
75
+ tokens: { access_token: TOKEN, account_id: "offline-managed-codex-account" }
76
+ }), { mode: 0o600 });
77
+ accounts = await runRouteKitEffect(SubscriptionAccountSet.open(codexProvider(), {
78
+ source: { kind: "directory", path: directory },
79
+ publishedModels: [MODEL],
80
+ probeIntervalMs: 0
81
+ }));
82
+ const relay = new CodexBackendRelay({
83
+ backendUrl: `http://127.0.0.1:${address.port}`,
84
+ catalog: (_template, stock) => [...stock],
85
+ auth: { kind: "accounts", accounts }
86
+ });
87
+ assert.equal(relay.httpSubmission, undefined, "an overridden endpoint is not publicly certified");
88
+ assert.equal(new CodexBackendRelay({
89
+ catalog: (_template, stock) => [...stock],
90
+ auth: { kind: "accounts", accounts }
91
+ }).httpSubmission, "credential-owner-http-v1");
92
+ assert.equal(new CodexBackendRelay({ catalog: (_template, stock) => [...stock] }).httpSubmission, undefined, "the client-credential trust model must not inherit a managed-account declaration");
93
+ const authority = {
94
+ begin: (request) => Effect.sync(() => {
95
+ intents.push(request);
96
+ return { attemptId: `offline-native-${intents.length}` };
97
+ }),
98
+ settle: (_attemptId, outcome) => Effect.sync(() => {
99
+ outcomes.push(outcome);
100
+ })
101
+ };
102
+ let retries = 0;
103
+ const result = await runRouteKitEffect(relay
104
+ .relayResponses({
105
+ authorization: "Bearer offline-ingress-token",
106
+ "chatgpt-account-id": "offline-ingress-account"
107
+ }, { model: MODEL, input: "hello", stream: false }, undefined, {
108
+ responseMode: "buffered",
109
+ onAttribution: (update) => {
110
+ if (update.accountAttemptResult !== undefined)
111
+ retries += 1;
112
+ }
113
+ })
114
+ .pipe(Effect.flatMap((response) => Effect.tryPromise({
115
+ try: () => response.text(),
116
+ catch: (cause) => cause instanceof HttpSubmissionError ? cause : toRouteKitFailure(cause)
117
+ })), Effect.catch((cause) => Effect.succeed(cause)), Effect.scoped, Effect.provideService(HttpSubmissionAuthority, authority)));
118
+ assert.equal(posts.length, 1);
119
+ assert.equal(posts[0]?.complete, true);
120
+ assert.equal(posts[0]?.intentsBeforePost, 1);
121
+ assert.equal(posts[0]?.authorization, `Bearer ${TOKEN}`);
122
+ assert.equal(posts[0]?.accountId, "offline-managed-codex-account");
123
+ assert.equal(posts[0]?.body.model, MODEL);
124
+ assert.equal(posts[0]?.body.stream, true);
125
+ assert.ok(Array.isArray(posts[0]?.body.input));
126
+ assert.equal(intents[0]?.model, MODEL);
127
+ assert.match(intents[0]?.accountIdentity ?? "", /^[a-f0-9]{64}$/u);
128
+ assert.equal(retries, 0);
129
+ assert.ok(accounts.snapshot().members.every((member) => member.inFlight === 0));
130
+ assert.equal(JSON.stringify(intents).includes(TOKEN), false);
131
+ if (disconnect) {
132
+ assert.ok(result instanceof HttpSubmissionError);
133
+ assert.equal(result.code, "unknown-submission");
134
+ assert.deepEqual(outcomes, [{ state: "unknown", reason: "transport-error" }]);
135
+ }
136
+ else {
137
+ assert.equal(result, wire, "the native relay must preserve exact upstream bytes");
138
+ assert.equal(outcomes[0]?.state, "completed");
139
+ assert.equal(outcomes[0]?.state === "completed" ? outcomes[0].terminal : undefined, "responses-terminal");
140
+ }
141
+ });
142
+ }