@pi-orca/tasks 0.0.2-dev.20260413162335
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 +43 -0
- package/dist/commands.d.ts +29 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +213 -0
- package/dist/commands.js.map +1 -0
- package/dist/engine/crud.d.ts +81 -0
- package/dist/engine/crud.d.ts.map +1 -0
- package/dist/engine/crud.js +214 -0
- package/dist/engine/crud.js.map +1 -0
- package/dist/engine/dag.d.ts +30 -0
- package/dist/engine/dag.d.ts.map +1 -0
- package/dist/engine/dag.js +99 -0
- package/dist/engine/dag.js.map +1 -0
- package/dist/engine/index.d.ts +8 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +8 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/notes.d.ts +26 -0
- package/dist/engine/notes.d.ts.map +1 -0
- package/dist/engine/notes.js +45 -0
- package/dist/engine/notes.js.map +1 -0
- package/dist/engine/state-machine.d.ts +57 -0
- package/dist/engine/state-machine.d.ts.map +1 -0
- package/dist/engine/state-machine.js +302 -0
- package/dist/engine/state-machine.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +229 -0
- package/dist/index.js.map +1 -0
- package/dist/tool.d.ts +19 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +188 -0
- package/dist/tool.js.map +1 -0
- package/dist/widget.d.ts +10 -0
- package/dist/widget.d.ts.map +1 -0
- package/dist/widget.js +59 -0
- package/dist/widget.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAG validation and cascading for tasks.
|
|
3
|
+
* Spec: §3.5 — Dependency Validation
|
|
4
|
+
*/
|
|
5
|
+
import { detectCycle, getTransitiveDependents } from "@pi-orca/core";
|
|
6
|
+
import { readTask, writeTask, buildDependencyMaps } from "./crud.js";
|
|
7
|
+
/**
|
|
8
|
+
* Validate that adding a dependency does not create a cycle.
|
|
9
|
+
* Returns cycle path string if cycle found, null if safe.
|
|
10
|
+
* Spec: §3.5 — Cycle Detection
|
|
11
|
+
*/
|
|
12
|
+
export async function validateNoCycle(taskId, newDependency, projectSlug) {
|
|
13
|
+
const { dependencies } = await buildDependencyMaps(projectSlug);
|
|
14
|
+
const cyclePath = detectCycle(taskId, newDependency, dependencies);
|
|
15
|
+
if (cyclePath) {
|
|
16
|
+
return `Cycle detected: ${cyclePath.join(" → ")}`;
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate all new dependencies for a task do not create cycles.
|
|
22
|
+
* Returns error message if any cycle found, null if all safe.
|
|
23
|
+
*/
|
|
24
|
+
export async function validateDependencies(taskId, newDependencies, projectSlug) {
|
|
25
|
+
for (const dep of newDependencies) {
|
|
26
|
+
const error = await validateNoCycle(taskId, dep, projectSlug);
|
|
27
|
+
if (error)
|
|
28
|
+
return error;
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Cascade failure to all transitive dependents.
|
|
34
|
+
* When a task fails, all tasks that depend on it (directly or transitively)
|
|
35
|
+
* are blocked with blockedReason pointing to the root failed task.
|
|
36
|
+
* Spec: §3.5 — Failure Cascading
|
|
37
|
+
*/
|
|
38
|
+
export async function cascadeFailure(failedTaskId, projectSlug) {
|
|
39
|
+
const { dependents } = await buildDependencyMaps(projectSlug);
|
|
40
|
+
const affected = getTransitiveDependents(failedTaskId, dependents);
|
|
41
|
+
for (const depId of affected) {
|
|
42
|
+
const depFile = await readTask(depId, projectSlug);
|
|
43
|
+
if (!depFile)
|
|
44
|
+
continue;
|
|
45
|
+
// Only block pending or in_progress tasks (not already completed/abandoned)
|
|
46
|
+
if (depFile.task.status === "pending" ||
|
|
47
|
+
depFile.task.status === "in_progress" ||
|
|
48
|
+
depFile.task.status === "blocked") {
|
|
49
|
+
depFile.task.status = "blocked";
|
|
50
|
+
depFile.task.blockedReason = `root cause: ${failedTaskId} failed`;
|
|
51
|
+
depFile.task.updatedAt = new Date().toISOString();
|
|
52
|
+
await writeTask(depFile);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Re-evaluate and unblock dependents after a task's failure is resolved.
|
|
58
|
+
* When a failed task is retried and completes, all dependents whose
|
|
59
|
+
* blockedReason traced back to this task are re-evaluated.
|
|
60
|
+
* Spec: §3.5 — Unblock Cascading
|
|
61
|
+
*/
|
|
62
|
+
export async function cascadeUnblock(resolvedTaskId, projectSlug) {
|
|
63
|
+
const { dependents, dependencies } = await buildDependencyMaps(projectSlug);
|
|
64
|
+
const affected = getTransitiveDependents(resolvedTaskId, dependents);
|
|
65
|
+
for (const depId of affected) {
|
|
66
|
+
const depFile = await readTask(depId, projectSlug);
|
|
67
|
+
if (!depFile)
|
|
68
|
+
continue;
|
|
69
|
+
// Only process blocked tasks
|
|
70
|
+
if (depFile.task.status !== "blocked")
|
|
71
|
+
continue;
|
|
72
|
+
// Re-evaluate all dependencies
|
|
73
|
+
// A blocked task can only be unblocked if ALL its dependencies are completed
|
|
74
|
+
const taskDeps = dependencies.get(depId) ?? [];
|
|
75
|
+
let stillBlocked = false;
|
|
76
|
+
let newBlockedReason = "";
|
|
77
|
+
for (const dep of taskDeps) {
|
|
78
|
+
const depTask = await readTask(dep, projectSlug);
|
|
79
|
+
if (!depTask)
|
|
80
|
+
continue;
|
|
81
|
+
if (depTask.task.status !== "completed") {
|
|
82
|
+
stillBlocked = true;
|
|
83
|
+
newBlockedReason = `root cause: ${dep} ${depTask.task.status}`;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (!stillBlocked) {
|
|
88
|
+
depFile.task.status = "pending";
|
|
89
|
+
depFile.task.blockedReason = "";
|
|
90
|
+
depFile.task.updatedAt = new Date().toISOString();
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
depFile.task.blockedReason = newBlockedReason;
|
|
94
|
+
depFile.task.updatedAt = new Date().toISOString();
|
|
95
|
+
}
|
|
96
|
+
await writeTask(depFile);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=dag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dag.js","sourceRoot":"","sources":["../../src/engine/dag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task note management.
|
|
3
|
+
* Spec: §3.7 — Task Notes and Resumption
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Format a timestamped note entry.
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatNote(sessionId: string, note: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Append a timestamped note to a task's body.
|
|
11
|
+
* Spec: §3.7 — note action
|
|
12
|
+
*/
|
|
13
|
+
export declare function addNote(taskId: string, note: string, sessionId: string, projectSlug?: string): Promise<{
|
|
14
|
+
success: boolean;
|
|
15
|
+
error?: string;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Get context reminder injected on task claim.
|
|
19
|
+
* Spec: §3.7 — Context injection on claim
|
|
20
|
+
*/
|
|
21
|
+
export declare function getClaimContextReminder(hasNotes: boolean): string;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a task body contains any notes (prior work).
|
|
24
|
+
*/
|
|
25
|
+
export declare function hasNotes(body: string): boolean;
|
|
26
|
+
//# sourceMappingURL=notes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../src/engine/notes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlE;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAKjE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9C"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task note management.
|
|
3
|
+
* Spec: §3.7 — Task Notes and Resumption
|
|
4
|
+
*/
|
|
5
|
+
import { readTask, writeTask } from "./crud.js";
|
|
6
|
+
/**
|
|
7
|
+
* Format a timestamped note entry.
|
|
8
|
+
*/
|
|
9
|
+
export function formatNote(sessionId, note) {
|
|
10
|
+
const timestamp = new Date().toISOString();
|
|
11
|
+
return `_Updated by session ${sessionId} at ${timestamp}:_\n${note}`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Append a timestamped note to a task's body.
|
|
15
|
+
* Spec: §3.7 — note action
|
|
16
|
+
*/
|
|
17
|
+
export async function addNote(taskId, note, sessionId, projectSlug) {
|
|
18
|
+
const taskFile = await readTask(taskId, projectSlug);
|
|
19
|
+
if (!taskFile) {
|
|
20
|
+
return { success: false, error: `Task ${taskId} not found` };
|
|
21
|
+
}
|
|
22
|
+
const formattedNote = formatNote(sessionId, note);
|
|
23
|
+
const separator = taskFile.body.endsWith("\n") ? "\n" : "\n\n";
|
|
24
|
+
taskFile.body = `${taskFile.body}${separator}${formattedNote}\n`;
|
|
25
|
+
taskFile.task.updatedAt = new Date().toISOString();
|
|
26
|
+
await writeTask(taskFile);
|
|
27
|
+
return { success: true };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get context reminder injected on task claim.
|
|
31
|
+
* Spec: §3.7 — Context injection on claim
|
|
32
|
+
*/
|
|
33
|
+
export function getClaimContextReminder(hasNotes) {
|
|
34
|
+
if (hasNotes) {
|
|
35
|
+
return "Review prior notes before starting — previous work may be partially complete.\nAdd notes as you progress to support resumption if the task is interrupted.";
|
|
36
|
+
}
|
|
37
|
+
return "Add notes as you progress to support resumption if the task is interrupted.";
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check if a task body contains any notes (prior work).
|
|
41
|
+
*/
|
|
42
|
+
export function hasNotes(body) {
|
|
43
|
+
return body.includes("_Updated by session");
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=notes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes.js","sourceRoot":"","sources":["../../src/engine/notes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,IAAY;IACxD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO,uBAAuB,SAAS,OAAO,SAAS,OAAO,IAAI,EAAE,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAc,EACd,IAAY,EACZ,SAAiB,EACjB,WAAoB;IAEpB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,MAAM,YAAY,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,aAAa,GAAG,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/D,QAAQ,CAAC,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,GAAG,SAAS,GAAG,aAAa,IAAI,CAAC;IACjE,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEnD,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAiB;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,4JAA4J,CAAC;IACtK,CAAC;IACD,OAAO,6EAA6E,CAAC;AACvF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task state machine transitions.
|
|
3
|
+
* Spec: §3.2 — Task State Machine, §3.6 — Task Retry
|
|
4
|
+
*/
|
|
5
|
+
import { TaskFile } from "./crud.js";
|
|
6
|
+
export interface TransitionResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
task?: TaskFile;
|
|
9
|
+
error?: string;
|
|
10
|
+
message?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Claim a pending task — acquires lock, sets in_progress.
|
|
14
|
+
* Spec: §2.2.2
|
|
15
|
+
*/
|
|
16
|
+
export declare function claimTask(taskId: string, sessionId: string, sessionPath: string, agentTemplate?: string, projectSlug?: string): Promise<TransitionResult & {
|
|
17
|
+
claimContext?: string;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Complete a claimed task — releases lock, sets completed.
|
|
21
|
+
* Spec: §2.2.3
|
|
22
|
+
*/
|
|
23
|
+
export declare function completeTask(taskId: string, sessionId: string, projectSlug?: string): Promise<TransitionResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Fail a claimed task — releases lock, sets failed, cascades to dependents.
|
|
26
|
+
* Note is required.
|
|
27
|
+
* Spec: §2.2.4
|
|
28
|
+
*/
|
|
29
|
+
export declare function failTask(taskId: string, sessionId: string, note: string, projectSlug?: string): Promise<TransitionResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Abandon a claimed task — releases lock, sets abandoned.
|
|
32
|
+
* Note is required.
|
|
33
|
+
* Spec: §2.2.5
|
|
34
|
+
*/
|
|
35
|
+
export declare function abandonTask(taskId: string, sessionId: string, note: string, projectSlug?: string): Promise<TransitionResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Unclaim a task — releases lock, returns to pending.
|
|
38
|
+
* Spec: §2.2.6
|
|
39
|
+
*/
|
|
40
|
+
export declare function unclaimTask(taskId: string, sessionId: string, projectSlug?: string): Promise<TransitionResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Retry a failed task — resets to pending, clears assignment, increments retryCount.
|
|
43
|
+
* Spec: §3.6 — Task Retry
|
|
44
|
+
*/
|
|
45
|
+
export declare function retryTask(taskId: string, projectSlug?: string): Promise<TransitionResult>;
|
|
46
|
+
/**
|
|
47
|
+
* Force-unlock a stuck task.
|
|
48
|
+
* Spec: §2.5.3
|
|
49
|
+
*/
|
|
50
|
+
export declare function unlockTask(taskId: string, projectSlug?: string): Promise<TransitionResult & {
|
|
51
|
+
wasStuck?: boolean;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Reopen an abandoned task → pending.
|
|
55
|
+
*/
|
|
56
|
+
export declare function reopenTask(taskId: string, projectSlug?: string): Promise<TransitionResult>;
|
|
57
|
+
//# sourceMappingURL=state-machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../../src/engine/state-machine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,QAAQ,EAET,MAAM,WAAW,CAAC;AAanB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmEvD;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAmC3B;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAyC3B;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CA2C3B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CA+B3B;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAyB3B;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAoCpD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAoB3B"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task state machine transitions.
|
|
3
|
+
* Spec: §3.2 — Task State Machine, §3.6 — Task Retry
|
|
4
|
+
*/
|
|
5
|
+
import { readTask, writeTask, getTaskLockPath, } from "./crud.js";
|
|
6
|
+
import { cascadeFailure, cascadeUnblock } from "./dag.js";
|
|
7
|
+
import { formatNote, hasNotes, getClaimContextReminder } from "./notes.js";
|
|
8
|
+
import { acquireLock, releaseLock, readLock, deleteFileIfExists, getCurrentPid, makeSessionPathRelative, } from "@pi-orca/core";
|
|
9
|
+
/**
|
|
10
|
+
* Claim a pending task — acquires lock, sets in_progress.
|
|
11
|
+
* Spec: §2.2.2
|
|
12
|
+
*/
|
|
13
|
+
export async function claimTask(taskId, sessionId, sessionPath, agentTemplate, projectSlug) {
|
|
14
|
+
const taskFile = await readTask(taskId, projectSlug);
|
|
15
|
+
if (!taskFile) {
|
|
16
|
+
return { success: false, error: `Task ${taskId} not found` };
|
|
17
|
+
}
|
|
18
|
+
if (taskFile.task.status !== "pending") {
|
|
19
|
+
if (taskFile.task.status === "in_progress") {
|
|
20
|
+
return {
|
|
21
|
+
success: false,
|
|
22
|
+
error: `Task ${taskId} is already claimed by session ${taskFile.task.assignedTo || "unknown"}`,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
error: `Cannot claim task ${taskId}: status is '${taskFile.task.status}', expected 'pending'`,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// Check all dependencies are completed
|
|
31
|
+
if ((taskFile.task.dependencies ?? []).length > 0) {
|
|
32
|
+
for (const depId of taskFile.task.dependencies) {
|
|
33
|
+
const depFile = await readTask(depId, projectSlug);
|
|
34
|
+
if (!depFile) {
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
error: `Dependency ${depId} not found`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
if (depFile.task.status !== "completed") {
|
|
41
|
+
return {
|
|
42
|
+
success: false,
|
|
43
|
+
error: `Cannot claim task ${taskId}: dependency ${depId} is not completed (status: ${depFile.task.status})`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Acquire lock
|
|
49
|
+
const lockPath = getTaskLockPath(taskId, projectSlug);
|
|
50
|
+
const lockInfo = {
|
|
51
|
+
sessionId,
|
|
52
|
+
sessionPath: makeSessionPathRelative(sessionPath),
|
|
53
|
+
pid: getCurrentPid(),
|
|
54
|
+
acquiredAt: new Date().toISOString(),
|
|
55
|
+
agentTemplate,
|
|
56
|
+
};
|
|
57
|
+
const locked = await acquireLock(lockPath, lockInfo);
|
|
58
|
+
if (!locked) {
|
|
59
|
+
const existing = await readLock(lockPath);
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
error: `Task ${taskId} already claimed by session ${existing?.sessionId ?? "unknown"}`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// Update task
|
|
66
|
+
taskFile.task.status = "in_progress";
|
|
67
|
+
taskFile.task.assignedTo = sessionId;
|
|
68
|
+
taskFile.task.assignedSessionPath = makeSessionPathRelative(sessionPath);
|
|
69
|
+
taskFile.task.updatedAt = new Date().toISOString();
|
|
70
|
+
await writeTask(taskFile);
|
|
71
|
+
const claimContext = getClaimContextReminder(hasNotes(taskFile.body));
|
|
72
|
+
return { success: true, task: taskFile, claimContext };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Complete a claimed task — releases lock, sets completed.
|
|
76
|
+
* Spec: §2.2.3
|
|
77
|
+
*/
|
|
78
|
+
export async function completeTask(taskId, sessionId, projectSlug) {
|
|
79
|
+
const taskFile = await readTask(taskId, projectSlug);
|
|
80
|
+
if (!taskFile) {
|
|
81
|
+
return { success: false, error: `Task ${taskId} not found` };
|
|
82
|
+
}
|
|
83
|
+
if (taskFile.task.status !== "in_progress") {
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
error: `Cannot complete task ${taskId}: status is '${taskFile.task.status}', expected 'in_progress'`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (taskFile.task.assignedTo !== sessionId) {
|
|
90
|
+
return {
|
|
91
|
+
success: false,
|
|
92
|
+
error: `Cannot complete task ${taskId}: not assigned to session ${sessionId}`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// Release lock
|
|
96
|
+
const lockPath = getTaskLockPath(taskId, projectSlug);
|
|
97
|
+
await releaseLock(lockPath, sessionId);
|
|
98
|
+
const now = new Date().toISOString();
|
|
99
|
+
taskFile.task.status = "completed";
|
|
100
|
+
taskFile.task.completedAt = now;
|
|
101
|
+
taskFile.task.archivable = true;
|
|
102
|
+
taskFile.task.updatedAt = now;
|
|
103
|
+
await writeTask(taskFile);
|
|
104
|
+
// Cascade unblock to dependents
|
|
105
|
+
await cascadeUnblock(taskId, projectSlug);
|
|
106
|
+
return { success: true, task: taskFile };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Fail a claimed task — releases lock, sets failed, cascades to dependents.
|
|
110
|
+
* Note is required.
|
|
111
|
+
* Spec: §2.2.4
|
|
112
|
+
*/
|
|
113
|
+
export async function failTask(taskId, sessionId, note, projectSlug) {
|
|
114
|
+
if (!note || !note.trim()) {
|
|
115
|
+
return { success: false, error: "The 'note' parameter is required when failing a task" };
|
|
116
|
+
}
|
|
117
|
+
const taskFile = await readTask(taskId, projectSlug);
|
|
118
|
+
if (!taskFile) {
|
|
119
|
+
return { success: false, error: `Task ${taskId} not found` };
|
|
120
|
+
}
|
|
121
|
+
if (taskFile.task.status !== "in_progress") {
|
|
122
|
+
return {
|
|
123
|
+
success: false,
|
|
124
|
+
error: `Cannot fail task ${taskId}: status is '${taskFile.task.status}', expected 'in_progress'`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (taskFile.task.assignedTo !== sessionId) {
|
|
128
|
+
return {
|
|
129
|
+
success: false,
|
|
130
|
+
error: `Cannot fail task ${taskId}: not assigned to session ${sessionId}`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// Append note first
|
|
134
|
+
const formattedNote = formatNote(sessionId, note);
|
|
135
|
+
const separator = taskFile.body.endsWith("\n") ? "\n" : "\n\n";
|
|
136
|
+
taskFile.body = `${taskFile.body}${separator}${formattedNote}\n`;
|
|
137
|
+
// Release lock
|
|
138
|
+
const lockPath = getTaskLockPath(taskId, projectSlug);
|
|
139
|
+
await releaseLock(lockPath, sessionId);
|
|
140
|
+
taskFile.task.status = "failed";
|
|
141
|
+
taskFile.task.updatedAt = new Date().toISOString();
|
|
142
|
+
await writeTask(taskFile);
|
|
143
|
+
// Cascade failure to dependents
|
|
144
|
+
await cascadeFailure(taskId, projectSlug);
|
|
145
|
+
return { success: true, task: taskFile };
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Abandon a claimed task — releases lock, sets abandoned.
|
|
149
|
+
* Note is required.
|
|
150
|
+
* Spec: §2.2.5
|
|
151
|
+
*/
|
|
152
|
+
export async function abandonTask(taskId, sessionId, note, projectSlug) {
|
|
153
|
+
if (!note || !note.trim()) {
|
|
154
|
+
return { success: false, error: "The 'note' parameter is required when abandoning a task" };
|
|
155
|
+
}
|
|
156
|
+
const taskFile = await readTask(taskId, projectSlug);
|
|
157
|
+
if (!taskFile) {
|
|
158
|
+
return { success: false, error: `Task ${taskId} not found` };
|
|
159
|
+
}
|
|
160
|
+
if (taskFile.task.status !== "in_progress") {
|
|
161
|
+
return {
|
|
162
|
+
success: false,
|
|
163
|
+
error: `Cannot abandon task ${taskId}: status is '${taskFile.task.status}', expected 'in_progress'`,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
if (taskFile.task.assignedTo !== sessionId) {
|
|
167
|
+
return {
|
|
168
|
+
success: false,
|
|
169
|
+
error: `Cannot abandon task ${taskId}: not assigned to session ${sessionId}`,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// Append note
|
|
173
|
+
const formattedNote = formatNote(sessionId, note);
|
|
174
|
+
const separator = taskFile.body.endsWith("\n") ? "\n" : "\n\n";
|
|
175
|
+
taskFile.body = `${taskFile.body}${separator}${formattedNote}\n`;
|
|
176
|
+
// Release lock
|
|
177
|
+
const lockPath = getTaskLockPath(taskId, projectSlug);
|
|
178
|
+
await releaseLock(lockPath, sessionId);
|
|
179
|
+
const now = new Date().toISOString();
|
|
180
|
+
taskFile.task.status = "abandoned";
|
|
181
|
+
taskFile.task.completedAt = now;
|
|
182
|
+
taskFile.task.archivable = true;
|
|
183
|
+
taskFile.task.assignedTo = "";
|
|
184
|
+
taskFile.task.assignedSessionPath = "";
|
|
185
|
+
taskFile.task.updatedAt = now;
|
|
186
|
+
await writeTask(taskFile);
|
|
187
|
+
return { success: true, task: taskFile };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Unclaim a task — releases lock, returns to pending.
|
|
191
|
+
* Spec: §2.2.6
|
|
192
|
+
*/
|
|
193
|
+
export async function unclaimTask(taskId, sessionId, projectSlug) {
|
|
194
|
+
const taskFile = await readTask(taskId, projectSlug);
|
|
195
|
+
if (!taskFile) {
|
|
196
|
+
return { success: false, error: `Task ${taskId} not found` };
|
|
197
|
+
}
|
|
198
|
+
if (taskFile.task.status !== "in_progress") {
|
|
199
|
+
return {
|
|
200
|
+
success: false,
|
|
201
|
+
error: `Cannot unclaim task ${taskId}: status is '${taskFile.task.status}', expected 'in_progress'`,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
if (taskFile.task.assignedTo !== sessionId) {
|
|
205
|
+
return {
|
|
206
|
+
success: false,
|
|
207
|
+
error: `Cannot unclaim task ${taskId}: not assigned to session ${sessionId}`,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// Release lock
|
|
211
|
+
const lockPath = getTaskLockPath(taskId, projectSlug);
|
|
212
|
+
await releaseLock(lockPath, sessionId);
|
|
213
|
+
taskFile.task.status = "pending";
|
|
214
|
+
taskFile.task.assignedTo = "";
|
|
215
|
+
taskFile.task.assignedSessionPath = "";
|
|
216
|
+
taskFile.task.updatedAt = new Date().toISOString();
|
|
217
|
+
await writeTask(taskFile);
|
|
218
|
+
return { success: true, task: taskFile };
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Retry a failed task — resets to pending, clears assignment, increments retryCount.
|
|
222
|
+
* Spec: §3.6 — Task Retry
|
|
223
|
+
*/
|
|
224
|
+
export async function retryTask(taskId, projectSlug) {
|
|
225
|
+
const taskFile = await readTask(taskId, projectSlug);
|
|
226
|
+
if (!taskFile) {
|
|
227
|
+
return { success: false, error: `Task ${taskId} not found` };
|
|
228
|
+
}
|
|
229
|
+
if (taskFile.task.status !== "failed") {
|
|
230
|
+
return {
|
|
231
|
+
success: false,
|
|
232
|
+
error: `Cannot retry task ${taskId}: status is '${taskFile.task.status}', expected 'failed'`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
// Remove lock file if exists (may be stale)
|
|
236
|
+
const lockPath = getTaskLockPath(taskId, projectSlug);
|
|
237
|
+
await deleteFileIfExists(lockPath);
|
|
238
|
+
taskFile.task.status = "pending";
|
|
239
|
+
taskFile.task.assignedTo = "";
|
|
240
|
+
taskFile.task.assignedSessionPath = "";
|
|
241
|
+
taskFile.task.retryCount = (taskFile.task.retryCount ?? 0) + 1;
|
|
242
|
+
taskFile.task.updatedAt = new Date().toISOString();
|
|
243
|
+
await writeTask(taskFile);
|
|
244
|
+
return { success: true, task: taskFile };
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Force-unlock a stuck task.
|
|
248
|
+
* Spec: §2.5.3
|
|
249
|
+
*/
|
|
250
|
+
export async function unlockTask(taskId, projectSlug) {
|
|
251
|
+
const taskFile = await readTask(taskId, projectSlug);
|
|
252
|
+
if (!taskFile) {
|
|
253
|
+
return { success: false, error: `Task ${taskId} not found` };
|
|
254
|
+
}
|
|
255
|
+
const lockPath = getTaskLockPath(taskId, projectSlug);
|
|
256
|
+
const lockInfo = await readLock(lockPath);
|
|
257
|
+
if (!lockInfo) {
|
|
258
|
+
return {
|
|
259
|
+
success: false,
|
|
260
|
+
error: `Task ${taskId} has no lock file`,
|
|
261
|
+
wasStuck: false,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
const { isPidAlive } = await import("@pi-orca/core");
|
|
265
|
+
if (isPidAlive(lockInfo.pid)) {
|
|
266
|
+
return {
|
|
267
|
+
success: false,
|
|
268
|
+
error: `Task ${taskId} is locked by PID ${lockInfo.pid} which is still alive. Use force=true to override.`,
|
|
269
|
+
wasStuck: false,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
// Dead PID — safe to remove lock
|
|
273
|
+
await deleteFileIfExists(lockPath);
|
|
274
|
+
taskFile.task.status = "pending";
|
|
275
|
+
taskFile.task.assignedTo = "";
|
|
276
|
+
taskFile.task.assignedSessionPath = "";
|
|
277
|
+
taskFile.task.updatedAt = new Date().toISOString();
|
|
278
|
+
await writeTask(taskFile);
|
|
279
|
+
return { success: true, task: taskFile, wasStuck: true, message: `Unlocked task ${taskId} (PID ${lockInfo.pid} was dead)` };
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Reopen an abandoned task → pending.
|
|
283
|
+
*/
|
|
284
|
+
export async function reopenTask(taskId, projectSlug) {
|
|
285
|
+
const taskFile = await readTask(taskId, projectSlug);
|
|
286
|
+
if (!taskFile) {
|
|
287
|
+
return { success: false, error: `Task ${taskId} not found` };
|
|
288
|
+
}
|
|
289
|
+
if (taskFile.task.status !== "abandoned") {
|
|
290
|
+
return {
|
|
291
|
+
success: false,
|
|
292
|
+
error: `Cannot reopen task ${taskId}: status is '${taskFile.task.status}', expected 'abandoned'`,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
taskFile.task.status = "pending";
|
|
296
|
+
taskFile.task.completedAt = "";
|
|
297
|
+
taskFile.task.archivable = false;
|
|
298
|
+
taskFile.task.updatedAt = new Date().toISOString();
|
|
299
|
+
await writeTask(taskFile);
|
|
300
|
+
return { success: true, task: taskFile };
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=state-machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-machine.js","sourceRoot":"","sources":["../../src/engine/state-machine.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pi Orca Tasks Extension
|
|
3
|
+
* File-backed task DAG with locking.
|
|
4
|
+
* Spec: §3 — pi-orca-tasks Extension
|
|
5
|
+
*/
|
|
6
|
+
export { executeTaskTool } from "./tool.js";
|
|
7
|
+
export * from "./engine/index.js";
|
|
8
|
+
export { renderTaskWidget } from "./widget.js";
|
|
9
|
+
export * from "./commands.js";
|
|
10
|
+
export declare function register(pi: any): void;
|
|
11
|
+
export default register;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,cAAc,eAAe,CAAC;AAoD9B,wBAAgB,QAAQ,CAAC,EAAE,EAAE,GAAG,QAsL/B;AAED,eAAe,QAAQ,CAAC"}
|