@yhong91/vibetime 0.1.7 → 0.1.9
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/bin/vibetime.mjs +89 -16
- package/package.json +1 -1
package/bin/vibetime.mjs
CHANGED
|
@@ -1195,7 +1195,7 @@ function countTextLines(text) {
|
|
|
1195
1195
|
}
|
|
1196
1196
|
|
|
1197
1197
|
// src/lib/constants.ts
|
|
1198
|
-
var PACKAGE_VERSION = true ? "0.1.
|
|
1198
|
+
var PACKAGE_VERSION = true ? "0.1.9" : "0.1.1";
|
|
1199
1199
|
var DEFAULT_API_URL = "http://121.196.224.82:3001";
|
|
1200
1200
|
var DEFAULT_BACKFILL_BATCH_SIZE = 50;
|
|
1201
1201
|
var DEFAULT_BACKFILL_BATCH_BYTES = 800 * 1024;
|
|
@@ -1680,6 +1680,27 @@ function resolveModelName(text) {
|
|
|
1680
1680
|
}
|
|
1681
1681
|
return null;
|
|
1682
1682
|
}
|
|
1683
|
+
var AGY_USAGE_TIME_MATCH_TOLERANCE_MS = 5 * 60 * 1e3;
|
|
1684
|
+
function usageMetadataFromGenerator(item) {
|
|
1685
|
+
const usage = item.chatModel?.usage;
|
|
1686
|
+
if (!usage) {
|
|
1687
|
+
return null;
|
|
1688
|
+
}
|
|
1689
|
+
const chatModel = item.chatModel;
|
|
1690
|
+
const modelCandidates = [
|
|
1691
|
+
chatModel.modelDisplayName,
|
|
1692
|
+
chatModel.responseModel,
|
|
1693
|
+
usage.model,
|
|
1694
|
+
chatModel.model
|
|
1695
|
+
];
|
|
1696
|
+
const model = modelCandidates.filter((candidate) => typeof candidate === "string" && !candidate.startsWith("MODEL_PLACEHOLDER_")).map(resolveModelName).find(Boolean) ?? null;
|
|
1697
|
+
const occurredAt = Date.parse(chatModel.chatStartMetadata?.createdAt ?? "");
|
|
1698
|
+
return {
|
|
1699
|
+
usage,
|
|
1700
|
+
model,
|
|
1701
|
+
occurredAt: Number.isFinite(occurredAt) ? occurredAt : null
|
|
1702
|
+
};
|
|
1703
|
+
}
|
|
1683
1704
|
function extractProjectContext(rawLines) {
|
|
1684
1705
|
let cwd;
|
|
1685
1706
|
let project;
|
|
@@ -1774,32 +1795,55 @@ async function parseAgySessionFile(filePath, options) {
|
|
|
1774
1795
|
}
|
|
1775
1796
|
const usageMap = /* @__PURE__ */ new Map();
|
|
1776
1797
|
const usageEntries = [];
|
|
1798
|
+
const matchedUsageEntries = /* @__PURE__ */ new Set();
|
|
1777
1799
|
if (generatorMetadata) {
|
|
1778
1800
|
for (const item of generatorMetadata) {
|
|
1779
|
-
const
|
|
1780
|
-
if (
|
|
1781
|
-
usageEntries.push(
|
|
1801
|
+
const metadata = usageMetadataFromGenerator(item);
|
|
1802
|
+
if (metadata) {
|
|
1803
|
+
usageEntries.push(metadata);
|
|
1782
1804
|
}
|
|
1783
|
-
if (item.stepIndices && Array.isArray(item.stepIndices)) {
|
|
1805
|
+
if (metadata && item.stepIndices && Array.isArray(item.stepIndices)) {
|
|
1784
1806
|
for (const idx of item.stepIndices) {
|
|
1785
|
-
usageMap.set(idx,
|
|
1807
|
+
usageMap.set(idx, metadata);
|
|
1786
1808
|
}
|
|
1787
1809
|
}
|
|
1788
1810
|
}
|
|
1789
1811
|
const plannerResponses = rawEvents.filter((raw) => raw.type === "PLANNER_RESPONSE");
|
|
1790
|
-
const
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
const
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1812
|
+
const available = usageEntries.filter((entry) => entry.occurredAt !== null);
|
|
1813
|
+
const used = /* @__PURE__ */ new Set();
|
|
1814
|
+
for (const planner of plannerResponses) {
|
|
1815
|
+
const exact = usageMap.get(planner.step_index);
|
|
1816
|
+
if (exact) {
|
|
1817
|
+
used.add(exact);
|
|
1818
|
+
matchedUsageEntries.add(exact);
|
|
1819
|
+
continue;
|
|
1820
|
+
}
|
|
1821
|
+
const plannerAt = Date.parse(planner.created_at ?? planner.timestamp ?? "");
|
|
1822
|
+
if (!Number.isFinite(plannerAt)) {
|
|
1823
|
+
continue;
|
|
1824
|
+
}
|
|
1825
|
+
let closest;
|
|
1826
|
+
let closestDelta = Number.POSITIVE_INFINITY;
|
|
1827
|
+
for (const entry of available) {
|
|
1828
|
+
if (used.has(entry) || entry.occurredAt === null) {
|
|
1829
|
+
continue;
|
|
1830
|
+
}
|
|
1831
|
+
const delta = Math.abs(entry.occurredAt - plannerAt);
|
|
1832
|
+
if (delta < closestDelta) {
|
|
1833
|
+
closest = entry;
|
|
1834
|
+
closestDelta = delta;
|
|
1835
|
+
}
|
|
1836
|
+
}
|
|
1837
|
+
if (closest && closestDelta <= AGY_USAGE_TIME_MATCH_TOLERANCE_MS) {
|
|
1838
|
+
usageMap.set(planner.step_index, closest);
|
|
1839
|
+
used.add(closest);
|
|
1840
|
+
matchedUsageEntries.add(closest);
|
|
1797
1841
|
}
|
|
1798
1842
|
}
|
|
1799
1843
|
}
|
|
1800
1844
|
const cwd = detectedCwd;
|
|
1801
1845
|
const project = detectedProject;
|
|
1802
|
-
let model = "
|
|
1846
|
+
let model = "unknown";
|
|
1803
1847
|
const baseAgyEvent = (event) => {
|
|
1804
1848
|
return {
|
|
1805
1849
|
schemaVersion: AGENT_TIME_SCHEMA_VERSION,
|
|
@@ -1851,8 +1895,10 @@ async function parseAgySessionFile(filePath, options) {
|
|
|
1851
1895
|
}), lineNumber, raw.type);
|
|
1852
1896
|
} else if (raw.type === "PLANNER_RESPONSE") {
|
|
1853
1897
|
const content = stringField(raw, "content") || "";
|
|
1854
|
-
const
|
|
1855
|
-
if (
|
|
1898
|
+
const usageMetadata = usageMap.get(raw.step_index);
|
|
1899
|
+
if (usageMetadata) {
|
|
1900
|
+
matchedUsageEntries.add(usageMetadata);
|
|
1901
|
+
const usage = usageMetadata.usage;
|
|
1856
1902
|
const inputTokens = Number.parseInt(usage.inputTokens, 10) || 0;
|
|
1857
1903
|
const outputTokens = Number.parseInt(usage.outputTokens, 10) || 0;
|
|
1858
1904
|
const cacheRead = Number.parseInt(usage.cacheReadTokens, 10) || 0;
|
|
@@ -1862,6 +1908,7 @@ async function parseAgySessionFile(filePath, options) {
|
|
|
1862
1908
|
type: "model.usage",
|
|
1863
1909
|
sessionId,
|
|
1864
1910
|
turnId: state.currentTurnId,
|
|
1911
|
+
model: usageMetadata.model ?? model,
|
|
1865
1912
|
confidence: "exact",
|
|
1866
1913
|
metrics: {
|
|
1867
1914
|
modelCalls: 1,
|
|
@@ -2011,6 +2058,32 @@ async function parseAgySessionFile(filePath, options) {
|
|
|
2011
2058
|
}
|
|
2012
2059
|
}
|
|
2013
2060
|
}
|
|
2061
|
+
for (const [index, usageMetadata] of usageEntries.entries()) {
|
|
2062
|
+
if (matchedUsageEntries.has(usageMetadata) || usageMetadata.occurredAt === null) {
|
|
2063
|
+
continue;
|
|
2064
|
+
}
|
|
2065
|
+
const usage = usageMetadata.usage;
|
|
2066
|
+
const inputTokens = Number.parseInt(usage.inputTokens, 10) || 0;
|
|
2067
|
+
const outputTokens = Number.parseInt(usage.outputTokens, 10) || 0;
|
|
2068
|
+
const cacheRead = Number.parseInt(usage.cacheReadTokens, 10) || 0;
|
|
2069
|
+
const reasoning = Number.parseInt(usage.thinkingOutputTokens, 10) || 0;
|
|
2070
|
+
state.push(baseAgyEvent({
|
|
2071
|
+
ts: new Date(usageMetadata.occurredAt).toISOString(),
|
|
2072
|
+
type: "model.usage",
|
|
2073
|
+
sessionId,
|
|
2074
|
+
model: usageMetadata.model ?? "unknown",
|
|
2075
|
+
confidence: "exact",
|
|
2076
|
+
metrics: {
|
|
2077
|
+
modelCalls: 1,
|
|
2078
|
+
tokensInput: inputTokens + cacheRead,
|
|
2079
|
+
tokensOutput: outputTokens,
|
|
2080
|
+
tokensTotal: inputTokens + cacheRead + outputTokens,
|
|
2081
|
+
tokensCachedInput: cacheRead || void 0,
|
|
2082
|
+
tokensCacheReadInput: cacheRead || void 0,
|
|
2083
|
+
tokensReasoningOutput: reasoning || void 0
|
|
2084
|
+
}
|
|
2085
|
+
}), rawEvents.length + index + 1, "trajectory_metadata");
|
|
2086
|
+
}
|
|
2014
2087
|
if (state.currentTurnLastEventAt) {
|
|
2015
2088
|
state.closeTurn(state.currentTurnLastEventAt, rawEvents.length, "session_end");
|
|
2016
2089
|
}
|
package/package.json
CHANGED