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.
Files changed (90) hide show
  1. package/README.md +126 -0
  2. package/dist/bin/axgram-hook.js +77 -0
  3. package/dist/bin/axgram-hook.js.map +1 -0
  4. package/dist/bin/axgram.js +386 -0
  5. package/dist/bin/axgram.js.map +1 -0
  6. package/dist/commands/hook-session-start.js +85 -0
  7. package/dist/commands/hook-session-start.js.map +1 -0
  8. package/dist/commands/hook-stop.js +73 -0
  9. package/dist/commands/hook-stop.js.map +1 -0
  10. package/dist/commands/import.js +56 -0
  11. package/dist/commands/import.js.map +1 -0
  12. package/dist/commands/invitations.js +153 -0
  13. package/dist/commands/invitations.js.map +1 -0
  14. package/dist/commands/login.js +125 -0
  15. package/dist/commands/login.js.map +1 -0
  16. package/dist/commands/logout.js +11 -0
  17. package/dist/commands/logout.js.map +1 -0
  18. package/dist/commands/members.js +231 -0
  19. package/dist/commands/members.js.map +1 -0
  20. package/dist/commands/mine.js +78 -0
  21. package/dist/commands/mine.js.map +1 -0
  22. package/dist/commands/orgs.js +153 -0
  23. package/dist/commands/orgs.js.map +1 -0
  24. package/dist/commands/projects.js +285 -0
  25. package/dist/commands/projects.js.map +1 -0
  26. package/dist/commands/teams.js +153 -0
  27. package/dist/commands/teams.js.map +1 -0
  28. package/dist/commands/whoami.js +27 -0
  29. package/dist/commands/whoami.js.map +1 -0
  30. package/dist/lib/auth.js +128 -0
  31. package/dist/lib/auth.js.map +1 -0
  32. package/dist/lib/chunkers/exchange-pair.js +51 -0
  33. package/dist/lib/chunkers/exchange-pair.js.map +1 -0
  34. package/dist/lib/chunkers/index.js +74 -0
  35. package/dist/lib/chunkers/index.js.map +1 -0
  36. package/dist/lib/chunkers/line-group.js +20 -0
  37. package/dist/lib/chunkers/line-group.js.map +1 -0
  38. package/dist/lib/chunkers/paragraph.js +29 -0
  39. package/dist/lib/chunkers/paragraph.js.map +1 -0
  40. package/dist/lib/chunkers/types.js +3 -0
  41. package/dist/lib/chunkers/types.js.map +1 -0
  42. package/dist/lib/config-dir.js +30 -0
  43. package/dist/lib/config-dir.js.map +1 -0
  44. package/dist/lib/destructive-confirm.js +71 -0
  45. package/dist/lib/destructive-confirm.js.map +1 -0
  46. package/dist/lib/entity-extractor.js +182 -0
  47. package/dist/lib/entity-extractor.js.map +1 -0
  48. package/dist/lib/global-config.js +42 -0
  49. package/dist/lib/global-config.js.map +1 -0
  50. package/dist/lib/hook-settings.js +87 -0
  51. package/dist/lib/hook-settings.js.map +1 -0
  52. package/dist/lib/hook-state.js +38 -0
  53. package/dist/lib/hook-state.js.map +1 -0
  54. package/dist/lib/importers/chatgpt.js +89 -0
  55. package/dist/lib/importers/chatgpt.js.map +1 -0
  56. package/dist/lib/importers/claude.js +47 -0
  57. package/dist/lib/importers/claude.js.map +1 -0
  58. package/dist/lib/importers/gemini.js +38 -0
  59. package/dist/lib/importers/gemini.js.map +1 -0
  60. package/dist/lib/importers/markdown.js +47 -0
  61. package/dist/lib/importers/markdown.js.map +1 -0
  62. package/dist/lib/importers/obsidian.js +62 -0
  63. package/dist/lib/importers/obsidian.js.map +1 -0
  64. package/dist/lib/importers/run.js +51 -0
  65. package/dist/lib/importers/run.js.map +1 -0
  66. package/dist/lib/ingest.js +101 -0
  67. package/dist/lib/ingest.js.map +1 -0
  68. package/dist/lib/mcp-client.js +56 -0
  69. package/dist/lib/mcp-client.js.map +1 -0
  70. package/dist/lib/project-resolver.js +42 -0
  71. package/dist/lib/project-resolver.js.map +1 -0
  72. package/dist/lib/remote-url.js +23 -0
  73. package/dist/lib/remote-url.js.map +1 -0
  74. package/dist/lib/repo-bindings.js +52 -0
  75. package/dist/lib/repo-bindings.js.map +1 -0
  76. package/dist/lib/repo.js +72 -0
  77. package/dist/lib/repo.js.map +1 -0
  78. package/dist/lib/room-detector.js +99 -0
  79. package/dist/lib/room-detector.js.map +1 -0
  80. package/dist/lib/slugify.js +17 -0
  81. package/dist/lib/slugify.js.map +1 -0
  82. package/dist/lib/supabase-client.js +35 -0
  83. package/dist/lib/supabase-client.js.map +1 -0
  84. package/dist/lib/tool-vocab.js +114 -0
  85. package/dist/lib/tool-vocab.js.map +1 -0
  86. package/dist/lib/transcript.js +68 -0
  87. package/dist/lib/transcript.js.map +1 -0
  88. package/dist/lib/walker.js +81 -0
  89. package/dist/lib/walker.js.map +1 -0
  90. package/package.json +47 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-settings.js","sourceRoot":"","sources":["../../src/lib/hook-settings.ts"],"names":[],"mappings":";;AA0FA,4DAyCC;AAnID,+CAA8D;AAC9D,yCAAoC;AACpC,6CAAyC;AACzC,6CAIsB;AACtB,6CAAgD;AAahD;iCACiC;AACjC,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEpC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,kBAAkB,GAAG,IAAA,6BAAgB,GAAE,CAAC;AAE9C,SAAS,SAAS,CAAC,SAAiB;IAClC,OAAO,IAAA,mBAAO,EAAC,IAAA,sBAAS,GAAE,EAAE,iBAAiB,SAAS,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,SAAiB;IAEjB,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,CAA4B,CAAC;QAC1D,IACE,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;YACpC,OAAO,MAAM,CAAC,OAAO,KAAK,SAAS;YACnC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EACrC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAwB,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,SAAiB,EACjB,QAAwB;IAExB,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,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EACjC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,MAAsB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,GAAG,GAAG,OAAO,GAAG,YAAY,CAAC;AACtC,CAAC;AAiBD;;;;;GAKG;AACI,KAAK,UAAU,wBAAwB,CAC5C,SAAiB,EACjB,OAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAChE,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,IAAI,mCAAsB,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEtC,IAAI,MAAM,GAAsB,IAAI,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,sBAAsB,EAAE;YACxD,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,4BAAe,EAAuB,GAAG,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAiB;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB;YAC9C,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO;SAClC,CAAC;QACF,MAAM,SAAS,CAAC,SAAS,EAAE;YACzB,GAAG,QAAQ;YACX,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CACJ,+CAAgD,CAAW,CAAC,OAAO,KAAK;YACtE,CAAC,MAAM;gBACL,CAAC,CAAC,6BAA6B;gBAC/B,CAAC,CAAC,2BAA2B,iBAAiB,gBAAgB,CAAC,CACpE,CAAC;QACF,IAAI,MAAM;YAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5E,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;YAAS,CAAC;QACT,IAAI,MAAM;YAAE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
@@ -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