@roackb2/heddle 0.0.7 → 0.0.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/README.md +207 -3
- package/dist/examples/cyberloop-observer.d.ts +3 -0
- package/dist/examples/cyberloop-observer.d.ts.map +1 -0
- package/dist/examples/cyberloop-observer.js +79 -0
- package/dist/examples/cyberloop-observer.js.map +1 -0
- package/dist/examples/heartbeat.d.ts +2 -0
- package/dist/examples/heartbeat.d.ts.map +1 -0
- package/dist/examples/heartbeat.js +61 -0
- package/dist/examples/heartbeat.js.map +1 -0
- package/dist/examples/host-events.d.ts +15 -0
- package/dist/examples/host-events.d.ts.map +1 -0
- package/dist/examples/host-events.js +233 -0
- package/dist/examples/host-events.js.map +1 -0
- package/dist/examples/programmatic-loop.d.ts +2 -0
- package/dist/examples/programmatic-loop.d.ts.map +1 -0
- package/dist/examples/programmatic-loop.js +128 -0
- package/dist/examples/programmatic-loop.js.map +1 -0
- package/dist/src/cli/ask.d.ts.map +1 -1
- package/dist/src/cli/ask.js +10 -41
- package/dist/src/cli/ask.js.map +1 -1
- package/dist/src/cli/chat/App.d.ts.map +1 -1
- package/dist/src/cli/chat/App.js +48 -0
- package/dist/src/cli/chat/App.js.map +1 -1
- package/dist/src/cli/chat/hooks/useAgentRun.d.ts +9 -0
- package/dist/src/cli/chat/hooks/useAgentRun.d.ts.map +1 -1
- package/dist/src/cli/chat/hooks/useAgentRun.js +47 -26
- package/dist/src/cli/chat/hooks/useAgentRun.js.map +1 -1
- package/dist/src/cli/chat/state/local-commands.d.ts +3 -0
- package/dist/src/cli/chat/state/local-commands.d.ts.map +1 -1
- package/dist/src/cli/chat/state/local-commands.js +21 -0
- package/dist/src/cli/chat/state/local-commands.js.map +1 -1
- package/dist/src/cli/chat/state/storage.d.ts.map +1 -1
- package/dist/src/cli/chat/state/storage.js +2 -0
- package/dist/src/cli/chat/state/storage.js.map +1 -1
- package/dist/src/cli/chat/state/types.d.ts +1 -0
- package/dist/src/cli/chat/state/types.d.ts.map +1 -1
- package/dist/src/cli/chat/submit.d.ts +3 -0
- package/dist/src/cli/chat/submit.d.ts.map +1 -1
- package/dist/src/cli/chat/submit.js +3 -0
- package/dist/src/cli/chat/submit.js.map +1 -1
- package/dist/src/cli/chat/utils/format.d.ts.map +1 -1
- package/dist/src/cli/chat/utils/format.js +6 -0
- package/dist/src/cli/chat/utils/format.js.map +1 -1
- package/dist/src/cli/chat/utils/runtime.d.ts.map +1 -1
- package/dist/src/cli/chat/utils/runtime.js +3 -19
- package/dist/src/cli/chat/utils/runtime.js.map +1 -1
- package/dist/src/cli/main.js +0 -0
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/integrations/cyberloop-kinematics.d.ts +16 -0
- package/dist/src/integrations/cyberloop-kinematics.d.ts.map +1 -0
- package/dist/src/integrations/cyberloop-kinematics.js +77 -0
- package/dist/src/integrations/cyberloop-kinematics.js.map +1 -0
- package/dist/src/integrations/cyberloop.d.ts +88 -0
- package/dist/src/integrations/cyberloop.d.ts.map +1 -0
- package/dist/src/integrations/cyberloop.js +244 -0
- package/dist/src/integrations/cyberloop.js.map +1 -0
- package/dist/src/llm/factory.d.ts +1 -1
- package/dist/src/llm/factory.d.ts.map +1 -1
- package/dist/src/llm/factory.js +2 -19
- package/dist/src/llm/factory.js.map +1 -1
- package/dist/src/llm/providers.d.ts +3 -0
- package/dist/src/llm/providers.d.ts.map +1 -0
- package/dist/src/llm/providers.js +21 -0
- package/dist/src/llm/providers.js.map +1 -0
- package/dist/src/run-agent.d.ts +3 -1
- package/dist/src/run-agent.d.ts.map +1 -1
- package/dist/src/run-agent.js +10 -0
- package/dist/src/run-agent.js.map +1 -1
- package/dist/src/runtime/agent-loop.d.ts +42 -0
- package/dist/src/runtime/agent-loop.d.ts.map +1 -0
- package/dist/src/runtime/agent-loop.js +173 -0
- package/dist/src/runtime/agent-loop.js.map +1 -0
- package/dist/src/runtime/api-keys.d.ts +8 -0
- package/dist/src/runtime/api-keys.d.ts.map +1 -0
- package/dist/src/runtime/api-keys.js +25 -0
- package/dist/src/runtime/api-keys.js.map +1 -0
- package/dist/src/runtime/default-tools.d.ts +12 -0
- package/dist/src/runtime/default-tools.d.ts.map +1 -0
- package/dist/src/runtime/default-tools.js +40 -0
- package/dist/src/runtime/default-tools.js.map +1 -0
- package/dist/src/runtime/events.d.ts +128 -0
- package/dist/src/runtime/events.d.ts.map +1 -0
- package/dist/src/runtime/events.js +41 -0
- package/dist/src/runtime/events.js.map +1 -0
- package/dist/src/runtime/heartbeat-store.d.ts +20 -0
- package/dist/src/runtime/heartbeat-store.d.ts.map +1 -0
- package/dist/src/runtime/heartbeat-store.js +42 -0
- package/dist/src/runtime/heartbeat-store.js.map +1 -0
- package/dist/src/runtime/heartbeat.d.ts +39 -0
- package/dist/src/runtime/heartbeat.d.ts.map +1 -0
- package/dist/src/runtime/heartbeat.js +117 -0
- package/dist/src/runtime/heartbeat.js.map +1 -0
- package/dist/src/trace/format.d.ts.map +1 -1
- package/dist/src/trace/format.js +8 -0
- package/dist/src/trace/format.js.map +1 -1
- package/dist/src/types.d.ts +8 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/logger.d.ts.map +1 -1
- package/dist/src/utils/logger.js +2 -2
- package/dist/src/utils/logger.js.map +1 -1
- package/package.json +31 -2
- package/dist/src/__tests__/chat-activity-format.test.d.ts +0 -2
- package/dist/src/__tests__/chat-activity-format.test.d.ts.map +0 -1
- package/dist/src/__tests__/chat-activity-format.test.js +0 -41
- package/dist/src/__tests__/chat-activity-format.test.js.map +0 -1
- package/dist/src/__tests__/chat-compaction.test.d.ts +0 -2
- package/dist/src/__tests__/chat-compaction.test.d.ts.map +0 -1
- package/dist/src/__tests__/chat-compaction.test.js +0 -63
- package/dist/src/__tests__/chat-compaction.test.js.map +0 -1
- package/dist/src/__tests__/chat-format.test.d.ts +0 -2
- package/dist/src/__tests__/chat-format.test.d.ts.map +0 -1
- package/dist/src/__tests__/chat-format.test.js +0 -137
- package/dist/src/__tests__/chat-format.test.js.map +0 -1
- package/dist/src/__tests__/chat-runtime.test.d.ts +0 -2
- package/dist/src/__tests__/chat-runtime.test.d.ts.map +0 -1
- package/dist/src/__tests__/chat-runtime.test.js +0 -39
- package/dist/src/__tests__/chat-runtime.test.js.map +0 -1
- package/dist/src/__tests__/core-utils.test.d.ts +0 -2
- package/dist/src/__tests__/core-utils.test.d.ts.map +0 -1
- package/dist/src/__tests__/core-utils.test.js +0 -87
- package/dist/src/__tests__/core-utils.test.js.map +0 -1
- package/dist/src/__tests__/file-mentions.test.d.ts +0 -2
- package/dist/src/__tests__/file-mentions.test.d.ts.map +0 -1
- package/dist/src/__tests__/file-mentions.test.js +0 -29
- package/dist/src/__tests__/file-mentions.test.js.map +0 -1
- package/dist/src/__tests__/llm-factory.test.d.ts +0 -2
- package/dist/src/__tests__/llm-factory.test.d.ts.map +0 -1
- package/dist/src/__tests__/llm-factory.test.js +0 -45
- package/dist/src/__tests__/llm-factory.test.js.map +0 -1
- package/dist/src/__tests__/local-commands.test.d.ts +0 -2
- package/dist/src/__tests__/local-commands.test.d.ts.map +0 -1
- package/dist/src/__tests__/local-commands.test.js +0 -153
- package/dist/src/__tests__/local-commands.test.js.map +0 -1
- package/dist/src/__tests__/project-approval-rules.test.d.ts +0 -2
- package/dist/src/__tests__/project-approval-rules.test.d.ts.map +0 -1
- package/dist/src/__tests__/project-approval-rules.test.js +0 -135
- package/dist/src/__tests__/project-approval-rules.test.js.map +0 -1
- package/dist/src/__tests__/prompt-input.test.d.ts +0 -2
- package/dist/src/__tests__/prompt-input.test.d.ts.map +0 -1
- package/dist/src/__tests__/prompt-input.test.js +0 -57
- package/dist/src/__tests__/prompt-input.test.js.map +0 -1
- package/dist/src/__tests__/prompts.test.d.ts +0 -2
- package/dist/src/__tests__/prompts.test.d.ts.map +0 -1
- package/dist/src/__tests__/prompts.test.js +0 -46
- package/dist/src/__tests__/prompts.test.js.map +0 -1
- package/dist/src/__tests__/run-agent.test.d.ts +0 -2
- package/dist/src/__tests__/run-agent.test.d.ts.map +0 -1
- package/dist/src/__tests__/run-agent.test.js +0 -1276
- package/dist/src/__tests__/run-agent.test.js.map +0 -1
- package/dist/src/__tests__/run-shell.command.test.d.ts +0 -2
- package/dist/src/__tests__/run-shell.command.test.d.ts.map +0 -1
- package/dist/src/__tests__/run-shell.command.test.js +0 -188
- package/dist/src/__tests__/run-shell.command.test.js.map +0 -1
- package/dist/src/__tests__/smoke.test.d.ts +0 -2
- package/dist/src/__tests__/smoke.test.d.ts.map +0 -1
- package/dist/src/__tests__/smoke.test.js +0 -314
- package/dist/src/__tests__/smoke.test.js.map +0 -1
- package/dist/src/__tests__/tools.test.d.ts +0 -2
- package/dist/src/__tests__/tools.test.d.ts.map +0 -1
- package/dist/src/__tests__/tools.test.js +0 -698
- package/dist/src/__tests__/tools.test.js.map +0 -1
- package/dist/src/__tests__/trace-format.test.d.ts +0 -2
- package/dist/src/__tests__/trace-format.test.d.ts.map +0 -1
- package/dist/src/__tests__/trace-format.test.js +0 -148
- package/dist/src/__tests__/trace-format.test.js.map +0 -1
- package/dist/src/cli/chat/actions.d.ts +0 -47
- package/dist/src/cli/chat/actions.d.ts.map +0 -1
- package/dist/src/cli/chat/actions.js +0 -215
- package/dist/src/cli/chat/actions.js.map +0 -1
- package/dist/src/cli/chat/format.d.ts +0 -23
- package/dist/src/cli/chat/format.d.ts.map +0 -1
- package/dist/src/cli/chat/format.js +0 -243
- package/dist/src/cli/chat/format.js.map +0 -1
- package/dist/src/cli/chat/local-commands.d.ts +0 -17
- package/dist/src/cli/chat/local-commands.d.ts.map +0 -1
- package/dist/src/cli/chat/local-commands.js +0 -180
- package/dist/src/cli/chat/local-commands.js.map +0 -1
- package/dist/src/cli/chat/panels.d.ts +0 -37
- package/dist/src/cli/chat/panels.d.ts.map +0 -1
- package/dist/src/cli/chat/panels.js +0 -142
- package/dist/src/cli/chat/panels.js.map +0 -1
- package/dist/src/cli/chat/runtime.d.ts +0 -26
- package/dist/src/cli/chat/runtime.d.ts.map +0 -1
- package/dist/src/cli/chat/runtime.js +0 -28
- package/dist/src/cli/chat/runtime.js.map +0 -1
- package/dist/src/cli/chat/storage.d.ts +0 -13
- package/dist/src/cli/chat/storage.d.ts.map +0 -1
- package/dist/src/cli/chat/storage.js +0 -126
- package/dist/src/cli/chat/storage.js.map +0 -1
- package/dist/src/cli/chat/types.d.ts +0 -51
- package/dist/src/cli/chat/types.d.ts.map +0 -1
- package/dist/src/cli/chat/types.js +0 -2
- package/dist/src/cli/chat/types.js.map +0 -1
- package/dist/src/cli/chat/use-run-state.d.ts +0 -23
- package/dist/src/cli/chat/use-run-state.d.ts.map +0 -1
- package/dist/src/cli/chat/use-run-state.js +0 -118
- package/dist/src/cli/chat/use-run-state.js.map +0 -1
- package/dist/src/cli/chat/use-sessions.d.ts +0 -21
- package/dist/src/cli/chat/use-sessions.d.ts.map +0 -1
- package/dist/src/cli/chat/use-sessions.js +0 -111
- package/dist/src/cli/chat/use-sessions.js.map +0 -1
- package/dist/src/cli/chat-actions.d.ts +0 -47
- package/dist/src/cli/chat-actions.d.ts.map +0 -1
- package/dist/src/cli/chat-actions.js +0 -215
- package/dist/src/cli/chat-actions.js.map +0 -1
- package/dist/src/cli/chat-format.d.ts +0 -23
- package/dist/src/cli/chat-format.d.ts.map +0 -1
- package/dist/src/cli/chat-format.js +0 -243
- package/dist/src/cli/chat-format.js.map +0 -1
- package/dist/src/cli/chat-local-commands.d.ts +0 -17
- package/dist/src/cli/chat-local-commands.d.ts.map +0 -1
- package/dist/src/cli/chat-local-commands.js +0 -180
- package/dist/src/cli/chat-local-commands.js.map +0 -1
- package/dist/src/cli/chat-panels.d.ts +0 -37
- package/dist/src/cli/chat-panels.d.ts.map +0 -1
- package/dist/src/cli/chat-panels.js +0 -142
- package/dist/src/cli/chat-panels.js.map +0 -1
- package/dist/src/cli/chat-runtime.d.ts +0 -26
- package/dist/src/cli/chat-runtime.d.ts.map +0 -1
- package/dist/src/cli/chat-runtime.js +0 -28
- package/dist/src/cli/chat-runtime.js.map +0 -1
- package/dist/src/cli/chat-storage.d.ts +0 -13
- package/dist/src/cli/chat-storage.d.ts.map +0 -1
- package/dist/src/cli/chat-storage.js +0 -126
- package/dist/src/cli/chat-storage.js.map +0 -1
- package/dist/src/cli/chat-submit.d.ts +0 -28
- package/dist/src/cli/chat-submit.d.ts.map +0 -1
- package/dist/src/cli/chat-submit.js +0 -90
- package/dist/src/cli/chat-submit.js.map +0 -1
- package/dist/src/cli/chat-types.d.ts +0 -51
- package/dist/src/cli/chat-types.d.ts.map +0 -1
- package/dist/src/cli/chat-types.js +0 -2
- package/dist/src/cli/chat-types.js.map +0 -1
- package/dist/src/cli/chat.d.ts +0 -4
- package/dist/src/cli/chat.d.ts.map +0 -1
- package/dist/src/cli/chat.js +0 -153
- package/dist/src/cli/chat.js.map +0 -1
- package/dist/src/cli/useChatRunState.d.ts +0 -23
- package/dist/src/cli/useChatRunState.d.ts.map +0 -1
- package/dist/src/cli/useChatRunState.js +0 -118
- package/dist/src/cli/useChatRunState.js.map +0 -1
- package/dist/src/cli/useChatSessions.d.ts +0 -21
- package/dist/src/cli/useChatSessions.d.ts.map +0 -1
- package/dist/src/cli/useChatSessions.js +0 -111
- package/dist/src/cli/useChatSessions.js.map +0 -1
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Host Events Example
|
|
4
|
+
*
|
|
5
|
+
* Demonstrates how to consume Heddle's structured event stream for:
|
|
6
|
+
* - Real-time progress monitoring
|
|
7
|
+
* - Tool execution tracking
|
|
8
|
+
* - Checkpoint persistence
|
|
9
|
+
* - Escalation routing (for CyberLoop/Lucid integration)
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* HEDDLE_EXAMPLE_MODEL=gpt-5.1-codex-mini npx tsx examples/host-events.ts
|
|
13
|
+
*/
|
|
14
|
+
import { runAgentLoop, runAgentHeartbeat } from '../src/index.js';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Mock LLM for demo purposes (replace with real LLM in production)
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
const createMockLlm = (scenario) => {
|
|
19
|
+
let turn = 0;
|
|
20
|
+
return {
|
|
21
|
+
info: {
|
|
22
|
+
provider: 'openai',
|
|
23
|
+
model: 'gpt-demo',
|
|
24
|
+
capabilities: {
|
|
25
|
+
toolCalls: true,
|
|
26
|
+
systemMessages: true,
|
|
27
|
+
reasoningSummaries: false,
|
|
28
|
+
parallelToolCalls: true,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
async chat(messages) {
|
|
32
|
+
turn++;
|
|
33
|
+
if (scenario === 'success') {
|
|
34
|
+
return { content: `Demo response turn ${turn}` };
|
|
35
|
+
}
|
|
36
|
+
if (scenario === 'tool-use' && turn === 1) {
|
|
37
|
+
return {
|
|
38
|
+
content: 'Using echo tool.',
|
|
39
|
+
toolCalls: [{ id: `call-${turn}`, tool: 'echo', input: { message: 'hello' } }],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (scenario === 'escalate') {
|
|
43
|
+
return {
|
|
44
|
+
content: 'Blocked by policy and need human input.\n\nHEARTBEAT_DECISION: escalate',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return { content: `Turn ${turn} complete.` };
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Example tools
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
const echoTool = {
|
|
55
|
+
name: 'echo',
|
|
56
|
+
description: 'Echoes input back',
|
|
57
|
+
parameters: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
properties: { message: { type: 'string' } },
|
|
60
|
+
required: ['message'],
|
|
61
|
+
},
|
|
62
|
+
async execute(input) {
|
|
63
|
+
return { ok: true, output: input };
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// Structured event logger - demonstrates host-facing event consumption
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
class StructuredEventLogger {
|
|
70
|
+
runId = null;
|
|
71
|
+
events = [];
|
|
72
|
+
onEvent(event) {
|
|
73
|
+
this.events.push(event);
|
|
74
|
+
// Capture runId from first event for correlation
|
|
75
|
+
if (!this.runId && 'runId' in event) {
|
|
76
|
+
this.runId = event.runId;
|
|
77
|
+
console.log(`\n📋 Run started: ${this.runId}`);
|
|
78
|
+
console.log('='.repeat(60));
|
|
79
|
+
}
|
|
80
|
+
switch (event.type) {
|
|
81
|
+
case 'loop.started':
|
|
82
|
+
console.log(`\n🚀 Loop started`);
|
|
83
|
+
console.log(` Goal: ${event.goal}`);
|
|
84
|
+
console.log(` Model: ${event.model} (${event.provider})`);
|
|
85
|
+
if (event.resumedFromCheckpoint) {
|
|
86
|
+
console.log(` Resumed from: ${event.resumedFromCheckpoint}`);
|
|
87
|
+
}
|
|
88
|
+
break;
|
|
89
|
+
case 'loop.resumed':
|
|
90
|
+
console.log(`\n🔄 Resuming from checkpoint: ${event.fromCheckpoint}`);
|
|
91
|
+
console.log(` Prior trace events: ${event.priorTraceEvents}`);
|
|
92
|
+
break;
|
|
93
|
+
case 'assistant.stream':
|
|
94
|
+
// Debounce stream events for cleaner output
|
|
95
|
+
if (event.done) {
|
|
96
|
+
console.log(`\n💬 Assistant [step ${event.step}]: "${event.text.slice(0, 60)}..."`);
|
|
97
|
+
}
|
|
98
|
+
break;
|
|
99
|
+
case 'tool.calling':
|
|
100
|
+
console.log(`\n🔧 Tool calling [step ${event.step}]: ${event.tool}`);
|
|
101
|
+
console.log(` ToolCall ID: ${event.toolCallId}`);
|
|
102
|
+
console.log(` Requires approval: ${event.requiresApproval}`);
|
|
103
|
+
break;
|
|
104
|
+
case 'tool.completed':
|
|
105
|
+
console.log(`\n✅ Tool completed [step ${event.step}]: ${event.tool}`);
|
|
106
|
+
console.log(` Duration: ${event.durationMs}ms`);
|
|
107
|
+
console.log(` Result: ${event.result.ok ? 'success' : 'failed'}`);
|
|
108
|
+
if (!event.result.ok && event.result.error) {
|
|
109
|
+
console.log(` Error: ${event.result.error}`);
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
case 'trace':
|
|
113
|
+
// Trace events are verbose - log only important ones
|
|
114
|
+
if (event.event.type === 'run.finished') {
|
|
115
|
+
console.log(`\n🏁 Trace: run finished (${event.event.outcome})`);
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
case 'checkpoint.saved':
|
|
119
|
+
console.log(`\n💾 Checkpoint saved [step ${event.step}]`);
|
|
120
|
+
console.log(` Checkpoint run: ${event.checkpoint.runId}`);
|
|
121
|
+
console.log(` Created at: ${event.checkpoint.createdAt}`);
|
|
122
|
+
break;
|
|
123
|
+
case 'heartbeat.decision':
|
|
124
|
+
console.log(`\n💓 Heartbeat decision: ${event.decision}`);
|
|
125
|
+
console.log(` Outcome: ${event.outcome}`);
|
|
126
|
+
console.log(` Summary: ${event.summary.slice(0, 80)}...`);
|
|
127
|
+
break;
|
|
128
|
+
case 'escalation.required':
|
|
129
|
+
console.log(`\n🚨 ESCALATION REQUIRED [step ${event.step}]`);
|
|
130
|
+
console.log(` Task: ${event.task}`);
|
|
131
|
+
console.log(` Outcome: ${event.outcome}`);
|
|
132
|
+
console.log(` Summary: ${event.summary.slice(0, 100)}...`);
|
|
133
|
+
break;
|
|
134
|
+
case 'loop.finished':
|
|
135
|
+
console.log(`\n✨ Loop finished`);
|
|
136
|
+
console.log(` Outcome: ${event.outcome}`);
|
|
137
|
+
console.log(` Summary: ${event.summary.slice(0, 80)}...`);
|
|
138
|
+
console.log(` Total steps: ${event.state.trace.length}`);
|
|
139
|
+
console.log(` Usage: ${JSON.stringify(event.state.usage)}`);
|
|
140
|
+
console.log('\n' + '='.repeat(60));
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
getStats() {
|
|
145
|
+
return {
|
|
146
|
+
totalEvents: this.events.length,
|
|
147
|
+
toolCalls: this.events.filter((e) => e.type === 'tool.calling').length,
|
|
148
|
+
checkpoints: this.events.filter((e) => e.type === 'checkpoint.saved').length,
|
|
149
|
+
escalations: this.events.filter((e) => e.type === 'escalation.required').length,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Example: Basic run with event logging
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
async function exampleBasicRun() {
|
|
157
|
+
console.log('\n' + '#'.repeat(60));
|
|
158
|
+
console.log('# Example 1: Basic Run with Event Logging');
|
|
159
|
+
console.log('#'.repeat(60));
|
|
160
|
+
const logger = new StructuredEventLogger();
|
|
161
|
+
await runAgentLoop({
|
|
162
|
+
goal: 'Simple demo task',
|
|
163
|
+
llm: createMockLlm('success'),
|
|
164
|
+
tools: [],
|
|
165
|
+
includeDefaultTools: false,
|
|
166
|
+
maxSteps: 2,
|
|
167
|
+
onEvent: (event) => logger.onEvent(event),
|
|
168
|
+
});
|
|
169
|
+
console.log('\n📊 Stats:', logger.getStats());
|
|
170
|
+
}
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
// Example: Tool execution tracking
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
async function exampleToolTracking() {
|
|
175
|
+
console.log('\n' + '#'.repeat(60));
|
|
176
|
+
console.log('# Example 2: Tool Execution Tracking');
|
|
177
|
+
console.log('#'.repeat(60));
|
|
178
|
+
const logger = new StructuredEventLogger();
|
|
179
|
+
await runAgentLoop({
|
|
180
|
+
goal: 'Use echo tool',
|
|
181
|
+
llm: createMockLlm('tool-use'),
|
|
182
|
+
tools: [echoTool],
|
|
183
|
+
includeDefaultTools: false,
|
|
184
|
+
maxSteps: 2,
|
|
185
|
+
onEvent: (event) => logger.onEvent(event),
|
|
186
|
+
});
|
|
187
|
+
console.log('\n📊 Stats:', logger.getStats());
|
|
188
|
+
}
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
// Example: Heartbeat with escalation
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
async function exampleHeartbeatEscalation() {
|
|
193
|
+
console.log('\n' + '#'.repeat(60));
|
|
194
|
+
console.log('# Example 3: Heartbeat with Escalation Routing');
|
|
195
|
+
console.log('#'.repeat(60));
|
|
196
|
+
const logger = new StructuredEventLogger();
|
|
197
|
+
const result = await runAgentHeartbeat({
|
|
198
|
+
task: 'Background maintenance task',
|
|
199
|
+
llm: createMockLlm('escalate'),
|
|
200
|
+
tools: [],
|
|
201
|
+
includeDefaultTools: false,
|
|
202
|
+
maxSteps: 2,
|
|
203
|
+
onEvent: (event) => logger.onEvent(event),
|
|
204
|
+
});
|
|
205
|
+
console.log('\n📊 Stats:', logger.getStats());
|
|
206
|
+
console.log('\n📋 Heartbeat Result:');
|
|
207
|
+
console.log(` Decision: ${result.decision}`);
|
|
208
|
+
console.log(` Checkpoint ID: ${result.checkpoint.runId}`);
|
|
209
|
+
// Demonstrate how Lucid/CyberLoop would route escalation
|
|
210
|
+
if (result.decision === 'escalate') {
|
|
211
|
+
console.log('\n🎯 Integration example:');
|
|
212
|
+
console.log(' - Lucid would route to operator channel');
|
|
213
|
+
console.log(' - CyberLoop would annotate drift in middleware');
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
// Main
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
async function main() {
|
|
220
|
+
console.log('Heddle Host Events Example');
|
|
221
|
+
console.log('Shows structured event consumption for external integration\n');
|
|
222
|
+
await exampleBasicRun();
|
|
223
|
+
await exampleToolTracking();
|
|
224
|
+
await exampleHeartbeatEscalation();
|
|
225
|
+
console.log('\n' + '#'.repeat(60));
|
|
226
|
+
console.log('# All examples completed successfully');
|
|
227
|
+
console.log('#'.repeat(60));
|
|
228
|
+
}
|
|
229
|
+
main().catch((error) => {
|
|
230
|
+
console.error('Error:', error);
|
|
231
|
+
process.exit(1);
|
|
232
|
+
});
|
|
233
|
+
//# sourceMappingURL=host-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-events.js","sourceRoot":"","sources":["../../examples/host-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"programmatic-loop.d.ts","sourceRoot":"","sources":["../../examples/programmatic-loop.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Example: Programmatic Loop
|
|
3
|
+
//
|
|
4
|
+
// Usage:
|
|
5
|
+
// OPENAI_API_KEY=sk-... yarn example:programmatic
|
|
6
|
+
//
|
|
7
|
+
// Optional:
|
|
8
|
+
// HEDDLE_EXAMPLE_MODEL=claude-3-5-haiku-latest ANTHROPIC_API_KEY=sk-ant-... yarn example:programmatic
|
|
9
|
+
//
|
|
10
|
+
// This example uses a real LLM plus one custom host tool. It demonstrates how
|
|
11
|
+
// another app can embed Heddle as an evented execution loop without going
|
|
12
|
+
// through the terminal chat UI.
|
|
13
|
+
//
|
|
14
|
+
// For a no-key test of this API, see src/__tests__/agent-loop.test.ts.
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
import { runAgentLoop } from '../src/runtime/agent-loop.js';
|
|
17
|
+
import { createAgentLoopCheckpoint } from '../src/runtime/events.js';
|
|
18
|
+
import { resolveProviderApiKey } from '../src/runtime/api-keys.js';
|
|
19
|
+
import { inferProviderFromModel } from '../src/llm/providers.js';
|
|
20
|
+
const DEFAULT_EXAMPLE_MODEL = 'gpt-5.1-codex-mini';
|
|
21
|
+
const echoTool = {
|
|
22
|
+
name: 'echo_context',
|
|
23
|
+
description: 'Echoes a small piece of host-provided context.',
|
|
24
|
+
parameters: {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
topic: { type: 'string' },
|
|
28
|
+
},
|
|
29
|
+
required: ['topic'],
|
|
30
|
+
additionalProperties: false,
|
|
31
|
+
},
|
|
32
|
+
async execute(input) {
|
|
33
|
+
return {
|
|
34
|
+
ok: true,
|
|
35
|
+
output: {
|
|
36
|
+
input,
|
|
37
|
+
note: 'This result came from a custom host tool.',
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
async function main() {
|
|
43
|
+
const model = process.env.HEDDLE_EXAMPLE_MODEL ?? process.env.OPENAI_MODEL ?? DEFAULT_EXAMPLE_MODEL;
|
|
44
|
+
const provider = inferProviderFromModel(model);
|
|
45
|
+
const apiKey = resolveProviderApiKey(provider);
|
|
46
|
+
if (!apiKey) {
|
|
47
|
+
throw new Error(`Missing API key for ${provider}. ` +
|
|
48
|
+
'Set OPENAI_API_KEY for OpenAI models or ANTHROPIC_API_KEY for Claude models before running this example.');
|
|
49
|
+
}
|
|
50
|
+
const result = await runAgentLoop({
|
|
51
|
+
goal: 'Use the echo_context tool once, then explain in two short sentences how another app can embed Heddle as a programmatic agent loop.',
|
|
52
|
+
model,
|
|
53
|
+
apiKey,
|
|
54
|
+
tools: [echoTool],
|
|
55
|
+
includeDefaultTools: false,
|
|
56
|
+
maxSteps: 3,
|
|
57
|
+
onEvent(event) {
|
|
58
|
+
const line = formatExampleEvent(event);
|
|
59
|
+
if (line) {
|
|
60
|
+
console.log(line);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
console.log('\nFinal answer:\n');
|
|
65
|
+
console.log(result.summary);
|
|
66
|
+
const checkpoint = createAgentLoopCheckpoint(result.state);
|
|
67
|
+
console.log('\nCheckpoint preview:\n');
|
|
68
|
+
console.log(JSON.stringify({
|
|
69
|
+
version: checkpoint.version,
|
|
70
|
+
model: checkpoint.state.model,
|
|
71
|
+
outcome: checkpoint.state.outcome,
|
|
72
|
+
transcriptMessages: checkpoint.state.transcript.length,
|
|
73
|
+
traceEvents: checkpoint.state.trace.length,
|
|
74
|
+
}, null, 2));
|
|
75
|
+
process.exit(0);
|
|
76
|
+
}
|
|
77
|
+
function formatExampleEvent(event) {
|
|
78
|
+
switch (event.type) {
|
|
79
|
+
case 'loop.started':
|
|
80
|
+
return `[event] loop.started model=${event.model} provider=${event.provider} workspace=${event.workspaceRoot}`;
|
|
81
|
+
case 'assistant.stream':
|
|
82
|
+
return event.done ? `[event] assistant.stream.done chars=${event.text.length} step=${event.step}` : undefined;
|
|
83
|
+
case 'loop.finished':
|
|
84
|
+
return `[event] loop.finished outcome=${event.outcome} transcript=${event.state.transcript.length} trace=${event.state.trace.length} input=${event.usage?.inputTokens ?? 0} output=${event.usage?.outputTokens ?? 0} total=${event.usage?.totalTokens ?? 0}`;
|
|
85
|
+
case 'trace':
|
|
86
|
+
return formatTraceEvent(event.event);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function formatTraceEvent(event) {
|
|
90
|
+
switch (event.type) {
|
|
91
|
+
case 'run.started':
|
|
92
|
+
return `[trace] run.started goal=${JSON.stringify(shorten(event.goal))}`;
|
|
93
|
+
case 'assistant.turn':
|
|
94
|
+
return `[trace] assistant.turn step=${event.step} tools=${event.requestedTools ? event.toolCalls?.map((call) => call.tool).join(',') || 'yes' : 'none'} content=${JSON.stringify(shorten(event.content))}`;
|
|
95
|
+
case 'tool.approval_requested':
|
|
96
|
+
return `[trace] tool.approval_requested step=${event.step} tool=${event.call.tool}`;
|
|
97
|
+
case 'tool.approval_resolved':
|
|
98
|
+
return `[trace] tool.approval_resolved step=${event.step} tool=${event.call.tool} approved=${event.approved}`;
|
|
99
|
+
case 'tool.fallback':
|
|
100
|
+
return `[trace] tool.fallback step=${event.step} from=${event.fromCall.tool} to=${event.toCall.tool} reason=${JSON.stringify(shorten(event.reason))}`;
|
|
101
|
+
case 'tool.call':
|
|
102
|
+
return `[trace] tool.call step=${event.step} tool=${event.call.tool} input=${JSON.stringify(event.call.input)}`;
|
|
103
|
+
case 'tool.result':
|
|
104
|
+
return `[trace] tool.result step=${event.step} tool=${event.tool} ok=${event.result.ok} output=${JSON.stringify(formatUnknown(event.result.output ?? event.result.error ?? ''))}`;
|
|
105
|
+
case 'cyberloop.annotation':
|
|
106
|
+
return `[trace] cyberloop.annotation step=${event.step} frame=${event.frameKind} drift=${event.driftLevel}`;
|
|
107
|
+
case 'run.finished':
|
|
108
|
+
return `[trace] run.finished step=${event.step} outcome=${event.outcome} summary=${JSON.stringify(shorten(event.summary))}`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function shorten(value, maxLength = 96) {
|
|
112
|
+
const normalized = value.replace(/\s+/g, ' ').trim();
|
|
113
|
+
if (normalized.length <= maxLength) {
|
|
114
|
+
return normalized;
|
|
115
|
+
}
|
|
116
|
+
return `${normalized.slice(0, maxLength - 1)}…`;
|
|
117
|
+
}
|
|
118
|
+
function formatUnknown(value) {
|
|
119
|
+
if (typeof value === 'string') {
|
|
120
|
+
return shorten(value);
|
|
121
|
+
}
|
|
122
|
+
return shorten(JSON.stringify(value));
|
|
123
|
+
}
|
|
124
|
+
main().catch((error) => {
|
|
125
|
+
console.error(error);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=programmatic-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"programmatic-loop.js","sourceRoot":"","sources":["../../examples/programmatic-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../../src/cli/ask.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../../src/cli/ask.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,iBAiCxE"}
|
package/dist/src/cli/ask.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import { DEFAULT_OPENAI_MODEL,
|
|
3
|
+
import { DEFAULT_OPENAI_MODEL, inferProviderFromModel, runAgentLoop, formatTraceForConsole, createLogger, resolveProviderApiKey, } from '../index.js';
|
|
4
4
|
export async function runAskCli(goal, options = {}) {
|
|
5
5
|
if (!goal.trim()) {
|
|
6
6
|
throw new Error('Usage: heddle ask "<goal>"');
|
|
@@ -12,36 +12,18 @@ export async function runAskCli(goal, options = {}) {
|
|
|
12
12
|
const logger = createLogger({ pretty: true, level: 'debug' });
|
|
13
13
|
const provider = inferProviderFromModel(model);
|
|
14
14
|
logger.info({ goal, model, provider, maxSteps, cwd: workspaceRoot }, 'Heddle');
|
|
15
|
-
const
|
|
15
|
+
const result = await runAgentLoop({
|
|
16
|
+
goal,
|
|
16
17
|
model,
|
|
17
18
|
apiKey: options.apiKey ?? resolveProviderApiKey(provider),
|
|
19
|
+
maxSteps,
|
|
20
|
+
logger,
|
|
21
|
+
workspaceRoot,
|
|
22
|
+
stateDir: options.stateDir,
|
|
23
|
+
searchIgnoreDirs: options.searchIgnoreDirs,
|
|
24
|
+
systemContext: options.systemContext,
|
|
25
|
+
includePlanTool: false,
|
|
18
26
|
});
|
|
19
|
-
const webSearchTool = createWebSearchTool({
|
|
20
|
-
model,
|
|
21
|
-
provider,
|
|
22
|
-
apiKey: options.apiKey ?? resolveProviderApiKey(provider),
|
|
23
|
-
});
|
|
24
|
-
const viewImageTool = createViewImageTool({
|
|
25
|
-
model,
|
|
26
|
-
provider,
|
|
27
|
-
apiKey: options.apiKey ?? resolveProviderApiKey(provider),
|
|
28
|
-
});
|
|
29
|
-
const tools = [
|
|
30
|
-
listFilesTool,
|
|
31
|
-
readFileTool,
|
|
32
|
-
editFileTool,
|
|
33
|
-
createSearchFilesTool({ excludedDirs: options.searchIgnoreDirs }),
|
|
34
|
-
webSearchTool,
|
|
35
|
-
viewImageTool,
|
|
36
|
-
createListMemoryNotesTool({ memoryRoot: join(stateRoot, 'memory') }),
|
|
37
|
-
createReadMemoryNoteTool({ memoryRoot: join(stateRoot, 'memory') }),
|
|
38
|
-
createSearchMemoryNotesTool({ memoryRoot: join(stateRoot, 'memory') }),
|
|
39
|
-
createEditMemoryNoteTool({ memoryRoot: join(stateRoot, 'memory') }),
|
|
40
|
-
reportStateTool,
|
|
41
|
-
createRunShellInspectTool(),
|
|
42
|
-
createRunShellMutateTool(),
|
|
43
|
-
];
|
|
44
|
-
const result = await runAgent({ goal, llm, tools, maxSteps, logger, systemContext: options.systemContext });
|
|
45
27
|
process.stdout.write(`${formatTraceForConsole(result.trace)}\n`);
|
|
46
28
|
const traceDir = join(stateRoot, 'traces');
|
|
47
29
|
mkdirSync(traceDir, { recursive: true });
|
|
@@ -59,17 +41,4 @@ function parsePositiveInt(raw) {
|
|
|
59
41
|
}
|
|
60
42
|
return value;
|
|
61
43
|
}
|
|
62
|
-
function resolveProviderApiKey(provider) {
|
|
63
|
-
switch (provider) {
|
|
64
|
-
case 'openai':
|
|
65
|
-
return firstDefinedNonEmpty(process.env.OPENAI_API_KEY, process.env.PERSONAL_OPENAI_API_KEY);
|
|
66
|
-
case 'anthropic':
|
|
67
|
-
return firstDefinedNonEmpty(process.env.ANTHROPIC_API_KEY, process.env.PERSONAL_ANTHROPIC_API_KEY);
|
|
68
|
-
case 'google':
|
|
69
|
-
return undefined;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
function firstDefinedNonEmpty(...values) {
|
|
73
|
-
return values.find((value) => typeof value === 'string' && value.trim().length > 0);
|
|
74
|
-
}
|
|
75
44
|
//# sourceMappingURL=ask.js.map
|
package/dist/src/cli/ask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../../src/cli/ask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../../src/cli/ask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,EACrB,YAAY,EACZ,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAYrB,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,UAAyB,EAAE;IACvE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,oBAAoB,CAAC;IAC/G,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;IAC1F,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAE/C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE/E,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,IAAI;QACJ,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC;QACzD,QAAQ;QACR,MAAM;QACN,aAAa;QACb,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,eAAe,EAAE,KAAK;KACvB,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3C,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7D,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../src/cli/chat/App.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../src/cli/chat/App.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAI5D,wBAAgB,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,iBAAiB,CAAA;CAAE,2CAygB9D"}
|
package/dist/src/cli/chat/App.js
CHANGED
|
@@ -16,6 +16,9 @@ export function App({ runtime }) {
|
|
|
16
16
|
const [draft, setDraft] = useState('');
|
|
17
17
|
const [draftCursor, setDraftCursor] = useState(0);
|
|
18
18
|
const [pendingSubmittedPrompt, setPendingSubmittedPrompt] = useState();
|
|
19
|
+
const [driftEnabled, setDriftEnabledState] = useState(false);
|
|
20
|
+
const [driftLevel, setDriftLevel] = useState('unknown');
|
|
21
|
+
const [driftError, setDriftError] = useState();
|
|
19
22
|
const [modelPickerIndex, setModelPickerIndex] = useState(0);
|
|
20
23
|
const [sessionPickerIndex, setSessionPickerIndex] = useState(0);
|
|
21
24
|
const [fileMentionPickerIndex, setFileMentionPickerIndex] = useState(0);
|
|
@@ -57,6 +60,15 @@ export function App({ runtime }) {
|
|
|
57
60
|
setActiveModel(sessionModel);
|
|
58
61
|
}
|
|
59
62
|
}, [activeModel, activeSession, runtime.model]);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (!activeSession) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const sessionDriftEnabled = activeSession.driftEnabled ?? false;
|
|
68
|
+
if (sessionDriftEnabled !== driftEnabled) {
|
|
69
|
+
setDriftEnabledState(sessionDriftEnabled);
|
|
70
|
+
}
|
|
71
|
+
}, [activeSession, driftEnabled]);
|
|
60
72
|
const { status, setStatus, isRunning, error, setError, liveEvents, workingFrame, elapsedSeconds, pendingApproval, approvalChoice, interruptRequested, currentAssistantText, currentPlan, setLiveEvents, resetRunState, actionState, workingFrames, } = useApprovalFlow(nextLocalId);
|
|
61
73
|
const messages = activeSession?.messages ?? [];
|
|
62
74
|
const activityText = currentActivityText(liveEvents, isRunning, elapsedSeconds, pendingApproval, interruptRequested);
|
|
@@ -64,6 +76,7 @@ export function App({ runtime }) {
|
|
|
64
76
|
const promptStatusLine = [
|
|
65
77
|
`model=${activeModel}`,
|
|
66
78
|
contextStatus,
|
|
79
|
+
`drift=${formatDriftFooter(driftEnabled, driftLevel, driftError)}`,
|
|
67
80
|
`session=${activeSession?.id ?? activeSessionId}${activeSession?.name ? ` (${activeSession.name})` : ''}`,
|
|
68
81
|
].join(' • ');
|
|
69
82
|
const activityLines = liveEvents
|
|
@@ -100,6 +113,14 @@ export function App({ runtime }) {
|
|
|
100
113
|
setSessionModel(activeSession.id, model);
|
|
101
114
|
}
|
|
102
115
|
};
|
|
116
|
+
const applyDriftEnabled = useCallback((enabled) => {
|
|
117
|
+
setDriftEnabledState(enabled);
|
|
118
|
+
setDriftError(undefined);
|
|
119
|
+
updateActiveSession((session) => ({
|
|
120
|
+
...session,
|
|
121
|
+
driftEnabled: enabled,
|
|
122
|
+
}));
|
|
123
|
+
}, [updateActiveSession]);
|
|
103
124
|
const closeSession = (id) => {
|
|
104
125
|
const removedActive = removeSession(id);
|
|
105
126
|
if (removedActive) {
|
|
@@ -130,6 +151,15 @@ export function App({ runtime }) {
|
|
|
130
151
|
state: actionState,
|
|
131
152
|
updateSessionById,
|
|
132
153
|
updateActiveSession,
|
|
154
|
+
drift: {
|
|
155
|
+
enabled: driftEnabled,
|
|
156
|
+
onRunStart: () => {
|
|
157
|
+
setDriftLevel('unknown');
|
|
158
|
+
setDriftError(undefined);
|
|
159
|
+
},
|
|
160
|
+
onAnnotation: (annotation) => setDriftLevel(annotation.driftLevel),
|
|
161
|
+
onError: (error) => setDriftError(error instanceof Error ? error.message : String(error)),
|
|
162
|
+
},
|
|
133
163
|
});
|
|
134
164
|
const submitPrompt = useCallback(async (value, options) => {
|
|
135
165
|
const effectiveIsRunning = options?.allowWhileRunning ? false : isRunning;
|
|
@@ -173,6 +203,9 @@ export function App({ runtime }) {
|
|
|
173
203
|
createSession,
|
|
174
204
|
renameSession,
|
|
175
205
|
listRecentSessionsMessage,
|
|
206
|
+
driftEnabled,
|
|
207
|
+
driftError,
|
|
208
|
+
setDriftEnabled: applyDriftEnabled,
|
|
176
209
|
preparePrompt: preparePromptWithMentions,
|
|
177
210
|
executeTurn,
|
|
178
211
|
executeDirectShellCommand,
|
|
@@ -202,6 +235,9 @@ export function App({ runtime }) {
|
|
|
202
235
|
createSession,
|
|
203
236
|
renameSession,
|
|
204
237
|
listRecentSessionsMessage,
|
|
238
|
+
driftEnabled,
|
|
239
|
+
driftError,
|
|
240
|
+
setDriftEnabled: applyDriftEnabled,
|
|
205
241
|
preparePrompt: preparePromptWithMentions,
|
|
206
242
|
executeTurn,
|
|
207
243
|
executeDirectShellCommand,
|
|
@@ -237,6 +273,9 @@ export function App({ runtime }) {
|
|
|
237
273
|
createSession,
|
|
238
274
|
renameSession,
|
|
239
275
|
listRecentSessionsMessage,
|
|
276
|
+
driftEnabled,
|
|
277
|
+
driftError,
|
|
278
|
+
setDriftEnabled: applyDriftEnabled,
|
|
240
279
|
preparePrompt: preparePromptWithMentions,
|
|
241
280
|
executeTurn,
|
|
242
281
|
executeDirectShellCommand,
|
|
@@ -262,6 +301,9 @@ export function App({ runtime }) {
|
|
|
262
301
|
createSession,
|
|
263
302
|
renameSession,
|
|
264
303
|
listRecentSessionsMessage,
|
|
304
|
+
driftEnabled,
|
|
305
|
+
driftError,
|
|
306
|
+
applyDriftEnabled,
|
|
265
307
|
executeTurn,
|
|
266
308
|
executeDirectShellCommand,
|
|
267
309
|
appendPendingUserMessage,
|
|
@@ -342,6 +384,12 @@ export function App({ runtime }) {
|
|
|
342
384
|
: isRunning ? `${elapsedSeconds}s elapsed`
|
|
343
385
|
: '' })] })] })] }), _jsx(Text, { dimColor: true, children: promptStatusLine })] }));
|
|
344
386
|
}
|
|
387
|
+
function formatDriftFooter(enabled, level, error) {
|
|
388
|
+
if (!enabled) {
|
|
389
|
+
return 'off';
|
|
390
|
+
}
|
|
391
|
+
return error ? 'unavailable' : level;
|
|
392
|
+
}
|
|
345
393
|
function getModelPickerQuery(draft) {
|
|
346
394
|
const trimmedStart = draft.trimStart();
|
|
347
395
|
if (!trimmedStart.startsWith('/model set')) {
|