@deepagents/text2sql 0.12.0 → 0.12.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.
@@ -1,3 +1,4 @@
1
+ import type { SkillPathMapping } from '@deepagents/context';
1
2
  import type { Adapter } from '../adapters/adapter.ts';
2
3
  /**
3
4
  * Options for creating result tools.
@@ -9,6 +10,8 @@ export interface ResultToolsOptions {
9
10
  chatId: string;
10
11
  /** Message ID for turn-level artifact isolation */
11
12
  messageId: string;
13
+ /** Skill mounts mapping host paths to sandbox paths */
14
+ skillMounts?: SkillPathMapping[];
12
15
  }
13
16
  /**
14
17
  * Creates bash tool with integrated sql command.
@@ -1 +1 @@
1
- {"version":3,"file":"result-tools.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/result-tools.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AA4KtD;;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;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB;;;;;GAkDlE"}
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"}
@@ -11,7 +11,7 @@ export interface ToSqlOptions {
11
11
  /** Instructions/teachings to include */
12
12
  instructions: ContextFragment[];
13
13
  /** Optional model override */
14
- model?: AgentModel;
14
+ model: AgentModel;
15
15
  /** Maximum retry attempts on validation failure (default: 3) */
16
16
  maxRetries?: number;
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sql.agent.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/sql.agent.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAEL,KAAK,eAAe,EAMrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,wCAAwC;IACxC,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,8BAA8B;IAC9B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAiBD,QAAA,MAAM,MAAM,eAA+B,CAAC;AAC5C;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;gBACH,OAAO,EAAE,MAAM;IAK3B,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB;CAG/D;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;IAI3B,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB;CAGjE;AAED,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAgFvE"}
1
+ {"version":3,"file":"sql.agent.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/sql.agent.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAEL,KAAK,eAAe,EAKrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,wCAAwC;IACxC,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,8BAA8B;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAiBD,QAAA,MAAM,MAAM,eAA+B,CAAC;AAC5C;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;gBACH,OAAO,EAAE,MAAM;IAK3B,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB;CAG/D;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;IAI3B,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB;CAGjE;AAED,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAuFvE"}
@@ -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;IA2EH;;;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,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"}
@@ -361,6 +361,23 @@ function user(content) {
361
361
  }
362
362
  };
363
363
  }
364
+ function assistant(message2) {
365
+ return {
366
+ id: message2.id,
367
+ name: "assistant",
368
+ data: "content",
369
+ type: "message",
370
+ persist: true,
371
+ codec: {
372
+ decode() {
373
+ return message2;
374
+ },
375
+ encode() {
376
+ return message2;
377
+ }
378
+ }
379
+ };
380
+ }
364
381
  function message(content) {
365
382
  const message2 = typeof content === "string" ? {
366
383
  id: generateId(),
@@ -369,7 +386,7 @@ function message(content) {
369
386
  } : content;
370
387
  return {
371
388
  id: message2.id,
372
- name: "message",
389
+ name: message2.role,
373
390
  data: "content",
374
391
  type: "message",
375
392
  persist: true,
@@ -383,6 +400,18 @@ function message(content) {
383
400
  }
384
401
  };
385
402
  }
403
+ function assistantText(content, options) {
404
+ const id = options?.id ?? crypto.randomUUID();
405
+ return assistant({
406
+ id,
407
+ role: "assistant",
408
+ parts: [{ type: "text", text: content }]
409
+ });
410
+ }
411
+ var LAZY_ID = Symbol("lazy-id");
412
+ function isLazyFragment(fragment2) {
413
+ return LAZY_ID in fragment2;
414
+ }
386
415
  var ContextRenderer = class {
387
416
  options;
388
417
  constructor(options = {}) {
@@ -879,6 +908,12 @@ var ContextEngine = class {
879
908
  if (this.#pendingMessages.length === 0) {
880
909
  return;
881
910
  }
911
+ for (let i = 0; i < this.#pendingMessages.length; i++) {
912
+ const fragment2 = this.#pendingMessages[i];
913
+ if (isLazyFragment(fragment2)) {
914
+ this.#pendingMessages[i] = await this.#resolveLazyFragment(fragment2);
915
+ }
916
+ }
882
917
  let parentId = this.#branch.headMessageId;
883
918
  const now = Date.now();
884
919
  for (const fragment2 of this.#pendingMessages) {
@@ -898,6 +933,39 @@ var ContextEngine = class {
898
933
  this.#branch.headMessageId = parentId;
899
934
  this.#pendingMessages = [];
900
935
  }
936
+ /**
937
+ * Resolve a lazy fragment by finding the appropriate ID.
938
+ */
939
+ async #resolveLazyFragment(fragment2) {
940
+ const lazy = fragment2[LAZY_ID];
941
+ if (lazy.type === "last-assistant") {
942
+ const lastId = await this.#getLastAssistantId();
943
+ return assistantText(lazy.content, { id: lastId ?? crypto.randomUUID() });
944
+ }
945
+ throw new Error(`Unknown lazy fragment type: ${lazy.type}`);
946
+ }
947
+ /**
948
+ * Find the most recent assistant message ID (pending or persisted).
949
+ */
950
+ async #getLastAssistantId() {
951
+ for (let i = this.#pendingMessages.length - 1; i >= 0; i--) {
952
+ const msg = this.#pendingMessages[i];
953
+ if (msg.name === "assistant" && !isLazyFragment(msg)) {
954
+ return msg.id;
955
+ }
956
+ }
957
+ if (this.#branch?.headMessageId) {
958
+ const chain = await this.#store.getMessageChain(
959
+ this.#branch.headMessageId
960
+ );
961
+ for (let i = chain.length - 1; i >= 0; i--) {
962
+ if (chain[i].name === "assistant") {
963
+ return chain[i].id;
964
+ }
965
+ }
966
+ }
967
+ return void 0;
968
+ }
901
969
  /**
902
970
  * Estimate token count and cost for the full context.
903
971
  *
@@ -1177,6 +1245,35 @@ var ContextEngine = class {
1177
1245
  consolidate() {
1178
1246
  return void 0;
1179
1247
  }
1248
+ /**
1249
+ * Extract skill path mappings from available_skills fragments.
1250
+ * Returns array of { host, sandbox } for mounting in sandbox filesystem.
1251
+ *
1252
+ * Reads the original `paths` configuration stored in fragment metadata
1253
+ * by the skills() fragment helper.
1254
+ *
1255
+ * @example
1256
+ * ```ts
1257
+ * const context = new ContextEngine({ store, chatId, userId })
1258
+ * .set(skills({ paths: [{ host: './skills', sandbox: '/skills' }] }));
1259
+ *
1260
+ * const mounts = context.getSkillMounts();
1261
+ * // [{ host: './skills', sandbox: '/skills' }]
1262
+ * ```
1263
+ */
1264
+ getSkillMounts() {
1265
+ const mounts = [];
1266
+ for (const fragment2 of this.#fragments) {
1267
+ if (fragment2.name === "available_skills" && fragment2.metadata && Array.isArray(fragment2.metadata.paths)) {
1268
+ for (const mapping of fragment2.metadata.paths) {
1269
+ if (typeof mapping === "object" && mapping !== null && typeof mapping.host === "string" && typeof mapping.sandbox === "string") {
1270
+ mounts.push({ host: mapping.host, sandbox: mapping.sandbox });
1271
+ }
1272
+ }
1273
+ }
1274
+ }
1275
+ return mounts;
1276
+ }
1180
1277
  /**
1181
1278
  * Inspect the full context state for debugging.
1182
1279
  * Returns a JSON-serializable object with context information.
@@ -1575,18 +1672,19 @@ var SqliteContextStore = class extends ContextStore {
1575
1672
  // Message Operations (Graph Nodes)
1576
1673
  // ==========================================================================
1577
1674
  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;
1578
1677
  this.#db.prepare(
1579
1678
  `INSERT INTO messages (id, chatId, parentId, name, type, data, createdAt)
1580
1679
  VALUES (?, ?, ?, ?, ?, ?, ?)
1581
1680
  ON CONFLICT(id) DO UPDATE SET
1582
- parentId = excluded.parentId,
1583
1681
  name = excluded.name,
1584
1682
  type = excluded.type,
1585
1683
  data = excluded.data`
1586
1684
  ).run(
1587
1685
  message2.id,
1588
1686
  message2.chatId,
1589
- message2.parentId,
1687
+ parentId,
1590
1688
  message2.name,
1591
1689
  message2.type ?? null,
1592
1690
  JSON.stringify(message2.data),
@@ -2106,9 +2204,9 @@ var BaseContextualExtractor = class extends PairProducer {
2106
2204
  conversationContext: snapshot
2107
2205
  });
2108
2206
  }
2109
- const assistantText = getMessageText(message2);
2110
- if (assistantText) {
2111
- this.context.push(`Assistant: ${assistantText}`);
2207
+ const assistantText2 = getMessageText(message2);
2208
+ if (assistantText2) {
2209
+ this.context.push(`Assistant: ${assistantText2}`);
2112
2210
  }
2113
2211
  }
2114
2212
  /**
@@ -2598,7 +2696,9 @@ import {
2598
2696
  NoContentGeneratedError,
2599
2697
  NoObjectGeneratedError,
2600
2698
  NoOutputGeneratedError,
2601
- TypeValidationError
2699
+ TypeValidationError,
2700
+ defaultSettingsMiddleware,
2701
+ wrapLanguageModel
2602
2702
  } from "ai";
2603
2703
  import { Console } from "node:console";
2604
2704
  import { createWriteStream } from "node:fs";
@@ -2610,6 +2710,7 @@ var logger = new Console({
2610
2710
  stderr: createWriteStream("./sql-agent-error.log", { flags: "a" }),
2611
2711
  inspectOptions: { depth: null }
2612
2712
  });
2713
+ var RETRY_TEMPERATURES = [0, 0.2, 0.3];
2613
2714
  function extractSql(output) {
2614
2715
  const match = output.match(/```sql\n?([\s\S]*?)```/);
2615
2716
  return match ? match[1].trim() : output.trim();
@@ -2663,8 +2764,14 @@ async function toSql(options) {
2663
2764
  } else {
2664
2765
  context.set(user(options.input));
2665
2766
  }
2767
+ const temperature = RETRY_TEMPERATURES[attemptNumber - 1] ?? RETRY_TEMPERATURES[RETRY_TEMPERATURES.length - 1];
2768
+ const baseModel = options.model ?? groq6("openai/gpt-oss-20b");
2769
+ const model = wrapLanguageModel({
2770
+ model: baseModel,
2771
+ middleware: defaultSettingsMiddleware({ settings: { temperature } })
2772
+ });
2666
2773
  const sqlOutput = structuredOutput({
2667
- model: options.model ?? groq6("openai/gpt-oss-20b"),
2774
+ model,
2668
2775
  context,
2669
2776
  schema: z5.union([
2670
2777
  z5.object({