agmon 0.2.1 → 0.2.2
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +8 -8
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +16 -15
- package/.next/server/app/_not-found.segments/_full.segment.rsc +16 -15
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +8 -7
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/media/route.js.nft.json +1 -1
- package/.next/server/app/api/reports/tokens/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/transcript/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/transcript/route.js.nft.json +1 -1
- package/.next/server/app/api/traces/stream/route.js +1 -1
- package/.next/server/app/api/traces/stream/route.js.nft.json +1 -1
- package/.next/server/app/api/version/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/file-content/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/files/route.js.nft.json +1 -1
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +4 -4
- package/.next/server/app/chat.segments/_full.segment.rsc +4 -4
- package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +6 -5
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +5 -5
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/reports/page.js.nft.json +1 -1
- package/.next/server/app/reports/page_client-reference-manifest.js +1 -1
- package/.next/server/app/reports.html +1 -1
- package/.next/server/app/reports.rsc +2 -2
- package/.next/server/app/reports.segments/_full.segment.rsc +2 -2
- package/.next/server/app/reports.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/reports.segments/reports/__PAGE__.segment.rsc +4 -3
- package/.next/server/app/store/page.js.nft.json +1 -1
- package/.next/server/app/store/page_client-reference-manifest.js +1 -1
- package/.next/server/app/store.html +1 -1
- package/.next/server/app/store.rsc +2 -2
- package/.next/server/app/store.segments/_full.segment.rsc +2 -2
- package/.next/server/app/store.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/store.segments/store/__PAGE__.segment.rsc +4 -3
- package/.next/server/chunks/[root-of-the-server]__0dw97_pahi8uf._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0dw97_pahi8uf._.js.map +1 -0
- package/.next/server/chunks/_0ao-_t4jkb46h._.js +2 -2
- package/.next/server/chunks/_0ao-_t4jkb46h._.js.map +1 -1
- package/.next/server/chunks/_1-8ipqazoyrrk._.js +1 -1
- package/.next/server/chunks/_1-8ipqazoyrrk._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1jwplflwix8wi._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1jwplflwix8wi._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1kt7h7bz59mdn._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1kt7h7bz59mdn._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1otsvjy81s8my._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1otsvjy81s8my._.js.map +1 -1
- package/.next/server/chunks/ssr/{_0--937zhi743v._.js → _0zel-n0h--cnl._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0jla9ugf1y6rb._.js → node_modules_01avo0bde3tpo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0sjdrli5douui._.js → node_modules_01l0208e5kqic._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0lqovp8j8ld76._.js → node_modules_033x29yqle_sj._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_05i69rc9pwcdx._.js → node_modules_03wbg__aslvui._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1ltys5mwtcv-n._.js → node_modules_08-bqkrz7sh0l._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_09v49jhajmvl4._.js → node_modules_089w9jm7s2qa3._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0z1e37smavebg._.js → node_modules_0cy47-s63xjzh._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0dw0vozejrnml._.js → node_modules_0czh0jcnsm5e6._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0e3njj436xau-._.js → node_modules_0fv321j1nslkb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0d2ios01ot1in._.js → node_modules_0g-wb7h-hsdwc._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1l46or7mgko0z._.js → node_modules_0oz_zzlh8exwx._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0b8zi3pbl-y9n._.js → node_modules_0so2agzqd9p8l._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_1wew4nn7i1uup._.js → node_modules_0w2w61b8bh769._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_07bjxeq9dfgn1._.js → node_modules_0wd6szix_zku7._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_1aqaelh-8fme6._.js → node_modules_0wp7omf0xblv8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0xh8tnq1niblb._.js → node_modules_10c51o2qv6mbi._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1d4sreyq0ubqg._.js → node_modules_19vqq7rvf-_ar._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_1e_nc2eyg4djz._.js → node_modules_1hu83gui7_nj2._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1zbmc81s-4zsm._.js → node_modules_1j8hpoiygrs5e._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1pquu5wprusnc._.js → node_modules_1n4kig4mj6n4s._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_1st9dwe66yx93._.js → node_modules_1s8oxeqa5_i3k._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_01p9ctt-n2dxp._.js → node_modules_1xz1dstlo5ri-._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0kqo9zl9cgwbo._.js → node_modules_katex_dist_katex_mjs_067omoj5szuys._.js} +1 -1
- package/.next/server/chunks/ssr/src_app_page_1vqfk0-j72fp6.js +1 -1
- package/.next/server/chunks/ssr/src_app_page_1vqfk0-j72fp6.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/preview-props.json +3 -3
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/0jo6fy2c_gmqn.js +1 -0
- package/.next/static/chunks/2q9cwykv6ox1t.css +1 -0
- package/.next/static/chunks/{3og0e9qcff393.js → 2zf44j8sjo0w0.js} +4 -4
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/package.json +1 -1
- package/src/app/api/traces/stream/route.js +41 -5
- package/src/app/layout.js +2 -1
- package/src/app/page.js +17 -1
- package/src/components/chat/SessionChatView.js +1 -1
- package/src/components/factory/office-canvas.js +32 -1
- package/src/components/layout/BottomPanel.jsx +6 -6
- package/src/components/layout/LeftSidebar.jsx +62 -4
- package/src/components/layout/StatusBar.jsx +1 -1
- package/src/components/layout/TitleBar.jsx +71 -1
- package/src/components/layout/VSCodeWorkbench.jsx +21 -0
- package/src/lib/mockTraces.js +13 -11
- package/src/lib/parsers/codexParser.js +373 -0
- package/src/lib/parsers/transcriptParser.js +35 -3
- package/src/lib/useFactoryTraces.js +70 -5
- package/src/lib/watchers/antigravityWatcher.js +15 -1
- package/src/lib/watchers/claudeWatcher.js +64 -53
- package/src/lib/watchers/codexWatcher.js +482 -0
- package/src/lib/watchers/watcherManager.js +46 -30
- package/.next/server/chunks/src_lib_watchers_antigravityWatcher_0w1-atg39y__p.js +0 -3
- package/.next/server/chunks/src_lib_watchers_antigravityWatcher_0w1-atg39y__p.js.map +0 -1
- package/.next/static/chunks/17jorrh_pfel_.js +0 -1
- package/.next/static/chunks/25l0z48vlvdu4.css +0 -1
- /package/.next/server/chunks/ssr/{_0--937zhi743v._.js.map → _0zel-n0h--cnl._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0jla9ugf1y6rb._.js.map → node_modules_01avo0bde3tpo._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0sjdrli5douui._.js.map → node_modules_01l0208e5kqic._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0lqovp8j8ld76._.js.map → node_modules_033x29yqle_sj._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_05i69rc9pwcdx._.js.map → node_modules_03wbg__aslvui._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1ltys5mwtcv-n._.js.map → node_modules_08-bqkrz7sh0l._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_09v49jhajmvl4._.js.map → node_modules_089w9jm7s2qa3._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0z1e37smavebg._.js.map → node_modules_0cy47-s63xjzh._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0dw0vozejrnml._.js.map → node_modules_0czh0jcnsm5e6._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0e3njj436xau-._.js.map → node_modules_0fv321j1nslkb._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0d2ios01ot1in._.js.map → node_modules_0g-wb7h-hsdwc._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0xh8tnq1niblb._.js.map → node_modules_0oz_zzlh8exwx._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0b8zi3pbl-y9n._.js.map → node_modules_0so2agzqd9p8l._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1wew4nn7i1uup._.js.map → node_modules_0w2w61b8bh769._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_07bjxeq9dfgn1._.js.map → node_modules_0wd6szix_zku7._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1aqaelh-8fme6._.js.map → node_modules_0wp7omf0xblv8._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1d4sreyq0ubqg._.js.map → node_modules_10c51o2qv6mbi._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1l46or7mgko0z._.js.map → node_modules_19vqq7rvf-_ar._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1e_nc2eyg4djz._.js.map → node_modules_1hu83gui7_nj2._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1zbmc81s-4zsm._.js.map → node_modules_1j8hpoiygrs5e._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1pquu5wprusnc._.js.map → node_modules_1n4kig4mj6n4s._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1st9dwe66yx93._.js.map → node_modules_1s8oxeqa5_i3k._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_01p9ctt-n2dxp._.js.map → node_modules_1xz1dstlo5ri-._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0kqo9zl9cgwbo._.js.map → node_modules_katex_dist_katex_mjs_067omoj5szuys._.js.map} +0 -0
- /package/.next/static/{1y6Da0YgnPr2_6ncpWrbV → dGN2VKPk5TJgezxS3JvRc}/_buildManifest.js +0 -0
- /package/.next/static/{1y6Da0YgnPr2_6ncpWrbV → dGN2VKPk5TJgezxS3JvRc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{1y6Da0YgnPr2_6ncpWrbV → dGN2VKPk5TJgezxS3JvRc}/_ssgManifest.js +0 -0
|
@@ -1,49 +1,65 @@
|
|
|
1
1
|
import { getAntigravityTraces } from "./antigravityWatcher.js";
|
|
2
2
|
import { getClaudeTraces } from "./claudeWatcher.js";
|
|
3
|
+
import { getCodexTraces } from "./codexWatcher.js";
|
|
3
4
|
import { extractProviders } from "../traceContract.js";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* WatcherManager aggregates traces across all installed CLI watchers
|
|
7
8
|
* (Antigravity, Claude Code, etc.) with automatic fallback and caching.
|
|
8
9
|
*/
|
|
9
|
-
let
|
|
10
|
+
let cachedCombined = [];
|
|
11
|
+
let cachedErrors = [];
|
|
10
12
|
let lastFetchTime = 0;
|
|
13
|
+
let lastMaxAgeMs = null;
|
|
11
14
|
const CACHE_TTL_MS = 1500; // 1.5s cache to avoid reading disks too frequently
|
|
12
15
|
|
|
13
|
-
export async function getLiveTraceSnapshot(force = false, maxAgeMs = 24 * 60 * 60 * 1000) {
|
|
16
|
+
export async function getLiveTraceSnapshot(force = false, maxAgeMs = 24 * 60 * 60 * 1000, limit = 0) {
|
|
14
17
|
const now = Date.now();
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
const isCacheValid = !force && (now - lastFetchTime < CACHE_TTL_MS) && (lastMaxAgeMs === maxAgeMs);
|
|
19
|
+
|
|
20
|
+
if (!isCacheValid) {
|
|
21
|
+
const results = await Promise.allSettled([
|
|
22
|
+
getAntigravityTraces(maxAgeMs),
|
|
23
|
+
getClaudeTraces(maxAgeMs),
|
|
24
|
+
getCodexTraces(maxAgeMs),
|
|
25
|
+
]);
|
|
26
|
+
const errors = [];
|
|
27
|
+
const [agyResult, claudeResult, codexResult] = results;
|
|
28
|
+
const agyList = agyResult.status === "fulfilled" ? agyResult.value : [];
|
|
29
|
+
const claudeList = claudeResult.status === "fulfilled" ? claudeResult.value : [];
|
|
30
|
+
const codexList = codexResult.status === "fulfilled" ? codexResult.value : [];
|
|
31
|
+
if (agyResult.status === "rejected") errors.push({ source: "antigravity", message: agyResult.reason?.message || "Watcher failed" });
|
|
32
|
+
if (claudeResult.status === "rejected") errors.push({ source: "claude", message: claudeResult.reason?.message || "Watcher failed" });
|
|
33
|
+
if (codexResult.status === "rejected") errors.push({ source: "codex", message: codexResult.reason?.message || "Watcher failed" });
|
|
34
|
+
|
|
35
|
+
const combined = [...agyList, ...claudeList, ...codexList];
|
|
36
|
+
|
|
37
|
+
// Sort: active/streaming/pending first, then by most recent startedAt
|
|
38
|
+
combined.sort((a, b) => {
|
|
39
|
+
const activeA = (a.state === "streaming" || a.state === "pending") ? 1 : 0;
|
|
40
|
+
const activeB = (b.state === "streaming" || b.state === "pending") ? 1 : 0;
|
|
41
|
+
if (activeA !== activeB) return activeB - activeA;
|
|
42
|
+
return (b.startedAt || 0) - (a.startedAt || 0);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
cachedCombined = combined;
|
|
46
|
+
cachedErrors = errors;
|
|
47
|
+
lastMaxAgeMs = maxAgeMs;
|
|
48
|
+
lastFetchTime = now;
|
|
17
49
|
}
|
|
18
50
|
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (agyResult.status === "rejected") errors.push({ source: "antigravity", message: agyResult.reason?.message || "Watcher failed" });
|
|
28
|
-
if (claudeResult.status === "rejected") errors.push({ source: "claude", message: claudeResult.reason?.message || "Watcher failed" });
|
|
29
|
-
|
|
30
|
-
const combined = [...agyList, ...claudeList];
|
|
31
|
-
|
|
32
|
-
// Sort: active/streaming/pending first, then by most recent startedAt
|
|
33
|
-
combined.sort((a, b) => {
|
|
34
|
-
const activeA = (a.state === "streaming" || a.state === "pending") ? 1 : 0;
|
|
35
|
-
const activeB = (b.state === "streaming" || b.state === "pending") ? 1 : 0;
|
|
36
|
-
if (activeA !== activeB) return activeB - activeA;
|
|
37
|
-
return (b.startedAt || 0) - (a.startedAt || 0);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
cachedSnapshot = { traces: combined, errors };
|
|
41
|
-
lastFetchTime = now;
|
|
42
|
-
return cachedSnapshot;
|
|
51
|
+
const totalCount = cachedCombined.length;
|
|
52
|
+
const sliced = (limit > 0 && limit < totalCount) ? cachedCombined.slice(0, limit) : cachedCombined;
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
traces: sliced,
|
|
56
|
+
totalCount,
|
|
57
|
+
errors: cachedErrors,
|
|
58
|
+
};
|
|
43
59
|
}
|
|
44
60
|
|
|
45
|
-
export async function getAllLiveTraces(force = false, maxAgeMs) {
|
|
46
|
-
return (await getLiveTraceSnapshot(force, maxAgeMs)).traces;
|
|
61
|
+
export async function getAllLiveTraces(force = false, maxAgeMs, limit = 0) {
|
|
62
|
+
return (await getLiveTraceSnapshot(force, maxAgeMs, limit)).traces;
|
|
47
63
|
}
|
|
48
64
|
|
|
49
65
|
export function getProvidersFromTraces(traces) {
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[53984,56496,e=>{"use strict";var t=e.i(12714),i=e.i(50227),n=e.i(60526);function l(e){let t=e.tokens||{},i=e=>Number.isFinite(e)?Number(e):null,n=i(t.input),l=i(t.output),a=i(t.cached),r=i(e.totalTokens??t.total),s=String(e.connectionId||"").toLowerCase(),o=e.clientType||("app"===e.source||s.includes("app")?"app":"extension"===e.source||s.includes("extension")||"ide"===e.source||s.includes("ide")?"extension":"cli");return{traceId:String(e.traceId||`trace-${Math.random().toString(36).slice(2,9)}`),cli:e.cli||"agent",clientType:o,source:e.source||o,connectionId:String(e.connectionId||"Agent Desk"),account:String(e.account||"Default Workspace"),model:e.model?String(e.model):null,provider:e.provider?String(e.provider).toLowerCase():null,state:["streaming","pending","idle","done","error"].includes(e.state)?e.state:"idle",startedAt:"number"==typeof e.startedAt?e.startedAt:null,elapsedMs:"number"==typeof e.elapsedMs?e.elapsedMs:null,tokens:{input:n,output:l,cached:a},totalTokens:r??(null!==n&&null!==l&&null!==a?n+l+a:null),cost:i(e.cost),status:e.status?String(e.status):null,tools:Array.isArray(e.tools)?e.tools:[],activeTool:e.activeTool||null,currentCommand:e.currentCommand||null,sessionTitle:e.sessionTitle?String(e.sessionTitle):null,lastText:e.lastText?String(e.lastText):null,lastTextRole:["user","assistant"].includes(e.lastTextRole)?e.lastTextRole:null,error:e.error?String(e.error):null,isLooping:!!e.isLooping,logs:Array.isArray(e.logs)?e.logs:[]}}e.s(["s",0,function(e){let t=new Set,i=[];for(let n of e){let e=(n.provider||"other").toLowerCase();t.has(e)||(t.add(e),i.push({provider:e,name:e.charAt(0).toUpperCase()+e.slice(1)}))}return i},"g",0,l],56496);let a={view_file:"read",read_file:"read",replace_file_content:"edit",write_to_file:"edit",call_mcp_tool:"mcp",list_resources:"mcp",invoke_subagent:"agent",grep_search:"search",list_dir:"read",find_by_name:"read",define_subagent:"agent"};function r(e){if(!e||!e.name)return{type:"mcp",detail:null};let t=e.name,n=e.args||{};if("call_mcp_tool"===t){let e=String(n.ServerName||"").toLowerCase(),t=String(n.ToolName||"").toLowerCase();return e.includes("gitnexus")||t.includes("cypher")||t.includes("pdg_query")||t.includes("impact")?{type:"gitnexus",detail:`GitNexus: ${t}`}:e.includes("playwright")||e.includes("browser")||t.startsWith("browser_")?{type:"browser",detail:`Browser: ${t}`}:{type:"mcp",detail:`MCP: ${e}/${t}`}}if("run_command"===t){let e=String(n.CommandLine||"").trim(),t=e.toLowerCase();return t.startsWith("docker")||t.includes("docker exec")||t.includes("docker-compose")?{type:"docker",detail:e.length>50?`${e.slice(0,47)}...`:e}:t.startsWith("git ")||t.startsWith("gh ")||t.includes("git commit")||t.includes("git push")?{type:"git",detail:e.length>50?`${e.slice(0,47)}...`:e}:t.includes("gitnexus")?{type:"gitnexus",detail:e.length>50?`${e.slice(0,47)}...`:e}:{type:"bash",detail:e.length>50?`${e.slice(0,47)}...`:e}}let l=a[t],r=n.TargetFile||n.AbsolutePath||n.query||"",s=r?`${t}: ${i.default.basename(r)}`:t;return l?{type:l,detail:s}:t.includes("read")||t.includes("find")||t.includes("dir")||t.includes("list")?{type:"read",detail:s}:t.includes("edit")||t.includes("write")||t.includes("patch")?{type:"edit",detail:s}:t.includes("search")||t.includes("grep")?{type:"search",detail:s}:t.includes("agent")||t.includes("message")?{type:"agent",detail:s}:{type:"mcp",detail:s}}function s(e){if(!e)return null;let t=e.match(/Model Selection` from [^ ]+ to (.*?)(?:\.\s+No need|\.\s*\n|<\/USER_SETTINGS_CHANGE>)/i);if(t&&t[1])return t[1].trim();let i=e.match(/Model Selection`? from .*? to ([^\n<.]+)/i);return i&&i[1]?i[1].trim():null}function o(e){if(!e)return null;let t=e.toLowerCase();return t.includes("3.8")&&t.includes("flash")?"gemini-3.8-flash":t.includes("3.5")&&t.includes("flash")?"gemini-3.5-flash":t.includes("3.8")&&t.includes("pro")?"gemini-3.8-pro":t.includes("3.1")&&t.includes("pro")?"gemini-3.1-pro":t.includes("2.5")&&t.includes("pro")?"gemini-2.5-pro":t.includes("2.5")&&t.includes("flash")?"gemini-2.5-flash":t.includes("sonnet")&&t.includes("5.5")?"claude-sonnet-5.5":t.includes("sonnet")&&t.includes("3.7")?"claude-3.7-sonnet":t.includes("sonnet")&&t.includes("3.5")?"claude-3.5-sonnet":e.replace(/[()]/g,"").trim().toLowerCase().replace(/\s+/g,"-")}function c(e,t=160){let i=String(e||"").replace(/\s+/g," ").trim();return i?i.slice(0,t):null}async function u(){let e=n.default.homedir(),l=i.default.join(e,".gemini"),a=[],r=new Set,s=(e,t)=>{r.has(e)||(r.add(e),a.push({dir:e,source:t}))};s(i.default.join(l,"antigravity-cli","brain"),"cli"),s(i.default.join(l,"antigravity","brain"),"app"),s(i.default.join(l,"antigravity-ide","brain"),"ide");try{for(let e of(await t.default.readdir(l,{withFileTypes:!0}))){if(!e.isDirectory())continue;let n=i.default.join(l,e.name,"brain");if(!r.has(n))try{if((await t.default.stat(n)).isDirectory()){let t=e.name.toLowerCase(),i=t.includes("ide")?"ide":t.includes("app")||"antigravity"===t?"app":"cli";s(n,i)}}catch{}}}catch{}let o=[];for(let e of a)try{(await t.default.stat(e.dir)).isDirectory()&&o.push(e)}catch{}return o}async function d(e=864e5){let a=n.default.homedir(),p=await u(),g=null;try{let e=await t.default.readFile(i.default.join(a,".gemini","antigravity-cli","settings.json"),"utf-8"),n=JSON.parse(e);n.model&&(g=n.model)}catch{}try{let n=Date.now(),a=[],u=new Set;for(let{dir:d,source:m}of p){let p;try{p=await t.default.readdir(d,{withFileTypes:!0})}catch{continue}for(let f of p){if(!f.isDirectory())continue;let p=f.name;if(u.has(p))continue;let y=i.default.join(d,p,".system_generated","logs","transcript.jsonl");try{let d=(await t.default.stat(y)).mtimeMs;if(n-d>e)continue;let f=await t.default.readFile(y,"utf-8"),h=f.trim().split("\n");if(0===h.length)continue;let _=0,S=0,T=0,w=!1,A=null,N=null,E=new Set,b=null,C=null,v=null,I=null,R=null,k=null,$=null,x=[],D=[];for(let e of h)if(e)try{let t=JSON.parse(e),i=t.created_at?new Date(t.created_at).getTime():Date.now();if(!b&&t.created_at&&(b=i),t.created_at&&(C=i),(Number.isFinite(t.input_tokens)||Number.isFinite(t.output_tokens)||Number.isFinite(t.cache_read_tokens))&&(w=!0,_+=t.input_tokens||0,S+=t.output_tokens||0,T+=t.cache_read_tokens||0),"USER_INPUT"===t.type&&t.content){let e=function(e){if(!e)return null;let t=String(e),i=[...t.matchAll(/<USER_REQUEST>([\s\S]*?)<\/USER_REQUEST>/gi)];return c(t=i.length>0?i[i.length-1][1]:t.replace(/<CONTEXT_SUMMARY>[\s\S]*?<\/CONTEXT_SUMMARY>/gi,"").replace(/<ADDITIONAL_METADATA>[\s\S]*?<\/ADDITIONAL_METADATA>/gi,"").replace(/<USER_SETTINGS_CHANGE>[\s\S]*?<\/USER_SETTINGS_CHANGE>/gi,"").replace(/<system-reminder>[\s\S]*?<\/system-reminder>/gi,""))}(t.content);e&&(R||=c(e,80),k=e,$="user",D.push({timestamp:t.created_at||new Date().toISOString(),type:"prompt",summary:"User Prompt",detail:e.slice(0,100)}))}else if("PLANNER_RESPONSE"===t.type&&t.content){let e=c(t.content);e&&(k=e,$="assistant")}if(Array.isArray(t.tool_calls)&&t.tool_calls.length>0)for(let e of(A=t,t.tool_calls)){if(e.args?.Cwd&&!I&&(I=e.args.Cwd),!I&&(e.args?.TargetFile||e.args?.AbsolutePath)){let t=e.args.TargetFile||e.args.AbsolutePath;t.includes("/Projects/")&&(I=t.split("/").slice(0,5).join("/"))}let{type:n,detail:l}=r(e);n&&E.add(n),l&&(v=l),x.push({name:e.name,time:i,detail:l||e.name}),D.push({timestamp:t.created_at||new Date().toISOString(),type:n||"tool",summary:e.name,detail:l||e.name})}("ERROR"===t.status||"GENERIC"===t.type&&t.content&&t.content.includes("error"))&&D.push({timestamp:t.created_at||new Date().toISOString(),type:"error",summary:"Error",detail:String(t.content||"Command failed").slice(0,100)}),N=t}catch{}let L="done";A?.status==="RUNNING"?L="streaming":N?.type==="USER_INPUT"?L="pending":n-d<45e3&&(L="idle");let U=!1;if(x.length>=5){let e=x.slice(-10);for(let t=0;t<=e.length-5;t++){let i=e.slice(t,t+5),n=`${i[0].name}:${i[0].detail}`,l=i.every(e=>`${e.name}:${e.detail}`===n),a=(i[i.length-1].time||0)-(i[0].time||0);if(l&&(a<=6e4||0===a)){U=!0;break}}}let M=null;if(A&&Array.isArray(A.tool_calls)&&A.tool_calls.length>0){let e=A.tool_calls[A.tool_calls.length-1];M=r(e).type}let j=C&&b?Math.max(0,C-b):n-d,F=(I?i.default.basename(I):`agy-${p.slice(0,6)}`).replace(/["'\\]/g,"").trim();u.add(p);let O="app"===m?"app":"ide"===m?"ide":"cli",P="app"===m?"Antigravity App":"ide"===m?"Antigravity IDE":"Antigravity",G=s(f)||("cli"===m?g:null),W=o(G),H=function(e,t){let i=String(e||"").toLowerCase(),n=null;return i.includes("gemini")?n="gemini":i.includes("claude")?n="anthropic":i.includes("gpt")||i.includes("o1")||i.includes("o3")?n="openai":i.includes("minimax")?n="minimax":i.includes("deepseek")&&(n="deepseek"),n?`${n} (${t})`:null}(W,O),q=i.default.basename(process.cwd())||"agent-factory",J=F||q,Q=R||J;a.push(l({traceId:`agy-${p.slice(0,8)}`,cli:"antigravity",clientType:O,source:m,connectionId:`${P} (${p.slice(0,6)})`,account:J,model:W,provider:H,state:L,startedAt:b||n-j,elapsedMs:j,tokens:{input:w?_:null,output:w?S:null,cached:w?T:null},cost:null,status:U?"error":null,tools:Array.from(E),activeTool:M,currentCommand:v,sessionTitle:Q,lastText:k,lastTextRole:$,isLooping:U,logs:D.slice(-25)}))}catch{}}}return a.sort((e,t)=>{let i=+("streaming"===e.state||"pending"===e.state),n=+("streaming"===t.state||"pending"===t.state);return i!==n?n-i:(t.startedAt||0)-(e.startedAt||0)}),a}catch{return[]}}e.s(["f",0,s,"g",0,d,"R",0,o],53984)}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=src_lib_watchers_antigravityWatcher_0w1-atg39y__p.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/watchers/antigravityWatcher.js","../../../src/lib/traceContract.js"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { normalizeTrace } from \"../traceContract.js\";\n\nconst TOOL_MAP = {\n view_file: \"read\",\n read_file: \"read\",\n replace_file_content: \"edit\",\n write_to_file: \"edit\",\n call_mcp_tool: \"mcp\",\n list_resources: \"mcp\",\n invoke_subagent: \"agent\",\n grep_search: \"search\",\n list_dir: \"read\",\n find_by_name: \"read\",\n define_subagent: \"agent\",\n};\n\nfunction normalizeToolCall(tc) {\n if (!tc || !tc.name) return { type: \"mcp\", detail: null };\n const name = tc.name;\n const args = tc.args || {};\n\n // 1. MCP Tools inspection\n if (name === \"call_mcp_tool\") {\n const srv = String(args.ServerName || \"\").toLowerCase();\n const tool = String(args.ToolName || \"\").toLowerCase();\n if (srv.includes(\"gitnexus\") || tool.includes(\"cypher\") || tool.includes(\"pdg_query\") || tool.includes(\"impact\")) {\n return { type: \"gitnexus\", detail: `GitNexus: ${tool}` };\n }\n if (srv.includes(\"playwright\") || srv.includes(\"browser\") || tool.startsWith(\"browser_\")) {\n return { type: \"browser\", detail: `Browser: ${tool}` };\n }\n return { type: \"mcp\", detail: `MCP: ${srv}/${tool}` };\n }\n\n // 2. Terminal commands inspection\n if (name === \"run_command\") {\n const cmd = String(args.CommandLine || \"\").trim();\n const cmdLower = cmd.toLowerCase();\n if (cmdLower.startsWith(\"docker\") || cmdLower.includes(\"docker exec\") || cmdLower.includes(\"docker-compose\")) {\n return { type: \"docker\", detail: cmd.length > 50 ? `${cmd.slice(0, 47)}...` : cmd };\n }\n if (cmdLower.startsWith(\"git \") || cmdLower.startsWith(\"gh \") || cmdLower.includes(\"git commit\") || cmdLower.includes(\"git push\")) {\n return { type: \"git\", detail: cmd.length > 50 ? `${cmd.slice(0, 47)}...` : cmd };\n }\n if (cmdLower.includes(\"gitnexus\")) {\n return { type: \"gitnexus\", detail: cmd.length > 50 ? `${cmd.slice(0, 47)}...` : cmd };\n }\n return { type: \"bash\", detail: cmd.length > 50 ? `${cmd.slice(0, 47)}...` : cmd };\n }\n\n // 3. Native tools mapping\n const mapped = TOOL_MAP[name];\n const target = args.TargetFile || args.AbsolutePath || args.query || \"\";\n const detail = target ? `${name}: ${path.basename(target)}` : name;\n\n if (mapped) return { type: mapped, detail };\n if (name.includes(\"read\") || name.includes(\"find\") || name.includes(\"dir\") || name.includes(\"list\")) return { type: \"read\", detail };\n if (name.includes(\"edit\") || name.includes(\"write\") || name.includes(\"patch\")) return { type: \"edit\", detail };\n if (name.includes(\"search\") || name.includes(\"grep\")) return { type: \"search\", detail };\n if (name.includes(\"agent\") || name.includes(\"message\")) return { type: \"agent\", detail };\n\n return { type: \"mcp\", detail };\n}\n\nexport function extractModelFromTranscript(content) {\n if (!content) return null;\n const match = content.match(/Model Selection` from [^ ]+ to (.*?)(?:\\.\\s+No need|\\.\\s*\\n|<\\/USER_SETTINGS_CHANGE>)/i);\n if (match && match[1]) return match[1].trim();\n const matchFallback = content.match(/Model Selection`? from .*? to ([^\\n<.]+)/i);\n if (matchFallback && matchFallback[1]) return matchFallback[1].trim();\n return null;\n}\n\nexport function normalizeModel(raw) {\n if (!raw) return null;\n const lower = raw.toLowerCase();\n if (lower.includes(\"3.8\") && lower.includes(\"flash\")) return \"gemini-3.8-flash\";\n if (lower.includes(\"3.5\") && lower.includes(\"flash\")) return \"gemini-3.5-flash\";\n if (lower.includes(\"3.8\") && lower.includes(\"pro\")) return \"gemini-3.8-pro\";\n if (lower.includes(\"3.1\") && lower.includes(\"pro\")) return \"gemini-3.1-pro\";\n if (lower.includes(\"2.5\") && lower.includes(\"pro\")) return \"gemini-2.5-pro\";\n if (lower.includes(\"2.5\") && lower.includes(\"flash\")) return \"gemini-2.5-flash\";\n if (lower.includes(\"sonnet\") && lower.includes(\"5.5\")) return \"claude-sonnet-5.5\";\n if (lower.includes(\"sonnet\") && lower.includes(\"3.7\")) return \"claude-3.7-sonnet\";\n if (lower.includes(\"sonnet\") && lower.includes(\"3.5\")) return \"claude-3.5-sonnet\";\n return raw.replace(/[()]/g, \"\").trim().toLowerCase().replace(/\\s+/g, \"-\");\n}\n\nfunction compactText(value, maxLength = 160) {\n const text = String(value || \"\").replace(/\\s+/g, \" \").trim();\n return text ? text.slice(0, maxLength) : null;\n}\n\nfunction getProviderFromModel(modelName, clientType) {\n const model = String(modelName || \"\").toLowerCase();\n let provider = null;\n if (model.includes(\"gemini\")) provider = \"gemini\";\n else if (model.includes(\"claude\")) provider = \"anthropic\";\n else if (model.includes(\"gpt\") || model.includes(\"o1\") || model.includes(\"o3\")) provider = \"openai\";\n else if (model.includes(\"minimax\")) provider = \"minimax\";\n else if (model.includes(\"deepseek\")) provider = \"deepseek\";\n return provider ? `${provider} (${clientType})` : null;\n}\n\nfunction cleanUserPrompt(content) {\n if (!content) return null;\n let text = String(content);\n // If there are explicit <USER_REQUEST> tags, extract the actual user request\n const userRequestMatches = [...text.matchAll(/<USER_REQUEST>([\\s\\S]*?)<\\/USER_REQUEST>/gi)];\n if (userRequestMatches.length > 0) {\n text = userRequestMatches[userRequestMatches.length - 1][1];\n } else {\n text = text\n .replace(/<CONTEXT_SUMMARY>[\\s\\S]*?<\\/CONTEXT_SUMMARY>/gi, \"\")\n .replace(/<ADDITIONAL_METADATA>[\\s\\S]*?<\\/ADDITIONAL_METADATA>/gi, \"\")\n .replace(/<USER_SETTINGS_CHANGE>[\\s\\S]*?<\\/USER_SETTINGS_CHANGE>/gi, \"\")\n .replace(/<system-reminder>[\\s\\S]*?<\\/system-reminder>/gi, \"\");\n }\n return compactText(text);\n}\n\nasync function discoverAntigravityBrainDirs() {\n const homeDir = os.homedir();\n const geminiDir = path.join(homeDir, \".gemini\");\n const discovered = [];\n const seen = new Set();\n\n const addDir = (dirPath, defaultSource) => {\n if (seen.has(dirPath)) return;\n seen.add(dirPath);\n discovered.push({ dir: dirPath, source: defaultSource });\n };\n\n // 1. Standard paths\n addDir(path.join(geminiDir, \"antigravity-cli\", \"brain\"), \"cli\");\n addDir(path.join(geminiDir, \"antigravity\", \"brain\"), \"app\");\n addDir(path.join(geminiDir, \"antigravity-ide\", \"brain\"), \"ide\");\n\n // 2. Dynamic discovery of any sibling folders in ~/.gemini\n try {\n const entries = await fs.readdir(geminiDir, { withFileTypes: true });\n for (const ent of entries) {\n if (!ent.isDirectory()) continue;\n const bPath = path.join(geminiDir, ent.name, \"brain\");\n if (seen.has(bPath)) continue;\n try {\n const s = await fs.stat(bPath);\n if (s.isDirectory()) {\n const lower = ent.name.toLowerCase();\n const source = lower.includes(\"ide\") ? \"ide\" : lower.includes(\"app\") || lower === \"antigravity\" ? \"app\" : \"cli\";\n addDir(bPath, source);\n }\n } catch {}\n }\n } catch {}\n\n const validDirs = [];\n for (const item of discovered) {\n try {\n const s = await fs.stat(item.dir);\n if (s.isDirectory()) validDirs.push(item);\n } catch {}\n }\n return validDirs;\n}\n\nexport async function getAntigravityTraces(maxAgeMs = 24 * 60 * 60 * 1000) {\n const homeDir = os.homedir();\n const searchDirs = await discoverAntigravityBrainDirs();\n\n let defaultCliModel = null;\n try {\n const cliSettingsRaw = await fs.readFile(path.join(homeDir, \".gemini\", \"antigravity-cli\", \"settings.json\"), \"utf-8\");\n const cliSettings = JSON.parse(cliSettingsRaw);\n if (cliSettings.model) defaultCliModel = cliSettings.model;\n } catch {}\n\n try {\n const now = Date.now();\n const traces = [];\n const seenConvIds = new Set();\n\n for (const { dir: brainDir, source } of searchDirs) {\n let entries;\n try {\n entries = await fs.readdir(brainDir, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const ent of entries) {\n if (!ent.isDirectory()) continue;\n const convId = ent.name;\n if (seenConvIds.has(convId)) continue;\n const transcriptPath = path.join(brainDir, convId, \".system_generated\", \"logs\", \"transcript.jsonl\");\n\n try {\n const stat = await fs.stat(transcriptPath);\n const mtime = stat.mtimeMs;\n if (now - mtime > maxAgeMs) continue;\n\n const content = await fs.readFile(transcriptPath, \"utf-8\");\n const lines = content.trim().split(\"\\n\");\n if (lines.length === 0) continue;\n\n let totalIn = 0;\n let totalOut = 0;\n let totalCached = 0;\n let hasUsage = false;\n let lastToolEntry = null;\n let lastStep = null;\n const toolSet = new Set();\n let firstTime = null;\n let lastTime = null;\n let activeCommandDetail = null;\n let detectedCwd = null;\n let sessionTitle = null;\n let lastText = null;\n let lastTextRole = null;\n const toolInvocations = [];\n const recentLogs = [];\n\n for (const line of lines) {\n if (!line) continue;\n try {\n const entry = JSON.parse(line);\n const entryTime = entry.created_at ? new Date(entry.created_at).getTime() : Date.now();\n if (!firstTime && entry.created_at) firstTime = entryTime;\n if (entry.created_at) lastTime = entryTime;\n\n if (\n Number.isFinite(entry.input_tokens) ||\n Number.isFinite(entry.output_tokens) ||\n Number.isFinite(entry.cache_read_tokens)\n ) {\n hasUsage = true;\n totalIn += entry.input_tokens || 0;\n totalOut += entry.output_tokens || 0;\n totalCached += entry.cache_read_tokens || 0;\n }\n\n if (entry.type === \"USER_INPUT\" && entry.content) {\n const cleanPrompt = cleanUserPrompt(entry.content);\n if (cleanPrompt) {\n sessionTitle ||= compactText(cleanPrompt, 80);\n lastText = cleanPrompt;\n lastTextRole = \"user\";\n recentLogs.push({\n timestamp: entry.created_at || new Date().toISOString(),\n type: \"prompt\",\n summary: \"User Prompt\",\n detail: cleanPrompt.slice(0, 100),\n });\n }\n } else if (entry.type === \"PLANNER_RESPONSE\" && entry.content) {\n const response = compactText(entry.content);\n if (response) {\n lastText = response;\n lastTextRole = \"assistant\";\n }\n }\n\n if (Array.isArray(entry.tool_calls) && entry.tool_calls.length > 0) {\n lastToolEntry = entry;\n for (const tc of entry.tool_calls) {\n if (tc.args?.Cwd && !detectedCwd) detectedCwd = tc.args.Cwd;\n if (!detectedCwd && (tc.args?.TargetFile || tc.args?.AbsolutePath)) {\n const p = tc.args.TargetFile || tc.args.AbsolutePath;\n if (p.includes(\"/Projects/\")) detectedCwd = p.split(\"/\").slice(0, 5).join(\"/\");\n }\n const { type, detail } = normalizeToolCall(tc);\n if (type) toolSet.add(type);\n if (detail) activeCommandDetail = detail;\n\n toolInvocations.push({\n name: tc.name,\n time: entryTime,\n detail: detail || tc.name,\n });\n\n recentLogs.push({\n timestamp: entry.created_at || new Date().toISOString(),\n type: type || \"tool\",\n summary: tc.name,\n detail: detail || tc.name,\n });\n }\n }\n\n if (entry.status === \"ERROR\" || (entry.type === \"GENERIC\" && entry.content && entry.content.includes(\"error\"))) {\n recentLogs.push({\n timestamp: entry.created_at || new Date().toISOString(),\n type: \"error\",\n summary: \"Error\",\n detail: String(entry.content || \"Command failed\").slice(0, 100),\n });\n }\n\n lastStep = entry;\n } catch {\n // ignore malformed line\n }\n }\n\n let state = \"done\";\n if (lastToolEntry?.status === \"RUNNING\") {\n state = \"streaming\";\n } else if (lastStep?.type === \"USER_INPUT\") {\n state = \"pending\";\n } else if (now - mtime < 45 * 1000) {\n state = \"idle\";\n }\n\n // Loop detection: 5 consecutive identical tool calls (same tool and target) within 60s\n let isLooping = false;\n if (toolInvocations.length >= 5) {\n const lastN = toolInvocations.slice(-10);\n for (let s = 0; s <= lastN.length - 5; s++) {\n const window = lastN.slice(s, s + 5);\n const targetKey = `${window[0].name}:${window[0].detail}`;\n const sameCall = window.every((w) => `${w.name}:${w.detail}` === targetKey);\n const timeSpan = (window[window.length - 1].time || 0) - (window[0].time || 0);\n if (sameCall && (timeSpan <= 60000 || timeSpan === 0)) {\n isLooping = true;\n break;\n }\n }\n }\n\n let activeTool = null;\n if (lastToolEntry && Array.isArray(lastToolEntry.tool_calls) && lastToolEntry.tool_calls.length > 0) {\n const lastTc = lastToolEntry.tool_calls[lastToolEntry.tool_calls.length - 1];\n activeTool = normalizeToolCall(lastTc).type;\n }\n\n const elapsedMs = (lastTime && firstTime) ? Math.max(0, lastTime - firstTime) : (now - mtime);\n const rawFolder = detectedCwd ? path.basename(detectedCwd) : `agy-${convId.slice(0, 6)}`;\n const folderName = rawFolder.replace(/[\"'\\\\]/g, \"\").trim();\n\n seenConvIds.add(convId);\n const clientType = source === \"app\" ? \"app\" : source === \"ide\" ? \"ide\" : \"cli\";\n const appLabel = source === \"app\" ? \"Antigravity App\" : source === \"ide\" ? \"Antigravity IDE\" : \"Antigravity\";\n const rawModel = extractModelFromTranscript(content) || (source === \"cli\" ? defaultCliModel : null);\n const modelName = normalizeModel(rawModel);\n const providerName = getProviderFromModel(modelName, clientType);\n\n const fallbackWorkspace = path.basename(process.cwd()) || \"agent-factory\";\n const finalAccount = folderName || fallbackWorkspace;\n const finalSessionTitle = sessionTitle || finalAccount;\n\n traces.push(normalizeTrace({\n traceId: `agy-${convId.slice(0, 8)}`,\n cli: \"antigravity\",\n clientType,\n source,\n connectionId: `${appLabel} (${convId.slice(0, 6)})`,\n account: finalAccount,\n model: modelName,\n provider: providerName,\n state,\n startedAt: firstTime || (now - elapsedMs),\n elapsedMs,\n tokens: {\n input: hasUsage ? totalIn : null,\n output: hasUsage ? totalOut : null,\n cached: hasUsage ? totalCached : null,\n },\n cost: null,\n status: isLooping ? \"error\" : null,\n tools: Array.from(toolSet),\n activeTool,\n currentCommand: activeCommandDetail,\n sessionTitle: finalSessionTitle,\n lastText,\n lastTextRole,\n isLooping,\n logs: recentLogs.slice(-25),\n }));\n } catch {\n // file missing or unreadable\n }\n }\n }\n\n // Sort: active (streaming/pending) first, then by most recent startedAt\n traces.sort((a, b) => {\n const activeA = (a.state === \"streaming\" || a.state === \"pending\") ? 1 : 0;\n const activeB = (b.state === \"streaming\" || b.state === \"pending\") ? 1 : 0;\n if (activeA !== activeB) return activeB - activeA;\n return (b.startedAt || 0) - (a.startedAt || 0);\n });\n\n return traces;\n } catch {\n return [];\n }\n}\n","/**\n * Standard Trace Contract for Agent Factory.\n * All watchers normalize their session logs into this uniform schema.\n */\n\nexport function normalizeTrace(raw) {\n const tokens = raw.tokens || {};\n const asNumberOrNull = (value) => (Number.isFinite(value) ? Number(value) : null);\n const inputTokens = asNumberOrNull(tokens.input);\n const outputTokens = asNumberOrNull(tokens.output);\n const cachedTokens = asNumberOrNull(tokens.cached);\n const explicitTotal = asNumberOrNull(raw.totalTokens ?? tokens.total);\n const totalTokens = explicitTotal ?? (\n inputTokens !== null && outputTokens !== null && cachedTokens !== null\n ? inputTokens + outputTokens + cachedTokens\n : null\n );\n const lowerConn = String(raw.connectionId || \"\").toLowerCase();\n const clientType = raw.clientType || (\n raw.source === \"app\" || lowerConn.includes(\"app\") ? \"app\" :\n raw.source === \"extension\" || lowerConn.includes(\"extension\") || raw.source === \"ide\" || lowerConn.includes(\"ide\") ? \"extension\" : \"cli\"\n );\n return {\n traceId: String(raw.traceId || `trace-${Math.random().toString(36).slice(2, 9)}`),\n cli: raw.cli || \"agent\", // \"antigravity\" | \"claude\" | \"cursor\" | etc.\n clientType, // \"app\" | \"cli\" | \"ide\" | \"extension\" | \"desktop\"\n source: raw.source || clientType,\n connectionId: String(raw.connectionId || \"Agent Desk\"),\n account: String(raw.account || \"Default Workspace\"),\n model: raw.model ? String(raw.model) : null,\n provider: raw.provider ? String(raw.provider).toLowerCase() : null,\n state: [\"streaming\", \"pending\", \"idle\", \"done\", \"error\"].includes(raw.state) ? raw.state : \"idle\",\n startedAt: typeof raw.startedAt === \"number\" ? raw.startedAt : null,\n elapsedMs: typeof raw.elapsedMs === \"number\" ? raw.elapsedMs : null,\n tokens: {\n input: inputTokens,\n output: outputTokens,\n cached: cachedTokens,\n },\n totalTokens,\n cost: asNumberOrNull(raw.cost),\n status: raw.status ? String(raw.status) : null,\n tools: Array.isArray(raw.tools) ? raw.tools : [],\n activeTool: raw.activeTool || null,\n currentCommand: raw.currentCommand || null,\n sessionTitle: raw.sessionTitle ? String(raw.sessionTitle) : null,\n lastText: raw.lastText ? String(raw.lastText) : null,\n lastTextRole: [\"user\", \"assistant\"].includes(raw.lastTextRole) ? raw.lastTextRole : null,\n error: raw.error ? String(raw.error) : null,\n isLooping: Boolean(raw.isLooping || false),\n logs: Array.isArray(raw.logs) ? raw.logs : [],\n };\n}\n\nexport function extractProviders(traces) {\n const seen = new Set();\n const list = [];\n for (const t of traces) {\n const p = (t.provider || \"other\").toLowerCase();\n if (!seen.has(p)) {\n seen.add(p);\n list.push({\n provider: p,\n name: p.charAt(0).toUpperCase() + p.slice(1),\n });\n }\n }\n return list;\n}\n"],"names":["normalizeTrace","raw","tokens","asNumberOrNull","value","Number","isFinite","inputTokens","input","outputTokens","output","cachedTokens","cached","explicitTotal","totalTokens","total","lowerConn","String","connectionId","toLowerCase","clientType","source","includes","traceId","Math","random","toString","slice","cli","account","model","provider","state","startedAt","elapsedMs","cost","status","tools","Array","isArray","activeTool","currentCommand","sessionTitle","lastText","lastTextRole","error","isLooping","Boolean","logs","extractProviders","traces","seen","Set","list","t","p","has","add","push","name","charAt","toUpperCase"],"mappings":"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"}
|