@deepagents/text2sql 0.12.1 → 0.13.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.
@@ -19,9 +19,15 @@ export interface ResultToolsOptions {
19
19
  * The agent sees only one tool: `bash`
20
20
  * SQL is executed via: sql run "SELECT ..."
21
21
  *
22
- * Dual-level artifact storage:
23
- * - `/results/` → `./artifacts/{chatId}/{messageId}/results/` (current turn, write)
24
- * - `/artifacts/` → `./artifacts/{chatId}/` (all turns, browse previous)
22
+ * Artifact storage:
23
+ * - `/results/` → `./artifacts/{chatId}/{messageId}/results/` (current turn, isolated)
24
+ * - `/artifacts/` → `./artifacts/{chatId}/` (shared across turns)
25
+ *
26
+ * SQL results are written to both locations:
27
+ * 1. Isolated: `/results/{uuid}.json` for per-turn organization
28
+ * 2. Shared: `/artifacts/{uuid}.json` for cross-turn access
29
+ *
30
+ * The returned path is `/artifacts/{uuid}.json` which works in any turn.
25
31
  *
26
32
  * @param options - Configuration options
27
33
  * @param options.adapter - Database adapter for SQL execution
@@ -1 +1 @@
1
- {"version":3,"file":"result-tools.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/result-tools.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAwKtD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB;;;;;GA4DlE"}
1
+ {"version":3,"file":"result-tools.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/result-tools.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAsKtD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB;;;;;GA0DlE"}
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/lib/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAarB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;CACzB;AA0ID,wBAAgB,UAAU,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,EAAE,CAuQ5E"}
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/lib/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAarB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;CACzB;AAgJD,wBAAgB,UAAU,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,EAAE,CA+R5E"}
package/dist/lib/sql.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { type UIMessage } from 'ai';
1
+ import { type StreamTextTransform, type ToolSet, type UIMessage } from 'ai';
2
2
  import { type AgentModel } from '@deepagents/agent';
3
- import { type ContextFragment, type ContextStore } from '@deepagents/context';
3
+ import { ContextEngine, type ContextFragment } from '@deepagents/context';
4
4
  import type { Adapter } from './adapters/adapter.ts';
5
5
  import { type RenderingTools } from './agents/text2sql.agent.ts';
6
6
  import { type TeachingsOptions } from './instructions.ts';
@@ -9,11 +9,11 @@ export declare class Text2Sql {
9
9
  #private;
10
10
  constructor(config: {
11
11
  adapter: Adapter;
12
- store: ContextStore;
12
+ context: (...fragments: ContextFragment[]) => ContextEngine;
13
13
  version: string;
14
14
  tools?: RenderingTools;
15
- instructions?: ContextFragment[];
16
15
  model: AgentModel;
16
+ transform?: StreamTextTransform<ToolSet> | StreamTextTransform<ToolSet>[];
17
17
  /**
18
18
  * Configure teachings behavior
19
19
  * @see TeachingsOptions
@@ -46,17 +46,7 @@ export declare class Text2Sql {
46
46
  * );
47
47
  */
48
48
  toPairs<T extends PairProducer>(factory: (adapter: Adapter) => T): Promise<ExtractedPair[]>;
49
- chat(messages: UIMessage[], params: {
50
- chatId: string;
51
- userId: string;
52
- }): Promise<import("ai").AsyncIterableStream<import("ai").InferUIMessageChunk<UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>>>>;
53
- /**
54
- * Developer chat interface - power-user mode for SQL generation.
55
- * Uses db_query tool for direct SQL execution (LLM writes SQL).
56
- */
57
- developer(messages: UIMessage[], params: {
58
- chatId: string;
59
- userId: string;
60
- }): Promise<import("ai").AsyncIterableStream<import("ai").InferUIMessageChunk<UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>>>>;
49
+ chat(messages: UIMessage[]): Promise<import("ai").AsyncIterableStream<import("ai").InferUIMessageChunk<UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>>>>;
50
+ developer(messages: UIMessage[]): Promise<import("ai").AsyncIterableStream<import("ai").InferUIMessageChunk<UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>>>>;
61
51
  }
62
52
  //# sourceMappingURL=sql.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/lib/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EAEf,MAAM,IAAI,CAAC;AAEZ,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,YAAY,EASlB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,KAAK,gBAAgB,EAAc,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE7E,qBAAa,QAAQ;;gBAUP,MAAM,EAAE;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,YAAY,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,cAAc,CAAC;QACvB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;QACjC,KAAK,EAAE,UAAU,CAAC;QAClB;;;WAGG;QACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;KACrC;IAgBY,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAclD;;;OAGG;IACU,KAAK,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAUhD;;;;;;;;;;;;;;;;;;OAkBG;IACU,OAAO,CAAC,CAAC,SAAS,YAAY,EACzC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,CAAC,GAC/B,OAAO,CAAC,aAAa,EAAE,CAAC;IA6Bd,IAAI,CACf,QAAQ,EAAE,SAAS,EAAE,EACrB,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB;IAsFH;;;OAGG;IACU,SAAS,CACpB,QAAQ,EAAE,SAAS,EAAE,EACrB,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB;CA0DJ"}
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/lib/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,mBAAmB,EAExB,KAAK,OAAO,EACZ,KAAK,SAAS,EAEf,MAAM,IAAI,CAAC;AAEZ,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,aAAa,EACb,KAAK,eAAe,EAOrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,KAAK,gBAAgB,EAAc,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE7E,qBAAa,QAAQ;;gBAWP,MAAM,EAAE;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,CAAC,GAAG,SAAS,EAAE,eAAe,EAAE,KAAK,aAAa,CAAC;QAC5D,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,cAAc,CAAC;QACvB,KAAK,EAAE,UAAU,CAAC;QAClB,SAAS,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,GAAG,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1E;;;WAGG;QACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;KACrC;IAcY,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYlD;;;OAGG;IACU,KAAK,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAUhD;;;;;;;;;;;;;;;;;;OAkBG;IACU,OAAO,CAAC,CAAC,SAAS,YAAY,EACzC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,CAAC,GAC/B,OAAO,CAAC,aAAa,EAAE,CAAC;IA6Bd,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE;IA2D1B,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE;CAqD7C"}
@@ -175,6 +175,7 @@ import dedent from "dedent";
175
175
  import z from "zod";
176
176
 
177
177
  // packages/context/dist/index.js
178
+ import { mergeWith } from "lodash-es";
178
179
  import { encode } from "gpt-tokenizer";
179
180
  import { generateId } from "ai";
180
181
  import pluralize from "pluralize";
@@ -738,6 +739,8 @@ var ContextEngine = class {
738
739
  #branch = null;
739
740
  #chatData = null;
740
741
  #initialized = false;
742
+ /** Initial metadata to merge on first initialization */
743
+ #initialMetadata;
741
744
  constructor(options) {
742
745
  if (!options.chatId) {
743
746
  throw new Error("chatId is required");
@@ -749,6 +752,7 @@ var ContextEngine = class {
749
752
  this.#chatId = options.chatId;
750
753
  this.#userId = options.userId;
751
754
  this.#branchName = "main";
755
+ this.#initialMetadata = options.metadata;
752
756
  }
753
757
  /**
754
758
  * Initialize the chat and branch if they don't exist.
@@ -761,6 +765,15 @@ var ContextEngine = class {
761
765
  id: this.#chatId,
762
766
  userId: this.#userId
763
767
  });
768
+ if (this.#initialMetadata) {
769
+ this.#chatData = await this.#store.updateChat(this.#chatId, {
770
+ metadata: {
771
+ ...this.#chatData.metadata,
772
+ ...this.#initialMetadata
773
+ }
774
+ });
775
+ this.#initialMetadata = void 0;
776
+ }
764
777
  this.#branch = await this.#store.getActiveBranch(this.#chatId);
765
778
  this.#initialized = true;
766
779
  }
@@ -1234,6 +1247,36 @@ var ContextEngine = class {
1234
1247
  }
1235
1248
  this.#chatData = await this.#store.updateChat(this.#chatId, storeUpdates);
1236
1249
  }
1250
+ /**
1251
+ * Track token usage for the current chat.
1252
+ * Accumulates usage metrics in chat.metadata.usage.
1253
+ *
1254
+ * @param usage - Token usage from AI SDK (LanguageModelUsage)
1255
+ *
1256
+ * @example
1257
+ * ```ts
1258
+ * // In onFinish callback
1259
+ * const usage = await result.totalUsage;
1260
+ * await context.trackUsage(usage);
1261
+ * ```
1262
+ */
1263
+ async trackUsage(usage) {
1264
+ await this.#ensureInitialized();
1265
+ const freshChatData = await this.#store.getChat(this.#chatId);
1266
+ const currentUsage = freshChatData?.metadata?.usage ?? {};
1267
+ const updatedUsage = mergeWith(
1268
+ {},
1269
+ currentUsage,
1270
+ usage,
1271
+ (a, b) => typeof a === "number" || typeof b === "number" ? (a ?? 0) + (b ?? 0) : void 0
1272
+ );
1273
+ this.#chatData = await this.#store.updateChat(this.#chatId, {
1274
+ metadata: {
1275
+ ...freshChatData?.metadata,
1276
+ usage: updatedUsage
1277
+ }
1278
+ });
1279
+ }
1237
1280
  /**
1238
1281
  * Consolidate context fragments (no-op for now).
1239
1282
  *
@@ -1609,12 +1652,20 @@ var SqliteContextStore = class extends ContextStore {
1609
1652
  }
1610
1653
  async listChats(options) {
1611
1654
  const params = [];
1612
- let whereClause = "";
1655
+ const whereClauses = [];
1613
1656
  let limitClause = "";
1614
1657
  if (options?.userId) {
1615
- whereClause = "WHERE c.userId = ?";
1658
+ whereClauses.push("c.userId = ?");
1616
1659
  params.push(options.userId);
1617
1660
  }
1661
+ if (options?.metadata) {
1662
+ whereClauses.push(`json_extract(c.metadata, '$.' || ?) = ?`);
1663
+ params.push(options.metadata.key);
1664
+ params.push(
1665
+ typeof options.metadata.value === "boolean" ? options.metadata.value ? 1 : 0 : options.metadata.value
1666
+ );
1667
+ }
1668
+ const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(" AND ")}` : "";
1618
1669
  if (options?.limit !== void 0) {
1619
1670
  limitClause = " LIMIT ?";
1620
1671
  params.push(options.limit);
@@ -1628,6 +1679,7 @@ var SqliteContextStore = class extends ContextStore {
1628
1679
  c.id,
1629
1680
  c.userId,
1630
1681
  c.title,
1682
+ c.metadata,
1631
1683
  c.createdAt,
1632
1684
  c.updatedAt,
1633
1685
  COUNT(DISTINCT m.id) as messageCount,
@@ -1643,6 +1695,7 @@ var SqliteContextStore = class extends ContextStore {
1643
1695
  id: row.id,
1644
1696
  userId: row.userId,
1645
1697
  title: row.title ?? void 0,
1698
+ metadata: row.metadata ? JSON.parse(row.metadata) : void 0,
1646
1699
  messageCount: row.messageCount,
1647
1700
  branchCount: row.branchCount,
1648
1701
  createdAt: row.createdAt,
@@ -1672,11 +1725,17 @@ var SqliteContextStore = class extends ContextStore {
1672
1725
  // Message Operations (Graph Nodes)
1673
1726
  // ==========================================================================
1674
1727
  async addMessage(message2) {
1675
- const existingParent = message2.parentId === message2.id ? this.#db.prepare("SELECT parentId FROM messages WHERE id = ?").get(message2.id) : void 0;
1676
- const parentId = message2.parentId === message2.id ? existingParent?.parentId ?? null : message2.parentId;
1677
1728
  this.#db.prepare(
1678
1729
  `INSERT INTO messages (id, chatId, parentId, name, type, data, createdAt)
1679
- VALUES (?, ?, ?, ?, ?, ?, ?)
1730
+ VALUES (
1731
+ ?1,
1732
+ ?2,
1733
+ CASE WHEN ?3 = ?1 THEN (SELECT parentId FROM messages WHERE id = ?1) ELSE ?3 END,
1734
+ ?4,
1735
+ ?5,
1736
+ ?6,
1737
+ ?7
1738
+ )
1680
1739
  ON CONFLICT(id) DO UPDATE SET
1681
1740
  name = excluded.name,
1682
1741
  type = excluded.type,
@@ -1684,7 +1743,7 @@ var SqliteContextStore = class extends ContextStore {
1684
1743
  ).run(
1685
1744
  message2.id,
1686
1745
  message2.chatId,
1687
- parentId,
1746
+ message2.parentId,
1688
1747
  message2.name,
1689
1748
  message2.type ?? null,
1690
1749
  JSON.stringify(message2.data),