harnery 0.13.0 → 0.15.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.
Files changed (66) hide show
  1. package/README.md +2 -0
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +4 -0
  4. package/dist/commands/supervisor.d.ts +4 -0
  5. package/dist/commands/supervisor.d.ts.map +1 -0
  6. package/dist/commands/supervisor.js +238 -0
  7. package/dist/commands/work.d.ts +4 -0
  8. package/dist/commands/work.d.ts.map +1 -0
  9. package/dist/commands/work.js +281 -0
  10. package/dist/core/supervisor/index.d.ts +3 -0
  11. package/dist/core/supervisor/index.d.ts.map +1 -0
  12. package/dist/core/supervisor/index.js +2 -0
  13. package/dist/core/supervisor/read.d.ts +2 -0
  14. package/dist/core/supervisor/read.d.ts.map +1 -0
  15. package/dist/core/supervisor/read.js +1 -0
  16. package/dist/core/supervisor/runner.d.ts +34 -0
  17. package/dist/core/supervisor/runner.d.ts.map +1 -0
  18. package/dist/core/supervisor/runner.js +198 -0
  19. package/dist/core/supervisor/state.d.ts +69 -0
  20. package/dist/core/supervisor/state.d.ts.map +1 -0
  21. package/dist/core/supervisor/state.js +413 -0
  22. package/dist/core/work/index.d.ts +3 -0
  23. package/dist/core/work/index.d.ts.map +1 -0
  24. package/dist/core/work/index.js +2 -0
  25. package/dist/core/work/read.d.ts +2 -0
  26. package/dist/core/work/read.d.ts.map +1 -0
  27. package/dist/core/work/read.js +1 -0
  28. package/dist/core/work/runner.d.ts +10 -0
  29. package/dist/core/work/runner.d.ts.map +1 -0
  30. package/dist/core/work/runner.js +63 -0
  31. package/dist/core/work/state.d.ts +109 -0
  32. package/dist/core/work/state.d.ts.map +1 -0
  33. package/dist/core/work/state.js +698 -0
  34. package/dist/core/workflow/engine.d.ts.map +1 -1
  35. package/dist/core/workflow/engine.js +41 -9
  36. package/dist/core/workflow/index.d.ts +1 -1
  37. package/dist/core/workflow/index.d.ts.map +1 -1
  38. package/dist/core/workflow/proof.d.ts +1 -0
  39. package/dist/core/workflow/proof.d.ts.map +1 -1
  40. package/dist/core/workflow/proof.js +2 -0
  41. package/dist/core/workflow/run-state.d.ts +3 -0
  42. package/dist/core/workflow/run-state.d.ts.map +1 -1
  43. package/dist/core/workflow/run-state.js +14 -0
  44. package/dist/core/workflow/specialists.d.ts +7 -0
  45. package/dist/core/workflow/specialists.d.ts.map +1 -0
  46. package/dist/core/workflow/specialists.js +78 -0
  47. package/dist/core/workflow/types.d.ts +24 -0
  48. package/dist/core/workflow/types.d.ts.map +1 -1
  49. package/package.json +21 -1
  50. package/src/commander.ts +4 -0
  51. package/src/commands/supervisor.ts +315 -0
  52. package/src/commands/work.ts +367 -0
  53. package/src/core/supervisor/index.ts +24 -0
  54. package/src/core/supervisor/read.ts +14 -0
  55. package/src/core/supervisor/runner.ts +278 -0
  56. package/src/core/supervisor/state.ts +552 -0
  57. package/src/core/work/index.ts +24 -0
  58. package/src/core/work/read.ts +15 -0
  59. package/src/core/work/runner.ts +81 -0
  60. package/src/core/work/state.ts +900 -0
  61. package/src/core/workflow/engine.ts +42 -9
  62. package/src/core/workflow/index.ts +1 -0
  63. package/src/core/workflow/proof.ts +3 -0
  64. package/src/core/workflow/run-state.ts +20 -0
  65. package/src/core/workflow/specialists.ts +97 -0
  66. package/src/core/workflow/types.ts +25 -0
@@ -0,0 +1,3 @@
1
+ export { type RunWorkItemInput, runWorkItem } from "./runner.js";
2
+ export { acceptWorkItem, assertWorkId, type CreateWorkItemInput, cancelWorkItem, createWorkItem, listWorkItems, newWorkId, readWorkItem, reconcileAllWorkItems, reconcileWorkItem, reopenWorkItem, WORK_EVENT_SCHEMA_VERSION, WORK_INTENT_SCHEMA_VERSION, type WorkAttempt, type WorkEvent, type WorkEventType, type WorkIntent, type WorkNextAction, type WorkProjection, type WorkRecord, type WorkState, } from "./state.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/work/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,cAAc,EACd,YAAY,EACZ,KAAK,mBAAmB,EACxB,cAAc,EACd,cAAc,EACd,aAAa,EACb,SAAS,EACT,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,yBAAyB,EACzB,0BAA0B,EAC1B,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,SAAS,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { runWorkItem } from "./runner.js";
2
+ export { acceptWorkItem, assertWorkId, cancelWorkItem, createWorkItem, listWorkItems, newWorkId, readWorkItem, reconcileAllWorkItems, reconcileWorkItem, reopenWorkItem, WORK_EVENT_SCHEMA_VERSION, WORK_INTENT_SCHEMA_VERSION, } from "./state.js";
@@ -0,0 +1,2 @@
1
+ export { assertWorkId, listWorkItems, readWorkItem, WORK_EVENT_SCHEMA_VERSION, WORK_INTENT_SCHEMA_VERSION, type WorkAttempt, type WorkEvent, type WorkEventType, type WorkIntent, type WorkNextAction, type WorkProjection, type WorkRecord, type WorkState, } from "./state.js";
2
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/core/work/read.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,yBAAyB,EACzB,0BAA0B,EAC1B,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,SAAS,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ export { assertWorkId, listWorkItems, readWorkItem, WORK_EVENT_SCHEMA_VERSION, WORK_INTENT_SCHEMA_VERSION, } from "./state.js";
@@ -0,0 +1,10 @@
1
+ import type { EngineOpts, RunReport } from "../workflow/types.js";
2
+ export interface RunWorkItemInput {
3
+ coordRoot: string;
4
+ workId: string;
5
+ engine: Omit<EngineOpts, "coordRoot" | "runId" | "resumeRunId" | "workItemId">;
6
+ retry?: boolean;
7
+ actor?: string;
8
+ }
9
+ export declare function runWorkItem(input: RunWorkItemInput): Promise<RunReport>;
10
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/core/work/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAWlE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,OAAO,GAAG,aAAa,GAAG,YAAY,CAAC,CAAC;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CA2D7E"}
@@ -0,0 +1,63 @@
1
+ import { resolve } from "node:path";
2
+ import { runWorkflow } from "../workflow/engine.js";
3
+ import { acquireWorkLease, appendReconcileIfChanged, appendWorkEvent, assertWorkflowUnchanged, boundedActor, newWorkflowRunId, readWorkItemIgnoringLease, } from "./state.js";
4
+ export async function runWorkItem(input) {
5
+ const coordRoot = resolve(input.coordRoot);
6
+ const release = acquireWorkLease(coordRoot, input.workId);
7
+ try {
8
+ const record = readWorkItemIgnoringLease(coordRoot, input.workId);
9
+ assertWorkflowUnchanged(record.intent);
10
+ const latest = record.projection.attempts.at(-1);
11
+ if (record.projection.state === "awaiting_approval" && latest) {
12
+ if (record.projection.next_action !== "resume") {
13
+ throw new Error(`work item ${input.workId} is waiting for approval ${latest.approval_id}`);
14
+ }
15
+ appendWorkEvent(coordRoot, input.workId, {
16
+ event: "attempt.resumed",
17
+ actor: boundedActor(input.actor),
18
+ reason: "resuming the parked workflow attempt",
19
+ run_id: latest.run_id,
20
+ attempt: latest.number,
21
+ });
22
+ return await runWorkflow(record.intent.workflow.path, {
23
+ ...input.engine,
24
+ coordRoot,
25
+ resumeRunId: latest.run_id,
26
+ workItemId: input.workId,
27
+ });
28
+ }
29
+ if (record.projection.state === "blocked" && !input.retry) {
30
+ throw new Error(`work item ${input.workId} is blocked; use an explicit retry`);
31
+ }
32
+ if (!(record.projection.state === "ready" || record.projection.state === "blocked")) {
33
+ throw new Error(`work item ${input.workId} cannot run from state ${record.projection.state}`);
34
+ }
35
+ if (record.projection.attempts_used >= record.intent.max_attempts) {
36
+ throw new Error(`work item ${input.workId} exhausted its ${record.intent.max_attempts} attempts`);
37
+ }
38
+ const attempt = record.projection.attempts_used + 1;
39
+ const runId = newWorkflowRunId();
40
+ appendWorkEvent(coordRoot, input.workId, {
41
+ event: "attempt.started",
42
+ actor: boundedActor(input.actor),
43
+ reason: input.retry ? "explicit retry started" : "workflow attempt started",
44
+ run_id: runId,
45
+ attempt,
46
+ });
47
+ return await runWorkflow(record.intent.workflow.path, {
48
+ ...input.engine,
49
+ coordRoot,
50
+ runId,
51
+ workItemId: input.workId,
52
+ });
53
+ }
54
+ finally {
55
+ try {
56
+ const current = readWorkItemIgnoringLease(coordRoot, input.workId);
57
+ appendReconcileIfChanged(coordRoot, current, boundedActor(input.actor, "work-runner"));
58
+ }
59
+ finally {
60
+ release();
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,109 @@
1
+ export declare const WORK_INTENT_SCHEMA_VERSION: 1;
2
+ export declare const WORK_EVENT_SCHEMA_VERSION: 1;
3
+ export type WorkState = "waiting" | "ready" | "running" | "awaiting_approval" | "in_review" | "blocked" | "succeeded" | "cancelled";
4
+ export type WorkNextAction = "wait_for_dependencies" | "run" | "wait_for_run" | "resolve_approval" | "resume" | "retry" | "review" | "none";
5
+ export interface WorkIntent {
6
+ schema_version: typeof WORK_INTENT_SCHEMA_VERSION;
7
+ id: string;
8
+ title: string;
9
+ objective: string;
10
+ acceptance: string[];
11
+ dependencies: string[];
12
+ workflow: {
13
+ path: string;
14
+ sha256: string;
15
+ };
16
+ max_attempts: number;
17
+ source?: {
18
+ kind: "human" | "workflow" | "external";
19
+ ref?: string;
20
+ };
21
+ created_at: string;
22
+ }
23
+ export type WorkEventType = "work.created" | "work.reconciled" | "attempt.started" | "attempt.resumed" | "work.accepted" | "work.cancelled" | "work.reopened";
24
+ export interface WorkEvent {
25
+ schema_version: typeof WORK_EVENT_SCHEMA_VERSION;
26
+ work_id: string;
27
+ seq: number;
28
+ ts: string;
29
+ event: WorkEventType;
30
+ actor: string;
31
+ reason?: string;
32
+ run_id?: string;
33
+ attempt?: number;
34
+ state?: WorkState;
35
+ next_action?: WorkNextAction;
36
+ }
37
+ export interface WorkAttempt {
38
+ number: number;
39
+ run_id: string;
40
+ started_at: string;
41
+ status: "running" | "parked" | "succeeded" | "failed" | "lost";
42
+ approval_id?: string;
43
+ proof_path?: string;
44
+ }
45
+ export interface WorkProjection {
46
+ id: string;
47
+ title: string;
48
+ state: WorkState;
49
+ reason: string;
50
+ next_action: WorkNextAction;
51
+ unresolved_dependencies: string[];
52
+ attempts: WorkAttempt[];
53
+ attempts_used: number;
54
+ attempts_remaining: number;
55
+ latest_run_id?: string;
56
+ approval_id?: string;
57
+ proof_path?: string;
58
+ updated_at: string;
59
+ }
60
+ export interface WorkRecord {
61
+ intent: WorkIntent;
62
+ events: WorkEvent[];
63
+ projection: WorkProjection;
64
+ }
65
+ export interface CreateWorkItemInput {
66
+ coordRoot: string;
67
+ title: string;
68
+ objective: string;
69
+ workflowPath: string;
70
+ acceptance?: string[];
71
+ dependencies?: string[];
72
+ maxAttempts?: number;
73
+ source?: WorkIntent["source"];
74
+ id?: string;
75
+ actor?: string;
76
+ }
77
+ export declare function createWorkItem(input: CreateWorkItemInput): WorkRecord;
78
+ export declare function readWorkItem(coordRoot: string, workId: string): WorkRecord;
79
+ export declare function listWorkItems(coordRoot: string): WorkRecord[];
80
+ export declare function reconcileWorkItem(coordRoot: string, workId: string, actor?: string): WorkRecord;
81
+ export declare function reconcileAllWorkItems(coordRoot: string, actor?: string): WorkRecord[];
82
+ export declare function acceptWorkItem(coordRoot: string, workId: string, input?: {
83
+ actor?: string;
84
+ reason?: string;
85
+ }): WorkRecord;
86
+ export declare function cancelWorkItem(coordRoot: string, workId: string, input?: {
87
+ actor?: string;
88
+ reason?: string;
89
+ }): WorkRecord;
90
+ export declare function reopenWorkItem(coordRoot: string, workId: string, input?: {
91
+ actor?: string;
92
+ reason?: string;
93
+ }): WorkRecord;
94
+ export declare function assertWorkId(workId: string): void;
95
+ export declare function newWorkId(): string;
96
+ export declare function newWorkflowRunId(): string;
97
+ /** @internal Runner seam; not a separate persistence contract. */
98
+ export declare function appendReconcileIfChanged(coordRoot: string, record: WorkRecord, actor: string): void;
99
+ /** @internal Runner seam; not a separate persistence contract. */
100
+ export declare function appendWorkEvent(coordRoot: string, workId: string, input: Omit<WorkEvent, "schema_version" | "work_id" | "seq" | "ts">): WorkEvent;
101
+ /** @internal Runner seam; not a separate persistence contract. */
102
+ export declare function readWorkItemIgnoringLease(coordRoot: string, workId: string): WorkRecord;
103
+ /** @internal Runner seam; not a separate persistence contract. */
104
+ export declare function assertWorkflowUnchanged(intent: WorkIntent): void;
105
+ /** @internal Runner seam; not a separate persistence contract. */
106
+ export declare function acquireWorkLease(coordRoot: string, workId: string): () => void;
107
+ /** @internal Runner seam; not a separate persistence contract. */
108
+ export declare function boundedActor(value?: string, fallback?: string): string;
109
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/core/work/state.ts"],"names":[],"mappings":"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"}