heyiam 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/dist/analyzer.d.ts +3 -3
- package/dist/archive.d.ts +14 -0
- package/dist/archive.js +125 -0
- package/dist/archive.js.map +1 -0
- package/dist/auth.d.ts +0 -6
- package/dist/auth.js +2 -4
- package/dist/auth.js.map +1 -1
- package/dist/autostart.d.ts +19 -0
- package/dist/autostart.js +103 -0
- package/dist/autostart.js.map +1 -0
- package/dist/bridge.d.ts +0 -2
- package/dist/bridge.js +33 -4
- package/dist/bridge.js.map +1 -1
- package/dist/config.d.ts +1 -3
- package/dist/config.js +2 -4
- package/dist/config.js.map +1 -1
- package/dist/context-export.d.ts +22 -0
- package/dist/context-export.js +230 -0
- package/dist/context-export.js.map +1 -0
- package/dist/daemon-install.d.ts +23 -0
- package/dist/daemon-install.js +155 -0
- package/dist/daemon-install.js.map +1 -0
- package/dist/db.d.ts +117 -0
- package/dist/db.js +444 -0
- package/dist/db.js.map +1 -0
- package/dist/export.d.ts +33 -0
- package/dist/export.js +463 -0
- package/dist/export.js.map +1 -0
- package/dist/format-utils.d.ts +6 -0
- package/dist/format-utils.js +15 -0
- package/dist/format-utils.js.map +1 -0
- package/dist/index.js +474 -117
- package/dist/index.js.map +1 -1
- package/dist/llm/project-enhance.d.ts +3 -2
- package/dist/llm/project-enhance.js +1 -1
- package/dist/parsers/claude.js +73 -0
- package/dist/parsers/claude.js.map +1 -1
- package/dist/parsers/codex.js +1 -1
- package/dist/parsers/codex.js.map +1 -1
- package/dist/parsers/cursor.d.ts +2 -0
- package/dist/parsers/cursor.js +14 -26
- package/dist/parsers/cursor.js.map +1 -1
- package/dist/parsers/gemini.d.ts +3 -2
- package/dist/parsers/gemini.js +198 -21
- package/dist/parsers/gemini.js.map +1 -1
- package/dist/parsers/index.d.ts +1 -1
- package/dist/parsers/index.js +23 -7
- package/dist/parsers/index.js.map +1 -1
- package/dist/parsers/types.d.ts +27 -1
- package/dist/render/build-render-data.d.ts +59 -0
- package/dist/render/build-render-data.js +101 -0
- package/dist/render/build-render-data.js.map +1 -0
- package/dist/render/components/PortfolioPage.d.ts +4 -0
- package/dist/render/components/PortfolioPage.js +16 -0
- package/dist/render/components/PortfolioPage.js.map +1 -0
- package/dist/render/components/ProjectPage.d.ts +4 -0
- package/dist/render/components/ProjectPage.js +101 -0
- package/dist/render/components/ProjectPage.js.map +1 -0
- package/dist/render/components/SessionPage.d.ts +4 -0
- package/dist/render/components/SessionPage.js +29 -0
- package/dist/render/components/SessionPage.js.map +1 -0
- package/dist/render/index.d.ts +37 -0
- package/dist/render/index.js +104 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/liquid.d.ts +19 -0
- package/dist/render/liquid.js +149 -0
- package/dist/render/liquid.js.map +1 -0
- package/dist/render/types.d.ts +121 -0
- package/dist/render/types.js +9 -0
- package/dist/render/types.js.map +1 -0
- package/dist/routes/archive.d.ts +3 -0
- package/dist/routes/archive.js +56 -0
- package/dist/routes/archive.js.map +1 -0
- package/dist/routes/auth.d.ts +3 -0
- package/dist/routes/auth.js +116 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/context.d.ts +76 -0
- package/dist/routes/context.js +452 -0
- package/dist/routes/context.js.map +1 -0
- package/dist/routes/dashboard.d.ts +3 -0
- package/dist/routes/dashboard.js +103 -0
- package/dist/routes/dashboard.js.map +1 -0
- package/dist/routes/enhance.d.ts +3 -0
- package/dist/routes/enhance.js +305 -0
- package/dist/routes/enhance.js.map +1 -0
- package/dist/routes/export.d.ts +3 -0
- package/dist/routes/export.js +229 -0
- package/dist/routes/export.js.map +1 -0
- package/dist/routes/index.d.ts +12 -0
- package/dist/routes/index.js +13 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/preview.d.ts +3 -0
- package/dist/routes/preview.js +191 -0
- package/dist/routes/preview.js.map +1 -0
- package/dist/routes/projects.d.ts +3 -0
- package/dist/routes/projects.js +181 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/publish.d.ts +3 -0
- package/dist/routes/publish.js +466 -0
- package/dist/routes/publish.js.map +1 -0
- package/dist/routes/search.d.ts +3 -0
- package/dist/routes/search.js +110 -0
- package/dist/routes/search.js.map +1 -0
- package/dist/routes/sessions.d.ts +3 -0
- package/dist/routes/sessions.js +103 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/settings.d.ts +3 -0
- package/dist/routes/settings.js +30 -0
- package/dist/routes/settings.js.map +1 -0
- package/dist/screenshot.d.ts +5 -2
- package/dist/screenshot.js +187 -13
- package/dist/screenshot.js.map +1 -1
- package/dist/search.d.ts +30 -0
- package/dist/search.js +153 -0
- package/dist/search.js.map +1 -0
- package/dist/server.d.ts +1 -1
- package/dist/server.js +55 -1318
- package/dist/server.js.map +1 -1
- package/dist/settings.d.ts +23 -6
- package/dist/settings.js +36 -12
- package/dist/settings.js.map +1 -1
- package/dist/source-audit.d.ts +29 -0
- package/dist/source-audit.js +203 -0
- package/dist/source-audit.js.map +1 -0
- package/dist/summarize.d.ts +0 -7
- package/dist/summarize.js +0 -20
- package/dist/summarize.js.map +1 -1
- package/dist/sync.d.ts +76 -0
- package/dist/sync.js +361 -0
- package/dist/sync.js.map +1 -0
- package/dist/transcript.d.ts +68 -0
- package/dist/transcript.js +275 -0
- package/dist/transcript.js.map +1 -0
- package/package.json +6 -2
- package/app/dist/assets/html2canvas-Cwn_rrOw.js +0 -5
- package/app/dist/assets/index-CEQyTkgN.js +0 -14
- package/app/dist/assets/index-DLh5xRE8.css +0 -1
- package/app/dist/favicon.svg +0 -5
- package/app/dist/icons.svg +0 -24
- package/app/dist/index.html +0 -20
- package/dist/machine-key.d.ts +0 -10
- package/dist/machine-key.js +0 -51
- package/dist/machine-key.js.map +0 -1
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// Context Export — compresses a Session into AI-consumable Markdown
|
|
2
|
+
// Three tiers: compact (~500 tokens), summary (~2000 tokens), full (~10000+ tokens)
|
|
3
|
+
import { SOURCE_DISPLAY_NAMES } from "./parsers/types.js";
|
|
4
|
+
import { formatLoc } from './format-utils.js';
|
|
5
|
+
/** Estimate token count from character length (rough ~4 chars/token). */
|
|
6
|
+
export function estimateTokens(text) {
|
|
7
|
+
return Math.ceil(text.length / 4);
|
|
8
|
+
}
|
|
9
|
+
/** Format a date string as "Mar 22, 2026". */
|
|
10
|
+
function formatDate(iso) {
|
|
11
|
+
const d = new Date(iso);
|
|
12
|
+
if (isNaN(d.getTime()))
|
|
13
|
+
return iso;
|
|
14
|
+
const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
15
|
+
return `${months[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`;
|
|
16
|
+
}
|
|
17
|
+
/** Get display name for a source tool. */
|
|
18
|
+
function sourceName(source) {
|
|
19
|
+
if (!source)
|
|
20
|
+
return "Unknown";
|
|
21
|
+
return SOURCE_DISPLAY_NAMES[source] ?? source;
|
|
22
|
+
}
|
|
23
|
+
// ── Metadata header (shared across all tiers) ──────────────────
|
|
24
|
+
function renderMetadata(session) {
|
|
25
|
+
const lines = [];
|
|
26
|
+
lines.push(`# Session: ${session.title}`);
|
|
27
|
+
lines.push(`Project: ${session.projectName} | Source: ${sourceName(session.source)} | Date: ${formatDate(session.date)}`);
|
|
28
|
+
const stats = [];
|
|
29
|
+
if (session.durationMinutes > 0)
|
|
30
|
+
stats.push(`${session.durationMinutes}m`);
|
|
31
|
+
stats.push(`${session.turns} turns`);
|
|
32
|
+
if (session.filesChanged.length > 0)
|
|
33
|
+
stats.push(`${session.filesChanged.length} files`);
|
|
34
|
+
if (session.linesOfCode > 0)
|
|
35
|
+
stats.push(`${formatLoc(session.linesOfCode)} LOC`);
|
|
36
|
+
lines.push(`Duration: ${stats.join(" | ")}`);
|
|
37
|
+
if (session.skills.length > 0) {
|
|
38
|
+
lines.push(`Skills: ${session.skills.join(", ")}`);
|
|
39
|
+
}
|
|
40
|
+
return lines.join("\n");
|
|
41
|
+
}
|
|
42
|
+
// ── Context block ──────────────────────────────────────────────
|
|
43
|
+
function renderContext(session) {
|
|
44
|
+
if (!session.context)
|
|
45
|
+
return "";
|
|
46
|
+
return `\n## Context\n${session.context}`;
|
|
47
|
+
}
|
|
48
|
+
// ── Execution path ─────────────────────────────────────────────
|
|
49
|
+
function renderExecutionPath(steps) {
|
|
50
|
+
if (steps.length === 0)
|
|
51
|
+
return "";
|
|
52
|
+
const lines = steps.map((s) => `${s.stepNumber}. ${s.title} — ${s.description}`);
|
|
53
|
+
return `\n## Execution Path\n${lines.join("\n")}`;
|
|
54
|
+
}
|
|
55
|
+
// ── Files changed ──────────────────────────────────────────────
|
|
56
|
+
function renderFilesChanged(files) {
|
|
57
|
+
if (files.length === 0)
|
|
58
|
+
return "";
|
|
59
|
+
const lines = files.map((f) => `${f.path} (+${f.additions}, -${f.deletions})`);
|
|
60
|
+
return `\n## Files Changed\n${lines.join("\n")}`;
|
|
61
|
+
}
|
|
62
|
+
// ── Key exchanges (summary tier) ───────────────────────────────
|
|
63
|
+
/** Determine if a turn is a "key exchange" worth including in summary. */
|
|
64
|
+
function isKeyExchange(turn, index, turns) {
|
|
65
|
+
// Always exclude thinking blocks
|
|
66
|
+
if (turn.type === "thinking")
|
|
67
|
+
return false;
|
|
68
|
+
// Include user prompts (questions/directives)
|
|
69
|
+
if (turn.type === "prompt")
|
|
70
|
+
return true;
|
|
71
|
+
// Include error outputs
|
|
72
|
+
if (turn.type === "error")
|
|
73
|
+
return true;
|
|
74
|
+
// Include assistant responses that precede tool use (plans)
|
|
75
|
+
if (turn.type === "response") {
|
|
76
|
+
const next = turns[index + 1];
|
|
77
|
+
if (next && next.type === "tool")
|
|
78
|
+
return true;
|
|
79
|
+
// Include if it's the last response (conclusion)
|
|
80
|
+
const remaining = turns.slice(index + 1);
|
|
81
|
+
if (remaining.every((t) => t.type !== "response"))
|
|
82
|
+
return true;
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
// For tool turns: include edits/writes, errors in output
|
|
86
|
+
if (turn.type === "tool") {
|
|
87
|
+
if (turn.toolName === "Edit" || turn.toolName === "Write")
|
|
88
|
+
return true;
|
|
89
|
+
if (turn.toolOutput && turn.toolOutput.toLowerCase().includes("error"))
|
|
90
|
+
return true;
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
/** Format a turn for the key exchanges section. */
|
|
96
|
+
function formatTurnForExchange(turn) {
|
|
97
|
+
if (turn.type === "prompt") {
|
|
98
|
+
const text = truncate(turn.content, 300);
|
|
99
|
+
return `[User]: ${text}`;
|
|
100
|
+
}
|
|
101
|
+
if (turn.type === "response") {
|
|
102
|
+
const text = truncate(turn.content, 300);
|
|
103
|
+
return `[Assistant]: ${text}`;
|
|
104
|
+
}
|
|
105
|
+
if (turn.type === "error") {
|
|
106
|
+
return `[Error]: ${truncate(turn.content, 200)}`;
|
|
107
|
+
}
|
|
108
|
+
if (turn.type === "tool") {
|
|
109
|
+
return formatToolTurn(turn);
|
|
110
|
+
}
|
|
111
|
+
return `[${turn.type}]: ${truncate(turn.content, 200)}`;
|
|
112
|
+
}
|
|
113
|
+
/** Format a tool turn, summarizing large outputs. */
|
|
114
|
+
function formatToolTurn(turn) {
|
|
115
|
+
const name = turn.toolName ?? "Tool";
|
|
116
|
+
if (name === "Read") {
|
|
117
|
+
return `[Tool:Read]: ${turn.toolInput ?? "unknown file"}`;
|
|
118
|
+
}
|
|
119
|
+
if (name === "Edit") {
|
|
120
|
+
const path = turn.toolInput ?? "unknown file";
|
|
121
|
+
return `[Tool:Edit]: ${path}`;
|
|
122
|
+
}
|
|
123
|
+
if (name === "Write") {
|
|
124
|
+
const path = turn.toolInput ?? "unknown file";
|
|
125
|
+
return `[Tool:Write]: ${path}`;
|
|
126
|
+
}
|
|
127
|
+
if (name === "Bash") {
|
|
128
|
+
const cmd = turn.toolInput ?? turn.content;
|
|
129
|
+
return `[Tool:Bash]: ${truncate(cmd, 150)}`;
|
|
130
|
+
}
|
|
131
|
+
if (name === "Grep" || name === "Glob") {
|
|
132
|
+
return `[Tool:${name}]: ${turn.toolInput ?? ""}`;
|
|
133
|
+
}
|
|
134
|
+
return `[Tool:${name}]: ${truncate(turn.toolInput ?? turn.content, 150)}`;
|
|
135
|
+
}
|
|
136
|
+
/** Format a turn for the full tier (includes tool output). */
|
|
137
|
+
function formatTurnFull(turn) {
|
|
138
|
+
if (turn.type === "thinking")
|
|
139
|
+
return "";
|
|
140
|
+
if (turn.type === "tool") {
|
|
141
|
+
const base = formatToolTurn(turn);
|
|
142
|
+
if (turn.toolOutput) {
|
|
143
|
+
// Summarize large tool outputs
|
|
144
|
+
if (turn.toolOutput.length > 500) {
|
|
145
|
+
const preview = turn.toolOutput.slice(0, 200).trim();
|
|
146
|
+
return `${base}\n → [${turn.toolOutput.length} chars] ${preview}...`;
|
|
147
|
+
}
|
|
148
|
+
return `${base}\n → ${turn.toolOutput}`;
|
|
149
|
+
}
|
|
150
|
+
return base;
|
|
151
|
+
}
|
|
152
|
+
return formatTurnForExchange(turn);
|
|
153
|
+
}
|
|
154
|
+
function truncate(text, maxLen) {
|
|
155
|
+
const cleaned = text.replace(/\n+/g, " ").trim();
|
|
156
|
+
if (cleaned.length <= maxLen)
|
|
157
|
+
return cleaned;
|
|
158
|
+
return cleaned.slice(0, maxLen - 3) + "...";
|
|
159
|
+
}
|
|
160
|
+
// ── Tier renderers ─────────────────────────────────────────────
|
|
161
|
+
export function renderCompact(session) {
|
|
162
|
+
const parts = [
|
|
163
|
+
renderMetadata(session),
|
|
164
|
+
renderContext(session),
|
|
165
|
+
renderExecutionPath(session.executionPath),
|
|
166
|
+
];
|
|
167
|
+
return parts.filter(Boolean).join("\n");
|
|
168
|
+
}
|
|
169
|
+
function renderSummary(session, turns) {
|
|
170
|
+
const keyExchanges = turns
|
|
171
|
+
.map((turn, i) => ({ turn, i }))
|
|
172
|
+
.filter(({ turn, i }) => isKeyExchange(turn, i, turns))
|
|
173
|
+
.map(({ turn }) => formatTurnForExchange(turn));
|
|
174
|
+
const parts = [
|
|
175
|
+
renderMetadata(session),
|
|
176
|
+
renderContext(session),
|
|
177
|
+
renderExecutionPath(session.executionPath),
|
|
178
|
+
];
|
|
179
|
+
if (keyExchanges.length > 0) {
|
|
180
|
+
parts.push(`\n## Key Exchanges\n${keyExchanges.join("\n")}`);
|
|
181
|
+
}
|
|
182
|
+
parts.push(renderFilesChanged(session.filesChanged));
|
|
183
|
+
return parts.filter(Boolean).join("\n");
|
|
184
|
+
}
|
|
185
|
+
function renderFull(session, turns) {
|
|
186
|
+
const allTurns = turns
|
|
187
|
+
.map((turn) => formatTurnFull(turn))
|
|
188
|
+
.filter(Boolean);
|
|
189
|
+
const parts = [
|
|
190
|
+
renderMetadata(session),
|
|
191
|
+
renderContext(session),
|
|
192
|
+
renderExecutionPath(session.executionPath),
|
|
193
|
+
];
|
|
194
|
+
if (allTurns.length > 0) {
|
|
195
|
+
parts.push(`\n## Conversation\n${allTurns.join("\n")}`);
|
|
196
|
+
}
|
|
197
|
+
parts.push(renderFilesChanged(session.filesChanged));
|
|
198
|
+
return parts.filter(Boolean).join("\n");
|
|
199
|
+
}
|
|
200
|
+
// ── Main export function ───────────────────────────────────────
|
|
201
|
+
/**
|
|
202
|
+
* Export a session as compressed Markdown for AI context consumption.
|
|
203
|
+
*
|
|
204
|
+
* @param session - A fully loaded Session object from the analyzer
|
|
205
|
+
* @param turns - The ParsedTurn[] from the analyzer input (needed for full content)
|
|
206
|
+
* @param options - Export options (tier selection)
|
|
207
|
+
* @returns ExportResult with content string, estimated token count, and tier used
|
|
208
|
+
*/
|
|
209
|
+
export function exportSessionContext(session, turns, options = {}) {
|
|
210
|
+
const tier = options.tier ?? "summary";
|
|
211
|
+
let content;
|
|
212
|
+
switch (tier) {
|
|
213
|
+
case "compact":
|
|
214
|
+
content = renderCompact(session);
|
|
215
|
+
break;
|
|
216
|
+
case "full":
|
|
217
|
+
content = renderFull(session, turns);
|
|
218
|
+
break;
|
|
219
|
+
case "summary":
|
|
220
|
+
default:
|
|
221
|
+
content = renderSummary(session, turns);
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
content,
|
|
226
|
+
tokens: estimateTokens(content),
|
|
227
|
+
tier,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=context-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-export.js","sourceRoot":"","sources":["../src/context-export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Map process.platform + process.arch to the asset name produced by CI.
|
|
3
|
+
* Returns null if the current platform is unsupported.
|
|
4
|
+
*/
|
|
5
|
+
export declare function getAssetName(): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Returns the directory where the daemon binary is stored.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getDaemonDir(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Returns the full path to the daemon binary.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getDaemonBinaryPath(): string;
|
|
14
|
+
export interface InstallResult {
|
|
15
|
+
version: string;
|
|
16
|
+
binaryPath: string;
|
|
17
|
+
assetName: string;
|
|
18
|
+
size: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Download and install the daemon binary for the current platform.
|
|
22
|
+
*/
|
|
23
|
+
export declare function installDaemon(onProgress?: (message: string) => void): Promise<InstallResult>;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// Download and install the heyiam tray daemon binary from GitHub releases.
|
|
2
|
+
//
|
|
3
|
+
// Detects platform + arch, fetches the correct binary from the latest
|
|
4
|
+
// daemon release, and saves it to ~/.config/heyiam/daemon/heyiam-tray.
|
|
5
|
+
import { createWriteStream, mkdirSync, chmodSync, existsSync, renameSync, unlinkSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { homedir } from 'node:os';
|
|
8
|
+
import { pipeline } from 'node:stream/promises';
|
|
9
|
+
import { Readable } from 'node:stream';
|
|
10
|
+
const GITHUB_REPO = 'interactivecats/heyi.am';
|
|
11
|
+
const RELEASES_API = `https://api.github.com/repos/${GITHUB_REPO}/releases`;
|
|
12
|
+
/**
|
|
13
|
+
* Map process.platform + process.arch to the asset name produced by CI.
|
|
14
|
+
* Returns null if the current platform is unsupported.
|
|
15
|
+
*/
|
|
16
|
+
export function getAssetName() {
|
|
17
|
+
const platform = process.platform;
|
|
18
|
+
const arch = process.arch;
|
|
19
|
+
if (platform === 'darwin' && arch === 'arm64')
|
|
20
|
+
return 'heyiam-tray-darwin-arm64';
|
|
21
|
+
if (platform === 'darwin' && arch === 'x64')
|
|
22
|
+
return 'heyiam-tray-darwin-x64';
|
|
23
|
+
if (platform === 'linux' && arch === 'x64')
|
|
24
|
+
return 'heyiam-tray-linux-x64';
|
|
25
|
+
if (platform === 'win32' && arch === 'x64')
|
|
26
|
+
return 'heyiam-tray-windows-x64.exe';
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Returns the directory where the daemon binary is stored.
|
|
31
|
+
*/
|
|
32
|
+
export function getDaemonDir() {
|
|
33
|
+
return join(homedir(), '.config', 'heyiam', 'daemon');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Returns the full path to the daemon binary.
|
|
37
|
+
*/
|
|
38
|
+
export function getDaemonBinaryPath() {
|
|
39
|
+
const ext = process.platform === 'win32' ? '.exe' : '';
|
|
40
|
+
return join(getDaemonDir(), `heyiam-tray${ext}`);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Fetch the latest daemon release from GitHub.
|
|
44
|
+
* Only considers releases whose tag starts with "daemon-v".
|
|
45
|
+
*/
|
|
46
|
+
async function fetchLatestDaemonRelease() {
|
|
47
|
+
const response = await fetch(`${RELEASES_API}?per_page=20`, {
|
|
48
|
+
headers: {
|
|
49
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
50
|
+
'User-Agent': 'heyiam-cli',
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
throw new Error(`GitHub API returned ${response.status}: ${response.statusText}`);
|
|
55
|
+
}
|
|
56
|
+
const releases = await response.json();
|
|
57
|
+
const daemonRelease = releases.find(r => r.tag_name.startsWith('daemon-v'));
|
|
58
|
+
if (!daemonRelease) {
|
|
59
|
+
throw new Error('No daemon release found. Check https://github.com/interactivecats/heyi.am/releases');
|
|
60
|
+
}
|
|
61
|
+
return daemonRelease;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Download a file from a URL to a local path.
|
|
65
|
+
* Uses a temp file + rename for atomicity -- a partial download
|
|
66
|
+
* never overwrites an existing working binary.
|
|
67
|
+
*/
|
|
68
|
+
async function downloadFile(url, destPath, onProgress) {
|
|
69
|
+
const response = await fetch(url, {
|
|
70
|
+
headers: { 'User-Agent': 'heyiam-cli' },
|
|
71
|
+
redirect: 'follow',
|
|
72
|
+
});
|
|
73
|
+
if (!response.ok) {
|
|
74
|
+
throw new Error(`Download failed: ${response.status} ${response.statusText}`);
|
|
75
|
+
}
|
|
76
|
+
const total = parseInt(response.headers.get('content-length') ?? '0', 10);
|
|
77
|
+
const tmpPath = destPath + '.tmp';
|
|
78
|
+
// Clean up any prior partial download
|
|
79
|
+
if (existsSync(tmpPath)) {
|
|
80
|
+
unlinkSync(tmpPath);
|
|
81
|
+
}
|
|
82
|
+
const fileStream = createWriteStream(tmpPath);
|
|
83
|
+
const body = response.body;
|
|
84
|
+
if (!body) {
|
|
85
|
+
throw new Error('Response body is null');
|
|
86
|
+
}
|
|
87
|
+
let downloaded = 0;
|
|
88
|
+
const reader = body.getReader();
|
|
89
|
+
const nodeStream = new Readable({
|
|
90
|
+
async read() {
|
|
91
|
+
const { done, value } = await reader.read();
|
|
92
|
+
if (done) {
|
|
93
|
+
this.push(null);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
downloaded += value.byteLength;
|
|
97
|
+
if (onProgress && total > 0) {
|
|
98
|
+
onProgress(downloaded, total);
|
|
99
|
+
}
|
|
100
|
+
this.push(Buffer.from(value));
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
await pipeline(nodeStream, fileStream);
|
|
104
|
+
// Atomic rename: only replace the binary once download is fully complete
|
|
105
|
+
renameSync(tmpPath, destPath);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Download and install the daemon binary for the current platform.
|
|
109
|
+
*/
|
|
110
|
+
export async function installDaemon(onProgress) {
|
|
111
|
+
const assetName = getAssetName();
|
|
112
|
+
if (!assetName) {
|
|
113
|
+
throw new Error(`Unsupported platform: ${process.platform}-${process.arch}. ` +
|
|
114
|
+
'Supported: darwin-arm64, darwin-x64, linux-x64, windows-x64');
|
|
115
|
+
}
|
|
116
|
+
const log = onProgress ?? (() => { });
|
|
117
|
+
log(' Checking for latest daemon release...');
|
|
118
|
+
const release = await fetchLatestDaemonRelease();
|
|
119
|
+
const asset = release.assets.find(a => a.name === assetName);
|
|
120
|
+
if (!asset) {
|
|
121
|
+
const available = release.assets.map(a => a.name).join(', ');
|
|
122
|
+
throw new Error(`No binary found for ${assetName} in release ${release.tag_name}. ` +
|
|
123
|
+
`Available assets: ${available}`);
|
|
124
|
+
}
|
|
125
|
+
const daemonDir = getDaemonDir();
|
|
126
|
+
mkdirSync(daemonDir, { recursive: true });
|
|
127
|
+
const binaryPath = getDaemonBinaryPath();
|
|
128
|
+
log(` Downloading ${assetName} (${formatBytes(asset.size)})...`);
|
|
129
|
+
let lastPct = -1;
|
|
130
|
+
await downloadFile(asset.browser_download_url, binaryPath, (downloaded, total) => {
|
|
131
|
+
const pct = Math.floor((downloaded / total) * 100);
|
|
132
|
+
if (pct !== lastPct && pct % 10 === 0) {
|
|
133
|
+
lastPct = pct;
|
|
134
|
+
log(` Downloading... ${pct}%`);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
// Make executable on unix
|
|
138
|
+
if (process.platform !== 'win32') {
|
|
139
|
+
chmodSync(binaryPath, 0o755);
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
version: release.tag_name,
|
|
143
|
+
binaryPath,
|
|
144
|
+
assetName,
|
|
145
|
+
size: asset.size,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function formatBytes(bytes) {
|
|
149
|
+
if (bytes < 1024)
|
|
150
|
+
return `${bytes} B`;
|
|
151
|
+
if (bytes < 1024 * 1024)
|
|
152
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
153
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=daemon-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-install.js","sourceRoot":"","sources":["../src/daemon-install.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import type { SessionAnalysis } from './parsers/types.js';
|
|
3
|
+
import type { ParsedTurn, ParsedFileChange, Session } from './analyzer.js';
|
|
4
|
+
import type { SessionMeta } from './parsers/index.js';
|
|
5
|
+
export declare const DB_PATH: string;
|
|
6
|
+
export interface SessionRow {
|
|
7
|
+
id: string;
|
|
8
|
+
project_dir: string;
|
|
9
|
+
source: string;
|
|
10
|
+
title: string | null;
|
|
11
|
+
start_time: string | null;
|
|
12
|
+
end_time: string | null;
|
|
13
|
+
duration_minutes: number | null;
|
|
14
|
+
wall_clock_minutes: number | null;
|
|
15
|
+
turns: number | null;
|
|
16
|
+
loc_added: number | null;
|
|
17
|
+
loc_removed: number | null;
|
|
18
|
+
loc_net: number | null;
|
|
19
|
+
files_changed: number | null;
|
|
20
|
+
tool_calls: number | null;
|
|
21
|
+
skills: string | null;
|
|
22
|
+
files_touched: string | null;
|
|
23
|
+
models_used: string | null;
|
|
24
|
+
cwd: string | null;
|
|
25
|
+
parent_session_id: string | null;
|
|
26
|
+
agent_role: string | null;
|
|
27
|
+
is_subagent: number;
|
|
28
|
+
file_path: string | null;
|
|
29
|
+
file_mtime: number | null;
|
|
30
|
+
file_size: number | null;
|
|
31
|
+
indexed_at: string | null;
|
|
32
|
+
context_summary: string | null;
|
|
33
|
+
}
|
|
34
|
+
/** Stats shape compatible with the old SessionStats from server.ts */
|
|
35
|
+
export interface SessionStats {
|
|
36
|
+
loc: number;
|
|
37
|
+
duration: number;
|
|
38
|
+
files: number;
|
|
39
|
+
turns: number;
|
|
40
|
+
skills: string[];
|
|
41
|
+
date: string;
|
|
42
|
+
endTime?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ProjectStats {
|
|
45
|
+
projectDir: string;
|
|
46
|
+
projectName: string;
|
|
47
|
+
sessionCount: number;
|
|
48
|
+
totalLoc: number;
|
|
49
|
+
totalDuration: number;
|
|
50
|
+
totalTurns: number;
|
|
51
|
+
skills: string[];
|
|
52
|
+
sources: string[];
|
|
53
|
+
latestDate: string;
|
|
54
|
+
}
|
|
55
|
+
export declare function getDatabase(dbPath?: string): Database.Database;
|
|
56
|
+
export declare function openDatabase(dbPath?: string): Database.Database;
|
|
57
|
+
export declare function isSessionStale(db: Database.Database, sessionId: string, filePath: string): boolean;
|
|
58
|
+
export interface UpsertSessionInput {
|
|
59
|
+
meta: SessionMeta;
|
|
60
|
+
analysis: SessionAnalysis;
|
|
61
|
+
session: Session;
|
|
62
|
+
fileMtime: number;
|
|
63
|
+
fileSize: number;
|
|
64
|
+
contextSummary?: string;
|
|
65
|
+
}
|
|
66
|
+
export declare function upsertSession(db: Database.Database, input: UpsertSessionInput): void;
|
|
67
|
+
export declare function indexSessionContent(db: Database.Database, sessionId: string, turns: ParsedTurn[]): void;
|
|
68
|
+
export declare function indexSessionFiles(db: Database.Database, sessionId: string, files: ParsedFileChange[]): void;
|
|
69
|
+
export declare function indexSession(db: Database.Database, input: UpsertSessionInput, turns: ParsedTurn[]): void;
|
|
70
|
+
export declare function getSessionStats(db: Database.Database, sessionId: string): SessionStats | null;
|
|
71
|
+
export declare function getAllProjectStats(db: Database.Database): ProjectStats[];
|
|
72
|
+
export declare function getSessionRow(db: Database.Database, sessionId: string): SessionRow | null;
|
|
73
|
+
export declare function getContextSummary(db: Database.Database, sessionId: string): string | null;
|
|
74
|
+
export declare function getSessionsByProject(db: Database.Database, projectDir: string): SessionRow[];
|
|
75
|
+
export declare function deleteSession(db: Database.Database, sessionId: string): void;
|
|
76
|
+
export declare function rebuildIndex(db: Database.Database, onProgress?: (current: number, total: number) => void): void;
|
|
77
|
+
/** F17: Merge FTS5 segments for better query performance. Call after bulk indexing. */
|
|
78
|
+
export declare function optimizeFtsIndex(db: Database.Database): void;
|
|
79
|
+
/** Count sessions whose source file no longer exists (preserved in DB). */
|
|
80
|
+
export declare function countPreservedSessions(db: Database.Database): number;
|
|
81
|
+
export interface FtsSearchResult {
|
|
82
|
+
sessionId: string;
|
|
83
|
+
snippet: string;
|
|
84
|
+
rank: number;
|
|
85
|
+
}
|
|
86
|
+
export declare function searchFts(db: Database.Database, query: string, limit?: number): FtsSearchResult[];
|
|
87
|
+
export declare function searchByFile(db: Database.Database, filePath: string): Array<{
|
|
88
|
+
sessionId: string;
|
|
89
|
+
additions: number;
|
|
90
|
+
deletions: number;
|
|
91
|
+
}>;
|
|
92
|
+
export interface SessionMetaFromDb {
|
|
93
|
+
path: string;
|
|
94
|
+
source: string;
|
|
95
|
+
sessionId: string;
|
|
96
|
+
projectDir: string;
|
|
97
|
+
isSubagent: boolean;
|
|
98
|
+
parentSessionId?: string;
|
|
99
|
+
agentRole?: string;
|
|
100
|
+
}
|
|
101
|
+
export declare function getAllSessionMetas(db: Database.Database): SessionMetaFromDb[];
|
|
102
|
+
export declare function getSessionCount(db: Database.Database): number;
|
|
103
|
+
export interface DashboardStats {
|
|
104
|
+
sessionCount: number;
|
|
105
|
+
projectCount: number;
|
|
106
|
+
sourceCount: number;
|
|
107
|
+
projects: Array<{
|
|
108
|
+
projectDir: string;
|
|
109
|
+
projectName: string;
|
|
110
|
+
sessionCount: number;
|
|
111
|
+
totalLoc: number;
|
|
112
|
+
totalDuration: number;
|
|
113
|
+
skills: string[];
|
|
114
|
+
latestDate: string;
|
|
115
|
+
}>;
|
|
116
|
+
}
|
|
117
|
+
export declare function getDashboardStats(db: Database.Database): DashboardStats;
|