@to11ai/sdk 0.0.2 → 0.1.1

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.
@@ -0,0 +1,131 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ function __accessProp(key) {
6
+ return this[key];
7
+ }
8
+ var __toCommonJS = (from) => {
9
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
10
+ if (entry)
11
+ return entry;
12
+ entry = __defProp({}, "__esModule", { value: true });
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (var key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(entry, key))
16
+ __defProp(entry, key, {
17
+ get: __accessProp.bind(from, key),
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
21
+ __moduleCache.set(from, entry);
22
+ return entry;
23
+ };
24
+ var __moduleCache;
25
+ var __returnValue = (v) => v;
26
+ function __exportSetter(name, newValue) {
27
+ this[name] = __returnValue.bind(null, newValue);
28
+ }
29
+ var __export = (target, all) => {
30
+ for (var name in all)
31
+ __defProp(target, name, {
32
+ get: all[name],
33
+ enumerable: true,
34
+ configurable: true,
35
+ set: __exportSetter.bind(all, name)
36
+ });
37
+ };
38
+
39
+ // src/routingRules/resource.ts
40
+ var exports_resource = {};
41
+ __export(exports_resource, {
42
+ RoutingRulesResource: () => RoutingRulesResource,
43
+ RoutingRuleVersionResource: () => RoutingRuleVersionResource,
44
+ RoutingRuleReleaseResource: () => RoutingRuleReleaseResource
45
+ });
46
+ module.exports = __toCommonJS(exports_resource);
47
+ function unwrap(envelope) {
48
+ if (envelope.data === null || envelope.data === undefined) {
49
+ throw new Error("API returned success but data is null");
50
+ }
51
+ return envelope.data;
52
+ }
53
+ function rulePath(projectId, ruleId) {
54
+ return `/v1/projects/${encodeURIComponent(projectId)}/routing/rules/${encodeURIComponent(ruleId)}`;
55
+ }
56
+ function versionsPath(projectId, ruleId) {
57
+ return `${rulePath(projectId, ruleId)}/versions`;
58
+ }
59
+ function versionPath(projectId, ruleId, versionId) {
60
+ return `${versionsPath(projectId, ruleId)}/${encodeURIComponent(versionId)}`;
61
+ }
62
+ function releasesPath(projectId, ruleId) {
63
+ return `${rulePath(projectId, ruleId)}/releases`;
64
+ }
65
+ function releasePath(projectId, ruleId, envSlug) {
66
+ return `${releasesPath(projectId, ruleId)}/${encodeURIComponent(envSlug)}`;
67
+ }
68
+ function releaseRollbackPath(projectId, ruleId, envSlug) {
69
+ return `${releasePath(projectId, ruleId, envSlug)}/rollback`;
70
+ }
71
+
72
+ class RoutingRuleVersionResource {
73
+ transport;
74
+ constructor(transport) {
75
+ this.transport = transport;
76
+ }
77
+ async create(input) {
78
+ const { projectId, ruleId, ...body } = input;
79
+ const envelope = await this.transport.request("POST", versionsPath(projectId, ruleId), { body });
80
+ return unwrap(envelope);
81
+ }
82
+ async list(input) {
83
+ const query = {};
84
+ if (input.cursor !== undefined)
85
+ query.cursor = input.cursor;
86
+ if (input.limit !== undefined)
87
+ query.limit = input.limit;
88
+ const envelope = await this.transport.request("GET", versionsPath(input.projectId, input.ruleId), { query });
89
+ return unwrap(envelope);
90
+ }
91
+ async get(input) {
92
+ const envelope = await this.transport.request("GET", versionPath(input.projectId, input.ruleId, input.versionId));
93
+ return unwrap(envelope);
94
+ }
95
+ }
96
+
97
+ class RoutingRuleReleaseResource {
98
+ transport;
99
+ constructor(transport) {
100
+ this.transport = transport;
101
+ }
102
+ async set(input) {
103
+ const { projectId, ruleId, envSlug, ...body } = input;
104
+ const envelope = await this.transport.request("PUT", releasePath(projectId, ruleId, envSlug), { body });
105
+ return unwrap(envelope);
106
+ }
107
+ async rollback(input) {
108
+ const { projectId, ruleId, envSlug, ...body } = input;
109
+ const envelope = await this.transport.request("POST", releaseRollbackPath(projectId, ruleId, envSlug), { body });
110
+ return unwrap(envelope);
111
+ }
112
+ async list(input) {
113
+ const query = {};
114
+ if (input.cursor !== undefined)
115
+ query.cursor = input.cursor;
116
+ if (input.limit !== undefined)
117
+ query.limit = input.limit;
118
+ const path = input.envSlug !== undefined ? releasePath(input.projectId, input.ruleId, input.envSlug) : releasesPath(input.projectId, input.ruleId);
119
+ const envelope = await this.transport.request("GET", path, { query });
120
+ return unwrap(envelope);
121
+ }
122
+ }
123
+
124
+ class RoutingRulesResource {
125
+ versions;
126
+ releases;
127
+ constructor(transport) {
128
+ this.versions = new RoutingRuleVersionResource(transport);
129
+ this.releases = new RoutingRuleReleaseResource(transport);
130
+ }
131
+ }
@@ -0,0 +1,22 @@
1
+ import type { Transport } from "../transport";
2
+ import type { CreateRuleVersionInput, CreateRuleVersionResult, GetRuleVersionInput, GetRuleVersionResult, ListRuleReleasesInput, ListRuleReleasesResult, ListRuleVersionsInput, ListRuleVersionsResult, RollbackRuleReleaseInput, RollbackRuleReleaseResult, SetRuleReleaseInput, SetRuleReleaseResult } from "./types";
3
+ export type { CreateRuleVersionInput, CreateRuleVersionResult, GetRuleVersionInput, GetRuleVersionResult, ListRuleReleasesInput, ListRuleReleasesResult, ListRuleVersionsInput, ListRuleVersionsResult, RollbackRuleReleaseInput, RollbackRuleReleaseResult, RuleModelBinding, RuleProviderRef, RuleRelease, RuleReleaseActorType, RuleReleaseApprovalStatus, RuleReleaseChangeKind, RuleReleaseStrategy, RuleReleaseWeight, RuleSnapshot, RuleStrategy, RuleVersion, SetRuleReleaseInput, SetRuleReleaseResult, } from "./types";
4
+ export declare class RoutingRuleVersionResource {
5
+ private readonly transport;
6
+ constructor(transport: Transport);
7
+ create(input: CreateRuleVersionInput): Promise<CreateRuleVersionResult>;
8
+ list(input: ListRuleVersionsInput): Promise<ListRuleVersionsResult>;
9
+ get(input: GetRuleVersionInput): Promise<GetRuleVersionResult>;
10
+ }
11
+ export declare class RoutingRuleReleaseResource {
12
+ private readonly transport;
13
+ constructor(transport: Transport);
14
+ set(input: SetRuleReleaseInput): Promise<SetRuleReleaseResult>;
15
+ rollback(input: RollbackRuleReleaseInput): Promise<RollbackRuleReleaseResult>;
16
+ list(input: ListRuleReleasesInput): Promise<ListRuleReleasesResult>;
17
+ }
18
+ export declare class RoutingRulesResource {
19
+ readonly versions: RoutingRuleVersionResource;
20
+ readonly releases: RoutingRuleReleaseResource;
21
+ constructor(transport: Transport);
22
+ }
@@ -0,0 +1,91 @@
1
+ // src/routingRules/resource.ts
2
+ function unwrap(envelope) {
3
+ if (envelope.data === null || envelope.data === undefined) {
4
+ throw new Error("API returned success but data is null");
5
+ }
6
+ return envelope.data;
7
+ }
8
+ function rulePath(projectId, ruleId) {
9
+ return `/v1/projects/${encodeURIComponent(projectId)}/routing/rules/${encodeURIComponent(ruleId)}`;
10
+ }
11
+ function versionsPath(projectId, ruleId) {
12
+ return `${rulePath(projectId, ruleId)}/versions`;
13
+ }
14
+ function versionPath(projectId, ruleId, versionId) {
15
+ return `${versionsPath(projectId, ruleId)}/${encodeURIComponent(versionId)}`;
16
+ }
17
+ function releasesPath(projectId, ruleId) {
18
+ return `${rulePath(projectId, ruleId)}/releases`;
19
+ }
20
+ function releasePath(projectId, ruleId, envSlug) {
21
+ return `${releasesPath(projectId, ruleId)}/${encodeURIComponent(envSlug)}`;
22
+ }
23
+ function releaseRollbackPath(projectId, ruleId, envSlug) {
24
+ return `${releasePath(projectId, ruleId, envSlug)}/rollback`;
25
+ }
26
+
27
+ class RoutingRuleVersionResource {
28
+ transport;
29
+ constructor(transport) {
30
+ this.transport = transport;
31
+ }
32
+ async create(input) {
33
+ const { projectId, ruleId, ...body } = input;
34
+ const envelope = await this.transport.request("POST", versionsPath(projectId, ruleId), { body });
35
+ return unwrap(envelope);
36
+ }
37
+ async list(input) {
38
+ const query = {};
39
+ if (input.cursor !== undefined)
40
+ query.cursor = input.cursor;
41
+ if (input.limit !== undefined)
42
+ query.limit = input.limit;
43
+ const envelope = await this.transport.request("GET", versionsPath(input.projectId, input.ruleId), { query });
44
+ return unwrap(envelope);
45
+ }
46
+ async get(input) {
47
+ const envelope = await this.transport.request("GET", versionPath(input.projectId, input.ruleId, input.versionId));
48
+ return unwrap(envelope);
49
+ }
50
+ }
51
+
52
+ class RoutingRuleReleaseResource {
53
+ transport;
54
+ constructor(transport) {
55
+ this.transport = transport;
56
+ }
57
+ async set(input) {
58
+ const { projectId, ruleId, envSlug, ...body } = input;
59
+ const envelope = await this.transport.request("PUT", releasePath(projectId, ruleId, envSlug), { body });
60
+ return unwrap(envelope);
61
+ }
62
+ async rollback(input) {
63
+ const { projectId, ruleId, envSlug, ...body } = input;
64
+ const envelope = await this.transport.request("POST", releaseRollbackPath(projectId, ruleId, envSlug), { body });
65
+ return unwrap(envelope);
66
+ }
67
+ async list(input) {
68
+ const query = {};
69
+ if (input.cursor !== undefined)
70
+ query.cursor = input.cursor;
71
+ if (input.limit !== undefined)
72
+ query.limit = input.limit;
73
+ const path = input.envSlug !== undefined ? releasePath(input.projectId, input.ruleId, input.envSlug) : releasesPath(input.projectId, input.ruleId);
74
+ const envelope = await this.transport.request("GET", path, { query });
75
+ return unwrap(envelope);
76
+ }
77
+ }
78
+
79
+ class RoutingRulesResource {
80
+ versions;
81
+ releases;
82
+ constructor(transport) {
83
+ this.versions = new RoutingRuleVersionResource(transport);
84
+ this.releases = new RoutingRuleReleaseResource(transport);
85
+ }
86
+ }
87
+ export {
88
+ RoutingRulesResource,
89
+ RoutingRuleVersionResource,
90
+ RoutingRuleReleaseResource
91
+ };
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Reference to a provider config bound to a specific environment. Mirrors
3
+ * `RuleProviderRef` in the API domain model. `envSlug` is optional — when
4
+ * omitted, the gateway falls back to the project's `is_gateway_fallback`
5
+ * environment.
6
+ */
7
+ export interface RuleProviderRef {
8
+ providerId: string;
9
+ envSlug?: string;
10
+ }
11
+ /**
12
+ * Per-variant model binding inside a rule snapshot. Identifies which
13
+ * `(provider, model)` pair serves a strategy variant; the gateway resolves
14
+ * the actual credential at request time. `weight` is intentionally
15
+ * permissive (0..100 in v1) so weighted/experimental strategies can evolve
16
+ * without a SDK churn.
17
+ */
18
+ export interface RuleModelBinding {
19
+ modelId: string;
20
+ provider: RuleProviderRef;
21
+ weight?: number;
22
+ }
23
+ export type RuleStrategy = "single" | "weighted" | "fallback" | "experiment";
24
+ /**
25
+ * Frozen rule snapshot — the JSONB payload stored in
26
+ * `rule_versions.snapshot_json`. Mirrors the API domain `RuleSnapshot`:
27
+ *
28
+ * * `alias` — optional `function::<alias>` indirection (S1).
29
+ * * `strategy` — `single`, `weighted`, `fallback`, `experiment`.
30
+ * * `endpoint` — `chat`, `embeddings`, …
31
+ * * `variants[]` | `steps[]` | `chain[]` — strategy-shape arrays.
32
+ * * `when` — optional condition AST that gates the rule.
33
+ * * `retry` — optional `{ maxRetries?, backoffBaseMs?, retryableStatusCodes? }`.
34
+ * * `modelBindings[]` — which `(providerId, modelId, envSlug)` serves each variant.
35
+ * * `providerRefs[]` — flat denormalized list of referenced providers.
36
+ *
37
+ * No credential field exists; the gateway resolves credentials lazily from
38
+ * the per-env `routing_snapshots` ciphertext.
39
+ */
40
+ export interface RuleSnapshot {
41
+ alias?: string;
42
+ strategy: RuleStrategy | string;
43
+ endpoint: string;
44
+ variants?: unknown[];
45
+ steps?: unknown[];
46
+ chain?: unknown[];
47
+ when?: unknown;
48
+ retry?: {
49
+ maxRetries?: number;
50
+ backoffBaseMs?: number;
51
+ retryableStatusCodes?: number[];
52
+ };
53
+ modelBindings?: RuleModelBinding[];
54
+ providerRefs?: RuleProviderRef[];
55
+ }
56
+ /**
57
+ * The persisted form of a rule version row as returned by
58
+ * `GET /v1/projects/:projectId/routing/rules/:ruleId/versions/:versionId`.
59
+ *
60
+ * `version` is monotonic per `ruleId` — the server allocates it inside a
61
+ * `SELECT MAX … FOR UPDATE` transaction. `snapshotJson` is typed as
62
+ * `unknown` to mirror the API contract (the storage path persists JSONB
63
+ * verbatim); callers that need the typed shape should cast through
64
+ * `RuleSnapshot`.
65
+ */
66
+ export interface RuleVersion {
67
+ id: string;
68
+ ruleId: string;
69
+ version: number;
70
+ snapshotJson: unknown;
71
+ description: string | null;
72
+ createdBy: string;
73
+ /** ISO-8601 timestamp. */
74
+ createdAt: string;
75
+ }
76
+ /**
77
+ * Wire input accepted by
78
+ * `POST /v1/projects/:p/routing/rules/:ruleId/versions`. Requires the
79
+ * `routing:write` capability.
80
+ *
81
+ * `snapshot` is the cleartext snapshot JSON the gateway uses to resolve
82
+ * runtime traffic — stored verbatim in `rule_versions.snapshot_json`.
83
+ * `description` is an optional commit message; the API surfaces it on the
84
+ * audit timeline.
85
+ */
86
+ export interface CreateRuleVersionInput {
87
+ projectId: string;
88
+ ruleId: string;
89
+ snapshot: RuleSnapshot | unknown;
90
+ description?: string;
91
+ }
92
+ export type CreateRuleVersionResult = RuleVersion;
93
+ /**
94
+ * Cursor-paginated list input. `cursor` is the `version` number BELOW which
95
+ * to fetch (keyset pagination — pass the last item's `version` to continue).
96
+ * `limit` is clamped server-side to `MAX_LIST_LIMIT` (200 at the time of
97
+ * writing); default is 50.
98
+ */
99
+ export interface ListRuleVersionsInput {
100
+ projectId: string;
101
+ ruleId: string;
102
+ /**
103
+ * The `version` number BELOW which to fetch (the route uses a keyset
104
+ * `WHERE version < cursor` clause and returns versions in `version DESC`
105
+ * order). Omit for the first page.
106
+ */
107
+ cursor?: number;
108
+ /** Page size. Server clamps to `[1, MAX_LIST_LIMIT]`. */
109
+ limit?: number;
110
+ }
111
+ export type ListRuleVersionsResult = RuleVersion[];
112
+ export interface GetRuleVersionInput {
113
+ projectId: string;
114
+ ruleId: string;
115
+ versionId: string;
116
+ }
117
+ export type GetRuleVersionResult = RuleVersion;
118
+ export type RuleReleaseStrategy = "single" | "weighted";
119
+ export type RuleReleaseChangeKind = "release_initial" | "release_promoted" | "release_rolled_back" | "release_weight_changed";
120
+ export type RuleReleaseApprovalStatus = "committed" | "pending" | "rejected";
121
+ export type RuleReleaseActorType = "user" | "api_key" | "worker";
122
+ export interface RuleReleaseWeight {
123
+ versionId: string;
124
+ weight: number;
125
+ }
126
+ export interface RuleRelease {
127
+ id: string;
128
+ ruleId: string;
129
+ environmentId: string;
130
+ envSlug: string;
131
+ strategy: RuleReleaseStrategy;
132
+ versionId: string | null;
133
+ weights: RuleReleaseWeight[] | null;
134
+ changeKind: RuleReleaseChangeKind;
135
+ priorReleaseId: string | null;
136
+ actorId: string;
137
+ actorType: RuleReleaseActorType;
138
+ reason: string | null;
139
+ approvalStatus: RuleReleaseApprovalStatus;
140
+ activeFrom: string | null;
141
+ activeTo: string | null;
142
+ createdAt: string;
143
+ }
144
+ export interface SetRuleReleaseInput {
145
+ projectId: string;
146
+ ruleId: string;
147
+ envSlug: string;
148
+ strategy: RuleReleaseStrategy;
149
+ versionId?: string;
150
+ weights?: RuleReleaseWeight[];
151
+ reason?: string;
152
+ }
153
+ export type SetRuleReleaseResult = RuleRelease;
154
+ export interface RollbackRuleReleaseInput {
155
+ projectId: string;
156
+ ruleId: string;
157
+ envSlug: string;
158
+ reason: string;
159
+ targetReleaseId?: string;
160
+ }
161
+ export type RollbackRuleReleaseResult = RuleRelease;
162
+ export interface ListRuleReleasesInput {
163
+ projectId: string;
164
+ ruleId: string;
165
+ envSlug?: string;
166
+ cursor?: string;
167
+ limit?: number;
168
+ }
169
+ export type ListRuleReleasesResult = RuleRelease[];
@@ -0,0 +1,61 @@
1
+ /**
2
+ * W3C Trace Context propagation for outbound SDK calls.
3
+ *
4
+ * Reads the host process's active OpenTelemetry span — if any — and formats a
5
+ * W3C `traceparent` (and optional `tracestate`) string for injection as
6
+ * outbound HTTP headers. Lets customers correlate their tracer's spans with
7
+ * the gateway-emitted span we record.
8
+ *
9
+ * Design constraints (from TO11-1016 / S8c spec):
10
+ * 1. NO runtime dependency on `@opentelemetry/api`. The package is detected
11
+ * at runtime via a try/require shim; if it is not loadable, this module
12
+ * is a strict no-op and `activeTraceContext()` returns `null`.
13
+ * 2. NO SDK config surface change. There is no constructor option or env
14
+ * var; behavior is invisible if the host has no OTel installed.
15
+ * 3. Header omitted, not zero-filled — W3C §3.2.2.5 forbids all-zero
16
+ * trace/span ids in `traceparent`. We return `null` (caller omits).
17
+ *
18
+ * @see https://www.w3.org/TR/trace-context/ for the wire format.
19
+ * @see docs/product-specs/2026-05-20-to11-1016-sdk-traceparent-propagation.md
20
+ */
21
+ interface OtelTraceState {
22
+ serialize(): string;
23
+ }
24
+ interface OtelSpanContext {
25
+ traceId: string;
26
+ spanId: string;
27
+ traceFlags: number;
28
+ traceState?: OtelTraceState;
29
+ }
30
+ interface OtelSpan {
31
+ spanContext(): OtelSpanContext;
32
+ }
33
+ interface OtelTrace {
34
+ getActiveSpan(): OtelSpan | undefined;
35
+ }
36
+ interface OtelApi {
37
+ trace: OtelTrace;
38
+ }
39
+ type OtelLoader = () => OtelApi | null;
40
+ /**
41
+ * Return the W3C `traceparent` (and optional `tracestate`) string pair for
42
+ * the currently active OpenTelemetry span in the host process, or `null` if
43
+ * no active span exists or `@opentelemetry/api` is not installed.
44
+ *
45
+ * Idempotent and side-effect-free past the one-time module probe. Callers
46
+ * inject the returned strings as outbound HTTP headers when non-null.
47
+ */
48
+ export declare function activeTraceContext(): {
49
+ traceparent: string;
50
+ tracestate?: string;
51
+ } | null;
52
+ /**
53
+ * Test-only seam: install a deterministic OTel loader and reset the
54
+ * module-level cache. Underscore-prefixed and intentionally NOT re-exported
55
+ * from the package entry-point.
56
+ *
57
+ * Production code never calls this. Tests call it to simulate
58
+ * "OTel installed" / "OTel absent" / "broken OTel install" cells.
59
+ */
60
+ export declare function _loadOtelForTests(injected: OtelLoader | undefined): void;
61
+ export {};
@@ -10,7 +10,12 @@ export interface TransportConfig {
10
10
  readonly auth: AuthConfig;
11
11
  /** Request timeout in milliseconds. Default: 30_000 */
12
12
  readonly timeoutMs?: number;
13
- /** Max number of retries for network errors / 5xx (not counting the initial attempt). Default: 3 */
13
+ /**
14
+ * Max number of retries for network errors / 5xx on idempotent methods
15
+ * (GET/HEAD/OPTIONS/PUT/DELETE/TRACE per RFC 9110 §9.2.2). POST/PATCH are
16
+ * never auto-retried regardless of this value. Not counting the initial
17
+ * attempt. Default: 3
18
+ */
14
19
  readonly maxRetries?: number;
15
20
  }
16
21
  /** Standard API envelope returned by the to11ai server. */
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@to11ai/sdk",
3
- "version": "0.0.2",
3
+ "version": "0.1.1",
4
+ "license": "MPL-2.0",
4
5
  "type": "module",
5
6
  "main": "./dist/client.cjs",
6
7
  "module": "./dist/client.js",
@@ -10,6 +11,7 @@
10
11
  "src",
11
12
  "!src/**/*.test.ts",
12
13
  "!src/**/*.fixture.ts",
14
+ "LICENSE",
13
15
  "README.md"
14
16
  ],
15
17
  "exports": {
@@ -29,6 +31,22 @@
29
31
  "require": "./dist/prompts/resource.cjs",
30
32
  "default": "./dist/prompts/resource.js"
31
33
  },
34
+ "./projectEnvironments": {
35
+ "types": "./src/projectEnvironments/resource.ts",
36
+ "bun": "./src/projectEnvironments/resource.ts",
37
+ "deno": "./src/projectEnvironments/resource.ts",
38
+ "import": "./dist/projectEnvironments/resource.js",
39
+ "require": "./dist/projectEnvironments/resource.cjs",
40
+ "default": "./dist/projectEnvironments/resource.js"
41
+ },
42
+ "./routingRules": {
43
+ "types": "./src/routingRules/resource.ts",
44
+ "bun": "./src/routingRules/resource.ts",
45
+ "deno": "./src/routingRules/resource.ts",
46
+ "import": "./dist/routingRules/resource.js",
47
+ "require": "./dist/routingRules/resource.cjs",
48
+ "default": "./dist/routingRules/resource.js"
49
+ },
32
50
  "./errors": {
33
51
  "types": "./src/errors.ts",
34
52
  "bun": "./src/errors.ts",
@@ -47,16 +65,17 @@
47
65
  }
48
66
  },
49
67
  "publishConfig": {
50
- "access": "restricted"
68
+ "access": "public"
51
69
  },
52
70
  "scripts": {
53
71
  "build": "bun run build:clean && bun run build:esm && bun run build:cjs && bun run build:types",
54
72
  "build:clean": "rm -rf dist",
55
- "build:esm": "bun build src/client.ts src/prompts/resource.ts src/errors.ts src/gateway.ts --outdir dist --target node --format esm --external '*'",
56
- "build:cjs": "bun build src/client.ts src/prompts/resource.ts src/errors.ts src/gateway.ts --outdir dist --target node --format cjs --external '*' --entry-naming '[dir]/[name].cjs'",
73
+ "build:esm": "bun build src/client.ts src/prompts/resource.ts src/projectEnvironments/resource.ts src/routingRules/resource.ts src/errors.ts src/gateway.ts --outdir dist --target node --format esm --external '*'",
74
+ "build:cjs": "bun build src/client.ts src/prompts/resource.ts src/projectEnvironments/resource.ts src/routingRules/resource.ts src/errors.ts src/gateway.ts --outdir dist --target node --format cjs --external '*' --entry-naming '[dir]/[name].cjs'",
57
75
  "build:types": "tsc -p tsconfig.build.json",
58
76
  "prepack": "bun run build",
59
77
  "test": "bun test",
78
+ "test:coverage": "bun test --coverage --coverage-reporter=text --coverage-reporter=lcov",
60
79
  "typecheck": "bun x tsc --noEmit",
61
80
  "lint": "biome check .",
62
81
  "lint:check": "biome check --error-on-warnings .",
@@ -64,7 +83,8 @@
64
83
  "format": "biome format --write ."
65
84
  },
66
85
  "devDependencies": {
67
- "@biomejs/biome": "^2.4.15",
86
+ "@biomejs/biome": "2.4.15",
87
+ "@opentelemetry/api": "^1.9.0",
68
88
  "@types/bun": "^1.3.13",
69
89
  "typescript": "^5.9.3"
70
90
  }
package/src/client.ts CHANGED
@@ -1,9 +1,17 @@
1
+ import { ProjectEnvironmentResource } from "./projectEnvironments/resource";
1
2
  import type { CacheConfig } from "./prompts/cache";
2
3
  import { PromptResource } from "./prompts/resource";
4
+ import { RoutingRulesResource } from "./routingRules/resource";
3
5
  import { Transport } from "./transport";
4
6
 
5
7
  // Re-export all error types for convenience
8
+ export type { NoApplicableRouteReason } from "./errors";
6
9
  export {
10
+ EnvNotEnabledForProviderError,
11
+ NoApplicableRouteError,
12
+ PromptLabelNotRegisteredError,
13
+ RuleNotFoundError,
14
+ RuleVersionInvalidSnapshotError,
7
15
  To11aiApiError,
8
16
  To11aiAuthError,
9
17
  To11aiError,
@@ -13,8 +21,55 @@ export {
13
21
  } from "./errors";
14
22
  export type { GatewayAuthOptions } from "./gateway";
15
23
  export { gatewayAuthHeaders, gatewayPromptHeaders } from "./gateway";
24
+ export type {
25
+ ArchiveProjectEnvironmentInput,
26
+ ArchiveProjectEnvironmentResult,
27
+ CreateProjectEnvironmentInput,
28
+ CreateProjectEnvironmentResult,
29
+ GetProjectEnvironmentInput,
30
+ GetProjectEnvironmentResult,
31
+ ListProjectEnvironmentsInput,
32
+ ListProjectEnvironmentsResult,
33
+ LivePointerCounts,
34
+ ProjectEnvironment,
35
+ RestoreProjectEnvironmentInput,
36
+ RestoreProjectEnvironmentResult,
37
+ UpdateProjectEnvironmentInput,
38
+ UpdateProjectEnvironmentResult,
39
+ } from "./projectEnvironments/resource";
40
+ export { ProjectEnvironmentResource } from "./projectEnvironments/resource";
16
41
  export type { CacheConfig } from "./prompts/cache";
17
42
  export { PromptResource } from "./prompts/resource";
43
+ export type {
44
+ CreateRuleVersionInput,
45
+ CreateRuleVersionResult,
46
+ GetRuleVersionInput,
47
+ GetRuleVersionResult,
48
+ ListRuleReleasesInput,
49
+ ListRuleReleasesResult,
50
+ ListRuleVersionsInput,
51
+ ListRuleVersionsResult,
52
+ RollbackRuleReleaseInput,
53
+ RollbackRuleReleaseResult,
54
+ RuleModelBinding,
55
+ RuleProviderRef,
56
+ RuleRelease,
57
+ RuleReleaseActorType,
58
+ RuleReleaseApprovalStatus,
59
+ RuleReleaseChangeKind,
60
+ RuleReleaseStrategy,
61
+ RuleReleaseWeight,
62
+ RuleSnapshot,
63
+ RuleStrategy,
64
+ RuleVersion,
65
+ SetRuleReleaseInput,
66
+ SetRuleReleaseResult,
67
+ } from "./routingRules/resource";
68
+ export {
69
+ RoutingRuleReleaseResource,
70
+ RoutingRulesResource,
71
+ RoutingRuleVersionResource,
72
+ } from "./routingRules/resource";
18
73
  export type { Transport } from "./transport";
19
74
 
20
75
  // ─── Auth option shapes ────────────────────────────────────────────────────
@@ -49,6 +104,8 @@ export type ClientOptions = AuthOptions & {
49
104
 
50
105
  export interface To11aiClient {
51
106
  readonly prompts: PromptResource;
107
+ readonly projectEnvironments: ProjectEnvironmentResource;
108
+ readonly routingRules: RoutingRulesResource;
52
109
  }
53
110
 
54
111
  // ─── Factory ───────────────────────────────────────────────────────────────
@@ -115,6 +172,8 @@ export function createClient(options: ClientOptions): To11aiClient {
115
172
  });
116
173
 
117
174
  const prompts = new PromptResource(transport, options.cache);
175
+ const projectEnvironments = new ProjectEnvironmentResource(transport);
176
+ const routingRules = new RoutingRulesResource(transport);
118
177
 
119
- return { prompts };
178
+ return { prompts, projectEnvironments, routingRules };
120
179
  }