@mastra/pg 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/dist/docs/SKILL.md +40 -0
  3. package/dist/docs/assets/SOURCE_MAP.json +6 -0
  4. package/dist/docs/references/docs-memory-semantic-recall.md +272 -0
  5. package/dist/docs/references/docs-memory-storage.md +261 -0
  6. package/dist/docs/references/docs-memory-working-memory.md +400 -0
  7. package/dist/docs/references/docs-rag-overview.md +72 -0
  8. package/dist/docs/references/docs-rag-retrieval.md +515 -0
  9. package/dist/docs/references/docs-rag-vector-databases.md +645 -0
  10. package/dist/docs/references/reference-memory-memory-class.md +147 -0
  11. package/dist/docs/references/reference-processors-message-history-processor.md +85 -0
  12. package/dist/docs/references/reference-processors-semantic-recall-processor.md +117 -0
  13. package/dist/docs/references/reference-processors-working-memory-processor.md +152 -0
  14. package/dist/docs/references/reference-rag-metadata-filters.md +216 -0
  15. package/dist/docs/references/reference-storage-composite.md +235 -0
  16. package/dist/docs/references/reference-storage-dynamodb.md +282 -0
  17. package/dist/docs/references/reference-storage-postgresql.md +526 -0
  18. package/dist/docs/references/reference-tools-vector-query-tool.md +459 -0
  19. package/dist/docs/references/reference-vectors-pg.md +408 -0
  20. package/dist/index.cjs +62 -5
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.js +62 -5
  23. package/dist/index.js.map +1 -1
  24. package/dist/storage/db/index.d.ts.map +1 -1
  25. package/dist/storage/domains/memory/index.d.ts.map +1 -1
  26. package/dist/vector/index.d.ts.map +1 -1
  27. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -790,8 +790,12 @@ var PgVector = class extends MastraVector {
790
790
  }) {
791
791
  try {
792
792
  validateTopK("PG", topK);
793
- if (!Array.isArray(queryVector) || !queryVector.every((x) => typeof x === "number" && Number.isFinite(x))) {
794
- throw new Error("queryVector must be an array of finite numbers");
793
+ if (queryVector !== void 0) {
794
+ if (!Array.isArray(queryVector) || !queryVector.every((x) => typeof x === "number" && Number.isFinite(x))) {
795
+ throw new Error("queryVector must be an array of finite numbers");
796
+ }
797
+ } else if (!filter || Object.keys(filter).length === 0) {
798
+ throw new Error("Either queryVector or filter must be provided");
795
799
  }
796
800
  } catch (error) {
797
801
  const mastraError = new MastraError(
@@ -808,6 +812,46 @@ var PgVector = class extends MastraVector {
808
812
  this.logger?.trackException(mastraError);
809
813
  throw mastraError;
810
814
  }
815
+ if (queryVector === void 0) {
816
+ const client2 = await this.pool.connect();
817
+ try {
818
+ const translatedFilter = this.transformFilter(filter);
819
+ const { sql: filterQuery, values: filterValues } = buildDeleteFilterQuery(translatedFilter);
820
+ const { tableName } = this.getTableName(indexName);
821
+ const query = `
822
+ SELECT
823
+ vector_id as id,
824
+ metadata
825
+ ${includeVector ? ", embedding" : ""}
826
+ FROM ${tableName}
827
+ ${filterQuery}
828
+ ORDER BY vector_id
829
+ LIMIT $${filterValues.length + 1}`;
830
+ const result = await client2.query(query, [...filterValues, topK]);
831
+ return result.rows.map(({ id, metadata, embedding }) => ({
832
+ id,
833
+ score: 0,
834
+ metadata,
835
+ ...includeVector && embedding && { vector: JSON.parse(embedding) }
836
+ }));
837
+ } catch (error) {
838
+ const mastraError = new MastraError(
839
+ {
840
+ id: createVectorErrorId("PG", "QUERY", "FAILED"),
841
+ domain: ErrorDomain.MASTRA_VECTOR,
842
+ category: ErrorCategory.THIRD_PARTY,
843
+ details: {
844
+ indexName
845
+ }
846
+ },
847
+ error
848
+ );
849
+ this.logger?.trackException(mastraError);
850
+ throw mastraError;
851
+ } finally {
852
+ client2.release();
853
+ }
854
+ }
811
855
  const client = await this.pool.connect();
812
856
  try {
813
857
  await client.query("BEGIN");
@@ -2031,6 +2075,17 @@ function generateTableSQL({
2031
2075
  ADD CONSTRAINT ${workflowSnapshotConstraint}
2032
2076
  UNIQUE (workflow_name, run_id);
2033
2077
  END IF;
2078
+ IF EXISTS (
2079
+ SELECT 1 FROM pg_index i
2080
+ JOIN pg_class c ON i.indexrelid = c.oid
2081
+ JOIN pg_namespace n ON c.relnamespace = n.oid
2082
+ WHERE c.relname = lower('${workflowSnapshotConstraint}')
2083
+ AND n.nspname = '${schemaFilter}'
2084
+ AND i.indisreplident = false
2085
+ ) THEN
2086
+ ALTER TABLE ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })}
2087
+ REPLICA IDENTITY USING INDEX ${workflowSnapshotConstraint};
2088
+ END IF;
2034
2089
  END $$;
2035
2090
  ` : ""}
2036
2091
  ${// For spans table: Include PRIMARY KEY in exports, but not in runtime (handled after deduplication)
@@ -8570,11 +8625,13 @@ var MemoryPG = class _MemoryPG extends MemoryStorage {
8570
8625
  const maxOvershoot = retentionFloor * 0.95;
8571
8626
  const overshoot = bestOverTokens - targetMessageTokens;
8572
8627
  const remainingAfterOver = input.currentPendingTokens - bestOverTokens;
8573
- if (input.forceMaxActivation && bestOverBoundary > 0) {
8628
+ const remainingAfterUnder = input.currentPendingTokens - bestUnderTokens;
8629
+ const minRemaining = Math.min(1e3, retentionFloor);
8630
+ if (input.forceMaxActivation && bestOverBoundary > 0 && remainingAfterOver >= minRemaining) {
8574
8631
  chunksToActivate = bestOverBoundary;
8575
- } else if (bestOverBoundary > 0 && overshoot <= maxOvershoot && (remainingAfterOver >= 1e3 || retentionFloor === 0)) {
8632
+ } else if (bestOverBoundary > 0 && overshoot <= maxOvershoot && remainingAfterOver >= minRemaining) {
8576
8633
  chunksToActivate = bestOverBoundary;
8577
- } else if (bestUnderBoundary > 0) {
8634
+ } else if (bestUnderBoundary > 0 && remainingAfterUnder >= minRemaining) {
8578
8635
  chunksToActivate = bestUnderBoundary;
8579
8636
  } else if (bestOverBoundary > 0) {
8580
8637
  chunksToActivate = bestOverBoundary;