pi-harness-runtime 0.9.15 → 0.9.16

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.
Files changed (101) hide show
  1. package/package.json +1 -1
  2. package/packages/autonomous-runtime/README.md +48 -0
  3. package/packages/autonomous-runtime/dist/inbox.d.ts +75 -0
  4. package/packages/autonomous-runtime/dist/inbox.d.ts.map +1 -0
  5. package/packages/autonomous-runtime/dist/inbox.js +212 -0
  6. package/packages/autonomous-runtime/dist/inbox.js.map +1 -0
  7. package/packages/autonomous-runtime/dist/index.d.ts +17 -0
  8. package/packages/autonomous-runtime/dist/index.d.ts.map +1 -0
  9. package/packages/autonomous-runtime/dist/index.js +17 -0
  10. package/packages/autonomous-runtime/dist/index.js.map +1 -0
  11. package/packages/autonomous-runtime/dist/lease.d.ts +78 -0
  12. package/packages/autonomous-runtime/dist/lease.d.ts.map +1 -0
  13. package/packages/autonomous-runtime/dist/lease.js +273 -0
  14. package/packages/autonomous-runtime/dist/lease.js.map +1 -0
  15. package/packages/autonomous-runtime/dist/types.d.ts +160 -0
  16. package/packages/autonomous-runtime/dist/types.d.ts.map +1 -0
  17. package/packages/autonomous-runtime/dist/types.js +31 -0
  18. package/packages/autonomous-runtime/dist/types.js.map +1 -0
  19. package/packages/autonomous-runtime/dist/worker.d.ts +63 -0
  20. package/packages/autonomous-runtime/dist/worker.d.ts.map +1 -0
  21. package/packages/autonomous-runtime/dist/worker.js +133 -0
  22. package/packages/autonomous-runtime/dist/worker.js.map +1 -0
  23. package/packages/autonomous-runtime/package.json +34 -0
  24. package/packages/autonomous-runtime/src/inbox.ts +266 -0
  25. package/packages/autonomous-runtime/src/index.ts +22 -0
  26. package/packages/autonomous-runtime/src/lease.ts +318 -0
  27. package/packages/autonomous-runtime/src/types.ts +257 -0
  28. package/packages/autonomous-runtime/test/autonomous-runtime.test.ts +194 -0
  29. package/packages/autonomous-runtime/test/inbox.test.mjs +266 -0
  30. package/packages/autonomous-runtime/test/inbox.test.ts +80 -0
  31. package/packages/autonomous-runtime/test/types.test.ts +68 -0
  32. package/packages/autonomous-runtime/tsconfig.json +22 -0
  33. package/packages/autonomous-runtime/tsconfig.tsbuildinfo +1 -0
  34. package/packages/privilege-broker/README.md +45 -0
  35. package/packages/privilege-broker/config/privileges.yaml.example +172 -0
  36. package/packages/privilege-broker/dist/approval.d.ts +23 -0
  37. package/packages/privilege-broker/dist/approval.d.ts.map +1 -0
  38. package/packages/privilege-broker/dist/approval.js +45 -0
  39. package/packages/privilege-broker/dist/approval.js.map +1 -0
  40. package/packages/privilege-broker/dist/audit.d.ts +38 -0
  41. package/packages/privilege-broker/dist/audit.d.ts.map +1 -0
  42. package/packages/privilege-broker/dist/audit.js +125 -0
  43. package/packages/privilege-broker/dist/audit.js.map +1 -0
  44. package/packages/privilege-broker/dist/executor.d.ts +25 -0
  45. package/packages/privilege-broker/dist/executor.d.ts.map +1 -0
  46. package/packages/privilege-broker/dist/executor.js +83 -0
  47. package/packages/privilege-broker/dist/executor.js.map +1 -0
  48. package/packages/privilege-broker/dist/index.d.ts +30 -0
  49. package/packages/privilege-broker/dist/index.d.ts.map +1 -0
  50. package/packages/privilege-broker/dist/index.js +5 -0
  51. package/packages/privilege-broker/dist/index.js.map +1 -0
  52. package/packages/privilege-broker/dist/registry.d.ts +15 -0
  53. package/packages/privilege-broker/dist/registry.d.ts.map +1 -0
  54. package/packages/privilege-broker/dist/registry.js +76 -0
  55. package/packages/privilege-broker/dist/registry.js.map +1 -0
  56. package/packages/privilege-broker/dist/types.d.ts +77 -0
  57. package/packages/privilege-broker/dist/types.d.ts.map +1 -0
  58. package/packages/privilege-broker/dist/types.js +11 -0
  59. package/packages/privilege-broker/dist/types.js.map +1 -0
  60. package/packages/privilege-broker/package.json +35 -0
  61. package/packages/privilege-broker/src/approval.ts +70 -0
  62. package/packages/privilege-broker/src/audit.ts +142 -0
  63. package/packages/privilege-broker/src/executor.ts +110 -0
  64. package/packages/privilege-broker/src/index.ts +46 -0
  65. package/packages/privilege-broker/src/registry.ts +98 -0
  66. package/packages/privilege-broker/src/types.ts +105 -0
  67. package/packages/privilege-broker/tsconfig.json +22 -0
  68. package/packages/privilege-broker/tsconfig.tsbuildinfo +1 -0
  69. package/packages/scheduler-adapter/README.md +36 -0
  70. package/packages/scheduler-adapter/dist/cron.d.ts +21 -0
  71. package/packages/scheduler-adapter/dist/cron.d.ts.map +1 -0
  72. package/packages/scheduler-adapter/dist/cron.js +116 -0
  73. package/packages/scheduler-adapter/dist/cron.js.map +1 -0
  74. package/packages/scheduler-adapter/dist/index.d.ts +9 -0
  75. package/packages/scheduler-adapter/dist/index.d.ts.map +1 -0
  76. package/packages/scheduler-adapter/dist/index.js +8 -0
  77. package/packages/scheduler-adapter/dist/index.js.map +1 -0
  78. package/packages/scheduler-adapter/dist/interface.d.ts +61 -0
  79. package/packages/scheduler-adapter/dist/interface.d.ts.map +1 -0
  80. package/packages/scheduler-adapter/dist/interface.js +2 -0
  81. package/packages/scheduler-adapter/dist/interface.js.map +1 -0
  82. package/packages/scheduler-adapter/dist/internal.d.ts +30 -0
  83. package/packages/scheduler-adapter/dist/internal.d.ts.map +1 -0
  84. package/packages/scheduler-adapter/dist/internal.js +82 -0
  85. package/packages/scheduler-adapter/dist/internal.js.map +1 -0
  86. package/packages/scheduler-adapter/dist/systemd.d.ts +31 -0
  87. package/packages/scheduler-adapter/dist/systemd.d.ts.map +1 -0
  88. package/packages/scheduler-adapter/dist/systemd.js +203 -0
  89. package/packages/scheduler-adapter/dist/systemd.js.map +1 -0
  90. package/packages/scheduler-adapter/package.json +32 -0
  91. package/packages/scheduler-adapter/src/cron.ts +123 -0
  92. package/packages/scheduler-adapter/src/index.ts +9 -0
  93. package/packages/scheduler-adapter/src/interface.ts +61 -0
  94. package/packages/scheduler-adapter/src/internal.ts +99 -0
  95. package/packages/scheduler-adapter/src/systemd.ts +221 -0
  96. package/packages/scheduler-adapter/tsconfig.json +22 -0
  97. package/packages/scheduler-adapter/tsconfig.tsbuildinfo +1 -0
  98. package/packages/types/dist/ai-providers.d.ts +0 -36
  99. package/packages/types/dist/ai-providers.d.ts.map +0 -1
  100. package/packages/types/dist/ai-providers.js +0 -66
  101. package/packages/types/dist/ai-providers.js.map +0 -1
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Lease Manager — RFC-0101 §4
3
+ *
4
+ * Manages task leases on disk using atomic write-tmp-then-rename.
5
+ * This prevents double-execution when two workers claim the same task concurrently.
6
+ *
7
+ * Filesystem layout:
8
+ * ```
9
+ * ~/.pi/harness/inbox/
10
+ * ├── tasks.jsonl # task records
11
+ * └── claimed/
12
+ * └── <task-id>.lease.json # one lease file per claimed task
13
+ * ```
14
+ *
15
+ * Safety properties:
16
+ * - Claiming is single-execution: POSIX rename is atomic, so only one writer wins.
17
+ * - A worker that dies: its lease expires, the reaper releases it back to queued.
18
+ * - On startup, recoverOrphanLeases() cleans up any stale leases.
19
+ */
20
+ import { closeSync, existsSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, unlinkSync, writeFileSync, writeSync, } from "node:fs";
21
+ import { join } from "node:path";
22
+ import { getLeasesDir } from "./types.js";
23
+ // ─── Errors ───────────────────────────────────────────────────────────────────
24
+ export class LeaseError extends Error {
25
+ constructor(msg) {
26
+ super(`[LeaseError] ${msg}`);
27
+ this.name = "LeaseError";
28
+ }
29
+ }
30
+ // ─── Constants ────────────────────────────────────────────────────────────────
31
+ /** Default lease duration before heartbeat extension is required. */
32
+ export const DEFAULT_LEASE_TTL_MS = 30_000; // 30 s
33
+ /** Heartbeat interval sent by the worker. */
34
+ export const HEARTBEAT_INTERVAL_MS = 5_000; // 5 s
35
+ /** Default worker heartbeat interval extension. */
36
+ export const HEARTBEAT_EXTENSION_MS = 30_000; // extend by 30 s
37
+ /**
38
+ * Manages task leases on disk using atomic write-tmp-then-rename.
39
+ */
40
+ export class LeaseManager {
41
+ leasesDir;
42
+ leaseTtlMs;
43
+ constructor(options = {}) {
44
+ this.leasesDir = options.leasesDir ?? getLeasesDir();
45
+ this.leaseTtlMs = options.leaseTtlMs ?? DEFAULT_LEASE_TTL_MS;
46
+ }
47
+ /** Ensure the claimed/ directory exists. */
48
+ ensureDir() {
49
+ if (!existsSync(this.leasesDir)) {
50
+ mkdirSync(this.leasesDir, { recursive: true });
51
+ }
52
+ }
53
+ // ─── claim ───────────────────────────────────────────────────────────────
54
+ /**
55
+ * Atomically claim a task for a worker.
56
+ *
57
+ * Algorithm:
58
+ * 1. Write lease to a temp file in the same directory (same filesystem → fast rename)
59
+ * 2. Attempt atomic rename to `claimed/<taskId>.lease.json`
60
+ * 3. If rename fails (EEXIST) → another worker won → return null
61
+ *
62
+ * @param taskId The task to claim
63
+ * @param workerId The worker claiming it
64
+ * @param attempt Which attempt number (for retry)
65
+ * @returns The TaskLease if won, null if another worker claimed first
66
+ */
67
+ claim(taskId, workerId, attempt = 1) {
68
+ this.ensureDir();
69
+ const now = new Date().toISOString();
70
+ const expiresAt = new Date(Date.now() + this.leaseTtlMs).toISOString();
71
+ const lease = {
72
+ taskId,
73
+ workerId,
74
+ acquiredAt: now,
75
+ expiresAt,
76
+ heartbeatAt: now,
77
+ attempt,
78
+ };
79
+ const targetPath = this._leasePath(taskId);
80
+ // Use open() with O_CREAT | O_EXCL — this is atomic and fails immediately
81
+ // if another worker has already created the lease file. No tmp file needed.
82
+ let fd;
83
+ try {
84
+ fd = openSync(targetPath, "wx", 0o644); // mode 0644 = rw-r--r--
85
+ }
86
+ catch (err) {
87
+ const code = err.code;
88
+ if (code === "EEXIST") {
89
+ return null; // another worker already claimed
90
+ }
91
+ throw err;
92
+ }
93
+ try {
94
+ writeSync(fd, JSON.stringify(lease) + "\n");
95
+ closeSync(fd);
96
+ return lease;
97
+ }
98
+ catch (err) {
99
+ try {
100
+ closeSync(fd);
101
+ }
102
+ catch {
103
+ /* ignore */
104
+ }
105
+ try {
106
+ unlinkSync(targetPath);
107
+ }
108
+ catch {
109
+ /* ignore */
110
+ }
111
+ throw err;
112
+ }
113
+ }
114
+ // ─── heartbeat ────────────────────────────────────────────────────────────
115
+ /**
116
+ * Extend a lease's expiry time.
117
+ * Only the worker that holds the lease can extend it.
118
+ *
119
+ * @returns Updated lease, or null if the lease no longer exists
120
+ */
121
+ heartbeat(taskId, workerId) {
122
+ const lease = this.get(taskId);
123
+ if (!lease)
124
+ return null;
125
+ if (lease.workerId !== workerId) {
126
+ throw new LeaseError(`Worker ${workerId} cannot heartbeat lease for ${taskId}: held by ${lease.workerId}`);
127
+ }
128
+ const updated = {
129
+ ...lease,
130
+ heartbeatAt: new Date().toISOString(),
131
+ expiresAt: new Date(Date.now() + this.leaseTtlMs).toISOString(),
132
+ };
133
+ this._writeLease(updated);
134
+ return updated;
135
+ }
136
+ // ─── release ─────────────────────────────────────────────────────────────
137
+ /**
138
+ * Explicitly release a lease (task completed or failed without retry).
139
+ */
140
+ release(taskId, workerId) {
141
+ const lease = this.get(taskId);
142
+ if (!lease)
143
+ return;
144
+ if (lease.workerId !== workerId) {
145
+ throw new LeaseError(`Worker ${workerId} cannot release lease for ${taskId}: held by ${lease.workerId}`);
146
+ }
147
+ this._removeLease(taskId);
148
+ }
149
+ // ─── get ─────────────────────────────────────────────────────────────────
150
+ /** Read a lease by taskId. Returns null if not found. */
151
+ get(taskId) {
152
+ const path = this._leasePath(taskId);
153
+ if (!existsSync(path))
154
+ return null;
155
+ try {
156
+ return JSON.parse(readFileSync(path, "utf8"));
157
+ }
158
+ catch {
159
+ return null;
160
+ }
161
+ }
162
+ // ─── isExpired ────────────────────────────────────────────────────────────
163
+ /** Check if a lease has expired (expiresAt is in the past). */
164
+ isExpired(lease) {
165
+ return new Date(lease.expiresAt).getTime() < Date.now();
166
+ }
167
+ // ─── reap ────────────────────────────────────────────────────────────────
168
+ /**
169
+ * Scan all leases and return the ones that have expired.
170
+ * Does NOT remove them — call reapAndRelease() to remove atomically.
171
+ */
172
+ reap() {
173
+ if (!existsSync(this.leasesDir))
174
+ return [];
175
+ const now = Date.now();
176
+ const expired = [];
177
+ for (const filename of readdirSync(this.leasesDir)) {
178
+ if (!filename.endsWith(".lease.json"))
179
+ continue;
180
+ const path = join(this.leasesDir, filename);
181
+ try {
182
+ const lease = JSON.parse(readFileSync(path, "utf8"));
183
+ if (new Date(lease.expiresAt).getTime() < now) {
184
+ expired.push(lease);
185
+ }
186
+ }
187
+ catch {
188
+ // Corrupt file — remove it
189
+ try {
190
+ unlinkSync(path);
191
+ }
192
+ catch {
193
+ /* ignore */
194
+ }
195
+ }
196
+ }
197
+ return expired;
198
+ }
199
+ /**
200
+ * Release all expired leases and return their taskIds.
201
+ * Idempotent — safe to call on every heartbeat interval.
202
+ */
203
+ reapAndRelease() {
204
+ const expired = this.reap();
205
+ const released = [];
206
+ for (const lease of expired) {
207
+ try {
208
+ this._removeLease(lease.taskId);
209
+ released.push(lease.taskId);
210
+ }
211
+ catch {
212
+ // Already removed — ignore
213
+ }
214
+ }
215
+ return released;
216
+ }
217
+ // ─── recoverOrphanLeases ─────────────────────────────────────────────────
218
+ /**
219
+ * On worker startup, release any leases held by dead workers.
220
+ * A lease is orphaned if its worker has not re-claimed it since startup.
221
+ *
222
+ * Strategy: remove all leases whose expiresAt has passed.
223
+ * Safe because the next claim will succeed (no other worker holds it).
224
+ */
225
+ recoverOnStartup() {
226
+ return this.reapAndRelease();
227
+ }
228
+ // ─── listActive ───────────────────────────────────────────────────────────
229
+ /** Return all active (non-expired) leases. */
230
+ listActive() {
231
+ if (!existsSync(this.leasesDir))
232
+ return [];
233
+ const now = Date.now();
234
+ const active = [];
235
+ for (const filename of readdirSync(this.leasesDir)) {
236
+ if (!filename.endsWith(".lease.json"))
237
+ continue;
238
+ const path = join(this.leasesDir, filename);
239
+ try {
240
+ const lease = JSON.parse(readFileSync(path, "utf8"));
241
+ if (new Date(lease.expiresAt).getTime() >= now) {
242
+ active.push(lease);
243
+ }
244
+ }
245
+ catch {
246
+ // Corrupt — remove
247
+ try {
248
+ unlinkSync(path);
249
+ }
250
+ catch {
251
+ /* ignore */
252
+ }
253
+ }
254
+ }
255
+ return active;
256
+ }
257
+ // ─── internals ───────────────────────────────────────────────────────────
258
+ _leasePath(taskId) {
259
+ return join(this.leasesDir, `${taskId}.lease.json`);
260
+ }
261
+ _writeLease(lease) {
262
+ this.ensureDir();
263
+ const tmp = `${this._leasePath(lease.taskId)}.tmp`;
264
+ writeFileSync(tmp, JSON.stringify(lease), "utf8");
265
+ renameSync(tmp, this._leasePath(lease.taskId));
266
+ }
267
+ _removeLease(taskId) {
268
+ const path = this._leasePath(taskId);
269
+ if (existsSync(path))
270
+ unlinkSync(path);
271
+ }
272
+ }
273
+ //# sourceMappingURL=lease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lease.js","sourceRoot":"","sources":["../src/lease.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /** A named capability that the privilege broker may grant. */
2
+ export type CapabilityName = "files.read" | "files.write" | "files.exec" | "git.commit" | "git.push" | "git.pull" | "system.restart" | "system.restart-service" | "system.logs" | "bench.migrate" | "bench.build" | "bench.restart" | "okf.promote-pattern" | "okf.promote-lesson" | "notify.send" | "llm.invoke";
3
+ /** What approval class a capability requires. */
4
+ export type ApprovalClass = "automatic_read_only" | "automatic_reversible" | "human_approval_required" | "forbidden";
5
+ export type TaskStatus = "queued" | "claimed" | "running" | "waiting_approval" | "waiting_quota" | "retrying" | "completed" | "failed" | "dead_letter";
6
+ /** Immutable log of what happened to a task. */
7
+ export type TaskEvent = {
8
+ ts: string;
9
+ kind: "claimed" | "started" | "checkpointed" | "progress" | "blocked" | "approval_requested" | "approved" | "denied" | "failed" | "completed" | "recovered" | "dead_lettered" | "transitioned";
10
+ payload?: Record<string, unknown>;
11
+ };
12
+ /** The primary durable record for a task. */
13
+ export interface TaskRecord {
14
+ id: string;
15
+ objective: string;
16
+ acceptanceCriteria: string[];
17
+ source: {
18
+ kind: "chat";
19
+ userId: string;
20
+ } | {
21
+ kind: "schedule";
22
+ scheduleId: string;
23
+ } | {
24
+ kind: "webhook";
25
+ url: string;
26
+ } | {
27
+ kind: "subagent";
28
+ parentTaskId: string;
29
+ } | {
30
+ kind: "manual";
31
+ createdBy: string;
32
+ };
33
+ priority: 0 | 1 | 2 | 3 | 4;
34
+ capabilities: CapabilityName[];
35
+ approvalClass: ApprovalClass;
36
+ status: TaskStatus;
37
+ attempts: number;
38
+ maxAttempts: number;
39
+ context?: ExecutionContext;
40
+ createdAt: string;
41
+ updatedAt: string;
42
+ leaseId?: string;
43
+ result?: TaskResult;
44
+ failureReason?: string;
45
+ history: TaskEvent[];
46
+ }
47
+ /** A lease held by a worker on a specific task. */
48
+ export interface TaskLease {
49
+ taskId: string;
50
+ workerId: string;
51
+ acquiredAt: string;
52
+ expiresAt: string;
53
+ heartbeatAt: string;
54
+ attempt: number;
55
+ }
56
+ /** Heartbeat emitted by a worker every 5 s to worker-registry.json. */
57
+ export interface WorkerHeartbeat {
58
+ workerId: string;
59
+ startedAt: string;
60
+ lastBeatAt: string;
61
+ capacity: number;
62
+ inflightTaskIds: string[];
63
+ }
64
+ /** A resolved grant from the privilege broker. */
65
+ export interface CapabilityGrant {
66
+ name: CapabilityName;
67
+ argv: string[];
68
+ envWhitelist?: string[];
69
+ user: string;
70
+ cwd?: string;
71
+ timeoutMs: number;
72
+ }
73
+ /** An in-flight human approval request. */
74
+ export interface ApprovalRequest {
75
+ id: string;
76
+ taskId: string;
77
+ capability: CapabilityName;
78
+ rationale: string;
79
+ signedBy?: {
80
+ keyFingerprint: string;
81
+ ts: string;
82
+ };
83
+ decision?: "approved" | "denied";
84
+ decidedAt?: string;
85
+ expiresAt: string;
86
+ }
87
+ /** A scheduled recurring task. */
88
+ export interface ScheduledTask {
89
+ id: string;
90
+ taskTemplate: Omit<TaskRecord, "id" | "status" | "attempts" | "createdAt" | "updatedAt" | "history">;
91
+ schedule: ScheduleSpec;
92
+ enabled: boolean;
93
+ lastFiredAt?: string;
94
+ nextFireAt?: string;
95
+ }
96
+ export type ScheduleSpec = {
97
+ kind: "cron";
98
+ expression: string;
99
+ } | {
100
+ kind: "interval";
101
+ intervalMs: number;
102
+ } | {
103
+ kind: "once";
104
+ at: string;
105
+ };
106
+ export type RuntimeNotificationEvent = "task.claimed" | "task.started" | "task.completed" | "task.failed" | "task.waiting_approval" | "task.dead_lettered" | "lease.expired" | "worker.started" | "worker.stopped" | "approval.approved" | "approval.denied" | "approval.expired";
107
+ export interface NotificationEvent {
108
+ kind: RuntimeNotificationEvent;
109
+ ts: string;
110
+ taskId?: string;
111
+ workerId?: string;
112
+ payload: Record<string, unknown>;
113
+ }
114
+ export interface Checkpoint {
115
+ taskId: string;
116
+ attempt: number;
117
+ state: Record<string, unknown>;
118
+ savedAt: string;
119
+ }
120
+ /** The context given to the loop runtime when executing a task. */
121
+ export interface ExecutionContext {
122
+ taskId: string;
123
+ workerId: string;
124
+ inputs: Record<string, unknown>;
125
+ capabilitiesGranted: CapabilityName[];
126
+ approvalClass: ApprovalClass;
127
+ lease: TaskLease;
128
+ checkpoint?: Checkpoint;
129
+ okfBundles: string[];
130
+ }
131
+ export interface TaskResult {
132
+ taskId: string;
133
+ status: "completed" | "failed" | "dead_letter";
134
+ deliverables?: {
135
+ path: string;
136
+ mime: string;
137
+ }[];
138
+ acceptanceCriteriaMet: {
139
+ criterion: string;
140
+ passed: boolean;
141
+ evidence?: string;
142
+ }[];
143
+ durationMs: number;
144
+ modelUsage?: {
145
+ inputTokens: number;
146
+ outputTokens: number;
147
+ provider: string;
148
+ };
149
+ }
150
+ /** Returns the standard storage root for the runtime. */
151
+ export declare function getRuntimeRoot(): string;
152
+ /** Returns the inbox directory path. */
153
+ export declare function getInboxDir(): string;
154
+ /** Returns the claimed leases directory path. */
155
+ export declare function getLeasesDir(): string;
156
+ /** Returns the task JSONL file path. */
157
+ export declare function getTasksPath(): string;
158
+ /** Returns the worker registry path. */
159
+ export declare function getWorkerRegistryPath(): string;
160
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Autonomous Operations Runtime — TypeScript Contracts
3
+ * Based on RFC-0101 §14
4
+ *
5
+ * Consumers: LoopRuntime, privilege-broker, scheduler-adapter, notification-runtime.
6
+ * These types are the canonical contracts. Do not re-define them in other packages.
7
+ */
8
+ import { env } from "node:process";
9
+ // ─── Storage paths ────────────────────────────────────────────────────────────
10
+ const DEFAULT_ROOT = `${env["HOME"] ?? "."}/.pi/harness`;
11
+ /** Returns the standard storage root for the runtime. */
12
+ export function getRuntimeRoot() {
13
+ return env["PI_HARNESS_RUNTIME_ROOT"] ?? DEFAULT_ROOT;
14
+ }
15
+ /** Returns the inbox directory path. */
16
+ export function getInboxDir() {
17
+ return `${getRuntimeRoot()}/inbox`;
18
+ }
19
+ /** Returns the claimed leases directory path. */
20
+ export function getLeasesDir() {
21
+ return `${getInboxDir()}/claimed`;
22
+ }
23
+ /** Returns the task JSONL file path. */
24
+ export function getTasksPath() {
25
+ return `${getInboxDir()}/tasks.jsonl`;
26
+ }
27
+ /** Returns the worker registry path. */
28
+ export function getWorkerRegistryPath() {
29
+ return `${getRuntimeRoot()}/worker-registry.json`;
30
+ }
31
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AA8NnC,iFAAiF;AAEjF,MAAM,YAAY,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,cAAc,CAAC;AAEzD,yDAAyD;AACzD,MAAM,UAAU,cAAc;IAC7B,OAAO,GAAG,CAAC,yBAAyB,CAAC,IAAI,YAAY,CAAC;AACvD,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,WAAW;IAC1B,OAAO,GAAG,cAAc,EAAE,QAAQ,CAAC;AACpC,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,YAAY;IAC3B,OAAO,GAAG,WAAW,EAAE,UAAU,CAAC;AACnC,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,YAAY;IAC3B,OAAO,GAAG,WAAW,EAAE,cAAc,CAAC;AACvC,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,qBAAqB;IACpC,OAAO,GAAG,cAAc,EAAE,uBAAuB,CAAC;AACnD,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Worker Stub — RFC-0101 §4
3
+ *
4
+ * A worker is a pi session that owns tasks from the inbox.
5
+ * This is the lightweight worker-side of the lease protocol.
6
+ *
7
+ * The worker picks up work via the inbox's `claim()` method
8
+ * and reports results via `complete()`.
9
+ */
10
+ import type { TaskResult, WorkerStatus } from "./types.js";
11
+ import type { TaskInbox } from "./inbox.js";
12
+ import type { TaskLease } from "./lease.js";
13
+ export interface WorkerConfig {
14
+ inbox: TaskInbox;
15
+ workerId: string;
16
+ heartbeatIntervalMs?: number;
17
+ onError?: (taskId: string, error: unknown) => void;
18
+ }
19
+ export interface WorkerEvents {
20
+ onLease: (lease: TaskLease) => void;
21
+ onLeaseExpired: (taskId: string) => void;
22
+ onComplete: (taskId: string, result: TaskResult) => void;
23
+ onError: (taskId: string, error: unknown) => void;
24
+ }
25
+ /**
26
+ * Worker — picks up tasks from the inbox and processes them.
27
+ *
28
+ * Lifecycle:
29
+ * 1. Construct with inbox + workerId
30
+ * 2. `start()` — begins polling/claiming tasks
31
+ * 3. `stop()` — stops claiming, expires held leases
32
+ *
33
+ * The worker does NOT run tasks itself — it delegates to the harness
34
+ * loop runtime. It just manages the lease lifecycle.
35
+ */
36
+ export declare class Worker {
37
+ private readonly config;
38
+ private readonly events;
39
+ private running;
40
+ private heartbeatTimer;
41
+ constructor(config: WorkerConfig);
42
+ on<K extends keyof WorkerEvents>(event: K, handler: WorkerEvents[K]): void;
43
+ /**
44
+ * Start the worker — begins polling for available tasks.
45
+ */
46
+ start(): Promise<void>;
47
+ /**
48
+ * Stop the worker — stops polling and expires any held leases.
49
+ */
50
+ stop(): Promise<void>;
51
+ /**
52
+ * Status of this worker.
53
+ */
54
+ status(): WorkerStatus;
55
+ private _poll;
56
+ private _processTask;
57
+ /**
58
+ * Run a single task. Stub — replaces with actual harness loop integration.
59
+ */
60
+ private _runTask;
61
+ private _heartbeat;
62
+ }
63
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAEX,UAAU,EACV,YAAY,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACzD,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD;AAED;;;;;;;;;;GAUG;AACH,qBAAa,MAAM;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAA+C;IAErE,YAAY,MAAM,EAAE,YAAY,EAK/B;IAED,EAAE,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAEzE;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAY3B;IAED;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAW1B;IAED;;OAEG;IACH,MAAM,IAAI,YAAY,CAMrB;YAEa,KAAK;YAmBL,YAAY;IAuB1B;;OAEG;YACW,QAAQ;YAUR,UAAU;CASxB"}