trellis 2.0.8 → 2.0.13

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 (42) hide show
  1. package/README.md +279 -116
  2. package/dist/cli/index.js +655 -4
  3. package/dist/core/index.js +471 -2
  4. package/dist/embeddings/index.js +5 -1
  5. package/dist/{index-s603ev6w.js → index-5b01h414.js} +1 -1
  6. package/dist/index-5m0g9r0y.js +1100 -0
  7. package/dist/{index-zf6htvnm.js → index-7gvjxt27.js} +166 -2
  8. package/dist/index-hybgxe40.js +1174 -0
  9. package/dist/index.js +7 -2
  10. package/dist/transformers.node-bx3q9d7k.js +33130 -0
  11. package/package.json +9 -4
  12. package/src/cli/index.ts +939 -0
  13. package/src/core/agents/harness.ts +380 -0
  14. package/src/core/agents/index.ts +18 -0
  15. package/src/core/agents/types.ts +90 -0
  16. package/src/core/index.ts +85 -2
  17. package/src/core/kernel/trellis-kernel.ts +593 -0
  18. package/src/core/ontology/builtins.ts +248 -0
  19. package/src/core/ontology/index.ts +34 -0
  20. package/src/core/ontology/registry.ts +209 -0
  21. package/src/core/ontology/types.ts +124 -0
  22. package/src/core/ontology/validator.ts +382 -0
  23. package/src/core/persist/backend.ts +10 -0
  24. package/src/core/persist/sqlite-backend.ts +298 -0
  25. package/src/core/plugins/index.ts +17 -0
  26. package/src/core/plugins/registry.ts +322 -0
  27. package/src/core/plugins/types.ts +126 -0
  28. package/src/core/query/datalog.ts +188 -0
  29. package/src/core/query/engine.ts +370 -0
  30. package/src/core/query/index.ts +34 -0
  31. package/src/core/query/parser.ts +481 -0
  32. package/src/core/query/types.ts +200 -0
  33. package/src/embeddings/auto-embed.ts +248 -0
  34. package/src/embeddings/index.ts +7 -0
  35. package/src/embeddings/model.ts +21 -4
  36. package/src/embeddings/types.ts +8 -1
  37. package/src/index.ts +9 -0
  38. package/src/sync/http-transport.ts +144 -0
  39. package/src/sync/index.ts +11 -0
  40. package/src/sync/multi-repo.ts +200 -0
  41. package/src/sync/ws-transport.ts +145 -0
  42. package/dist/index-5bhe57y9.js +0 -326
@@ -15,12 +15,23 @@ var init_types = __esm(() => {
15
15
  });
16
16
 
17
17
  // src/embeddings/model.ts
18
+ async function importTransformers() {
19
+ try {
20
+ return await import("./transformers.node-bx3q9d7k.js");
21
+ } catch {
22
+ try {
23
+ return await import("@xenova/transformers");
24
+ } catch {
25
+ throw new Error("No transformers library found. Install @huggingface/transformers (recommended) or @xenova/transformers.");
26
+ }
27
+ }
28
+ }
18
29
  async function loadModel(config = DEFAULT_MODEL_CONFIG) {
19
30
  if (pipeline)
20
31
  return pipeline;
21
32
  if (!loadPromise) {
22
33
  loadPromise = (async () => {
23
- const { pipeline: createPipeline } = await import("@xenova/transformers");
34
+ const { pipeline: createPipeline } = await importTransformers();
24
35
  const opts = {};
25
36
  if (config.cacheDir) {
26
37
  opts.cache_dir = config.cacheDir;
@@ -652,6 +663,156 @@ var init_search = __esm(() => {
652
663
  init_chunker();
653
664
  });
654
665
 
666
+ // src/embeddings/auto-embed.ts
667
+ function entitySummaryText(entityId, facts, links) {
668
+ const type = facts.find((f) => f.a === "type")?.v ?? "Entity";
669
+ const name = facts.find((f) => f.a === "name" || f.a === "title")?.v ?? entityId;
670
+ const parts = [`${type}: ${name} (${entityId})`];
671
+ const attrs = facts.filter((f) => !["type", "name", "title", "createdAt", "updatedAt"].includes(f.a));
672
+ if (attrs.length > 0) {
673
+ parts.push(attrs.map((f) => ` ${f.a} = ${f.v}`).join(`
674
+ `));
675
+ }
676
+ if (links.length > 0) {
677
+ parts.push("Relations:");
678
+ parts.push(links.map((l) => ` ${l.a} \u2192 ${l.e2}`).join(`
679
+ `));
680
+ }
681
+ return parts.join(`
682
+ `);
683
+ }
684
+ function createAutoEmbedMiddleware(options) {
685
+ const store = new VectorStore(options.dbPath);
686
+ const embedFn = options.embedFn ?? embed;
687
+ const embedIndividual = options.embedIndividualFacts ?? false;
688
+ return {
689
+ name: "auto-embed",
690
+ handleOp: async (op, ctx, next) => {
691
+ await next(op, ctx);
692
+ try {
693
+ await _processOp(op, store, embedFn, embedIndividual);
694
+ } catch {}
695
+ },
696
+ close: () => {
697
+ store.close();
698
+ }
699
+ };
700
+ }
701
+ async function _processOp(op, store, embedFn, embedIndividual) {
702
+ const now = new Date().toISOString();
703
+ const entityIds = new Set;
704
+ if (op.facts)
705
+ for (const f of op.facts)
706
+ entityIds.add(f.e);
707
+ if (op.links)
708
+ for (const l of op.links) {
709
+ entityIds.add(l.e1);
710
+ entityIds.add(l.e2);
711
+ }
712
+ if (op.deleteFacts)
713
+ for (const f of op.deleteFacts)
714
+ entityIds.add(f.e);
715
+ if (op.deleteLinks)
716
+ for (const l of op.deleteLinks) {
717
+ entityIds.add(l.e1);
718
+ entityIds.add(l.e2);
719
+ }
720
+ if (op.deleteFacts || op.deleteLinks) {
721
+ for (const eid of entityIds) {
722
+ store.deleteByEntity(eid);
723
+ }
724
+ }
725
+ if (op.facts && op.facts.length > 0) {
726
+ const factsByEntity = new Map;
727
+ for (const f of op.facts) {
728
+ const existing = factsByEntity.get(f.e) ?? [];
729
+ existing.push(f);
730
+ factsByEntity.set(f.e, existing);
731
+ }
732
+ const linksByEntity = new Map;
733
+ if (op.links) {
734
+ for (const l of op.links) {
735
+ const existing = linksByEntity.get(l.e1) ?? [];
736
+ existing.push(l);
737
+ linksByEntity.set(l.e1, existing);
738
+ }
739
+ }
740
+ const records = [];
741
+ for (const [eid, facts] of factsByEntity) {
742
+ const links = linksByEntity.get(eid) ?? [];
743
+ const summaryText = entitySummaryText(eid, facts, links);
744
+ if (summaryText.trim()) {
745
+ try {
746
+ const vector = await embedFn(summaryText);
747
+ records.push({
748
+ id: `entity:${eid}:summary`,
749
+ entityId: eid,
750
+ content: summaryText,
751
+ chunkType: "summary_md",
752
+ updatedAt: now,
753
+ embedding: vector
754
+ });
755
+ } catch {}
756
+ }
757
+ if (embedIndividual) {
758
+ for (const fact of facts) {
759
+ if (["type", "createdAt", "updatedAt"].includes(fact.a))
760
+ continue;
761
+ const text = `${fact.a}: ${fact.v}`;
762
+ try {
763
+ const vector = await embedFn(text);
764
+ records.push({
765
+ id: `entity:${eid}:fact:${fact.a}`,
766
+ entityId: eid,
767
+ content: text,
768
+ chunkType: "doc_comment",
769
+ updatedAt: now,
770
+ embedding: vector
771
+ });
772
+ } catch {}
773
+ }
774
+ }
775
+ }
776
+ if (records.length > 0) {
777
+ store.upsertBatch(records);
778
+ }
779
+ }
780
+ }
781
+ async function buildRAGContext(query, vectorStore, embedFn = embed, options) {
782
+ const maxChunks = options?.maxChunks ?? 10;
783
+ const maxTokens = options?.maxTokens ?? 4000;
784
+ const minScore = options?.minScore ?? 0.1;
785
+ const queryVector = await embedFn(query);
786
+ const results = vectorStore.search(queryVector, {
787
+ limit: maxChunks * 2,
788
+ minScore
789
+ });
790
+ const chunks = [];
791
+ let totalChars = 0;
792
+ for (const r of results) {
793
+ if (chunks.length >= maxChunks)
794
+ break;
795
+ if (totalChars + r.chunk.content.length > maxTokens * 4)
796
+ break;
797
+ chunks.push({
798
+ content: r.chunk.content,
799
+ entityId: r.chunk.entityId,
800
+ score: r.score,
801
+ chunkType: r.chunk.chunkType
802
+ });
803
+ totalChars += r.chunk.content.length;
804
+ }
805
+ return {
806
+ query,
807
+ chunks,
808
+ estimatedTokens: Math.ceil(totalChars / 4)
809
+ };
810
+ }
811
+ var init_auto_embed = __esm(() => {
812
+ init_store();
813
+ init_model();
814
+ });
815
+
655
816
  // src/embeddings/index.ts
656
817
  var exports_embeddings = {};
657
818
  __export(exports_embeddings, {
@@ -660,6 +821,7 @@ __export(exports_embeddings, {
660
821
  loadModel: () => loadModel,
661
822
  embedBatch: () => embedBatch,
662
823
  embed: () => embed,
824
+ createAutoEmbedMiddleware: () => createAutoEmbedMiddleware,
663
825
  cosineSimilarity: () => cosineSimilarity,
664
826
  chunkSummary: () => chunkSummary,
665
827
  chunkMilestone: () => chunkMilestone,
@@ -669,6 +831,7 @@ __export(exports_embeddings, {
669
831
  chunkDocComments: () => chunkDocComments,
670
832
  chunkDecision: () => chunkDecision,
671
833
  chunkCodeEntities: () => chunkCodeEntities,
834
+ buildRAGContext: () => buildRAGContext,
672
835
  VectorStore: () => VectorStore,
673
836
  EmbeddingManager: () => EmbeddingManager,
674
837
  DEFAULT_MODEL_CONFIG: () => DEFAULT_MODEL_CONFIG
@@ -678,7 +841,8 @@ var init_embeddings = __esm(() => {
678
841
  init_model();
679
842
  init_store();
680
843
  init_search();
844
+ init_auto_embed();
681
845
  init_chunker();
682
846
  });
683
847
 
684
- export { DEFAULT_MODEL_CONFIG, loadModel, embed, embedBatch, resetModel, VectorStore, cosineSimilarity, chunkIssue, chunkDecision, chunkMilestone, chunkMarkdown, chunkCodeEntities, chunkDocComments, chunkSummary, chunkFile, slidingWindow, EmbeddingManager, exports_embeddings, init_embeddings };
848
+ export { DEFAULT_MODEL_CONFIG, loadModel, embed, embedBatch, resetModel, init_model, VectorStore, cosineSimilarity, init_store, chunkIssue, chunkDecision, chunkMilestone, chunkMarkdown, chunkCodeEntities, chunkDocComments, chunkSummary, chunkFile, slidingWindow, EmbeddingManager, createAutoEmbedMiddleware, buildRAGContext, init_auto_embed, exports_embeddings, init_embeddings };