@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.
Files changed (87) hide show
  1. package/README.md +228 -0
  2. package/defaults/config.yaml +28 -0
  3. package/dist/index.d.ts +8 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +8 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/types/agent.d.ts +72 -0
  8. package/dist/types/agent.d.ts.map +1 -0
  9. package/dist/types/agent.js +6 -0
  10. package/dist/types/agent.js.map +1 -0
  11. package/dist/types/archivable.d.ts +23 -0
  12. package/dist/types/archivable.d.ts.map +1 -0
  13. package/dist/types/archivable.js +47 -0
  14. package/dist/types/archivable.js.map +1 -0
  15. package/dist/types/config.d.ts +42 -0
  16. package/dist/types/config.d.ts.map +1 -0
  17. package/dist/types/config.js +42 -0
  18. package/dist/types/config.js.map +1 -0
  19. package/dist/types/index.d.ts +12 -0
  20. package/dist/types/index.d.ts.map +1 -0
  21. package/dist/types/index.js +12 -0
  22. package/dist/types/index.js.map +1 -0
  23. package/dist/types/labels.d.ts +28 -0
  24. package/dist/types/labels.d.ts.map +1 -0
  25. package/dist/types/labels.js +45 -0
  26. package/dist/types/labels.js.map +1 -0
  27. package/dist/types/lock.d.ts +16 -0
  28. package/dist/types/lock.d.ts.map +1 -0
  29. package/dist/types/lock.js +6 -0
  30. package/dist/types/lock.js.map +1 -0
  31. package/dist/types/message.d.ts +29 -0
  32. package/dist/types/message.d.ts.map +1 -0
  33. package/dist/types/message.js +6 -0
  34. package/dist/types/message.js.map +1 -0
  35. package/dist/types/task.d.ts +45 -0
  36. package/dist/types/task.d.ts.map +1 -0
  37. package/dist/types/task.js +27 -0
  38. package/dist/types/task.js.map +1 -0
  39. package/dist/types/team.d.ts +38 -0
  40. package/dist/types/team.d.ts.map +1 -0
  41. package/dist/types/team.js +6 -0
  42. package/dist/types/team.js.map +1 -0
  43. package/dist/utils/autocomplete.d.ts +42 -0
  44. package/dist/utils/autocomplete.d.ts.map +1 -0
  45. package/dist/utils/autocomplete.js +111 -0
  46. package/dist/utils/autocomplete.js.map +1 -0
  47. package/dist/utils/config-loader.d.ts +17 -0
  48. package/dist/utils/config-loader.d.ts.map +1 -0
  49. package/dist/utils/config-loader.js +81 -0
  50. package/dist/utils/config-loader.js.map +1 -0
  51. package/dist/utils/dag.d.ts +34 -0
  52. package/dist/utils/dag.d.ts.map +1 -0
  53. package/dist/utils/dag.js +96 -0
  54. package/dist/utils/dag.js.map +1 -0
  55. package/dist/utils/duration.d.ts +21 -0
  56. package/dist/utils/duration.d.ts.map +1 -0
  57. package/dist/utils/duration.js +47 -0
  58. package/dist/utils/duration.js.map +1 -0
  59. package/dist/utils/filesystem.d.ts +53 -0
  60. package/dist/utils/filesystem.d.ts.map +1 -0
  61. package/dist/utils/filesystem.js +99 -0
  62. package/dist/utils/filesystem.js.map +1 -0
  63. package/dist/utils/heartbeat.d.ts +23 -0
  64. package/dist/utils/heartbeat.d.ts.map +1 -0
  65. package/dist/utils/heartbeat.js +53 -0
  66. package/dist/utils/heartbeat.js.map +1 -0
  67. package/dist/utils/index.d.ts +14 -0
  68. package/dist/utils/index.d.ts.map +1 -0
  69. package/dist/utils/index.js +14 -0
  70. package/dist/utils/index.js.map +1 -0
  71. package/dist/utils/lock.d.ts +43 -0
  72. package/dist/utils/lock.d.ts.map +1 -0
  73. package/dist/utils/lock.js +89 -0
  74. package/dist/utils/lock.js.map +1 -0
  75. package/dist/utils/path.d.ts +88 -0
  76. package/dist/utils/path.d.ts.map +1 -0
  77. package/dist/utils/path.js +128 -0
  78. package/dist/utils/path.js.map +1 -0
  79. package/dist/utils/process.d.ts +20 -0
  80. package/dist/utils/process.d.ts.map +1 -0
  81. package/dist/utils/process.js +40 -0
  82. package/dist/utils/process.js.map +1 -0
  83. package/dist/utils/yaml.d.ts +30 -0
  84. package/dist/utils/yaml.d.ts.map +1 -0
  85. package/dist/utils/yaml.js +58 -0
  86. package/dist/utils/yaml.js.map +1 -0
  87. 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,6 @@
1
+ /**
2
+ * Lock file types.
3
+ * Spec: §3.4 — Lock File Schema
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=lock.js.map
@@ -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,6 @@
1
+ /**
2
+ * Message types.
3
+ * Spec: §4 — pi-orca-messages Extension
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=message.js.map
@@ -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,6 @@
1
+ /**
2
+ * Team types and templates.
3
+ * Spec: §6 — pi-orca-teams Extension
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=team.js.map
@@ -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"}