@roackb2/heddle 0.0.10 → 0.0.12

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.
@@ -0,0 +1,111 @@
1
+ import type { AgentHeartbeatResult, HeartbeatDecision, RunAgentHeartbeatOptions } from './heartbeat.js';
2
+ import type { AgentLoopCheckpoint, AgentLoopState } from './events.js';
3
+ import type { LlmUsage } from '../llm/types.js';
4
+ export type HeartbeatTask = {
5
+ id: string;
6
+ task: string;
7
+ name?: string;
8
+ enabled: boolean;
9
+ intervalMs: number;
10
+ nextRunAt?: string;
11
+ checkpointPath?: string;
12
+ model?: string;
13
+ maxSteps?: number;
14
+ workspaceRoot?: string;
15
+ stateDir?: string;
16
+ memoryDir?: string;
17
+ searchIgnoreDirs?: string[];
18
+ systemContext?: string;
19
+ lastRunAt?: string;
20
+ lastDecision?: HeartbeatDecision;
21
+ lastOutcome?: string;
22
+ lastSummary?: string;
23
+ lastError?: string;
24
+ updatedAt?: string;
25
+ };
26
+ export type HeartbeatTaskRunRecord = {
27
+ task: HeartbeatTask;
28
+ result: AgentHeartbeatResult;
29
+ loadedCheckpoint: boolean;
30
+ };
31
+ export type HeartbeatTaskRunRecordEntry = {
32
+ id: string;
33
+ path: string;
34
+ taskId: string;
35
+ runId: string;
36
+ createdAt: string;
37
+ record: HeartbeatTaskRunRecord;
38
+ };
39
+ export type HeartbeatTaskStore = {
40
+ listTasks: () => Promise<HeartbeatTask[]>;
41
+ saveTask: (task: HeartbeatTask) => Promise<void>;
42
+ loadCheckpoint: (task: HeartbeatTask) => Promise<AgentLoopCheckpoint | undefined>;
43
+ saveCheckpoint: (task: HeartbeatTask, checkpoint: AgentLoopCheckpoint) => Promise<void>;
44
+ saveRunRecord?: (record: HeartbeatTaskRunRecord) => Promise<void>;
45
+ listRunRecords?: (options?: {
46
+ taskId?: string;
47
+ limit?: number;
48
+ }) => Promise<HeartbeatTaskRunRecordEntry[]>;
49
+ loadRunRecord?: (id: string) => Promise<HeartbeatTaskRunRecordEntry | undefined>;
50
+ };
51
+ export type FileHeartbeatTaskStoreOptions = {
52
+ dir: string;
53
+ };
54
+ export type HeartbeatSchedulerEvent = {
55
+ type: 'heartbeat.scheduler.started';
56
+ timestamp: string;
57
+ } | {
58
+ type: 'heartbeat.scheduler.stopped';
59
+ reason: 'aborted' | 'completed' | 'error';
60
+ timestamp: string;
61
+ } | {
62
+ type: 'heartbeat.task.due';
63
+ taskId: string;
64
+ timestamp: string;
65
+ } | {
66
+ type: 'heartbeat.task.started';
67
+ taskId: string;
68
+ loadedCheckpoint: boolean;
69
+ timestamp: string;
70
+ } | {
71
+ type: 'heartbeat.task.finished';
72
+ taskId: string;
73
+ decision: HeartbeatDecision;
74
+ outcome: string;
75
+ summary: string;
76
+ runId: string;
77
+ usage?: LlmUsage;
78
+ nextRunAt?: string;
79
+ enabled: boolean;
80
+ timestamp: string;
81
+ } | {
82
+ type: 'heartbeat.task.failed';
83
+ taskId: string;
84
+ error: string;
85
+ nextRunAt?: string;
86
+ timestamp: string;
87
+ };
88
+ export type HeartbeatTaskRunner = (task: HeartbeatTask, checkpoint: AgentLoopState | AgentLoopCheckpoint | undefined) => Promise<AgentHeartbeatResult>;
89
+ export type RunDueHeartbeatTasksOptions = {
90
+ store: HeartbeatTaskStore;
91
+ runner?: HeartbeatTaskRunner;
92
+ heartbeat?: Omit<RunAgentHeartbeatOptions, 'task' | 'checkpoint'>;
93
+ now?: () => Date;
94
+ onEvent?: (event: HeartbeatSchedulerEvent) => void;
95
+ failureRetryMs?: number;
96
+ };
97
+ export type RunDueHeartbeatTasksResult = {
98
+ checked: number;
99
+ ran: number;
100
+ failed: number;
101
+ records: HeartbeatTaskRunRecord[];
102
+ };
103
+ export type RunHeartbeatSchedulerOptions = RunDueHeartbeatTasksOptions & {
104
+ pollIntervalMs?: number;
105
+ signal?: AbortSignal;
106
+ sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
107
+ };
108
+ export declare function createFileHeartbeatTaskStore(options: FileHeartbeatTaskStoreOptions): HeartbeatTaskStore;
109
+ export declare function runDueHeartbeatTasks(options: RunDueHeartbeatTasksOptions): Promise<RunDueHeartbeatTasksResult>;
110
+ export declare function runHeartbeatScheduler(options: RunHeartbeatSchedulerOptions): Promise<void>;
111
+ //# sourceMappingURL=heartbeat-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat-scheduler.d.ts","sourceRoot":"","sources":["../../../src/runtime/heartbeat-scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,236 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { basename, dirname, join } from 'node:path';
3
+ import { runAgentHeartbeat } from './heartbeat.js';
4
+ import { suggestNextHeartbeatDelayMs } from './heartbeat-store.js';
5
+ const DEFAULT_FAILURE_RETRY_MS = 5 * 60_000;
6
+ export function createFileHeartbeatTaskStore(options) {
7
+ const tasksDir = join(options.dir, 'tasks');
8
+ const checkpointsDir = join(options.dir, 'checkpoints');
9
+ const runsDir = join(options.dir, 'runs');
10
+ return {
11
+ async listTasks() {
12
+ if (!existsSync(tasksDir)) {
13
+ return [];
14
+ }
15
+ return readdirSync(tasksDir)
16
+ .filter((entry) => entry.endsWith('.json'))
17
+ .map((entry) => JSON.parse(readFileSync(join(tasksDir, entry), 'utf8')))
18
+ .sort((left, right) => left.id.localeCompare(right.id));
19
+ },
20
+ async saveTask(task) {
21
+ const path = join(tasksDir, `${safeTaskFileName(task.id)}.json`);
22
+ mkdirSync(dirname(path), { recursive: true });
23
+ writeFileSync(path, JSON.stringify(normalizeTaskForSave(task), null, 2));
24
+ },
25
+ async loadCheckpoint(task) {
26
+ const path = checkpointPathForTask(task, checkpointsDir);
27
+ if (!existsSync(path)) {
28
+ return undefined;
29
+ }
30
+ return JSON.parse(readFileSync(path, 'utf8'));
31
+ },
32
+ async saveCheckpoint(task, checkpoint) {
33
+ const path = checkpointPathForTask(task, checkpointsDir);
34
+ mkdirSync(dirname(path), { recursive: true });
35
+ writeFileSync(path, JSON.stringify(checkpoint, null, 2));
36
+ },
37
+ async saveRunRecord(record) {
38
+ const timestamp = new Date().toISOString().replaceAll(':', '-');
39
+ const path = join(runsDir, `${timestamp}-${safeTaskFileName(record.task.id)}.json`);
40
+ mkdirSync(dirname(path), { recursive: true });
41
+ writeFileSync(path, JSON.stringify(record, null, 2));
42
+ },
43
+ async listRunRecords(options = {}) {
44
+ if (!existsSync(runsDir)) {
45
+ return [];
46
+ }
47
+ const entries = readdirSync(runsDir)
48
+ .filter((entry) => entry.endsWith('.json'))
49
+ .flatMap((entry) => {
50
+ const path = join(runsDir, entry);
51
+ try {
52
+ const record = JSON.parse(readFileSync(path, 'utf8'));
53
+ if (options.taskId && record.task.id !== options.taskId) {
54
+ return [];
55
+ }
56
+ return [runRecordEntryFromPath(path, record)];
57
+ }
58
+ catch {
59
+ return [];
60
+ }
61
+ })
62
+ .sort((left, right) => right.createdAt.localeCompare(left.createdAt));
63
+ return options.limit ? entries.slice(0, options.limit) : entries;
64
+ },
65
+ async loadRunRecord(id) {
66
+ const entries = await this.listRunRecords?.();
67
+ return entries?.find((entry) => entry.id === id || entry.runId === id);
68
+ },
69
+ };
70
+ }
71
+ export async function runDueHeartbeatTasks(options) {
72
+ const now = options.now?.() ?? new Date();
73
+ const tasks = await options.store.listTasks();
74
+ const dueTasks = tasks.filter((task) => isTaskDue(task, now));
75
+ const records = [];
76
+ let failed = 0;
77
+ for (const task of dueTasks) {
78
+ options.onEvent?.({ type: 'heartbeat.task.due', taskId: task.id, timestamp: now.toISOString() });
79
+ try {
80
+ const checkpoint = await options.store.loadCheckpoint(task);
81
+ options.onEvent?.({
82
+ type: 'heartbeat.task.started',
83
+ taskId: task.id,
84
+ loadedCheckpoint: Boolean(checkpoint),
85
+ timestamp: now.toISOString(),
86
+ });
87
+ const result = await runHeartbeatTask(task, checkpoint, options);
88
+ const record = { task, result, loadedCheckpoint: Boolean(checkpoint) };
89
+ await options.store.saveCheckpoint(task, result.checkpoint);
90
+ await options.store.saveRunRecord?.(record);
91
+ records.push(record);
92
+ const nextTask = updateTaskAfterResult(task, result, now);
93
+ await options.store.saveTask(nextTask);
94
+ options.onEvent?.({
95
+ type: 'heartbeat.task.finished',
96
+ taskId: task.id,
97
+ decision: result.decision,
98
+ outcome: result.state.outcome,
99
+ summary: result.summary,
100
+ runId: result.state.runId,
101
+ usage: result.state.usage,
102
+ nextRunAt: nextTask.nextRunAt,
103
+ enabled: nextTask.enabled,
104
+ timestamp: now.toISOString(),
105
+ });
106
+ }
107
+ catch (error) {
108
+ failed++;
109
+ const nextTask = updateTaskAfterFailure(task, error, now, options.failureRetryMs ?? DEFAULT_FAILURE_RETRY_MS);
110
+ await options.store.saveTask(nextTask);
111
+ options.onEvent?.({
112
+ type: 'heartbeat.task.failed',
113
+ taskId: task.id,
114
+ error: error instanceof Error ? error.message : String(error),
115
+ nextRunAt: nextTask.nextRunAt,
116
+ timestamp: now.toISOString(),
117
+ });
118
+ }
119
+ }
120
+ return {
121
+ checked: tasks.length,
122
+ ran: records.length,
123
+ failed,
124
+ records,
125
+ };
126
+ }
127
+ export async function runHeartbeatScheduler(options) {
128
+ options.onEvent?.({ type: 'heartbeat.scheduler.started', timestamp: (options.now?.() ?? new Date()).toISOString() });
129
+ try {
130
+ while (!options.signal?.aborted) {
131
+ await runDueHeartbeatTasks(options);
132
+ await (options.sleep ?? sleep)(options.pollIntervalMs ?? 60_000, options.signal);
133
+ }
134
+ options.onEvent?.({ type: 'heartbeat.scheduler.stopped', reason: 'aborted', timestamp: (options.now?.() ?? new Date()).toISOString() });
135
+ }
136
+ catch (error) {
137
+ if (options.signal?.aborted) {
138
+ options.onEvent?.({ type: 'heartbeat.scheduler.stopped', reason: 'aborted', timestamp: (options.now?.() ?? new Date()).toISOString() });
139
+ return;
140
+ }
141
+ options.onEvent?.({ type: 'heartbeat.scheduler.stopped', reason: 'error', timestamp: (options.now?.() ?? new Date()).toISOString() });
142
+ throw error;
143
+ }
144
+ }
145
+ function isTaskDue(task, now) {
146
+ if (!task.enabled) {
147
+ return false;
148
+ }
149
+ if (!task.nextRunAt) {
150
+ return true;
151
+ }
152
+ const nextRunAt = Date.parse(task.nextRunAt);
153
+ return Number.isFinite(nextRunAt) && nextRunAt <= now.getTime();
154
+ }
155
+ async function runHeartbeatTask(task, checkpoint, options) {
156
+ if (options.runner) {
157
+ return options.runner(task, checkpoint);
158
+ }
159
+ return runAgentHeartbeat({
160
+ ...options.heartbeat,
161
+ task: task.task,
162
+ checkpoint,
163
+ model: task.model ?? options.heartbeat?.model,
164
+ maxSteps: task.maxSteps ?? options.heartbeat?.maxSteps,
165
+ workspaceRoot: task.workspaceRoot ?? options.heartbeat?.workspaceRoot,
166
+ stateDir: task.stateDir ?? options.heartbeat?.stateDir,
167
+ memoryDir: task.memoryDir ?? options.heartbeat?.memoryDir,
168
+ searchIgnoreDirs: task.searchIgnoreDirs ?? options.heartbeat?.searchIgnoreDirs,
169
+ systemContext: task.systemContext ?? options.heartbeat?.systemContext,
170
+ });
171
+ }
172
+ function updateTaskAfterResult(task, result, now) {
173
+ const terminal = result.decision === 'complete' || result.decision === 'escalate';
174
+ const delayMs = terminal ? undefined
175
+ : result.decision === 'continue' ? task.intervalMs
176
+ : suggestNextHeartbeatDelayMs(result.decision) ?? task.intervalMs;
177
+ return normalizeTaskForSave({
178
+ ...task,
179
+ enabled: terminal ? false : task.enabled,
180
+ nextRunAt: delayMs === undefined ? undefined : new Date(now.getTime() + delayMs).toISOString(),
181
+ lastRunAt: now.toISOString(),
182
+ lastDecision: result.decision,
183
+ lastOutcome: result.state.outcome,
184
+ lastSummary: result.summary,
185
+ lastError: undefined,
186
+ updatedAt: now.toISOString(),
187
+ });
188
+ }
189
+ function updateTaskAfterFailure(task, error, now, retryMs) {
190
+ return normalizeTaskForSave({
191
+ ...task,
192
+ nextRunAt: new Date(now.getTime() + retryMs).toISOString(),
193
+ lastRunAt: now.toISOString(),
194
+ lastError: error instanceof Error ? error.message : String(error),
195
+ updatedAt: now.toISOString(),
196
+ });
197
+ }
198
+ function normalizeTaskForSave(task) {
199
+ return {
200
+ ...task,
201
+ intervalMs: Math.max(1, Math.trunc(task.intervalMs)),
202
+ };
203
+ }
204
+ function checkpointPathForTask(task, checkpointsDir) {
205
+ return task.checkpointPath ?? join(checkpointsDir, `${safeTaskFileName(task.id)}.json`);
206
+ }
207
+ function safeTaskFileName(id) {
208
+ if (!/^[a-zA-Z0-9._-]+$/.test(id)) {
209
+ throw new Error(`Invalid heartbeat task id "${id}". Use only letters, numbers, dots, underscores, and hyphens.`);
210
+ }
211
+ return id;
212
+ }
213
+ function runRecordEntryFromPath(path, record) {
214
+ const id = basename(path, '.json');
215
+ return {
216
+ id,
217
+ path,
218
+ taskId: record.task.id,
219
+ runId: record.result.state.runId,
220
+ createdAt: record.result.state.finishedAt,
221
+ record,
222
+ };
223
+ }
224
+ function sleep(ms, signal) {
225
+ if (signal?.aborted) {
226
+ return Promise.resolve();
227
+ }
228
+ return new Promise((resolve) => {
229
+ const timeout = setTimeout(resolve, ms);
230
+ signal?.addEventListener('abort', () => {
231
+ clearTimeout(timeout);
232
+ resolve();
233
+ }, { once: true });
234
+ });
235
+ }
236
+ //# sourceMappingURL=heartbeat-scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat-scheduler.js","sourceRoot":"","sources":["../../../src/runtime/heartbeat-scheduler.ts"],"names":[],"mappings":"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"}
@@ -83,6 +83,9 @@ function appendHeartbeatSystemContext(systemContext) {
83
83
  '',
84
84
  'This run was started by an autonomous heartbeat, not by a live chat message.',
85
85
  'Operate within the available tools and approval policy.',
86
+ 'There may be no live approval handler. Prefer read-only tools and simple run_shell_inspect commands without cd, &&, redirects, or subshells.',
87
+ 'The shell already runs from the workspace root. For git inspection, use commands such as `git status -sb` directly instead of `cd <path> && git status`.',
88
+ 'Use memory-note tools for durable observations when useful.',
86
89
  'Make bounded useful progress, update durable memory when appropriate, and stop cleanly.',
87
90
  'Escalate only when human input, credentials, policy approval, or risky judgment is required.',
88
91
  'The required final decision line is: HEARTBEAT_DECISION: continue | pause | complete | escalate',
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../../src/runtime/heartbeat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../../src/runtime/heartbeat.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roackb2/heddle",
3
- "version": "0.0.10",
3
+ "version": "0.0.12",
4
4
  "description": "An open-source terminal coding agent runtime and CLI with OpenAI and Anthropic support",
5
5
  "author": "Jay / Fienna Liang <roackb2@gmail.com>",
6
6
  "license": "MIT",
@@ -37,8 +37,10 @@
37
37
  "dev": "tsx --no-cache examples/repo-investigator.ts",
38
38
  "example:programmatic": "tsx --no-cache examples/programmatic-loop.ts",
39
39
  "example:heartbeat": "tsx --no-cache examples/heartbeat.ts",
40
+ "example:heartbeat-scheduler": "tsx --no-cache examples/heartbeat-scheduler.ts",
40
41
  "example:host-events": "tsx --no-cache examples/host-events.ts",
41
42
  "example:cyberloop-observer": "tsx --no-cache examples/cyberloop-observer.ts",
43
+ "cli:dev": "tsx --no-cache src/cli/main.ts",
42
44
  "chat": "tsx --no-cache examples/conversation.tsx",
43
45
  "chat:light": "OPENAI_MODEL=gpt-5.1-codex-mini tsx --no-cache examples/conversation.tsx",
44
46
  "repo-investigator:dev": "OPENAI_API_KEY=\"$PERSONAL_OPENAI_API_KEY\" tsx --no-cache examples/repo-investigator.ts",
@@ -93,6 +95,7 @@
93
95
  "ink": "^6.8.0",
94
96
  "openai": "^4.86.2",
95
97
  "pino": "^10.3.1",
98
+ "pino-pretty": "^13.1.3",
96
99
  "react": "^19.2.4"
97
100
  },
98
101
  "devDependencies": {
@@ -100,7 +103,6 @@
100
103
  "@types/react": "^19.2.14",
101
104
  "@vitest/coverage-v8": "^4.1.2",
102
105
  "cyberloop": "^1.0.0",
103
- "pino-pretty": "^13.1.3",
104
106
  "tsx": "^4.19.3",
105
107
  "typescript": "^5.8.2",
106
108
  "vitest": "4.1.2"