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":"project-resolver.js","sourceRoot":"","sources":["../../src/lib/project-resolver.ts"],"names":[],"mappings":";;AAuCA,oDA4BC;AAnED,mDAAmD;AACnD,mDAA6C;AAC7C,iCAA2C;AA0B3C;;;;;;;;;;GAUG;AACI,KAAK,UAAU,oBAAoB,CACxC,OAAuB,EAAE;IAEzB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;IACtC,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAA,wBAAiB,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,MAAM,IAAA,0BAAU,EAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,OAAO;YAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;IAC9E,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,IAAA,gCAAgB,GAAE,CAAC;IAC3C,IAAI,SAAS,CAAC,kBAAkB,EAAE,CAAC;QACjC,OAAO;YACL,SAAS,EAAE,SAAS,CAAC,kBAAkB;YACvC,MAAM,EAAE,gBAAgB;SACzB,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_REMOTE_URL = void 0;
|
|
4
|
+
exports.resolveRemoteUrl = resolveRemoteUrl;
|
|
5
|
+
/**
|
|
6
|
+
* Canonical Axgram MCP worker origin the CLI talks to.
|
|
7
|
+
*
|
|
8
|
+
* Production is served at `mcp.axgram.dev` (worker/wrangler.toml
|
|
9
|
+
* `[env.production]` route). Point the CLI at a staging/dev deployment
|
|
10
|
+
* for testing via `AXGRAM_REMOTE_URL` (e.g. `https://mcp-stage.axgram.dev`).
|
|
11
|
+
* `AXGRAM_WORKER_URL` is honored as a legacy alias.
|
|
12
|
+
*/
|
|
13
|
+
exports.DEFAULT_REMOTE_URL = "https://mcp.axgram.dev";
|
|
14
|
+
function resolveRemoteUrl() {
|
|
15
|
+
const remote = process.env.AXGRAM_REMOTE_URL;
|
|
16
|
+
if (remote && remote.length > 0)
|
|
17
|
+
return remote;
|
|
18
|
+
const legacy = process.env.AXGRAM_WORKER_URL;
|
|
19
|
+
if (legacy && legacy.length > 0)
|
|
20
|
+
return legacy;
|
|
21
|
+
return exports.DEFAULT_REMOTE_URL;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=remote-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-url.js","sourceRoot":"","sources":["../../src/lib/remote-url.ts"],"names":[],"mappings":";;;AAUA,4CAMC;AAhBD;;;;;;;GAOG;AACU,QAAA,kBAAkB,GAAG,wBAAwB,CAAC;AAE3D,SAAgB,gBAAgB;IAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/C,OAAO,0BAAkB,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getBinding = getBinding;
|
|
4
|
+
exports.setBinding = setBinding;
|
|
5
|
+
exports.removeBinding = removeBinding;
|
|
6
|
+
exports.listBindings = listBindings;
|
|
7
|
+
const promises_1 = require("node:fs/promises");
|
|
8
|
+
const config_dir_1 = require("./config-dir");
|
|
9
|
+
function emptyFile() {
|
|
10
|
+
return { version: 1, bindings: {} };
|
|
11
|
+
}
|
|
12
|
+
async function load() {
|
|
13
|
+
try {
|
|
14
|
+
const raw = await (0, promises_1.readFile)((0, config_dir_1.repoBindingsPath)(), "utf8");
|
|
15
|
+
const parsed = JSON.parse(raw);
|
|
16
|
+
if (parsed.version === 1 && parsed.bindings && typeof parsed.bindings === "object") {
|
|
17
|
+
return { version: 1, bindings: { ...parsed.bindings } };
|
|
18
|
+
}
|
|
19
|
+
return emptyFile();
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
if (err.code === "ENOENT")
|
|
23
|
+
return emptyFile();
|
|
24
|
+
return emptyFile();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function persist(file) {
|
|
28
|
+
await (0, promises_1.mkdir)((0, config_dir_1.configDir)(), { recursive: true, mode: 0o700 });
|
|
29
|
+
await (0, promises_1.writeFile)((0, config_dir_1.repoBindingsPath)(), JSON.stringify(file, null, 2), { encoding: "utf8", mode: 0o644 });
|
|
30
|
+
}
|
|
31
|
+
async function getBinding(repoKey) {
|
|
32
|
+
const file = await load();
|
|
33
|
+
return file.bindings[repoKey] ?? null;
|
|
34
|
+
}
|
|
35
|
+
async function setBinding(repoKey, projectId) {
|
|
36
|
+
const file = await load();
|
|
37
|
+
file.bindings[repoKey] = projectId;
|
|
38
|
+
await persist(file);
|
|
39
|
+
}
|
|
40
|
+
async function removeBinding(repoKey) {
|
|
41
|
+
const file = await load();
|
|
42
|
+
if (!(repoKey in file.bindings))
|
|
43
|
+
return false;
|
|
44
|
+
delete file.bindings[repoKey];
|
|
45
|
+
await persist(file);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
async function listBindings() {
|
|
49
|
+
const file = await load();
|
|
50
|
+
return { ...file.bindings };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=repo-bindings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-bindings.js","sourceRoot":"","sources":["../../src/lib/repo-bindings.ts"],"names":[],"mappings":";;AAmCA,gCAGC;AAED,gCAIC;AAED,sCAMC;AAED,oCAGC;AAzDD,+CAA8D;AAC9D,6CAA2D;AAO3D,SAAS,SAAS;IAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAA,6BAAgB,GAAE,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA8B,CAAC;QAC5D,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACnF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC1D,CAAC;QACD,OAAO,SAAS,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,EAAE,CAAC;QACzE,OAAO,SAAS,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAsB;IAC3C,MAAM,IAAA,gBAAK,EAAC,IAAA,sBAAS,GAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAA,oBAAS,EACb,IAAA,6BAAgB,GAAE,EAClB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAC7B,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAClC,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC;IAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AACxC,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,SAAiB;IACjE,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IACnC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,YAAY;IAChC,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC;IAC1B,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
|
package/dist/lib/repo.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeRepoUrl = normalizeRepoUrl;
|
|
4
|
+
exports.getCurrentRepoUrl = getCurrentRepoUrl;
|
|
5
|
+
exports.getCurrentRepoKey = getCurrentRepoKey;
|
|
6
|
+
const node_child_process_1 = require("node:child_process");
|
|
7
|
+
const node_util_1 = require("node:util");
|
|
8
|
+
const execFileP = (0, node_util_1.promisify)(node_child_process_1.execFile);
|
|
9
|
+
/**
|
|
10
|
+
* Normalize a git remote URL into a stable `host/path` key.
|
|
11
|
+
*
|
|
12
|
+
* Same remote authored as any of:
|
|
13
|
+
* git@github.com:Org/Repo.git
|
|
14
|
+
* https://github.com/Org/Repo
|
|
15
|
+
* ssh://git@github.com:22/Org/Repo.git
|
|
16
|
+
* collapses to `github.com/org/repo` so the binding file resolves the same
|
|
17
|
+
* project regardless of the developer's cloning style.
|
|
18
|
+
*
|
|
19
|
+
* Returns null when the input doesn't look like a git URL.
|
|
20
|
+
*/
|
|
21
|
+
function normalizeRepoUrl(input) {
|
|
22
|
+
const url = input.trim();
|
|
23
|
+
if (!url)
|
|
24
|
+
return null;
|
|
25
|
+
// SSH shorthand: user@host:path (no scheme, single colon between host and path)
|
|
26
|
+
const sshMatch = url.match(/^(?:([a-z0-9._-]+)@)?([^:/\s]+):([^:].*)$/i);
|
|
27
|
+
if (sshMatch && !/^[a-z]+:\/\//i.test(url)) {
|
|
28
|
+
const host = sshMatch[2];
|
|
29
|
+
const path = sshMatch[3];
|
|
30
|
+
return formatKey(host, path);
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const u = new URL(url);
|
|
34
|
+
return formatKey(u.hostname, u.pathname.replace(/^\/+/, ""));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function formatKey(host, path) {
|
|
41
|
+
const cleanPath = path.replace(/\.git$/i, "").replace(/\/+$/, "");
|
|
42
|
+
return `${host}/${cleanPath}`.toLowerCase();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolve the current working directory's git origin URL via
|
|
46
|
+
* `git config --get remote.origin.url`. Returns null when not in a repo, or
|
|
47
|
+
* when the repo has no `origin` remote configured.
|
|
48
|
+
*
|
|
49
|
+
* The cwd parameter is exposed for testing.
|
|
50
|
+
*/
|
|
51
|
+
async function getCurrentRepoUrl(cwd = process.cwd()) {
|
|
52
|
+
try {
|
|
53
|
+
const { stdout } = await execFileP("git", ["config", "--get", "remote.origin.url"], { cwd });
|
|
54
|
+
const value = stdout.trim();
|
|
55
|
+
return value.length > 0 ? value : null;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// git not installed, not a repo, or no origin remote → null
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Convenience: returns the normalized binding key for the cwd's git origin,
|
|
64
|
+
* or null if no git repo / no origin / unparseable URL.
|
|
65
|
+
*/
|
|
66
|
+
async function getCurrentRepoKey(cwd) {
|
|
67
|
+
const url = await getCurrentRepoUrl(cwd);
|
|
68
|
+
if (!url)
|
|
69
|
+
return null;
|
|
70
|
+
return normalizeRepoUrl(url);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/lib/repo.ts"],"names":[],"mappings":";;AAiBA,4CAkBC;AAcD,8CAaC;AAMD,8CAIC;AAxED,2DAA8C;AAC9C,yCAAsC;AAEtC,MAAM,SAAS,GAAG,IAAA,qBAAS,EAAC,6BAAQ,CAAC,CAAC;AAEtC;;;;;;;;;;;GAWG;AACH,SAAgB,gBAAgB,CAAC,KAAa;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,gFAAgF;IAChF,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACzE,IAAI,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC1B,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClE,OAAO,GAAG,IAAI,IAAI,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACjE,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,KAAK,EACL,CAAC,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,EACxC,EAAE,GAAG,EAAE,CACR,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,iBAAiB,CAAC,GAAY;IAClD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectRoom = detectRoom;
|
|
4
|
+
/**
|
|
5
|
+
* Keyword tables ported from MemPalace's room classifier. Order of room
|
|
6
|
+
* declarations defines tie-breaking precedence (earlier rooms win ties),
|
|
7
|
+
* which puts the more concrete categories ahead of the abstract ones.
|
|
8
|
+
*/
|
|
9
|
+
const KEYWORDS = {
|
|
10
|
+
technical: [
|
|
11
|
+
"function",
|
|
12
|
+
"class",
|
|
13
|
+
"def",
|
|
14
|
+
"import",
|
|
15
|
+
"return",
|
|
16
|
+
"async",
|
|
17
|
+
"await",
|
|
18
|
+
"const",
|
|
19
|
+
"var",
|
|
20
|
+
"let",
|
|
21
|
+
"throws",
|
|
22
|
+
"yield",
|
|
23
|
+
"static",
|
|
24
|
+
"interface",
|
|
25
|
+
"extends",
|
|
26
|
+
],
|
|
27
|
+
architecture: [
|
|
28
|
+
"system",
|
|
29
|
+
"component",
|
|
30
|
+
"module",
|
|
31
|
+
"layer",
|
|
32
|
+
"pattern",
|
|
33
|
+
"design",
|
|
34
|
+
"interface",
|
|
35
|
+
"service",
|
|
36
|
+
"infrastructure",
|
|
37
|
+
"topology",
|
|
38
|
+
],
|
|
39
|
+
planning: [
|
|
40
|
+
"todo",
|
|
41
|
+
"plan",
|
|
42
|
+
"roadmap",
|
|
43
|
+
"milestone",
|
|
44
|
+
"phase",
|
|
45
|
+
"task",
|
|
46
|
+
"sprint",
|
|
47
|
+
"backlog",
|
|
48
|
+
"epic",
|
|
49
|
+
],
|
|
50
|
+
decisions: [
|
|
51
|
+
"decided",
|
|
52
|
+
"decision",
|
|
53
|
+
"choose",
|
|
54
|
+
"chose",
|
|
55
|
+
"rationale",
|
|
56
|
+
"because",
|
|
57
|
+
"alternative",
|
|
58
|
+
"tradeoff",
|
|
59
|
+
"decided",
|
|
60
|
+
"agreed",
|
|
61
|
+
],
|
|
62
|
+
problems: [
|
|
63
|
+
"bug",
|
|
64
|
+
"error",
|
|
65
|
+
"fail",
|
|
66
|
+
"failed",
|
|
67
|
+
"issue",
|
|
68
|
+
"broken",
|
|
69
|
+
"fix",
|
|
70
|
+
"regression",
|
|
71
|
+
"exception",
|
|
72
|
+
"crash",
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
function detectRoom(text) {
|
|
76
|
+
const lower = text.toLowerCase();
|
|
77
|
+
let bestRoom = "general";
|
|
78
|
+
let bestScore = 0;
|
|
79
|
+
for (const [room, words] of Object.entries(KEYWORDS)) {
|
|
80
|
+
const score = words.reduce((acc, kw) => acc + countWord(lower, kw), 0);
|
|
81
|
+
if (score > bestScore) {
|
|
82
|
+
bestScore = score;
|
|
83
|
+
bestRoom = room;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return bestScore > 0 ? bestRoom : "general";
|
|
87
|
+
}
|
|
88
|
+
function countWord(haystack, word) {
|
|
89
|
+
if (!word)
|
|
90
|
+
return 0;
|
|
91
|
+
// \b on word boundaries — avoids "imported" matching "import".
|
|
92
|
+
const re = new RegExp(`\\b${escapeRegex(word)}\\b`, "g");
|
|
93
|
+
const m = haystack.match(re);
|
|
94
|
+
return m ? m.length : 0;
|
|
95
|
+
}
|
|
96
|
+
function escapeRegex(s) {
|
|
97
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=room-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-detector.js","sourceRoot":"","sources":["../../src/lib/room-detector.ts"],"names":[],"mappings":";;AAgFA,gCAiBC;AAzFD;;;;GAIG;AACH,MAAM,QAAQ,GAA+C;IAC3D,SAAS,EAAE;QACT,UAAU;QACV,OAAO;QACP,KAAK;QACL,QAAQ;QACR,QAAQ;QACR,OAAO;QACP,OAAO;QACP,OAAO;QACP,KAAK;QACL,KAAK;QACL,QAAQ;QACR,OAAO;QACP,QAAQ;QACR,WAAW;QACX,SAAS;KACV;IACD,YAAY,EAAE;QACZ,QAAQ;QACR,WAAW;QACX,QAAQ;QACR,OAAO;QACP,SAAS;QACT,QAAQ;QACR,WAAW;QACX,SAAS;QACT,gBAAgB;QAChB,UAAU;KACX;IACD,QAAQ,EAAE;QACR,MAAM;QACN,MAAM;QACN,SAAS;QACT,WAAW;QACX,OAAO;QACP,MAAM;QACN,QAAQ;QACR,SAAS;QACT,MAAM;KACP;IACD,SAAS,EAAE;QACT,SAAS;QACT,UAAU;QACV,QAAQ;QACR,OAAO;QACP,WAAW;QACX,SAAS;QACT,aAAa;QACb,UAAU;QACV,SAAS;QACT,QAAQ;KACT;IACD,QAAQ,EAAE;QACR,KAAK;QACL,OAAO;QACP,MAAM;QACN,QAAQ;QACR,OAAO;QACP,QAAQ;QACR,KAAK;QACL,YAAY;QACZ,WAAW;QACX,OAAO;KACR;CACF,CAAC;AAEF,SAAgB,UAAU,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,QAAQ,GAAS,SAAS,CAAC;IAC/B,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAGhD,EAAE,CAAC;QACJ,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvE,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;YACtB,SAAS,GAAG,KAAK,CAAC;YAClB,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,IAAY;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,+DAA+D;IAC/D,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.slugify = slugify;
|
|
4
|
+
/**
|
|
5
|
+
* Convert a free-form entity name into a stable slug. Mirrors
|
|
6
|
+
* worker/src/lib/extract.ts so triples written from CLI mining and triples
|
|
7
|
+
* written from worker `axgram_kg_add` collapse to the same entity rows.
|
|
8
|
+
*/
|
|
9
|
+
function slugify(name) {
|
|
10
|
+
const trimmed = name.trim().toLowerCase();
|
|
11
|
+
const slug = trimmed.replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
12
|
+
if (slug.length === 0) {
|
|
13
|
+
throw new Error(`cannot slugify empty/non-alphanumeric input: ${JSON.stringify(name)}`);
|
|
14
|
+
}
|
|
15
|
+
return slug;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=slugify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slugify.js","sourceRoot":"","sources":["../../src/lib/slugify.ts"],"names":[],"mappings":";;AAKA,0BASC;AAdD;;;;GAIG;AACH,SAAgB,OAAO,CAAC,IAAY;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACzE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,gDAAgD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.authenticatedSupabase = authenticatedSupabase;
|
|
4
|
+
const supabase_js_1 = require("@supabase/supabase-js");
|
|
5
|
+
const auth_1 = require("./auth");
|
|
6
|
+
/**
|
|
7
|
+
* Build a user-scoped Supabase client from the locally cached credentials.
|
|
8
|
+
*
|
|
9
|
+
* Uses `getActiveAccessToken()` so an expired token is transparently
|
|
10
|
+
* refreshed against Supabase Auth before the client is constructed.
|
|
11
|
+
*
|
|
12
|
+
* Throws if the user isn't logged in or if the credentials are missing the
|
|
13
|
+
* supabase_anon_key field (added in Plan 3 Task 3 — older `axgram login`
|
|
14
|
+
* sessions need to re-run login).
|
|
15
|
+
*/
|
|
16
|
+
async function authenticatedSupabase() {
|
|
17
|
+
const creds = await (0, auth_1.loadCredentials)();
|
|
18
|
+
if (!creds) {
|
|
19
|
+
throw new Error("Not logged in. Run `axgram login`.");
|
|
20
|
+
}
|
|
21
|
+
if (!creds.supabase_anon_key) {
|
|
22
|
+
throw new Error("Cached credentials are missing supabase_anon_key — re-run `axgram login`.");
|
|
23
|
+
}
|
|
24
|
+
const accessToken = await (0, auth_1.getActiveAccessToken)();
|
|
25
|
+
return (0, supabase_js_1.createClient)(creds.supabase_url, creds.supabase_anon_key, {
|
|
26
|
+
auth: {
|
|
27
|
+
autoRefreshToken: false,
|
|
28
|
+
persistSession: false,
|
|
29
|
+
},
|
|
30
|
+
global: {
|
|
31
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=supabase-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-client.js","sourceRoot":"","sources":["../../src/lib/supabase-client.ts"],"names":[],"mappings":";;AAaA,sDAoBC;AAjCD,uDAA0E;AAC1E,iCAA+D;AAE/D;;;;;;;;;GASG;AACI,KAAK,UAAU,qBAAqB;IACzC,MAAM,KAAK,GAAG,MAAM,IAAA,sBAAe,GAAE,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,IAAA,2BAAoB,GAAE,CAAC;IACjD,OAAO,IAAA,0BAAY,EAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,iBAAiB,EAAE;QAC/D,IAAI,EAAE;YACJ,gBAAgB,EAAE,KAAK;YACvB,cAAc,EAAE,KAAK;SACtB;QACD,MAAM,EAAE;YACN,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE;SACpD;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TOOL_VOCAB = void 0;
|
|
4
|
+
exports.isKnownTool = isKnownTool;
|
|
5
|
+
/**
|
|
6
|
+
* Small starter vocabulary of recognizable tool / framework names. The
|
|
7
|
+
* entity extractor uses this for the "tool" type-inference branch. Cased
|
|
8
|
+
* canonical forms — comparisons normalize input to lowercase before lookup.
|
|
9
|
+
*/
|
|
10
|
+
exports.TOOL_VOCAB = new Set([
|
|
11
|
+
"Postgres",
|
|
12
|
+
"PostgreSQL",
|
|
13
|
+
"MySQL",
|
|
14
|
+
"SQLite",
|
|
15
|
+
"Redis",
|
|
16
|
+
"Mongo",
|
|
17
|
+
"MongoDB",
|
|
18
|
+
"Supabase",
|
|
19
|
+
"PlanetScale",
|
|
20
|
+
"Neon",
|
|
21
|
+
"Cockroach",
|
|
22
|
+
"BigQuery",
|
|
23
|
+
"Snowflake",
|
|
24
|
+
"Kafka",
|
|
25
|
+
"RabbitMQ",
|
|
26
|
+
"ElasticSearch",
|
|
27
|
+
"Elasticsearch",
|
|
28
|
+
"React",
|
|
29
|
+
"Vue",
|
|
30
|
+
"Angular",
|
|
31
|
+
"Svelte",
|
|
32
|
+
"SolidJS",
|
|
33
|
+
"Solid",
|
|
34
|
+
"Astro",
|
|
35
|
+
"Next.js",
|
|
36
|
+
"Nuxt",
|
|
37
|
+
"Remix",
|
|
38
|
+
"Gatsby",
|
|
39
|
+
"Vite",
|
|
40
|
+
"Webpack",
|
|
41
|
+
"Rollup",
|
|
42
|
+
"Esbuild",
|
|
43
|
+
"Parcel",
|
|
44
|
+
"Babel",
|
|
45
|
+
"Node",
|
|
46
|
+
"Deno",
|
|
47
|
+
"Bun",
|
|
48
|
+
"TypeScript",
|
|
49
|
+
"JavaScript",
|
|
50
|
+
"Python",
|
|
51
|
+
"Ruby",
|
|
52
|
+
"Go",
|
|
53
|
+
"Rust",
|
|
54
|
+
"Java",
|
|
55
|
+
"Kotlin",
|
|
56
|
+
"Swift",
|
|
57
|
+
"C++",
|
|
58
|
+
"C#",
|
|
59
|
+
"PHP",
|
|
60
|
+
"Docker",
|
|
61
|
+
"Kubernetes",
|
|
62
|
+
"Terraform",
|
|
63
|
+
"Pulumi",
|
|
64
|
+
"Ansible",
|
|
65
|
+
"Helm",
|
|
66
|
+
"AWS",
|
|
67
|
+
"GCP",
|
|
68
|
+
"Azure",
|
|
69
|
+
"Cloudflare",
|
|
70
|
+
"Vercel",
|
|
71
|
+
"Netlify",
|
|
72
|
+
"Fly.io",
|
|
73
|
+
"Render",
|
|
74
|
+
"Railway",
|
|
75
|
+
"GitHub",
|
|
76
|
+
"GitLab",
|
|
77
|
+
"Bitbucket",
|
|
78
|
+
"Linear",
|
|
79
|
+
"Jira",
|
|
80
|
+
"Notion",
|
|
81
|
+
"Slack",
|
|
82
|
+
"Discord",
|
|
83
|
+
"Vitest",
|
|
84
|
+
"Jest",
|
|
85
|
+
"Mocha",
|
|
86
|
+
"Playwright",
|
|
87
|
+
"Cypress",
|
|
88
|
+
"Pytest",
|
|
89
|
+
"Hono",
|
|
90
|
+
"Express",
|
|
91
|
+
"Fastify",
|
|
92
|
+
"Koa",
|
|
93
|
+
"Django",
|
|
94
|
+
"Flask",
|
|
95
|
+
"FastAPI",
|
|
96
|
+
"Rails",
|
|
97
|
+
"Laravel",
|
|
98
|
+
"Spring",
|
|
99
|
+
"Tailwind",
|
|
100
|
+
"Bootstrap",
|
|
101
|
+
"shadcn",
|
|
102
|
+
"OpenAI",
|
|
103
|
+
"Anthropic",
|
|
104
|
+
"Claude",
|
|
105
|
+
"ChatGPT",
|
|
106
|
+
"GPT",
|
|
107
|
+
"Gemini",
|
|
108
|
+
"Llama",
|
|
109
|
+
"Mistral",
|
|
110
|
+
].map((s) => s.toLowerCase()));
|
|
111
|
+
function isKnownTool(name) {
|
|
112
|
+
return exports.TOOL_VOCAB.has(name.toLowerCase());
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=tool-vocab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-vocab.js","sourceRoot":"","sources":["../../src/lib/tool-vocab.ts"],"names":[],"mappings":";;;AAsHA,kCAEC;AAxHD;;;;GAIG;AACU,QAAA,UAAU,GAAG,IAAI,GAAG,CAC/B;IACE,UAAU;IACV,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,OAAO;IACP,OAAO;IACP,SAAS;IACT,UAAU;IACV,aAAa;IACb,MAAM;IACN,WAAW;IACX,UAAU;IACV,WAAW;IACX,OAAO;IACP,UAAU;IACV,eAAe;IACf,eAAe;IAEf,OAAO;IACP,KAAK;IACL,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,OAAO;IACP,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IAEP,MAAM;IACN,MAAM;IACN,KAAK;IACL,YAAY;IACZ,YAAY;IACZ,QAAQ;IACR,MAAM;IACN,IAAI;IACJ,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,KAAK;IACL,IAAI;IACJ,KAAK;IAEL,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,SAAS;IACT,MAAM;IAEN,KAAK;IACL,KAAK;IACL,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,SAAS;IAET,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,OAAO;IACP,SAAS;IAET,QAAQ;IACR,MAAM;IACN,OAAO;IACP,YAAY;IACZ,SAAS;IACT,QAAQ;IAER,MAAM;IACN,SAAS;IACT,SAAS;IACT,KAAK;IACL,QAAQ;IACR,OAAO;IACP,SAAS;IACT,OAAO;IACP,SAAS;IACT,QAAQ;IAER,UAAU;IACV,WAAW;IACX,QAAQ;IAER,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,SAAS;IACT,KAAK;IACL,QAAQ;IACR,OAAO;IACP,SAAS;CACV,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAC9B,CAAC;AAEF,SAAgB,WAAW,CAAC,IAAY;IACtC,OAAO,kBAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readTranscript = readTranscript;
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const FILED_AWAY_TOOL = "axgram_memories_filed_away";
|
|
6
|
+
/**
|
|
7
|
+
* Read a Claude Code transcript file (JSON-lines, one event per line) and
|
|
8
|
+
* return counters relevant to the auto-save hook.
|
|
9
|
+
*
|
|
10
|
+
* Tolerant parser: lines that aren't valid JSON are ignored. Two shapes
|
|
11
|
+
* are recognized:
|
|
12
|
+
* - {type: "user", ...} — counts as an exchange
|
|
13
|
+
* - {type: "tool_use", name: "..."} — resets the counter when name
|
|
14
|
+
* matches axgram_memories_filed_away
|
|
15
|
+
* - Nested message.content[] arrays with `tool_use` items also count.
|
|
16
|
+
*/
|
|
17
|
+
async function readTranscript(path) {
|
|
18
|
+
const raw = await (0, promises_1.readFile)(path, "utf8");
|
|
19
|
+
const lines = raw.split(/\r?\n/);
|
|
20
|
+
let exchangesSinceCheckpoint = 0;
|
|
21
|
+
let totalUserMessages = 0;
|
|
22
|
+
let filedAtLeastOnce = false;
|
|
23
|
+
for (const line of lines) {
|
|
24
|
+
if (!line.trim())
|
|
25
|
+
continue;
|
|
26
|
+
let event;
|
|
27
|
+
try {
|
|
28
|
+
event = JSON.parse(line);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const type = event.type;
|
|
34
|
+
if (type === "user") {
|
|
35
|
+
exchangesSinceCheckpoint++;
|
|
36
|
+
totalUserMessages++;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (containsFiledAwayCall(event)) {
|
|
40
|
+
exchangesSinceCheckpoint = 0;
|
|
41
|
+
filedAtLeastOnce = true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { exchangesSinceCheckpoint, totalUserMessages, filedAtLeastOnce };
|
|
45
|
+
}
|
|
46
|
+
function containsFiledAwayCall(event) {
|
|
47
|
+
if (!event || typeof event !== "object")
|
|
48
|
+
return false;
|
|
49
|
+
const e = event;
|
|
50
|
+
if (e.type === "tool_use" && e.name === FILED_AWAY_TOOL)
|
|
51
|
+
return true;
|
|
52
|
+
const message = e.message;
|
|
53
|
+
if (message) {
|
|
54
|
+
const content = message.content;
|
|
55
|
+
if (Array.isArray(content)) {
|
|
56
|
+
for (const c of content) {
|
|
57
|
+
if (c &&
|
|
58
|
+
typeof c === "object" &&
|
|
59
|
+
c.type === "tool_use" &&
|
|
60
|
+
c.name === FILED_AWAY_TOOL) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/lib/transcript.ts"],"names":[],"mappings":";;AA0BA,wCA6BC;AAvDD,+CAA4C;AAa5C,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAErD;;;;;;;;;;GAUG;AACI,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEjC,IAAI,wBAAwB,GAAG,CAAC,CAAC;IACjC,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAC;QAC/C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,wBAAwB,EAAE,CAAC;YAC3B,iBAAiB,EAAE,CAAC;YACpB,SAAS;QACX,CAAC;QACD,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,wBAAwB,GAAG,CAAC,CAAC;YAC7B,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IAErE,MAAM,OAAO,GAAG,CAAC,CAAC,OAA8C,CAAC;IACjE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IACE,CAAC;oBACD,OAAO,CAAC,KAAK,QAAQ;oBACpB,CAA6B,CAAC,IAAI,KAAK,UAAU;oBACjD,CAA6B,CAAC,IAAI,KAAK,eAAe,EACvD,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.walk = walk;
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const DEFAULT_IGNORES = [
|
|
7
|
+
".git",
|
|
8
|
+
"node_modules",
|
|
9
|
+
"dist",
|
|
10
|
+
"build",
|
|
11
|
+
".next",
|
|
12
|
+
"coverage",
|
|
13
|
+
".turbo",
|
|
14
|
+
".cache",
|
|
15
|
+
".vercel",
|
|
16
|
+
".wrangler",
|
|
17
|
+
];
|
|
18
|
+
const DEFAULT_MAX = 500_000;
|
|
19
|
+
async function* walk(root, opts = {}) {
|
|
20
|
+
const ignore = new Set(opts.ignore ?? DEFAULT_IGNORES);
|
|
21
|
+
const maxSize = opts.maxFileSize ?? DEFAULT_MAX;
|
|
22
|
+
const skipBinary = opts.skipBinary ?? true;
|
|
23
|
+
yield* walkInner(root, root, ignore, maxSize, skipBinary);
|
|
24
|
+
}
|
|
25
|
+
async function* walkInner(root, current, ignore, maxSize, skipBinary) {
|
|
26
|
+
let entries;
|
|
27
|
+
try {
|
|
28
|
+
entries = await (0, promises_1.readdir)(current, { withFileTypes: true });
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
34
|
+
for (const entry of entries) {
|
|
35
|
+
if (ignore.has(entry.name))
|
|
36
|
+
continue;
|
|
37
|
+
const full = (0, node_path_1.join)(current, entry.name);
|
|
38
|
+
if (entry.isDirectory()) {
|
|
39
|
+
yield* walkInner(root, full, ignore, maxSize, skipBinary);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (!entry.isFile())
|
|
43
|
+
continue;
|
|
44
|
+
let size;
|
|
45
|
+
try {
|
|
46
|
+
const s = await (0, promises_1.stat)(full);
|
|
47
|
+
size = s.size;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (size > maxSize)
|
|
53
|
+
continue;
|
|
54
|
+
if (skipBinary && (await isBinary(full, size)))
|
|
55
|
+
continue;
|
|
56
|
+
yield {
|
|
57
|
+
path: full,
|
|
58
|
+
relativePath: (0, node_path_1.relative)(root, full),
|
|
59
|
+
size,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function isBinary(path, size) {
|
|
64
|
+
if (size === 0)
|
|
65
|
+
return false;
|
|
66
|
+
const probeLen = Math.min(512, size);
|
|
67
|
+
let fh;
|
|
68
|
+
try {
|
|
69
|
+
fh = await (0, promises_1.open)(path, "r");
|
|
70
|
+
const buf = Buffer.allocUnsafe(probeLen);
|
|
71
|
+
await fh.read(buf, 0, probeLen, 0);
|
|
72
|
+
return buf.includes(0);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
await fh?.close();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=walker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walker.js","sourceRoot":"","sources":["../../src/lib/walker.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "axgram",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Axgram CLI — mine codebases, import conversation history, and run the auto-save hook for Claude Code.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/technonerdteam/axgram.git",
|
|
9
|
+
"directory": "cli"
|
|
10
|
+
},
|
|
11
|
+
"type": "commonjs",
|
|
12
|
+
"bin": {
|
|
13
|
+
"axgram": "dist/bin/axgram.js",
|
|
14
|
+
"axgram-hook": "dist/bin/axgram-hook.js"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"test:watch": "vitest",
|
|
20
|
+
"typecheck": "tsc --noEmit",
|
|
21
|
+
"clean": "rm -rf dist",
|
|
22
|
+
"prepublishOnly": "npm run clean && npm run typecheck && npm test && npm run build"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=20"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist",
|
|
29
|
+
"README.md"
|
|
30
|
+
],
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
33
|
+
"@supabase/supabase-js": "^2.45.0",
|
|
34
|
+
"chalk": "^4.1.2",
|
|
35
|
+
"chokidar": "^3.6.0",
|
|
36
|
+
"commander": "^12.1.0",
|
|
37
|
+
"gray-matter": "^4.0.3",
|
|
38
|
+
"open": "^8.4.2",
|
|
39
|
+
"ora": "^5.4.1"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^20.14.0",
|
|
43
|
+
"tsx": "^4.19.0",
|
|
44
|
+
"typescript": "^5.6.0",
|
|
45
|
+
"vitest": "^4.1.5"
|
|
46
|
+
}
|
|
47
|
+
}
|