axgram 0.1.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/README.md +126 -0
- package/dist/bin/axgram-hook.js +77 -0
- package/dist/bin/axgram-hook.js.map +1 -0
- package/dist/bin/axgram.js +386 -0
- package/dist/bin/axgram.js.map +1 -0
- package/dist/commands/hook-session-start.js +85 -0
- package/dist/commands/hook-session-start.js.map +1 -0
- package/dist/commands/hook-stop.js +73 -0
- package/dist/commands/hook-stop.js.map +1 -0
- package/dist/commands/import.js +56 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/invitations.js +153 -0
- package/dist/commands/invitations.js.map +1 -0
- package/dist/commands/login.js +125 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +11 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/members.js +231 -0
- package/dist/commands/members.js.map +1 -0
- package/dist/commands/mine.js +78 -0
- package/dist/commands/mine.js.map +1 -0
- package/dist/commands/orgs.js +153 -0
- package/dist/commands/orgs.js.map +1 -0
- package/dist/commands/projects.js +285 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/teams.js +153 -0
- package/dist/commands/teams.js.map +1 -0
- package/dist/commands/whoami.js +27 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/lib/auth.js +128 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/chunkers/exchange-pair.js +51 -0
- package/dist/lib/chunkers/exchange-pair.js.map +1 -0
- package/dist/lib/chunkers/index.js +74 -0
- package/dist/lib/chunkers/index.js.map +1 -0
- package/dist/lib/chunkers/line-group.js +20 -0
- package/dist/lib/chunkers/line-group.js.map +1 -0
- package/dist/lib/chunkers/paragraph.js +29 -0
- package/dist/lib/chunkers/paragraph.js.map +1 -0
- package/dist/lib/chunkers/types.js +3 -0
- package/dist/lib/chunkers/types.js.map +1 -0
- package/dist/lib/config-dir.js +30 -0
- package/dist/lib/config-dir.js.map +1 -0
- package/dist/lib/destructive-confirm.js +71 -0
- package/dist/lib/destructive-confirm.js.map +1 -0
- package/dist/lib/entity-extractor.js +182 -0
- package/dist/lib/entity-extractor.js.map +1 -0
- package/dist/lib/global-config.js +42 -0
- package/dist/lib/global-config.js.map +1 -0
- package/dist/lib/hook-settings.js +87 -0
- package/dist/lib/hook-settings.js.map +1 -0
- package/dist/lib/hook-state.js +38 -0
- package/dist/lib/hook-state.js.map +1 -0
- package/dist/lib/importers/chatgpt.js +89 -0
- package/dist/lib/importers/chatgpt.js.map +1 -0
- package/dist/lib/importers/claude.js +47 -0
- package/dist/lib/importers/claude.js.map +1 -0
- package/dist/lib/importers/gemini.js +38 -0
- package/dist/lib/importers/gemini.js.map +1 -0
- package/dist/lib/importers/markdown.js +47 -0
- package/dist/lib/importers/markdown.js.map +1 -0
- package/dist/lib/importers/obsidian.js +62 -0
- package/dist/lib/importers/obsidian.js.map +1 -0
- package/dist/lib/importers/run.js +51 -0
- package/dist/lib/importers/run.js.map +1 -0
- package/dist/lib/ingest.js +101 -0
- package/dist/lib/ingest.js.map +1 -0
- package/dist/lib/mcp-client.js +56 -0
- package/dist/lib/mcp-client.js.map +1 -0
- package/dist/lib/project-resolver.js +42 -0
- package/dist/lib/project-resolver.js.map +1 -0
- package/dist/lib/remote-url.js +23 -0
- package/dist/lib/remote-url.js.map +1 -0
- package/dist/lib/repo-bindings.js +52 -0
- package/dist/lib/repo-bindings.js.map +1 -0
- package/dist/lib/repo.js +72 -0
- package/dist/lib/repo.js.map +1 -0
- package/dist/lib/room-detector.js +99 -0
- package/dist/lib/room-detector.js.map +1 -0
- package/dist/lib/slugify.js +17 -0
- package/dist/lib/slugify.js.map +1 -0
- package/dist/lib/supabase-client.js +35 -0
- package/dist/lib/supabase-client.js.map +1 -0
- package/dist/lib/tool-vocab.js +114 -0
- package/dist/lib/tool-vocab.js.map +1 -0
- package/dist/lib/transcript.js +68 -0
- package/dist/lib/transcript.js.map +1 -0
- package/dist/lib/walker.js +81 -0
- package/dist/lib/walker.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-settings.js","sourceRoot":"","sources":["../../src/lib/hook-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadHookState = loadHookState;
|
|
4
|
+
exports.saveHookState = saveHookState;
|
|
5
|
+
const promises_1 = require("node:fs/promises");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const config_dir_1 = require("./config-dir");
|
|
8
|
+
const EMPTY = {
|
|
9
|
+
exchanges_since_checkpoint: 0,
|
|
10
|
+
last_checkpoint_at: null,
|
|
11
|
+
};
|
|
12
|
+
function statePath(projectId) {
|
|
13
|
+
return (0, node_path_1.resolve)((0, config_dir_1.configDir)(), `hook-state-${projectId}.json`);
|
|
14
|
+
}
|
|
15
|
+
async function loadHookState(projectId) {
|
|
16
|
+
try {
|
|
17
|
+
const raw = await (0, promises_1.readFile)(statePath(projectId), "utf8");
|
|
18
|
+
const parsed = JSON.parse(raw);
|
|
19
|
+
return {
|
|
20
|
+
exchanges_since_checkpoint: typeof parsed.exchanges_since_checkpoint === "number"
|
|
21
|
+
? parsed.exchanges_since_checkpoint
|
|
22
|
+
: 0,
|
|
23
|
+
last_checkpoint_at: typeof parsed.last_checkpoint_at === "string"
|
|
24
|
+
? parsed.last_checkpoint_at
|
|
25
|
+
: null,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
if (err.code === "ENOENT")
|
|
30
|
+
return { ...EMPTY };
|
|
31
|
+
return { ...EMPTY };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function saveHookState(projectId, state) {
|
|
35
|
+
await (0, promises_1.mkdir)((0, config_dir_1.configDir)(), { recursive: true, mode: 0o700 });
|
|
36
|
+
await (0, promises_1.writeFile)(statePath(projectId), JSON.stringify(state, null, 2), { encoding: "utf8", mode: 0o600 });
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=hook-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-state.js","sourceRoot":"","sources":["../../src/lib/hook-state.ts"],"names":[],"mappings":";;AAkBA,sCAkBC;AAED,sCAUC;AAhDD,+CAA8D;AAC9D,yCAAoC;AACpC,6CAAyC;AAOzC,MAAM,KAAK,GAAc;IACvB,0BAA0B,EAAE,CAAC;IAC7B,kBAAkB,EAAE,IAAI;CACzB,CAAC;AAEF,SAAS,SAAS,CAAC,SAAiB;IAClC,OAAO,IAAA,mBAAO,EAAC,IAAA,sBAAS,GAAE,EAAE,cAAc,SAAS,OAAO,CAAC,CAAC;AAC9D,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAQ,EAAC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;QACrD,OAAO;YACL,0BAA0B,EACxB,OAAO,MAAM,CAAC,0BAA0B,KAAK,QAAQ;gBACnD,CAAC,CAAC,MAAM,CAAC,0BAA0B;gBACnC,CAAC,CAAC,CAAC;YACP,kBAAkB,EAChB,OAAO,MAAM,CAAC,kBAAkB,KAAK,QAAQ;gBAC3C,CAAC,CAAC,MAAM,CAAC,kBAAkB;gBAC3B,CAAC,CAAC,IAAI;SACX,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;QAC1E,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,SAAiB,EACjB,KAAgB;IAEhB,MAAM,IAAA,gBAAK,EAAC,IAAA,sBAAS,GAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAA,oBAAS,EACb,SAAS,CAAC,SAAS,CAAC,EACpB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAC9B,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAClC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseChatGptExport = parseChatGptExport;
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const entity_extractor_1 = require("../entity-extractor");
|
|
6
|
+
const room_detector_1 = require("../room-detector");
|
|
7
|
+
/** Parse OpenAI's `conversations.json` GDPR export and return one
|
|
8
|
+
* drawer per (user, assistant) exchange pair, in conversation order. */
|
|
9
|
+
async function parseChatGptExport(filePath, opts = {}) {
|
|
10
|
+
const raw = await (0, promises_1.readFile)(filePath, "utf8");
|
|
11
|
+
const conversations = JSON.parse(raw);
|
|
12
|
+
if (!Array.isArray(conversations)) {
|
|
13
|
+
throw new Error(`Expected an array of conversations at the top of ${filePath}.`);
|
|
14
|
+
}
|
|
15
|
+
const wing = opts.wing ?? "chatgpt";
|
|
16
|
+
const items = [];
|
|
17
|
+
for (const convo of conversations) {
|
|
18
|
+
if (!convo.mapping)
|
|
19
|
+
continue;
|
|
20
|
+
const turns = linearize(convo.mapping);
|
|
21
|
+
const sourceFile = (convo.title?.trim() || "untitled-conversation").replace(/[^A-Za-z0-9._-]+/g, "-");
|
|
22
|
+
for (let i = 0; i < turns.length - 1; i++) {
|
|
23
|
+
const a = turns[i];
|
|
24
|
+
const b = turns[i + 1];
|
|
25
|
+
if (a.role === "user" && b.role === "assistant") {
|
|
26
|
+
const content = `User: ${a.text}\n\nAssistant: ${b.text}`;
|
|
27
|
+
const room = opts.room ?? (0, room_detector_1.detectRoom)(content);
|
|
28
|
+
const entities = opts.noKg ? undefined : (0, entity_extractor_1.extractEntities)(content);
|
|
29
|
+
items.push({
|
|
30
|
+
wing,
|
|
31
|
+
room,
|
|
32
|
+
content,
|
|
33
|
+
source_file: sourceFile,
|
|
34
|
+
...(entities ? { entities } : {}),
|
|
35
|
+
});
|
|
36
|
+
i++; // consume the assistant turn we just paired
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return items;
|
|
41
|
+
}
|
|
42
|
+
/** Walk the parent/child mapping graph in conversation order, dropping
|
|
43
|
+
* empty / system turns. */
|
|
44
|
+
function linearize(mapping) {
|
|
45
|
+
const nodes = Object.values(mapping);
|
|
46
|
+
const root = nodes.find((n) => n.parent == null) ?? nodes[0];
|
|
47
|
+
if (!root)
|
|
48
|
+
return [];
|
|
49
|
+
const ordered = [];
|
|
50
|
+
const stack = [root];
|
|
51
|
+
const seen = new Set();
|
|
52
|
+
while (stack.length > 0) {
|
|
53
|
+
const node = stack.pop();
|
|
54
|
+
if (node.id && seen.has(node.id))
|
|
55
|
+
continue;
|
|
56
|
+
if (node.id)
|
|
57
|
+
seen.add(node.id);
|
|
58
|
+
const turn = nodeToTurn(node);
|
|
59
|
+
if (turn)
|
|
60
|
+
ordered.push(turn);
|
|
61
|
+
const children = node.children ?? [];
|
|
62
|
+
for (let i = children.length - 1; i >= 0; i--) {
|
|
63
|
+
const child = mapping[children[i]];
|
|
64
|
+
if (child)
|
|
65
|
+
stack.push(child);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Stable sort by create_time when present — the graph walk is already
|
|
69
|
+
// close to linear but ChatGPT's branched edits may interleave timestamps.
|
|
70
|
+
ordered.sort((a, b) => a.ts - b.ts);
|
|
71
|
+
return ordered.filter((t) => t.role !== "system" && t.text.trim().length > 0);
|
|
72
|
+
}
|
|
73
|
+
function nodeToTurn(node) {
|
|
74
|
+
const msg = node.message;
|
|
75
|
+
if (!msg)
|
|
76
|
+
return null;
|
|
77
|
+
const role = msg.author?.role;
|
|
78
|
+
if (role !== "user" && role !== "assistant" && role !== "system")
|
|
79
|
+
return null;
|
|
80
|
+
const parts = msg.content?.parts ?? [];
|
|
81
|
+
const text = parts
|
|
82
|
+
.filter((p) => typeof p === "string")
|
|
83
|
+
.join("\n")
|
|
84
|
+
.trim();
|
|
85
|
+
if (!text)
|
|
86
|
+
return null;
|
|
87
|
+
return { role, text, ts: msg.create_time ?? 0 };
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=chatgpt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatgpt.js","sourceRoot":"","sources":["../../../src/lib/importers/chatgpt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseClaudeExport = parseClaudeExport;
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const entity_extractor_1 = require("../entity-extractor");
|
|
6
|
+
const room_detector_1 = require("../room-detector");
|
|
7
|
+
/** Parse Claude.ai's export JSON. Pairs (sender=human, sender=assistant)
|
|
8
|
+
* turns. Wing defaults to "claude". */
|
|
9
|
+
async function parseClaudeExport(filePath, opts = {}) {
|
|
10
|
+
const raw = await (0, promises_1.readFile)(filePath, "utf8");
|
|
11
|
+
const conversations = JSON.parse(raw);
|
|
12
|
+
if (!Array.isArray(conversations)) {
|
|
13
|
+
throw new Error(`Expected an array of conversations at the top of ${filePath}.`);
|
|
14
|
+
}
|
|
15
|
+
const wing = opts.wing ?? "claude";
|
|
16
|
+
const items = [];
|
|
17
|
+
for (const convo of conversations) {
|
|
18
|
+
const messages = convo.chat_messages ?? [];
|
|
19
|
+
const sourceFile = ((convo.name ?? convo.uuid ?? "untitled-conversation") + "")
|
|
20
|
+
.trim()
|
|
21
|
+
.replace(/[^A-Za-z0-9._-]+/g, "-");
|
|
22
|
+
for (let i = 0; i < messages.length - 1; i++) {
|
|
23
|
+
const a = messages[i];
|
|
24
|
+
const b = messages[i + 1];
|
|
25
|
+
const aText = (a.text ?? "").trim();
|
|
26
|
+
const bText = (b.text ?? "").trim();
|
|
27
|
+
if (a.sender === "human" &&
|
|
28
|
+
b.sender === "assistant" &&
|
|
29
|
+
aText.length > 0 &&
|
|
30
|
+
bText.length > 0) {
|
|
31
|
+
const content = `User: ${aText}\n\nAssistant: ${bText}`;
|
|
32
|
+
const room = opts.room ?? (0, room_detector_1.detectRoom)(content);
|
|
33
|
+
const entities = opts.noKg ? undefined : (0, entity_extractor_1.extractEntities)(content);
|
|
34
|
+
items.push({
|
|
35
|
+
wing,
|
|
36
|
+
room,
|
|
37
|
+
content,
|
|
38
|
+
source_file: sourceFile,
|
|
39
|
+
...(entities ? { entities } : {}),
|
|
40
|
+
});
|
|
41
|
+
i++;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return items;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/lib/importers/claude.ts"],"names":[],"mappings":";;AAyBA,8CAgDC;AAzED,+CAA4C;AAC5C,0DAAsD;AAEtD,oDAA8C;AAoB9C;wCACwC;AACjC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,OAA2B,EAAE;IAE7B,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAQ,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;IAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,oDAAoD,QAAQ,GAAG,CAChE,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;IACnC,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,uBAAuB,CAAC,GAAG,EAAE,CAAC;aAC5E,IAAI,EAAE;aACN,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YACvB,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACpC,IACE,CAAC,CAAC,MAAM,KAAK,OAAO;gBACpB,CAAC,CAAC,MAAM,KAAK,WAAW;gBACxB,KAAK,CAAC,MAAM,GAAG,CAAC;gBAChB,KAAK,CAAC,MAAM,GAAG,CAAC,EAChB,CAAC;gBACD,MAAM,OAAO,GAAG,SAAS,KAAK,kBAAkB,KAAK,EAAE,CAAC;gBACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAA,0BAAU,EAAC,OAAO,CAAC,CAAC;gBAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,kCAAe,EAAC,OAAO,CAAC,CAAC;gBAClE,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI;oBACJ,IAAI;oBACJ,OAAO;oBACP,WAAW,EAAE,UAAU;oBACvB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAClC,CAAC,CAAC;gBACH,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseGeminiExport = parseGeminiExport;
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const entity_extractor_1 = require("../entity-extractor");
|
|
6
|
+
const room_detector_1 = require("../room-detector");
|
|
7
|
+
/** Parse Google Takeout's "Gemini Apps" JSON. Schema is unstable and
|
|
8
|
+
* undocumented — the parser is defensive: malformed items are skipped, not
|
|
9
|
+
* thrown over. */
|
|
10
|
+
async function parseGeminiExport(filePath, opts = {}) {
|
|
11
|
+
const raw = await (0, promises_1.readFile)(filePath, "utf8");
|
|
12
|
+
const parsed = JSON.parse(raw);
|
|
13
|
+
const list = Array.isArray(parsed) ? parsed : (parsed.items ?? []);
|
|
14
|
+
const wing = opts.wing ?? "gemini";
|
|
15
|
+
const items = [];
|
|
16
|
+
for (const it of list) {
|
|
17
|
+
const prompt = (it.title ?? "").trim();
|
|
18
|
+
const responsePieces = (it.subtitles ?? [])
|
|
19
|
+
.map((s) => (s?.name ?? "").trim())
|
|
20
|
+
.filter((s) => s.length > 0);
|
|
21
|
+
const response = responsePieces.join("\n\n");
|
|
22
|
+
if (!prompt && !response)
|
|
23
|
+
continue;
|
|
24
|
+
const content = `User: ${prompt || "(empty prompt)"}\n\nAssistant: ${response || "(empty response)"}`;
|
|
25
|
+
const room = opts.room ?? (0, room_detector_1.detectRoom)(content);
|
|
26
|
+
const entities = opts.noKg ? undefined : (0, entity_extractor_1.extractEntities)(content);
|
|
27
|
+
const sourceFile = (it.time ?? "gemini-item").replace(/[^A-Za-z0-9._-]+/g, "-");
|
|
28
|
+
items.push({
|
|
29
|
+
wing,
|
|
30
|
+
room,
|
|
31
|
+
content,
|
|
32
|
+
source_file: sourceFile,
|
|
33
|
+
...(entities ? { entities } : {}),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return items;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/lib/importers/gemini.ts"],"names":[],"mappings":";;AA+BA,8CAiCC;AAhED,+CAA4C;AAC5C,0DAAsD;AAEtD,oDAA8C;AAyB9C;;mBAEmB;AACZ,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,OAA2B,EAAE;IAE7B,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAQ,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiC,CAAC;IAC/D,MAAM,IAAI,GAAiB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAEjF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;IACnC,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,CAAC,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;aAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7C,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ;YAAE,SAAS;QACnC,MAAM,OAAO,GAAG,SAAS,MAAM,IAAI,gBAAgB,kBAAkB,QAAQ,IAAI,kBAAkB,EAAE,CAAC;QACtG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAA,0BAAU,EAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,kCAAe,EAAC,OAAO,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,aAAa,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC;YACT,IAAI;YACJ,IAAI;YACJ,OAAO;YACP,WAAW,EAAE,UAAU;YACvB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseMarkdownDir = parseMarkdownDir;
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const paragraph_1 = require("../chunkers/paragraph");
|
|
7
|
+
const entity_extractor_1 = require("../entity-extractor");
|
|
8
|
+
const room_detector_1 = require("../room-detector");
|
|
9
|
+
const walker_1 = require("../walker");
|
|
10
|
+
const MD_EXTS = new Set([".md", ".markdown", ".txt"]);
|
|
11
|
+
/** Walk a directory of `.md` / `.txt` files (no Obsidian frontmatter
|
|
12
|
+
* assumptions), paragraph-chunk each, auto-detect rooms unless `room`
|
|
13
|
+
* pins them. Wing is required (no canonical default). */
|
|
14
|
+
async function parseMarkdownDir(rootPath, opts) {
|
|
15
|
+
const abs = (0, node_path_1.resolve)(rootPath);
|
|
16
|
+
const items = [];
|
|
17
|
+
for await (const file of (0, walker_1.walk)(abs)) {
|
|
18
|
+
const lower = file.path.toLowerCase();
|
|
19
|
+
if (![...MD_EXTS].some((ext) => lower.endsWith(ext)))
|
|
20
|
+
continue;
|
|
21
|
+
let raw;
|
|
22
|
+
try {
|
|
23
|
+
raw = await (0, promises_1.readFile)(file.path, "utf8");
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const body = raw.trim();
|
|
29
|
+
if (body.length === 0)
|
|
30
|
+
continue;
|
|
31
|
+
const chunks = (0, paragraph_1.paragraphChunker)(body);
|
|
32
|
+
const sourceFile = (0, node_path_1.relative)(abs, file.path);
|
|
33
|
+
for (const c of chunks) {
|
|
34
|
+
const room = opts.room ?? (0, room_detector_1.detectRoom)(c.content);
|
|
35
|
+
const entities = opts.noKg ? undefined : (0, entity_extractor_1.extractEntities)(c.content);
|
|
36
|
+
items.push({
|
|
37
|
+
wing: opts.wing,
|
|
38
|
+
room,
|
|
39
|
+
content: c.content,
|
|
40
|
+
source_file: sourceFile,
|
|
41
|
+
...(entities ? { entities } : {}),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return items;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/lib/importers/markdown.ts"],"names":[],"mappings":";;AAmBA,4CAkCC;AArDD,+CAA4C;AAC5C,yCAA6D;AAC7D,qDAAyD;AACzD,0DAAsD;AAEtD,oDAAyD;AACzD,sCAAiC;AAEjC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAQtD;;0DAE0D;AACnD,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,IAA0B;IAE1B,MAAM,GAAG,GAAG,IAAA,mBAAW,EAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAA,aAAI,EAAC,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,SAAS;QAC/D,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,MAAM,MAAM,GAAG,IAAA,4BAAgB,EAAC,IAAI,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,IAAA,oBAAQ,EAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,GAAU,IAAI,CAAC,IAAyB,IAAI,IAAA,0BAAU,EAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,kCAAe,EAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACpE,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI;gBACJ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW,EAAE,UAAU;gBACvB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseObsidianVault = parseObsidianVault;
|
|
7
|
+
const promises_1 = require("node:fs/promises");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
10
|
+
const paragraph_1 = require("../chunkers/paragraph");
|
|
11
|
+
const entity_extractor_1 = require("../entity-extractor");
|
|
12
|
+
const room_detector_1 = require("../room-detector");
|
|
13
|
+
const walker_1 = require("../walker");
|
|
14
|
+
const ROOMS = new Set([
|
|
15
|
+
"technical",
|
|
16
|
+
"architecture",
|
|
17
|
+
"planning",
|
|
18
|
+
"decisions",
|
|
19
|
+
"problems",
|
|
20
|
+
"general",
|
|
21
|
+
]);
|
|
22
|
+
/** Walk an Obsidian vault directory, parse each `.md` file's frontmatter
|
|
23
|
+
* for an optional room hint (first tag), then paragraph-chunk the body.
|
|
24
|
+
* Wing defaults to the vault basename; pass `wing` to override. */
|
|
25
|
+
async function parseObsidianVault(vaultPath, opts = {}) {
|
|
26
|
+
const abs = (0, node_path_1.resolve)(vaultPath);
|
|
27
|
+
const wing = opts.wing ?? (0, node_path_1.basename)(abs);
|
|
28
|
+
const items = [];
|
|
29
|
+
for await (const file of (0, walker_1.walk)(abs)) {
|
|
30
|
+
if (!file.path.toLowerCase().endsWith(".md"))
|
|
31
|
+
continue;
|
|
32
|
+
let raw;
|
|
33
|
+
try {
|
|
34
|
+
raw = await (0, promises_1.readFile)(file.path, "utf8");
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const fm = (0, gray_matter_1.default)(raw);
|
|
40
|
+
const tags = Array.isArray(fm.data.tags) ? fm.data.tags : [];
|
|
41
|
+
const tagHint = typeof tags[0] === "string" ? tags[0].toLowerCase() : "";
|
|
42
|
+
const tagRoom = ROOMS.has(tagHint) ? tagHint : null;
|
|
43
|
+
const body = fm.content.trim();
|
|
44
|
+
if (body.length === 0)
|
|
45
|
+
continue;
|
|
46
|
+
const chunks = (0, paragraph_1.paragraphChunker)(body);
|
|
47
|
+
const sourceFile = (0, node_path_1.relative)(abs, file.path);
|
|
48
|
+
for (const c of chunks) {
|
|
49
|
+
const room = opts.room ?? tagRoom ?? (0, room_detector_1.detectRoom)(c.content);
|
|
50
|
+
const entities = opts.noKg ? undefined : (0, entity_extractor_1.extractEntities)(c.content);
|
|
51
|
+
items.push({
|
|
52
|
+
wing,
|
|
53
|
+
room,
|
|
54
|
+
content: c.content,
|
|
55
|
+
source_file: sourceFile,
|
|
56
|
+
...(entities ? { entities } : {}),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return items;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=obsidian.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../../src/lib/importers/obsidian.ts"],"names":[],"mappings":";;;;;AA6BA,gDA0CC;AAvED,+CAA4C;AAC5C,yCAAuE;AACvE,8DAAiC;AACjC,qDAAyD;AACzD,0DAAsD;AAEtD,oDAAyD;AACzD,sCAAiC;AAEjC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAO;IAC1B,WAAW;IACX,cAAc;IACd,UAAU;IACV,WAAW;IACX,UAAU;IACV,SAAS;CACV,CAAC,CAAC;AAUH;;oEAEoE;AAC7D,KAAK,UAAU,kBAAkB,CACtC,SAAiB,EACjB,OAA6B,EAAE;IAE/B,MAAM,GAAG,GAAG,IAAA,mBAAW,EAAC,SAAS,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAA,oBAAQ,EAAC,GAAG,CAAC,CAAC;IACxC,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAA,aAAI,EAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACvD,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,EAAE,GAAG,IAAA,qBAAM,EAAC,GAAG,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,IAAI,CAAC,IAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,OAAO,GACX,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,CAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,OAAe,CAAC,CAAC,CAAC,CAAE,OAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;QAEtE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,MAAM,MAAM,GAAG,IAAA,4BAAgB,EAAC,IAAI,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,IAAA,oBAAQ,EAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,GACP,IAAI,CAAC,IAAyB,IAAI,OAAO,IAAI,IAAA,0BAAU,EAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,kCAAe,EAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACpE,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI;gBACJ,IAAI;gBACJ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW,EAAE,UAAU;gBACvB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runImporter = runImporter;
|
|
4
|
+
const mcp_client_1 = require("../mcp-client");
|
|
5
|
+
const project_resolver_1 = require("../project-resolver");
|
|
6
|
+
const ingest_1 = require("../ingest");
|
|
7
|
+
const remote_url_1 = require("../remote-url");
|
|
8
|
+
const DEFAULT_WORKER_URL = (0, remote_url_1.resolveRemoteUrl)();
|
|
9
|
+
/**
|
|
10
|
+
* Shared shell for `axgram import <flavor>`: resolves the active project,
|
|
11
|
+
* invokes the parser to get a list of IngestItems, runs them through
|
|
12
|
+
* ingestDrawers, prints the summary. Each importer just supplies a parser.
|
|
13
|
+
*/
|
|
14
|
+
async function runImporter(parser, opts, deps = {}) {
|
|
15
|
+
const log = deps.log ?? ((m) => process.stdout.write(`${m}\n`));
|
|
16
|
+
const err = deps.err ?? ((m) => process.stderr.write(`${m}\n`));
|
|
17
|
+
const resolved = await (0, project_resolver_1.resolveActiveProject)({ flag: opts.project });
|
|
18
|
+
if (!resolved.projectId) {
|
|
19
|
+
err(resolved.repoKey
|
|
20
|
+
? `No project bound to ${resolved.repoKey}. Run \`axgram projects link\` to bind one.`
|
|
21
|
+
: "No active project. Pass --project, set AXGRAM_PROJECT_ID, or run `axgram projects use <id>`.");
|
|
22
|
+
return 1;
|
|
23
|
+
}
|
|
24
|
+
const projectId = resolved.projectId;
|
|
25
|
+
log(`Importing ${opts.label} → project ${projectId} (source=${resolved.source})`);
|
|
26
|
+
let items;
|
|
27
|
+
try {
|
|
28
|
+
items = await parser();
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
err(`Parse failed: ${e.message}`);
|
|
32
|
+
return 1;
|
|
33
|
+
}
|
|
34
|
+
if (items.length === 0) {
|
|
35
|
+
log("No content to import.");
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
log(`Parsed ${items.length} chunks. Sending to worker.`);
|
|
39
|
+
const factory = deps.mcpClientFactory ?? mcp_client_1.authenticatedMcpClient;
|
|
40
|
+
const client = await factory(opts.workerUrl ?? DEFAULT_WORKER_URL);
|
|
41
|
+
let summary;
|
|
42
|
+
try {
|
|
43
|
+
summary = await (0, ingest_1.ingestDrawers)(client, projectId, items, { log, err });
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
await client.close();
|
|
47
|
+
}
|
|
48
|
+
log((0, ingest_1.formatSummary)(summary));
|
|
49
|
+
return summary.failed > 0 ? 1 : 0;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/lib/importers/run.ts"],"names":[],"mappings":";;AAgCA,kCA+CC;AA/ED,8CAGuB;AACvB,0DAA2D;AAC3D,sCAImB;AACnB,8CAAiD;AAEjD,MAAM,kBAAkB,GAAG,IAAA,6BAAgB,GAAE,CAAC;AAe9C;;;;GAIG;AACI,KAAK,UAAU,WAAW,CAC/B,MAAmC,EACnC,IAAqB,EACrB,OAAwB,EAAE;IAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAExE,MAAM,QAAQ,GAAG,MAAM,IAAA,uCAAoB,EAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACxB,GAAG,CACD,QAAQ,CAAC,OAAO;YACd,CAAC,CAAC,uBAAuB,QAAQ,CAAC,OAAO,6CAA6C;YACtF,CAAC,CAAC,8FAA8F,CACnG,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IAErC,GAAG,CAAC,aAAa,IAAI,CAAC,KAAK,cAAc,SAAS,YAAY,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAElF,IAAI,KAAmB,CAAC;IACxB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,iBAAkB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC7B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,GAAG,CAAC,UAAU,KAAK,CAAC,MAAM,6BAA6B,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,IAAI,mCAAsB,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,IAAA,sBAAa,EAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACxE,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC,CAAC;IAC5B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ingestDrawers = ingestDrawers;
|
|
4
|
+
exports.formatSummary = formatSummary;
|
|
5
|
+
const mcp_client_1 = require("./mcp-client");
|
|
6
|
+
const DEFAULT_BATCH = 50;
|
|
7
|
+
/**
|
|
8
|
+
* Push prepared drawer items through axgram_bulk_add (in batches), then
|
|
9
|
+
* fan out axgram_kg_add for any per-item entities. Both mine and the
|
|
10
|
+
* importers route through this helper.
|
|
11
|
+
*
|
|
12
|
+
* The caller is responsible for connecting + closing the ToolClient.
|
|
13
|
+
*/
|
|
14
|
+
async function ingestDrawers(client, projectId, items, opts = {}) {
|
|
15
|
+
const log = opts.log ?? (() => { });
|
|
16
|
+
const errOut = opts.err ?? (() => { });
|
|
17
|
+
const batchSize = opts.batchSize ?? DEFAULT_BATCH;
|
|
18
|
+
const summary = {
|
|
19
|
+
items: items.length,
|
|
20
|
+
drawers_inserted: 0,
|
|
21
|
+
drawers_deduped: 0,
|
|
22
|
+
triples_written: 0,
|
|
23
|
+
failed: 0,
|
|
24
|
+
};
|
|
25
|
+
for (let start = 0; start < items.length; start += batchSize) {
|
|
26
|
+
const batch = items.slice(start, start + batchSize);
|
|
27
|
+
let result;
|
|
28
|
+
try {
|
|
29
|
+
const raw = await client.callTool("axgram_bulk_add", {
|
|
30
|
+
project_id: projectId,
|
|
31
|
+
drawers: batch.map((b) => ({
|
|
32
|
+
wing: b.wing,
|
|
33
|
+
room: b.room,
|
|
34
|
+
content: b.content,
|
|
35
|
+
...(b.source_file !== undefined ? { source_file: b.source_file } : {}),
|
|
36
|
+
...(b.importance !== undefined ? { importance: b.importance } : {}),
|
|
37
|
+
})),
|
|
38
|
+
});
|
|
39
|
+
result = (0, mcp_client_1.parseToolResult)(raw);
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
errOut(`Batch ${start + 1}-${start + batch.length} failed: ${e.message}`);
|
|
43
|
+
summary.failed += batch.length;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
summary.drawers_inserted += result.inserted;
|
|
47
|
+
summary.drawers_deduped += result.duplicates;
|
|
48
|
+
log(`Batch ${start + 1}-${start + batch.length}: ` +
|
|
49
|
+
`+${result.inserted} added, ${result.duplicates} duplicates`);
|
|
50
|
+
const kgPromises = [];
|
|
51
|
+
for (const r of result.results) {
|
|
52
|
+
if (r.status !== "added" || !r.drawer_id)
|
|
53
|
+
continue;
|
|
54
|
+
const item = batch[r.index];
|
|
55
|
+
if (!item.entities || item.entities.length === 0)
|
|
56
|
+
continue;
|
|
57
|
+
for (const ent of item.entities) {
|
|
58
|
+
kgPromises.push(writeTriple(client, projectId, r.drawer_id, ent, item.source_file)
|
|
59
|
+
.then(() => {
|
|
60
|
+
summary.triples_written++;
|
|
61
|
+
})
|
|
62
|
+
.catch((e) => {
|
|
63
|
+
errOut(`KG write failed for ${ent.slug}: ${e.message}`);
|
|
64
|
+
summary.failed++;
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
await Promise.all(kgPromises);
|
|
69
|
+
}
|
|
70
|
+
return summary;
|
|
71
|
+
}
|
|
72
|
+
async function writeTriple(client, projectId, drawerId, entity, sourceFile) {
|
|
73
|
+
const type = entity.type === "unknown" ? "concept" : entity.type;
|
|
74
|
+
const confidence = Math.max(0, Math.min(1, entity.score / 5));
|
|
75
|
+
await client.callTool("axgram_kg_add", {
|
|
76
|
+
project_id: projectId,
|
|
77
|
+
subject_name: entity.name,
|
|
78
|
+
subject_type: type,
|
|
79
|
+
predicate: "appears_in",
|
|
80
|
+
object_name: drawerId,
|
|
81
|
+
object_type: "concept",
|
|
82
|
+
confidence,
|
|
83
|
+
...(sourceFile ? { source: sourceFile } : {}),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Format an IngestSummary as a human-readable block. Used by mine + each
|
|
88
|
+
* importer for end-of-run output.
|
|
89
|
+
*/
|
|
90
|
+
function formatSummary(summary) {
|
|
91
|
+
return [
|
|
92
|
+
"",
|
|
93
|
+
"Mine summary:",
|
|
94
|
+
` items ${summary.items}`,
|
|
95
|
+
` drawers inserted ${summary.drawers_inserted}`,
|
|
96
|
+
` drawers deduped ${summary.drawers_deduped}`,
|
|
97
|
+
` triples written ${summary.triples_written}`,
|
|
98
|
+
` failed ${summary.failed}`,
|
|
99
|
+
].join("\n");
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/lib/ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseToolResult = parseToolResult;
|
|
4
|
+
exports.authenticatedMcpClient = authenticatedMcpClient;
|
|
5
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
|
|
6
|
+
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
7
|
+
const auth_1 = require("./auth");
|
|
8
|
+
/**
|
|
9
|
+
* Parse a streamable-http MCP tool response into a typed JSON payload.
|
|
10
|
+
* Worker tools return text content with JSON-encoded bodies; this unwraps
|
|
11
|
+
* the envelope and JSON.parses the payload.
|
|
12
|
+
*/
|
|
13
|
+
function parseToolResult(raw) {
|
|
14
|
+
const r = raw;
|
|
15
|
+
if (r?.isError) {
|
|
16
|
+
const errText = r.content?.[0]?.text ?? "(no error text)";
|
|
17
|
+
throw new Error(`Tool error: ${errText}`);
|
|
18
|
+
}
|
|
19
|
+
const text = r?.content?.[0]?.text;
|
|
20
|
+
if (typeof text !== "string") {
|
|
21
|
+
throw new Error("MCP response missing text content");
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
return JSON.parse(text);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
throw new Error(`MCP response not JSON: ${err.message}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build an authenticated MCP client against the worker's /mcp endpoint.
|
|
32
|
+
*
|
|
33
|
+
* Uses the local cached access token. Token refresh happens before the
|
|
34
|
+
* connection is opened — long-running sessions that span past expiry will
|
|
35
|
+
* need to reconnect (we don't yet wire token refresh into in-flight
|
|
36
|
+
* connections; not critical for one-shot CLI invocations).
|
|
37
|
+
*/
|
|
38
|
+
async function authenticatedMcpClient(workerUrl) {
|
|
39
|
+
const accessToken = await (0, auth_1.getActiveAccessToken)();
|
|
40
|
+
const transport = new streamableHttp_js_1.StreamableHTTPClientTransport(new URL(`${workerUrl.replace(/\/+$/, "")}/mcp`), {
|
|
41
|
+
requestInit: {
|
|
42
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
const client = new index_js_1.Client({ name: "axgram-cli", version: "0.1.0" }, { capabilities: {} });
|
|
46
|
+
await client.connect(transport);
|
|
47
|
+
return {
|
|
48
|
+
async callTool(name, args) {
|
|
49
|
+
return await client.callTool({ name, arguments: args });
|
|
50
|
+
},
|
|
51
|
+
async close() {
|
|
52
|
+
await client.close();
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=mcp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/lib/mcp-client.ts"],"names":[],"mappings":";;AAmBA,0CAeC;AAUD,wDA0BC;AAtED,wEAAmE;AACnE,0FAAmG;AACnG,iCAA8C;AAY9C;;;;GAIG;AACH,SAAgB,eAAe,CAAI,GAAY;IAC7C,MAAM,CAAC,GAAG,GAAmB,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,iBAAiB,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,sBAAsB,CAC1C,SAAiB;IAEjB,MAAM,WAAW,GAAG,MAAM,IAAA,2BAAoB,GAAE,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,iDAA6B,CACjD,IAAI,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAC/C;QACE,WAAW,EAAE;YACX,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE;SACpD;KACF,CACF,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,iBAAM,CACvB,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EACxC,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;IACF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI;YACvB,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveActiveProject = resolveActiveProject;
|
|
4
|
+
const global_config_1 = require("./global-config");
|
|
5
|
+
const repo_bindings_1 = require("./repo-bindings");
|
|
6
|
+
const repo_1 = require("./repo");
|
|
7
|
+
/**
|
|
8
|
+
* Resolution chain (highest precedence first):
|
|
9
|
+
* 1. --project flag
|
|
10
|
+
* 2. AXGRAM_PROJECT_ID env var
|
|
11
|
+
* 3. Git-repo binding for cwd's normalized origin URL
|
|
12
|
+
* 4. ~/.axgram/config.json default_project_id
|
|
13
|
+
* 5. Unbound (caller exits 1 / prompts for disambiguation)
|
|
14
|
+
*
|
|
15
|
+
* Read order matters: the env var beats the binding so a developer can
|
|
16
|
+
* pin a different project for one shell session ("AXGRAM_PROJECT_ID=... npm run mine").
|
|
17
|
+
*/
|
|
18
|
+
async function resolveActiveProject(opts = {}) {
|
|
19
|
+
if (opts.flag && opts.flag.length > 0) {
|
|
20
|
+
return { projectId: opts.flag, source: "flag" };
|
|
21
|
+
}
|
|
22
|
+
const env = opts.env ?? process.env;
|
|
23
|
+
const fromEnv = env.AXGRAM_PROJECT_ID;
|
|
24
|
+
if (fromEnv && fromEnv.length > 0) {
|
|
25
|
+
return { projectId: fromEnv, source: "env" };
|
|
26
|
+
}
|
|
27
|
+
const repoKey = await (0, repo_1.getCurrentRepoKey)(opts.cwd);
|
|
28
|
+
if (repoKey) {
|
|
29
|
+
const binding = await (0, repo_bindings_1.getBinding)(repoKey);
|
|
30
|
+
if (binding)
|
|
31
|
+
return { projectId: binding, source: "repo-binding", repoKey };
|
|
32
|
+
}
|
|
33
|
+
const globalCfg = await (0, global_config_1.loadGlobalConfig)();
|
|
34
|
+
if (globalCfg.default_project_id) {
|
|
35
|
+
return {
|
|
36
|
+
projectId: globalCfg.default_project_id,
|
|
37
|
+
source: "global-default",
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return { projectId: null, source: "unbound", ...(repoKey ? { repoKey } : {}) };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=project-resolver.js.map
|