@agent-native/core 0.49.24 → 0.49.26

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.
Files changed (64) hide show
  1. package/dist/agent/production-agent.d.ts.map +1 -1
  2. package/dist/agent/production-agent.js +8 -1
  3. package/dist/agent/production-agent.js.map +1 -1
  4. package/dist/cli/recap.d.ts.map +1 -1
  5. package/dist/cli/recap.js +43 -11
  6. package/dist/cli/recap.js.map +1 -1
  7. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  8. package/dist/client/agent-chat-adapter.js +2 -1
  9. package/dist/client/agent-chat-adapter.js.map +1 -1
  10. package/dist/client/blocks/library/AnnotatedCodeBlock.js +7 -7
  11. package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
  12. package/dist/client/blocks/library/DiffBlock.js +3 -3
  13. package/dist/client/blocks/library/DiffBlock.js.map +1 -1
  14. package/dist/client/blocks/library/annotation-rail.d.ts +4 -3
  15. package/dist/client/blocks/library/annotation-rail.d.ts.map +1 -1
  16. package/dist/client/blocks/library/annotation-rail.js +16 -9
  17. package/dist/client/blocks/library/annotation-rail.js.map +1 -1
  18. package/dist/client/blocks/types.d.ts +2 -2
  19. package/dist/client/blocks/types.js.map +1 -1
  20. package/dist/coding-tools/run-code.d.ts.map +1 -1
  21. package/dist/coding-tools/run-code.js +198 -15
  22. package/dist/coding-tools/run-code.js.map +1 -1
  23. package/dist/extensions/fetch-tool.js +1 -1
  24. package/dist/extensions/fetch-tool.js.map +1 -1
  25. package/dist/mcp/build-server.d.ts.map +1 -1
  26. package/dist/mcp/build-server.js +1 -0
  27. package/dist/mcp/build-server.js.map +1 -1
  28. package/dist/mcp/builtin-tools.d.ts +8 -4
  29. package/dist/mcp/builtin-tools.d.ts.map +1 -1
  30. package/dist/mcp/builtin-tools.js +247 -13
  31. package/dist/mcp/builtin-tools.js.map +1 -1
  32. package/dist/provider-api/actions/query-staged-dataset.d.ts.map +1 -1
  33. package/dist/provider-api/actions/query-staged-dataset.js +1 -0
  34. package/dist/provider-api/actions/query-staged-dataset.js.map +1 -1
  35. package/dist/provider-api/index.d.ts +15 -4
  36. package/dist/provider-api/index.d.ts.map +1 -1
  37. package/dist/provider-api/index.js +191 -43
  38. package/dist/provider-api/index.js.map +1 -1
  39. package/dist/provider-api/staged-datasets-store.d.ts.map +1 -1
  40. package/dist/provider-api/staged-datasets-store.js +29 -6
  41. package/dist/provider-api/staged-datasets-store.js.map +1 -1
  42. package/dist/provider-api/staging.d.ts +6 -1
  43. package/dist/provider-api/staging.d.ts.map +1 -1
  44. package/dist/provider-api/staging.js +35 -6
  45. package/dist/provider-api/staging.js.map +1 -1
  46. package/dist/server/agent-chat-plugin.d.ts +1 -1
  47. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  48. package/dist/server/agent-chat-plugin.js +157 -80
  49. package/dist/server/agent-chat-plugin.js.map +1 -1
  50. package/dist/server/prompts/shared-rules.d.ts +1 -1
  51. package/dist/server/prompts/shared-rules.d.ts.map +1 -1
  52. package/dist/server/prompts/shared-rules.js +5 -7
  53. package/dist/server/prompts/shared-rules.js.map +1 -1
  54. package/dist/server/schema-prompt.js +1 -1
  55. package/dist/server/schema-prompt.js.map +1 -1
  56. package/dist/templates/default/.agents/skills/actions/SKILL.md +37 -9
  57. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +7 -1
  58. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +37 -9
  59. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +7 -1
  60. package/package.json +1 -1
  61. package/src/templates/default/.agents/skills/actions/SKILL.md +37 -9
  62. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +7 -1
  63. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +37 -9
  64. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +7 -1
@@ -1 +1 @@
1
- {"version":3,"file":"staged-datasets-store.d.ts","sourceRoot":"","sources":["../../src/provider-api/staged-datasets-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,eAAO,MAAM,gBAAgB,SAAU,CAAC;AACxC,eAAO,MAAM,iBAAiB,QAAmB,CAAC;AAwDlD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAUD,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,CAMvE;AA4BD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CAmH5B;AAMD;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAiBrC;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CASpC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAQ/B;AAMD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBnB;AAqCD,mDAAmD;AACnD,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
1
+ {"version":3,"file":"staged-datasets-store.d.ts","sourceRoot":"","sources":["../../src/provider-api/staged-datasets-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,eAAO,MAAM,gBAAgB,SAAU,CAAC;AACxC,eAAO,MAAM,iBAAiB,QAAmB,CAAC;AA+ElD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAUD,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,CAMvE;AA4BD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CAmH5B;AAMD;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAiBrC;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CASpC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAQ/B;AAMD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBnB;AAqCD,mDAAmD;AACnD,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
@@ -12,7 +12,7 @@
12
12
  * Scoping: datasets are owned by (app_id, owner_email) so different apps or
13
13
  * different users never share or cross-read each other's scratch data.
14
14
  */
15
- import { getDbExec, isPostgres } from "../db/client.js";
15
+ import { getDbExec, intType, isPostgres } from "../db/client.js";
16
16
  // ---------------------------------------------------------------------------
17
17
  // Caps
18
18
  // ---------------------------------------------------------------------------
@@ -26,6 +26,7 @@ async function ensureTables() {
26
26
  if (!_initPromise) {
27
27
  _initPromise = (async () => {
28
28
  const db = getDbExec();
29
+ const integerType = intType();
29
30
  await db.execute(`
30
31
  CREATE TABLE IF NOT EXISTS staged_datasets (
31
32
  id TEXT NOT NULL,
@@ -33,21 +34,24 @@ async function ensureTables() {
33
34
  owner_email TEXT NOT NULL,
34
35
  name TEXT NOT NULL,
35
36
  columns TEXT NOT NULL,
36
- row_count INTEGER NOT NULL DEFAULT 0,
37
- byte_size INTEGER NOT NULL DEFAULT 0,
38
- created_at INTEGER NOT NULL,
39
- updated_at INTEGER NOT NULL,
37
+ row_count ${integerType} NOT NULL DEFAULT 0,
38
+ byte_size ${integerType} NOT NULL DEFAULT 0,
39
+ created_at ${integerType} NOT NULL,
40
+ updated_at ${integerType} NOT NULL,
40
41
  PRIMARY KEY (id)
41
42
  )
42
43
  `);
43
44
  await db.execute(`
44
45
  CREATE TABLE IF NOT EXISTS staged_dataset_rows (
45
46
  dataset_id TEXT NOT NULL,
46
- row_index INTEGER NOT NULL,
47
+ row_index ${integerType} NOT NULL,
47
48
  row_data TEXT NOT NULL,
48
49
  PRIMARY KEY (dataset_id, row_index)
49
50
  )
50
51
  `);
52
+ if (isPostgres()) {
53
+ await widenPostgresIntegerColumns(db);
54
+ }
51
55
  for (const ddl of [
52
56
  `CREATE INDEX IF NOT EXISTS staged_datasets_scope_idx ON staged_datasets (app_id, owner_email)`,
53
57
  `CREATE INDEX IF NOT EXISTS staged_dataset_rows_dataset_idx ON staged_dataset_rows (dataset_id)`,
@@ -66,6 +70,25 @@ async function ensureTables() {
66
70
  }
67
71
  return _initPromise;
68
72
  }
73
+ async function widenPostgresIntegerColumns(db) {
74
+ const statements = [
75
+ `ALTER TABLE staged_datasets ALTER COLUMN row_count TYPE BIGINT USING row_count::bigint`,
76
+ `ALTER TABLE staged_datasets ALTER COLUMN byte_size TYPE BIGINT USING byte_size::bigint`,
77
+ `ALTER TABLE staged_datasets ALTER COLUMN created_at TYPE BIGINT USING created_at::bigint`,
78
+ `ALTER TABLE staged_datasets ALTER COLUMN updated_at TYPE BIGINT USING updated_at::bigint`,
79
+ `ALTER TABLE staged_dataset_rows ALTER COLUMN row_index TYPE BIGINT USING row_index::bigint`,
80
+ ];
81
+ for (const sql of statements) {
82
+ try {
83
+ await db.execute(sql);
84
+ }
85
+ catch {
86
+ // Best-effort compatibility for older deployments. Widening is
87
+ // non-destructive; if a database role cannot ALTER, the later write will
88
+ // still surface the real DB error.
89
+ }
90
+ }
91
+ }
69
92
  // ---------------------------------------------------------------------------
70
93
  // Helpers
71
94
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"staged-datasets-store.js","sourceRoot":"","sources":["../../src/provider-api/staged-datasets-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAe,MAAM,iBAAiB,CAAC;AAErE,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AAE3D,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,IAAI,YAAuC,CAAC;AAE5C,KAAK,UAAU,YAAY;IACzB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;YACvB,MAAM,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;OAahB,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,OAAO,CAAC;;;;;;;OAOhB,CAAC,CAAC;YACH,KAAK,MAAM,GAAG,IAAI;gBAChB,+FAA+F;gBAC/F,gGAAgG;aACjG,EAAE,CAAC;gBACF,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACxB,CAAC;gBAAC,MAAM,CAAC;oBACP,mCAAmC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACjB,YAAY,GAAG,SAAS,CAAC;YACzB,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AA8BD,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,UAAU;IACjB,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACnF,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,IAA+B;IAC3D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,KAAK,UAAU,cAAc,CAAC,KAAa;IACzC,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;QAChC,GAAG,EAAE,mFAAmF;QACxF,IAAI,EAAE,CAAC,KAAK,CAAC;KACd,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,KAAa;IACzC,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;QAChC,GAAG,EAAE,mFAAmF;QACxF,IAAI,EAAE,CAAC,KAAK,CAAC;KACd,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAA6B;IAE7B,MAAM,YAAY,EAAE,CAAC;IACrB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,UAAU,EAAE,CAAC;IAEtC,0CAA0C;IAC1C,IAAI,YAAY,GAA8B,EAAE,CAAC;IACjD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,YAAY,GAAG,MAAM,oBAAoB,CAAC;YACxC,EAAE;YACF,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM;QAC5B,CAAC,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;QACpC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAEjB,+CAA+C;IAC/C,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM;QACvC,CAAC,CAAC,YAAY,CAAC,MAAM;QACrB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;gBAChC,GAAG,EAAE,oDAAoD;gBACzD,IAAI,EAAE,CAAC,EAAE,CAAC;aACX,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,kBAAkB,CAAC;IACvD,IAAI,cAAc,GAAG,UAAU,GAAG,gBAAgB,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CACb,qDAAqD,cAAc,eAAe;YAChF,UAAU,gBAAgB,oDAAoD,CACjF,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAElE,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM;QACzC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;gBAChC,GAAG,EAAE,oDAAoD;gBACzD,IAAI,EAAE,CAAC,EAAE,CAAC;aACX,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,WAAW,GAAG,QAAQ,GAAG,oBAAoB,CAAC;IACpD,IAAI,eAAe,GAAG,WAAW,GAAG,iBAAiB,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CACb,4DAA4D;YAC1D,GAAG,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB;YAClE,iDAAiD,CACpD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM;QACpC,CAAC,CAAC,OAAO,CAAC,OAAO;QACjB,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAE5C,MAAM,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QACvC,yEAAyE;QACzE,8EAA8E;QAC9E,MAAM,EAAE,CAAC,OAAO,CAAC;YACf,GAAG,EAAE,sDAAsD;YAC3D,IAAI,EAAE,CAAC,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,GAAG,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;YAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,EAAE,CAAC,OAAO,CAAC;oBACf,GAAG,EAAE,oFAAoF;oBACzF,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;iBAC5B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,EAAE,CAAC,OAAO,CAAC;YACf,GAAG,EAAE,UAAU,EAAE;gBACf,CAAC,CAAC,+TAA+T;gBACjU,CAAC,CAAC,kKAAkK;YACtK,IAAI,EAAE;gBACJ,EAAE;gBACF,OAAO,CAAC,KAAK;gBACb,OAAO,CAAC,UAAU;gBAClB,OAAO,CAAC,IAAI;gBACZ,WAAW;gBACX,OAAO,CAAC,MAAM;gBACd,QAAQ;gBACR,GAAG;gBACH,GAAG;aACJ;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,EAAE;QACF,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO;QACP,QAAQ,EAAE,OAAO,CAAC,MAAM;QACxB,QAAQ;QACR,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAI1C;IACC,MAAM,YAAY,EAAE,CAAC;IACrB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IACvB,cAAc;IACd,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;QACtC,GAAG,EAAE,gFAAgF;QACrF,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;KACtD,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;QAChC,GAAG,EAAE,sFAAsF;QAC3F,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KACnB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,GAAG,CACb,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAkB,CAA4B,CACnE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAI1C;IACC,MAAM,YAAY,EAAE,CAAC;IACrB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;QAChC,GAAG,EAAE,kKAAkK;QACvK,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;KACtD,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAGxC;IACC,MAAM,YAAY,EAAE,CAAC;IACrB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;QAChC,GAAG,EAAE,gLAAgL;QACrL,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;KAC1C,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAIzC;IACC,MAAM,YAAY,EAAE,CAAC;IACrB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IACvB,cAAc;IACd,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;QACtC,GAAG,EAAE,gFAAgF;QACrF,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;KACtD,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QACtD,MAAM,EAAE,CAAC,OAAO,CAAC;YACf,GAAG,EAAE,sDAAsD;YAC3D,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;SACnB,CAAC,CAAC;QACH,OAAO,EAAE,CAAC,OAAO,CAAC;YAChB,GAAG,EAAE,6EAA6E;YAClF,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;SACtD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,SAAS,CAAC,GAA4B;IAC7C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAY;QACpB,KAAK,EAAE,GAAG,CAAC,MAAgB;QAC3B,UAAU,EAAE,GAAG,CAAC,WAAqB;QACrC,IAAI,EAAE,GAAG,CAAC,IAAc;QACxB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAiB,CAAa;QACtD,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QAC/B,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QACjC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,EAAU,EACV,EAA8B;IAE9B,IAAI,EAAE,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAE9C,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,yBAAyB;IACvC,YAAY,GAAG,SAAS,CAAC;AAC3B,CAAC","sourcesContent":["/**\n * Scratch storage for staged provider-API datasets.\n *\n * Rows are stored as JSON text — no dialect-specific JSON-column types needed.\n * Aggregation is done in TypeScript server-side (portable across Postgres and\n * SQLite) rather than via JSON SQL fragments. See `staged-datasets-aggregate.ts`.\n *\n * Storage caps:\n * - MAX_ROWS_PER_APP: 200 000 rows\n * - MAX_BYTES_PER_APP: 50 MB (approximate, measured as raw JSON text length)\n *\n * Scoping: datasets are owned by (app_id, owner_email) so different apps or\n * different users never share or cross-read each other's scratch data.\n */\n\nimport { getDbExec, isPostgres, type DbExec } from \"../db/client.js\";\n\n// ---------------------------------------------------------------------------\n// Caps\n// ---------------------------------------------------------------------------\nexport const MAX_ROWS_PER_APP = 200_000;\nexport const MAX_BYTES_PER_APP = 50 * 1024 * 1024; // 50 MB\n\n// ---------------------------------------------------------------------------\n// Table initialisation\n// ---------------------------------------------------------------------------\n\nlet _initPromise: Promise<void> | undefined;\n\nasync function ensureTables(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const db = getDbExec();\n await db.execute(`\n CREATE TABLE IF NOT EXISTS staged_datasets (\n id TEXT NOT NULL,\n app_id TEXT NOT NULL,\n owner_email TEXT NOT NULL,\n name TEXT NOT NULL,\n columns TEXT NOT NULL,\n row_count INTEGER NOT NULL DEFAULT 0,\n byte_size INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n PRIMARY KEY (id)\n )\n `);\n await db.execute(`\n CREATE TABLE IF NOT EXISTS staged_dataset_rows (\n dataset_id TEXT NOT NULL,\n row_index INTEGER NOT NULL,\n row_data TEXT NOT NULL,\n PRIMARY KEY (dataset_id, row_index)\n )\n `);\n for (const ddl of [\n `CREATE INDEX IF NOT EXISTS staged_datasets_scope_idx ON staged_datasets (app_id, owner_email)`,\n `CREATE INDEX IF NOT EXISTS staged_dataset_rows_dataset_idx ON staged_dataset_rows (dataset_id)`,\n ]) {\n try {\n await db.execute(ddl);\n } catch {\n // Index already exists — harmless.\n }\n }\n })().catch((err) => {\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface StagedDatasetMeta {\n id: string;\n appId: string;\n ownerEmail: string;\n name: string;\n columns: string[];\n rowCount: number;\n byteSize: number;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface UpsertDatasetOptions {\n id: string;\n appId: string;\n ownerEmail: string;\n name: string;\n /** All rows to store; replaces any existing rows. */\n rows: Record<string, unknown>[];\n columns: string[];\n /** When true, append rows instead of replacing. */\n append?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction generateId(): string {\n return `ds_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** Derive column names from a set of rows (first 20 rows surveyed). */\nexport function deriveColumns(rows: Record<string, unknown>[]): string[] {\n const seen = new Set<string>();\n for (const row of rows.slice(0, 20)) {\n for (const key of Object.keys(row)) seen.add(key);\n }\n return Array.from(seen);\n}\n\n// ---------------------------------------------------------------------------\n// Scope check\n// ---------------------------------------------------------------------------\n\nasync function getAppRowCount(appId: string): Promise<number> {\n const db = getDbExec();\n const { rows } = await db.execute({\n sql: `SELECT COALESCE(SUM(row_count), 0) as total FROM staged_datasets WHERE app_id = ?`,\n args: [appId],\n });\n return Number(rows[0]?.total ?? 0);\n}\n\nasync function getAppByteSize(appId: string): Promise<number> {\n const db = getDbExec();\n const { rows } = await db.execute({\n sql: `SELECT COALESCE(SUM(byte_size), 0) as total FROM staged_datasets WHERE app_id = ?`,\n args: [appId],\n });\n return Number(rows[0]?.total ?? 0);\n}\n\n// ---------------------------------------------------------------------------\n// Write\n// ---------------------------------------------------------------------------\n\n/**\n * Create or replace a staged dataset. Returns metadata including the\n * resolved dataset ID (generated when not supplied in options).\n */\nexport async function upsertStagedDataset(\n options: UpsertDatasetOptions,\n): Promise<StagedDatasetMeta> {\n await ensureTables();\n const db = getDbExec();\n const now = Date.now();\n const id = options.id || generateId();\n\n // If appending, load existing rows first.\n let existingRows: Record<string, unknown>[] = [];\n if (options.append) {\n existingRows = await getStagedDatasetRows({\n id,\n appId: options.appId,\n ownerEmail: options.ownerEmail,\n });\n }\n\n const allRows = options.append\n ? [...existingRows, ...options.rows]\n : options.rows;\n\n // Check caps (net new count after this write).\n const currentAppRows = await getAppRowCount(options.appId);\n const currentDatasetRows = options.append\n ? existingRows.length\n : await (async () => {\n const { rows } = await db.execute({\n sql: `SELECT row_count FROM staged_datasets WHERE id = ?`,\n args: [id],\n });\n return Number(rows[0]?.row_count ?? 0);\n })();\n const netNewRows = allRows.length - currentDatasetRows;\n if (currentAppRows + netNewRows > MAX_ROWS_PER_APP) {\n throw new Error(\n `Staged dataset cap exceeded: this app already has ${currentAppRows} rows stored ` +\n `(limit ${MAX_ROWS_PER_APP}). Delete older datasets before staging more data.`,\n );\n }\n\n // Serialize rows and measure byte size.\n const serialized = allRows.map((row) => JSON.stringify(row));\n const byteSize = serialized.reduce((sum, s) => sum + s.length, 0);\n\n const currentAppBytes = await getAppByteSize(options.appId);\n const existingDatasetBytes = options.append\n ? await (async () => {\n const { rows } = await db.execute({\n sql: `SELECT byte_size FROM staged_datasets WHERE id = ?`,\n args: [id],\n });\n return Number(rows[0]?.byte_size ?? 0);\n })()\n : 0;\n const netNewBytes = byteSize - existingDatasetBytes;\n if (currentAppBytes + netNewBytes > MAX_BYTES_PER_APP) {\n throw new Error(\n `Staged dataset byte cap exceeded: this app already stores ` +\n `${(currentAppBytes / 1024 / 1024).toFixed(1)} MB (limit 50 MB). ` +\n `Delete older datasets before staging more data.`,\n );\n }\n\n const columns = options.columns.length\n ? options.columns\n : deriveColumns(allRows);\n const columnsJson = JSON.stringify(columns);\n\n await withDbTransaction(db, async (tx) => {\n // Delete old rows and insert the replacement row set atomically with the\n // metadata update so a failed batch cannot leave an empty or partial dataset.\n await tx.execute({\n sql: `DELETE FROM staged_dataset_rows WHERE dataset_id = ?`,\n args: [id],\n });\n\n const BATCH = 500;\n for (let i = 0; i < serialized.length; i += BATCH) {\n const slice = serialized.slice(i, i + BATCH);\n for (let j = 0; j < slice.length; j++) {\n await tx.execute({\n sql: `INSERT INTO staged_dataset_rows (dataset_id, row_index, row_data) VALUES (?, ?, ?)`,\n args: [id, i + j, slice[j]],\n });\n }\n }\n\n await tx.execute({\n sql: isPostgres()\n ? `INSERT INTO staged_datasets (id, app_id, owner_email, name, columns, row_count, byte_size, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT (id) DO UPDATE SET name=EXCLUDED.name, columns=EXCLUDED.columns, row_count=EXCLUDED.row_count, byte_size=EXCLUDED.byte_size, updated_at=EXCLUDED.updated_at`\n : `INSERT OR REPLACE INTO staged_datasets (id, app_id, owner_email, name, columns, row_count, byte_size, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n options.appId,\n options.ownerEmail,\n options.name,\n columnsJson,\n allRows.length,\n byteSize,\n now,\n now,\n ],\n });\n });\n\n return {\n id,\n appId: options.appId,\n ownerEmail: options.ownerEmail,\n name: options.name,\n columns,\n rowCount: allRows.length,\n byteSize,\n createdAt: now,\n updatedAt: now,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Read\n// ---------------------------------------------------------------------------\n\n/**\n * Fetch all rows for a dataset, asserting scope (appId + ownerEmail).\n */\nexport async function getStagedDatasetRows(options: {\n id: string;\n appId: string;\n ownerEmail: string;\n}): Promise<Record<string, unknown>[]> {\n await ensureTables();\n const db = getDbExec();\n // Scope check\n const { rows: meta } = await db.execute({\n sql: `SELECT id FROM staged_datasets WHERE id = ? AND app_id = ? AND owner_email = ?`,\n args: [options.id, options.appId, options.ownerEmail],\n });\n if (meta.length === 0) return [];\n\n const { rows } = await db.execute({\n sql: `SELECT row_data FROM staged_dataset_rows WHERE dataset_id = ? ORDER BY row_index ASC`,\n args: [options.id],\n });\n return rows.map(\n (r) => JSON.parse(r.row_data as string) as Record<string, unknown>,\n );\n}\n\n/**\n * Get dataset metadata (no rows), asserting scope.\n */\nexport async function getStagedDatasetMeta(options: {\n id: string;\n appId: string;\n ownerEmail: string;\n}): Promise<StagedDatasetMeta | null> {\n await ensureTables();\n const db = getDbExec();\n const { rows } = await db.execute({\n sql: `SELECT id, app_id, owner_email, name, columns, row_count, byte_size, created_at, updated_at FROM staged_datasets WHERE id = ? AND app_id = ? AND owner_email = ?`,\n args: [options.id, options.appId, options.ownerEmail],\n });\n if (rows.length === 0) return null;\n return rowToMeta(rows[0]);\n}\n\n/**\n * List all datasets scoped to (appId, ownerEmail), newest first.\n */\nexport async function listStagedDatasets(options: {\n appId: string;\n ownerEmail: string;\n}): Promise<StagedDatasetMeta[]> {\n await ensureTables();\n const db = getDbExec();\n const { rows } = await db.execute({\n sql: `SELECT id, app_id, owner_email, name, columns, row_count, byte_size, created_at, updated_at FROM staged_datasets WHERE app_id = ? AND owner_email = ? ORDER BY updated_at DESC`,\n args: [options.appId, options.ownerEmail],\n });\n return rows.map(rowToMeta);\n}\n\n// ---------------------------------------------------------------------------\n// Delete\n// ---------------------------------------------------------------------------\n\nexport async function deleteStagedDataset(options: {\n id: string;\n appId: string;\n ownerEmail: string;\n}): Promise<boolean> {\n await ensureTables();\n const db = getDbExec();\n // Scope check\n const { rows: meta } = await db.execute({\n sql: `SELECT id FROM staged_datasets WHERE id = ? AND app_id = ? AND owner_email = ?`,\n args: [options.id, options.appId, options.ownerEmail],\n });\n if (meta.length === 0) return false;\n\n const result = await withDbTransaction(db, async (tx) => {\n await tx.execute({\n sql: `DELETE FROM staged_dataset_rows WHERE dataset_id = ?`,\n args: [options.id],\n });\n return tx.execute({\n sql: `DELETE FROM staged_datasets WHERE id = ? AND app_id = ? AND owner_email = ?`,\n args: [options.id, options.appId, options.ownerEmail],\n });\n });\n return result.rowsAffected > 0;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction rowToMeta(row: Record<string, unknown>): StagedDatasetMeta {\n return {\n id: row.id as string,\n appId: row.app_id as string,\n ownerEmail: row.owner_email as string,\n name: row.name as string,\n columns: JSON.parse(row.columns as string) as string[],\n rowCount: Number(row.row_count),\n byteSize: Number(row.byte_size),\n createdAt: Number(row.created_at),\n updatedAt: Number(row.updated_at),\n };\n}\n\nasync function withDbTransaction<T>(\n db: DbExec,\n fn: (tx: DbExec) => Promise<T>,\n): Promise<T> {\n if (db.transaction) return db.transaction(fn);\n\n await db.execute(\"BEGIN\");\n try {\n const result = await fn(db);\n await db.execute(\"COMMIT\");\n return result;\n } catch (err) {\n await db.execute(\"ROLLBACK\").catch(() => {});\n throw err;\n }\n}\n\n/** Reset the init promise (only used in tests). */\nexport function _resetInitPromiseForTests(): void {\n _initPromise = undefined;\n}\n"]}
1
+ {"version":3,"file":"staged-datasets-store.js","sourceRoot":"","sources":["../../src/provider-api/staged-datasets-store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Scratch storage for staged provider-API datasets.\n *\n * Rows are stored as JSON text — no dialect-specific JSON-column types needed.\n * Aggregation is done in TypeScript server-side (portable across Postgres and\n * SQLite) rather than via JSON SQL fragments. See `staged-datasets-aggregate.ts`.\n *\n * Storage caps:\n * - MAX_ROWS_PER_APP: 200 000 rows\n * - MAX_BYTES_PER_APP: 50 MB (approximate, measured as raw JSON text length)\n *\n * Scoping: datasets are owned by (app_id, owner_email) so different apps or\n * different users never share or cross-read each other's scratch data.\n */\n\nimport { getDbExec, intType, isPostgres, type DbExec } from \"../db/client.js\";\n\n// ---------------------------------------------------------------------------\n// Caps\n// ---------------------------------------------------------------------------\nexport const MAX_ROWS_PER_APP = 200_000;\nexport const MAX_BYTES_PER_APP = 50 * 1024 * 1024; // 50 MB\n\n// ---------------------------------------------------------------------------\n// Table initialisation\n// ---------------------------------------------------------------------------\n\nlet _initPromise: Promise<void> | undefined;\n\nasync function ensureTables(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const db = getDbExec();\n const integerType = intType();\n await db.execute(`\n CREATE TABLE IF NOT EXISTS staged_datasets (\n id TEXT NOT NULL,\n app_id TEXT NOT NULL,\n owner_email TEXT NOT NULL,\n name TEXT NOT NULL,\n columns TEXT NOT NULL,\n row_count ${integerType} NOT NULL DEFAULT 0,\n byte_size ${integerType} NOT NULL DEFAULT 0,\n created_at ${integerType} NOT NULL,\n updated_at ${integerType} NOT NULL,\n PRIMARY KEY (id)\n )\n `);\n await db.execute(`\n CREATE TABLE IF NOT EXISTS staged_dataset_rows (\n dataset_id TEXT NOT NULL,\n row_index ${integerType} NOT NULL,\n row_data TEXT NOT NULL,\n PRIMARY KEY (dataset_id, row_index)\n )\n `);\n if (isPostgres()) {\n await widenPostgresIntegerColumns(db);\n }\n for (const ddl of [\n `CREATE INDEX IF NOT EXISTS staged_datasets_scope_idx ON staged_datasets (app_id, owner_email)`,\n `CREATE INDEX IF NOT EXISTS staged_dataset_rows_dataset_idx ON staged_dataset_rows (dataset_id)`,\n ]) {\n try {\n await db.execute(ddl);\n } catch {\n // Index already exists — harmless.\n }\n }\n })().catch((err) => {\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\nasync function widenPostgresIntegerColumns(db: DbExec): Promise<void> {\n const statements = [\n `ALTER TABLE staged_datasets ALTER COLUMN row_count TYPE BIGINT USING row_count::bigint`,\n `ALTER TABLE staged_datasets ALTER COLUMN byte_size TYPE BIGINT USING byte_size::bigint`,\n `ALTER TABLE staged_datasets ALTER COLUMN created_at TYPE BIGINT USING created_at::bigint`,\n `ALTER TABLE staged_datasets ALTER COLUMN updated_at TYPE BIGINT USING updated_at::bigint`,\n `ALTER TABLE staged_dataset_rows ALTER COLUMN row_index TYPE BIGINT USING row_index::bigint`,\n ];\n for (const sql of statements) {\n try {\n await db.execute(sql);\n } catch {\n // Best-effort compatibility for older deployments. Widening is\n // non-destructive; if a database role cannot ALTER, the later write will\n // still surface the real DB error.\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface StagedDatasetMeta {\n id: string;\n appId: string;\n ownerEmail: string;\n name: string;\n columns: string[];\n rowCount: number;\n byteSize: number;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface UpsertDatasetOptions {\n id: string;\n appId: string;\n ownerEmail: string;\n name: string;\n /** All rows to store; replaces any existing rows. */\n rows: Record<string, unknown>[];\n columns: string[];\n /** When true, append rows instead of replacing. */\n append?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction generateId(): string {\n return `ds_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** Derive column names from a set of rows (first 20 rows surveyed). */\nexport function deriveColumns(rows: Record<string, unknown>[]): string[] {\n const seen = new Set<string>();\n for (const row of rows.slice(0, 20)) {\n for (const key of Object.keys(row)) seen.add(key);\n }\n return Array.from(seen);\n}\n\n// ---------------------------------------------------------------------------\n// Scope check\n// ---------------------------------------------------------------------------\n\nasync function getAppRowCount(appId: string): Promise<number> {\n const db = getDbExec();\n const { rows } = await db.execute({\n sql: `SELECT COALESCE(SUM(row_count), 0) as total FROM staged_datasets WHERE app_id = ?`,\n args: [appId],\n });\n return Number(rows[0]?.total ?? 0);\n}\n\nasync function getAppByteSize(appId: string): Promise<number> {\n const db = getDbExec();\n const { rows } = await db.execute({\n sql: `SELECT COALESCE(SUM(byte_size), 0) as total FROM staged_datasets WHERE app_id = ?`,\n args: [appId],\n });\n return Number(rows[0]?.total ?? 0);\n}\n\n// ---------------------------------------------------------------------------\n// Write\n// ---------------------------------------------------------------------------\n\n/**\n * Create or replace a staged dataset. Returns metadata including the\n * resolved dataset ID (generated when not supplied in options).\n */\nexport async function upsertStagedDataset(\n options: UpsertDatasetOptions,\n): Promise<StagedDatasetMeta> {\n await ensureTables();\n const db = getDbExec();\n const now = Date.now();\n const id = options.id || generateId();\n\n // If appending, load existing rows first.\n let existingRows: Record<string, unknown>[] = [];\n if (options.append) {\n existingRows = await getStagedDatasetRows({\n id,\n appId: options.appId,\n ownerEmail: options.ownerEmail,\n });\n }\n\n const allRows = options.append\n ? [...existingRows, ...options.rows]\n : options.rows;\n\n // Check caps (net new count after this write).\n const currentAppRows = await getAppRowCount(options.appId);\n const currentDatasetRows = options.append\n ? existingRows.length\n : await (async () => {\n const { rows } = await db.execute({\n sql: `SELECT row_count FROM staged_datasets WHERE id = ?`,\n args: [id],\n });\n return Number(rows[0]?.row_count ?? 0);\n })();\n const netNewRows = allRows.length - currentDatasetRows;\n if (currentAppRows + netNewRows > MAX_ROWS_PER_APP) {\n throw new Error(\n `Staged dataset cap exceeded: this app already has ${currentAppRows} rows stored ` +\n `(limit ${MAX_ROWS_PER_APP}). Delete older datasets before staging more data.`,\n );\n }\n\n // Serialize rows and measure byte size.\n const serialized = allRows.map((row) => JSON.stringify(row));\n const byteSize = serialized.reduce((sum, s) => sum + s.length, 0);\n\n const currentAppBytes = await getAppByteSize(options.appId);\n const existingDatasetBytes = options.append\n ? await (async () => {\n const { rows } = await db.execute({\n sql: `SELECT byte_size FROM staged_datasets WHERE id = ?`,\n args: [id],\n });\n return Number(rows[0]?.byte_size ?? 0);\n })()\n : 0;\n const netNewBytes = byteSize - existingDatasetBytes;\n if (currentAppBytes + netNewBytes > MAX_BYTES_PER_APP) {\n throw new Error(\n `Staged dataset byte cap exceeded: this app already stores ` +\n `${(currentAppBytes / 1024 / 1024).toFixed(1)} MB (limit 50 MB). ` +\n `Delete older datasets before staging more data.`,\n );\n }\n\n const columns = options.columns.length\n ? options.columns\n : deriveColumns(allRows);\n const columnsJson = JSON.stringify(columns);\n\n await withDbTransaction(db, async (tx) => {\n // Delete old rows and insert the replacement row set atomically with the\n // metadata update so a failed batch cannot leave an empty or partial dataset.\n await tx.execute({\n sql: `DELETE FROM staged_dataset_rows WHERE dataset_id = ?`,\n args: [id],\n });\n\n const BATCH = 500;\n for (let i = 0; i < serialized.length; i += BATCH) {\n const slice = serialized.slice(i, i + BATCH);\n for (let j = 0; j < slice.length; j++) {\n await tx.execute({\n sql: `INSERT INTO staged_dataset_rows (dataset_id, row_index, row_data) VALUES (?, ?, ?)`,\n args: [id, i + j, slice[j]],\n });\n }\n }\n\n await tx.execute({\n sql: isPostgres()\n ? `INSERT INTO staged_datasets (id, app_id, owner_email, name, columns, row_count, byte_size, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT (id) DO UPDATE SET name=EXCLUDED.name, columns=EXCLUDED.columns, row_count=EXCLUDED.row_count, byte_size=EXCLUDED.byte_size, updated_at=EXCLUDED.updated_at`\n : `INSERT OR REPLACE INTO staged_datasets (id, app_id, owner_email, name, columns, row_count, byte_size, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n options.appId,\n options.ownerEmail,\n options.name,\n columnsJson,\n allRows.length,\n byteSize,\n now,\n now,\n ],\n });\n });\n\n return {\n id,\n appId: options.appId,\n ownerEmail: options.ownerEmail,\n name: options.name,\n columns,\n rowCount: allRows.length,\n byteSize,\n createdAt: now,\n updatedAt: now,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Read\n// ---------------------------------------------------------------------------\n\n/**\n * Fetch all rows for a dataset, asserting scope (appId + ownerEmail).\n */\nexport async function getStagedDatasetRows(options: {\n id: string;\n appId: string;\n ownerEmail: string;\n}): Promise<Record<string, unknown>[]> {\n await ensureTables();\n const db = getDbExec();\n // Scope check\n const { rows: meta } = await db.execute({\n sql: `SELECT id FROM staged_datasets WHERE id = ? AND app_id = ? AND owner_email = ?`,\n args: [options.id, options.appId, options.ownerEmail],\n });\n if (meta.length === 0) return [];\n\n const { rows } = await db.execute({\n sql: `SELECT row_data FROM staged_dataset_rows WHERE dataset_id = ? ORDER BY row_index ASC`,\n args: [options.id],\n });\n return rows.map(\n (r) => JSON.parse(r.row_data as string) as Record<string, unknown>,\n );\n}\n\n/**\n * Get dataset metadata (no rows), asserting scope.\n */\nexport async function getStagedDatasetMeta(options: {\n id: string;\n appId: string;\n ownerEmail: string;\n}): Promise<StagedDatasetMeta | null> {\n await ensureTables();\n const db = getDbExec();\n const { rows } = await db.execute({\n sql: `SELECT id, app_id, owner_email, name, columns, row_count, byte_size, created_at, updated_at FROM staged_datasets WHERE id = ? AND app_id = ? AND owner_email = ?`,\n args: [options.id, options.appId, options.ownerEmail],\n });\n if (rows.length === 0) return null;\n return rowToMeta(rows[0]);\n}\n\n/**\n * List all datasets scoped to (appId, ownerEmail), newest first.\n */\nexport async function listStagedDatasets(options: {\n appId: string;\n ownerEmail: string;\n}): Promise<StagedDatasetMeta[]> {\n await ensureTables();\n const db = getDbExec();\n const { rows } = await db.execute({\n sql: `SELECT id, app_id, owner_email, name, columns, row_count, byte_size, created_at, updated_at FROM staged_datasets WHERE app_id = ? AND owner_email = ? ORDER BY updated_at DESC`,\n args: [options.appId, options.ownerEmail],\n });\n return rows.map(rowToMeta);\n}\n\n// ---------------------------------------------------------------------------\n// Delete\n// ---------------------------------------------------------------------------\n\nexport async function deleteStagedDataset(options: {\n id: string;\n appId: string;\n ownerEmail: string;\n}): Promise<boolean> {\n await ensureTables();\n const db = getDbExec();\n // Scope check\n const { rows: meta } = await db.execute({\n sql: `SELECT id FROM staged_datasets WHERE id = ? AND app_id = ? AND owner_email = ?`,\n args: [options.id, options.appId, options.ownerEmail],\n });\n if (meta.length === 0) return false;\n\n const result = await withDbTransaction(db, async (tx) => {\n await tx.execute({\n sql: `DELETE FROM staged_dataset_rows WHERE dataset_id = ?`,\n args: [options.id],\n });\n return tx.execute({\n sql: `DELETE FROM staged_datasets WHERE id = ? AND app_id = ? AND owner_email = ?`,\n args: [options.id, options.appId, options.ownerEmail],\n });\n });\n return result.rowsAffected > 0;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction rowToMeta(row: Record<string, unknown>): StagedDatasetMeta {\n return {\n id: row.id as string,\n appId: row.app_id as string,\n ownerEmail: row.owner_email as string,\n name: row.name as string,\n columns: JSON.parse(row.columns as string) as string[],\n rowCount: Number(row.row_count),\n byteSize: Number(row.byte_size),\n createdAt: Number(row.created_at),\n updatedAt: Number(row.updated_at),\n };\n}\n\nasync function withDbTransaction<T>(\n db: DbExec,\n fn: (tx: DbExec) => Promise<T>,\n): Promise<T> {\n if (db.transaction) return db.transaction(fn);\n\n await db.execute(\"BEGIN\");\n try {\n const result = await fn(db);\n await db.execute(\"COMMIT\");\n return result;\n } catch (err) {\n await db.execute(\"ROLLBACK\").catch(() => {});\n throw err;\n }\n}\n\n/** Reset the init promise (only used in tests). */\nexport function _resetInitPromiseForTests(): void {\n _initPromise = undefined;\n}\n"]}
@@ -34,9 +34,14 @@ export interface PaginationConfig {
34
34
  nextCursorPath?: string;
35
35
  /**
36
36
  * Query parameter name to use for the cursor in the next request.
37
- * Required when nextCursorPath is set.
37
+ * Use this for APIs that page with query params.
38
38
  */
39
39
  cursorParam?: string;
40
+ /**
41
+ * Dot-path in the JSON request body to set to the cursor value in the next
42
+ * request. Use this for APIs that page via POST body fields.
43
+ */
44
+ cursorBodyPath?: string;
40
45
  /**
41
46
  * Use page-number mode: send `pageParam=N` for each subsequent page.
42
47
  */
@@ -1 +1 @@
1
- {"version":3,"file":"staging.d.ts","sourceRoot":"","sources":["../../src/provider-api/staging.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAWzD,0EAA0E;AAC1E,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,SAAS,GACT,OAAO,GACP,SAAS,GACT,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAmB,SAAQ,sBAAsB;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;KACvC,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,oEAAoE;AACpE,MAAM,MAAM,mBAAmB,GAAG,CAChC,IAAI,EAAE,sBAAsB,KACzB,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAsBD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,EACb,SAAS,GAAE,SAAkB,GAC5B,OAAO,EAAE,CA0BX;AAqCD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,mBAAmB,EAC5B,GAAG,EAAE,qBAAqB,GACzB,OAAO,CAAC,aAAa,CAAC,CA2LxB"}
1
+ {"version":3,"file":"staging.d.ts","sourceRoot":"","sources":["../../src/provider-api/staging.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAWzD,0EAA0E;AAC1E,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,SAAS,GACT,OAAO,GACP,SAAS,GACT,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAmB,SAAQ,sBAAsB;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;KACvC,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,oEAAoE;AACpE,MAAM,MAAM,mBAAmB,GAAG,CAChC,IAAI,EAAE,sBAAsB,KACzB,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAsBD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,EACb,SAAS,GAAE,SAAkB,GAC5B,OAAO,EAAE,CA0BX;AA2DD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,mBAAmB,EAC5B,GAAG,EAAE,qBAAqB,GACzB,OAAO,CAAC,aAAa,CAAC,CA+MxB"}
@@ -73,6 +73,25 @@ function extractNextCursor(body, path) {
73
73
  return null;
74
74
  return String(val);
75
75
  }
76
+ function setAtPath(base, path, value) {
77
+ const root = base && typeof base === "object" && !Array.isArray(base)
78
+ ? { ...base }
79
+ : {};
80
+ const parts = path.split(".").filter(Boolean);
81
+ if (!parts.length)
82
+ return root;
83
+ let current = root;
84
+ for (const part of parts.slice(0, -1)) {
85
+ const existing = current[part];
86
+ const next = existing && typeof existing === "object" && !Array.isArray(existing)
87
+ ? { ...existing }
88
+ : {};
89
+ current[part] = next;
90
+ current = next;
91
+ }
92
+ current[parts[parts.length - 1]] = value;
93
+ return root;
94
+ }
76
95
  // ---------------------------------------------------------------------------
77
96
  // 429 / Retry-After handling
78
97
  // ---------------------------------------------------------------------------
@@ -107,6 +126,11 @@ export async function stagingExecuteRequest(args, execute, ctx) {
107
126
  const itemsPath = args.itemsPath ?? "auto";
108
127
  const pagination = args.pagination;
109
128
  const maxPages = Math.min(pagination?.maxPages ?? 50, 200);
129
+ if (pagination?.nextCursorPath &&
130
+ !pagination.cursorParam &&
131
+ !pagination.cursorBodyPath) {
132
+ throw new Error("Pagination with nextCursorPath requires cursorParam or cursorBodyPath.");
133
+ }
110
134
  // Strip staging fields from the underlying request args
111
135
  const baseArgs = {
112
136
  provider: args.provider,
@@ -141,23 +165,28 @@ export async function stagingExecuteRequest(args, execute, ctx) {
141
165
  for (let pageIndex = 0; pageIndex < maxPages; pageIndex++) {
142
166
  // Inject pagination params for pages 2+
143
167
  if (pageIndex > 0 && pagination) {
144
- const extraQuery = typeof currentArgs.query === "object" && currentArgs.query !== null
145
- ? { ...currentArgs.query }
168
+ const extraQuery = typeof baseArgs.query === "object" && baseArgs.query !== null
169
+ ? { ...baseArgs.query }
146
170
  : {};
171
+ let nextBody = baseArgs.body;
147
172
  if (pagination.cursorParam && lastCursor !== null) {
148
173
  extraQuery[pagination.cursorParam] = lastCursor;
149
174
  }
150
- else if (pagination.pageParam) {
175
+ if (pagination.cursorBodyPath && lastCursor !== null) {
176
+ nextBody = setAtPath(baseArgs.body, pagination.cursorBodyPath, lastCursor);
177
+ }
178
+ const hasCursorMode = Boolean(pagination.cursorParam) || Boolean(pagination.cursorBodyPath);
179
+ if (pagination.pageParam && !hasCursorMode) {
151
180
  extraQuery[pagination.pageParam] = pageNum;
152
181
  }
153
- else if (pagination.offsetParam) {
182
+ else if (pagination.offsetParam && !hasCursorMode) {
154
183
  extraQuery[pagination.offsetParam] = offset;
155
184
  }
156
- else {
185
+ else if (!hasCursorMode) {
157
186
  // No pagination config for next page — stop
158
187
  break;
159
188
  }
160
- currentArgs = { ...currentArgs, query: extraQuery };
189
+ currentArgs = { ...baseArgs, query: extraQuery, body: nextBody };
161
190
  }
162
191
  // -----------------------------------------------------------------------
163
192
  // Execute with retry on 429
@@ -1 +1 @@
1
- {"version":3,"file":"staging.js","sourceRoot":"","sources":["../../src/provider-api/staging.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Server-side staging layer for provider-api responses.\n *\n * ## P0 — stageAs\n * Instead of returning a raw response body to the model (which hits the 50K-char\n * context-window truncation and biases aggregates), the caller can pass\n * `stageAs: \"dataset_name\"` to `stagingExecuteRequest`. The runtime will:\n * 1. Execute the provider HTTP request.\n * 2. Auto-detect the items array in common response shapes.\n * 3. Write rows into `staged_datasets` + `staged_dataset_rows`.\n * 4. Return only { dataset, rowCount, columns, sampleRows: first 5 }.\n *\n * ## P1 — fetchAll\n * When `pagination` config is supplied alongside `stageAs`, the runtime\n * iterates pages server-side:\n * - Supports nextCursor (embedded in response), offset, and page modes.\n * - Handles 429 / Retry-After with exponential back-off.\n * - Caps at maxPages (default 50, up to 200).\n * - Returns { dataset, pages, rows, truncated, lastCursor } so the agent\n * can resume with another call when capped.\n *\n * Security: re-uses executeProviderApiRequest from index.ts — SSRF-safety and\n * secret redaction are fully preserved. We read the raw (pre-redacted) JSON\n * here; redaction is applied to the response returned to the model.\n */\n\nimport type { ProviderApiRequestArgs } from \"./index.js\";\nimport {\n upsertStagedDataset,\n deriveColumns,\n MAX_ROWS_PER_APP,\n} from \"./staged-datasets-store.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Auto-detect or explicit path to the items array in a JSON response. */\nexport type ItemsPath =\n | \"auto\"\n | \"data\"\n | \"results\"\n | \"items\"\n | \"records\"\n | \"rows\"\n | string;\n\nexport interface PaginationConfig {\n /**\n * Dot-path in the response JSON for the next cursor/token value.\n * e.g. \"next_cursor\", \"meta.next\", \"pagination.cursor\"\n */\n nextCursorPath?: string;\n /**\n * Query parameter name to use for the cursor in the next request.\n * Required when nextCursorPath is set.\n */\n cursorParam?: string;\n /**\n * Use page-number mode: send `pageParam=N` for each subsequent page.\n */\n pageParam?: string;\n /** Starting page number (default 1). */\n startPage?: number;\n /**\n * Use offset mode: send `offsetParam=N` for each subsequent request.\n */\n offsetParam?: string;\n /**\n * Hint at expected page size for offset increments. Defaults to the\n * actual item count of the first page.\n */\n pageSize?: number;\n /** Maximum pages to fetch (default 50, max 200). */\n maxPages?: number;\n}\n\nexport interface StageAsOptions {\n stageAs: string;\n itemsPath?: ItemsPath;\n pagination?: PaginationConfig;\n}\n\nexport interface StagingRequestArgs extends ProviderApiRequestArgs {\n stageAs?: string;\n itemsPath?: ItemsPath;\n pagination?: PaginationConfig;\n}\n\nexport interface StagingResult {\n dataset: {\n id: string;\n name: string;\n rowCount: number;\n columns: string[];\n sampleRows: Record<string, unknown>[];\n };\n pages?: number;\n rows?: number;\n truncated?: boolean;\n lastCursor?: string | number | null;\n provider: unknown;\n request: unknown;\n guidance: string;\n}\n\n// ---------------------------------------------------------------------------\n// Resolve runtime context for scope (appId + ownerEmail)\n// ---------------------------------------------------------------------------\n\n/** Minimal callable interface accepted by stagingExecuteRequest. */\nexport type ProviderApiExecutor = (\n args: ProviderApiRequestArgs,\n) => Promise<unknown>;\n\nexport interface StagingRuntimeContext {\n appId: string;\n ownerEmail: string;\n}\n\n// ---------------------------------------------------------------------------\n// JSON path resolution helper\n// ---------------------------------------------------------------------------\n\nfunction getAtPath(obj: unknown, path: string): unknown {\n if (!path || obj === undefined || obj === null) return obj;\n const parts = path.split(\".\");\n let cur: unknown = obj;\n for (const part of parts) {\n if (cur === null || cur === undefined || typeof cur !== \"object\")\n return undefined;\n cur = (cur as Record<string, unknown>)[part];\n }\n return cur;\n}\n\n// ---------------------------------------------------------------------------\n// Auto-detect items array\n// ---------------------------------------------------------------------------\n\nexport function extractItemsArray(\n body: unknown,\n itemsPath: ItemsPath = \"auto\",\n): unknown[] {\n if (!body || typeof body !== \"object\") return [];\n\n if (Array.isArray(body)) return body as unknown[];\n\n if (itemsPath !== \"auto\") {\n const val = getAtPath(body, itemsPath);\n return Array.isArray(val) ? (val as unknown[]) : [];\n }\n\n // Auto-detect: common shapes\n const obj = body as Record<string, unknown>;\n for (const key of [\"data\", \"results\", \"items\", \"records\", \"rows\"]) {\n if (Array.isArray(obj[key])) return obj[key] as unknown[];\n }\n\n // Many provider APIs return `{ providerSpecificName: [...], metadata: ... }`.\n // If exactly one top-level field is an array, treat that as the item list\n // without hardcoding provider vocabulary.\n const arrayFields = Object.values(obj).filter(Array.isArray);\n if (arrayFields.length === 1) {\n return arrayFields[0] as unknown[];\n }\n\n // If the object itself looks like a flat row, wrap it\n return [];\n}\n\nfunction extractNextCursor(body: unknown, path: string): string | null {\n const val = getAtPath(body, path);\n if (val === null || val === undefined || val === \"\" || val === false)\n return null;\n return String(val);\n}\n\n// ---------------------------------------------------------------------------\n// 429 / Retry-After handling\n// ---------------------------------------------------------------------------\n\nasync function sleepMs(ms: number): Promise<void> {\n await new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nfunction getRetryAfterMs(\n responseHeaders: Record<string, string> | undefined,\n attempt: number,\n): number {\n if (responseHeaders) {\n const raw =\n responseHeaders[\"retry-after\"] ?? responseHeaders[\"Retry-After\"];\n if (raw) {\n const secs = parseFloat(raw);\n if (!isNaN(secs)) return secs * 1000;\n }\n }\n // Exponential back-off: 1s, 2s, 4s, 8s, cap 30s\n return Math.min(1000 * Math.pow(2, attempt), 30_000);\n}\n\n// ---------------------------------------------------------------------------\n// Core staging executor\n// ---------------------------------------------------------------------------\n\n/**\n * Execute a provider API request and stage the result into scratch storage.\n * Returns a compact summary instead of the raw body.\n *\n * @param args — request args including stageAs / itemsPath / pagination\n * @param execute — callable provider executor (e.g. `runtime.executeRequest.bind(runtime)`)\n * @param ctx — (appId, ownerEmail) for dataset ownership scoping\n */\nexport async function stagingExecuteRequest(\n args: StagingRequestArgs,\n execute: ProviderApiExecutor,\n ctx: StagingRuntimeContext,\n): Promise<StagingResult> {\n const datasetName = args.stageAs!;\n const itemsPath = args.itemsPath ?? \"auto\";\n const pagination = args.pagination;\n const maxPages = Math.min(pagination?.maxPages ?? 50, 200);\n\n // Strip staging fields from the underlying request args\n const baseArgs: ProviderApiRequestArgs = {\n provider: args.provider,\n method: args.method,\n path: args.path,\n query: args.query,\n headers: args.headers,\n body: args.body,\n auth: args.auth,\n timeoutMs: args.timeoutMs,\n maxBytes: args.maxBytes,\n connectionId: args.connectionId,\n accountId: args.accountId,\n };\n\n let allRows: Record<string, unknown>[] = [];\n let pages = 0;\n let truncated = false;\n let lastCursor: string | number | null = null;\n let providerMeta: unknown;\n let requestMeta: unknown;\n\n // Generate a stable dataset id for this name+owner combination so re-staging\n // the same dataset replaces it rather than accumulating duplicates.\n const datasetId = `ds_${ctx.appId}_${ctx.ownerEmail}_${datasetName}`\n .replace(/[^a-zA-Z0-9_-]/g, \"_\")\n .slice(0, 80);\n\n // -------------------------------------------------------------------------\n // Page loop\n // -------------------------------------------------------------------------\n let currentArgs = { ...baseArgs };\n let pageNum = pagination?.startPage ?? 1;\n let offset = 0;\n\n for (let pageIndex = 0; pageIndex < maxPages; pageIndex++) {\n // Inject pagination params for pages 2+\n if (pageIndex > 0 && pagination) {\n const extraQuery: Record<string, unknown> =\n typeof currentArgs.query === \"object\" && currentArgs.query !== null\n ? { ...(currentArgs.query as Record<string, unknown>) }\n : {};\n\n if (pagination.cursorParam && lastCursor !== null) {\n extraQuery[pagination.cursorParam] = lastCursor;\n } else if (pagination.pageParam) {\n extraQuery[pagination.pageParam] = pageNum;\n } else if (pagination.offsetParam) {\n extraQuery[pagination.offsetParam] = offset;\n } else {\n // No pagination config for next page — stop\n break;\n }\n currentArgs = { ...currentArgs, query: extraQuery };\n }\n\n // -----------------------------------------------------------------------\n // Execute with retry on 429\n // -----------------------------------------------------------------------\n let result: Record<string, unknown>;\n let attempt = 0;\n for (;;) {\n const raw = (await execute(currentArgs)) as Record<string, unknown>;\n const response = raw.response as Record<string, unknown> | undefined;\n if (response?.status === 429) {\n if (attempt >= 5) {\n throw new Error(\n `Provider returned 429 Too Many Requests after ${attempt + 1} attempts. ` +\n `Try again later or reduce the page count.`,\n );\n }\n const waitMs = getRetryAfterMs(\n response.headers as Record<string, string> | undefined,\n attempt,\n );\n await sleepMs(waitMs);\n attempt++;\n continue;\n }\n result = raw;\n break;\n }\n\n pages++;\n if (pageIndex === 0) {\n providerMeta = result.provider;\n requestMeta = result.request;\n }\n\n const response = result.response as Record<string, unknown> | undefined;\n if (!response?.ok) {\n // Non-200 on first page is a hard error; on subsequent pages, stop early\n if (pageIndex === 0) {\n throw new Error(\n `Provider API returned status ${response?.status}: ${JSON.stringify(response?.json ?? response?.text).slice(0, 200)}`,\n );\n }\n truncated = true;\n break;\n }\n\n const body =\n response.json ??\n (response.text ? tryParseJson(response.text as string) : null);\n const pageRows = extractItemsArray(body, itemsPath);\n\n if (pageRows.length === 0) {\n // Empty page — end of data\n break;\n }\n\n const typedRows = pageRows.map((r) =>\n r && typeof r === \"object\"\n ? (r as Record<string, unknown>)\n : { value: r },\n );\n allRows = allRows.concat(typedRows);\n\n // Cap check — stop before exceeding limit\n if (allRows.length >= MAX_ROWS_PER_APP) {\n truncated = true;\n allRows = allRows.slice(0, MAX_ROWS_PER_APP);\n break;\n }\n\n // If no pagination config or single-page mode, stop after first page\n if (!pagination || pageIndex === maxPages - 1) {\n if (pageIndex === maxPages - 1 && pagination) truncated = true;\n break;\n }\n\n // Derive next cursor / offset / page\n if (pagination.nextCursorPath) {\n const next = extractNextCursor(body, pagination.nextCursorPath);\n if (!next) break; // No more pages\n lastCursor = next;\n } else if (pagination.pageParam) {\n pageNum++;\n } else if (pagination.offsetParam) {\n const pageSize = pagination.pageSize ?? pageRows.length;\n offset += pageSize;\n } else {\n break;\n }\n }\n\n // -------------------------------------------------------------------------\n // Persist to staging store\n // -------------------------------------------------------------------------\n const columns = deriveColumns(allRows);\n const meta = await upsertStagedDataset({\n id: datasetId,\n appId: ctx.appId,\n ownerEmail: ctx.ownerEmail,\n name: datasetName,\n rows: allRows,\n columns,\n });\n\n return {\n dataset: {\n id: meta.id,\n name: meta.name,\n rowCount: meta.rowCount,\n columns: meta.columns,\n sampleRows: allRows.slice(0, 5),\n },\n ...(pagination\n ? {\n pages,\n rows: allRows.length,\n truncated,\n lastCursor,\n }\n : {}),\n provider: providerMeta,\n request: requestMeta,\n guidance:\n \"Data staged successfully. Use query-staged-dataset to run aggregations on this dataset without re-fetching. \" +\n \"Staging avoids sending raw response bodies through the context window.\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utility\n// ---------------------------------------------------------------------------\n\nfunction tryParseJson(text: string): unknown | null {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"staging.js","sourceRoot":"","sources":["../../src/provider-api/staging.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AA8FpC,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,SAAS,SAAS,CAAC,GAAY,EAAE,IAAY;IAC3C,IAAI,CAAC,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,GAAG,GAAY,GAAG,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ;YAC9D,OAAO,SAAS,CAAC;QACnB,GAAG,GAAI,GAA+B,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,MAAM,UAAU,iBAAiB,CAC/B,IAAa,EACb,YAAuB,MAAM;IAE7B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEjD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAiB,CAAC;IAElD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IAED,6BAA6B;IAC7B,MAAM,GAAG,GAAG,IAA+B,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;QAClE,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC,GAAG,CAAc,CAAC;IAC5D,CAAC;IAED,8EAA8E;IAC9E,0EAA0E;IAC1E,0CAA0C;IAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC,CAAC,CAAc,CAAC;IACrC,CAAC;IAED,sDAAsD;IACtD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa,EAAE,IAAY;IACpD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,KAAK;QAClE,OAAO,IAAI,CAAC;IACd,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,SAAS,CAAC,IAAa,EAAE,IAAY,EAAE,KAAc;IAC5D,MAAM,IAAI,GACR,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACtD,CAAC,CAAC,EAAE,GAAI,IAAgC,EAAE;QAC1C,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAE/B,IAAI,OAAO,GAA4B,IAAI,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,IAAI,GACR,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAClE,CAAC,CAAC,EAAE,GAAI,QAAoC,EAAE;YAC9C,CAAC,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACrB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,KAAK,UAAU,OAAO,CAAC,EAAU;IAC/B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,eAAe,CACtB,eAAmD,EACnD,OAAe;IAEf,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,GAAG,GACP,eAAe,CAAC,aAAa,CAAC,IAAI,eAAe,CAAC,aAAa,CAAC,CAAC;QACnE,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,GAAG,IAAI,CAAC;QACvC,CAAC;IACH,CAAC;IACD,gDAAgD;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAwB,EACxB,OAA4B,EAC5B,GAA0B;IAE1B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAQ,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3D,IACE,UAAU,EAAE,cAAc;QAC1B,CAAC,UAAU,CAAC,WAAW;QACvB,CAAC,UAAU,CAAC,cAAc,EAC1B,CAAC;QACD,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,MAAM,QAAQ,GAA2B;QACvC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;IAEF,IAAI,OAAO,GAA8B,EAAE,CAAC;IAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,UAAU,GAA2B,IAAI,CAAC;IAC9C,IAAI,YAAqB,CAAC;IAC1B,IAAI,WAAoB,CAAC;IAEzB,6EAA6E;IAC7E,oEAAoE;IACpE,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,IAAI,WAAW,EAAE;SACjE,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;SAC/B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhB,4EAA4E;IAC5E,YAAY;IACZ,4EAA4E;IAC5E,IAAI,WAAW,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,IAAI,OAAO,GAAG,UAAU,EAAE,SAAS,IAAI,CAAC,CAAC;IACzC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC;QAC1D,wCAAwC;QACxC,IAAI,SAAS,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,UAAU,GACd,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI;gBAC3D,CAAC,CAAC,EAAE,GAAI,QAAQ,CAAC,KAAiC,EAAE;gBACpD,CAAC,CAAC,EAAE,CAAC;YACT,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC;YAE7B,IAAI,UAAU,CAAC,WAAW,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBAClD,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,UAAU,CAAC;YAClD,CAAC;YACD,IAAI,UAAU,CAAC,cAAc,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACrD,QAAQ,GAAG,SAAS,CAClB,QAAQ,CAAC,IAAI,EACb,UAAU,CAAC,cAAc,EACzB,UAAU,CACX,CAAC;YACJ,CAAC;YACD,MAAM,aAAa,GACjB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YACxE,IAAI,UAAU,CAAC,SAAS,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC3C,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;YAC7C,CAAC;iBAAM,IAAI,UAAU,CAAC,WAAW,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpD,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;YAC9C,CAAC;iBAAM,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC1B,4CAA4C;gBAC5C,MAAM;YACR,CAAC;YACD,WAAW,GAAG,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACnE,CAAC;QAED,0EAA0E;QAC1E,4BAA4B;QAC5B,0EAA0E;QAC1E,IAAI,MAA+B,CAAC;QACpC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,SAAS,CAAC;YACR,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,CAA4B,CAAC;YACpE,MAAM,QAAQ,GAAG,GAAG,CAAC,QAA+C,CAAC;YACrE,IAAI,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC7B,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CACb,iDAAiD,OAAO,GAAG,CAAC,aAAa;wBACvE,2CAA2C,CAC9C,CAAC;gBACJ,CAAC;gBACD,MAAM,MAAM,GAAG,eAAe,CAC5B,QAAQ,CAAC,OAA6C,EACtD,OAAO,CACR,CAAC;gBACF,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtB,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YACD,MAAM,GAAG,GAAG,CAAC;YACb,MAAM;QACR,CAAC;QAED,KAAK,EAAE,CAAC;QACR,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC/B,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAA+C,CAAC;QACxE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;YAClB,yEAAyE;YACzE,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CACb,gCAAgC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACtH,CAAC;YACJ,CAAC;YACD,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM;QACR,CAAC;QAED,MAAM,IAAI,GACR,QAAQ,CAAC,IAAI;YACb,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAEpD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,2BAA2B;YAC3B,MAAM;QACR,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACnC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YACxB,CAAC,CAAE,CAA6B;YAChC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CACjB,CAAC;QACF,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEpC,0CAA0C;QAC1C,IAAI,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;YACvC,SAAS,GAAG,IAAI,CAAC;YACjB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAC7C,MAAM;QACR,CAAC;QAED,qEAAqE;QACrE,IAAI,CAAC,UAAU,IAAI,SAAS,KAAK,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC9C,IAAI,SAAS,KAAK,QAAQ,GAAG,CAAC,IAAI,UAAU;gBAAE,SAAS,GAAG,IAAI,CAAC;YAC/D,MAAM;QACR,CAAC;QAED,qCAAqC;QACrC,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;YAChE,IAAI,CAAC,IAAI;gBAAE,MAAM,CAAC,gBAAgB;YAClC,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;aAAM,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC;YACxD,MAAM,IAAI,QAAQ,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,2BAA2B;IAC3B,4EAA4E;IAC5E,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC;QACrC,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,OAAO;QACb,OAAO;KACR,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE;YACP,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SAChC;QACD,GAAG,CAAC,UAAU;YACZ,CAAC,CAAC;gBACE,KAAK;gBACL,IAAI,EAAE,OAAO,CAAC,MAAM;gBACpB,SAAS;gBACT,UAAU;aACX;YACH,CAAC,CAAC,EAAE,CAAC;QACP,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,WAAW;QACpB,QAAQ,EACN,8GAA8G;YAC9G,wEAAwE;KAC3E,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["/**\n * Server-side staging layer for provider-api responses.\n *\n * ## P0 — stageAs\n * Instead of returning a raw response body to the model (which hits the 50K-char\n * context-window truncation and biases aggregates), the caller can pass\n * `stageAs: \"dataset_name\"` to `stagingExecuteRequest`. The runtime will:\n * 1. Execute the provider HTTP request.\n * 2. Auto-detect the items array in common response shapes.\n * 3. Write rows into `staged_datasets` + `staged_dataset_rows`.\n * 4. Return only { dataset, rowCount, columns, sampleRows: first 5 }.\n *\n * ## P1 — fetchAll\n * When `pagination` config is supplied alongside `stageAs`, the runtime\n * iterates pages server-side:\n * - Supports nextCursor (embedded in response), offset, and page modes.\n * - Handles 429 / Retry-After with exponential back-off.\n * - Caps at maxPages (default 50, up to 200).\n * - Returns { dataset, pages, rows, truncated, lastCursor } so the agent\n * can resume with another call when capped.\n *\n * Security: re-uses executeProviderApiRequest from index.ts — SSRF-safety and\n * secret redaction are fully preserved. We read the raw (pre-redacted) JSON\n * here; redaction is applied to the response returned to the model.\n */\n\nimport type { ProviderApiRequestArgs } from \"./index.js\";\nimport {\n upsertStagedDataset,\n deriveColumns,\n MAX_ROWS_PER_APP,\n} from \"./staged-datasets-store.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Auto-detect or explicit path to the items array in a JSON response. */\nexport type ItemsPath =\n | \"auto\"\n | \"data\"\n | \"results\"\n | \"items\"\n | \"records\"\n | \"rows\"\n | string;\n\nexport interface PaginationConfig {\n /**\n * Dot-path in the response JSON for the next cursor/token value.\n * e.g. \"next_cursor\", \"meta.next\", \"pagination.cursor\"\n */\n nextCursorPath?: string;\n /**\n * Query parameter name to use for the cursor in the next request.\n * Use this for APIs that page with query params.\n */\n cursorParam?: string;\n /**\n * Dot-path in the JSON request body to set to the cursor value in the next\n * request. Use this for APIs that page via POST body fields.\n */\n cursorBodyPath?: string;\n /**\n * Use page-number mode: send `pageParam=N` for each subsequent page.\n */\n pageParam?: string;\n /** Starting page number (default 1). */\n startPage?: number;\n /**\n * Use offset mode: send `offsetParam=N` for each subsequent request.\n */\n offsetParam?: string;\n /**\n * Hint at expected page size for offset increments. Defaults to the\n * actual item count of the first page.\n */\n pageSize?: number;\n /** Maximum pages to fetch (default 50, max 200). */\n maxPages?: number;\n}\n\nexport interface StageAsOptions {\n stageAs: string;\n itemsPath?: ItemsPath;\n pagination?: PaginationConfig;\n}\n\nexport interface StagingRequestArgs extends ProviderApiRequestArgs {\n stageAs?: string;\n itemsPath?: ItemsPath;\n pagination?: PaginationConfig;\n}\n\nexport interface StagingResult {\n dataset: {\n id: string;\n name: string;\n rowCount: number;\n columns: string[];\n sampleRows: Record<string, unknown>[];\n };\n pages?: number;\n rows?: number;\n truncated?: boolean;\n lastCursor?: string | number | null;\n provider: unknown;\n request: unknown;\n guidance: string;\n}\n\n// ---------------------------------------------------------------------------\n// Resolve runtime context for scope (appId + ownerEmail)\n// ---------------------------------------------------------------------------\n\n/** Minimal callable interface accepted by stagingExecuteRequest. */\nexport type ProviderApiExecutor = (\n args: ProviderApiRequestArgs,\n) => Promise<unknown>;\n\nexport interface StagingRuntimeContext {\n appId: string;\n ownerEmail: string;\n}\n\n// ---------------------------------------------------------------------------\n// JSON path resolution helper\n// ---------------------------------------------------------------------------\n\nfunction getAtPath(obj: unknown, path: string): unknown {\n if (!path || obj === undefined || obj === null) return obj;\n const parts = path.split(\".\");\n let cur: unknown = obj;\n for (const part of parts) {\n if (cur === null || cur === undefined || typeof cur !== \"object\")\n return undefined;\n cur = (cur as Record<string, unknown>)[part];\n }\n return cur;\n}\n\n// ---------------------------------------------------------------------------\n// Auto-detect items array\n// ---------------------------------------------------------------------------\n\nexport function extractItemsArray(\n body: unknown,\n itemsPath: ItemsPath = \"auto\",\n): unknown[] {\n if (!body || typeof body !== \"object\") return [];\n\n if (Array.isArray(body)) return body as unknown[];\n\n if (itemsPath !== \"auto\") {\n const val = getAtPath(body, itemsPath);\n return Array.isArray(val) ? (val as unknown[]) : [];\n }\n\n // Auto-detect: common shapes\n const obj = body as Record<string, unknown>;\n for (const key of [\"data\", \"results\", \"items\", \"records\", \"rows\"]) {\n if (Array.isArray(obj[key])) return obj[key] as unknown[];\n }\n\n // Many provider APIs return `{ providerSpecificName: [...], metadata: ... }`.\n // If exactly one top-level field is an array, treat that as the item list\n // without hardcoding provider vocabulary.\n const arrayFields = Object.values(obj).filter(Array.isArray);\n if (arrayFields.length === 1) {\n return arrayFields[0] as unknown[];\n }\n\n // If the object itself looks like a flat row, wrap it\n return [];\n}\n\nfunction extractNextCursor(body: unknown, path: string): string | null {\n const val = getAtPath(body, path);\n if (val === null || val === undefined || val === \"\" || val === false)\n return null;\n return String(val);\n}\n\nfunction setAtPath(base: unknown, path: string, value: unknown): unknown {\n const root =\n base && typeof base === \"object\" && !Array.isArray(base)\n ? { ...(base as Record<string, unknown>) }\n : {};\n const parts = path.split(\".\").filter(Boolean);\n if (!parts.length) return root;\n\n let current: Record<string, unknown> = root;\n for (const part of parts.slice(0, -1)) {\n const existing = current[part];\n const next =\n existing && typeof existing === \"object\" && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : {};\n current[part] = next;\n current = next;\n }\n current[parts[parts.length - 1]!] = value;\n return root;\n}\n\n// ---------------------------------------------------------------------------\n// 429 / Retry-After handling\n// ---------------------------------------------------------------------------\n\nasync function sleepMs(ms: number): Promise<void> {\n await new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nfunction getRetryAfterMs(\n responseHeaders: Record<string, string> | undefined,\n attempt: number,\n): number {\n if (responseHeaders) {\n const raw =\n responseHeaders[\"retry-after\"] ?? responseHeaders[\"Retry-After\"];\n if (raw) {\n const secs = parseFloat(raw);\n if (!isNaN(secs)) return secs * 1000;\n }\n }\n // Exponential back-off: 1s, 2s, 4s, 8s, cap 30s\n return Math.min(1000 * Math.pow(2, attempt), 30_000);\n}\n\n// ---------------------------------------------------------------------------\n// Core staging executor\n// ---------------------------------------------------------------------------\n\n/**\n * Execute a provider API request and stage the result into scratch storage.\n * Returns a compact summary instead of the raw body.\n *\n * @param args — request args including stageAs / itemsPath / pagination\n * @param execute — callable provider executor (e.g. `runtime.executeRequest.bind(runtime)`)\n * @param ctx — (appId, ownerEmail) for dataset ownership scoping\n */\nexport async function stagingExecuteRequest(\n args: StagingRequestArgs,\n execute: ProviderApiExecutor,\n ctx: StagingRuntimeContext,\n): Promise<StagingResult> {\n const datasetName = args.stageAs!;\n const itemsPath = args.itemsPath ?? \"auto\";\n const pagination = args.pagination;\n const maxPages = Math.min(pagination?.maxPages ?? 50, 200);\n if (\n pagination?.nextCursorPath &&\n !pagination.cursorParam &&\n !pagination.cursorBodyPath\n ) {\n throw new Error(\n \"Pagination with nextCursorPath requires cursorParam or cursorBodyPath.\",\n );\n }\n\n // Strip staging fields from the underlying request args\n const baseArgs: ProviderApiRequestArgs = {\n provider: args.provider,\n method: args.method,\n path: args.path,\n query: args.query,\n headers: args.headers,\n body: args.body,\n auth: args.auth,\n timeoutMs: args.timeoutMs,\n maxBytes: args.maxBytes,\n connectionId: args.connectionId,\n accountId: args.accountId,\n };\n\n let allRows: Record<string, unknown>[] = [];\n let pages = 0;\n let truncated = false;\n let lastCursor: string | number | null = null;\n let providerMeta: unknown;\n let requestMeta: unknown;\n\n // Generate a stable dataset id for this name+owner combination so re-staging\n // the same dataset replaces it rather than accumulating duplicates.\n const datasetId = `ds_${ctx.appId}_${ctx.ownerEmail}_${datasetName}`\n .replace(/[^a-zA-Z0-9_-]/g, \"_\")\n .slice(0, 80);\n\n // -------------------------------------------------------------------------\n // Page loop\n // -------------------------------------------------------------------------\n let currentArgs = { ...baseArgs };\n let pageNum = pagination?.startPage ?? 1;\n let offset = 0;\n\n for (let pageIndex = 0; pageIndex < maxPages; pageIndex++) {\n // Inject pagination params for pages 2+\n if (pageIndex > 0 && pagination) {\n const extraQuery: Record<string, unknown> =\n typeof baseArgs.query === \"object\" && baseArgs.query !== null\n ? { ...(baseArgs.query as Record<string, unknown>) }\n : {};\n let nextBody = baseArgs.body;\n\n if (pagination.cursorParam && lastCursor !== null) {\n extraQuery[pagination.cursorParam] = lastCursor;\n }\n if (pagination.cursorBodyPath && lastCursor !== null) {\n nextBody = setAtPath(\n baseArgs.body,\n pagination.cursorBodyPath,\n lastCursor,\n );\n }\n const hasCursorMode =\n Boolean(pagination.cursorParam) || Boolean(pagination.cursorBodyPath);\n if (pagination.pageParam && !hasCursorMode) {\n extraQuery[pagination.pageParam] = pageNum;\n } else if (pagination.offsetParam && !hasCursorMode) {\n extraQuery[pagination.offsetParam] = offset;\n } else if (!hasCursorMode) {\n // No pagination config for next page — stop\n break;\n }\n currentArgs = { ...baseArgs, query: extraQuery, body: nextBody };\n }\n\n // -----------------------------------------------------------------------\n // Execute with retry on 429\n // -----------------------------------------------------------------------\n let result: Record<string, unknown>;\n let attempt = 0;\n for (;;) {\n const raw = (await execute(currentArgs)) as Record<string, unknown>;\n const response = raw.response as Record<string, unknown> | undefined;\n if (response?.status === 429) {\n if (attempt >= 5) {\n throw new Error(\n `Provider returned 429 Too Many Requests after ${attempt + 1} attempts. ` +\n `Try again later or reduce the page count.`,\n );\n }\n const waitMs = getRetryAfterMs(\n response.headers as Record<string, string> | undefined,\n attempt,\n );\n await sleepMs(waitMs);\n attempt++;\n continue;\n }\n result = raw;\n break;\n }\n\n pages++;\n if (pageIndex === 0) {\n providerMeta = result.provider;\n requestMeta = result.request;\n }\n\n const response = result.response as Record<string, unknown> | undefined;\n if (!response?.ok) {\n // Non-200 on first page is a hard error; on subsequent pages, stop early\n if (pageIndex === 0) {\n throw new Error(\n `Provider API returned status ${response?.status}: ${JSON.stringify(response?.json ?? response?.text).slice(0, 200)}`,\n );\n }\n truncated = true;\n break;\n }\n\n const body =\n response.json ??\n (response.text ? tryParseJson(response.text as string) : null);\n const pageRows = extractItemsArray(body, itemsPath);\n\n if (pageRows.length === 0) {\n // Empty page — end of data\n break;\n }\n\n const typedRows = pageRows.map((r) =>\n r && typeof r === \"object\"\n ? (r as Record<string, unknown>)\n : { value: r },\n );\n allRows = allRows.concat(typedRows);\n\n // Cap check — stop before exceeding limit\n if (allRows.length >= MAX_ROWS_PER_APP) {\n truncated = true;\n allRows = allRows.slice(0, MAX_ROWS_PER_APP);\n break;\n }\n\n // If no pagination config or single-page mode, stop after first page\n if (!pagination || pageIndex === maxPages - 1) {\n if (pageIndex === maxPages - 1 && pagination) truncated = true;\n break;\n }\n\n // Derive next cursor / offset / page\n if (pagination.nextCursorPath) {\n const next = extractNextCursor(body, pagination.nextCursorPath);\n if (!next) break; // No more pages\n lastCursor = next;\n } else if (pagination.pageParam) {\n pageNum++;\n } else if (pagination.offsetParam) {\n const pageSize = pagination.pageSize ?? pageRows.length;\n offset += pageSize;\n } else {\n break;\n }\n }\n\n // -------------------------------------------------------------------------\n // Persist to staging store\n // -------------------------------------------------------------------------\n const columns = deriveColumns(allRows);\n const meta = await upsertStagedDataset({\n id: datasetId,\n appId: ctx.appId,\n ownerEmail: ctx.ownerEmail,\n name: datasetName,\n rows: allRows,\n columns,\n });\n\n return {\n dataset: {\n id: meta.id,\n name: meta.name,\n rowCount: meta.rowCount,\n columns: meta.columns,\n sampleRows: allRows.slice(0, 5),\n },\n ...(pagination\n ? {\n pages,\n rows: allRows.length,\n truncated,\n lastCursor,\n }\n : {}),\n provider: providerMeta,\n request: requestMeta,\n guidance:\n \"Data staged successfully. Use query-staged-dataset to run aggregations on this dataset without re-fetching. \" +\n \"Staging avoids sending raw response bodies through the context window.\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utility\n// ---------------------------------------------------------------------------\n\nfunction tryParseJson(text: string): unknown | null {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n"]}
@@ -206,7 +206,7 @@ export interface AgentChatPluginOptions {
206
206
  * prompt by default.
207
207
  *
208
208
  * - `providerActions`: external provider action names this template exposes
209
- * (e.g. `["bigquery", "ga4-report"]` for the analytics template).
209
+ * (e.g. `["warehouse-query", "crm-records"]` for a template).
210
210
  * - `appActions`: representative template action names for rule 5's refresh
211
211
  * examples (e.g. `["log-meal", "update-form"]` for a forms template).
212
212
  */
@@ -1 +1 @@
1
- {"version":3,"file":"agent-chat-plugin.d.ts","sourceRoot":"","sources":["../../src/server/agent-chat-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-chat-plugin.d.ts","sourceRoot":"","sources":["../../src/server/agent-chat-plugin.ts"],"names":[],"mappings":"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"}