@knowledgine/ingest 0.2.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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cursor-store.d.ts +11 -0
  3. package/dist/cursor-store.d.ts.map +1 -0
  4. package/dist/cursor-store.js +42 -0
  5. package/dist/cursor-store.js.map +1 -0
  6. package/dist/event-writer.d.ts +18 -0
  7. package/dist/event-writer.d.ts.map +1 -0
  8. package/dist/event-writer.js +50 -0
  9. package/dist/event-writer.js.map +1 -0
  10. package/dist/index.d.ts +12 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +11 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/ingest-engine.d.ts +20 -0
  15. package/dist/ingest-engine.d.ts.map +1 -0
  16. package/dist/ingest-engine.js +63 -0
  17. package/dist/ingest-engine.js.map +1 -0
  18. package/dist/normalizer.d.ts +7 -0
  19. package/dist/normalizer.d.ts.map +1 -0
  20. package/dist/normalizer.js +71 -0
  21. package/dist/normalizer.js.map +1 -0
  22. package/dist/plugin-registry.d.ts +14 -0
  23. package/dist/plugin-registry.d.ts.map +1 -0
  24. package/dist/plugin-registry.js +37 -0
  25. package/dist/plugin-registry.js.map +1 -0
  26. package/dist/plugins/claude-sessions/index.d.ts +14 -0
  27. package/dist/plugins/claude-sessions/index.d.ts.map +1 -0
  28. package/dist/plugins/claude-sessions/index.js +123 -0
  29. package/dist/plugins/claude-sessions/index.js.map +1 -0
  30. package/dist/plugins/claude-sessions/session-parser.d.ts +18 -0
  31. package/dist/plugins/claude-sessions/session-parser.d.ts.map +1 -0
  32. package/dist/plugins/claude-sessions/session-parser.js +84 -0
  33. package/dist/plugins/claude-sessions/session-parser.js.map +1 -0
  34. package/dist/plugins/git-history/git-parser.d.ts +27 -0
  35. package/dist/plugins/git-history/git-parser.d.ts.map +1 -0
  36. package/dist/plugins/git-history/git-parser.js +121 -0
  37. package/dist/plugins/git-history/git-parser.js.map +1 -0
  38. package/dist/plugins/git-history/index.d.ts +12 -0
  39. package/dist/plugins/git-history/index.d.ts.map +1 -0
  40. package/dist/plugins/git-history/index.js +82 -0
  41. package/dist/plugins/git-history/index.js.map +1 -0
  42. package/dist/plugins/github/gh-parser.d.ts +51 -0
  43. package/dist/plugins/github/gh-parser.d.ts.map +1 -0
  44. package/dist/plugins/github/gh-parser.js +127 -0
  45. package/dist/plugins/github/gh-parser.js.map +1 -0
  46. package/dist/plugins/github/index.d.ts +13 -0
  47. package/dist/plugins/github/index.d.ts.map +1 -0
  48. package/dist/plugins/github/index.js +127 -0
  49. package/dist/plugins/github/index.js.map +1 -0
  50. package/dist/plugins/markdown/index.d.ts +16 -0
  51. package/dist/plugins/markdown/index.d.ts.map +1 -0
  52. package/dist/plugins/markdown/index.js +97 -0
  53. package/dist/plugins/markdown/index.js.map +1 -0
  54. package/dist/plugins/obsidian/frontmatter-parser.d.ts +8 -0
  55. package/dist/plugins/obsidian/frontmatter-parser.d.ts.map +1 -0
  56. package/dist/plugins/obsidian/frontmatter-parser.js +51 -0
  57. package/dist/plugins/obsidian/frontmatter-parser.js.map +1 -0
  58. package/dist/plugins/obsidian/index.d.ts +15 -0
  59. package/dist/plugins/obsidian/index.d.ts.map +1 -0
  60. package/dist/plugins/obsidian/index.js +161 -0
  61. package/dist/plugins/obsidian/index.js.map +1 -0
  62. package/dist/plugins/obsidian/wikilink-parser.d.ts +10 -0
  63. package/dist/plugins/obsidian/wikilink-parser.d.ts.map +1 -0
  64. package/dist/plugins/obsidian/wikilink-parser.js +55 -0
  65. package/dist/plugins/obsidian/wikilink-parser.js.map +1 -0
  66. package/dist/types.d.ts +81 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +2 -0
  69. package/dist/types.js.map +1 -0
  70. package/package.json +35 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 R.M
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,11 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { IngestCursorData } from "./types.js";
3
+ export declare class CursorStore {
4
+ private db;
5
+ constructor(db: Database.Database);
6
+ getCursor(pluginId: string, sourcePath: string): IngestCursorData | undefined;
7
+ saveCursor(cursor: IngestCursorData): void;
8
+ deleteCursor(pluginId: string, sourcePath: string): boolean;
9
+ listCursors(): IngestCursorData[];
10
+ }
11
+ //# sourceMappingURL=cursor-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-store.d.ts","sourceRoot":"","sources":["../src/cursor-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AASnD,qBAAa,WAAW;IACV,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAEzC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAiB7E,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAQ1C,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAO3D,WAAW,IAAI,gBAAgB,EAAE;CAYlC"}
@@ -0,0 +1,42 @@
1
+ export class CursorStore {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ getCursor(pluginId, sourcePath) {
7
+ const row = this.db
8
+ .prepare("SELECT plugin_id, source_path, checkpoint, last_ingest_at FROM ingest_cursors WHERE plugin_id = ? AND source_path = ?")
9
+ .get(pluginId, sourcePath);
10
+ if (!row)
11
+ return undefined;
12
+ return {
13
+ pluginId: row.plugin_id,
14
+ sourcePath: row.source_path,
15
+ checkpoint: row.checkpoint,
16
+ lastIngestAt: new Date(row.last_ingest_at),
17
+ };
18
+ }
19
+ saveCursor(cursor) {
20
+ this.db
21
+ .prepare("INSERT OR REPLACE INTO ingest_cursors (plugin_id, source_path, checkpoint, last_ingest_at) VALUES (?, ?, ?, ?)")
22
+ .run(cursor.pluginId, cursor.sourcePath, cursor.checkpoint, cursor.lastIngestAt.toISOString());
23
+ }
24
+ deleteCursor(pluginId, sourcePath) {
25
+ const result = this.db
26
+ .prepare("DELETE FROM ingest_cursors WHERE plugin_id = ? AND source_path = ?")
27
+ .run(pluginId, sourcePath);
28
+ return result.changes > 0;
29
+ }
30
+ listCursors() {
31
+ const rows = this.db
32
+ .prepare("SELECT plugin_id, source_path, checkpoint, last_ingest_at FROM ingest_cursors")
33
+ .all();
34
+ return rows.map((row) => ({
35
+ pluginId: row.plugin_id,
36
+ sourcePath: row.source_path,
37
+ checkpoint: row.checkpoint,
38
+ lastIngestAt: new Date(row.last_ingest_at),
39
+ }));
40
+ }
41
+ }
42
+ //# sourceMappingURL=cursor-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-store.js","sourceRoot":"","sources":["../src/cursor-store.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,WAAW;IACF;IAApB,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAE7C,SAAS,CAAC,QAAgB,EAAE,UAAkB;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN,uHAAuH,CACxH;aACA,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAE7B,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAE3B,OAAO;YACL,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,YAAY,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,MAAwB;QACjC,IAAI,CAAC,EAAE;aACJ,OAAO,CACN,gHAAgH,CACjH;aACA,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,YAAY,CAAC,QAAgB,EAAE,UAAkB;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CAAC,oEAAoE,CAAC;aAC7E,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,WAAW;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAgB,+EAA+E,CAAC;aACvG,GAAG,EAAE,CAAC;QAET,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,YAAY,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;SAC3C,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { KnowledgeRepository } from "@knowledgine/core";
3
+ import type { NormalizedEvent } from "./types.js";
4
+ export declare class EventWriter {
5
+ private db;
6
+ private repository;
7
+ constructor(db: Database.Database, repository: KnowledgeRepository);
8
+ /** 単一イベント書き込み(capture用) */
9
+ writeEvent(event: NormalizedEvent): {
10
+ id: number;
11
+ };
12
+ /** バッチ書き込み(IngestEngine用) */
13
+ writeBatch(events: NormalizedEvent[]): {
14
+ processed: number;
15
+ errors: number;
16
+ };
17
+ }
18
+ //# sourceMappingURL=event-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-writer.d.ts","sourceRoot":"","sources":["../src/event-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,qBAAa,WAAW;IAEpB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,UAAU;gBADV,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,mBAAmB;IAGzC,2BAA2B;IAC3B,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE;IA8BlD,6BAA6B;IAC7B,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAqC7E"}
@@ -0,0 +1,50 @@
1
+ import { normalizeToKnowledgeData, normalizeToKnowledgeEvent } from "./normalizer.js";
2
+ export class EventWriter {
3
+ db;
4
+ repository;
5
+ constructor(db, repository) {
6
+ this.db = db;
7
+ this.repository = repository;
8
+ }
9
+ /** 単一イベント書き込み(capture用) */
10
+ writeEvent(event) {
11
+ let lastId = 0;
12
+ const insertEvent = this.db.prepare(`
13
+ INSERT INTO events (event_type, source_type, source_id, source_uri, actor, content, content_hash, occurred_at, metadata_json, project_id, session_id)
14
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
15
+ `);
16
+ this.db.transaction(() => {
17
+ const knowledgeEvent = normalizeToKnowledgeEvent(event);
18
+ const result = insertEvent.run(knowledgeEvent.eventType, knowledgeEvent.sourceType, knowledgeEvent.sourceId ?? null, knowledgeEvent.sourceUri ?? null, knowledgeEvent.actor ?? null, knowledgeEvent.content, knowledgeEvent.contentHash, knowledgeEvent.occurredAt, knowledgeEvent.metadataJson ? JSON.stringify(knowledgeEvent.metadataJson) : null, knowledgeEvent.projectId ?? null, knowledgeEvent.sessionId ?? null);
19
+ lastId = Number(result.lastInsertRowid);
20
+ const knowledgeData = normalizeToKnowledgeData(event);
21
+ this.repository.saveNote(knowledgeData);
22
+ })();
23
+ return { id: lastId };
24
+ }
25
+ /** バッチ書き込み(IngestEngine用) */
26
+ writeBatch(events) {
27
+ let processed = 0;
28
+ let errors = 0;
29
+ const insertEvent = this.db.prepare(`
30
+ INSERT INTO events (event_type, source_type, source_id, source_uri, actor, content, content_hash, occurred_at, metadata_json, project_id, session_id)
31
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
32
+ `);
33
+ this.db.transaction(() => {
34
+ for (const event of events) {
35
+ try {
36
+ const knowledgeEvent = normalizeToKnowledgeEvent(event);
37
+ insertEvent.run(knowledgeEvent.eventType, knowledgeEvent.sourceType, knowledgeEvent.sourceId ?? null, knowledgeEvent.sourceUri ?? null, knowledgeEvent.actor ?? null, knowledgeEvent.content, knowledgeEvent.contentHash, knowledgeEvent.occurredAt, knowledgeEvent.metadataJson ? JSON.stringify(knowledgeEvent.metadataJson) : null, knowledgeEvent.projectId ?? null, knowledgeEvent.sessionId ?? null);
38
+ const knowledgeData = normalizeToKnowledgeData(event);
39
+ this.repository.saveNote(knowledgeData);
40
+ processed++;
41
+ }
42
+ catch {
43
+ errors++;
44
+ }
45
+ }
46
+ })();
47
+ return { processed, errors };
48
+ }
49
+ }
50
+ //# sourceMappingURL=event-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-writer.js","sourceRoot":"","sources":["../src/event-writer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAEtF,MAAM,OAAO,WAAW;IAEZ;IACA;IAFV,YACU,EAAqB,EACrB,UAA+B;QAD/B,OAAE,GAAF,EAAE,CAAmB;QACrB,eAAU,GAAV,UAAU,CAAqB;IACtC,CAAC;IAEJ,2BAA2B;IAC3B,UAAU,CAAC,KAAsB;QAC/B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGnC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,MAAM,cAAc,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAC5B,cAAc,CAAC,SAAS,EACxB,cAAc,CAAC,UAAU,EACzB,cAAc,CAAC,QAAQ,IAAI,IAAI,EAC/B,cAAc,CAAC,SAAS,IAAI,IAAI,EAChC,cAAc,CAAC,KAAK,IAAI,IAAI,EAC5B,cAAc,CAAC,OAAO,EACtB,cAAc,CAAC,WAAW,EAC1B,cAAc,CAAC,UAAU,EACzB,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAChF,cAAc,CAAC,SAAS,IAAI,IAAI,EAChC,cAAc,CAAC,SAAS,IAAI,IAAI,CACjC,CAAC;YACF,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACxC,MAAM,aAAa,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC;QAEL,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IACxB,CAAC;IAED,6BAA6B;IAC7B,UAAU,CAAC,MAAyB;QAClC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGnC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACvB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;oBACxD,WAAW,CAAC,GAAG,CACb,cAAc,CAAC,SAAS,EACxB,cAAc,CAAC,UAAU,EACzB,cAAc,CAAC,QAAQ,IAAI,IAAI,EAC/B,cAAc,CAAC,SAAS,IAAI,IAAI,EAChC,cAAc,CAAC,KAAK,IAAI,IAAI,EAC5B,cAAc,CAAC,OAAO,EACtB,cAAc,CAAC,WAAW,EAC1B,cAAc,CAAC,UAAU,EACzB,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAChF,cAAc,CAAC,SAAS,IAAI,IAAI,EAChC,cAAc,CAAC,SAAS,IAAI,IAAI,CACjC,CAAC;oBACF,MAAM,aAAa,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;oBACtD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;oBACxC,SAAS,EAAE,CAAC;gBACd,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,EAAE,CAAC;gBACX,CAAC;YACH,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ export type { SourceURI, PluginPriority, PluginManifest, TriggerType, TriggerConfig, FileWatcherTrigger, GitHookTrigger, ScheduledTrigger, ManualTrigger, PluginConfig, PluginInitResult, NormalizedEventType, EventMetadata, NormalizedEvent, IngestPlugin, IngestCursorData, IngestSummary, } from "./types.js";
2
+ export { PluginRegistry } from "./plugin-registry.js";
3
+ export { CursorStore } from "./cursor-store.js";
4
+ export { IngestEngine } from "./ingest-engine.js";
5
+ export { EventWriter } from "./event-writer.js";
6
+ export { sanitizeContent, computeContentHash, normalizeToKnowledgeData, normalizeToKnowledgeEvent, } from "./normalizer.js";
7
+ export { MarkdownPlugin } from "./plugins/markdown/index.js";
8
+ export { GitHistoryPlugin } from "./plugins/git-history/index.js";
9
+ export { ClaudeSessionsPlugin } from "./plugins/claude-sessions/index.js";
10
+ export { GitHubPlugin } from "./plugins/github/index.js";
11
+ export { ObsidianPlugin } from "./plugins/obsidian/index.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ export { PluginRegistry } from "./plugin-registry.js";
2
+ export { CursorStore } from "./cursor-store.js";
3
+ export { IngestEngine } from "./ingest-engine.js";
4
+ export { EventWriter } from "./event-writer.js";
5
+ export { sanitizeContent, computeContentHash, normalizeToKnowledgeData, normalizeToKnowledgeEvent, } from "./normalizer.js";
6
+ export { MarkdownPlugin } from "./plugins/markdown/index.js";
7
+ export { GitHistoryPlugin } from "./plugins/git-history/index.js";
8
+ export { ClaudeSessionsPlugin } from "./plugins/claude-sessions/index.js";
9
+ export { GitHubPlugin } from "./plugins/github/index.js";
10
+ export { ObsidianPlugin } from "./plugins/obsidian/index.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { KnowledgeRepository } from "@knowledgine/core";
3
+ import type { IngestSummary } from "./types.js";
4
+ import type { PluginRegistry } from "./plugin-registry.js";
5
+ export declare class IngestEngine {
6
+ private registry;
7
+ private db;
8
+ private repository;
9
+ private cursorStore;
10
+ private eventWriter;
11
+ constructor(registry: PluginRegistry, db: Database.Database, repository: KnowledgeRepository);
12
+ ingest(pluginId: string, sourcePath: string, options?: {
13
+ full?: boolean;
14
+ }): Promise<IngestSummary>;
15
+ ingestAll(sourcePath: string, options?: {
16
+ full?: boolean;
17
+ }): Promise<IngestSummary[]>;
18
+ private processBatch;
19
+ }
20
+ //# sourceMappingURL=ingest-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest-engine.d.ts","sourceRoot":"","sources":["../src/ingest-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM3D,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,UAAU;IANpB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAc;gBAGvB,QAAQ,EAAE,cAAc,EACxB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,mBAAmB;IAMnC,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAC3B,OAAO,CAAC,aAAa,CAAC;IAuCnB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAU3F,OAAO,CAAC,YAAY;CAGrB"}
@@ -0,0 +1,63 @@
1
+ import { CursorStore } from "./cursor-store.js";
2
+ import { EventWriter } from "./event-writer.js";
3
+ const BATCH_SIZE = 100;
4
+ export class IngestEngine {
5
+ registry;
6
+ db;
7
+ repository;
8
+ cursorStore;
9
+ eventWriter;
10
+ constructor(registry, db, repository) {
11
+ this.registry = registry;
12
+ this.db = db;
13
+ this.repository = repository;
14
+ this.cursorStore = new CursorStore(db);
15
+ this.eventWriter = new EventWriter(db, repository);
16
+ }
17
+ async ingest(pluginId, sourcePath, options) {
18
+ const start = Date.now();
19
+ const plugin = this.registry.getOrThrow(pluginId);
20
+ let processed = 0;
21
+ let errors = 0;
22
+ const cursor = options?.full ? undefined : this.cursorStore.getCursor(pluginId, sourcePath);
23
+ const generator = cursor
24
+ ? plugin.ingestIncremental(sourcePath, cursor.checkpoint)
25
+ : plugin.ingestAll(sourcePath);
26
+ let batch = [];
27
+ for await (const event of generator) {
28
+ batch.push(event);
29
+ if (batch.length >= BATCH_SIZE) {
30
+ const result = this.processBatch(batch);
31
+ processed += result.processed;
32
+ errors += result.errors;
33
+ batch = [];
34
+ }
35
+ }
36
+ if (batch.length > 0) {
37
+ const result = this.processBatch(batch);
38
+ processed += result.processed;
39
+ errors += result.errors;
40
+ }
41
+ const checkpoint = await plugin.getCurrentCheckpoint(sourcePath);
42
+ this.cursorStore.saveCursor({
43
+ pluginId,
44
+ sourcePath,
45
+ checkpoint,
46
+ lastIngestAt: new Date(),
47
+ });
48
+ return { pluginId, processed, errors, elapsedMs: Date.now() - start };
49
+ }
50
+ async ingestAll(sourcePath, options) {
51
+ const plugins = this.registry.list();
52
+ const results = [];
53
+ for (const plugin of plugins) {
54
+ const summary = await this.ingest(plugin.manifest.id, sourcePath, options);
55
+ results.push(summary);
56
+ }
57
+ return results;
58
+ }
59
+ processBatch(batch) {
60
+ return this.eventWriter.writeBatch(batch);
61
+ }
62
+ }
63
+ //# sourceMappingURL=ingest-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest-engine.js","sourceRoot":"","sources":["../src/ingest-engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,MAAM,OAAO,YAAY;IAKb;IACA;IACA;IANF,WAAW,CAAc;IACzB,WAAW,CAAc;IAEjC,YACU,QAAwB,EACxB,EAAqB,EACrB,UAA+B;QAF/B,aAAQ,GAAR,QAAQ,CAAgB;QACxB,OAAE,GAAF,EAAE,CAAmB;QACrB,eAAU,GAAV,UAAU,CAAqB;QAEvC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,MAAM,CACV,QAAgB,EAChB,UAAkB,EAClB,OAA4B;QAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5F,MAAM,SAAS,GAAG,MAAM;YACtB,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;YACzD,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAEjC,IAAI,KAAK,GAAsB,EAAE,CAAC;QAClC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,IAAI,KAAK,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACxC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;gBAC9B,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;gBACxB,KAAK,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACxC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;YAC9B,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QAC1B,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YAC1B,QAAQ;YACR,UAAU;YACV,UAAU;YACV,YAAY,EAAE,IAAI,IAAI,EAAE;SACzB,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAAkB,EAAE,OAA4B;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,YAAY,CAAC,KAAwB;QAC3C,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { KnowledgeData, KnowledgeEvent } from "@knowledgine/core";
2
+ import type { NormalizedEvent } from "./types.js";
3
+ export declare function sanitizeContent(content: string): string;
4
+ export declare function computeContentHash(content: string): string;
5
+ export declare function normalizeToKnowledgeData(event: NormalizedEvent): KnowledgeData;
6
+ export declare function normalizeToKnowledgeEvent(event: NormalizedEvent): KnowledgeEvent;
7
+ //# sourceMappingURL=normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.d.ts","sourceRoot":"","sources":["../src/normalizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAyB,MAAM,mBAAmB,CAAC;AAC9F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAUlD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AA4BD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,CAY9E;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,CAchF"}
@@ -0,0 +1,71 @@
1
+ import { createHash } from "crypto";
2
+ const SECRET_PATTERNS = [
3
+ /(?:api[_-]?key|apikey|secret|token|password)['":\s]*[=:]\s*['"]?([a-zA-Z0-9_\-/.]{16,})/gi,
4
+ /(?:sk|pk|rk|ak)[-_][a-zA-Z0-9]{20,}/g,
5
+ /ghp_[a-zA-Z0-9]{36}/g,
6
+ /xoxb-[0-9]+-[a-zA-Z0-9]+/g,
7
+ /glpat-[a-zA-Z0-9\-_]{20,}/g,
8
+ ];
9
+ export function sanitizeContent(content) {
10
+ let sanitized = content;
11
+ for (const pattern of SECRET_PATTERNS) {
12
+ sanitized = sanitized.replace(pattern, "[REDACTED]");
13
+ }
14
+ return sanitized;
15
+ }
16
+ export function computeContentHash(content) {
17
+ return createHash("sha256").update(content).digest("hex");
18
+ }
19
+ const EVENT_TYPE_MAP = {
20
+ commit: "git_commit",
21
+ diff: "git_commit",
22
+ session: "session_start",
23
+ session_event: "session_message",
24
+ document: "document_change",
25
+ discussion: "pr_comment",
26
+ review: "pr_comment",
27
+ ci_result: "ci_result",
28
+ decision: "manual_observation",
29
+ learning: "manual_observation",
30
+ problem_solution: "manual_observation",
31
+ capture: "manual_observation",
32
+ };
33
+ const SOURCE_TYPE_MAP = {
34
+ markdown: "markdown",
35
+ "git-history": "git",
36
+ "claude-sessions": "claude_code",
37
+ github: "github",
38
+ obsidian: "markdown",
39
+ slack: "slack",
40
+ notion: "notion",
41
+ capture: "manual",
42
+ };
43
+ export function normalizeToKnowledgeData(event) {
44
+ return {
45
+ filePath: event.sourceUri,
46
+ title: event.title,
47
+ content: sanitizeContent(event.content),
48
+ frontmatter: {
49
+ source_plugin: event.metadata.sourcePlugin,
50
+ source_id: event.metadata.sourceId,
51
+ ...(event.metadata.tags ? { tags: event.metadata.tags } : {}),
52
+ },
53
+ createdAt: event.timestamp.toISOString(),
54
+ };
55
+ }
56
+ export function normalizeToKnowledgeEvent(event) {
57
+ const sanitized = sanitizeContent(event.content);
58
+ return {
59
+ eventType: EVENT_TYPE_MAP[event.eventType] ?? "manual_observation",
60
+ sourceType: SOURCE_TYPE_MAP[event.metadata.sourcePlugin] ?? "manual",
61
+ sourceId: event.metadata.sourceId,
62
+ sourceUri: event.sourceUri,
63
+ actor: event.metadata.author,
64
+ content: sanitized,
65
+ contentHash: computeContentHash(sanitized),
66
+ occurredAt: event.timestamp.toISOString(),
67
+ metadataJson: event.metadata.extra,
68
+ projectId: event.metadata.project,
69
+ };
70
+ }
71
+ //# sourceMappingURL=normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.js","sourceRoot":"","sources":["../src/normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAIpC,MAAM,eAAe,GAAa;IAChC,2FAA2F;IAC3F,sCAAsC;IACtC,sBAAsB;IACtB,2BAA2B;IAC3B,4BAA4B;CAC7B,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,SAAS,GAAG,OAAO,CAAC;IACxB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,cAAc,GAA8B;IAChD,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,eAAe;IACxB,aAAa,EAAE,iBAAiB;IAChC,QAAQ,EAAE,iBAAiB;IAC3B,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,YAAY;IACpB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,oBAAoB;IAC9B,QAAQ,EAAE,oBAAoB;IAC9B,gBAAgB,EAAE,oBAAoB;IACtC,OAAO,EAAE,oBAAoB;CAC9B,CAAC;AAEF,MAAM,eAAe,GAA+B;IAClD,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,KAAK;IACpB,iBAAiB,EAAE,aAAa;IAChC,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,KAAsB;IAC7D,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,SAAS;QACzB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC;QACvC,WAAW,EAAE;YACX,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY;YAC1C,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ;YAClC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D;QACD,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAsB;IAC9D,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO;QACL,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,oBAAoB;QAClE,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,QAAQ;QACpE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ;QACjC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;QAC5B,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,kBAAkB,CAAC,SAAS,CAAC;QAC1C,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;QACzC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK;QAClC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO;KAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { IngestPlugin } from "./types.js";
2
+ export declare class PluginRegistry {
3
+ private readonly plugins;
4
+ register(plugin: IngestPlugin): void;
5
+ unregister(id: string): boolean;
6
+ get(id: string): IngestPlugin | undefined;
7
+ getOrThrow(id: string): IngestPlugin;
8
+ list(): IngestPlugin[];
9
+ listByPriority(): IngestPlugin[];
10
+ has(id: string): boolean;
11
+ get size(): number;
12
+ disposeAll(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=plugin-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-registry.d.ts","sourceRoot":"","sources":["../src/plugin-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAE3D,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIpC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIzC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY;IAQpC,IAAI,IAAI,YAAY,EAAE;IAItB,cAAc,IAAI,YAAY,EAAE;IAMhC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAKlC"}
@@ -0,0 +1,37 @@
1
+ export class PluginRegistry {
2
+ plugins = new Map();
3
+ register(plugin) {
4
+ this.plugins.set(plugin.manifest.id, plugin);
5
+ }
6
+ unregister(id) {
7
+ return this.plugins.delete(id);
8
+ }
9
+ get(id) {
10
+ return this.plugins.get(id);
11
+ }
12
+ getOrThrow(id) {
13
+ const plugin = this.plugins.get(id);
14
+ if (plugin === undefined) {
15
+ throw new Error(`Plugin not found: ${id}`);
16
+ }
17
+ return plugin;
18
+ }
19
+ list() {
20
+ return Array.from(this.plugins.values());
21
+ }
22
+ listByPriority() {
23
+ return this.list().sort((a, b) => b.manifest.priority - a.manifest.priority);
24
+ }
25
+ has(id) {
26
+ return this.plugins.has(id);
27
+ }
28
+ get size() {
29
+ return this.plugins.size;
30
+ }
31
+ async disposeAll() {
32
+ const disposals = Array.from(this.plugins.values()).map((p) => p.dispose());
33
+ await Promise.all(disposals);
34
+ this.plugins.clear();
35
+ }
36
+ }
37
+ //# sourceMappingURL=plugin-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-registry.js","sourceRoot":"","sources":["../src/plugin-registry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IACR,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAE3D,QAAQ,CAAC,MAAoB;QAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CACrB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CACpD,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { IngestPlugin, PluginManifest, TriggerConfig, PluginConfig, PluginInitResult, NormalizedEvent, SourceURI } from "../../types.js";
2
+ export declare class ClaudeSessionsPlugin implements IngestPlugin {
3
+ readonly manifest: PluginManifest;
4
+ readonly triggers: TriggerConfig[];
5
+ initialize(_config?: PluginConfig): Promise<PluginInitResult>;
6
+ ingestAll(sourcePath: SourceURI): AsyncGenerator<NormalizedEvent>;
7
+ ingestIncremental(sourcePath: SourceURI, checkpoint: string): AsyncGenerator<NormalizedEvent>;
8
+ getCurrentCheckpoint(_sourcePath: SourceURI): Promise<string>;
9
+ dispose(): Promise<void>;
10
+ private processFile;
11
+ private findJsonlFiles;
12
+ private walkDir;
13
+ }
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/claude-sessions/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,SAAS,EACV,MAAM,gBAAgB,CAAC;AAGxB,qBAAa,oBAAqB,YAAW,YAAY;IACvD,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAM/B;IAEF,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,CAEhC;IAEI,UAAU,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI5D,SAAS,CAAC,UAAU,EAAE,SAAS,GAAG,cAAc,CAAC,eAAe,CAAC;IAOjE,iBAAiB,CACtB,UAAU,EAAE,SAAS,EACrB,UAAU,EAAE,MAAM,GACjB,cAAc,CAAC,eAAe,CAAC;IAe5B,oBAAoB,CAAC,WAAW,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAIf,WAAW;YAgEZ,cAAc;YAUd,OAAO;CAgBtB"}
@@ -0,0 +1,123 @@
1
+ import { readdir, stat } from "node:fs/promises";
2
+ import { join, basename, dirname } from "node:path";
3
+ import { parseSessionFile } from "./session-parser.js";
4
+ export class ClaudeSessionsPlugin {
5
+ manifest = {
6
+ id: "claude-sessions",
7
+ name: "Claude Code Sessions",
8
+ version: "0.1.0",
9
+ schemes: ["claude-session://"],
10
+ priority: 1,
11
+ };
12
+ triggers = [
13
+ { type: "file_watcher", paths: ["~/.claude/projects/**/*.jsonl"] },
14
+ ];
15
+ async initialize(_config) {
16
+ return { ok: true };
17
+ }
18
+ async *ingestAll(sourcePath) {
19
+ const jsonlFiles = await this.findJsonlFiles(sourcePath);
20
+ for (const filePath of jsonlFiles) {
21
+ yield* this.processFile(filePath);
22
+ }
23
+ }
24
+ async *ingestIncremental(sourcePath, checkpoint) {
25
+ const sinceDate = new Date(checkpoint);
26
+ const jsonlFiles = await this.findJsonlFiles(sourcePath);
27
+ for (const filePath of jsonlFiles) {
28
+ try {
29
+ const fileStat = await stat(filePath);
30
+ if (fileStat.mtimeMs >= sinceDate.getTime()) {
31
+ yield* this.processFile(filePath);
32
+ }
33
+ }
34
+ catch {
35
+ // ファイルアクセスエラーはスキップ
36
+ }
37
+ }
38
+ }
39
+ async getCurrentCheckpoint(_sourcePath) {
40
+ return new Date().toISOString();
41
+ }
42
+ async dispose() {
43
+ // no-op
44
+ }
45
+ async *processFile(filePath) {
46
+ const sessionId = basename(filePath, ".jsonl");
47
+ const projectName = basename(dirname(filePath));
48
+ // 全メッセージを収集
49
+ const allMessages = [];
50
+ try {
51
+ for await (const msg of parseSessionFile(filePath)) {
52
+ allMessages.push(msg);
53
+ }
54
+ }
55
+ catch (err) {
56
+ console.error(`[claude-sessions] Failed to parse ${filePath}:`, err);
57
+ return;
58
+ }
59
+ if (allMessages.length === 0)
60
+ return;
61
+ const firstMessage = allMessages[0];
62
+ // セッション開始イベント
63
+ yield {
64
+ sourceUri: `claude-session://${projectName}/${sessionId}`,
65
+ eventType: "session",
66
+ title: `Session: ${sessionId}`,
67
+ content: `Project: ${projectName}\nStarted: ${firstMessage.timestamp.toISOString()}`,
68
+ timestamp: firstMessage.timestamp,
69
+ metadata: {
70
+ sourcePlugin: "claude-sessions",
71
+ sourceId: sessionId,
72
+ project: projectName,
73
+ },
74
+ };
75
+ // メッセージイベント
76
+ for (const message of allMessages) {
77
+ const content = message.content;
78
+ yield {
79
+ sourceUri: `claude-session://${projectName}/${sessionId}#${message.uuid}`,
80
+ eventType: "session_event",
81
+ title: `${message.type}: ${content.slice(0, 80)}${content.length > 80 ? "..." : ""}`,
82
+ content,
83
+ timestamp: message.timestamp,
84
+ metadata: {
85
+ sourcePlugin: "claude-sessions",
86
+ sourceId: message.uuid,
87
+ author: message.type === "assistant" ? "claude" : "user",
88
+ project: projectName,
89
+ branch: message.gitBranch,
90
+ },
91
+ };
92
+ }
93
+ }
94
+ async findJsonlFiles(dir) {
95
+ const results = [];
96
+ try {
97
+ await this.walkDir(dir, results);
98
+ }
99
+ catch {
100
+ // ディレクトリが存在しない場合などは0件で正常終了
101
+ }
102
+ return results;
103
+ }
104
+ async walkDir(dir, results) {
105
+ let entries;
106
+ try {
107
+ entries = await readdir(dir, { withFileTypes: true });
108
+ }
109
+ catch {
110
+ return;
111
+ }
112
+ for (const entry of entries) {
113
+ const fullPath = join(dir, entry.name);
114
+ if (entry.isDirectory()) {
115
+ await this.walkDir(fullPath, results);
116
+ }
117
+ else if (entry.name.endsWith(".jsonl")) {
118
+ results.push(fullPath);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/claude-sessions/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface SessionMessage {
2
+ type: "user" | "assistant" | "system";
3
+ timestamp: Date;
4
+ sessionId: string;
5
+ content: string;
6
+ cwd: string;
7
+ gitBranch?: string;
8
+ uuid: string;
9
+ }
10
+ export declare function isRelevantEntry(entry: {
11
+ type: string;
12
+ }): boolean;
13
+ export declare function extractTextContent(content: string | Array<{
14
+ type: string;
15
+ text?: string;
16
+ }>): string;
17
+ export declare function parseSessionFile(filePath: string): AsyncGenerator<SessionMessage>;
18
+ //# sourceMappingURL=session-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-parser.d.ts","sourceRoot":"","sources":["../../../src/plugins/claude-sessions/session-parser.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAUD,wBAAgB,eAAe,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAMhE;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACvD,MAAM,CAiBR;AAED,wBAAuB,gBAAgB,CACrC,QAAQ,EAAE,MAAM,GACf,cAAc,CAAC,cAAc,CAAC,CA8DhC"}