vemora 0.1.0-alpha.15
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 +851 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +682 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ask.d.ts +14 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +137 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/audit.d.ts +17 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +398 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/brief.d.ts +16 -0
- package/dist/commands/brief.d.ts.map +1 -0
- package/dist/commands/brief.js +84 -0
- package/dist/commands/brief.js.map +1 -0
- package/dist/commands/chat.d.ts +7 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +155 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/context.d.ts +63 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +794 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/dead-code.d.ts +15 -0
- package/dist/commands/dead-code.d.ts.map +1 -0
- package/dist/commands/dead-code.js +206 -0
- package/dist/commands/dead-code.js.map +1 -0
- package/dist/commands/deps.d.ts +20 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +138 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/focus.d.ts +8 -0
- package/dist/commands/focus.d.ts.map +1 -0
- package/dist/commands/focus.js +310 -0
- package/dist/commands/focus.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +366 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init-agent.d.ts +23 -0
- package/dist/commands/init-agent.d.ts.map +1 -0
- package/dist/commands/init-agent.js +384 -0
- package/dist/commands/init-agent.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +122 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/knowledge.d.ts +14 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +115 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/plan.d.ts +24 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +867 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/query.d.ts +39 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +392 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/remember.d.ts +11 -0
- package/dist/commands/remember.d.ts.map +1 -0
- package/dist/commands/remember.js +267 -0
- package/dist/commands/remember.js.map +1 -0
- package/dist/commands/report.d.ts +10 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +243 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/summarize.d.ts +14 -0
- package/dist/commands/summarize.d.ts.map +1 -0
- package/dist/commands/summarize.js +170 -0
- package/dist/commands/summarize.js.map +1 -0
- package/dist/commands/triage.d.ts +33 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +419 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/usages.d.ts +14 -0
- package/dist/commands/usages.d.ts.map +1 -0
- package/dist/commands/usages.js +236 -0
- package/dist/commands/usages.js.map +1 -0
- package/dist/core/config.d.ts +35 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +159 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/types.d.ts +287 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/embeddings/factory.d.ts +9 -0
- package/dist/embeddings/factory.d.ts.map +1 -0
- package/dist/embeddings/factory.js +26 -0
- package/dist/embeddings/factory.js.map +1 -0
- package/dist/embeddings/noop.d.ts +17 -0
- package/dist/embeddings/noop.d.ts.map +1 -0
- package/dist/embeddings/noop.js +22 -0
- package/dist/embeddings/noop.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +11 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +49 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/openai.d.ts +10 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +67 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/provider.d.ts +19 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +3 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/indexer/callgraph.d.ts +16 -0
- package/dist/indexer/callgraph.d.ts.map +1 -0
- package/dist/indexer/callgraph.js +154 -0
- package/dist/indexer/callgraph.js.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts +6 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.js +30 -0
- package/dist/indexer/chunkBySlidingWindow.js.map +1 -0
- package/dist/indexer/chunkBySymbols.d.ts +7 -0
- package/dist/indexer/chunkBySymbols.d.ts.map +1 -0
- package/dist/indexer/chunkBySymbols.js +57 -0
- package/dist/indexer/chunkBySymbols.js.map +1 -0
- package/dist/indexer/chunker.d.ts +15 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +26 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/classHeader.d.ts +7 -0
- package/dist/indexer/classHeader.d.ts.map +1 -0
- package/dist/indexer/classHeader.js +37 -0
- package/dist/indexer/classHeader.js.map +1 -0
- package/dist/indexer/deps.d.ts +66 -0
- package/dist/indexer/deps.d.ts.map +1 -0
- package/dist/indexer/deps.js +412 -0
- package/dist/indexer/deps.js.map +1 -0
- package/dist/indexer/hasher.d.ts +17 -0
- package/dist/indexer/hasher.d.ts.map +1 -0
- package/dist/indexer/hasher.js +38 -0
- package/dist/indexer/hasher.js.map +1 -0
- package/dist/indexer/parser.d.ts +18 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +355 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/scanner.d.ts +18 -0
- package/dist/indexer/scanner.d.ts.map +1 -0
- package/dist/indexer/scanner.js +37 -0
- package/dist/indexer/scanner.js.map +1 -0
- package/dist/indexer/strategy.d.ts +11 -0
- package/dist/indexer/strategy.d.ts.map +1 -0
- package/dist/indexer/strategy.js +15 -0
- package/dist/indexer/strategy.js.map +1 -0
- package/dist/indexer/tests.d.ts +15 -0
- package/dist/indexer/tests.d.ts.map +1 -0
- package/dist/indexer/tests.js +68 -0
- package/dist/indexer/tests.js.map +1 -0
- package/dist/indexer/todos.d.ts +9 -0
- package/dist/indexer/todos.d.ts.map +1 -0
- package/dist/indexer/todos.js +29 -0
- package/dist/indexer/todos.js.map +1 -0
- package/dist/llm/anthropic.d.ts +8 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +76 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/claude-code.d.ts +37 -0
- package/dist/llm/claude-code.d.ts.map +1 -0
- package/dist/llm/claude-code.js +97 -0
- package/dist/llm/claude-code.js.map +1 -0
- package/dist/llm/factory.d.ts +7 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +47 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/ollama.d.ts +8 -0
- package/dist/llm/ollama.d.ts.map +1 -0
- package/dist/llm/ollama.js +83 -0
- package/dist/llm/ollama.js.map +1 -0
- package/dist/llm/openai.d.ts +8 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +68 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/provider.d.ts +35 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +3 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/search/bm25.d.ts +3 -0
- package/dist/search/bm25.d.ts.map +1 -0
- package/dist/search/bm25.js +104 -0
- package/dist/search/bm25.js.map +1 -0
- package/dist/search/formatter.d.ts +43 -0
- package/dist/search/formatter.d.ts.map +1 -0
- package/dist/search/formatter.js +208 -0
- package/dist/search/formatter.js.map +1 -0
- package/dist/search/hybrid.d.ts +10 -0
- package/dist/search/hybrid.d.ts.map +1 -0
- package/dist/search/hybrid.js +53 -0
- package/dist/search/hybrid.js.map +1 -0
- package/dist/search/merge.d.ts +33 -0
- package/dist/search/merge.d.ts.map +1 -0
- package/dist/search/merge.js +158 -0
- package/dist/search/merge.js.map +1 -0
- package/dist/search/mmr.d.ts +23 -0
- package/dist/search/mmr.d.ts.map +1 -0
- package/dist/search/mmr.js +95 -0
- package/dist/search/mmr.js.map +1 -0
- package/dist/search/rerank.d.ts +12 -0
- package/dist/search/rerank.d.ts.map +1 -0
- package/dist/search/rerank.js +113 -0
- package/dist/search/rerank.js.map +1 -0
- package/dist/search/signature.d.ts +42 -0
- package/dist/search/signature.d.ts.map +1 -0
- package/dist/search/signature.js +112 -0
- package/dist/search/signature.js.map +1 -0
- package/dist/search/vector.d.ts +41 -0
- package/dist/search/vector.d.ts.map +1 -0
- package/dist/search/vector.js +185 -0
- package/dist/search/vector.js.map +1 -0
- package/dist/storage/cache.d.ts +30 -0
- package/dist/storage/cache.d.ts.map +1 -0
- package/dist/storage/cache.js +160 -0
- package/dist/storage/cache.js.map +1 -0
- package/dist/storage/knowledge.d.ts +23 -0
- package/dist/storage/knowledge.d.ts.map +1 -0
- package/dist/storage/knowledge.js +81 -0
- package/dist/storage/knowledge.js.map +1 -0
- package/dist/storage/planSession.d.ts +39 -0
- package/dist/storage/planSession.d.ts.map +1 -0
- package/dist/storage/planSession.js +78 -0
- package/dist/storage/planSession.js.map +1 -0
- package/dist/storage/repository.d.ts +27 -0
- package/dist/storage/repository.d.ts.map +1 -0
- package/dist/storage/repository.js +95 -0
- package/dist/storage/repository.js.map +1 -0
- package/dist/storage/session.d.ts +38 -0
- package/dist/storage/session.d.ts.map +1 -0
- package/dist/storage/session.js +100 -0
- package/dist/storage/session.js.map +1 -0
- package/dist/storage/summaries.d.ts +19 -0
- package/dist/storage/summaries.d.ts.map +1 -0
- package/dist/storage/summaries.js +66 -0
- package/dist/storage/summaries.js.map +1 -0
- package/dist/storage/usage.d.ts +39 -0
- package/dist/storage/usage.d.ts.map +1 -0
- package/dist/storage/usage.js +55 -0
- package/dist/storage/usage.js.map +1 -0
- package/dist/utils/git.d.ts +20 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +49 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +32 -0
- package/dist/utils/tokenizer.d.ts.map +1 -0
- package/dist/utils/tokenizer.js +66 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.runRemember = runRemember;
|
|
40
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
41
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
42
|
+
const readline_1 = __importDefault(require("readline"));
|
|
43
|
+
const config_1 = require("../core/config");
|
|
44
|
+
const factory_1 = require("../llm/factory");
|
|
45
|
+
const knowledge_1 = require("../storage/knowledge");
|
|
46
|
+
const repository_1 = require("../storage/repository");
|
|
47
|
+
const VALID_CATEGORIES = ["decision", "pattern", "gotcha", "glossary"];
|
|
48
|
+
/**
|
|
49
|
+
* Uses the configured LLM to check whether `newBody` directly contradicts any
|
|
50
|
+
* of the candidate entries. Returns the contradicting entry or null.
|
|
51
|
+
* Only fires when candidates exist — no overhead on the common case.
|
|
52
|
+
*/
|
|
53
|
+
async function detectContradiction(newBody, candidates, config) {
|
|
54
|
+
const llmConfig = config.summarization ?? config.planner;
|
|
55
|
+
if (!llmConfig)
|
|
56
|
+
return null;
|
|
57
|
+
try {
|
|
58
|
+
const provider = (0, factory_1.createLLMProvider)(llmConfig);
|
|
59
|
+
const candidateList = candidates
|
|
60
|
+
.map((c, i) => `[${i + 1}] (${c.id.slice(0, 8)}) ${c.title}: ${c.body.slice(0, 200)}`)
|
|
61
|
+
.join("\n");
|
|
62
|
+
const resp = await provider.chat([
|
|
63
|
+
{
|
|
64
|
+
role: "system",
|
|
65
|
+
content: "You are a fact-checker for a software project knowledge base. " +
|
|
66
|
+
"Given a new note and a list of existing notes, determine if the new note " +
|
|
67
|
+
"DIRECTLY CONTRADICTS any existing note (i.e. they cannot both be true at the same time). " +
|
|
68
|
+
"An update or refinement to a fact is NOT a contradiction. " +
|
|
69
|
+
"Reply with ONLY the number of the contradicting entry (e.g. '2'), or '0' if there is no contradiction.",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
role: "user",
|
|
73
|
+
content: `New note: ${newBody}\n\nExisting notes:\n${candidateList}`,
|
|
74
|
+
},
|
|
75
|
+
], { maxTokens: 8, temperature: 0 });
|
|
76
|
+
const idx = parseInt(resp.content.trim(), 10);
|
|
77
|
+
if (isNaN(idx) || idx <= 0 || idx > candidates.length)
|
|
78
|
+
return null;
|
|
79
|
+
return candidates[idx - 1] ?? null;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Prompts the user interactively for how to handle a detected contradiction.
|
|
87
|
+
* Returns "supersede" | "keep" | "abort".
|
|
88
|
+
* Falls back to "keep" when not running in a TTY (CI / pipe).
|
|
89
|
+
*/
|
|
90
|
+
async function promptContradictionChoice(newBody, conflict) {
|
|
91
|
+
if (!process.stdin.isTTY)
|
|
92
|
+
return "keep";
|
|
93
|
+
console.warn();
|
|
94
|
+
console.warn(chalk_1.default.yellow(`⚠ Possible contradiction with existing entry [${conflict.id.slice(0, 8)}] "${conflict.title}"`));
|
|
95
|
+
console.warn(chalk_1.default.gray(` Existing: ${conflict.body.slice(0, 120)}${conflict.body.length > 120 ? "…" : ""}`));
|
|
96
|
+
console.warn(chalk_1.default.gray(` New: ${newBody.slice(0, 120)}${newBody.length > 120 ? "…" : ""}`));
|
|
97
|
+
console.warn();
|
|
98
|
+
console.warn(" Options:");
|
|
99
|
+
console.warn(` ${chalk_1.default.cyan("[s]")} invalidate existing + save new (recommended)`);
|
|
100
|
+
console.warn(` ${chalk_1.default.cyan("[k]")} keep both entries`);
|
|
101
|
+
console.warn(` ${chalk_1.default.cyan("[a]")} abort`);
|
|
102
|
+
console.warn();
|
|
103
|
+
return new Promise((resolve) => {
|
|
104
|
+
const rl = readline_1.default.createInterface({ input: process.stdin, output: process.stdout });
|
|
105
|
+
rl.question("Choice [s/k/a]: ", (answer) => {
|
|
106
|
+
rl.close();
|
|
107
|
+
const ch = answer.trim().toLowerCase();
|
|
108
|
+
if (ch === "s")
|
|
109
|
+
return resolve("supersede");
|
|
110
|
+
if (ch === "a")
|
|
111
|
+
return resolve("abort");
|
|
112
|
+
resolve("keep");
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Calls the configured LLM to classify a knowledge entry body into one of the
|
|
118
|
+
* four categories. Falls back to "pattern" if the LLM is unavailable or returns
|
|
119
|
+
* an unexpected value.
|
|
120
|
+
*/
|
|
121
|
+
async function classifyCategory(body, config) {
|
|
122
|
+
const llmConfig = config.summarization ?? config.planner;
|
|
123
|
+
if (!llmConfig)
|
|
124
|
+
return "pattern";
|
|
125
|
+
try {
|
|
126
|
+
const provider = (0, factory_1.createLLMProvider)(llmConfig);
|
|
127
|
+
const resp = await provider.chat([
|
|
128
|
+
{
|
|
129
|
+
role: "system",
|
|
130
|
+
content: "You are a classifier. Given a short knowledge note about a software project, " +
|
|
131
|
+
"reply with exactly one word — the best category for the note:\n" +
|
|
132
|
+
"- decision (an architectural or design choice and its rationale)\n" +
|
|
133
|
+
"- pattern (an approved implementation pattern or convention)\n" +
|
|
134
|
+
"- gotcha (a surprising behaviour, constraint, or known trap)\n" +
|
|
135
|
+
"- glossary (a definition or explanation of a term used in the project)\n" +
|
|
136
|
+
"Reply with only the single category word, nothing else.",
|
|
137
|
+
},
|
|
138
|
+
{ role: "user", content: body.slice(0, 500) },
|
|
139
|
+
]);
|
|
140
|
+
const word = resp.content.trim().toLowerCase();
|
|
141
|
+
return VALID_CATEGORIES.includes(word) ? word : "pattern";
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return "pattern";
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async function runRemember(rootDir, body, options = {}) {
|
|
148
|
+
const config = (0, config_1.loadConfig)(rootDir);
|
|
149
|
+
if (body.trim().length < 20) {
|
|
150
|
+
console.error(chalk_1.default.red("Error: knowledge entry must be at least 20 characters."));
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
const storage = new knowledge_1.KnowledgeStorage(rootDir);
|
|
154
|
+
const repo = new repository_1.RepositoryStorage(rootDir);
|
|
155
|
+
const fileIndex = repo.loadFiles();
|
|
156
|
+
const entries = storage.load();
|
|
157
|
+
const validEntries = (0, knowledge_1.filterValidAt)(entries);
|
|
158
|
+
// Token overlap pre-filter — collect candidates for contradiction check (>0.4)
|
|
159
|
+
// and warn on near-duplicates (>0.6)
|
|
160
|
+
const bodyTokens = new Set(body
|
|
161
|
+
.toLowerCase()
|
|
162
|
+
.split(/[\s\W]+/)
|
|
163
|
+
.filter((t) => t.length >= 3));
|
|
164
|
+
const candidates = [];
|
|
165
|
+
for (const e of validEntries) {
|
|
166
|
+
const eTokens = `${e.title} ${e.body}`
|
|
167
|
+
.toLowerCase()
|
|
168
|
+
.split(/[\s\W]+/)
|
|
169
|
+
.filter((t) => t.length >= 3);
|
|
170
|
+
const overlap = eTokens.filter((t) => bodyTokens.has(t)).length / Math.max(bodyTokens.size, 1);
|
|
171
|
+
if (overlap > 0.6) {
|
|
172
|
+
console.warn(chalk_1.default.yellow(`⚠ Similar entry already exists: [${e.id.slice(0, 8)}] "${e.title}"`));
|
|
173
|
+
console.warn(chalk_1.default.gray(" Use --supersedes <id> to replace it, or proceed to add a new entry."));
|
|
174
|
+
}
|
|
175
|
+
else if (overlap > 0.4) {
|
|
176
|
+
candidates.push(e);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Contradiction detection via LLM (only when candidates exist)
|
|
180
|
+
let supersedingId;
|
|
181
|
+
if (candidates.length > 0) {
|
|
182
|
+
const spinner = (await Promise.resolve().then(() => __importStar(require("ora")))).default("Checking for contradictions…").start();
|
|
183
|
+
const conflict = await detectContradiction(body, candidates, config);
|
|
184
|
+
spinner.stop();
|
|
185
|
+
if (conflict) {
|
|
186
|
+
const choice = await promptContradictionChoice(body, conflict);
|
|
187
|
+
if (choice === "abort") {
|
|
188
|
+
console.log(chalk_1.default.gray("Aborted — no entry saved."));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (choice === "supersede") {
|
|
192
|
+
storage.invalidate(conflict.id);
|
|
193
|
+
supersedingId = conflict.id;
|
|
194
|
+
console.log(chalk_1.default.gray(` Invalidated [${conflict.id.slice(0, 8)}] "${conflict.title}"`));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Derive title from body if not provided (first sentence, max 80 chars)
|
|
199
|
+
const title = options.title ??
|
|
200
|
+
body
|
|
201
|
+
.split(/[.!?\n]/)[0]
|
|
202
|
+
.trim()
|
|
203
|
+
.slice(0, 80);
|
|
204
|
+
// Auto-classify category via LLM when not explicitly provided
|
|
205
|
+
let category;
|
|
206
|
+
if (options.category) {
|
|
207
|
+
category = options.category;
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
const spinner = (await Promise.resolve().then(() => __importStar(require("ora")))).default("Classifying…").start();
|
|
211
|
+
try {
|
|
212
|
+
category = await classifyCategory(body, config);
|
|
213
|
+
spinner.stop();
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
spinner.stop();
|
|
217
|
+
category = "pattern";
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const entry = {
|
|
221
|
+
id: crypto_1.default.randomUUID(),
|
|
222
|
+
category,
|
|
223
|
+
title,
|
|
224
|
+
body: body.trim(),
|
|
225
|
+
relatedFiles: options.files
|
|
226
|
+
? options.files
|
|
227
|
+
.split(",")
|
|
228
|
+
.map((f) => f.trim())
|
|
229
|
+
.filter(Boolean)
|
|
230
|
+
: undefined,
|
|
231
|
+
relatedFileHashes: options.files
|
|
232
|
+
? Object.fromEntries(options.files
|
|
233
|
+
.split(",")
|
|
234
|
+
.map((f) => f.trim())
|
|
235
|
+
.filter(Boolean)
|
|
236
|
+
.flatMap((f) => {
|
|
237
|
+
const entry = fileIndex[f];
|
|
238
|
+
return entry?.hash ? [[f, entry.hash]] : [];
|
|
239
|
+
}))
|
|
240
|
+
: undefined,
|
|
241
|
+
relatedSymbols: options.symbols
|
|
242
|
+
? options.symbols
|
|
243
|
+
.split(",")
|
|
244
|
+
.map((s) => s.trim())
|
|
245
|
+
.filter(Boolean)
|
|
246
|
+
: undefined,
|
|
247
|
+
createdAt: new Date().toISOString(),
|
|
248
|
+
createdBy: options.createdBy ?? "human",
|
|
249
|
+
confidence: options.confidence ?? "medium",
|
|
250
|
+
supersedes: options.supersedes ?? supersedingId,
|
|
251
|
+
};
|
|
252
|
+
storage.add(entry);
|
|
253
|
+
console.log(chalk_1.default.green("✔ Knowledge entry saved."));
|
|
254
|
+
console.log(` ${chalk_1.default.gray("ID:")} ${entry.id}`);
|
|
255
|
+
console.log(` ${chalk_1.default.gray("Category:")} ${entry.category}`);
|
|
256
|
+
console.log(` ${chalk_1.default.gray("Title:")} ${entry.title}`);
|
|
257
|
+
if (entry.relatedFiles?.length) {
|
|
258
|
+
console.log(` ${chalk_1.default.gray("Files:")} ${entry.relatedFiles.join(", ")}`);
|
|
259
|
+
}
|
|
260
|
+
if (entry.relatedSymbols?.length) {
|
|
261
|
+
console.log(` ${chalk_1.default.gray("Symbols:")} ${entry.relatedSymbols.join(", ")}`);
|
|
262
|
+
}
|
|
263
|
+
if (entry.supersedes) {
|
|
264
|
+
console.log(` ${chalk_1.default.gray("Supersedes:")} ${entry.supersedes}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=remember.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remember.js","sourceRoot":"","sources":["../../src/commands/remember.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ReportOptions {
|
|
2
|
+
/** Limit report to events from the last N days (default: all) */
|
|
3
|
+
days?: number;
|
|
4
|
+
/** Show per-query breakdown instead of aggregate summary */
|
|
5
|
+
verbose?: boolean;
|
|
6
|
+
/** Clear all usage data */
|
|
7
|
+
clear?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function runReport(rootDir: string, options?: ReportOptions): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAyCD,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAuOf"}
|
|
@@ -0,0 +1,243 @@
|
|
|
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.runReport = runReport;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const config_1 = require("../core/config");
|
|
9
|
+
const usage_1 = require("../storage/usage");
|
|
10
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
11
|
+
function pct(n, total) {
|
|
12
|
+
return total === 0 ? " 0%" : `${Math.round((n / total) * 100).toString().padStart(3)}%`;
|
|
13
|
+
}
|
|
14
|
+
function fmt(n) {
|
|
15
|
+
return n.toLocaleString();
|
|
16
|
+
}
|
|
17
|
+
function bar(value, max, width = 20) {
|
|
18
|
+
const filled = max === 0 ? 0 : Math.round((value / max) * width);
|
|
19
|
+
return "█".repeat(filled) + "░".repeat(width - filled);
|
|
20
|
+
}
|
|
21
|
+
/** Top-N word tokens from query texts, excluding stopwords. */
|
|
22
|
+
function topTerms(events, n = 8) {
|
|
23
|
+
const STOP = new Set([
|
|
24
|
+
"a", "an", "the", "in", "on", "at", "to", "for", "of", "and", "or",
|
|
25
|
+
"how", "what", "why", "when", "where", "is", "are", "was", "does",
|
|
26
|
+
"do", "with", "from", "that", "this", "it", "be", "has", "have",
|
|
27
|
+
]);
|
|
28
|
+
const freq = new Map();
|
|
29
|
+
for (const e of events) {
|
|
30
|
+
if (!e.query)
|
|
31
|
+
continue;
|
|
32
|
+
const terms = e.query
|
|
33
|
+
.toLowerCase()
|
|
34
|
+
.split(/[\s\W]+/)
|
|
35
|
+
.filter((t) => t.length >= 3 && !STOP.has(t));
|
|
36
|
+
for (const t of terms)
|
|
37
|
+
freq.set(t, (freq.get(t) ?? 0) + 1);
|
|
38
|
+
}
|
|
39
|
+
return Array.from(freq.entries())
|
|
40
|
+
.sort((a, b) => b[1] - a[1])
|
|
41
|
+
.slice(0, n)
|
|
42
|
+
.map(([term, count]) => ({ term, count }));
|
|
43
|
+
}
|
|
44
|
+
// ─── Main ─────────────────────────────────────────────────────────────────────
|
|
45
|
+
async function runReport(rootDir, options = {}) {
|
|
46
|
+
const config = (0, config_1.loadConfig)(rootDir);
|
|
47
|
+
const storage = new usage_1.UsageStorage(config.projectId);
|
|
48
|
+
if (options.clear) {
|
|
49
|
+
storage.clear();
|
|
50
|
+
console.log(chalk_1.default.green("✓") + " Usage log cleared.");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
let events = storage.load();
|
|
54
|
+
if (events.length === 0) {
|
|
55
|
+
console.log(chalk_1.default.yellow("No usage data yet.") +
|
|
56
|
+
" Run some queries with `vemora query` or `vemora context`.");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// ── Date filter ───────────────────────────────────────────────────────────
|
|
60
|
+
if (options.days && options.days > 0) {
|
|
61
|
+
const cutoff = Date.now() - options.days * 24 * 60 * 60 * 1000;
|
|
62
|
+
events = events.filter((e) => new Date(e.ts).getTime() >= cutoff);
|
|
63
|
+
if (events.length === 0) {
|
|
64
|
+
console.log(chalk_1.default.yellow(`No usage data in the last ${options.days} days.`));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const total = events.length;
|
|
69
|
+
const firstTs = events[0].ts.slice(0, 10);
|
|
70
|
+
const lastTs = events[events.length - 1].ts.slice(0, 10);
|
|
71
|
+
// ── Aggregates ────────────────────────────────────────────────────────────
|
|
72
|
+
const byCommand = { query: 0, context: 0, ask: 0 };
|
|
73
|
+
const bySearch = {};
|
|
74
|
+
let totalTokensReturned = 0;
|
|
75
|
+
let totalSavedDedup = 0;
|
|
76
|
+
let totalSavedSession = 0;
|
|
77
|
+
let totalSavedBudget = 0;
|
|
78
|
+
let queriesWithDedup = 0;
|
|
79
|
+
let queriesWithSession = 0;
|
|
80
|
+
let queriesWithBudget = 0;
|
|
81
|
+
let totalResults = 0;
|
|
82
|
+
for (const e of events) {
|
|
83
|
+
byCommand[e.command] = (byCommand[e.command] ?? 0) + 1;
|
|
84
|
+
bySearch[e.searchType] = (bySearch[e.searchType] ?? 0) + 1;
|
|
85
|
+
totalTokensReturned += e.tokensReturned;
|
|
86
|
+
totalSavedDedup += e.tokensSavedDedup;
|
|
87
|
+
totalSavedSession += e.tokensSavedSession;
|
|
88
|
+
totalSavedBudget += e.tokensSavedBudget;
|
|
89
|
+
if (e.tokensSavedDedup > 0)
|
|
90
|
+
queriesWithDedup++;
|
|
91
|
+
if (e.tokensSavedSession > 0)
|
|
92
|
+
queriesWithSession++;
|
|
93
|
+
if (e.tokensSavedBudget > 0)
|
|
94
|
+
queriesWithBudget++;
|
|
95
|
+
totalResults += e.resultsReturned;
|
|
96
|
+
}
|
|
97
|
+
const totalSaved = totalSavedDedup + totalSavedSession + totalSavedBudget;
|
|
98
|
+
const totalWouldHaveSent = totalTokensReturned + totalSaved;
|
|
99
|
+
const savingsPct = totalWouldHaveSent === 0 ? 0 : Math.round((totalSaved / totalWouldHaveSent) * 100);
|
|
100
|
+
const avgTokens = Math.round(totalTokensReturned / total);
|
|
101
|
+
const avgResults = (totalResults / total).toFixed(1);
|
|
102
|
+
// ── Header ────────────────────────────────────────────────────────────────
|
|
103
|
+
console.log();
|
|
104
|
+
console.log(chalk_1.default.bold("vemora usage report"));
|
|
105
|
+
if (options.days) {
|
|
106
|
+
console.log(chalk_1.default.gray(` Last ${options.days} days · ${total} queries`));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
console.log(chalk_1.default.gray(` ${firstTs} → ${lastTs} · ${total} queries`));
|
|
110
|
+
}
|
|
111
|
+
console.log();
|
|
112
|
+
// ── Commands ──────────────────────────────────────────────────────────────
|
|
113
|
+
console.log(chalk_1.default.bold("Commands"));
|
|
114
|
+
const maxCmd = Math.max(...Object.values(byCommand));
|
|
115
|
+
for (const [cmd, count] of Object.entries(byCommand)) {
|
|
116
|
+
if (count === 0)
|
|
117
|
+
continue;
|
|
118
|
+
console.log(` ${chalk_1.default.cyan(cmd.padEnd(9))} ${bar(count, maxCmd, 16)} ${fmt(count).padStart(5)} ${pct(count, total)}`);
|
|
119
|
+
}
|
|
120
|
+
console.log();
|
|
121
|
+
// ── Search method ─────────────────────────────────────────────────────────
|
|
122
|
+
console.log(chalk_1.default.bold("Search method"));
|
|
123
|
+
const maxSearch = Math.max(...Object.values(bySearch));
|
|
124
|
+
for (const [type, count] of Object.entries(bySearch).sort((a, b) => b[1] - a[1])) {
|
|
125
|
+
console.log(` ${chalk_1.default.cyan(type.padEnd(9))} ${bar(count, maxSearch, 16)} ${fmt(count).padStart(5)} ${pct(count, total)}`);
|
|
126
|
+
}
|
|
127
|
+
console.log();
|
|
128
|
+
// ── Results & tokens ──────────────────────────────────────────────────────
|
|
129
|
+
console.log(chalk_1.default.bold("Results & tokens"));
|
|
130
|
+
console.log(` Avg results returned ${chalk_1.default.white(avgResults)} chunks per query`);
|
|
131
|
+
console.log(` Avg tokens returned ${chalk_1.default.white(fmt(avgTokens))} tokens per query`);
|
|
132
|
+
console.log(` Total tokens served ${chalk_1.default.white(fmt(totalTokensReturned))}`);
|
|
133
|
+
console.log();
|
|
134
|
+
// ── Token savings ─────────────────────────────────────────────────────────
|
|
135
|
+
console.log(chalk_1.default.bold("Token savings estimate"));
|
|
136
|
+
if (totalSaved === 0) {
|
|
137
|
+
console.log(chalk_1.default.gray(" No savings recorded yet (dedup, session filter, and budget all inactive)."));
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
const row = (label, saved, queries) => {
|
|
141
|
+
const avg = queries === 0 ? 0 : Math.round(saved / queries);
|
|
142
|
+
console.log(` ${label.padEnd(22)} ${chalk_1.default.green(fmt(saved).padStart(8))} tokens` +
|
|
143
|
+
(queries > 0
|
|
144
|
+
? chalk_1.default.gray(` (${queries} queries, ~${fmt(avg)}/query)`)
|
|
145
|
+
: ""));
|
|
146
|
+
};
|
|
147
|
+
row("Semantic dedup", totalSavedDedup, queriesWithDedup);
|
|
148
|
+
row("Session filter", totalSavedSession, queriesWithSession);
|
|
149
|
+
row("Budget cap", totalSavedBudget, queriesWithBudget);
|
|
150
|
+
console.log(" " + "─".repeat(50));
|
|
151
|
+
console.log(` ${"Total saved".padEnd(22)} ${chalk_1.default.bold.green(fmt(totalSaved).padStart(8))} tokens ` +
|
|
152
|
+
chalk_1.default.gray(`(${savingsPct}% of what would have been sent)`));
|
|
153
|
+
}
|
|
154
|
+
console.log();
|
|
155
|
+
// ── Top query terms ───────────────────────────────────────────────────────
|
|
156
|
+
const terms = topTerms(events);
|
|
157
|
+
if (terms.length > 0) {
|
|
158
|
+
console.log(chalk_1.default.bold("Most frequent query terms"));
|
|
159
|
+
const maxTermCount = terms[0].count;
|
|
160
|
+
for (const { term, count } of terms) {
|
|
161
|
+
console.log(` ${chalk_1.default.cyan(term.padEnd(20))} ${bar(count, maxTermCount, 16)} ${count}×`);
|
|
162
|
+
}
|
|
163
|
+
console.log();
|
|
164
|
+
}
|
|
165
|
+
// ── Latency ───────────────────────────────────────────────────────────────
|
|
166
|
+
const timed = events.filter((e) => e.durationMs != null);
|
|
167
|
+
if (timed.length > 0) {
|
|
168
|
+
const durations = timed.map((e) => e.durationMs).sort((a, b) => a - b);
|
|
169
|
+
const avgMs = Math.round(durations.reduce((s, v) => s + v, 0) / durations.length);
|
|
170
|
+
const p95Ms = durations[Math.floor(durations.length * 0.95)];
|
|
171
|
+
console.log(chalk_1.default.bold("Query latency"));
|
|
172
|
+
console.log(` Avg ${chalk_1.default.white(`${avgMs} ms`)}`);
|
|
173
|
+
console.log(` p95 ${chalk_1.default.white(`${p95Ms} ms`)}`);
|
|
174
|
+
console.log();
|
|
175
|
+
}
|
|
176
|
+
// ── Hot files ─────────────────────────────────────────────────────────────
|
|
177
|
+
const fileFreq = new Map();
|
|
178
|
+
for (const e of events) {
|
|
179
|
+
for (const f of e.topFiles ?? []) {
|
|
180
|
+
fileFreq.set(f, (fileFreq.get(f) ?? 0) + 1);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (fileFreq.size > 0) {
|
|
184
|
+
const hotFiles = Array.from(fileFreq.entries())
|
|
185
|
+
.sort((a, b) => b[1] - a[1])
|
|
186
|
+
.slice(0, 8);
|
|
187
|
+
const maxFileCount = hotFiles[0][1];
|
|
188
|
+
console.log(chalk_1.default.bold("Most retrieved files"));
|
|
189
|
+
for (const [file, count] of hotFiles) {
|
|
190
|
+
console.log(` ${chalk_1.default.cyan(file.padEnd(40))} ${bar(count, maxFileCount, 12)} ${count}×`);
|
|
191
|
+
}
|
|
192
|
+
console.log();
|
|
193
|
+
}
|
|
194
|
+
// ── Low-signal queries ────────────────────────────────────────────────────
|
|
195
|
+
const zeroResults = events.filter((e) => e.resultsReturned === 0 && e.query);
|
|
196
|
+
const lowResults = events.filter((e) => e.resultsReturned > 0 && e.resultsReturned < 3 && e.query);
|
|
197
|
+
if (zeroResults.length > 0) {
|
|
198
|
+
console.log(chalk_1.default.bold(`Queries with no results`) + chalk_1.default.red(` (${zeroResults.length})`));
|
|
199
|
+
for (const e of zeroResults.slice(-8).reverse()) {
|
|
200
|
+
console.log(` ${chalk_1.default.gray(e.ts.slice(0, 10))} ${chalk_1.default.red("✗")} ${chalk_1.default.white(e.query)}`);
|
|
201
|
+
}
|
|
202
|
+
console.log();
|
|
203
|
+
}
|
|
204
|
+
if (lowResults.length > 0) {
|
|
205
|
+
console.log(chalk_1.default.bold(`Queries with few results`) + chalk_1.default.yellow(` (${lowResults.length})`));
|
|
206
|
+
for (const e of lowResults.slice(-8).reverse()) {
|
|
207
|
+
console.log(` ${chalk_1.default.gray(e.ts.slice(0, 10))} ${chalk_1.default.yellow(`${e.resultsReturned} chunk${e.resultsReturned === 1 ? "" : "s"}`)} ${chalk_1.default.white(e.query)}`);
|
|
208
|
+
}
|
|
209
|
+
console.log();
|
|
210
|
+
}
|
|
211
|
+
// ── Repeated queries ──────────────────────────────────────────────────────
|
|
212
|
+
const queryFreq = new Map();
|
|
213
|
+
for (const e of events) {
|
|
214
|
+
if (e.query)
|
|
215
|
+
queryFreq.set(e.query, (queryFreq.get(e.query) ?? 0) + 1);
|
|
216
|
+
}
|
|
217
|
+
const repeated = Array.from(queryFreq.entries())
|
|
218
|
+
.filter(([, n]) => n > 1)
|
|
219
|
+
.sort((a, b) => b[1] - a[1])
|
|
220
|
+
.slice(0, 6);
|
|
221
|
+
if (repeated.length > 0) {
|
|
222
|
+
console.log(chalk_1.default.bold("Repeated queries") + chalk_1.default.gray(" (possible index gaps)"));
|
|
223
|
+
for (const [query, count] of repeated) {
|
|
224
|
+
console.log(` ${chalk_1.default.yellow(`${count}×`).padEnd(6)} ${chalk_1.default.white(query)}`);
|
|
225
|
+
}
|
|
226
|
+
console.log();
|
|
227
|
+
}
|
|
228
|
+
// ── Verbose: per-query log ─────────────────────────────────────────────────
|
|
229
|
+
if (options.verbose) {
|
|
230
|
+
console.log(chalk_1.default.bold("Recent queries (last 20)"));
|
|
231
|
+
console.log();
|
|
232
|
+
const recent = events.slice(-20).reverse();
|
|
233
|
+
for (const e of recent) {
|
|
234
|
+
const saved = e.tokensSavedDedup + e.tokensSavedSession + e.tokensSavedBudget;
|
|
235
|
+
const savedStr = saved > 0 ? chalk_1.default.green(` −${fmt(saved)}tok`) : "";
|
|
236
|
+
console.log(` ${chalk_1.default.gray(e.ts.slice(0, 16))} ${chalk_1.default.cyan(e.command.padEnd(8))} ` +
|
|
237
|
+
`${chalk_1.default.white(fmt(e.tokensReturned).padStart(5))}tok${savedStr} ` +
|
|
238
|
+
chalk_1.default.gray(e.query ?? "(no query)"));
|
|
239
|
+
}
|
|
240
|
+
console.log();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AASA,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkI9D"}
|