@snoglobe/helios 0.1.0
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/LICENSE +202 -0
- package/README.md +222 -0
- package/dist/app.d.ts +9 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +289 -0
- package/dist/app.js.map +1 -0
- package/dist/core/agent-loop.d.ts +16 -0
- package/dist/core/agent-loop.d.ts.map +1 -0
- package/dist/core/agent-loop.js +64 -0
- package/dist/core/agent-loop.js.map +1 -0
- package/dist/core/monitor.d.ts +15 -0
- package/dist/core/monitor.d.ts.map +1 -0
- package/dist/core/monitor.js +40 -0
- package/dist/core/monitor.js.map +1 -0
- package/dist/core/orchestrator.d.ts +51 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +235 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/state-machine.d.ts +19 -0
- package/dist/core/state-machine.d.ts.map +1 -0
- package/dist/core/state-machine.js +42 -0
- package/dist/core/state-machine.js.map +1 -0
- package/dist/core/stickies.d.ts +20 -0
- package/dist/core/stickies.d.ts.map +1 -0
- package/dist/core/stickies.js +41 -0
- package/dist/core/stickies.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/context-gate.d.ts +49 -0
- package/dist/memory/context-gate.d.ts.map +1 -0
- package/dist/memory/context-gate.js +109 -0
- package/dist/memory/context-gate.js.map +1 -0
- package/dist/memory/experiment-tracker.d.ts +21 -0
- package/dist/memory/experiment-tracker.d.ts.map +1 -0
- package/dist/memory/experiment-tracker.js +117 -0
- package/dist/memory/experiment-tracker.js.map +1 -0
- package/dist/memory/memory-store.d.ts +37 -0
- package/dist/memory/memory-store.d.ts.map +1 -0
- package/dist/memory/memory-store.js +150 -0
- package/dist/memory/memory-store.js.map +1 -0
- package/dist/memory/token-estimator.d.ts +7 -0
- package/dist/memory/token-estimator.d.ts.map +1 -0
- package/dist/memory/token-estimator.js +30 -0
- package/dist/memory/token-estimator.js.map +1 -0
- package/dist/metrics/analyzer.d.ts +15 -0
- package/dist/metrics/analyzer.d.ts.map +1 -0
- package/dist/metrics/analyzer.js +67 -0
- package/dist/metrics/analyzer.js.map +1 -0
- package/dist/metrics/collector.d.ts +23 -0
- package/dist/metrics/collector.d.ts.map +1 -0
- package/dist/metrics/collector.js +60 -0
- package/dist/metrics/collector.js.map +1 -0
- package/dist/metrics/parser.d.ts +21 -0
- package/dist/metrics/parser.d.ts.map +1 -0
- package/dist/metrics/parser.js +43 -0
- package/dist/metrics/parser.js.map +1 -0
- package/dist/metrics/parsers/csv.d.ts +8 -0
- package/dist/metrics/parsers/csv.d.ts.map +1 -0
- package/dist/metrics/parsers/csv.js +37 -0
- package/dist/metrics/parsers/csv.js.map +1 -0
- package/dist/metrics/parsers/json.d.ts +8 -0
- package/dist/metrics/parsers/json.d.ts.map +1 -0
- package/dist/metrics/parsers/json.js +42 -0
- package/dist/metrics/parsers/json.js.map +1 -0
- package/dist/metrics/parsers/stdout.d.ts +3 -0
- package/dist/metrics/parsers/stdout.d.ts.map +1 -0
- package/dist/metrics/parsers/stdout.js +79 -0
- package/dist/metrics/parsers/stdout.js.map +1 -0
- package/dist/metrics/parsers/tensorboard.d.ts +16 -0
- package/dist/metrics/parsers/tensorboard.d.ts.map +1 -0
- package/dist/metrics/parsers/tensorboard.js +22 -0
- package/dist/metrics/parsers/tensorboard.js.map +1 -0
- package/dist/metrics/store.d.ts +33 -0
- package/dist/metrics/store.d.ts.map +1 -0
- package/dist/metrics/store.js +141 -0
- package/dist/metrics/store.js.map +1 -0
- package/dist/providers/auth/auth-manager.d.ts +22 -0
- package/dist/providers/auth/auth-manager.d.ts.map +1 -0
- package/dist/providers/auth/auth-manager.js +77 -0
- package/dist/providers/auth/auth-manager.js.map +1 -0
- package/dist/providers/auth/token-store.d.ts +14 -0
- package/dist/providers/auth/token-store.d.ts.map +1 -0
- package/dist/providers/auth/token-store.js +55 -0
- package/dist/providers/auth/token-store.js.map +1 -0
- package/dist/providers/claude/provider.d.ts +46 -0
- package/dist/providers/claude/provider.d.ts.map +1 -0
- package/dist/providers/claude/provider.js +606 -0
- package/dist/providers/claude/provider.js.map +1 -0
- package/dist/providers/openai/callback-server.d.ts +11 -0
- package/dist/providers/openai/callback-server.d.ts.map +1 -0
- package/dist/providers/openai/callback-server.js +58 -0
- package/dist/providers/openai/callback-server.js.map +1 -0
- package/dist/providers/openai/oauth.d.ts +16 -0
- package/dist/providers/openai/oauth.d.ts.map +1 -0
- package/dist/providers/openai/oauth.js +110 -0
- package/dist/providers/openai/oauth.js.map +1 -0
- package/dist/providers/openai/provider.d.ts +29 -0
- package/dist/providers/openai/provider.d.ts.map +1 -0
- package/dist/providers/openai/provider.js +363 -0
- package/dist/providers/openai/provider.js.map +1 -0
- package/dist/providers/retry.d.ts +6 -0
- package/dist/providers/retry.d.ts.map +1 -0
- package/dist/providers/retry.js +13 -0
- package/dist/providers/retry.js.map +1 -0
- package/dist/providers/sse.d.ts +6 -0
- package/dist/providers/sse.d.ts.map +1 -0
- package/dist/providers/sse.js +35 -0
- package/dist/providers/sse.js.map +1 -0
- package/dist/providers/types.d.ts +102 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +11 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/remote/config.d.ts +14 -0
- package/dist/remote/config.d.ts.map +1 -0
- package/dist/remote/config.js +81 -0
- package/dist/remote/config.js.map +1 -0
- package/dist/remote/connection-pool.d.ts +26 -0
- package/dist/remote/connection-pool.d.ts.map +1 -0
- package/dist/remote/connection-pool.js +268 -0
- package/dist/remote/connection-pool.js.map +1 -0
- package/dist/remote/executor.d.ts +23 -0
- package/dist/remote/executor.d.ts.map +1 -0
- package/dist/remote/executor.js +53 -0
- package/dist/remote/executor.js.map +1 -0
- package/dist/remote/file-sync.d.ts +19 -0
- package/dist/remote/file-sync.d.ts.map +1 -0
- package/dist/remote/file-sync.js +44 -0
- package/dist/remote/file-sync.js.map +1 -0
- package/dist/remote/types.d.ts +33 -0
- package/dist/remote/types.d.ts.map +1 -0
- package/dist/remote/types.js +2 -0
- package/dist/remote/types.js.map +1 -0
- package/dist/scheduler/sleep-manager.d.ts +33 -0
- package/dist/scheduler/sleep-manager.d.ts.map +1 -0
- package/dist/scheduler/sleep-manager.js +132 -0
- package/dist/scheduler/sleep-manager.js.map +1 -0
- package/dist/scheduler/ssh-batcher.d.ts +23 -0
- package/dist/scheduler/ssh-batcher.d.ts.map +1 -0
- package/dist/scheduler/ssh-batcher.js +98 -0
- package/dist/scheduler/ssh-batcher.js.map +1 -0
- package/dist/scheduler/state-store.d.ts +8 -0
- package/dist/scheduler/state-store.d.ts.map +1 -0
- package/dist/scheduler/state-store.js +48 -0
- package/dist/scheduler/state-store.js.map +1 -0
- package/dist/scheduler/trigger-scheduler.d.ts +24 -0
- package/dist/scheduler/trigger-scheduler.d.ts.map +1 -0
- package/dist/scheduler/trigger-scheduler.js +142 -0
- package/dist/scheduler/trigger-scheduler.js.map +1 -0
- package/dist/scheduler/triggers/file.d.ts +4 -0
- package/dist/scheduler/triggers/file.d.ts.map +1 -0
- package/dist/scheduler/triggers/file.js +39 -0
- package/dist/scheduler/triggers/file.js.map +1 -0
- package/dist/scheduler/triggers/metric.d.ts +4 -0
- package/dist/scheduler/triggers/metric.d.ts.map +1 -0
- package/dist/scheduler/triggers/metric.js +74 -0
- package/dist/scheduler/triggers/metric.js.map +1 -0
- package/dist/scheduler/triggers/process-exit.d.ts +4 -0
- package/dist/scheduler/triggers/process-exit.d.ts.map +1 -0
- package/dist/scheduler/triggers/process-exit.js +13 -0
- package/dist/scheduler/triggers/process-exit.js.map +1 -0
- package/dist/scheduler/triggers/resource.d.ts +4 -0
- package/dist/scheduler/triggers/resource.d.ts.map +1 -0
- package/dist/scheduler/triggers/resource.js +54 -0
- package/dist/scheduler/triggers/resource.js.map +1 -0
- package/dist/scheduler/triggers/timer.d.ts +3 -0
- package/dist/scheduler/triggers/timer.d.ts.map +1 -0
- package/dist/scheduler/triggers/timer.js +4 -0
- package/dist/scheduler/triggers/timer.js.map +1 -0
- package/dist/scheduler/triggers/types.d.ts +95 -0
- package/dist/scheduler/triggers/types.d.ts.map +1 -0
- package/dist/scheduler/triggers/types.js +11 -0
- package/dist/scheduler/triggers/types.js.map +1 -0
- package/dist/store/database.d.ts +5 -0
- package/dist/store/database.d.ts.map +1 -0
- package/dist/store/database.js +29 -0
- package/dist/store/database.js.map +1 -0
- package/dist/store/migrations.d.ts +3 -0
- package/dist/store/migrations.d.ts.map +1 -0
- package/dist/store/migrations.js +124 -0
- package/dist/store/migrations.js.map +1 -0
- package/dist/store/preferences.d.ts +7 -0
- package/dist/store/preferences.d.ts.map +1 -0
- package/dist/store/preferences.js +26 -0
- package/dist/store/preferences.js.map +1 -0
- package/dist/store/session-store.d.ts +29 -0
- package/dist/store/session-store.d.ts.map +1 -0
- package/dist/store/session-store.js +103 -0
- package/dist/store/session-store.js.map +1 -0
- package/dist/tools/clear-metrics.d.ts +5 -0
- package/dist/tools/clear-metrics.d.ts.map +1 -0
- package/dist/tools/clear-metrics.js +27 -0
- package/dist/tools/clear-metrics.js.map +1 -0
- package/dist/tools/compare-runs.d.ts +4 -0
- package/dist/tools/compare-runs.d.ts.map +1 -0
- package/dist/tools/compare-runs.js +77 -0
- package/dist/tools/compare-runs.js.map +1 -0
- package/dist/tools/consult.d.ts +3 -0
- package/dist/tools/consult.d.ts.map +1 -0
- package/dist/tools/consult.js +62 -0
- package/dist/tools/consult.js.map +1 -0
- package/dist/tools/file-ops.d.ts +6 -0
- package/dist/tools/file-ops.d.ts.map +1 -0
- package/dist/tools/file-ops.js +158 -0
- package/dist/tools/file-ops.js.map +1 -0
- package/dist/tools/kill-task.d.ts +6 -0
- package/dist/tools/kill-task.d.ts.map +1 -0
- package/dist/tools/kill-task.js +55 -0
- package/dist/tools/kill-task.js.map +1 -0
- package/dist/tools/list-machines.d.ts +4 -0
- package/dist/tools/list-machines.d.ts.map +1 -0
- package/dist/tools/list-machines.js +24 -0
- package/dist/tools/list-machines.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +8 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +122 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/metrics-query.d.ts +4 -0
- package/dist/tools/metrics-query.d.ts.map +1 -0
- package/dist/tools/metrics-query.js +69 -0
- package/dist/tools/metrics-query.js.map +1 -0
- package/dist/tools/monitor.d.ts +5 -0
- package/dist/tools/monitor.d.ts.map +1 -0
- package/dist/tools/monitor.js +64 -0
- package/dist/tools/monitor.js.map +1 -0
- package/dist/tools/remote-exec.d.ts +6 -0
- package/dist/tools/remote-exec.d.ts.map +1 -0
- package/dist/tools/remote-exec.js +98 -0
- package/dist/tools/remote-exec.js.map +1 -0
- package/dist/tools/remote-sync.d.ts +5 -0
- package/dist/tools/remote-sync.d.ts.map +1 -0
- package/dist/tools/remote-sync.js +57 -0
- package/dist/tools/remote-sync.js.map +1 -0
- package/dist/tools/show-metrics.d.ts +4 -0
- package/dist/tools/show-metrics.d.ts.map +1 -0
- package/dist/tools/show-metrics.js +69 -0
- package/dist/tools/show-metrics.js.map +1 -0
- package/dist/tools/sleep.d.ts +4 -0
- package/dist/tools/sleep.d.ts.map +1 -0
- package/dist/tools/sleep.js +116 -0
- package/dist/tools/sleep.js.map +1 -0
- package/dist/tools/task-output.d.ts +5 -0
- package/dist/tools/task-output.d.ts.map +1 -0
- package/dist/tools/task-output.js +51 -0
- package/dist/tools/task-output.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +3 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +112 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/ui/commands.d.ts +7 -0
- package/dist/ui/commands.d.ts.map +1 -0
- package/dist/ui/commands.js +21 -0
- package/dist/ui/commands.js.map +1 -0
- package/dist/ui/components/gradient-edge.d.ts +7 -0
- package/dist/ui/components/gradient-edge.d.ts.map +1 -0
- package/dist/ui/components/gradient-edge.js +33 -0
- package/dist/ui/components/gradient-edge.js.map +1 -0
- package/dist/ui/components/input-bar.d.ts +8 -0
- package/dist/ui/components/input-bar.d.ts.map +1 -0
- package/dist/ui/components/input-bar.js +139 -0
- package/dist/ui/components/input-bar.js.map +1 -0
- package/dist/ui/components/key-hint-rule.d.ts +2 -0
- package/dist/ui/components/key-hint-rule.d.ts.map +1 -0
- package/dist/ui/components/key-hint-rule.js +19 -0
- package/dist/ui/components/key-hint-rule.js.map +1 -0
- package/dist/ui/components/overlay-header.d.ts +6 -0
- package/dist/ui/components/overlay-header.d.ts.map +1 -0
- package/dist/ui/components/overlay-header.js +10 -0
- package/dist/ui/components/overlay-header.js.map +1 -0
- package/dist/ui/components/status-bar.d.ts +11 -0
- package/dist/ui/components/status-bar.d.ts.map +1 -0
- package/dist/ui/components/status-bar.js +55 -0
- package/dist/ui/components/status-bar.js.map +1 -0
- package/dist/ui/format.d.ts +12 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +36 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/layout.d.ts +48 -0
- package/dist/ui/layout.d.ts.map +1 -0
- package/dist/ui/layout.js +857 -0
- package/dist/ui/layout.js.map +1 -0
- package/dist/ui/markdown.d.ts +7 -0
- package/dist/ui/markdown.d.ts.map +1 -0
- package/dist/ui/markdown.js +67 -0
- package/dist/ui/markdown.js.map +1 -0
- package/dist/ui/mouse-filter.d.ts +21 -0
- package/dist/ui/mouse-filter.d.ts.map +1 -0
- package/dist/ui/mouse-filter.js +66 -0
- package/dist/ui/mouse-filter.js.map +1 -0
- package/dist/ui/overlays/metrics-overlay.d.ts +11 -0
- package/dist/ui/overlays/metrics-overlay.d.ts.map +1 -0
- package/dist/ui/overlays/metrics-overlay.js +86 -0
- package/dist/ui/overlays/metrics-overlay.js.map +1 -0
- package/dist/ui/overlays/task-overlay.d.ts +12 -0
- package/dist/ui/overlays/task-overlay.d.ts.map +1 -0
- package/dist/ui/overlays/task-overlay.js +77 -0
- package/dist/ui/overlays/task-overlay.js.map +1 -0
- package/dist/ui/panels/conversation.d.ts +8 -0
- package/dist/ui/panels/conversation.d.ts.map +1 -0
- package/dist/ui/panels/conversation.js +216 -0
- package/dist/ui/panels/conversation.js.map +1 -0
- package/dist/ui/panels/metrics-dashboard.d.ts +8 -0
- package/dist/ui/panels/metrics-dashboard.d.ts.map +1 -0
- package/dist/ui/panels/metrics-dashboard.js +56 -0
- package/dist/ui/panels/metrics-dashboard.js.map +1 -0
- package/dist/ui/panels/sleep-panel.d.ts +7 -0
- package/dist/ui/panels/sleep-panel.d.ts.map +1 -0
- package/dist/ui/panels/sleep-panel.js +48 -0
- package/dist/ui/panels/sleep-panel.js.map +1 -0
- package/dist/ui/panels/sticky-notes.d.ts +8 -0
- package/dist/ui/panels/sticky-notes.d.ts.map +1 -0
- package/dist/ui/panels/sticky-notes.js +49 -0
- package/dist/ui/panels/sticky-notes.js.map +1 -0
- package/dist/ui/panels/task-list.d.ts +8 -0
- package/dist/ui/panels/task-list.d.ts.map +1 -0
- package/dist/ui/panels/task-list.js +39 -0
- package/dist/ui/panels/task-list.js.map +1 -0
- package/dist/ui/theme.d.ts +25 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +50 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/version.d.ts +9 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +62 -0
- package/dist/version.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { AgentStateMachine } from "./state-machine.js";
|
|
2
|
+
import { SessionStore } from "../store/session-store.js";
|
|
3
|
+
import { savePreferences } from "../store/preferences.js";
|
|
4
|
+
export class Orchestrator {
|
|
5
|
+
providers = new Map();
|
|
6
|
+
activeProvider = null;
|
|
7
|
+
activeSession = null;
|
|
8
|
+
tools = [];
|
|
9
|
+
_totalCostUsd = 0;
|
|
10
|
+
_lastInputTokens = 0;
|
|
11
|
+
_contextGate = null;
|
|
12
|
+
_stickyManager = null;
|
|
13
|
+
stateMachine = new AgentStateMachine();
|
|
14
|
+
sessionStore = new SessionStore();
|
|
15
|
+
config;
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
}
|
|
19
|
+
registerProvider(provider) {
|
|
20
|
+
this.providers.set(provider.name, provider);
|
|
21
|
+
}
|
|
22
|
+
registerTool(tool) {
|
|
23
|
+
this.tools.push(tool);
|
|
24
|
+
}
|
|
25
|
+
registerTools(tools) {
|
|
26
|
+
this.tools.push(...tools);
|
|
27
|
+
}
|
|
28
|
+
setContextGate(gate) {
|
|
29
|
+
this._contextGate = gate;
|
|
30
|
+
}
|
|
31
|
+
get contextGate() {
|
|
32
|
+
return this._contextGate;
|
|
33
|
+
}
|
|
34
|
+
setStickyManager(manager) {
|
|
35
|
+
this._stickyManager = manager;
|
|
36
|
+
}
|
|
37
|
+
getTools() {
|
|
38
|
+
return this.tools;
|
|
39
|
+
}
|
|
40
|
+
getProvider(name) {
|
|
41
|
+
if (name)
|
|
42
|
+
return this.providers.get(name) ?? null;
|
|
43
|
+
return this.activeProvider;
|
|
44
|
+
}
|
|
45
|
+
async switchProvider(name) {
|
|
46
|
+
const provider = this.providers.get(name);
|
|
47
|
+
if (!provider)
|
|
48
|
+
throw new Error(`Provider "${name}" not registered`);
|
|
49
|
+
// Clean up old session before switching
|
|
50
|
+
if (this.activeSession && this.activeProvider) {
|
|
51
|
+
await this.activeProvider.closeSession(this.activeSession).catch(() => { });
|
|
52
|
+
this.activeSession = null;
|
|
53
|
+
}
|
|
54
|
+
await provider.authenticate();
|
|
55
|
+
this.activeProvider = provider;
|
|
56
|
+
savePreferences({ lastProvider: name });
|
|
57
|
+
}
|
|
58
|
+
async ensureSession() {
|
|
59
|
+
if (this.activeSession)
|
|
60
|
+
return this.activeSession;
|
|
61
|
+
return this.startSession();
|
|
62
|
+
}
|
|
63
|
+
async startSession(config) {
|
|
64
|
+
if (!this.activeProvider) {
|
|
65
|
+
await this.switchProvider(this.config.defaultProvider);
|
|
66
|
+
}
|
|
67
|
+
const sessionConfig = {
|
|
68
|
+
systemPrompt: this.config.systemPrompt,
|
|
69
|
+
...config,
|
|
70
|
+
};
|
|
71
|
+
const session = await this.activeProvider.createSession(sessionConfig);
|
|
72
|
+
this.activeSession = session;
|
|
73
|
+
// Bind memory store to this session
|
|
74
|
+
if (this._contextGate) {
|
|
75
|
+
this._contextGate.onSessionStart(session.id);
|
|
76
|
+
}
|
|
77
|
+
if (this.stateMachine.state === "idle") {
|
|
78
|
+
this.stateMachine.transition("active", "Session started");
|
|
79
|
+
}
|
|
80
|
+
return session;
|
|
81
|
+
}
|
|
82
|
+
async resumeSession(sessionId) {
|
|
83
|
+
const stored = this.sessionStore.getSession(sessionId);
|
|
84
|
+
if (!stored)
|
|
85
|
+
throw new Error(`Session "${sessionId}" not found`);
|
|
86
|
+
// Ensure the correct provider is active
|
|
87
|
+
const providerName = stored.providerId;
|
|
88
|
+
if (!this.activeProvider || this.activeProvider.name !== providerName) {
|
|
89
|
+
await this.switchProvider(providerName);
|
|
90
|
+
}
|
|
91
|
+
// Ask the provider to resume its side (re-hydrate conversation history etc.)
|
|
92
|
+
const session = await this.activeProvider.resumeSession(stored.id);
|
|
93
|
+
this.activeSession = session;
|
|
94
|
+
if (this.stateMachine.state === "idle") {
|
|
95
|
+
this.stateMachine.transition("active", "Session resumed");
|
|
96
|
+
}
|
|
97
|
+
return session;
|
|
98
|
+
}
|
|
99
|
+
async *send(message) {
|
|
100
|
+
if (!this.activeProvider) {
|
|
101
|
+
await this.switchProvider(this.config.defaultProvider);
|
|
102
|
+
}
|
|
103
|
+
const session = await this.ensureSession();
|
|
104
|
+
this.sessionStore.updateLastActive(session.id);
|
|
105
|
+
this.sessionStore.addMessage(session.id, "user", message);
|
|
106
|
+
// Prepend sticky notes to the message so the model always sees them
|
|
107
|
+
let augmentedMessage = message;
|
|
108
|
+
if (this._stickyManager) {
|
|
109
|
+
const stickies = this._stickyManager.formatForModel();
|
|
110
|
+
if (stickies) {
|
|
111
|
+
augmentedMessage = stickies + "\n\n---\n\n" + message;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
let fullResponse = "";
|
|
115
|
+
for await (const event of this.activeProvider.send(session, augmentedMessage, this.tools)) {
|
|
116
|
+
if (event.type === "text" && event.delta) {
|
|
117
|
+
fullResponse += event.delta;
|
|
118
|
+
}
|
|
119
|
+
if (event.type === "done") {
|
|
120
|
+
if (event.usage?.costUsd) {
|
|
121
|
+
this._totalCostUsd += event.usage.costUsd;
|
|
122
|
+
}
|
|
123
|
+
if (event.usage?.inputTokens) {
|
|
124
|
+
this._lastInputTokens = event.usage.inputTokens;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
yield event;
|
|
128
|
+
}
|
|
129
|
+
// Check if context window is filling up — trigger checkpoint if needed
|
|
130
|
+
yield* this.maybeCheckpoint(session);
|
|
131
|
+
if (fullResponse) {
|
|
132
|
+
this.sessionStore.addMessage(session.id, "assistant", fullResponse);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
interrupt() {
|
|
136
|
+
if (this.activeProvider && this.activeSession) {
|
|
137
|
+
this.activeProvider.interrupt(this.activeSession);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
get currentSession() {
|
|
141
|
+
return this.activeSession;
|
|
142
|
+
}
|
|
143
|
+
get currentProvider() {
|
|
144
|
+
return this.activeProvider;
|
|
145
|
+
}
|
|
146
|
+
get currentState() {
|
|
147
|
+
return this.stateMachine.state;
|
|
148
|
+
}
|
|
149
|
+
get totalCostUsd() {
|
|
150
|
+
return this._totalCostUsd;
|
|
151
|
+
}
|
|
152
|
+
get currentModel() {
|
|
153
|
+
return this.activeProvider?.currentModel ?? null;
|
|
154
|
+
}
|
|
155
|
+
async setModel(model) {
|
|
156
|
+
if (!this.activeProvider) {
|
|
157
|
+
await this.switchProvider(this.config.defaultProvider);
|
|
158
|
+
}
|
|
159
|
+
this.activeProvider.currentModel = model;
|
|
160
|
+
// Reset session so next message uses the new model
|
|
161
|
+
if (this.activeSession) {
|
|
162
|
+
await this.activeProvider.closeSession(this.activeSession);
|
|
163
|
+
this.activeSession = null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async fetchModels() {
|
|
167
|
+
if (!this.activeProvider) {
|
|
168
|
+
await this.switchProvider(this.config.defaultProvider);
|
|
169
|
+
}
|
|
170
|
+
if (this.activeProvider.fetchModels) {
|
|
171
|
+
return this.activeProvider.fetchModels();
|
|
172
|
+
}
|
|
173
|
+
// Return current model as the only option
|
|
174
|
+
return [{ id: this.activeProvider.currentModel, name: this.activeProvider.currentModel }];
|
|
175
|
+
}
|
|
176
|
+
get reasoningEffort() {
|
|
177
|
+
return this.activeProvider?.reasoningEffort ?? null;
|
|
178
|
+
}
|
|
179
|
+
async setReasoningEffort(effort) {
|
|
180
|
+
if (!this.activeProvider) {
|
|
181
|
+
await this.switchProvider(this.config.defaultProvider);
|
|
182
|
+
}
|
|
183
|
+
this.activeProvider.reasoningEffort = effort;
|
|
184
|
+
}
|
|
185
|
+
/** Last input token count reported by the provider (for context budget tracking). */
|
|
186
|
+
get lastInputTokens() {
|
|
187
|
+
return this._lastInputTokens;
|
|
188
|
+
}
|
|
189
|
+
async *maybeCheckpoint(session) {
|
|
190
|
+
if (!this._contextGate || !this.activeProvider)
|
|
191
|
+
return;
|
|
192
|
+
const model = this.activeProvider.currentModel;
|
|
193
|
+
const threshold = this._contextGate.checkThreshold(model, this._lastInputTokens);
|
|
194
|
+
if (!threshold)
|
|
195
|
+
return;
|
|
196
|
+
// Ask the model to write a gist of the conversation before we wipe it
|
|
197
|
+
const gist = await this.generateCheckpointGist(session);
|
|
198
|
+
// Save gist to memory and build briefing
|
|
199
|
+
const briefing = this._contextGate.performCheckpointWithGist(gist);
|
|
200
|
+
// Reset provider history with the briefing
|
|
201
|
+
this.activeProvider.resetHistory(session, briefing);
|
|
202
|
+
this._lastInputTokens = 0;
|
|
203
|
+
yield {
|
|
204
|
+
type: "text",
|
|
205
|
+
text: "\n\n---\n*[Context checkpoint — conversation archived, continuing from memory]*\n\n",
|
|
206
|
+
delta: "\n\n---\n*[Context checkpoint — conversation archived, continuing from memory]*\n\n",
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
async generateCheckpointGist(session) {
|
|
210
|
+
const provider = this.activeProvider;
|
|
211
|
+
let gist = "";
|
|
212
|
+
try {
|
|
213
|
+
for await (const event of provider.send(session, CHECKPOINT_GIST_PROMPT, [])) {
|
|
214
|
+
if (event.type === "text" && event.delta) {
|
|
215
|
+
gist += event.delta;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// If gist generation fails, continue with empty gist
|
|
221
|
+
gist = "(gist generation failed)";
|
|
222
|
+
}
|
|
223
|
+
return gist;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const CHECKPOINT_GIST_PROMPT = `SYSTEM: Your conversation context is about to be archived because it's getting too long. You'll be resumed with your memory tree and this gist.
|
|
227
|
+
|
|
228
|
+
Write a concise gist covering:
|
|
229
|
+
1. **Goal**: What you're trying to achieve
|
|
230
|
+
2. **Status**: Where you are right now — what's running, what just finished, what the latest results are
|
|
231
|
+
3. **Plan**: What you were about to do next, and why
|
|
232
|
+
4. **Key context**: Anything critical that isn't already in your memory tree (observations not yet saved, hunches, dead ends to avoid)
|
|
233
|
+
|
|
234
|
+
Be direct and dense. This is a note to yourself.`;
|
|
235
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type AgentState = "idle" | "active" | "sleeping" | "waiting" | "error";
|
|
2
|
+
export interface StateTransition {
|
|
3
|
+
from: AgentState;
|
|
4
|
+
to: AgentState;
|
|
5
|
+
reason: string;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
}
|
|
8
|
+
type StateListener = (state: AgentState, transition: StateTransition) => void;
|
|
9
|
+
export declare class AgentStateMachine {
|
|
10
|
+
private _state;
|
|
11
|
+
private _history;
|
|
12
|
+
private _listeners;
|
|
13
|
+
get state(): AgentState;
|
|
14
|
+
get history(): readonly StateTransition[];
|
|
15
|
+
transition(to: AgentState, reason: string): void;
|
|
16
|
+
onTransition(listener: StateListener): () => void;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=state-machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../../src/core/state-machine.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAE9E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,aAAa,GAAG,CACnB,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,eAAe,KACxB,IAAI,CAAC;AAUV,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,UAAU,CAAuB;IAEzC,IAAI,KAAK,IAAI,UAAU,CAEtB;IAED,IAAI,OAAO,IAAI,SAAS,eAAe,EAAE,CAExC;IAED,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAuBhD,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;CAMlD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const VALID_TRANSITIONS = {
|
|
2
|
+
idle: ["active"],
|
|
3
|
+
active: ["idle", "sleeping", "waiting", "error"],
|
|
4
|
+
sleeping: ["active", "error"],
|
|
5
|
+
waiting: ["active", "error"],
|
|
6
|
+
error: ["idle", "active"],
|
|
7
|
+
};
|
|
8
|
+
export class AgentStateMachine {
|
|
9
|
+
_state = "idle";
|
|
10
|
+
_history = [];
|
|
11
|
+
_listeners = [];
|
|
12
|
+
get state() {
|
|
13
|
+
return this._state;
|
|
14
|
+
}
|
|
15
|
+
get history() {
|
|
16
|
+
return this._history;
|
|
17
|
+
}
|
|
18
|
+
transition(to, reason) {
|
|
19
|
+
const valid = VALID_TRANSITIONS[this._state];
|
|
20
|
+
if (!valid.includes(to)) {
|
|
21
|
+
throw new Error(`Invalid state transition: ${this._state} → ${to}`);
|
|
22
|
+
}
|
|
23
|
+
const transition = {
|
|
24
|
+
from: this._state,
|
|
25
|
+
to,
|
|
26
|
+
reason,
|
|
27
|
+
timestamp: Date.now(),
|
|
28
|
+
};
|
|
29
|
+
this._state = to;
|
|
30
|
+
this._history.push(transition);
|
|
31
|
+
for (const listener of this._listeners) {
|
|
32
|
+
listener(to, transition);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
onTransition(listener) {
|
|
36
|
+
this._listeners.push(listener);
|
|
37
|
+
return () => {
|
|
38
|
+
this._listeners = this._listeners.filter((l) => l !== listener);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=state-machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-machine.js","sourceRoot":"","sources":["../../src/core/state-machine.ts"],"names":[],"mappings":"AAcA,MAAM,iBAAiB,GAAqC;IAC1D,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;IAChD,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC7B,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC5B,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;CAC1B,CAAC;AAEF,MAAM,OAAO,iBAAiB;IACpB,MAAM,GAAe,MAAM,CAAC;IAC5B,QAAQ,GAAsB,EAAE,CAAC;IACjC,UAAU,GAAoB,EAAE,CAAC;IAEzC,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,UAAU,CAAC,EAAc,EAAE,MAAc;QACvC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,CAAC,MAAM,MAAM,EAAE,EAAE,CACnD,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAoB;YAClC,IAAI,EAAE,IAAI,CAAC,MAAM;YACjB,EAAE;YACF,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE/B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,YAAY,CAAC,QAAuB;QAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface StickyNote {
|
|
2
|
+
num: number;
|
|
3
|
+
text: string;
|
|
4
|
+
createdAt: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Manages sticky notes — persistent reminders injected into every model turn.
|
|
8
|
+
* Notes are numbered starting from 1.
|
|
9
|
+
*/
|
|
10
|
+
export declare class StickyManager {
|
|
11
|
+
private notes;
|
|
12
|
+
private nextNum;
|
|
13
|
+
add(text: string): StickyNote;
|
|
14
|
+
remove(num: number): boolean;
|
|
15
|
+
list(): StickyNote[];
|
|
16
|
+
count(): number;
|
|
17
|
+
/** Format sticky notes for injection into the model's context. */
|
|
18
|
+
formatForModel(): string | null;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=stickies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stickies.d.ts","sourceRoot":"","sources":["../../src/core/stickies.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,OAAO,CAAK;IAEpB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAU7B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAO5B,IAAI,IAAI,UAAU,EAAE;IAIpB,KAAK,IAAI,MAAM;IAIf,kEAAkE;IAClE,cAAc,IAAI,MAAM,GAAG,IAAI;CAYhC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages sticky notes — persistent reminders injected into every model turn.
|
|
3
|
+
* Notes are numbered starting from 1.
|
|
4
|
+
*/
|
|
5
|
+
export class StickyManager {
|
|
6
|
+
notes = [];
|
|
7
|
+
nextNum = 1;
|
|
8
|
+
add(text) {
|
|
9
|
+
const note = {
|
|
10
|
+
num: this.nextNum++,
|
|
11
|
+
text,
|
|
12
|
+
createdAt: Date.now(),
|
|
13
|
+
};
|
|
14
|
+
this.notes.push(note);
|
|
15
|
+
return note;
|
|
16
|
+
}
|
|
17
|
+
remove(num) {
|
|
18
|
+
const idx = this.notes.findIndex((n) => n.num === num);
|
|
19
|
+
if (idx === -1)
|
|
20
|
+
return false;
|
|
21
|
+
this.notes.splice(idx, 1);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
list() {
|
|
25
|
+
return [...this.notes];
|
|
26
|
+
}
|
|
27
|
+
count() {
|
|
28
|
+
return this.notes.length;
|
|
29
|
+
}
|
|
30
|
+
/** Format sticky notes for injection into the model's context. */
|
|
31
|
+
formatForModel() {
|
|
32
|
+
if (this.notes.length === 0)
|
|
33
|
+
return null;
|
|
34
|
+
const lines = this.notes.map((n) => ` [${n.num}] ${n.text}`);
|
|
35
|
+
return [
|
|
36
|
+
"⚠️ STICKY NOTES — The user has pinned the following reminders. Keep these at the forefront of your thinking at ALL times:",
|
|
37
|
+
...lines,
|
|
38
|
+
].join("\n");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=stickies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stickies.js","sourceRoot":"","sources":["../../src/core/stickies.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,KAAK,GAAiB,EAAE,CAAC;IACzB,OAAO,GAAG,CAAC,CAAC;IAEpB,GAAG,CAAC,IAAY;QACd,MAAM,IAAI,GAAe;YACvB,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE;YACnB,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QACvD,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,kEAAkE;IAClE,cAAc;QACZ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAChC,CAAC;QAEF,OAAO;YACL,2HAA2H;YAC3H,GAAG,KAAK;SACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { withFullScreen } from "fullscreen-ink";
|
|
4
|
+
import { App } from "./app.js";
|
|
5
|
+
import { createMouseFilter } from "./ui/mouse-filter.js";
|
|
6
|
+
import { VERSION } from "./version.js";
|
|
7
|
+
// Parse CLI args
|
|
8
|
+
const args = process.argv.slice(2);
|
|
9
|
+
let providerArg;
|
|
10
|
+
let claudeModeArg;
|
|
11
|
+
for (let i = 0; i < args.length; i++) {
|
|
12
|
+
const arg = args[i];
|
|
13
|
+
if ((arg === "--provider" || arg === "-p") && args[i + 1]) {
|
|
14
|
+
const p = args[i + 1];
|
|
15
|
+
if (p === "claude" || p === "openai") {
|
|
16
|
+
providerArg = p;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.error(`Unknown provider: ${p}. Use "claude" or "openai".`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
i++;
|
|
23
|
+
}
|
|
24
|
+
else if (arg === "--claude-mode" && args[i + 1]) {
|
|
25
|
+
const m = args[i + 1];
|
|
26
|
+
if (m === "cli" || m === "api") {
|
|
27
|
+
claudeModeArg = m;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.error(`Unknown claude mode: ${m}. Use "cli" or "api".`);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
i++;
|
|
34
|
+
}
|
|
35
|
+
else if (arg === "--version" || arg === "-v" || arg === "-V") {
|
|
36
|
+
console.log(`helios ${VERSION}`);
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
39
|
+
else if (arg === "--help" || arg === "-h") {
|
|
40
|
+
console.log(`
|
|
41
|
+
Helios ${VERSION} - Autonomous ML Research Agent
|
|
42
|
+
|
|
43
|
+
Usage: helios [options]
|
|
44
|
+
|
|
45
|
+
Options:
|
|
46
|
+
-p, --provider <claude|openai> Model provider (default: claude)
|
|
47
|
+
--claude-mode <cli|api> Force Claude auth mode (cli = Agent SDK, api = API key)
|
|
48
|
+
-v, --version Show version
|
|
49
|
+
-h, --help Show this help
|
|
50
|
+
|
|
51
|
+
Environment:
|
|
52
|
+
ANTHROPIC_API_KEY Claude API key (for Claude provider with API key auth)
|
|
53
|
+
|
|
54
|
+
Auth:
|
|
55
|
+
Claude: Install \`claude\` CLI and run \`claude login\`, or set ANTHROPIC_API_KEY
|
|
56
|
+
OpenAI: OAuth login via ChatGPT Plus/Pro on first run
|
|
57
|
+
`);
|
|
58
|
+
process.exit(0);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Filter mouse escape sequences from stdin before Ink sees them
|
|
62
|
+
const { filteredStdin, mouseEmitter } = createMouseFilter(process.stdin);
|
|
63
|
+
// fullscreen-ink handles alternate screen buffer + cursor hiding
|
|
64
|
+
const { start, waitUntilExit } = withFullScreen(_jsx(App, { defaultProvider: providerArg, claudeMode: claudeModeArg, mouseEmitter: mouseEmitter }), { exitOnCtrlC: false, stdin: filteredStdin });
|
|
65
|
+
await start();
|
|
66
|
+
await waitUntilExit();
|
|
67
|
+
process.exit(0);
|
|
68
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";;AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,iBAAiB;AACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,WAA4C,CAAC;AACjD,IAAI,aAAwC,CAAC;AAE7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YACrC,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,6BAA6B,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;SAAM,IAAI,GAAG,KAAK,eAAe,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;YAC/B,aAAa,GAAG,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,uBAAuB,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;SAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC;SACP,OAAO;;;;;;;;;;;;;;;;CAgBf,CAAC,CAAC;QACC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEzE,iEAAiE;AACjE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,cAAc,CAC7C,KAAC,GAAG,IAAC,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,GAAI,EAC5F,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,aAAoB,EAAE,CACpD,CAAC;AAEF,MAAM,KAAK,EAAE,CAAC;AACd,MAAM,aAAa,EAAE,CAAC;AACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { MemoryStore } from "./memory-store.js";
|
|
2
|
+
import type { RemoteExecutor } from "../remote/executor.js";
|
|
3
|
+
import type { MetricStore } from "../metrics/store.js";
|
|
4
|
+
export interface ContextGateConfig {
|
|
5
|
+
/** Override checkpoint threshold (for testing). */
|
|
6
|
+
thresholdOverride?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* ContextGate monitors token usage and triggers checkpoints when
|
|
10
|
+
* the context window is filling up.
|
|
11
|
+
*
|
|
12
|
+
* Uses actual input_tokens from the API response (reported in DoneEvent.usage)
|
|
13
|
+
* rather than re-estimating from history text.
|
|
14
|
+
*
|
|
15
|
+
* On checkpoint:
|
|
16
|
+
* 1. Save active tasks + latest metrics to memory
|
|
17
|
+
* 2. Build a briefing from the memory tree
|
|
18
|
+
* 3. Orchestrator resets provider history with the briefing
|
|
19
|
+
*/
|
|
20
|
+
export declare class ContextGate {
|
|
21
|
+
private memory;
|
|
22
|
+
private executor;
|
|
23
|
+
private metricStore;
|
|
24
|
+
private config;
|
|
25
|
+
constructor(memory: MemoryStore, config?: ContextGateConfig);
|
|
26
|
+
/** Update the memory store's session ID when a new session starts. */
|
|
27
|
+
onSessionStart(sessionId: string): void;
|
|
28
|
+
setExecutor(executor: RemoteExecutor): void;
|
|
29
|
+
setMetricStore(store: MetricStore): void;
|
|
30
|
+
/**
|
|
31
|
+
* Check if actual input token count exceeds checkpoint threshold.
|
|
32
|
+
* Called by Orchestrator after each send() completes.
|
|
33
|
+
*/
|
|
34
|
+
checkThreshold(model: string, inputTokens: number): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Perform a checkpoint with a model-generated gist.
|
|
37
|
+
* Saves active state + gist to memory, returns the briefing.
|
|
38
|
+
*/
|
|
39
|
+
performCheckpointWithGist(gist: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Perform a checkpoint without a gist (fallback).
|
|
42
|
+
*/
|
|
43
|
+
performCheckpointFromOrchestrator(): string;
|
|
44
|
+
private saveActiveTasks;
|
|
45
|
+
/** Build a checkpoint briefing string from the memory tree + optional gist. */
|
|
46
|
+
buildBriefing(gist: string | null): string;
|
|
47
|
+
private getLatestMetrics;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=context-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-gate.d.ts","sourceRoot":"","sources":["../../src/memory/context-gate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,WAAW,EAAE,MAAM,GAAE,iBAAsB;IAK/D,sEAAsE;IACtE,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIvC,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAI3C,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAIxC;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAO3D;;;OAGG;IACH,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAc/C;;OAEG;IACH,iCAAiC,IAAI,MAAM;IAK3C,OAAO,CAAC,eAAe;IAuBvB,+EAA+E;IAC/E,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IA2B1C,OAAO,CAAC,gBAAgB;CAiBzB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { getCheckpointThreshold } from "./token-estimator.js";
|
|
2
|
+
/**
|
|
3
|
+
* ContextGate monitors token usage and triggers checkpoints when
|
|
4
|
+
* the context window is filling up.
|
|
5
|
+
*
|
|
6
|
+
* Uses actual input_tokens from the API response (reported in DoneEvent.usage)
|
|
7
|
+
* rather than re-estimating from history text.
|
|
8
|
+
*
|
|
9
|
+
* On checkpoint:
|
|
10
|
+
* 1. Save active tasks + latest metrics to memory
|
|
11
|
+
* 2. Build a briefing from the memory tree
|
|
12
|
+
* 3. Orchestrator resets provider history with the briefing
|
|
13
|
+
*/
|
|
14
|
+
export class ContextGate {
|
|
15
|
+
memory;
|
|
16
|
+
executor = null;
|
|
17
|
+
metricStore = null;
|
|
18
|
+
config;
|
|
19
|
+
constructor(memory, config = {}) {
|
|
20
|
+
this.memory = memory;
|
|
21
|
+
this.config = config;
|
|
22
|
+
}
|
|
23
|
+
/** Update the memory store's session ID when a new session starts. */
|
|
24
|
+
onSessionStart(sessionId) {
|
|
25
|
+
this.memory.setSession(sessionId);
|
|
26
|
+
}
|
|
27
|
+
setExecutor(executor) {
|
|
28
|
+
this.executor = executor;
|
|
29
|
+
}
|
|
30
|
+
setMetricStore(store) {
|
|
31
|
+
this.metricStore = store;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if actual input token count exceeds checkpoint threshold.
|
|
35
|
+
* Called by Orchestrator after each send() completes.
|
|
36
|
+
*/
|
|
37
|
+
checkThreshold(model, inputTokens) {
|
|
38
|
+
if (inputTokens === 0)
|
|
39
|
+
return false;
|
|
40
|
+
const threshold = this.config.thresholdOverride ?? getCheckpointThreshold(model);
|
|
41
|
+
return inputTokens >= threshold;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Perform a checkpoint with a model-generated gist.
|
|
45
|
+
* Saves active state + gist to memory, returns the briefing.
|
|
46
|
+
*/
|
|
47
|
+
performCheckpointWithGist(gist) {
|
|
48
|
+
// Save the model's gist
|
|
49
|
+
this.memory.write("/context/gist", "Model-generated summary of conversation before checkpoint", gist);
|
|
50
|
+
// Save active tasks to /context/active-tasks
|
|
51
|
+
this.saveActiveTasks();
|
|
52
|
+
return this.buildBriefing(gist);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Perform a checkpoint without a gist (fallback).
|
|
56
|
+
*/
|
|
57
|
+
performCheckpointFromOrchestrator() {
|
|
58
|
+
this.saveActiveTasks();
|
|
59
|
+
return this.buildBriefing(null);
|
|
60
|
+
}
|
|
61
|
+
saveActiveTasks() {
|
|
62
|
+
if (!this.executor)
|
|
63
|
+
return;
|
|
64
|
+
const tasks = this.executor.getBackgroundProcesses();
|
|
65
|
+
if (tasks.length === 0)
|
|
66
|
+
return;
|
|
67
|
+
const taskLines = tasks.map((t) => {
|
|
68
|
+
const latestMetrics = this.getLatestMetrics(t.machineId, t.pid);
|
|
69
|
+
return [
|
|
70
|
+
`${t.machineId}:${t.pid} — ${t.command.slice(0, 80)}`,
|
|
71
|
+
latestMetrics ? ` metrics: ${latestMetrics}` : null,
|
|
72
|
+
]
|
|
73
|
+
.filter(Boolean)
|
|
74
|
+
.join("\n");
|
|
75
|
+
});
|
|
76
|
+
this.memory.write("/context/active-tasks", `${tasks.length} running task(s)`, taskLines.join("\n\n"));
|
|
77
|
+
}
|
|
78
|
+
/** Build a checkpoint briefing string from the memory tree + optional gist. */
|
|
79
|
+
buildBriefing(gist) {
|
|
80
|
+
const tree = this.memory.formatTree("/");
|
|
81
|
+
const parts = [
|
|
82
|
+
"=== CONTEXT CHECKPOINT ===",
|
|
83
|
+
"You are Helios, continuing an autonomous ML research session.",
|
|
84
|
+
"Your previous conversation has been archived.",
|
|
85
|
+
];
|
|
86
|
+
if (gist) {
|
|
87
|
+
parts.push("\n## Your gist (written by you before the checkpoint):\n", gist);
|
|
88
|
+
}
|
|
89
|
+
parts.push("\n## Memory tree:\n", tree, "\nUse memory_read(path) for details on any item above.", "Use memory_write to store new findings as you work.", "Continue working toward your goal.");
|
|
90
|
+
return parts.join("\n");
|
|
91
|
+
}
|
|
92
|
+
getLatestMetrics(machineId, pid) {
|
|
93
|
+
if (!this.metricStore)
|
|
94
|
+
return null;
|
|
95
|
+
const taskId = `${machineId}:${pid}`;
|
|
96
|
+
const names = this.metricStore.getMetricNames(taskId);
|
|
97
|
+
if (names.length === 0)
|
|
98
|
+
return null;
|
|
99
|
+
const parts = [];
|
|
100
|
+
for (const name of names.slice(0, 5)) {
|
|
101
|
+
const series = this.metricStore.getSeries(taskId, name, 1);
|
|
102
|
+
if (series.length > 0) {
|
|
103
|
+
parts.push(`${name}=${series[0].value}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return parts.length > 0 ? parts.join(", ") : null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=context-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-gate.js","sourceRoot":"","sources":["../../src/memory/context-gate.ts"],"names":[],"mappings":"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"}
|