@possibl/rcrt-sdk 0.1.3 → 0.5.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/CHANGELOG.md +87 -0
- package/README.md +35 -4
- package/dist/authn.d.ts +30 -0
- package/dist/authn.d.ts.map +1 -1
- package/dist/authn.js +32 -0
- package/dist/authn.js.map +1 -1
- package/dist/breadcrumbs.d.ts +11 -0
- package/dist/breadcrumbs.d.ts.map +1 -1
- package/dist/breadcrumbs.js +26 -0
- package/dist/breadcrumbs.js.map +1 -1
- package/dist/cards.d.ts.map +1 -1
- package/dist/cards.js +0 -1
- package/dist/cards.js.map +1 -1
- package/dist/chat.d.ts +53 -0
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +47 -0
- package/dist/chat.js.map +1 -1
- package/dist/client.d.ts +40 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +64 -0
- package/dist/client.js.map +1 -1
- package/dist/files.d.ts +41 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +64 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/fetch.d.ts +6 -0
- package/dist/internal/fetch.d.ts.map +1 -1
- package/dist/internal/fetch.js +2 -0
- package/dist/internal/fetch.js.map +1 -1
- package/dist/marketplace.d.ts +98 -0
- package/dist/marketplace.d.ts.map +1 -0
- package/dist/marketplace.js +74 -0
- package/dist/marketplace.js.map +1 -0
- package/dist/members.d.ts +60 -0
- package/dist/members.d.ts.map +1 -0
- package/dist/members.js +74 -0
- package/dist/members.js.map +1 -0
- package/dist/org.d.ts +85 -0
- package/dist/org.d.ts.map +1 -0
- package/dist/org.js +70 -0
- package/dist/org.js.map +1 -0
- package/dist/types/engine.d.ts +69 -0
- package/dist/types/engine.d.ts.map +1 -0
- package/dist/types/engine.js +53 -0
- package/dist/types/engine.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +9 -9
package/dist/members.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Members module — workspace membership + invitations.
|
|
3
|
+
*
|
|
4
|
+
* GET/POST /v1/tenants/{tenant_id}/members
|
|
5
|
+
* PUT/DELETE /v1/tenants/{tenant_id}/members/{user_id}
|
|
6
|
+
* GET/POST /v1/tenants/{tenant_id}/invitations
|
|
7
|
+
* DELETE /v1/tenants/{tenant_id}/invitations/{invitation_id}
|
|
8
|
+
*
|
|
9
|
+
* Accept/decline/pending live on the IdentityModule (`auth.*`) because
|
|
10
|
+
* they are keyed by the *caller's* email, not a workspace.
|
|
11
|
+
*
|
|
12
|
+
* Note: creating an invitation also sends the invite email server-side;
|
|
13
|
+
* there is no separate "resend" endpoint — re-create to resend.
|
|
14
|
+
*/
|
|
15
|
+
import { request } from './internal/fetch.js';
|
|
16
|
+
export class MembersModule {
|
|
17
|
+
ctx;
|
|
18
|
+
constructor(ctx) {
|
|
19
|
+
this.ctx = ctx;
|
|
20
|
+
}
|
|
21
|
+
tenant(tenantId) {
|
|
22
|
+
const id = tenantId ?? this.ctx.tenantId;
|
|
23
|
+
if (!id)
|
|
24
|
+
throw new Error('MembersModule requires a tenant id (set via setTenantId or pass explicitly)');
|
|
25
|
+
return id;
|
|
26
|
+
}
|
|
27
|
+
/** `GET /v1/tenants/{id}/members` */
|
|
28
|
+
async list(tenantId) {
|
|
29
|
+
const res = await request(this.ctx, `/v1/tenants/${this.tenant(tenantId)}/members`);
|
|
30
|
+
return res.members ?? [];
|
|
31
|
+
}
|
|
32
|
+
/** `POST /v1/tenants/{id}/members` — direct add (caller must know the user id). */
|
|
33
|
+
async add(userId, role, tenantId) {
|
|
34
|
+
await request(this.ctx, `/v1/tenants/${this.tenant(tenantId)}/members`, {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
body: { user_id: userId, role },
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/** `PUT /v1/tenants/{id}/members/{userId}` — change a member's role. */
|
|
40
|
+
async updateRole(userId, role, tenantId) {
|
|
41
|
+
await request(this.ctx, `/v1/tenants/${this.tenant(tenantId)}/members/${userId}`, {
|
|
42
|
+
method: 'PUT',
|
|
43
|
+
body: { role },
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/** `DELETE /v1/tenants/{id}/members/{userId}` */
|
|
47
|
+
async remove(userId, tenantId) {
|
|
48
|
+
await request(this.ctx, `/v1/tenants/${this.tenant(tenantId)}/members/${userId}`, {
|
|
49
|
+
method: 'DELETE',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/** `GET /v1/tenants/{id}/invitations` — all invitations incl. resolved ones. */
|
|
53
|
+
async listInvitations(tenantId) {
|
|
54
|
+
const res = await request(this.ctx, `/v1/tenants/${this.tenant(tenantId)}/invitations`);
|
|
55
|
+
return res.invitations ?? [];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* `POST /v1/tenants/{id}/invitations` — creates the invite AND sends
|
|
59
|
+
* the email. Role defaults server-side to 'member'.
|
|
60
|
+
*/
|
|
61
|
+
async invite(email, options = {}) {
|
|
62
|
+
return request(this.ctx, `/v1/tenants/${this.tenant(options.tenantId)}/invitations`, {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
body: { email, role: options.role, message: options.message },
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/** `DELETE /v1/tenants/{id}/invitations/{invId}` — soft-cancel (status → cancelled). */
|
|
68
|
+
async cancelInvitation(invitationId, tenantId) {
|
|
69
|
+
await request(this.ctx, `/v1/tenants/${this.tenant(tenantId)}/invitations/${invitationId}`, {
|
|
70
|
+
method: 'DELETE',
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=members.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"members.js","sourceRoot":"","sources":["../src/members.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAsB9C,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,GAAiB;QAAjB,QAAG,GAAH,GAAG,CAAc;IAAG,CAAC;IAE1C,MAAM,CAAC,QAAiB;QAC9B,MAAM,EAAE,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;QACxG,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,IAAI,CAAC,QAAiB;QAC1B,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,IAAI,CAAC,GAAG,EACR,eAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAC/C,CAAC;QACF,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,IAAY,EAAE,QAAiB;QACvD,MAAM,OAAO,CAAO,IAAI,CAAC,GAAG,EAAE,eAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE;YAC5E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;SAChC,CAAC,CAAC;IACL,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,IAAY,EAAE,QAAiB;QAC9D,MAAM,OAAO,CAAO,IAAI,CAAC,GAAG,EAAE,eAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,MAAM,EAAE,EAAE;YACtF,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,EAAE,IAAI,EAAE;SACf,CAAC,CAAC;IACL,CAAC;IAED,iDAAiD;IACjD,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,QAAiB;QAC5C,MAAM,OAAO,CAAO,IAAI,CAAC,GAAG,EAAE,eAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,MAAM,EAAE,EAAE;YACtF,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,eAAe,CAAC,QAAiB;QACrC,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,IAAI,CAAC,GAAG,EACR,eAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CACnD,CAAC;QACF,OAAO,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CACV,KAAa,EACb,UAAkE,EAAE;QAEpE,OAAO,OAAO,CAAmB,IAAI,CAAC,GAAG,EAAE,eAAe,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE;YACrG,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,gBAAgB,CAAC,YAAoB,EAAE,QAAiB;QAC5D,MAAM,OAAO,CAAO,IAAI,CAAC,GAAG,EAAE,eAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,YAAY,EAAE,EAAE;YAChG,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/dist/org.d.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Org admin module — `/v1/orgs/*` management surface.
|
|
3
|
+
*
|
|
4
|
+
* Everything here requires org-admin (or platform-admin) rights on the
|
|
5
|
+
* target org. Tenant scoping does not apply — calls are addressed by
|
|
6
|
+
* org id, not by the client's X-Tenant-ID.
|
|
7
|
+
*/
|
|
8
|
+
import type { FetchContext } from './internal/fetch.js';
|
|
9
|
+
export interface OrgSummary {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
slug?: string;
|
|
13
|
+
allowed_domains?: string[];
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface OrgMember {
|
|
17
|
+
user_id: string;
|
|
18
|
+
email?: string;
|
|
19
|
+
name?: string;
|
|
20
|
+
role: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
export interface OrgTenant {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
slug?: string;
|
|
27
|
+
org_id?: string;
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
}
|
|
30
|
+
/** Response of `POST /v1/orgs/{org_id}/customers` — a child customer org + its default workspace. */
|
|
31
|
+
export interface CustomerOrgResponse {
|
|
32
|
+
org?: {
|
|
33
|
+
id: string;
|
|
34
|
+
name?: string;
|
|
35
|
+
};
|
|
36
|
+
workspace?: {
|
|
37
|
+
id: string;
|
|
38
|
+
name?: string;
|
|
39
|
+
};
|
|
40
|
+
[key: string]: unknown;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A stored org LLM provider credential.
|
|
44
|
+
*
|
|
45
|
+
* `org_llm_providers` is now purely a credential store keyed by route (see
|
|
46
|
+
* docs/design/LLM_PROVIDER_MODEL_RESOLUTION.md). `is_default` is retained only
|
|
47
|
+
* as a convenience flag for credential listing and does NOT influence
|
|
48
|
+
* resolution. The removed `fallback_for_id` column and the tier-override
|
|
49
|
+
* surface are gone — model selection is the agent breadcrumb's concrete
|
|
50
|
+
* `route/provider/model` address.
|
|
51
|
+
*/
|
|
52
|
+
export interface OrgLLMProvider {
|
|
53
|
+
id: string;
|
|
54
|
+
provider_type: string;
|
|
55
|
+
name: string;
|
|
56
|
+
is_default: boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare class OrgModule {
|
|
59
|
+
private readonly ctx;
|
|
60
|
+
constructor(ctx: FetchContext);
|
|
61
|
+
/** `GET /v1/orgs/{org_id}` */
|
|
62
|
+
get(orgId: string): Promise<OrgSummary>;
|
|
63
|
+
/** `GET /v1/orgs/{org_id}/members` */
|
|
64
|
+
listMembers(orgId: string): Promise<OrgMember[]>;
|
|
65
|
+
/**
|
|
66
|
+
* `GET /v1/orgs/{org_id}/tenants` — all workspaces in the org.
|
|
67
|
+
*
|
|
68
|
+
* Privacy note for fleet apps: never enumerate a *customer-run*
|
|
69
|
+
* platform org's tenants; use org-level rollups instead.
|
|
70
|
+
*/
|
|
71
|
+
listTenants(orgId: string): Promise<OrgTenant[]>;
|
|
72
|
+
/** `POST /v1/orgs/{org_id}/tenants` — create a workspace inside the org. Returns the new tenant id. */
|
|
73
|
+
createTenant(orgId: string, name: string, slug?: string): Promise<OrgTenant>;
|
|
74
|
+
/**
|
|
75
|
+
* `POST /v1/orgs/{org_id}/customers` — create a child customer org
|
|
76
|
+
* (optionally adopting an existing workspace as its default).
|
|
77
|
+
*/
|
|
78
|
+
createCustomerOrg(orgId: string, opts: {
|
|
79
|
+
name: string;
|
|
80
|
+
adoptTenantId?: string;
|
|
81
|
+
}): Promise<CustomerOrgResponse>;
|
|
82
|
+
/** `GET /v1/orgs/{org_id}/llm-providers` — list stored BYO credentials (no fallback role). */
|
|
83
|
+
listLLMProviders(orgId: string): Promise<OrgLLMProvider[]>;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=org.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org.d.ts","sourceRoot":"","sources":["../src/org.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qGAAqG;AACrG,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,SAAS,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,YAAY;IAE9C,8BAA8B;IACxB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAI7C,sCAAsC;IAChC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQtD;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQtD,uGAAuG;IACjG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAclF;;;OAGG;IACG,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7C,OAAO,CAAC,mBAAmB,CAAC;IAgB/B,8FAA8F;IACxF,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAOjE"}
|
package/dist/org.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Org admin module — `/v1/orgs/*` management surface.
|
|
3
|
+
*
|
|
4
|
+
* Everything here requires org-admin (or platform-admin) rights on the
|
|
5
|
+
* target org. Tenant scoping does not apply — calls are addressed by
|
|
6
|
+
* org id, not by the client's X-Tenant-ID.
|
|
7
|
+
*/
|
|
8
|
+
import { request } from './internal/fetch.js';
|
|
9
|
+
export class OrgModule {
|
|
10
|
+
ctx;
|
|
11
|
+
constructor(ctx) {
|
|
12
|
+
this.ctx = ctx;
|
|
13
|
+
}
|
|
14
|
+
/** `GET /v1/orgs/{org_id}` */
|
|
15
|
+
async get(orgId) {
|
|
16
|
+
return request(this.ctx, `/v1/orgs/${encodeURIComponent(orgId)}`);
|
|
17
|
+
}
|
|
18
|
+
/** `GET /v1/orgs/{org_id}/members` */
|
|
19
|
+
async listMembers(orgId) {
|
|
20
|
+
const res = await request(this.ctx, `/v1/orgs/${encodeURIComponent(orgId)}/members`);
|
|
21
|
+
return Array.isArray(res) ? res : (res?.members ?? []);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* `GET /v1/orgs/{org_id}/tenants` — all workspaces in the org.
|
|
25
|
+
*
|
|
26
|
+
* Privacy note for fleet apps: never enumerate a *customer-run*
|
|
27
|
+
* platform org's tenants; use org-level rollups instead.
|
|
28
|
+
*/
|
|
29
|
+
async listTenants(orgId) {
|
|
30
|
+
const res = await request(this.ctx, `/v1/orgs/${encodeURIComponent(orgId)}/tenants`);
|
|
31
|
+
return Array.isArray(res) ? res : (res?.tenants ?? []);
|
|
32
|
+
}
|
|
33
|
+
/** `POST /v1/orgs/{org_id}/tenants` — create a workspace inside the org. Returns the new tenant id. */
|
|
34
|
+
async createTenant(orgId, name, slug) {
|
|
35
|
+
const res = await request(this.ctx, `/v1/orgs/${encodeURIComponent(orgId)}/tenants`, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
body: { name, ...(slug ? { slug } : {}) },
|
|
38
|
+
});
|
|
39
|
+
// Normalise the gateway's historical response shapes.
|
|
40
|
+
const r = res;
|
|
41
|
+
if (r.tenant?.id)
|
|
42
|
+
return r.tenant;
|
|
43
|
+
const id = r.id ?? r.tenant_id ?? '';
|
|
44
|
+
return { id, name: r.name ?? name, org_id: orgId };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* `POST /v1/orgs/{org_id}/customers` — create a child customer org
|
|
48
|
+
* (optionally adopting an existing workspace as its default).
|
|
49
|
+
*/
|
|
50
|
+
async createCustomerOrg(orgId, opts) {
|
|
51
|
+
return request(this.ctx, `/v1/orgs/${encodeURIComponent(orgId)}/customers`, {
|
|
52
|
+
method: 'POST',
|
|
53
|
+
body: { name: opts.name, ...(opts.adoptTenantId ? { adopt_tenant_id: opts.adoptTenantId } : {}) },
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// ── LLM provider credentials ────────────────────────────────────
|
|
57
|
+
//
|
|
58
|
+
// `org_llm_providers` is a pure credential store keyed by route. The
|
|
59
|
+
// tier-override surface (getLLMTiers/upsertLLMTier/deleteLLMTier and the
|
|
60
|
+
// `/v1/orgs/{org}/llm-tiers` endpoints) was removed: model selection is the
|
|
61
|
+
// agent breadcrumb's concrete `route/provider/model` address, expanded from
|
|
62
|
+
// authoring tiers at publish time. See
|
|
63
|
+
// docs/design/LLM_PROVIDER_MODEL_RESOLUTION.md.
|
|
64
|
+
/** `GET /v1/orgs/{org_id}/llm-providers` — list stored BYO credentials (no fallback role). */
|
|
65
|
+
async listLLMProviders(orgId) {
|
|
66
|
+
const res = await request(this.ctx, `/v1/orgs/${encodeURIComponent(orgId)}/llm-providers`);
|
|
67
|
+
return Array.isArray(res) ? res : (res?.providers ?? []);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=org.js.map
|
package/dist/org.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org.js","sourceRoot":"","sources":["../src/org.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM engine selection types — the TypeScript mirror of the Go contract in
|
|
3
|
+
* `pkg/rcrt/types.go` (`EngineConfig`) and `internal/llm/address.go`
|
|
4
|
+
* (`ModelAddress`). See docs/design/LLM_PROVIDER_MODEL_RESOLUTION.md.
|
|
5
|
+
*
|
|
6
|
+
* The canonical address `route/provider/model` stored in an agent breadcrumb's
|
|
7
|
+
* `engine_config.model` is the SINGLE source of truth for LLM selection. It is
|
|
8
|
+
* ALWAYS concrete at runtime (tiers are expanded to a concrete address at
|
|
9
|
+
* publish time). There is no runtime tier indirection, no org override layer,
|
|
10
|
+
* and no fallbacks.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* The parsed form of a canonical `route/provider/model` address.
|
|
14
|
+
*
|
|
15
|
+
* - `route` = transport/adapter that makes the call (`vertex_ai`,
|
|
16
|
+
* `openrouter`, `sovereign`, …). The special route `tier` is
|
|
17
|
+
* AUTHORING-ONLY and is never valid at runtime.
|
|
18
|
+
* - `provider` = vendor namespace within the route, may be empty
|
|
19
|
+
* (`anthropic`, `google`, `custom`, ``).
|
|
20
|
+
* - `model` = the concrete model id (may itself contain slashes).
|
|
21
|
+
*
|
|
22
|
+
* Examples:
|
|
23
|
+
* - `vertex_ai//gemini-3.1-pro-preview` → { route: 'vertex_ai', provider: '', model: 'gemini-3.1-pro-preview' }
|
|
24
|
+
* - `openrouter/anthropic/claude-fable-5` → { route: 'openrouter', provider: 'anthropic', model: 'claude-fable-5' }
|
|
25
|
+
* - `vertex_ai/anthropic/claude-sonnet-4-6` → { route: 'vertex_ai', provider: 'anthropic', model: 'claude-sonnet-4-6' }
|
|
26
|
+
*/
|
|
27
|
+
export interface ModelAddress {
|
|
28
|
+
route: string;
|
|
29
|
+
/** Vendor namespace within the route; may be empty (`route//model`). */
|
|
30
|
+
provider: string;
|
|
31
|
+
model: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse a canonical `route/provider/model` address. Splits into at most three
|
|
35
|
+
* segments so the `model` segment may contain further slashes. Throws on a
|
|
36
|
+
* malformed/empty address (no default — fail loudly, mirroring the Go
|
|
37
|
+
* `ParseModelAddress`).
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseModelAddress(s: string): ModelAddress;
|
|
40
|
+
/**
|
|
41
|
+
* Render a {@link ModelAddress} back to canonical `route/provider/model` form.
|
|
42
|
+
* An empty provider renders as `route//model`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatModelAddress(addr: ModelAddress): string;
|
|
45
|
+
/** The authoring-only route. An address with this route is an unexpanded tier. */
|
|
46
|
+
export declare const ROUTE_TIER = "tier";
|
|
47
|
+
/** True if the address is an unexpanded authoring-only tier address. */
|
|
48
|
+
export declare function isTierAddress(addr: ModelAddress): boolean;
|
|
49
|
+
/** Authoring-sugar intelligence tiers; expanded to a concrete address at publish time. */
|
|
50
|
+
export type IntelligenceTier = 'efficient' | 'balanced' | 'expert' | 'max';
|
|
51
|
+
/**
|
|
52
|
+
* EngineConfig — which LLM engine an agent uses. Mirrors the Go `EngineConfig`
|
|
53
|
+
* in `pkg/rcrt/types.go`.
|
|
54
|
+
*
|
|
55
|
+
* `model` is the runtime source of truth: a canonical `route/provider/model`
|
|
56
|
+
* address. `tool` and `intelligence_level` are AUTHORING-ONLY sugar that are
|
|
57
|
+
* stripped at publish time once a concrete `model` address is present.
|
|
58
|
+
*/
|
|
59
|
+
export interface EngineConfig {
|
|
60
|
+
/** Engine kind: `llm` | `human`. */
|
|
61
|
+
type: string;
|
|
62
|
+
/** Authoring-only legacy provider hint; stripped at publish. */
|
|
63
|
+
tool?: string;
|
|
64
|
+
/** Canonical `route/provider/model` address — runtime SSOT. */
|
|
65
|
+
model?: string;
|
|
66
|
+
/** Authoring-only sugar; expanded to `model` at publish. */
|
|
67
|
+
intelligence_level?: IntelligenceTier;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/types/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAkBzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAE7D;AAED,kFAAkF;AAClF,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAEzD;AAED,0FAA0F;AAC1F,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE3E;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,kBAAkB,CAAC,EAAE,gBAAgB,CAAC;CACvC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM engine selection types — the TypeScript mirror of the Go contract in
|
|
3
|
+
* `pkg/rcrt/types.go` (`EngineConfig`) and `internal/llm/address.go`
|
|
4
|
+
* (`ModelAddress`). See docs/design/LLM_PROVIDER_MODEL_RESOLUTION.md.
|
|
5
|
+
*
|
|
6
|
+
* The canonical address `route/provider/model` stored in an agent breadcrumb's
|
|
7
|
+
* `engine_config.model` is the SINGLE source of truth for LLM selection. It is
|
|
8
|
+
* ALWAYS concrete at runtime (tiers are expanded to a concrete address at
|
|
9
|
+
* publish time). There is no runtime tier indirection, no org override layer,
|
|
10
|
+
* and no fallbacks.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Parse a canonical `route/provider/model` address. Splits into at most three
|
|
14
|
+
* segments so the `model` segment may contain further slashes. Throws on a
|
|
15
|
+
* malformed/empty address (no default — fail loudly, mirroring the Go
|
|
16
|
+
* `ParseModelAddress`).
|
|
17
|
+
*/
|
|
18
|
+
export function parseModelAddress(s) {
|
|
19
|
+
const raw = (s ?? '').trim();
|
|
20
|
+
if (raw === '')
|
|
21
|
+
throw new Error('empty model address');
|
|
22
|
+
// Split into at most three parts: route, provider, model-with-slashes.
|
|
23
|
+
const firstSlash = raw.indexOf('/');
|
|
24
|
+
if (firstSlash === -1) {
|
|
25
|
+
throw new Error(`malformed model address "${s}": expected route/provider/model`);
|
|
26
|
+
}
|
|
27
|
+
const secondSlash = raw.indexOf('/', firstSlash + 1);
|
|
28
|
+
if (secondSlash === -1) {
|
|
29
|
+
throw new Error(`malformed model address "${s}": expected route/provider/model`);
|
|
30
|
+
}
|
|
31
|
+
const route = raw.slice(0, firstSlash).trim();
|
|
32
|
+
const provider = raw.slice(firstSlash + 1, secondSlash).trim();
|
|
33
|
+
const model = raw.slice(secondSlash + 1).trim();
|
|
34
|
+
if (route === '')
|
|
35
|
+
throw new Error(`malformed model address "${s}": empty route`);
|
|
36
|
+
if (model === '')
|
|
37
|
+
throw new Error(`malformed model address "${s}": empty model`);
|
|
38
|
+
return { route, provider, model };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Render a {@link ModelAddress} back to canonical `route/provider/model` form.
|
|
42
|
+
* An empty provider renders as `route//model`.
|
|
43
|
+
*/
|
|
44
|
+
export function formatModelAddress(addr) {
|
|
45
|
+
return `${addr.route}/${addr.provider}/${addr.model}`;
|
|
46
|
+
}
|
|
47
|
+
/** The authoring-only route. An address with this route is an unexpanded tier. */
|
|
48
|
+
export const ROUTE_TIER = 'tier';
|
|
49
|
+
/** True if the address is an unexpanded authoring-only tier address. */
|
|
50
|
+
export function isTierAddress(addr) {
|
|
51
|
+
return addr.route === ROUTE_TIER;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/types/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwBH;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAS;IACzC,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,GAAG,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACvD,uEAAuE;IACvE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,kCAAkC,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IACrD,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,kCAAkC,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,KAAK,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,gBAAgB,CAAC,CAAC;IACjF,IAAI,KAAK,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,gBAAgB,CAAC,CAAC;IACjF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAkB;IACnD,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;AACxD,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAEjC,wEAAwE;AACxE,MAAM,UAAU,aAAa,CAAC,IAAkB;IAC9C,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC;AACnC,CAAC"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
|
package/dist/types/index.js
CHANGED
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@possibl/rcrt-sdk",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "TypeScript SDK for the RCRT multi-tenant AI BaaS — isomorphic (web + node + React Native)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"//": "In-repo consumers (tests, dashboard) see raw src/*.ts via `main`/`exports`. publishConfig overrides these at publish time to point at compiled dist/ so npm installs are clean JS + .d.ts.",
|
|
7
|
-
"main": "./
|
|
8
|
-
"types": "./
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
-
"types": "./
|
|
12
|
-
"default": "./
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
13
|
},
|
|
14
14
|
"./types": {
|
|
15
|
-
"types": "./
|
|
16
|
-
"default": "./
|
|
15
|
+
"types": "./dist/types/index.d.ts",
|
|
16
|
+
"default": "./dist/types/index.js"
|
|
17
17
|
},
|
|
18
18
|
"./generated": {
|
|
19
|
-
"types": "./
|
|
20
|
-
"default": "./
|
|
19
|
+
"types": "./dist/generated/index.d.ts",
|
|
20
|
+
"default": "./dist/generated/index.js"
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
23
|
"publishConfig": {
|