@baobox/sdk 0.1.2 → 0.3.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.
package/README.md CHANGED
@@ -21,7 +21,8 @@ import { BaoBoxClient } from "@baobox/sdk";
21
21
 
22
22
  const bb = new BaoBoxClient({
23
23
  endpoint: "https://api.baobox.ai",
24
- apiKey: process.env.BAOBOX_API_KEY!,
24
+ apiKey: process.env.BAOBOX_API_KEY,
25
+ adminSecret: process.env.BAOBOX_ADMIN_SECRET,
25
26
  });
26
27
 
27
28
  const res = await bb.chat({
@@ -50,14 +51,59 @@ const res = await bb.chat({
50
51
 
51
52
  Returns `{ response, usage: { inputTokens, outputTokens }, sessionId, meta }` where `meta` carries `requestId`, `latencyMs`, `model`, and an optional `trace` array.
52
53
 
53
- ### Sessions
54
+ ### Workflow (single-turn, stateless) — added in 0.3.0
55
+
56
+ `workflow()` is the right call when the caller already owns conversation state and doesn't want BaoBox to persist a session/thread. The full conversation history is passed every call; BaoBox just runs the skill on it once and returns. Events are written under a server-generated `runId` so you can fetch the trace later.
57
+
58
+ ```typescript
59
+ const res = await bb.workflow({
60
+ skill: "sk_email_chase",
61
+ clientId: "client_abc", // your tenant's client identifier
62
+ requestId: "your_app_req_42", // your tenant's request identifier
63
+ input: "chase client for missing bank statements",
64
+ history: [ // optional
65
+ { role: "user", content: "draft an email..." },
66
+ { role: "assistant", content: "Sure, here's a draft..." },
67
+ ],
68
+ });
69
+
70
+ console.log(res.response); // skill output
71
+ console.log(res.runId); // "wflow_..." — handle for the run's event timeline
72
+ ```
73
+
74
+ Returns `{ response, runId, usage, meta }`. `clientId` and `requestId` land on the BaoBox `call_logs` row (as `client_id` and `external_request_id`) so you can join workflow runs back to your own request log. The skill is responsible for self-routing — there is no `action` discriminator on the request.
75
+
76
+ ### Sessions, Skills, Tools, Eval, Admin
77
+
78
+ BaoBox now splits auth:
79
+
80
+ - `apiKey` is only for `chat`
81
+ - `adminSecret` is for `sessions`, `skills`, `tools`, `eval`, and `admin`
54
82
 
55
83
  ```typescript
56
84
  const session = await bb.sessions.create({ skillId: "sk_chase" });
57
85
  const history = await bb.sessions.messages(session.id);
86
+ const timeline = await bb.sessions.timeline(session.id);
87
+
88
+ const skill = await bb.skills.create({
89
+ name: "Document Chaser",
90
+ systemPrompt: "...",
91
+ tools: ["lookup_client_docs"], // SDK convenience: syncs attachments after create
92
+ });
93
+
94
+ const tool = await bb.tools.create({
95
+ name: "lookup_client_docs",
96
+ description: "...",
97
+ inputSchema: { type: "object" },
98
+ handlerType: "http",
99
+ handlerConfig: { url: "https://backend.example.com/tools/lookup" },
100
+ });
101
+
102
+ const run = await bb.eval.run({ skillId: skill.id });
103
+ const stats = await bb.admin.stats.get();
58
104
  ```
59
105
 
60
- ### Admin (requires admin token)
106
+ ### Backward compatibility
61
107
 
62
108
  ```typescript
63
109
  await bb.admin.skills.upsert({
@@ -77,12 +123,16 @@ await bb.admin.tools.upsert({
77
123
  });
78
124
  ```
79
125
 
80
- ### Events (trace)
126
+ `bb.admin.skills.upsert()` now targets `/api/v1/skills` and, when `tools` is provided, reconciles the skill's tool attachments via the dedicated tool-association endpoints. `bb.admin.tools.upsert()` now targets `/api/v1/tools`.
127
+
128
+ ### Events (timeline alias)
81
129
 
82
130
  ```typescript
83
- const events = await bb.events.list({ sessionId: "ses_1", limit: 50 });
131
+ const events = await bb.events.list({ sessionId: "ses_1" });
84
132
  ```
85
133
 
134
+ Each `Event` carries `sessionId: string | null` and `runId: string | null` (added in 0.3.0). Chat events have `sessionId` set; workflow events have `runId` set. Both share the same shape so a single consumer can render either timeline.
135
+
86
136
  ## Error handling
87
137
 
88
138
  Every non-2xx response throws `BaoBoxError`:
@@ -107,14 +157,36 @@ Network failures surface as `BaoBoxError` with `status: 0` and `code: "NETWORK"`
107
157
 
108
158
  ```typescript
109
159
  new BaoBoxClient({
110
- endpoint: "...", // required — BaoBox API base URL
111
- apiKey: "...", // required
160
+ endpoint: "...", // required — BaoBox API base URL
161
+ apiKey: "...", // optional unless using chat
162
+ adminSecret: "...", // optional unless using admin/runtime management APIs
112
163
  orgId: "firm_a", // optional, observability tag
113
164
  fetch: myFetch, // optional, injects custom fetch (tests / edge runtimes)
114
165
  timeoutMs: 30_000, // optional, default 30s. Set 0 to disable.
115
166
  });
116
167
  ```
117
168
 
169
+ ## Releasing
170
+
171
+ Publishing is **tag-driven via GitHub Actions** (`.github/workflows/publish.yml`). There is no local `npm login` / `npm publish` flow — auth lives in the `NPM_TOKEN` repo secret, and pushes use `--provenance` for npm provenance attestation. The full release sequence:
172
+
173
+ ```bash
174
+ # 1. Bump version in package.json (e.g. 0.3.0 → 0.4.0).
175
+ # 2. Update the README + CHANGELOG if anything user-facing moved.
176
+ # 3. Commit on main and push.
177
+ git add package.json README.md src
178
+ git commit -m "feat: 0.4.0 — ..."
179
+ git push origin main
180
+
181
+ # 4. Tag the commit. The publish job is gated on `refs/tags/v*`.
182
+ git tag v0.4.0
183
+ git push --tags
184
+ ```
185
+
186
+ GitHub Actions then runs verify (typecheck + test + build) and, on the tag job only, `npm publish --provenance --access public`. Watch the run at the repo's **Actions** tab; the npm release shows up at https://www.npmjs.com/package/@baobox/sdk a minute or two after the job goes green.
187
+
188
+ The package's `prepublishOnly` (`clean && build && test`) is the local safety net for anyone who does run `npm publish` by hand — but the day-to-day release path is the tag.
189
+
118
190
  ## License
119
191
 
120
192
  MIT. See [LICENSE](./LICENSE).
package/dist/index.d.ts CHANGED
@@ -1,12 +1,37 @@
1
- import type { ChatRequest, ChatResponse, Event, EventListRequest, Session, SessionMessage, Skill, BaoBoxClientOptions, SkillUpsertRequest, Tool, ToolUpsertRequest } from "./types.js";
1
+ import type { AdminStats, ApiKey, AttachToolResult, BaoBoxClientOptions, CallLogRow, ChatRequest, ChatResponse, CreateApiKeyRequest, CreateEvalCaseRequest, CreateScheduledTaskRequest, DeleteResult, DetachToolResult, EvalCase, EvalCompare, EvalCompareRequest, EvalFailureRow, EvalFailuresRequest, EvalRunExecution, EvalRunWithResults, EvalStats, EvalStatsRequest, Event, EventListRequest, HealthResponse, RunEvalRequest, ScheduledTask, Session, SessionCreateRequest, SessionMessage, SessionTimeline, SetSkillFileRequest, SetSkillFileResult, SetSkillSecretRequest, SetSkillSecretResult, Skill, SkillCreateRequest, SkillFile, SkillFileSummary, SkillImportRequest, SkillSecretSummary, SkillUpdateRequest, SkillUpsertRequest, SkillWithFiles, Tool, ToolCreateRequest, ToolUpsertRequest, UpdateScheduledTaskRequest, CreatedApiKey, WorkflowRequest, WorkflowResponse } from "./types.js";
2
2
  export { BaoBoxError } from "./errors.js";
3
3
  export type * from "./types.js";
4
4
  export declare class BaoBoxClient {
5
5
  private readonly endpoint;
6
6
  private readonly apiKey;
7
+ private readonly adminSecret;
7
8
  private readonly fetch;
8
9
  private readonly timeoutMs;
10
+ readonly health: {
11
+ get: () => Promise<HealthResponse>;
12
+ };
9
13
  readonly admin: {
14
+ keys: {
15
+ list: () => Promise<ApiKey[]>;
16
+ create: (req: CreateApiKeyRequest) => Promise<CreatedApiKey>;
17
+ delete: (id: string) => Promise<DeleteResult>;
18
+ };
19
+ stats: {
20
+ get: (req?: {
21
+ since?: string;
22
+ }) => Promise<AdminStats>;
23
+ };
24
+ logs: {
25
+ list: (req?: {
26
+ limit?: number;
27
+ }) => Promise<CallLogRow[]>;
28
+ };
29
+ tasks: {
30
+ list: () => Promise<ScheduledTask[]>;
31
+ create: (req: CreateScheduledTaskRequest) => Promise<ScheduledTask | null>;
32
+ update: (id: string, req: UpdateScheduledTaskRequest) => Promise<ScheduledTask | null>;
33
+ delete: (id: string) => Promise<DeleteResult>;
34
+ };
10
35
  skills: {
11
36
  upsert: (req: SkillUpsertRequest) => Promise<Skill>;
12
37
  };
@@ -15,21 +40,113 @@ export declare class BaoBoxClient {
15
40
  };
16
41
  };
17
42
  readonly sessions: {
18
- create: (req: {
19
- skillId: string;
20
- }) => Promise<Session>;
43
+ create: (req?: SessionCreateRequest) => Promise<Session>;
44
+ get: (sessionId: string) => Promise<Session>;
21
45
  messages: (sessionId: string) => Promise<SessionMessage[]>;
46
+ timeline: (sessionId: string) => Promise<SessionTimeline>;
47
+ delete: (sessionId: string) => Promise<DeleteResult>;
48
+ };
49
+ readonly skills: {
50
+ list: () => Promise<Skill[]>;
51
+ get: (skillId: string) => Promise<SkillWithFiles>;
52
+ create: (req: SkillCreateRequest) => Promise<Skill>;
53
+ update: (skillId: string, req: SkillUpdateRequest) => Promise<Skill>;
54
+ save: (req: SkillUpsertRequest) => Promise<Skill>;
55
+ import: (req: SkillImportRequest) => Promise<Skill>;
56
+ delete: (skillId: string) => Promise<DeleteResult>;
57
+ files: {
58
+ list: (skillId: string) => Promise<SkillFileSummary[]>;
59
+ get: (skillId: string, path: string) => Promise<SkillFile>;
60
+ set: (skillId: string, path: string, req: SetSkillFileRequest) => Promise<SetSkillFileResult>;
61
+ delete: (skillId: string, path: string) => Promise<DeleteResult>;
62
+ };
63
+ };
64
+ readonly tools: {
65
+ list: () => Promise<Tool[]>;
66
+ get: (toolId: string) => Promise<Tool>;
67
+ create: (req: ToolCreateRequest) => Promise<Tool>;
68
+ delete: (toolId: string) => Promise<DeleteResult>;
69
+ skills: {
70
+ list: (skillId: string) => Promise<Tool[]>;
71
+ attach: (skillId: string, toolId: string) => Promise<AttachToolResult>;
72
+ detach: (skillId: string, toolId: string) => Promise<DetachToolResult>;
73
+ };
74
+ secrets: {
75
+ list: (skillId: string) => Promise<SkillSecretSummary[]>;
76
+ set: (skillId: string, req: SetSkillSecretRequest) => Promise<SetSkillSecretResult>;
77
+ delete: (skillId: string, key: string) => Promise<DeleteResult>;
78
+ };
79
+ };
80
+ readonly eval: {
81
+ tests: {
82
+ list: (skillId: string) => Promise<EvalCase[]>;
83
+ create: (skillId: string, req: CreateEvalCaseRequest) => Promise<EvalCase>;
84
+ delete: (skillId: string, testId: string) => Promise<DeleteResult>;
85
+ };
86
+ run: (req: RunEvalRequest) => Promise<EvalRunExecution>;
87
+ runs: {
88
+ get: (runId: string) => Promise<EvalRunWithResults>;
89
+ };
90
+ stats: (req?: EvalStatsRequest) => Promise<EvalStats>;
91
+ failures: (req?: EvalFailuresRequest) => Promise<EvalFailureRow[]>;
92
+ compare: (req: EvalCompareRequest) => Promise<EvalCompare>;
22
93
  };
23
94
  readonly events: {
24
95
  list: (req: EventListRequest) => Promise<Event[]>;
25
96
  };
26
97
  constructor(opts: BaoBoxClientOptions);
27
98
  chat(req: ChatRequest): Promise<ChatResponse>;
99
+ workflow(req: WorkflowRequest): Promise<WorkflowResponse>;
100
+ private getHealth;
28
101
  private createSession;
102
+ private getSession;
29
103
  private listMessages;
30
- private upsertSkill;
31
- private upsertTool;
104
+ private getSessionTimeline;
105
+ private deleteSession;
106
+ private listSkills;
107
+ private getSkill;
108
+ private createSkill;
109
+ private updateSkill;
110
+ private saveSkill;
111
+ private importSkill;
112
+ private deleteSkill;
113
+ private listSkillFiles;
114
+ private getSkillFile;
115
+ private setSkillFile;
116
+ private deleteSkillFile;
117
+ private listTools;
118
+ private getTool;
119
+ private createTool;
120
+ private deleteTool;
121
+ private listSkillTools;
122
+ private attachToolToSkill;
123
+ private detachToolFromSkill;
124
+ private listSkillSecrets;
125
+ private setSkillSecret;
126
+ private deleteSkillSecret;
127
+ private listApiKeys;
128
+ private createApiKey;
129
+ private deleteApiKey;
130
+ private getAdminStats;
131
+ private listAdminLogs;
132
+ private listScheduledTasks;
133
+ private createScheduledTask;
134
+ private updateScheduledTask;
135
+ private deleteScheduledTask;
136
+ private listEvalTests;
137
+ private createEvalTest;
138
+ private deleteEvalTest;
139
+ private runEval;
140
+ private getEvalRun;
141
+ private getEvalStats;
142
+ private listEvalFailures;
143
+ private compareEvalVersions;
32
144
  private listEvents;
145
+ private syncSkillTools;
146
+ private requestNoAuth;
147
+ private requestApi;
148
+ private requestAdmin;
33
149
  private request;
150
+ private getAuthHeaders;
34
151
  }
35
152
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,KAAK,EACL,gBAAgB,EAEhB,OAAO,EACP,cAAc,EACd,KAAK,EACL,mBAAmB,EACnB,kBAAkB,EAClB,IAAI,EACJ,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,mBAAmB,YAAY,CAAC;AAIhC,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAKnC,SAAgB,KAAK,EAAE;QACrB,MAAM,EAAE;YAAE,MAAM,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;SAAE,CAAC;QAChE,KAAK,EAAE;YAAE,MAAM,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;SAAE,CAAC;KAC9D,CAAC;IACF,SAAgB,QAAQ,EAAE;QACxB,MAAM,EAAE,CAAC,GAAG,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACvD,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;KAC5D,CAAC;IACF,SAAgB,MAAM,EAAE;QACtB,IAAI,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;KACnD,CAAC;gBAEU,IAAI,EAAE,mBAAmB;IAkC/B,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;YAwBrC,aAAa;YAiBb,YAAY;YAuBZ,WAAW;YAsCX,UAAU;YA6BV,UAAU;YAkCV,OAAO;CAoFtB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}