learngraph 0.1.1 → 0.3.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 (150) hide show
  1. package/LICENSE +190 -21
  2. package/README.md +165 -3
  3. package/dist/cjs/llm/adapters/anthropic.js +124 -0
  4. package/dist/cjs/llm/adapters/anthropic.js.map +1 -0
  5. package/dist/cjs/llm/adapters/base.js +100 -0
  6. package/dist/cjs/llm/adapters/base.js.map +1 -0
  7. package/dist/cjs/llm/adapters/index.js +22 -0
  8. package/dist/cjs/llm/adapters/index.js.map +1 -0
  9. package/dist/cjs/llm/adapters/ollama.js +149 -0
  10. package/dist/cjs/llm/adapters/ollama.js.map +1 -0
  11. package/dist/cjs/llm/adapters/openai.js +126 -0
  12. package/dist/cjs/llm/adapters/openai.js.map +1 -0
  13. package/dist/cjs/llm/index.js +34 -5
  14. package/dist/cjs/llm/index.js.map +1 -1
  15. package/dist/cjs/llm/orchestrator.js +219 -0
  16. package/dist/cjs/llm/orchestrator.js.map +1 -0
  17. package/dist/cjs/llm/prompts.js +367 -0
  18. package/dist/cjs/llm/prompts.js.map +1 -0
  19. package/dist/cjs/parsers/base.js +189 -0
  20. package/dist/cjs/parsers/base.js.map +1 -0
  21. package/dist/cjs/parsers/demo.js +159 -0
  22. package/dist/cjs/parsers/demo.js.map +1 -0
  23. package/dist/cjs/parsers/extractor.js +191 -0
  24. package/dist/cjs/parsers/extractor.js.map +1 -0
  25. package/dist/cjs/parsers/index.js +43 -4
  26. package/dist/cjs/parsers/index.js.map +1 -1
  27. package/dist/cjs/parsers/json.js +157 -0
  28. package/dist/cjs/parsers/json.js.map +1 -0
  29. package/dist/cjs/parsers/markdown.js +168 -0
  30. package/dist/cjs/parsers/markdown.js.map +1 -0
  31. package/dist/cjs/parsers/samples.js +139 -0
  32. package/dist/cjs/parsers/samples.js.map +1 -0
  33. package/dist/cjs/storage/base.js +231 -0
  34. package/dist/cjs/storage/base.js.map +1 -0
  35. package/dist/cjs/storage/errors.js +128 -0
  36. package/dist/cjs/storage/errors.js.map +1 -0
  37. package/dist/cjs/storage/index.js +92 -5
  38. package/dist/cjs/storage/index.js.map +1 -1
  39. package/dist/cjs/storage/levelgraph.js +855 -0
  40. package/dist/cjs/storage/levelgraph.js.map +1 -0
  41. package/dist/cjs/storage/memory.js +447 -0
  42. package/dist/cjs/storage/memory.js.map +1 -0
  43. package/dist/cjs/storage/neo4j.js +866 -0
  44. package/dist/cjs/storage/neo4j.js.map +1 -0
  45. package/dist/cjs/storage/seeds.js +565 -0
  46. package/dist/cjs/storage/seeds.js.map +1 -0
  47. package/dist/cjs/types/llm.js +8 -0
  48. package/dist/cjs/types/llm.js.map +1 -0
  49. package/dist/cjs/types/parser.js +8 -0
  50. package/dist/cjs/types/parser.js.map +1 -0
  51. package/dist/esm/llm/adapters/anthropic.js +119 -0
  52. package/dist/esm/llm/adapters/anthropic.js.map +1 -0
  53. package/dist/esm/llm/adapters/base.js +95 -0
  54. package/dist/esm/llm/adapters/base.js.map +1 -0
  55. package/dist/esm/llm/adapters/index.js +10 -0
  56. package/dist/esm/llm/adapters/index.js.map +1 -0
  57. package/dist/esm/llm/adapters/ollama.js +144 -0
  58. package/dist/esm/llm/adapters/ollama.js.map +1 -0
  59. package/dist/esm/llm/adapters/openai.js +121 -0
  60. package/dist/esm/llm/adapters/openai.js.map +1 -0
  61. package/dist/esm/llm/index.js +12 -6
  62. package/dist/esm/llm/index.js.map +1 -1
  63. package/dist/esm/llm/orchestrator.js +214 -0
  64. package/dist/esm/llm/orchestrator.js.map +1 -0
  65. package/dist/esm/llm/prompts.js +360 -0
  66. package/dist/esm/llm/prompts.js.map +1 -0
  67. package/dist/esm/parsers/base.js +179 -0
  68. package/dist/esm/parsers/base.js.map +1 -0
  69. package/dist/esm/parsers/demo.js +154 -0
  70. package/dist/esm/parsers/demo.js.map +1 -0
  71. package/dist/esm/parsers/extractor.js +187 -0
  72. package/dist/esm/parsers/extractor.js.map +1 -0
  73. package/dist/esm/parsers/index.js +24 -5
  74. package/dist/esm/parsers/index.js.map +1 -1
  75. package/dist/esm/parsers/json.js +153 -0
  76. package/dist/esm/parsers/json.js.map +1 -0
  77. package/dist/esm/parsers/markdown.js +164 -0
  78. package/dist/esm/parsers/markdown.js.map +1 -0
  79. package/dist/esm/parsers/samples.js +136 -0
  80. package/dist/esm/parsers/samples.js.map +1 -0
  81. package/dist/esm/storage/base.js +221 -0
  82. package/dist/esm/storage/base.js.map +1 -0
  83. package/dist/esm/storage/errors.js +116 -0
  84. package/dist/esm/storage/errors.js.map +1 -0
  85. package/dist/esm/storage/index.js +71 -6
  86. package/dist/esm/storage/index.js.map +1 -1
  87. package/dist/esm/storage/levelgraph.js +818 -0
  88. package/dist/esm/storage/levelgraph.js.map +1 -0
  89. package/dist/esm/storage/memory.js +443 -0
  90. package/dist/esm/storage/memory.js.map +1 -0
  91. package/dist/esm/storage/neo4j.js +829 -0
  92. package/dist/esm/storage/neo4j.js.map +1 -0
  93. package/dist/esm/storage/seeds.js +561 -0
  94. package/dist/esm/storage/seeds.js.map +1 -0
  95. package/dist/esm/types/llm.js +7 -0
  96. package/dist/esm/types/llm.js.map +1 -0
  97. package/dist/esm/types/parser.js +7 -0
  98. package/dist/esm/types/parser.js.map +1 -0
  99. package/dist/types/llm/adapters/anthropic.d.ts +21 -0
  100. package/dist/types/llm/adapters/anthropic.d.ts.map +1 -0
  101. package/dist/types/llm/adapters/base.d.ts +46 -0
  102. package/dist/types/llm/adapters/base.d.ts.map +1 -0
  103. package/dist/types/llm/adapters/index.d.ts +11 -0
  104. package/dist/types/llm/adapters/index.d.ts.map +1 -0
  105. package/dist/types/llm/adapters/ollama.d.ts +30 -0
  106. package/dist/types/llm/adapters/ollama.d.ts.map +1 -0
  107. package/dist/types/llm/adapters/openai.d.ts +22 -0
  108. package/dist/types/llm/adapters/openai.d.ts.map +1 -0
  109. package/dist/types/llm/index.d.ts +5 -0
  110. package/dist/types/llm/index.d.ts.map +1 -1
  111. package/dist/types/llm/orchestrator.d.ts +35 -0
  112. package/dist/types/llm/orchestrator.d.ts.map +1 -0
  113. package/dist/types/llm/prompts.d.ts +269 -0
  114. package/dist/types/llm/prompts.d.ts.map +1 -0
  115. package/dist/types/parsers/base.d.ts +39 -0
  116. package/dist/types/parsers/base.d.ts.map +1 -0
  117. package/dist/types/parsers/demo.d.ts +87 -0
  118. package/dist/types/parsers/demo.d.ts.map +1 -0
  119. package/dist/types/parsers/extractor.d.ts +43 -0
  120. package/dist/types/parsers/extractor.d.ts.map +1 -0
  121. package/dist/types/parsers/index.d.ts +10 -0
  122. package/dist/types/parsers/index.d.ts.map +1 -1
  123. package/dist/types/parsers/json.d.ts +71 -0
  124. package/dist/types/parsers/json.d.ts.map +1 -0
  125. package/dist/types/parsers/markdown.d.ts +43 -0
  126. package/dist/types/parsers/markdown.d.ts.map +1 -0
  127. package/dist/types/parsers/samples.d.ts +27 -0
  128. package/dist/types/parsers/samples.d.ts.map +1 -0
  129. package/dist/types/storage/base.d.ts +39 -0
  130. package/dist/types/storage/base.d.ts.map +1 -0
  131. package/dist/types/storage/errors.d.ts +74 -0
  132. package/dist/types/storage/errors.d.ts.map +1 -0
  133. package/dist/types/storage/index.d.ts +50 -2
  134. package/dist/types/storage/index.d.ts.map +1 -1
  135. package/dist/types/storage/levelgraph.d.ts +92 -0
  136. package/dist/types/storage/levelgraph.d.ts.map +1 -0
  137. package/dist/types/storage/memory.d.ts +70 -0
  138. package/dist/types/storage/memory.d.ts.map +1 -0
  139. package/dist/types/storage/neo4j.d.ts +88 -0
  140. package/dist/types/storage/neo4j.d.ts.map +1 -0
  141. package/dist/types/storage/seeds.d.ts +27 -0
  142. package/dist/types/storage/seeds.d.ts.map +1 -0
  143. package/dist/types/types/index.d.ts +2 -0
  144. package/dist/types/types/index.d.ts.map +1 -1
  145. package/dist/types/types/llm.d.ts +298 -0
  146. package/dist/types/types/llm.d.ts.map +1 -0
  147. package/dist/types/types/parser.d.ts +208 -0
  148. package/dist/types/types/parser.d.ts.map +1 -0
  149. package/package.json +4 -2
  150. package/scripts/postinstall.js +68 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/storage/errors.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,99 @@
1
1
  "use strict";
2
2
  /**
3
- * Graph storage adapters
3
+ * Graph storage adapters for LearnGraph
4
+ *
5
+ * Provides a unified interface for storing skill graphs with multiple
6
+ * backend options:
7
+ * - **MemoryStorage**: In-memory storage for testing
8
+ * - **LevelGraphStorage**: Browser/local storage using triples
9
+ * - **Neo4jStorage**: Production graph database
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { MemoryStorage, Neo4jStorage, LevelGraphStorage } from 'learngraph/storage';
14
+ *
15
+ * // For testing
16
+ * const testStorage = new MemoryStorage();
17
+ * await testStorage.connect({ backend: 'memory' });
18
+ *
19
+ * // For browser/local development
20
+ * const localStorage = new LevelGraphStorage();
21
+ * await localStorage.connect({ backend: 'levelgraph', path: './my-graph' });
22
+ *
23
+ * // For production
24
+ * const prodStorage = new Neo4jStorage();
25
+ * await prodStorage.connect({
26
+ * backend: 'neo4j',
27
+ * uri: 'bolt://localhost:7687',
28
+ * username: 'neo4j',
29
+ * password: 'password',
30
+ * });
31
+ *
32
+ * // Same API for all!
33
+ * const skill = await storage.createSkill({ ... });
34
+ * const prereqs = await storage.getPrerequisitesOf(skill.id);
35
+ * ```
4
36
  *
5
37
  * @packageDocumentation
6
38
  */
7
39
  Object.defineProperty(exports, "__esModule", { value: true });
8
- // Storage adapters will be implemented in Phase 2
9
- // export { Neo4jStorage } from './neo4j.js';
10
- // export { LevelGraphStorage } from './levelgraph.js';
11
- // export { MemoryStorage } from './memory.js';
40
+ exports.Neo4jStorage = exports.LevelGraphStorage = exports.MemoryStorage = exports.calculateStats = exports.validateEdgeInput = exports.validateSkillInput = exports.inputToEdge = exports.inputToSkillNode = exports.nowISO = exports.generateId = exports.CycleDetectedError = exports.TimeoutError = exports.ValidationError = exports.ReferenceError = exports.DuplicateError = exports.NotFoundError = exports.NotConnectedError = exports.ConnectionError = exports.StorageError = void 0;
41
+ exports.createStorage = createStorage;
42
+ // ─────────────────────────────────────────────────────────────────────────────
43
+ // Storage Errors
44
+ // ─────────────────────────────────────────────────────────────────────────────
45
+ var errors_js_1 = require("./errors.js");
46
+ Object.defineProperty(exports, "StorageError", { enumerable: true, get: function () { return errors_js_1.StorageError; } });
47
+ Object.defineProperty(exports, "ConnectionError", { enumerable: true, get: function () { return errors_js_1.ConnectionError; } });
48
+ Object.defineProperty(exports, "NotConnectedError", { enumerable: true, get: function () { return errors_js_1.NotConnectedError; } });
49
+ Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return errors_js_1.NotFoundError; } });
50
+ Object.defineProperty(exports, "DuplicateError", { enumerable: true, get: function () { return errors_js_1.DuplicateError; } });
51
+ Object.defineProperty(exports, "ReferenceError", { enumerable: true, get: function () { return errors_js_1.ReferenceError; } });
52
+ Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_js_1.ValidationError; } });
53
+ Object.defineProperty(exports, "TimeoutError", { enumerable: true, get: function () { return errors_js_1.TimeoutError; } });
54
+ Object.defineProperty(exports, "CycleDetectedError", { enumerable: true, get: function () { return errors_js_1.CycleDetectedError; } });
55
+ // ─────────────────────────────────────────────────────────────────────────────
56
+ // Base Utilities
57
+ // ─────────────────────────────────────────────────────────────────────────────
58
+ var base_js_1 = require("./base.js");
59
+ Object.defineProperty(exports, "generateId", { enumerable: true, get: function () { return base_js_1.generateId; } });
60
+ Object.defineProperty(exports, "nowISO", { enumerable: true, get: function () { return base_js_1.nowISO; } });
61
+ Object.defineProperty(exports, "inputToSkillNode", { enumerable: true, get: function () { return base_js_1.inputToSkillNode; } });
62
+ Object.defineProperty(exports, "inputToEdge", { enumerable: true, get: function () { return base_js_1.inputToEdge; } });
63
+ Object.defineProperty(exports, "validateSkillInput", { enumerable: true, get: function () { return base_js_1.validateSkillInput; } });
64
+ Object.defineProperty(exports, "validateEdgeInput", { enumerable: true, get: function () { return base_js_1.validateEdgeInput; } });
65
+ Object.defineProperty(exports, "calculateStats", { enumerable: true, get: function () { return base_js_1.calculateStats; } });
66
+ // ─────────────────────────────────────────────────────────────────────────────
67
+ // Storage Adapters
68
+ // ─────────────────────────────────────────────────────────────────────────────
69
+ var memory_js_1 = require("./memory.js");
70
+ Object.defineProperty(exports, "MemoryStorage", { enumerable: true, get: function () { return memory_js_1.MemoryStorage; } });
71
+ var levelgraph_js_1 = require("./levelgraph.js");
72
+ Object.defineProperty(exports, "LevelGraphStorage", { enumerable: true, get: function () { return levelgraph_js_1.LevelGraphStorage; } });
73
+ var neo4j_js_1 = require("./neo4j.js");
74
+ Object.defineProperty(exports, "Neo4jStorage", { enumerable: true, get: function () { return neo4j_js_1.Neo4jStorage; } });
75
+ const memory_js_2 = require("./memory.js");
76
+ const levelgraph_js_2 = require("./levelgraph.js");
77
+ const neo4j_js_2 = require("./neo4j.js");
78
+ /**
79
+ * Create a storage adapter based on configuration.
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const storage = createStorage({ backend: 'memory' });
84
+ * await storage.connect({ backend: 'memory' });
85
+ * ```
86
+ */
87
+ function createStorage(config) {
88
+ switch (config.backend) {
89
+ case 'memory':
90
+ return new memory_js_2.MemoryStorage();
91
+ case 'levelgraph':
92
+ return new levelgraph_js_2.LevelGraphStorage();
93
+ case 'neo4j':
94
+ return new neo4j_js_2.Neo4jStorage();
95
+ default:
96
+ throw new Error(`Unknown storage backend: ${config.backend}`);
97
+ }
98
+ }
12
99
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAeH,kDAAkD;AAClD,6CAA6C;AAC7C,uDAAuD;AACvD,+CAA+C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;;;AAsEH,sCAWC;AA/DD,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAChF,yCAUqB;AATnB,yGAAA,YAAY,OAAA;AACZ,4GAAA,eAAe,OAAA;AACf,8GAAA,iBAAiB,OAAA;AACjB,0GAAA,aAAa,OAAA;AACb,2GAAA,cAAc,OAAA;AACd,2GAAA,cAAc,OAAA;AACd,4GAAA,eAAe,OAAA;AACf,yGAAA,YAAY,OAAA;AACZ,+GAAA,kBAAkB,OAAA;AAGpB,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAChF,qCAQmB;AAPjB,qGAAA,UAAU,OAAA;AACV,iGAAA,MAAM,OAAA;AACN,2GAAA,gBAAgB,OAAA;AAChB,sGAAA,WAAW,OAAA;AACX,6GAAA,kBAAkB,OAAA;AAClB,4GAAA,iBAAiB,OAAA;AACjB,yGAAA,cAAc,OAAA;AAGhB,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAChF,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AACtB,iDAAoD;AAA3C,kHAAA,iBAAiB,OAAA;AAC1B,uCAA0C;AAAjC,wGAAA,YAAY,OAAA;AAMrB,2CAA4C;AAC5C,mDAAoD;AACpD,yCAA0C;AAE1C;;;;;;;;GAQG;AACH,SAAgB,aAAa,CAAC,MAAqB;IACjD,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,QAAQ;YACX,OAAO,IAAI,yBAAa,EAAE,CAAC;QAC7B,KAAK,YAAY;YACf,OAAO,IAAI,iCAAiB,EAAE,CAAC;QACjC,KAAK,OAAO;YACV,OAAO,IAAI,uBAAY,EAAE,CAAC;QAC5B;YACE,MAAM,IAAI,KAAK,CAAC,4BAA6B,MAAwB,CAAC,OAAO,EAAE,CAAC,CAAC;IACrF,CAAC;AACH,CAAC"}