@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.
- package/LICENSE +373 -0
- package/README.md +91 -1
- package/dist/client.cjs +20 -5
- package/dist/client.d.ts +10 -1
- package/dist/client.js +26 -2
- package/dist/errors.cjs +89 -1
- package/dist/errors.d.ts +96 -0
- package/dist/errors.js +89 -1
- package/dist/gateway.cjs +8 -1
- package/dist/gateway.d.ts +19 -0
- package/dist/gateway.js +8 -1
- package/dist/projectEnvironments/resource.cjs +110 -0
- package/dist/projectEnvironments/resource.d.ts +67 -0
- package/dist/projectEnvironments/resource.js +70 -0
- package/dist/projectEnvironments/types.d.ts +121 -0
- package/dist/prompts/resource.cjs +81 -0
- package/dist/prompts/resource.d.ts +61 -2
- package/dist/prompts/resource.js +81 -0
- package/dist/prompts/types.d.ts +217 -3
- package/dist/routingRules/resource.cjs +131 -0
- package/dist/routingRules/resource.d.ts +22 -0
- package/dist/routingRules/resource.js +91 -0
- package/dist/routingRules/types.d.ts +169 -0
- package/dist/traceparent.d.ts +61 -0
- package/dist/transport.d.ts +6 -1
- package/package.json +25 -5
- package/src/client.ts +60 -1
- package/src/errors.ts +172 -0
- package/src/gateway.ts +29 -1
- package/src/projectEnvironments/resource.ts +220 -0
- package/src/projectEnvironments/types.ts +151 -0
- package/src/prompts/resource.ts +232 -0
- package/src/prompts/types.ts +270 -3
- package/src/routingRules/resource.ts +180 -0
- package/src/routingRules/types.ts +222 -0
- package/src/traceparent.ts +124 -0
- package/src/transport.ts +191 -5
|
@@ -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 {};
|
package/dist/transport.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
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.
|
|
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": "
|
|
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": "
|
|
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
|
}
|