@pi-orca/core 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 +228 -0
- package/defaults/config.yaml +28 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/types/agent.d.ts +72 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +6 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/archivable.d.ts +23 -0
- package/dist/types/archivable.d.ts.map +1 -0
- package/dist/types/archivable.js +47 -0
- package/dist/types/archivable.js.map +1 -0
- package/dist/types/config.d.ts +42 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +42 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/labels.d.ts +28 -0
- package/dist/types/labels.d.ts.map +1 -0
- package/dist/types/labels.js +45 -0
- package/dist/types/labels.js.map +1 -0
- package/dist/types/lock.d.ts +16 -0
- package/dist/types/lock.d.ts.map +1 -0
- package/dist/types/lock.js +6 -0
- package/dist/types/lock.js.map +1 -0
- package/dist/types/message.d.ts +29 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +6 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/task.d.ts +45 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +27 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/team.d.ts +38 -0
- package/dist/types/team.d.ts.map +1 -0
- package/dist/types/team.js +6 -0
- package/dist/types/team.js.map +1 -0
- package/dist/utils/autocomplete.d.ts +42 -0
- package/dist/utils/autocomplete.d.ts.map +1 -0
- package/dist/utils/autocomplete.js +111 -0
- package/dist/utils/autocomplete.js.map +1 -0
- package/dist/utils/config-loader.d.ts +17 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +81 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/dag.d.ts +34 -0
- package/dist/utils/dag.d.ts.map +1 -0
- package/dist/utils/dag.js +96 -0
- package/dist/utils/dag.js.map +1 -0
- package/dist/utils/duration.d.ts +21 -0
- package/dist/utils/duration.d.ts.map +1 -0
- package/dist/utils/duration.js +47 -0
- package/dist/utils/duration.js.map +1 -0
- package/dist/utils/filesystem.d.ts +53 -0
- package/dist/utils/filesystem.d.ts.map +1 -0
- package/dist/utils/filesystem.js +99 -0
- package/dist/utils/filesystem.js.map +1 -0
- package/dist/utils/heartbeat.d.ts +23 -0
- package/dist/utils/heartbeat.d.ts.map +1 -0
- package/dist/utils/heartbeat.js +53 -0
- package/dist/utils/heartbeat.js.map +1 -0
- package/dist/utils/index.d.ts +14 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +14 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/lock.d.ts +43 -0
- package/dist/utils/lock.d.ts.map +1 -0
- package/dist/utils/lock.js +89 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/path.d.ts +88 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +128 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/process.d.ts +20 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +40 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/utils/yaml.d.ts +30 -0
- package/dist/utils/yaml.d.ts.map +1 -0
- package/dist/utils/yaml.js +58 -0
- package/dist/utils/yaml.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lock file types.
|
|
3
|
+
* Spec: §3.4 — Lock File Schema
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Lock file schema.
|
|
7
|
+
* Spec: §3.4 — Lock File Schema
|
|
8
|
+
*/
|
|
9
|
+
export interface LockInfo {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
sessionPath: string;
|
|
12
|
+
pid: number;
|
|
13
|
+
acquiredAt: string;
|
|
14
|
+
agentTemplate?: string;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/types/lock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/types/lock.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message types.
|
|
3
|
+
* Spec: §4 — pi-orca-messages Extension
|
|
4
|
+
*/
|
|
5
|
+
import { Labels } from "./labels.js";
|
|
6
|
+
import { Archivable } from "./archivable.js";
|
|
7
|
+
/**
|
|
8
|
+
* Message file schema (YAML frontmatter).
|
|
9
|
+
* Spec: §4.4 — Message File Schema
|
|
10
|
+
*/
|
|
11
|
+
export interface Message extends Archivable {
|
|
12
|
+
id: string;
|
|
13
|
+
title: string;
|
|
14
|
+
from: string;
|
|
15
|
+
to: string;
|
|
16
|
+
sentAt: string;
|
|
17
|
+
labels: Labels;
|
|
18
|
+
archivable: boolean;
|
|
19
|
+
completedAt: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Inbox reference file schema.
|
|
23
|
+
* Spec: §4.5 — Inbox Reference File Schema
|
|
24
|
+
*/
|
|
25
|
+
export interface InboxRef {
|
|
26
|
+
source: string;
|
|
27
|
+
sentAt: string;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;GAGG;AACH,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task types and state machine.
|
|
3
|
+
* Spec: §3 — pi-orca-tasks Extension
|
|
4
|
+
*/
|
|
5
|
+
import { Labels } from "./labels.js";
|
|
6
|
+
import { Archivable } from "./archivable.js";
|
|
7
|
+
/**
|
|
8
|
+
* Task status values.
|
|
9
|
+
* Spec: §3.2 — Task State Machine
|
|
10
|
+
*/
|
|
11
|
+
export type TaskStatus = "pending" | "in_progress" | "completed" | "failed" | "abandoned" | "blocked";
|
|
12
|
+
/**
|
|
13
|
+
* Task file schema (YAML frontmatter).
|
|
14
|
+
* Spec: §3.3 — Task File Schema
|
|
15
|
+
*/
|
|
16
|
+
export interface Task extends Archivable {
|
|
17
|
+
id: string;
|
|
18
|
+
title: string;
|
|
19
|
+
status: TaskStatus;
|
|
20
|
+
createdAt: string;
|
|
21
|
+
updatedAt: string;
|
|
22
|
+
completedAt: string;
|
|
23
|
+
assignedTo: string;
|
|
24
|
+
assignedSessionPath: string;
|
|
25
|
+
dependencies: string[];
|
|
26
|
+
dependents: string[];
|
|
27
|
+
blockedReason: string;
|
|
28
|
+
retryCount: number;
|
|
29
|
+
labels: Labels;
|
|
30
|
+
archivable: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Valid state transitions for task state machine.
|
|
34
|
+
* Spec: §3.2
|
|
35
|
+
*/
|
|
36
|
+
export declare const TASK_TRANSITIONS: Record<TaskStatus, TaskStatus[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a state transition is valid.
|
|
39
|
+
*
|
|
40
|
+
* @param from - Current status
|
|
41
|
+
* @param to - Target status
|
|
42
|
+
* @returns true if transition is allowed
|
|
43
|
+
*/
|
|
44
|
+
export declare function isValidTransition(from: TaskStatus, to: TaskStatus): boolean;
|
|
45
|
+
//# sourceMappingURL=task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/types/task.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;GAGG;AACH,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,aAAa,GACb,WAAW,GACX,QAAQ,GACR,WAAW,GACX,SAAS,CAAC;AAEd;;;GAGG;AACH,MAAM,WAAW,IAAK,SAAQ,UAAU;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,CAO7D,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAE3E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task types and state machine.
|
|
3
|
+
* Spec: §3 — pi-orca-tasks Extension
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Valid state transitions for task state machine.
|
|
7
|
+
* Spec: §3.2
|
|
8
|
+
*/
|
|
9
|
+
export const TASK_TRANSITIONS = {
|
|
10
|
+
pending: ["in_progress", "blocked"],
|
|
11
|
+
in_progress: ["completed", "failed", "abandoned", "pending"],
|
|
12
|
+
completed: [],
|
|
13
|
+
failed: ["pending"],
|
|
14
|
+
abandoned: ["pending"],
|
|
15
|
+
blocked: ["pending"],
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Check if a state transition is valid.
|
|
19
|
+
*
|
|
20
|
+
* @param from - Current status
|
|
21
|
+
* @param to - Target status
|
|
22
|
+
* @returns true if transition is allowed
|
|
23
|
+
*/
|
|
24
|
+
export function isValidTransition(from, to) {
|
|
25
|
+
return TASK_TRANSITIONS[from].includes(to);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/types/task.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsCH;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAqC;IAChE,OAAO,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC;IACnC,WAAW,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC;IAC5D,SAAS,EAAE,EAAE;IACb,MAAM,EAAE,CAAC,SAAS,CAAC;IACnB,SAAS,EAAE,CAAC,SAAS,CAAC;IACtB,OAAO,EAAE,CAAC,SAAS,CAAC;CACrB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAgB,EAAE,EAAc;IAChE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team types and templates.
|
|
3
|
+
* Spec: §6 — pi-orca-teams Extension
|
|
4
|
+
*/
|
|
5
|
+
import { Labels } from "./labels.js";
|
|
6
|
+
/**
|
|
7
|
+
* Agent definition within a team template.
|
|
8
|
+
* Spec: §6.3 — Team Template Schema
|
|
9
|
+
*/
|
|
10
|
+
export interface TeamAgent {
|
|
11
|
+
template: string;
|
|
12
|
+
count: number;
|
|
13
|
+
labels: Labels;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Task definition within a team template.
|
|
17
|
+
* Spec: §6.3
|
|
18
|
+
*/
|
|
19
|
+
export interface TeamTask {
|
|
20
|
+
title: string;
|
|
21
|
+
labels: Labels;
|
|
22
|
+
dependencies?: string[];
|
|
23
|
+
assignTo?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Team template schema (YAML).
|
|
27
|
+
* Spec: §6.3 — Team Template Schema
|
|
28
|
+
*/
|
|
29
|
+
export interface TeamTemplate {
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
maxDepth: number;
|
|
33
|
+
maxReplicas: number;
|
|
34
|
+
agents: TeamAgent[];
|
|
35
|
+
tasks?: TeamTask[];
|
|
36
|
+
startupOrder?: ("agents" | "register" | "tasks")[];
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=team.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team.d.ts","sourceRoot":"","sources":["../../src/types/team.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC,EAAE,CAAC;CACpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team.js","sourceRoot":"","sources":["../../src/types/team.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-walking completion resolver for Pi extension commands.
|
|
3
|
+
*
|
|
4
|
+
* Pi's `getArgumentCompletions(prefix)` passes the full argument text as
|
|
5
|
+
* `prefix`, and the selected item's `value` replaces that entire prefix.
|
|
6
|
+
* This helper reconstructs full-prefix values so preceding tokens are
|
|
7
|
+
* preserved, and auto-appends trailing spaces when the completed token
|
|
8
|
+
* has completable children.
|
|
9
|
+
*
|
|
10
|
+
* Known Pi TUI limitation: after applying a completion, Pi does not
|
|
11
|
+
* re-trigger `getArgumentCompletions`. The user must press backspace+space
|
|
12
|
+
* to reset Pi's autocomplete state and trigger the next completion level.
|
|
13
|
+
* The trailing space saves one keystroke vs. omitting it (backspace+space
|
|
14
|
+
* instead of space+backspace+space).
|
|
15
|
+
*/
|
|
16
|
+
export interface CompletionItem {
|
|
17
|
+
value: string;
|
|
18
|
+
label: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CompletionNode {
|
|
22
|
+
/** Static items at this position. */
|
|
23
|
+
items?: CompletionItem[];
|
|
24
|
+
/** Dynamic items via closure (for cached data that changes). */
|
|
25
|
+
dynamicItems?: () => CompletionItem[];
|
|
26
|
+
/** If true, this position is free-text — return null (no completions). */
|
|
27
|
+
freeform?: boolean;
|
|
28
|
+
/** Child nodes keyed by token value. Use "*" for wildcard (any token). */
|
|
29
|
+
children?: Record<string, CompletionNode>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolve completions for a Pi command argument prefix.
|
|
33
|
+
*
|
|
34
|
+
* @param prefix - The full argument text after the command name
|
|
35
|
+
* (e.g. `"set fast c"` for `/models set fast c`)
|
|
36
|
+
* @param tree - The root CompletionNode describing the command's
|
|
37
|
+
* argument structure
|
|
38
|
+
* @returns Matching CompletionItem[] with fully-reconstructed values,
|
|
39
|
+
* or null when no completions are available
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveCompletions(prefix: string, tree: CompletionNode): CompletionItem[] | null;
|
|
42
|
+
//# sourceMappingURL=autocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../src/utils/autocomplete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,cAAc,EAAE,CAAC;IACtC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC3C;AA4BD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,GACnB,cAAc,EAAE,GAAG,IAAI,CAuEzB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-walking completion resolver for Pi extension commands.
|
|
3
|
+
*
|
|
4
|
+
* Pi's `getArgumentCompletions(prefix)` passes the full argument text as
|
|
5
|
+
* `prefix`, and the selected item's `value` replaces that entire prefix.
|
|
6
|
+
* This helper reconstructs full-prefix values so preceding tokens are
|
|
7
|
+
* preserved, and auto-appends trailing spaces when the completed token
|
|
8
|
+
* has completable children.
|
|
9
|
+
*
|
|
10
|
+
* Known Pi TUI limitation: after applying a completion, Pi does not
|
|
11
|
+
* re-trigger `getArgumentCompletions`. The user must press backspace+space
|
|
12
|
+
* to reset Pi's autocomplete state and trigger the next completion level.
|
|
13
|
+
* The trailing space saves one keystroke vs. omitting it (backspace+space
|
|
14
|
+
* instead of space+backspace+space).
|
|
15
|
+
*/
|
|
16
|
+
// ─── helpers ────────────────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Returns true when a node has completable content — items, dynamicItems,
|
|
19
|
+
* or non-freeform children.
|
|
20
|
+
*/
|
|
21
|
+
function isCompletable(node) {
|
|
22
|
+
if (node.freeform)
|
|
23
|
+
return false;
|
|
24
|
+
if (node.items && node.items.length > 0)
|
|
25
|
+
return true;
|
|
26
|
+
if (node.dynamicItems)
|
|
27
|
+
return true;
|
|
28
|
+
if (node.children)
|
|
29
|
+
return true;
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Look up a child node: exact match first, then wildcard "*".
|
|
34
|
+
*/
|
|
35
|
+
function findChild(node, token) {
|
|
36
|
+
return node.children?.[token] ?? node.children?.["*"];
|
|
37
|
+
}
|
|
38
|
+
// ─── core ───────────────────────────────────────────────────────────────────
|
|
39
|
+
/**
|
|
40
|
+
* Resolve completions for a Pi command argument prefix.
|
|
41
|
+
*
|
|
42
|
+
* @param prefix - The full argument text after the command name
|
|
43
|
+
* (e.g. `"set fast c"` for `/models set fast c`)
|
|
44
|
+
* @param tree - The root CompletionNode describing the command's
|
|
45
|
+
* argument structure
|
|
46
|
+
* @returns Matching CompletionItem[] with fully-reconstructed values,
|
|
47
|
+
* or null when no completions are available
|
|
48
|
+
*/
|
|
49
|
+
export function resolveCompletions(prefix, tree) {
|
|
50
|
+
const trimmed = prefix.trimStart();
|
|
51
|
+
const tokens = trimmed
|
|
52
|
+
? trimmed.split(/\s+/).filter((t) => t.length > 0)
|
|
53
|
+
: [];
|
|
54
|
+
// Trailing space means the last token is fully typed — all tokens are
|
|
55
|
+
// "completed" and we're starting a new (empty) position.
|
|
56
|
+
const hasTrailingSpace = trimmed.length > 0 && prefix.endsWith(" ");
|
|
57
|
+
// Split into completed tokens and the partial filter token
|
|
58
|
+
let completedTokens;
|
|
59
|
+
let filter;
|
|
60
|
+
if (hasTrailingSpace) {
|
|
61
|
+
completedTokens = tokens;
|
|
62
|
+
filter = "";
|
|
63
|
+
}
|
|
64
|
+
else if (tokens.length === 0) {
|
|
65
|
+
completedTokens = [];
|
|
66
|
+
filter = "";
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
completedTokens = tokens.slice(0, -1);
|
|
70
|
+
filter = tokens[tokens.length - 1];
|
|
71
|
+
}
|
|
72
|
+
// Walk completed tokens through the tree
|
|
73
|
+
let current = tree;
|
|
74
|
+
const resolvedTokens = [];
|
|
75
|
+
for (const token of completedTokens) {
|
|
76
|
+
const child = findChild(current, token);
|
|
77
|
+
if (!child)
|
|
78
|
+
return null; // unknown path
|
|
79
|
+
resolvedTokens.push(token);
|
|
80
|
+
current = child;
|
|
81
|
+
}
|
|
82
|
+
// At the current node, check for freeform
|
|
83
|
+
if (current.freeform)
|
|
84
|
+
return null;
|
|
85
|
+
// Gather items from dynamicItems or static items
|
|
86
|
+
const rawItems = current.dynamicItems?.() ?? current.items ?? [];
|
|
87
|
+
if (rawItems.length === 0)
|
|
88
|
+
return null;
|
|
89
|
+
// Substring filter across value, label, and description
|
|
90
|
+
const lowerFilter = filter.toLowerCase();
|
|
91
|
+
const filtered = lowerFilter
|
|
92
|
+
? rawItems.filter((item) => item.value.toLowerCase().includes(lowerFilter) ||
|
|
93
|
+
item.label.toLowerCase().includes(lowerFilter) ||
|
|
94
|
+
(item.description?.toLowerCase().includes(lowerFilter) ?? false))
|
|
95
|
+
: rawItems;
|
|
96
|
+
if (filtered.length === 0)
|
|
97
|
+
return null;
|
|
98
|
+
// Reconstruct values with full prefix and optional trailing space
|
|
99
|
+
const tokenPrefix = resolvedTokens.length > 0 ? resolvedTokens.join(" ") + " " : "";
|
|
100
|
+
return filtered.map((item) => {
|
|
101
|
+
// Append trailing space when the item has a completable child node
|
|
102
|
+
const childNode = findChild(current, item.value);
|
|
103
|
+
const trailingSpace = childNode && isCompletable(childNode) ? " " : "";
|
|
104
|
+
return {
|
|
105
|
+
value: tokenPrefix + item.value + trailingSpace,
|
|
106
|
+
label: item.label,
|
|
107
|
+
description: item.description,
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../src/utils/autocomplete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Orca configuration loader with bootstrap support.
|
|
3
|
+
* Spec: §2.2 — Shared Configuration
|
|
4
|
+
*/
|
|
5
|
+
import { OrcaConfig } from "../types/config.js";
|
|
6
|
+
/**
|
|
7
|
+
* Load and merge the Orca shared configuration.
|
|
8
|
+
* Reads user-level and project-level config.yaml, merges them (project overrides user).
|
|
9
|
+
* On first access, creates user-level config.yaml with defaults.
|
|
10
|
+
* Spec: §2.2
|
|
11
|
+
*
|
|
12
|
+
* @param projectRoot - Project root directory (defaults to cwd)
|
|
13
|
+
* @param notify - Whether to emit console notification on bootstrap
|
|
14
|
+
* @returns Merged OrcaConfig
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadOrcaConfig(projectRoot?: string, notify?: boolean): Promise<OrcaConfig>;
|
|
17
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,UAAU,EAA+B,MAAM,oBAAoB,CAAC;AAwC7E;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,UAAO,GACZ,OAAO,CAAC,UAAU,CAAC,CA6BrB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Orca configuration loader with bootstrap support.
|
|
3
|
+
* Spec: §2.2 — Shared Configuration
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, writeFile } from "fs/promises";
|
|
6
|
+
import { existsSync } from "fs";
|
|
7
|
+
import { join } from "path";
|
|
8
|
+
import YAML from "yaml";
|
|
9
|
+
import { DEFAULT_CONFIG, mergeConfig } from "../types/config.js";
|
|
10
|
+
import { ensureDir } from "./filesystem.js";
|
|
11
|
+
import { getUserOrcaDir, getProjectOrcaDir } from "./path.js";
|
|
12
|
+
/**
|
|
13
|
+
* Read a YAML config file, returning null if not found.
|
|
14
|
+
*/
|
|
15
|
+
async function readConfigFile(filePath) {
|
|
16
|
+
if (!existsSync(filePath)) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const content = await readFile(filePath, "utf-8");
|
|
21
|
+
return YAML.parse(content);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Append missing sections with defaults to a config file.
|
|
29
|
+
*/
|
|
30
|
+
async function appendMissingDefaults(filePath, existing) {
|
|
31
|
+
let changed = false;
|
|
32
|
+
const merged = { ...existing };
|
|
33
|
+
if (!merged.polling) {
|
|
34
|
+
merged.polling = { ...DEFAULT_CONFIG.polling };
|
|
35
|
+
changed = true;
|
|
36
|
+
}
|
|
37
|
+
if (!merged.parentLiveness) {
|
|
38
|
+
merged.parentLiveness = { ...DEFAULT_CONFIG.parentLiveness };
|
|
39
|
+
changed = true;
|
|
40
|
+
}
|
|
41
|
+
if (changed) {
|
|
42
|
+
await writeFile(filePath, YAML.stringify(merged), "utf-8");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Load and merge the Orca shared configuration.
|
|
47
|
+
* Reads user-level and project-level config.yaml, merges them (project overrides user).
|
|
48
|
+
* On first access, creates user-level config.yaml with defaults.
|
|
49
|
+
* Spec: §2.2
|
|
50
|
+
*
|
|
51
|
+
* @param projectRoot - Project root directory (defaults to cwd)
|
|
52
|
+
* @param notify - Whether to emit console notification on bootstrap
|
|
53
|
+
* @returns Merged OrcaConfig
|
|
54
|
+
*/
|
|
55
|
+
export async function loadOrcaConfig(projectRoot, notify = true) {
|
|
56
|
+
const userConfigPath = join(getUserOrcaDir(), "config.yaml");
|
|
57
|
+
const projectConfigPath = join(getProjectOrcaDir(projectRoot), "config.yaml");
|
|
58
|
+
// Bootstrap user config if missing
|
|
59
|
+
let userConfig = {};
|
|
60
|
+
if (!existsSync(userConfigPath)) {
|
|
61
|
+
await ensureDir(getUserOrcaDir());
|
|
62
|
+
const defaultContent = YAML.stringify(DEFAULT_CONFIG);
|
|
63
|
+
await writeFile(userConfigPath, defaultContent, "utf-8");
|
|
64
|
+
userConfig = { ...DEFAULT_CONFIG };
|
|
65
|
+
if (notify) {
|
|
66
|
+
console.log(`Created default config at ${userConfigPath} — edit to customize.`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const loaded = await readConfigFile(userConfigPath);
|
|
71
|
+
if (loaded) {
|
|
72
|
+
// Append missing sections
|
|
73
|
+
await appendMissingDefaults(userConfigPath, loaded);
|
|
74
|
+
userConfig = loaded;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Load project config if it exists (not bootstrapped)
|
|
78
|
+
const projectConfig = await readConfigFile(projectConfigPath);
|
|
79
|
+
return mergeConfig(userConfig, projectConfig ?? undefined);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAG and topological sort utilities.
|
|
3
|
+
* Spec: §3.5 — Dependency Validation
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Detect if adding a dependency would create a cycle.
|
|
7
|
+
* Uses DFS to detect cycles.
|
|
8
|
+
* Spec: §3.5 — Cycle Detection
|
|
9
|
+
*
|
|
10
|
+
* @param taskId - Task that would receive the new dependency
|
|
11
|
+
* @param newDependency - Task ID to add as dependency
|
|
12
|
+
* @param allDependencies - Current dependency graph (task -> dependencies)
|
|
13
|
+
* @returns Cycle path if cycle detected, null otherwise
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectCycle(taskId: string, newDependency: string, allDependencies: Map<string, string[]>): string[] | null;
|
|
16
|
+
/**
|
|
17
|
+
* Get all transitive dependents of a task (tasks that depend on it, directly or indirectly).
|
|
18
|
+
* Spec: §3.5 — Transitive Dependency Walking
|
|
19
|
+
*
|
|
20
|
+
* @param taskId - Task ID
|
|
21
|
+
* @param allDependents - Dependency graph (task -> dependents)
|
|
22
|
+
* @returns Set of transitive dependent task IDs
|
|
23
|
+
*/
|
|
24
|
+
export declare function getTransitiveDependents(taskId: string, allDependents: Map<string, string[]>): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Get all transitive dependencies of a task (tasks it depends on, directly or indirectly).
|
|
27
|
+
* Spec: §3.5 — Transitive Dependency Walking
|
|
28
|
+
*
|
|
29
|
+
* @param taskId - Task ID
|
|
30
|
+
* @param allDependencies - Dependency graph (task -> dependencies)
|
|
31
|
+
* @returns Set of transitive dependency task IDs
|
|
32
|
+
*/
|
|
33
|
+
export declare function getTransitiveDependencies(taskId: string, allDependencies: Map<string, string[]>): string[];
|
|
34
|
+
//# sourceMappingURL=dag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dag.d.ts","sourceRoot":"","sources":["../../src/utils/dag.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACrC,MAAM,EAAE,GAAG,IAAI,CAuCjB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACnC,MAAM,EAAE,CAiBV;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACrC,MAAM,EAAE,CAiBV"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DAG and topological sort utilities.
|
|
3
|
+
* Spec: §3.5 — Dependency Validation
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Detect if adding a dependency would create a cycle.
|
|
7
|
+
* Uses DFS to detect cycles.
|
|
8
|
+
* Spec: §3.5 — Cycle Detection
|
|
9
|
+
*
|
|
10
|
+
* @param taskId - Task that would receive the new dependency
|
|
11
|
+
* @param newDependency - Task ID to add as dependency
|
|
12
|
+
* @param allDependencies - Current dependency graph (task -> dependencies)
|
|
13
|
+
* @returns Cycle path if cycle detected, null otherwise
|
|
14
|
+
*/
|
|
15
|
+
export function detectCycle(taskId, newDependency, allDependencies) {
|
|
16
|
+
// Create a temporary graph with the new edge
|
|
17
|
+
const tempGraph = new Map(allDependencies);
|
|
18
|
+
const currentDeps = tempGraph.get(taskId) || [];
|
|
19
|
+
tempGraph.set(taskId, [...currentDeps, newDependency]);
|
|
20
|
+
// DFS to detect cycle starting from newDependency
|
|
21
|
+
const visited = new Set();
|
|
22
|
+
const recStack = new Set();
|
|
23
|
+
const path = [];
|
|
24
|
+
function dfs(node) {
|
|
25
|
+
visited.add(node);
|
|
26
|
+
recStack.add(node);
|
|
27
|
+
path.push(node);
|
|
28
|
+
const deps = tempGraph.get(node) || [];
|
|
29
|
+
for (const dep of deps) {
|
|
30
|
+
if (!visited.has(dep)) {
|
|
31
|
+
if (dfs(dep)) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (recStack.has(dep)) {
|
|
36
|
+
// Cycle detected
|
|
37
|
+
path.push(dep);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
recStack.delete(node);
|
|
42
|
+
path.pop();
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
if (dfs(taskId)) {
|
|
46
|
+
return path;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get all transitive dependents of a task (tasks that depend on it, directly or indirectly).
|
|
52
|
+
* Spec: §3.5 — Transitive Dependency Walking
|
|
53
|
+
*
|
|
54
|
+
* @param taskId - Task ID
|
|
55
|
+
* @param allDependents - Dependency graph (task -> dependents)
|
|
56
|
+
* @returns Set of transitive dependent task IDs
|
|
57
|
+
*/
|
|
58
|
+
export function getTransitiveDependents(taskId, allDependents) {
|
|
59
|
+
const result = new Set();
|
|
60
|
+
const queue = [taskId];
|
|
61
|
+
while (queue.length > 0) {
|
|
62
|
+
const current = queue.shift();
|
|
63
|
+
const dependents = allDependents.get(current) || [];
|
|
64
|
+
for (const dependent of dependents) {
|
|
65
|
+
if (!result.has(dependent)) {
|
|
66
|
+
result.add(dependent);
|
|
67
|
+
queue.push(dependent);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return Array.from(result);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get all transitive dependencies of a task (tasks it depends on, directly or indirectly).
|
|
75
|
+
* Spec: §3.5 — Transitive Dependency Walking
|
|
76
|
+
*
|
|
77
|
+
* @param taskId - Task ID
|
|
78
|
+
* @param allDependencies - Dependency graph (task -> dependencies)
|
|
79
|
+
* @returns Set of transitive dependency task IDs
|
|
80
|
+
*/
|
|
81
|
+
export function getTransitiveDependencies(taskId, allDependencies) {
|
|
82
|
+
const result = new Set();
|
|
83
|
+
const queue = [taskId];
|
|
84
|
+
while (queue.length > 0) {
|
|
85
|
+
const current = queue.shift();
|
|
86
|
+
const dependencies = allDependencies.get(current) || [];
|
|
87
|
+
for (const dependency of dependencies) {
|
|
88
|
+
if (!result.has(dependency)) {
|
|
89
|
+
result.add(dependency);
|
|
90
|
+
queue.push(dependency);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return Array.from(result);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=dag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dag.js","sourceRoot":"","sources":["../../src/utils/dag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Duration parsing utilities.
|
|
3
|
+
* Spec: §3.7 — Duration Parsing
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Parse a duration string to milliseconds.
|
|
7
|
+
* Supports: 30s, 5m, 2h, 7d, 14d
|
|
8
|
+
*
|
|
9
|
+
* @param input - Duration string
|
|
10
|
+
* @returns Milliseconds
|
|
11
|
+
* @throws Error if format is invalid
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseDuration(input: string): number;
|
|
14
|
+
/**
|
|
15
|
+
* Format milliseconds to a human-readable duration string.
|
|
16
|
+
*
|
|
17
|
+
* @param ms - Milliseconds
|
|
18
|
+
* @returns Human-readable duration (e.g., "5m", "2h", "7d")
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatDuration(ms: number): string;
|
|
21
|
+
//# sourceMappingURL=duration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../../src/utils/duration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBnD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAUjD"}
|