gnosys 4.0.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.
- package/LICENSE +21 -0
- package/README.md +1387 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3753 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2267 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/archive.d.ts +95 -0
- package/dist/lib/archive.d.ts.map +1 -0
- package/dist/lib/archive.js +311 -0
- package/dist/lib/archive.js.map +1 -0
- package/dist/lib/ask.d.ts +77 -0
- package/dist/lib/ask.d.ts.map +1 -0
- package/dist/lib/ask.js +316 -0
- package/dist/lib/ask.js.map +1 -0
- package/dist/lib/audit.d.ts +47 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +136 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/bootstrap.d.ts +56 -0
- package/dist/lib/bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap.js +163 -0
- package/dist/lib/bootstrap.js.map +1 -0
- package/dist/lib/config.d.ts +239 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +371 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dashboard.d.ts +81 -0
- package/dist/lib/dashboard.d.ts.map +1 -0
- package/dist/lib/dashboard.js +314 -0
- package/dist/lib/dashboard.js.map +1 -0
- package/dist/lib/db.d.ts +182 -0
- package/dist/lib/db.d.ts.map +1 -0
- package/dist/lib/db.js +620 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/dbSearch.d.ts +65 -0
- package/dist/lib/dbSearch.d.ts.map +1 -0
- package/dist/lib/dbSearch.js +239 -0
- package/dist/lib/dbSearch.js.map +1 -0
- package/dist/lib/dbWrite.d.ts +56 -0
- package/dist/lib/dbWrite.d.ts.map +1 -0
- package/dist/lib/dbWrite.js +171 -0
- package/dist/lib/dbWrite.js.map +1 -0
- package/dist/lib/dream.d.ts +170 -0
- package/dist/lib/dream.d.ts.map +1 -0
- package/dist/lib/dream.js +706 -0
- package/dist/lib/dream.js.map +1 -0
- package/dist/lib/embeddings.d.ts +84 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +226 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/export.d.ts +92 -0
- package/dist/lib/export.d.ts.map +1 -0
- package/dist/lib/export.js +362 -0
- package/dist/lib/export.js.map +1 -0
- package/dist/lib/federated.d.ts +113 -0
- package/dist/lib/federated.d.ts.map +1 -0
- package/dist/lib/federated.js +346 -0
- package/dist/lib/federated.js.map +1 -0
- package/dist/lib/graph.d.ts +50 -0
- package/dist/lib/graph.d.ts.map +1 -0
- package/dist/lib/graph.js +118 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/history.d.ts +39 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +112 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/hybridSearch.d.ts +80 -0
- package/dist/lib/hybridSearch.d.ts.map +1 -0
- package/dist/lib/hybridSearch.js +296 -0
- package/dist/lib/hybridSearch.js.map +1 -0
- package/dist/lib/import.d.ts +52 -0
- package/dist/lib/import.d.ts.map +1 -0
- package/dist/lib/import.js +365 -0
- package/dist/lib/import.js.map +1 -0
- package/dist/lib/ingest.d.ts +51 -0
- package/dist/lib/ingest.d.ts.map +1 -0
- package/dist/lib/ingest.js +144 -0
- package/dist/lib/ingest.js.map +1 -0
- package/dist/lib/lensing.d.ts +35 -0
- package/dist/lib/lensing.d.ts.map +1 -0
- package/dist/lib/lensing.js +85 -0
- package/dist/lib/lensing.js.map +1 -0
- package/dist/lib/llm.d.ts +84 -0
- package/dist/lib/llm.d.ts.map +1 -0
- package/dist/lib/llm.js +386 -0
- package/dist/lib/llm.js.map +1 -0
- package/dist/lib/lock.d.ts +28 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +145 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/maintenance.d.ts +124 -0
- package/dist/lib/maintenance.d.ts.map +1 -0
- package/dist/lib/maintenance.js +587 -0
- package/dist/lib/maintenance.js.map +1 -0
- package/dist/lib/migrate.d.ts +19 -0
- package/dist/lib/migrate.d.ts.map +1 -0
- package/dist/lib/migrate.js +260 -0
- package/dist/lib/migrate.js.map +1 -0
- package/dist/lib/preferences.d.ts +49 -0
- package/dist/lib/preferences.d.ts.map +1 -0
- package/dist/lib/preferences.js +149 -0
- package/dist/lib/preferences.js.map +1 -0
- package/dist/lib/projectIdentity.d.ts +66 -0
- package/dist/lib/projectIdentity.d.ts.map +1 -0
- package/dist/lib/projectIdentity.js +148 -0
- package/dist/lib/projectIdentity.js.map +1 -0
- package/dist/lib/recall.d.ts +82 -0
- package/dist/lib/recall.d.ts.map +1 -0
- package/dist/lib/recall.js +289 -0
- package/dist/lib/recall.js.map +1 -0
- package/dist/lib/resolver.d.ts +116 -0
- package/dist/lib/resolver.d.ts.map +1 -0
- package/dist/lib/resolver.js +372 -0
- package/dist/lib/resolver.js.map +1 -0
- package/dist/lib/retry.d.ts +24 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/lib/retry.js +60 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/rulesGen.d.ts +51 -0
- package/dist/lib/rulesGen.d.ts.map +1 -0
- package/dist/lib/rulesGen.js +167 -0
- package/dist/lib/rulesGen.js.map +1 -0
- package/dist/lib/search.d.ts +51 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +190 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/staticSearch.d.ts +70 -0
- package/dist/lib/staticSearch.d.ts.map +1 -0
- package/dist/lib/staticSearch.js +162 -0
- package/dist/lib/staticSearch.js.map +1 -0
- package/dist/lib/store.d.ts +79 -0
- package/dist/lib/store.d.ts.map +1 -0
- package/dist/lib/store.js +227 -0
- package/dist/lib/store.js.map +1 -0
- package/dist/lib/structuredIngest.d.ts +37 -0
- package/dist/lib/structuredIngest.d.ts.map +1 -0
- package/dist/lib/structuredIngest.js +208 -0
- package/dist/lib/structuredIngest.js.map +1 -0
- package/dist/lib/tags.d.ts +26 -0
- package/dist/lib/tags.d.ts.map +1 -0
- package/dist/lib/tags.js +109 -0
- package/dist/lib/tags.js.map +1 -0
- package/dist/lib/timeline.d.ts +34 -0
- package/dist/lib/timeline.d.ts.map +1 -0
- package/dist/lib/timeline.js +116 -0
- package/dist/lib/timeline.js.map +1 -0
- package/dist/lib/trace.d.ts +42 -0
- package/dist/lib/trace.d.ts.map +1 -0
- package/dist/lib/trace.js +338 -0
- package/dist/lib/trace.js.map +1 -0
- package/dist/lib/webIndex.d.ts +28 -0
- package/dist/lib/webIndex.d.ts.map +1 -0
- package/dist/lib/webIndex.js +208 -0
- package/dist/lib/webIndex.js.map +1 -0
- package/dist/lib/webIngest.d.ts +51 -0
- package/dist/lib/webIngest.d.ts.map +1 -0
- package/dist/lib/webIngest.js +533 -0
- package/dist/lib/webIngest.js.map +1 -0
- package/dist/lib/wikilinks.d.ts +63 -0
- package/dist/lib/wikilinks.d.ts.map +1 -0
- package/dist/lib/wikilinks.js +146 -0
- package/dist/lib/wikilinks.js.map +1 -0
- package/dist/sandbox/client.d.ts +82 -0
- package/dist/sandbox/client.d.ts.map +1 -0
- package/dist/sandbox/client.js +128 -0
- package/dist/sandbox/client.js.map +1 -0
- package/dist/sandbox/helper-template.d.ts +14 -0
- package/dist/sandbox/helper-template.d.ts.map +1 -0
- package/dist/sandbox/helper-template.js +285 -0
- package/dist/sandbox/helper-template.js.map +1 -0
- package/dist/sandbox/index.d.ts +10 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +10 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/manager.d.ts +40 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +220 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/server.d.ts +44 -0
- package/dist/sandbox/server.d.ts.map +1 -0
- package/dist/sandbox/server.js +661 -0
- package/dist/sandbox/server.js.map +1 -0
- package/package.json +103 -0
- package/prompts/synthesize.md +21 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staticSearch.js","sourceRoot":"","sources":["../../src/lib/staticSearch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AA4C9C,4EAA4E;AAE5E,IAAI,WAAW,GAA0B,IAAI,CAAC;AAC9C,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,4EAA4E;AAE5E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK;IACnE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK;IAChE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO;IAClE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;IACjE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM;IAChE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK;IAChE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM;IACnE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM;IACnE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IAChE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM;IAC9D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;CACtD,CAAC,CAAC;AAEH,4EAA4E;AAE5E,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;SACzB,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,4EAA4E;AAE5E;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,UAAkB;IAC1C,IAAI,WAAW,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAC/C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,GAAW,CAAC;IAChB,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,GAAG,GAAG,UAAU,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,KAAK,GAAG,MAAwB,CAAC;IAEvC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,CAAC,OAAO,mDAAmD;YAC1F,mCAAmC,CACtC,CAAC;IACJ,CAAC;IAED,WAAW,GAAG,KAAK,CAAC;IACpB,YAAY,GAAG,UAAU,CAAC;IAC1B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,WAAW,GAAG,IAAI,CAAC;IACnB,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CACpB,KAAqB,EACrB,KAAa,EACb,UAAyB,EAAE;IAE3B,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,GAAG,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEnF,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAsD,CAAC;IAEhF,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;gBAC9B,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC5C,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE;oBAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,aAAa,EAAE,CAAC,KAAK,CAAC;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,gBAAgB;QAChB,IAAI,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,SAAS;QACpD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QAEjF,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,yBAAyB;QACzB,IAAI,WAAW,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;YAC3D,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9C,kDAAkD;YAClD,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;gBACjB,UAAU,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,IAAI,UAAU,GAAG,QAAQ;YAAE,SAAS;QAEpC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,2BAA2B;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAE1C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,KAAqB,EACrB,QAAgB;IAEhB,OAAO,CACL,KAAK,CAAC,SAAS,CAAC,IAAI,CAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAChD,IAAI,IAAI,CACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAqB,EACrB,MAAgE;IAEhE,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IAEzC,OAAO,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QACpE,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvF,OAAO,KAAK,CAAC;QACf,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Store — Core module for reading/writing atomic memory files.
|
|
3
|
+
* The filesystem is the source of truth. All memories are markdown files
|
|
4
|
+
* with YAML frontmatter organized in category directories.
|
|
5
|
+
*/
|
|
6
|
+
export interface MemoryFrontmatter {
|
|
7
|
+
id: string;
|
|
8
|
+
title: string;
|
|
9
|
+
category: string;
|
|
10
|
+
tags: Record<string, string[]> | string[];
|
|
11
|
+
relevance: string;
|
|
12
|
+
author: "human" | "ai" | "human+ai";
|
|
13
|
+
authority: "declared" | "observed" | "imported" | "inferred";
|
|
14
|
+
confidence: number;
|
|
15
|
+
created: string;
|
|
16
|
+
modified: string;
|
|
17
|
+
last_reviewed?: string | null;
|
|
18
|
+
status: "active" | "archived" | "superseded";
|
|
19
|
+
supersedes?: string | null;
|
|
20
|
+
superseded_by?: string | null;
|
|
21
|
+
reinforcement_count?: number;
|
|
22
|
+
last_reinforced?: string | null;
|
|
23
|
+
[key: string]: unknown;
|
|
24
|
+
}
|
|
25
|
+
export interface Memory {
|
|
26
|
+
frontmatter: MemoryFrontmatter;
|
|
27
|
+
content: string;
|
|
28
|
+
filePath: string;
|
|
29
|
+
relativePath: string;
|
|
30
|
+
}
|
|
31
|
+
export declare class GnosysStore {
|
|
32
|
+
private storePath;
|
|
33
|
+
private gitEnabled;
|
|
34
|
+
constructor(storePath: string);
|
|
35
|
+
/** Validate that a resolved path stays within the store directory. */
|
|
36
|
+
private assertWithinStore;
|
|
37
|
+
init(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Read all memory files from the store.
|
|
40
|
+
*/
|
|
41
|
+
getAllMemories(): Promise<Memory[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Read a single memory by relative path.
|
|
44
|
+
*/
|
|
45
|
+
readMemory(relativePath: string): Promise<Memory | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Write a new memory to the store.
|
|
48
|
+
*/
|
|
49
|
+
writeMemory(category: string, filename: string, frontmatter: MemoryFrontmatter, content: string, options?: {
|
|
50
|
+
autoCommit?: boolean;
|
|
51
|
+
}): Promise<string>;
|
|
52
|
+
/**
|
|
53
|
+
* Batch commit all pending changes (used after bulk imports).
|
|
54
|
+
*/
|
|
55
|
+
batchCommit(message: string): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Update an existing memory.
|
|
58
|
+
*/
|
|
59
|
+
updateMemory(relativePath: string, updates: Partial<MemoryFrontmatter>, newContent?: string): Promise<Memory | null>;
|
|
60
|
+
/**
|
|
61
|
+
* List all categories (directories) in the store.
|
|
62
|
+
*/
|
|
63
|
+
getCategories(): Promise<string[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Generate a unique ID for a new memory.
|
|
66
|
+
*/
|
|
67
|
+
generateId(category: string): Promise<string>;
|
|
68
|
+
/**
|
|
69
|
+
* Get the store path.
|
|
70
|
+
*/
|
|
71
|
+
getStorePath(): string;
|
|
72
|
+
/**
|
|
73
|
+
* Auto-commit changes to git (silent, never user-facing).
|
|
74
|
+
* Safe: if commit fails for a real reason (not "nothing to commit"),
|
|
75
|
+
* it resets staged changes to avoid leaving a dirty index.
|
|
76
|
+
*/
|
|
77
|
+
private autoCommit;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/lib/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,UAAU,CAAC;IACpC,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,MAAM;IACrB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAsBD,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAU;gBAEhB,SAAS,EAAE,MAAM;IAK7B,sEAAsE;IACtE,OAAO,CAAC,iBAAiB;IAQnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB3B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAkBzC;;OAEG;IACG,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAoB9D;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,iBAAiB,EAC9B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACjC,OAAO,CAAC,MAAM,CAAC;IAsBlB;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD;;OAEG;IACG,YAAY,CAChB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA4BzB;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAaxC;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAenD;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;;;OAIG;YACW,UAAU;CAsBzB"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Store — Core module for reading/writing atomic memory files.
|
|
3
|
+
* The filesystem is the source of truth. All memories are markdown files
|
|
4
|
+
* with YAML frontmatter organized in category directories.
|
|
5
|
+
*/
|
|
6
|
+
import fs from "fs/promises";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import matter from "gray-matter";
|
|
9
|
+
import { glob } from "glob";
|
|
10
|
+
import { execFileSync } from "child_process";
|
|
11
|
+
/**
|
|
12
|
+
* Flatten categorized tags into a flat array for Obsidian compatibility.
|
|
13
|
+
* Input: { domain: ["food", "nutrition"], type: ["fact"] }
|
|
14
|
+
* Output: ["food", "nutrition", "fact"]
|
|
15
|
+
* Already-flat arrays pass through unchanged.
|
|
16
|
+
*/
|
|
17
|
+
function flattenTags(tags) {
|
|
18
|
+
if (Array.isArray(tags))
|
|
19
|
+
return tags;
|
|
20
|
+
if (!tags || typeof tags !== "object")
|
|
21
|
+
return [];
|
|
22
|
+
const flat = [];
|
|
23
|
+
for (const values of Object.values(tags)) {
|
|
24
|
+
if (Array.isArray(values)) {
|
|
25
|
+
for (const v of values) {
|
|
26
|
+
if (!flat.includes(v))
|
|
27
|
+
flat.push(v);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return flat;
|
|
32
|
+
}
|
|
33
|
+
export class GnosysStore {
|
|
34
|
+
storePath;
|
|
35
|
+
gitEnabled;
|
|
36
|
+
constructor(storePath) {
|
|
37
|
+
this.storePath = path.resolve(storePath);
|
|
38
|
+
this.gitEnabled = false;
|
|
39
|
+
}
|
|
40
|
+
/** Validate that a resolved path stays within the store directory. */
|
|
41
|
+
assertWithinStore(fullPath) {
|
|
42
|
+
const resolved = path.resolve(fullPath);
|
|
43
|
+
const storeResolved = path.resolve(this.storePath);
|
|
44
|
+
if (!resolved.startsWith(storeResolved + path.sep) && resolved !== storeResolved) {
|
|
45
|
+
throw new Error("Path traversal detected: path escapes the store directory");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async init() {
|
|
49
|
+
// Ensure store directory exists
|
|
50
|
+
await fs.mkdir(this.storePath, { recursive: true });
|
|
51
|
+
await fs.mkdir(path.join(this.storePath, ".config"), { recursive: true });
|
|
52
|
+
// Init git if not already
|
|
53
|
+
try {
|
|
54
|
+
const gitDir = path.join(this.storePath, ".git");
|
|
55
|
+
const stat = await fs.stat(gitDir).catch(() => null);
|
|
56
|
+
if (!stat) {
|
|
57
|
+
execFileSync("git", ["init"], { cwd: this.storePath, stdio: "pipe" });
|
|
58
|
+
}
|
|
59
|
+
this.gitEnabled = true;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
this.gitEnabled = false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Read all memory files from the store.
|
|
67
|
+
*/
|
|
68
|
+
async getAllMemories() {
|
|
69
|
+
const files = await glob("**/*.md", {
|
|
70
|
+
cwd: this.storePath,
|
|
71
|
+
ignore: ["MANIFEST.md", "CHANGELOG.md", ".config/**", "node_modules/**"],
|
|
72
|
+
});
|
|
73
|
+
const memories = [];
|
|
74
|
+
for (const file of files) {
|
|
75
|
+
try {
|
|
76
|
+
const memory = await this.readMemory(file);
|
|
77
|
+
if (memory)
|
|
78
|
+
memories.push(memory);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Skip files that can't be parsed
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return memories;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Read a single memory by relative path.
|
|
88
|
+
*/
|
|
89
|
+
async readMemory(relativePath) {
|
|
90
|
+
const fullPath = path.join(this.storePath, relativePath);
|
|
91
|
+
this.assertWithinStore(fullPath);
|
|
92
|
+
try {
|
|
93
|
+
const raw = await fs.readFile(fullPath, "utf-8");
|
|
94
|
+
const parsed = matter(raw);
|
|
95
|
+
if (!parsed.data.id)
|
|
96
|
+
return null; // Not a valid memory file
|
|
97
|
+
return {
|
|
98
|
+
frontmatter: parsed.data,
|
|
99
|
+
content: parsed.content.trim(),
|
|
100
|
+
filePath: fullPath,
|
|
101
|
+
relativePath,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Write a new memory to the store.
|
|
110
|
+
*/
|
|
111
|
+
async writeMemory(category, filename, frontmatter, content, options) {
|
|
112
|
+
const dir = path.join(this.storePath, category);
|
|
113
|
+
this.assertWithinStore(dir);
|
|
114
|
+
await fs.mkdir(dir, { recursive: true });
|
|
115
|
+
const filePath = path.join(dir, filename);
|
|
116
|
+
this.assertWithinStore(filePath);
|
|
117
|
+
const relativePath = path.join(category, filename);
|
|
118
|
+
// Flatten tags for Obsidian compatibility (nested objects → flat array)
|
|
119
|
+
const serializable = { ...frontmatter, tags: flattenTags(frontmatter.tags) };
|
|
120
|
+
const fileContent = matter.stringify(content, serializable);
|
|
121
|
+
await fs.writeFile(filePath, fileContent, "utf-8");
|
|
122
|
+
// Auto git commit (skip when batching)
|
|
123
|
+
if (options?.autoCommit !== false) {
|
|
124
|
+
await this.autoCommit(`Add memory: ${frontmatter.title}`);
|
|
125
|
+
}
|
|
126
|
+
return relativePath;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Batch commit all pending changes (used after bulk imports).
|
|
130
|
+
*/
|
|
131
|
+
async batchCommit(message) {
|
|
132
|
+
await this.autoCommit(message);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Update an existing memory.
|
|
136
|
+
*/
|
|
137
|
+
async updateMemory(relativePath, updates, newContent) {
|
|
138
|
+
const existing = await this.readMemory(relativePath);
|
|
139
|
+
if (!existing)
|
|
140
|
+
return null;
|
|
141
|
+
const updatedFrontmatter = {
|
|
142
|
+
...existing.frontmatter,
|
|
143
|
+
...updates,
|
|
144
|
+
modified: new Date().toISOString().split("T")[0],
|
|
145
|
+
};
|
|
146
|
+
const updatedContent = newContent ?? existing.content;
|
|
147
|
+
const fullPath = path.join(this.storePath, relativePath);
|
|
148
|
+
this.assertWithinStore(fullPath);
|
|
149
|
+
// Flatten tags for Obsidian compatibility
|
|
150
|
+
const serializable = { ...updatedFrontmatter, tags: flattenTags(updatedFrontmatter.tags) };
|
|
151
|
+
const fileContent = matter.stringify(updatedContent, serializable);
|
|
152
|
+
await fs.writeFile(fullPath, fileContent, "utf-8");
|
|
153
|
+
await this.autoCommit(`Update memory: ${updatedFrontmatter.title}`);
|
|
154
|
+
return {
|
|
155
|
+
frontmatter: updatedFrontmatter,
|
|
156
|
+
content: updatedContent,
|
|
157
|
+
filePath: fullPath,
|
|
158
|
+
relativePath,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* List all categories (directories) in the store.
|
|
163
|
+
*/
|
|
164
|
+
async getCategories() {
|
|
165
|
+
const entries = await fs.readdir(this.storePath, { withFileTypes: true });
|
|
166
|
+
return entries
|
|
167
|
+
.filter((e) => e.isDirectory() &&
|
|
168
|
+
!e.name.startsWith(".") &&
|
|
169
|
+
e.name !== "node_modules")
|
|
170
|
+
.map((e) => e.name)
|
|
171
|
+
.sort();
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Generate a unique ID for a new memory.
|
|
175
|
+
*/
|
|
176
|
+
async generateId(category) {
|
|
177
|
+
const prefix = category.substring(0, 4);
|
|
178
|
+
const memories = await this.getAllMemories();
|
|
179
|
+
const existingIds = memories
|
|
180
|
+
.map((m) => m.frontmatter.id)
|
|
181
|
+
.filter((id) => id.startsWith(prefix));
|
|
182
|
+
let maxNum = 0;
|
|
183
|
+
for (const id of existingIds) {
|
|
184
|
+
const match = id.match(/(\d+)$/);
|
|
185
|
+
if (match)
|
|
186
|
+
maxNum = Math.max(maxNum, parseInt(match[1]));
|
|
187
|
+
}
|
|
188
|
+
return `${prefix}-${String(maxNum + 1).padStart(3, "0")}`;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get the store path.
|
|
192
|
+
*/
|
|
193
|
+
getStorePath() {
|
|
194
|
+
return this.storePath;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Auto-commit changes to git (silent, never user-facing).
|
|
198
|
+
* Safe: if commit fails for a real reason (not "nothing to commit"),
|
|
199
|
+
* it resets staged changes to avoid leaving a dirty index.
|
|
200
|
+
*/
|
|
201
|
+
async autoCommit(message) {
|
|
202
|
+
if (!this.gitEnabled)
|
|
203
|
+
return;
|
|
204
|
+
try {
|
|
205
|
+
execFileSync("git", ["add", "-A"], { cwd: this.storePath, stdio: "pipe" });
|
|
206
|
+
execFileSync("git", ["commit", "-m", message, "--allow-empty-message"], {
|
|
207
|
+
cwd: this.storePath,
|
|
208
|
+
stdio: "pipe",
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
// "nothing to commit" is fine — anything else gets a safe reset
|
|
213
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
214
|
+
if (errMsg.includes("nothing to commit") || errMsg.includes("no changes added")) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
// Reset staged changes to keep index clean
|
|
218
|
+
try {
|
|
219
|
+
execFileSync("git", ["reset", "HEAD"], { cwd: this.storePath, stdio: "pipe" });
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// If even reset fails, there's nothing we can do
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/lib/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Structured Ingest — No-LLM fallback for web knowledge base.
|
|
3
|
+
*
|
|
4
|
+
* Generates Gnosys-format YAML frontmatter without any LLM call.
|
|
5
|
+
* Uses TF-IDF keyword extraction for the relevance field.
|
|
6
|
+
*/
|
|
7
|
+
export interface MemoryFrontmatterResult {
|
|
8
|
+
id: string;
|
|
9
|
+
title: string;
|
|
10
|
+
category: string;
|
|
11
|
+
tags: {
|
|
12
|
+
domain: string[];
|
|
13
|
+
type: string[];
|
|
14
|
+
};
|
|
15
|
+
relevance: string;
|
|
16
|
+
author: string;
|
|
17
|
+
authority: string;
|
|
18
|
+
confidence: number;
|
|
19
|
+
created: string;
|
|
20
|
+
status: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Extract structured frontmatter from content without any LLM call.
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractStructuredFrontmatter(content: string, url: string, categoryMap: Record<string, string>): MemoryFrontmatterResult;
|
|
26
|
+
/**
|
|
27
|
+
* Compute TF-IDF scores across a corpus of documents.
|
|
28
|
+
* Returns top terms per document for use as relevance keywords.
|
|
29
|
+
*/
|
|
30
|
+
export declare function computeTfIdf(documents: Array<{
|
|
31
|
+
id: string;
|
|
32
|
+
content: string;
|
|
33
|
+
}>, topN?: number): Map<string, Array<{
|
|
34
|
+
term: string;
|
|
35
|
+
score: number;
|
|
36
|
+
}>>;
|
|
37
|
+
//# sourceMappingURL=structuredIngest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structuredIngest.d.ts","sourceRoot":"","sources":["../../src/lib/structuredIngest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAsJD;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,uBAAuB,CAkBzB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EACjD,IAAI,GAAE,MAAW,GAChB,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAiDrD"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Structured Ingest — No-LLM fallback for web knowledge base.
|
|
3
|
+
*
|
|
4
|
+
* Generates Gnosys-format YAML frontmatter without any LLM call.
|
|
5
|
+
* Uses TF-IDF keyword extraction for the relevance field.
|
|
6
|
+
*/
|
|
7
|
+
// ─── Stop words ──────────────────────────────────────────────────────────
|
|
8
|
+
const STOP_WORDS = new Set([
|
|
9
|
+
"a", "an", "the", "and", "or", "but", "in", "on", "at", "to", "for",
|
|
10
|
+
"of", "with", "by", "from", "is", "it", "as", "be", "was", "are",
|
|
11
|
+
"been", "has", "had", "have", "do", "does", "did", "will", "would",
|
|
12
|
+
"could", "should", "may", "might", "shall", "can", "this", "that",
|
|
13
|
+
"these", "those", "not", "no", "nor", "so", "if", "then", "than",
|
|
14
|
+
"too", "very", "just", "about", "above", "after", "again", "all",
|
|
15
|
+
"also", "am", "any", "because", "before", "between", "both", "each",
|
|
16
|
+
"few", "he", "she", "her", "him", "his", "how", "its", "me", "more",
|
|
17
|
+
"most", "my", "new", "now", "only", "other", "our", "out", "own",
|
|
18
|
+
"re", "same", "some", "such", "up", "us", "we", "what", "when",
|
|
19
|
+
"where", "which", "who", "whom", "why", "you", "your",
|
|
20
|
+
]);
|
|
21
|
+
// ─── Tokenization ────────────────────────────────────────────────────────
|
|
22
|
+
function tokenize(text) {
|
|
23
|
+
return text
|
|
24
|
+
.toLowerCase()
|
|
25
|
+
.replace(/[^\w\s-]/g, " ")
|
|
26
|
+
.split(/\s+/)
|
|
27
|
+
.filter((t) => t.length >= 2 && !STOP_WORDS.has(t));
|
|
28
|
+
}
|
|
29
|
+
// ─── Title extraction ────────────────────────────────────────────────────
|
|
30
|
+
function extractTitle(content, url) {
|
|
31
|
+
// Try <h1>
|
|
32
|
+
const h1Match = content.match(/<h1[^>]*>(.*?)<\/h1>/is);
|
|
33
|
+
if (h1Match)
|
|
34
|
+
return stripHtml(h1Match[1]).trim();
|
|
35
|
+
// Try <title>
|
|
36
|
+
const titleMatch = content.match(/<title[^>]*>(.*?)<\/title>/is);
|
|
37
|
+
if (titleMatch)
|
|
38
|
+
return stripHtml(titleMatch[1]).trim();
|
|
39
|
+
// Try first markdown heading
|
|
40
|
+
const mdH1 = content.match(/^#\s+(.+)$/m);
|
|
41
|
+
if (mdH1)
|
|
42
|
+
return mdH1[1].trim();
|
|
43
|
+
// Fallback: derive from URL
|
|
44
|
+
const urlPath = new URL(url, "https://example.com").pathname;
|
|
45
|
+
const slug = urlPath.split("/").filter(Boolean).pop() || "untitled";
|
|
46
|
+
return slug
|
|
47
|
+
.replace(/[-_]/g, " ")
|
|
48
|
+
.replace(/\.\w+$/, "")
|
|
49
|
+
.replace(/\b\w/g, (c) => c.toUpperCase());
|
|
50
|
+
}
|
|
51
|
+
function stripHtml(html) {
|
|
52
|
+
return html.replace(/<[^>]+>/g, "");
|
|
53
|
+
}
|
|
54
|
+
// ─── Category inference ──────────────────────────────────────────────────
|
|
55
|
+
function inferCategory(url, categoryMap) {
|
|
56
|
+
const urlPath = new URL(url, "https://example.com").pathname;
|
|
57
|
+
for (const [pattern, category] of Object.entries(categoryMap)) {
|
|
58
|
+
if (matchGlob(urlPath, pattern)) {
|
|
59
|
+
return category;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return "general";
|
|
63
|
+
}
|
|
64
|
+
/** Safe glob matching without regex — avoids ReDoS from user-controlled patterns. */
|
|
65
|
+
function matchGlob(urlPath, pattern) {
|
|
66
|
+
const parts = pattern.split("*");
|
|
67
|
+
if (parts.length === 1)
|
|
68
|
+
return urlPath === pattern;
|
|
69
|
+
if (!urlPath.startsWith(parts[0]))
|
|
70
|
+
return false;
|
|
71
|
+
let pos = parts[0].length;
|
|
72
|
+
for (let i = 1; i < parts.length; i++) {
|
|
73
|
+
const segment = parts[i];
|
|
74
|
+
if (i === parts.length - 1 && segment === "")
|
|
75
|
+
return true;
|
|
76
|
+
const idx = urlPath.indexOf(segment, pos);
|
|
77
|
+
if (idx === -1)
|
|
78
|
+
return false;
|
|
79
|
+
pos = idx + segment.length;
|
|
80
|
+
}
|
|
81
|
+
return pos === urlPath.length || parts[parts.length - 1] === "";
|
|
82
|
+
}
|
|
83
|
+
// ─── Tag extraction ──────────────────────────────────────────────────────
|
|
84
|
+
function extractTags(content, url) {
|
|
85
|
+
const domain = [];
|
|
86
|
+
const type = [];
|
|
87
|
+
// Extract from <meta name="keywords">
|
|
88
|
+
const metaMatch = content.match(/<meta\s+name=["']keywords["']\s+content=["']([^"']+)["']/i);
|
|
89
|
+
if (metaMatch) {
|
|
90
|
+
const keywords = metaMatch[1].split(",").map((k) => k.trim().toLowerCase()).filter(Boolean);
|
|
91
|
+
domain.push(...keywords.slice(0, 5));
|
|
92
|
+
}
|
|
93
|
+
// Infer type from URL path
|
|
94
|
+
const urlPath = new URL(url, "https://example.com").pathname;
|
|
95
|
+
const segments = urlPath.split("/").filter(Boolean);
|
|
96
|
+
if (segments.length > 0) {
|
|
97
|
+
const firstSegment = segments[0].toLowerCase();
|
|
98
|
+
if (["blog", "posts", "articles", "news"].includes(firstSegment)) {
|
|
99
|
+
type.push("article");
|
|
100
|
+
}
|
|
101
|
+
else if (["docs", "documentation", "guide", "guides"].includes(firstSegment)) {
|
|
102
|
+
type.push("documentation");
|
|
103
|
+
}
|
|
104
|
+
else if (["products", "product"].includes(firstSegment)) {
|
|
105
|
+
type.push("product");
|
|
106
|
+
}
|
|
107
|
+
else if (["services", "service"].includes(firstSegment)) {
|
|
108
|
+
type.push("service");
|
|
109
|
+
}
|
|
110
|
+
else if (["about", "team", "company"].includes(firstSegment)) {
|
|
111
|
+
type.push("company-info");
|
|
112
|
+
}
|
|
113
|
+
else if (["faq", "faqs", "help", "support"].includes(firstSegment)) {
|
|
114
|
+
type.push("faq");
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
type.push("page");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
type.push("page");
|
|
122
|
+
}
|
|
123
|
+
return { domain, type };
|
|
124
|
+
}
|
|
125
|
+
// ─── ID generation ───────────────────────────────────────────────────────
|
|
126
|
+
function generateId(url, category) {
|
|
127
|
+
const urlPath = new URL(url, "https://example.com").pathname;
|
|
128
|
+
const slug = urlPath
|
|
129
|
+
.split("/")
|
|
130
|
+
.filter(Boolean)
|
|
131
|
+
.pop() || "index";
|
|
132
|
+
const cleanSlug = slug
|
|
133
|
+
.replace(/\.\w+$/, "")
|
|
134
|
+
.replace(/[^a-z0-9-]/gi, "-")
|
|
135
|
+
.toLowerCase();
|
|
136
|
+
const prefix = category.slice(0, 4).toLowerCase();
|
|
137
|
+
return `${prefix}-${cleanSlug}`;
|
|
138
|
+
}
|
|
139
|
+
// ─── Public API ──────────────────────────────────────────────────────────
|
|
140
|
+
/**
|
|
141
|
+
* Extract structured frontmatter from content without any LLM call.
|
|
142
|
+
*/
|
|
143
|
+
export function extractStructuredFrontmatter(content, url, categoryMap) {
|
|
144
|
+
const category = inferCategory(url, categoryMap);
|
|
145
|
+
const title = extractTitle(content, url);
|
|
146
|
+
const tags = extractTags(content, url);
|
|
147
|
+
const id = generateId(url, category);
|
|
148
|
+
return {
|
|
149
|
+
id,
|
|
150
|
+
title,
|
|
151
|
+
category,
|
|
152
|
+
tags,
|
|
153
|
+
relevance: "", // Populated later by TF-IDF across corpus
|
|
154
|
+
author: "auto-structured",
|
|
155
|
+
authority: "imported",
|
|
156
|
+
confidence: 0.7,
|
|
157
|
+
created: new Date().toISOString().split("T")[0],
|
|
158
|
+
status: "active",
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Compute TF-IDF scores across a corpus of documents.
|
|
163
|
+
* Returns top terms per document for use as relevance keywords.
|
|
164
|
+
*/
|
|
165
|
+
export function computeTfIdf(documents, topN = 20) {
|
|
166
|
+
const N = documents.length;
|
|
167
|
+
if (N === 0)
|
|
168
|
+
return new Map();
|
|
169
|
+
// Compute term frequency per document
|
|
170
|
+
const docTermFreqs = new Map();
|
|
171
|
+
for (const doc of documents) {
|
|
172
|
+
const tokens = tokenize(doc.content);
|
|
173
|
+
const tf = new Map();
|
|
174
|
+
for (const token of tokens) {
|
|
175
|
+
tf.set(token, (tf.get(token) || 0) + 1);
|
|
176
|
+
}
|
|
177
|
+
// Normalize by max frequency in document
|
|
178
|
+
const maxFreq = Math.max(...tf.values(), 1);
|
|
179
|
+
const normalizedTf = new Map();
|
|
180
|
+
for (const [term, freq] of tf) {
|
|
181
|
+
normalizedTf.set(term, freq / maxFreq);
|
|
182
|
+
}
|
|
183
|
+
docTermFreqs.set(doc.id, normalizedTf);
|
|
184
|
+
}
|
|
185
|
+
// Compute document frequency for each term
|
|
186
|
+
const df = new Map();
|
|
187
|
+
for (const tf of docTermFreqs.values()) {
|
|
188
|
+
for (const term of tf.keys()) {
|
|
189
|
+
df.set(term, (df.get(term) || 0) + 1);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Compute TF-IDF and select top N terms per document
|
|
193
|
+
const result = new Map();
|
|
194
|
+
for (const doc of documents) {
|
|
195
|
+
const tf = docTermFreqs.get(doc.id);
|
|
196
|
+
const scores = [];
|
|
197
|
+
for (const [term, tfScore] of tf) {
|
|
198
|
+
const docFreq = df.get(term) || 1;
|
|
199
|
+
const idf = Math.log(1 + N / docFreq);
|
|
200
|
+
scores.push({ term, score: parseFloat((tfScore * idf).toFixed(4)) });
|
|
201
|
+
}
|
|
202
|
+
// Sort by score descending, take top N
|
|
203
|
+
scores.sort((a, b) => b.score - a.score);
|
|
204
|
+
result.set(doc.id, scores.slice(0, topN));
|
|
205
|
+
}
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=structuredIngest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structuredIngest.js","sourceRoot":"","sources":["../../src/lib/structuredIngest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Tag Registry — Categorized controlled vocabulary for tags.
|
|
3
|
+
* Stored in .config/tags.json. The ingestion LLM must use existing tags
|
|
4
|
+
* but can propose new ones for approval.
|
|
5
|
+
*/
|
|
6
|
+
export interface TagRegistry {
|
|
7
|
+
domain: string[];
|
|
8
|
+
type: string[];
|
|
9
|
+
concern: string[];
|
|
10
|
+
status_tag: string[];
|
|
11
|
+
[category: string]: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare class GnosysTagRegistry {
|
|
14
|
+
private registryPath;
|
|
15
|
+
private registry;
|
|
16
|
+
constructor(storePath: string);
|
|
17
|
+
load(): Promise<TagRegistry>;
|
|
18
|
+
save(): Promise<void>;
|
|
19
|
+
getRegistry(): TagRegistry;
|
|
20
|
+
getAllTags(): string[];
|
|
21
|
+
getTagsByCategory(category: string): string[];
|
|
22
|
+
hasTag(tag: string): boolean;
|
|
23
|
+
findTagCategory(tag: string): string | null;
|
|
24
|
+
addTag(category: string, tag: string): Promise<boolean>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/lib/tags.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC9B;AAmDD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAc;gBAElB,SAAS,EAAE,MAAM;IAKvB,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IAW5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,WAAW,IAAI,WAAW;IAI1B,UAAU,IAAI,MAAM,EAAE;IAItB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAI7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOrC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS9D"}
|