@snoglobe/helios 0.3.4 → 0.3.6
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/cli/export.d.ts +1 -1
- package/dist/core/orchestrator.d.ts +2 -1
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js +18 -17
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/providers/claude/provider.d.ts +1 -1
- package/dist/providers/claude/provider.d.ts.map +1 -1
- package/dist/providers/claude/provider.js +21 -5
- package/dist/providers/claude/provider.js.map +1 -1
- package/dist/providers/openai/provider.d.ts +1 -1
- package/dist/providers/openai/provider.d.ts.map +1 -1
- package/dist/providers/openai/provider.js +21 -4
- package/dist/providers/openai/provider.js.map +1 -1
- package/dist/providers/types.d.ts +3 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/skills/executor.d.ts.map +1 -1
- package/dist/skills/executor.js +10 -4
- package/dist/skills/executor.js.map +1 -1
- package/dist/store/session-store.d.ts +3 -0
- package/dist/store/session-store.d.ts.map +1 -1
- package/dist/store/session-store.js +14 -1
- package/dist/store/session-store.js.map +1 -1
- package/dist/ui/components/input-bar.d.ts.map +1 -1
- package/dist/ui/components/input-bar.js +42 -31
- package/dist/ui/components/input-bar.js.map +1 -1
- package/dist/ui/layout.d.ts.map +1 -1
- package/dist/ui/layout.js +48 -47
- package/dist/ui/layout.js.map +1 -1
- package/dist/ui/panels/conversation.d.ts +4 -6
- package/dist/ui/panels/conversation.d.ts.map +1 -1
- package/dist/ui/panels/conversation.js +5 -11
- package/dist/ui/panels/conversation.js.map +1 -1
- package/package.json +1 -1
package/dist/skills/executor.js
CHANGED
|
@@ -52,6 +52,7 @@ async function* runOnce(skill, args, input, provider, tools, orch) {
|
|
|
52
52
|
const session = await provider.createSession({
|
|
53
53
|
systemPrompt,
|
|
54
54
|
model: skill.config.model ?? undefined,
|
|
55
|
+
ephemeral: true,
|
|
55
56
|
});
|
|
56
57
|
const stream = provider.send(session, input, tools);
|
|
57
58
|
try {
|
|
@@ -86,12 +87,17 @@ export async function* executeSkill(skill, args, input, ctx) {
|
|
|
86
87
|
yield { type: "error", error: new Error(`No provider available for skill "${skill.name}"`), recoverable: false };
|
|
87
88
|
return;
|
|
88
89
|
}
|
|
89
|
-
//
|
|
90
|
-
if (skill.config.provider
|
|
91
|
-
|
|
90
|
+
// Ensure the provider is authenticated (skills can target any provider)
|
|
91
|
+
if (skill.config.provider) {
|
|
92
|
+
try {
|
|
93
|
+
if (!(await provider.isAuthenticated())) {
|
|
94
|
+
await provider.authenticate();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
92
98
|
yield {
|
|
93
99
|
type: "error",
|
|
94
|
-
error:
|
|
100
|
+
error: err instanceof Error ? err : new Error(String(err)),
|
|
95
101
|
recoverable: false,
|
|
96
102
|
};
|
|
97
103
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/skills/executor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/skills/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,11 +20,14 @@ export interface SessionSummary {
|
|
|
20
20
|
inputTokens: number;
|
|
21
21
|
outputTokens: number;
|
|
22
22
|
}
|
|
23
|
+
/** Create an in-memory session that is NOT persisted to the database. */
|
|
24
|
+
export declare function createEphemeralSession(providerId: string): Session;
|
|
23
25
|
export declare class SessionStore {
|
|
24
26
|
private agentId;
|
|
25
27
|
constructor(agentId?: string);
|
|
26
28
|
createSession(provider: string, model?: string, providerSessionId?: string): Session;
|
|
27
29
|
getSession(id: string): Session | null;
|
|
30
|
+
updateProviderSessionId(sessionId: string, providerSessionId: string): void;
|
|
28
31
|
updateLastActive(sessionId: string): void;
|
|
29
32
|
addCost(sessionId: string, costUsd: number, inputTokens: number, outputTokens: number): void;
|
|
30
33
|
addMessage(sessionId: string, role: StoredMessage["role"], content: string, toolCalls?: string, tokenCount?: number): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/store/session-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGrD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,SAAK;IAIxB,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO;IAmBV,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAiBtC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQzC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAO5F,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI;IAeP,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,aAAa,EAAE;IAmB5D,YAAY,CAAC,KAAK,SAAK,GAAG,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/store/session-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGrD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,yEAAyE;AACzE,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAGlE;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,SAAK;IAIxB,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO;IAmBV,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAiBtC,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI;IAQ3E,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQzC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAO5F,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI;IAeP,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,aAAa,EAAE;IAmB5D,YAAY,CAAC,KAAK,SAAK,GAAG,OAAO,EAAE;IAoBnC,oBAAoB,CAAC,KAAK,SAAK,GAAG,cAAc,EAAE;CA0CnD"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { nanoid } from "nanoid";
|
|
2
2
|
import { getDb } from "./database.js";
|
|
3
3
|
import { truncate } from "../ui/format.js";
|
|
4
|
+
/** Create an in-memory session that is NOT persisted to the database. */
|
|
5
|
+
export function createEphemeralSession(providerId) {
|
|
6
|
+
const now = Date.now();
|
|
7
|
+
return { id: `eph-${nanoid()}`, providerId, createdAt: now, lastActiveAt: now };
|
|
8
|
+
}
|
|
4
9
|
export class SessionStore {
|
|
5
10
|
agentId;
|
|
6
11
|
constructor(agentId = "") {
|
|
@@ -35,6 +40,10 @@ export class SessionStore {
|
|
|
35
40
|
lastActiveAt: row.last_active_at,
|
|
36
41
|
};
|
|
37
42
|
}
|
|
43
|
+
updateProviderSessionId(sessionId, providerSessionId) {
|
|
44
|
+
const db = getDb();
|
|
45
|
+
db.prepare("UPDATE sessions SET provider_session_id = ? WHERE id = ?").run(providerSessionId, sessionId);
|
|
46
|
+
}
|
|
38
47
|
updateLastActive(sessionId) {
|
|
39
48
|
const db = getDb();
|
|
40
49
|
db.prepare("UPDATE sessions SET last_active_at = ? WHERE id = ?").run(Date.now(), sessionId);
|
|
@@ -66,7 +75,10 @@ export class SessionStore {
|
|
|
66
75
|
listSessions(limit = 20) {
|
|
67
76
|
const db = getDb();
|
|
68
77
|
const rows = db
|
|
69
|
-
.prepare(
|
|
78
|
+
.prepare(`SELECT * FROM sessions s
|
|
79
|
+
WHERE s.agent_id = ?
|
|
80
|
+
AND EXISTS (SELECT 1 FROM messages m WHERE m.session_id = s.id)
|
|
81
|
+
ORDER BY s.last_active_at DESC LIMIT ?`)
|
|
70
82
|
.all(this.agentId, limit);
|
|
71
83
|
return rows.map((row) => ({
|
|
72
84
|
id: row.id,
|
|
@@ -96,6 +108,7 @@ export class SessionStore {
|
|
|
96
108
|
LEFT JOIN messages m ON m.session_id = s.id
|
|
97
109
|
WHERE s.agent_id = ?
|
|
98
110
|
GROUP BY s.id
|
|
111
|
+
HAVING COUNT(m.id) > 0
|
|
99
112
|
ORDER BY s.last_active_at DESC
|
|
100
113
|
LIMIT ?`)
|
|
101
114
|
.all(this.agentId, limit);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/store/session-store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/store/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAyB3C,yEAAyE;AACzE,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO,EAAE,EAAE,EAAE,OAAO,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,OAAO,YAAY;IACf,OAAO,CAAS;IAExB,YAAY,OAAO,GAAG,EAAE;QACtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,aAAa,CACX,QAAgB,EAChB,KAAc,EACd,iBAA0B;QAE1B,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QAEnB,EAAE,CAAC,OAAO,CACR;8CACwC,CACzC,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,iBAAiB,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEtF,OAAO;YACL,EAAE;YACF,UAAU,EAAE,QAAQ;YACpB,iBAAiB;YACjB,SAAS,EAAE,GAAG;YACd,YAAY,EAAE,GAAG;SAClB,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,qCAAqC,CAAC;aAC9C,GAAG,CAAC,EAAE,CAAwC,CAAC;QAElD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,UAAU,EAAE,GAAG,CAAC,QAAkB;YAClC,iBAAiB,EAAE,GAAG,CAAC,mBAAyC;YAChE,SAAS,EAAE,GAAG,CAAC,UAAoB;YACnC,YAAY,EAAE,GAAG,CAAC,cAAwB;SAC3C,CAAC;IACJ,CAAC;IAED,uBAAuB,CAAC,SAAiB,EAAE,iBAAyB;QAClE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CACxE,iBAAiB,EACjB,SAAS,CACV,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,SAAiB;QAChC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,CACnE,IAAI,CAAC,GAAG,EAAE,EACV,SAAS,CACV,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,SAAiB,EAAE,OAAe,EAAE,WAAmB,EAAE,YAAoB;QACnF,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,EAAE,CAAC,OAAO,CACR,8HAA8H,CAC/H,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,UAAU,CACR,SAAiB,EACjB,IAA2B,EAC3B,OAAe,EACf,SAAkB,EAClB,UAAmB;QAEnB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,EAAE,CAAC,OAAO,CACR;iCAC2B,CAC5B,CAAC,GAAG,CACH,SAAS,EACT,IAAI,EACJ,OAAO,EACP,SAAS,IAAI,IAAI,EACjB,UAAU,IAAI,IAAI,EAClB,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE,KAAK,GAAG,GAAG;QACxC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN,4EAA4E,CAC7E;aACA,GAAG,CAAC,SAAS,EAAE,KAAK,CAA8B,CAAC;QAEtD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,SAAS,EAAE,GAAG,CAAC,UAAoB;YACnC,IAAI,EAAE,GAAG,CAAC,IAA6B;YACvC,OAAO,EAAE,GAAG,CAAC,OAAiB;YAC9B,SAAS,EAAE,GAAG,CAAC,UAAgC;YAC/C,UAAU,EAAE,GAAG,CAAC,WAAiC;YACjD,SAAS,EAAE,GAAG,CAAC,SAAmB;SACnC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,YAAY,CAAC,KAAK,GAAG,EAAE;QACrB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN;;;gDAGwC,CACzC;aACA,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAA8B,CAAC;QAEzD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,UAAU,EAAE,GAAG,CAAC,QAAkB;YAClC,iBAAiB,EAAE,GAAG,CAAC,mBAAyC;YAChE,SAAS,EAAE,GAAG,CAAC,UAAoB;YACnC,YAAY,EAAE,GAAG,CAAC,cAAwB;SAC3C,CAAC,CAAC,CAAC;IACN,CAAC;IAED,oBAAoB,CAAC,KAAK,GAAG,EAAE;QAC7B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN;;;;;;;;;;;;;;;;;;;iBAmBS,CACV;aACA,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAA8B,CAAC;QAEzD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,QAAQ,EAAE,GAAG,CAAC,QAAkB;YAChC,KAAK,EAAG,GAAG,CAAC,KAAuB,IAAI,IAAI;YAC3C,SAAS,EAAE,GAAG,CAAC,UAAoB;YACnC,YAAY,EAAE,GAAG,CAAC,cAAwB;YAC1C,YAAY,EAAE,GAAG,CAAC,aAAuB;YACzC,OAAO,EAAG,GAAG,CAAC,QAAmB,IAAI,CAAC;YACtC,WAAW,EAAG,GAAG,CAAC,YAAuB,IAAI,CAAC;YAC9C,YAAY,EAAG,GAAG,CAAC,aAAwB,IAAI,CAAC;YAChD,gBAAgB,EAAE,GAAG,CAAC,kBAAkB;gBACtC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,kBAA4B,EAAE,EAAE,EAAE,IAAI,CAAC;gBACtD,CAAC,CAAC,IAAI;SACT,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-bar.d.ts","sourceRoot":"","sources":["../../../src/ui/components/input-bar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,UAAU,aAAa;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,QAAgB,EAChB,WAAiC,EACjC,QAAQ,EAAE,YAAY,GACvB,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"input-bar.d.ts","sourceRoot":"","sources":["../../../src/ui/components/input-bar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,UAAU,aAAa;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,QAAgB,EAChB,WAAiC,EACjC,QAAQ,EAAE,YAAY,GACvB,EAAE,aAAa,2CAsLf"}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useMemo } from "react";
|
|
2
|
+
import { useState, useMemo, useRef } from "react";
|
|
3
3
|
import { Box, Text, useInput } from "ink";
|
|
4
4
|
import { C, G } from "../theme.js";
|
|
5
5
|
export function InputBar({ onSubmit, disabled = false, placeholder = "send a message...", commands: commandsProp, }) {
|
|
6
6
|
const COMMANDS = commandsProp ?? [];
|
|
7
7
|
const [value, setValue] = useState("");
|
|
8
|
+
const valueRef = useRef("");
|
|
8
9
|
const [cursorPos, setCursorPos] = useState(0);
|
|
10
|
+
// Refs track the real-time value and cursor position across batched input
|
|
11
|
+
// events. Without these, fast typing uses stale closure-captured values.
|
|
12
|
+
const cursorRef = useRef(0);
|
|
13
|
+
const moveCursor = (pos) => { cursorRef.current = pos; setCursorPos(pos); };
|
|
14
|
+
const setVal = (v) => { valueRef.current = v; setValue(v); };
|
|
9
15
|
const [history, setHistory] = useState([]);
|
|
10
16
|
const [historyIdx, setHistoryIdx] = useState(-1);
|
|
11
17
|
const [selectedIdx, setSelectedIdx] = useState(0);
|
|
@@ -23,42 +29,45 @@ export function InputBar({ onSubmit, disabled = false, placeholder = "send a mes
|
|
|
23
29
|
useInput((input, key) => {
|
|
24
30
|
if (disabled)
|
|
25
31
|
return;
|
|
32
|
+
const pos = cursorRef.current;
|
|
26
33
|
if (key.return) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
setCursorPos(0);
|
|
32
|
-
setHistoryIdx(-1);
|
|
33
|
-
setSelectedIdx(0);
|
|
34
|
+
const trimmed = valueRef.current.trim();
|
|
35
|
+
if (trimmed) {
|
|
36
|
+
onSubmit(trimmed);
|
|
37
|
+
setHistory((h) => [trimmed, ...h].slice(0, 50));
|
|
34
38
|
}
|
|
39
|
+
setVal("");
|
|
40
|
+
moveCursor(0);
|
|
41
|
+
setHistoryIdx(-1);
|
|
42
|
+
setSelectedIdx(0);
|
|
35
43
|
return;
|
|
36
44
|
}
|
|
37
45
|
if (key.tab && showMenu) {
|
|
38
46
|
const cmd = filteredCommands[selectedIdx];
|
|
39
47
|
if (cmd) {
|
|
40
48
|
const completed = `/${cmd.name}${cmd.args ? " " : ""}`;
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
setVal(completed);
|
|
50
|
+
moveCursor(completed.length);
|
|
43
51
|
}
|
|
44
52
|
return;
|
|
45
53
|
}
|
|
46
54
|
if (key.backspace || key.delete) {
|
|
47
|
-
if (
|
|
48
|
-
|
|
49
|
-
|
|
55
|
+
if (pos > 0) {
|
|
56
|
+
const v = valueRef.current;
|
|
57
|
+
setVal(v.slice(0, pos - 1) + v.slice(pos));
|
|
58
|
+
moveCursor(pos - 1);
|
|
50
59
|
}
|
|
51
60
|
setSelectedIdx(0);
|
|
52
61
|
return;
|
|
53
62
|
}
|
|
54
63
|
// Left arrow
|
|
55
64
|
if (key.leftArrow) {
|
|
56
|
-
|
|
65
|
+
moveCursor(Math.max(0, pos - 1));
|
|
57
66
|
return;
|
|
58
67
|
}
|
|
59
68
|
// Right arrow
|
|
60
69
|
if (key.rightArrow) {
|
|
61
|
-
|
|
70
|
+
moveCursor(Math.min(valueRef.current.length, pos + 1));
|
|
62
71
|
return;
|
|
63
72
|
}
|
|
64
73
|
if (key.upArrow) {
|
|
@@ -68,8 +77,8 @@ export function InputBar({ onSubmit, disabled = false, placeholder = "send a mes
|
|
|
68
77
|
else if (history.length > 0) {
|
|
69
78
|
const newIdx = Math.min(historyIdx + 1, history.length - 1);
|
|
70
79
|
setHistoryIdx(newIdx);
|
|
71
|
-
|
|
72
|
-
|
|
80
|
+
setVal(history[newIdx]);
|
|
81
|
+
moveCursor(history[newIdx].length);
|
|
73
82
|
}
|
|
74
83
|
return;
|
|
75
84
|
}
|
|
@@ -80,46 +89,48 @@ export function InputBar({ onSubmit, disabled = false, placeholder = "send a mes
|
|
|
80
89
|
else {
|
|
81
90
|
if (historyIdx <= 0) {
|
|
82
91
|
setHistoryIdx(-1);
|
|
83
|
-
|
|
84
|
-
|
|
92
|
+
setVal("");
|
|
93
|
+
moveCursor(0);
|
|
85
94
|
}
|
|
86
95
|
else {
|
|
87
96
|
const newIdx = historyIdx - 1;
|
|
88
97
|
setHistoryIdx(newIdx);
|
|
89
|
-
|
|
90
|
-
|
|
98
|
+
setVal(history[newIdx]);
|
|
99
|
+
moveCursor(history[newIdx].length);
|
|
91
100
|
}
|
|
92
101
|
}
|
|
93
102
|
return;
|
|
94
103
|
}
|
|
95
104
|
// Home / Ctrl+A
|
|
96
105
|
if (key.ctrl && input === "a") {
|
|
97
|
-
|
|
106
|
+
moveCursor(0);
|
|
98
107
|
return;
|
|
99
108
|
}
|
|
100
109
|
// End / Ctrl+E
|
|
101
110
|
if (key.ctrl && input === "e") {
|
|
102
|
-
|
|
111
|
+
moveCursor(valueRef.current.length);
|
|
103
112
|
return;
|
|
104
113
|
}
|
|
105
114
|
// Ctrl+U — clear line
|
|
106
115
|
if (key.ctrl && input === "u") {
|
|
107
|
-
|
|
108
|
-
|
|
116
|
+
setVal("");
|
|
117
|
+
moveCursor(0);
|
|
109
118
|
return;
|
|
110
119
|
}
|
|
111
120
|
// Ctrl+W — delete word backward
|
|
112
121
|
if (key.ctrl && input === "w") {
|
|
113
|
-
const
|
|
114
|
-
const
|
|
122
|
+
const v = valueRef.current;
|
|
123
|
+
const before = v.slice(0, pos);
|
|
124
|
+
const after = v.slice(pos);
|
|
115
125
|
const trimmed = before.replace(/\S+\s*$/, "");
|
|
116
|
-
|
|
117
|
-
|
|
126
|
+
setVal(trimmed + after);
|
|
127
|
+
moveCursor(trimmed.length);
|
|
118
128
|
return;
|
|
119
129
|
}
|
|
120
130
|
if (input && !key.ctrl && !key.meta) {
|
|
121
|
-
|
|
122
|
-
|
|
131
|
+
const v = valueRef.current;
|
|
132
|
+
setVal(v.slice(0, pos) + input + v.slice(pos));
|
|
133
|
+
moveCursor(pos + input.length);
|
|
123
134
|
setHistoryIdx(-1);
|
|
124
135
|
setSelectedIdx(0);
|
|
125
136
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-bar.js","sourceRoot":"","sources":["../../../src/ui/components/input-bar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"input-bar.js","sourceRoot":"","sources":["../../../src/ui/components/input-bar.tsx"],"names":[],"mappings":"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"}
|
package/dist/ui/layout.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/ui/layout.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/ui/layout.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAchD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AASxD,UAAU,WAAW;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,UAAU,EAAE,CAAC;CACnC;AAID,wBAAgB,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,EAAE,WAAW,2CA8fzG"}
|
package/dist/ui/layout.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useCallback, useRef, useEffect, useMemo } from "react";
|
|
3
|
-
import { Box, Text, useInput, useApp } from "ink";
|
|
3
|
+
import { Box, Text, useInput, useApp, measureElement } from "ink";
|
|
4
4
|
import { useScreenSize } from "fullscreen-ink";
|
|
5
|
-
import {
|
|
6
|
-
import { ConversationPanel } from "./panels/conversation.js";
|
|
5
|
+
import { MessageLine, PulsingIndicator } from "./panels/conversation.js";
|
|
7
6
|
import { TaskListPanel } from "./panels/task-list.js";
|
|
8
7
|
import { MetricsDashboard } from "./panels/metrics-dashboard.js";
|
|
9
8
|
import { StatusBar } from "./components/status-bar.js";
|
|
@@ -16,18 +15,29 @@ import { StickyNotesPanel } from "./panels/sticky-notes.js";
|
|
|
16
15
|
import { VERSION, checkForUpdate } from "../version.js";
|
|
17
16
|
import { COMMANDS, handleSlashCommand } from "./commands.js";
|
|
18
17
|
import { pollTaskStatuses, handleFinishedTasks, buildMonitorMessage } from "../core/task-poller.js";
|
|
19
|
-
import { formatDuration, formatError } from "./format.js";
|
|
18
|
+
import { formatDuration, formatError, truncate } from "./format.js";
|
|
20
19
|
let messageIdCounter = 0;
|
|
21
20
|
export function Layout({ runtime, mouseEmitter, headless, initialPrompt, initialAttachments }) {
|
|
22
21
|
const { orchestrator, sleepManager, connectionPool, executor, metricStore, metricCollector, monitorManager, experimentTracker, memoryStore, stickyManager, agentName, } = runtime;
|
|
23
22
|
const { exit } = useApp();
|
|
24
|
-
const [messages, setMessages] = useState(
|
|
23
|
+
const [messages, setMessages] = useState(() => {
|
|
24
|
+
// If a session was already resumed (via -r / -c flags) before Layout mounted,
|
|
25
|
+
// pre-populate the UI with stored messages so the user can see conversation history.
|
|
26
|
+
const session = orchestrator.activeSession;
|
|
27
|
+
if (!session)
|
|
28
|
+
return [];
|
|
29
|
+
const stored = orchestrator.sessionStore.getMessages(session.id, 500);
|
|
30
|
+
return stored
|
|
31
|
+
.filter((m) => m.role === "user" || m.role === "assistant")
|
|
32
|
+
.map((m) => ({ id: ++messageIdCounter, role: m.role, content: m.content }));
|
|
33
|
+
});
|
|
25
34
|
const messagesRef = useRef(messages);
|
|
26
35
|
messagesRef.current = messages;
|
|
27
36
|
const [isStreaming, setIsStreaming] = useState(false);
|
|
28
37
|
const [streamingStartedAt, setStreamingStartedAt] = useState(null);
|
|
29
|
-
const
|
|
30
|
-
const
|
|
38
|
+
const [scrollUp, setScrollUp] = useState(0);
|
|
39
|
+
const contentRef = useRef(null);
|
|
40
|
+
const viewportRef = useRef(null);
|
|
31
41
|
const [tasks, setTasks] = useState([]);
|
|
32
42
|
const [metricData, setMetricData] = useState(new Map());
|
|
33
43
|
const [stickyNotes, setStickyNotes] = useState([]);
|
|
@@ -47,9 +57,7 @@ export function Layout({ runtime, mouseEmitter, headless, initialPrompt, initial
|
|
|
47
57
|
const { statuses, finished } = await pollTaskStatuses(executor);
|
|
48
58
|
// Build TaskInfo[] for UI state
|
|
49
59
|
const updated = statuses.map(({ proc, running }) => {
|
|
50
|
-
const shortCmd = proc.command
|
|
51
|
-
? proc.command.slice(0, 40) + "..."
|
|
52
|
-
: proc.command;
|
|
60
|
+
const shortCmd = truncate(proc.command, 40);
|
|
53
61
|
return {
|
|
54
62
|
id: `${proc.machineId}:${proc.pid}`,
|
|
55
63
|
name: shortCmd,
|
|
@@ -92,35 +100,29 @@ export function Layout({ runtime, mouseEmitter, headless, initialPrompt, initial
|
|
|
92
100
|
return () => { stopped = true; if (timer)
|
|
93
101
|
clearTimeout(timer); };
|
|
94
102
|
}, [executor, connectionPool, metricCollector, metricStore]);
|
|
95
|
-
//
|
|
96
|
-
useEffect(() => {
|
|
97
|
-
if (!userScrolled) {
|
|
98
|
-
scrollRef.current?.scrollToBottom();
|
|
99
|
-
}
|
|
100
|
-
}, [messages, userScrolled, activeOverlay]);
|
|
101
|
-
// Re-snap to bottom when streaming starts, and keep scrolling during streaming
|
|
103
|
+
// Re-snap to bottom when streaming starts.
|
|
102
104
|
useEffect(() => {
|
|
103
105
|
if (isStreaming) {
|
|
104
|
-
|
|
105
|
-
// During streaming, content changes faster than React state updates trigger effects.
|
|
106
|
-
// Poll scrollToBottom on a short interval to keep up.
|
|
107
|
-
const timer = setInterval(() => {
|
|
108
|
-
scrollRef.current?.scrollToBottom();
|
|
109
|
-
}, 100);
|
|
110
|
-
return () => clearInterval(timer);
|
|
106
|
+
setScrollUp(0);
|
|
111
107
|
}
|
|
112
108
|
}, [isStreaming]);
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const target = Math.max(0, Math.min(sv.getScrollOffset() + delta, sv.getBottomOffset()));
|
|
121
|
-
sv.scrollTo(target);
|
|
122
|
-
return target >= sv.getBottomOffset();
|
|
109
|
+
// Measure current max scroll (content overflow above viewport).
|
|
110
|
+
const getMaxScroll = useCallback(() => {
|
|
111
|
+
if (!contentRef.current || !viewportRef.current)
|
|
112
|
+
return 0;
|
|
113
|
+
const ch = measureElement(contentRef.current).height;
|
|
114
|
+
const vh = measureElement(viewportRef.current).height;
|
|
115
|
+
return Math.max(0, ch - vh);
|
|
123
116
|
}, []);
|
|
117
|
+
// Scroll by delta rows (positive = up into history, negative = toward bottom).
|
|
118
|
+
const scrollBy = useCallback((delta) => {
|
|
119
|
+
setScrollUp((prev) => {
|
|
120
|
+
const next = prev + delta;
|
|
121
|
+
if (next <= 0)
|
|
122
|
+
return 0;
|
|
123
|
+
return Math.min(next, getMaxScroll());
|
|
124
|
+
});
|
|
125
|
+
}, [getMaxScroll]);
|
|
124
126
|
// Enable SGR mouse reporting and handle scroll via mouseEmitter
|
|
125
127
|
useEffect(() => {
|
|
126
128
|
process.stdout.write("\x1b[?1000h\x1b[?1006h");
|
|
@@ -131,18 +133,15 @@ export function Layout({ runtime, mouseEmitter, headless, initialPrompt, initial
|
|
|
131
133
|
return;
|
|
132
134
|
const handler = (evt) => {
|
|
133
135
|
if (evt.type === "scroll_up") {
|
|
134
|
-
|
|
135
|
-
setUserScrolled(true);
|
|
136
|
+
scrollBy(3);
|
|
136
137
|
}
|
|
137
138
|
else if (evt.type === "scroll_down") {
|
|
138
|
-
|
|
139
|
-
if (atBottom)
|
|
140
|
-
setUserScrolled(false);
|
|
139
|
+
scrollBy(-3);
|
|
141
140
|
}
|
|
142
141
|
};
|
|
143
142
|
mouseEmitter.on("mouse", handler);
|
|
144
143
|
return () => { mouseEmitter.removeListener("mouse", handler); };
|
|
145
|
-
}, [mouseEmitter,
|
|
144
|
+
}, [mouseEmitter, scrollBy]);
|
|
146
145
|
useInput((input, key) => {
|
|
147
146
|
// Toggle overlays — always available
|
|
148
147
|
if (key.ctrl && input === "t") {
|
|
@@ -183,13 +182,10 @@ export function Layout({ runtime, mouseEmitter, headless, initialPrompt, initial
|
|
|
183
182
|
if (activeOverlay !== "none")
|
|
184
183
|
return;
|
|
185
184
|
if (key.pageUp) {
|
|
186
|
-
|
|
187
|
-
setUserScrolled(true);
|
|
185
|
+
scrollBy(10);
|
|
188
186
|
}
|
|
189
187
|
if (key.pageDown) {
|
|
190
|
-
|
|
191
|
-
if (atBottom)
|
|
192
|
-
setUserScrolled(false);
|
|
188
|
+
scrollBy(-10);
|
|
193
189
|
}
|
|
194
190
|
});
|
|
195
191
|
const addMessage = useCallback((role, content, tool) => {
|
|
@@ -198,7 +194,10 @@ export function Layout({ runtime, mouseEmitter, headless, initialPrompt, initial
|
|
|
198
194
|
const next = [...prev, { id, role, content, tool }];
|
|
199
195
|
// Cap at 500 messages to prevent OOM in long sessions.
|
|
200
196
|
// Old messages are still persisted in the session store.
|
|
201
|
-
|
|
197
|
+
if (next.length > 500) {
|
|
198
|
+
return next.slice(-500);
|
|
199
|
+
}
|
|
200
|
+
return next;
|
|
202
201
|
});
|
|
203
202
|
return id;
|
|
204
203
|
}, []);
|
|
@@ -208,6 +207,8 @@ export function Layout({ runtime, mouseEmitter, headless, initialPrompt, initial
|
|
|
208
207
|
const handleSubmit = useCallback(async (input, attachments) => {
|
|
209
208
|
if (!input.trim())
|
|
210
209
|
return;
|
|
210
|
+
// Snap to bottom on any submission — user intent is to interact, not read history.
|
|
211
|
+
setScrollUp(0);
|
|
211
212
|
if (input.startsWith("/")) {
|
|
212
213
|
await handleSlashCommand(input, {
|
|
213
214
|
orchestrator, addMessage, updateMessage, setMessages, messages: messagesRef.current, setIsStreaming,
|
|
@@ -360,7 +361,7 @@ export function Layout({ runtime, mouseEmitter, headless, initialPrompt, initial
|
|
|
360
361
|
return (_jsx(Box, { flexDirection: "column", height: height, width: width, children: _jsx(MetricsOverlay, { metricData: metricData, metricStore: metricStore, width: width, height: height, onClose: () => setActiveOverlay("none") }) }));
|
|
361
362
|
}
|
|
362
363
|
// ── Normal layout ─────────────────────────────────────────────
|
|
363
|
-
return (_jsxs(Box, { flexDirection: "column", height: height, width: width, children: [_jsx(Box, { flexShrink: 0, children: headless && agentName ? (_jsx(HeadlessHeader, { agentName: agentName, width: width })) : (_jsx(HeaderWithPanels, { width: width })) }), _jsxs(Box, { flexShrink: 0, flexDirection: "row", children: [_jsx(Box, { flexGrow: 1, flexBasis: 0, flexDirection: "column", paddingX: 1, children: _jsx(MetricsDashboard, { metricData: metricData, width: Math.floor((width - 1) / 2) - 2 }) }), _jsx(Box, { width: 1, flexDirection: "column", alignItems: "center", children: _jsx(Text, { color: C.primary, wrap: "truncate", children: Array.from({ length: panelHeight }, () => "│").join("\n") }) }), _jsx(Box, { flexGrow: 1, flexBasis: 0, flexDirection: "column", paddingX: 1, children: _jsx(TaskListPanel, { tasks: tasks, resources: resourceData, width: Math.floor((width - 1) / 2) - 2 }) })] }), _jsx(Box, { flexShrink: 0, children: _jsx(HRule, {}) }), _jsxs(Box, { flexGrow: 1, flexShrink: 1, flexDirection: "row", children: [_jsx(Box, { flexGrow: 1, flexShrink: 1, children: messages.length === 0 && !headless ? (_jsxs(Box, { flexGrow: 1, alignItems: "center", justifyContent: "center", flexDirection: "column", children: [_jsx(Text, { color: C.primary, bold: true, children: G.brand }), _jsx(Text, { color: C.primary, bold: true, children: "H E L I O S" }), _jsx(Text, { color: C.dim, children: "autonomous ml research" }), _jsxs(Text, { color: C.dim, dimColor: true, children: ["v", VERSION] }), _jsx(Text, { color: C.dim, dimColor: true, children: "" }), _jsx(Text, { color: C.dim, dimColor: true, children: "/help for commands" }), updateAvailable && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: C.bright, children: ["update available: v", updateAvailable, " \u2014 npm i -g helios"] }) }))] })) : (_jsx(
|
|
364
|
+
return (_jsxs(Box, { flexDirection: "column", height: height, width: width, children: [_jsx(Box, { flexShrink: 0, children: headless && agentName ? (_jsx(HeadlessHeader, { agentName: agentName, width: width })) : (_jsx(HeaderWithPanels, { width: width })) }), _jsxs(Box, { flexShrink: 0, flexDirection: "row", children: [_jsx(Box, { flexGrow: 1, flexBasis: 0, flexDirection: "column", paddingX: 1, children: _jsx(MetricsDashboard, { metricData: metricData, width: Math.floor((width - 1) / 2) - 2 }) }), _jsx(Box, { width: 1, flexDirection: "column", alignItems: "center", children: _jsx(Text, { color: C.primary, wrap: "truncate", children: Array.from({ length: panelHeight }, () => "│").join("\n") }) }), _jsx(Box, { flexGrow: 1, flexBasis: 0, flexDirection: "column", paddingX: 1, children: _jsx(TaskListPanel, { tasks: tasks, resources: resourceData, width: Math.floor((width - 1) / 2) - 2 }) })] }), _jsx(Box, { flexShrink: 0, children: _jsx(HRule, {}) }), _jsxs(Box, { flexGrow: 1, flexShrink: 1, flexDirection: "row", children: [_jsx(Box, { flexGrow: 1, flexShrink: 1, children: messages.length === 0 && !headless ? (_jsxs(Box, { flexGrow: 1, alignItems: "center", justifyContent: "center", flexDirection: "column", children: [_jsx(Text, { color: C.primary, bold: true, children: G.brand }), _jsx(Text, { color: C.primary, bold: true, children: "H E L I O S" }), _jsx(Text, { color: C.dim, children: "autonomous ml research" }), _jsxs(Text, { color: C.dim, dimColor: true, children: ["v", VERSION] }), _jsx(Text, { color: C.dim, dimColor: true, children: "" }), _jsx(Text, { color: C.dim, dimColor: true, children: "/help for commands" }), updateAvailable && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: C.bright, children: ["update available: v", updateAvailable, " \u2014 npm i -g helios"] }) }))] })) : (_jsx(Box, { ref: viewportRef, overflow: "hidden", flexGrow: 1, flexShrink: 1, flexDirection: "column", justifyContent: "flex-end", children: _jsxs(Box, { ref: contentRef, flexDirection: "column", flexShrink: 0, marginBottom: scrollUp > 0 ? -scrollUp : undefined, children: [messages.map((msg) => (_jsx(Box, { paddingX: 1, children: _jsx(MessageLine, { message: msg }) }, msg.id))), isStreaming && (_jsx(Box, { paddingX: 1, paddingLeft: 3, children: _jsx(PulsingIndicator, {}) }))] }) })) }), stickyNotes.length > 0 && (_jsx(Box, { flexShrink: 0, children: _jsx(StickyNotesPanel, { notes: stickyNotes, width: Math.min(30, Math.floor(width * 0.25)) }) }))] }), !headless && _jsx(Box, { flexShrink: 0, children: _jsx(KeyHintRule, {}) }), _jsx(Box, { flexShrink: 0, children: _jsx(StatusBar, { orchestrator: orchestrator, sleepManager: sleepManager, monitorManager: monitorManager, isStreaming: isStreaming, streamingStartedAt: streamingStartedAt }) }), !headless && (_jsx(Box, { flexShrink: 0, children: _jsx(InputBar, { onSubmit: handleSubmit, disabled: isStreaming, commands: allCommands, placeholder: isSleeping
|
|
364
365
|
? "type to wake agent..."
|
|
365
366
|
: "send a message... (/help for commands)" }) }))] }));
|
|
366
367
|
}
|