@pi-agents/orchid 0.1.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +246 -0
  4. package/agents/AGENTS-MANIFEST.md +42 -0
  5. package/agents/brain.md +42 -0
  6. package/agents/context-builder.md +46 -0
  7. package/agents/delegate.md +12 -0
  8. package/agents/dev-1.md +42 -0
  9. package/agents/oracle.md +73 -0
  10. package/agents/planner.md +55 -0
  11. package/agents/researcher.md +52 -0
  12. package/agents/reviewer.md +79 -0
  13. package/agents/scout.md +50 -0
  14. package/agents/tester.md +45 -0
  15. package/agents/worker.md +55 -0
  16. package/extensions/ralph.ts +1 -0
  17. package/extensions/reviewer-extension.ts +125 -0
  18. package/extensions/task-orchestrator.ts +28 -0
  19. package/package.json +63 -0
  20. package/prompts/gather-context-and-clarify.md +13 -0
  21. package/prompts/parallel-cleanup.md +59 -0
  22. package/prompts/parallel-context-build.md +53 -0
  23. package/prompts/parallel-handoff-plan.md +59 -0
  24. package/prompts/parallel-research.md +50 -0
  25. package/prompts/parallel-review.md +54 -0
  26. package/prompts/review-loop.md +41 -0
  27. package/skills/orchid/SKILL.md +214 -0
  28. package/skills/orchid/orchid-cleanup/SKILL.md +122 -0
  29. package/skills/orchid/orchid-converge/SKILL.md +124 -0
  30. package/skills/orchid/orchid-decompose/SKILL.md +201 -0
  31. package/skills/orchid/orchid-doctor/SKILL.md +162 -0
  32. package/skills/orchid/orchid-investigate/SKILL.md +102 -0
  33. package/skills/orchid/orchid-launch/SKILL.md +147 -0
  34. package/skills/ralph/SKILL.md +73 -0
  35. package/skills/subagents/pi-subagents/SKILL.md +813 -0
  36. package/src/index.ts +7 -0
  37. package/src/orchestrator/abort.ts +534 -0
  38. package/src/orchestrator/agent-bridge-extension.ts +1020 -0
  39. package/src/orchestrator/agent-host.ts +954 -0
  40. package/src/orchestrator/cleanup.ts +776 -0
  41. package/src/orchestrator/config-loader.ts +1412 -0
  42. package/src/orchestrator/config-schema.ts +690 -0
  43. package/src/orchestrator/config.ts +81 -0
  44. package/src/orchestrator/context-window.ts +66 -0
  45. package/src/orchestrator/diagnostic-reports.ts +475 -0
  46. package/src/orchestrator/diagnostics.ts +394 -0
  47. package/src/orchestrator/discovery.ts +1833 -0
  48. package/src/orchestrator/engine-worker.ts +415 -0
  49. package/src/orchestrator/engine.ts +5940 -0
  50. package/src/orchestrator/execution.ts +3104 -0
  51. package/src/orchestrator/extension.ts +5934 -0
  52. package/src/orchestrator/formatting.ts +785 -0
  53. package/src/orchestrator/git.ts +88 -0
  54. package/src/orchestrator/index.ts +28 -0
  55. package/src/orchestrator/lane-runner.ts +1787 -0
  56. package/src/orchestrator/mailbox.ts +780 -0
  57. package/src/orchestrator/merge.ts +3414 -0
  58. package/src/orchestrator/messages.ts +1062 -0
  59. package/src/orchestrator/migrations.ts +278 -0
  60. package/src/orchestrator/naming.ts +117 -0
  61. package/src/orchestrator/path-resolver.ts +275 -0
  62. package/src/orchestrator/persistence.ts +2625 -0
  63. package/src/orchestrator/process-registry.ts +452 -0
  64. package/src/orchestrator/quality-gate.ts +1085 -0
  65. package/src/orchestrator/resume.ts +3488 -0
  66. package/src/orchestrator/sessions.ts +57 -0
  67. package/src/orchestrator/settings-loader.ts +136 -0
  68. package/src/orchestrator/settings-tui.ts +2208 -0
  69. package/src/orchestrator/sidecar-telemetry.ts +267 -0
  70. package/src/orchestrator/supervisor.ts +4548 -0
  71. package/src/orchestrator/task-executor-core.ts +675 -0
  72. package/src/orchestrator/tmux-compat.ts +37 -0
  73. package/src/orchestrator/tool-allowlist-constants.ts +37 -0
  74. package/src/orchestrator/types.ts +4465 -0
  75. package/src/orchestrator/verification.ts +547 -0
  76. package/src/orchestrator/waves.ts +1564 -0
  77. package/src/orchestrator/workspace.ts +707 -0
  78. package/src/orchestrator/worktree.ts +2725 -0
  79. package/src/ralph/index.ts +825 -0
  80. package/src/subagents/agents/agent-management.ts +648 -0
  81. package/src/subagents/agents/agent-scope.ts +6 -0
  82. package/src/subagents/agents/agent-selection.ts +23 -0
  83. package/src/subagents/agents/agent-serializer.ts +86 -0
  84. package/src/subagents/agents/agents.ts +832 -0
  85. package/src/subagents/agents/chain-serializer.ts +137 -0
  86. package/src/subagents/agents/frontmatter.ts +29 -0
  87. package/src/subagents/agents/identity.ts +30 -0
  88. package/src/subagents/agents/skills.ts +632 -0
  89. package/src/subagents/extension/config.ts +16 -0
  90. package/src/subagents/extension/control-notices.ts +92 -0
  91. package/src/subagents/extension/doctor.ts +199 -0
  92. package/src/subagents/extension/fanout-child.ts +170 -0
  93. package/src/subagents/extension/index.ts +573 -0
  94. package/src/subagents/extension/schemas.ts +168 -0
  95. package/src/subagents/intercom/intercom-bridge.ts +379 -0
  96. package/src/subagents/intercom/result-intercom.ts +377 -0
  97. package/src/subagents/runs/background/async-execution.ts +712 -0
  98. package/src/subagents/runs/background/async-job-tracker.ts +310 -0
  99. package/src/subagents/runs/background/async-resume.ts +345 -0
  100. package/src/subagents/runs/background/async-status.ts +325 -0
  101. package/src/subagents/runs/background/completion-dedupe.ts +63 -0
  102. package/src/subagents/runs/background/notify.ts +108 -0
  103. package/src/subagents/runs/background/parallel-groups.ts +45 -0
  104. package/src/subagents/runs/background/result-watcher.ts +307 -0
  105. package/src/subagents/runs/background/run-id-resolver.ts +83 -0
  106. package/src/subagents/runs/background/run-status.ts +269 -0
  107. package/src/subagents/runs/background/stale-run-reconciler.ts +336 -0
  108. package/src/subagents/runs/background/subagent-runner.ts +1808 -0
  109. package/src/subagents/runs/background/top-level-async.ts +13 -0
  110. package/src/subagents/runs/foreground/chain-clarify.ts +1333 -0
  111. package/src/subagents/runs/foreground/chain-execution.ts +938 -0
  112. package/src/subagents/runs/foreground/execution.ts +918 -0
  113. package/src/subagents/runs/foreground/subagent-executor.ts +2527 -0
  114. package/src/subagents/runs/shared/completion-guard.ts +147 -0
  115. package/src/subagents/runs/shared/long-running-guard.ts +175 -0
  116. package/src/subagents/runs/shared/mcp-direct-tool-allowlist.ts +365 -0
  117. package/src/subagents/runs/shared/model-fallback.ts +103 -0
  118. package/src/subagents/runs/shared/nested-events.ts +819 -0
  119. package/src/subagents/runs/shared/nested-path.ts +52 -0
  120. package/src/subagents/runs/shared/nested-render.ts +115 -0
  121. package/src/subagents/runs/shared/parallel-utils.ts +109 -0
  122. package/src/subagents/runs/shared/pi-args.ts +220 -0
  123. package/src/subagents/runs/shared/pi-spawn.ts +115 -0
  124. package/src/subagents/runs/shared/run-history.ts +60 -0
  125. package/src/subagents/runs/shared/single-output.ts +164 -0
  126. package/src/subagents/runs/shared/subagent-control.ts +226 -0
  127. package/src/subagents/runs/shared/subagent-prompt-runtime.ts +170 -0
  128. package/src/subagents/runs/shared/worktree.ts +577 -0
  129. package/src/subagents/shared/artifacts.ts +98 -0
  130. package/src/subagents/shared/atomic-json.ts +16 -0
  131. package/src/subagents/shared/file-coalescer.ts +40 -0
  132. package/src/subagents/shared/fork-context.ts +76 -0
  133. package/src/subagents/shared/formatters.ts +133 -0
  134. package/src/subagents/shared/jsonl-writer.ts +81 -0
  135. package/src/subagents/shared/model-info.ts +78 -0
  136. package/src/subagents/shared/post-exit-stdio-guard.ts +85 -0
  137. package/src/subagents/shared/session-identity.ts +10 -0
  138. package/src/subagents/shared/session-tokens.ts +44 -0
  139. package/src/subagents/shared/settings.ts +397 -0
  140. package/src/subagents/shared/status-format.ts +49 -0
  141. package/src/subagents/shared/types.ts +822 -0
  142. package/src/subagents/shared/utils.ts +450 -0
  143. package/src/subagents/slash/prompt-template-bridge.ts +397 -0
  144. package/src/subagents/slash/slash-bridge.ts +174 -0
  145. package/src/subagents/slash/slash-commands.ts +528 -0
  146. package/src/subagents/slash/slash-live-state.ts +292 -0
  147. package/src/subagents/tui/render-helpers.ts +80 -0
  148. package/src/subagents/tui/render.ts +1358 -0
  149. package/templates/agents/local/supervisor.md +33 -0
  150. package/templates/agents/local/task-merger.md +27 -0
  151. package/templates/agents/local/task-reviewer.md +30 -0
  152. package/templates/agents/local/task-worker.md +34 -0
  153. package/templates/agents/supervisor-routing.md +92 -0
  154. package/templates/agents/supervisor.md +229 -0
  155. package/templates/agents/task-merger.md +214 -0
  156. package/templates/agents/task-reviewer.md +260 -0
  157. package/templates/agents/task-worker-segment.md +44 -0
  158. package/templates/agents/task-worker.md +557 -0
  159. package/templates/tasks/CONTEXT.md +30 -0
  160. package/templates/tasks/EXAMPLE-001-hello-world/PROMPT.md +98 -0
  161. package/templates/tasks/EXAMPLE-001-hello-world/STATUS.md +73 -0
  162. package/templates/tasks/EXAMPLE-002-parallel-smoke/PROMPT.md +97 -0
  163. package/templates/tasks/EXAMPLE-002-parallel-smoke/STATUS.md +73 -0
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Runtime V2 session discovery and formatting
3
+ * @module orch/sessions
4
+ */
5
+
6
+ import { ORCH_MESSAGES } from "./messages.ts";
7
+ import type { OrchBatchRuntimeState, OrchestratorSessionEntry } from "./types.ts";
8
+
9
+ // ── Session Discovery ────────────────────────────────────────────────
10
+
11
+ /**
12
+ * List active orchestrator sessions from in-memory batch state.
13
+ *
14
+ * Runtime V2 no longer uses TMUX as the execution owner. Session rows are
15
+ * derived from canonical lane session IDs in runtime state.
16
+ *
17
+ * @param _tmuxPrefix - Legacy parameter kept for API compatibility
18
+ * @param batchState - Current batch state for lane/task enrichment
19
+ * @returns Array of session entries
20
+ */
21
+ export function listOrchSessions(
22
+ _tmuxPrefix: string,
23
+ batchState?: OrchBatchRuntimeState,
24
+ ): OrchestratorSessionEntry[] {
25
+ if (!batchState || batchState.currentLanes.length === 0) return [];
26
+
27
+ return batchState.currentLanes
28
+ .map((lane) => ({
29
+ sessionName: lane.laneSessionId,
30
+ laneId: lane.laneId,
31
+ taskId: lane.tasks.length > 0 ? lane.tasks[0].taskId : null,
32
+ status: "alive" as const,
33
+ worktreePath: lane.worktreePath,
34
+ attachCmd: "Runtime V2 (no tmux attach)",
35
+ }))
36
+ .sort((a, b) => a.sessionName.localeCompare(b.sessionName));
37
+ }
38
+
39
+ /**
40
+ * Format session listing for display.
41
+ */
42
+ export function formatOrchSessions(sessions: OrchestratorSessionEntry[]): string {
43
+ if (sessions.length === 0) {
44
+ return ORCH_MESSAGES.sessionsNone();
45
+ }
46
+
47
+ const lines: string[] = [ORCH_MESSAGES.sessionsHeader(sessions.length), ""];
48
+
49
+ for (const s of sessions) {
50
+ const statusIcon = s.status === "alive" ? "🟢" : "🔴";
51
+ const taskInfo = s.taskId ? ` (${s.taskId})` : "";
52
+ lines.push(` ${statusIcon} ${s.sessionName} [${s.laneId}]${taskInfo}`);
53
+ lines.push(` ${s.attachCmd}`);
54
+ }
55
+
56
+ return lines.join("\n");
57
+ }
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Settings Loader — Read and merge Pi extension packages from settings files
3
+ *
4
+ * Reads `.pi/settings.json` from both project-level and global locations,
5
+ * extracts the `packages` arrays, merges them (project entries first,
6
+ * deduplicated), and filters out orchid itself.
7
+ *
8
+ * Used by spawn points (worker, reviewer, merge agent) to forward
9
+ * user-installed extensions as explicit `-e` flags alongside `--no-extensions`.
10
+ *
11
+ * @module orchid/settings-loader
12
+ * @since TP-180
13
+ */
14
+
15
+ import { readFileSync } from "fs";
16
+ import { join } from "path";
17
+ import { homedir } from "os";
18
+
19
+ // ── Constants ────────────────────────────────────────────────────────
20
+
21
+ /** Subpath under a project root for the project-level Pi settings file. */
22
+ const PROJECT_SETTINGS_SUBPATH = join(".pi", "settings.json");
23
+
24
+ /** Subpath under the global agent dir for the global Pi settings file. */
25
+ const GLOBAL_SETTINGS_SUBPATH = join(".pi", "agent", "settings.json");
26
+
27
+ // ── Internal Helpers ─────────────────────────────────────────────────
28
+
29
+ /**
30
+ * Safely read and parse a JSON file, returning null on any failure.
31
+ */
32
+ function readJsonSafe(filePath: string): Record<string, unknown> | null {
33
+ try {
34
+ const raw = readFileSync(filePath, "utf-8");
35
+ const parsed = JSON.parse(raw);
36
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
37
+ return parsed as Record<string, unknown>;
38
+ }
39
+ return null;
40
+ } catch {
41
+ return null;
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Extract the `packages` array from a parsed settings object.
47
+ * Returns an empty array if the key is missing or not an array of strings.
48
+ */
49
+ function extractPackages(settings: Record<string, unknown> | null): string[] {
50
+ if (!settings) return [];
51
+ const packages = settings.packages;
52
+ if (!Array.isArray(packages)) return [];
53
+ // Filter to strings only, skip non-string entries gracefully
54
+ return packages.filter((p): p is string => typeof p === "string" && p.length > 0);
55
+ }
56
+
57
+ /**
58
+ * Resolve the global Pi agent settings path.
59
+ *
60
+ * Resolution order:
61
+ * 1. `PI_CODING_AGENT_DIR` env → `<value>/settings.json`
62
+ * 2. `os.homedir()/.pi/agent/settings.json`
63
+ */
64
+ function resolveGlobalSettingsPath(): string {
65
+ const agentDir = process.env.PI_CODING_AGENT_DIR;
66
+ if (agentDir) {
67
+ return join(agentDir, "settings.json");
68
+ }
69
+ return join(homedir(), GLOBAL_SETTINGS_SUBPATH);
70
+ }
71
+
72
+ // ── Public API ───────────────────────────────────────────────────────
73
+
74
+ /**
75
+ * Load Pi extension packages from project and global settings files.
76
+ *
77
+ * Reads `.pi/settings.json` from the project root (stateRoot) and from
78
+ * the global agent directory, merges the package lists (project first,
79
+ * deduplicated), and filters out any package containing "orchid"
80
+ * (which is already loaded as the bridge extension).
81
+ *
82
+ * @param stateRoot - Project root directory (used to locate `.pi/settings.json`)
83
+ * @returns Array of package specifiers (e.g., `["npm:pi-sage"]`) or empty array
84
+ */
85
+ export function loadPiSettingsPackages(stateRoot: string): string[] {
86
+ // Read project-level packages
87
+ const projectSettingsPath = join(stateRoot, PROJECT_SETTINGS_SUBPATH);
88
+ const projectSettings = readJsonSafe(projectSettingsPath);
89
+ const projectPackages = extractPackages(projectSettings);
90
+
91
+ // Read global packages
92
+ const globalSettingsPath = resolveGlobalSettingsPath();
93
+ const globalSettings = readJsonSafe(globalSettingsPath);
94
+ const globalPackages = extractPackages(globalSettings);
95
+
96
+ // Merge: project entries first, then global, deduplicated
97
+ const seen = new Set<string>();
98
+ const merged: string[] = [];
99
+
100
+ for (const pkg of projectPackages) {
101
+ if (!seen.has(pkg)) {
102
+ seen.add(pkg);
103
+ merged.push(pkg);
104
+ }
105
+ }
106
+ for (const pkg of globalPackages) {
107
+ if (!seen.has(pkg)) {
108
+ seen.add(pkg);
109
+ merged.push(pkg);
110
+ }
111
+ }
112
+
113
+ // Filter out orchid itself (already loaded as bridge extension).
114
+ // Match known specifier patterns: "npm:@pi-agents/orchid", "@pi-agents/orchid", or scoped
115
+ // variants like "npm:@scope/orchid". Avoid substring matching to prevent
116
+ // false positives on unrelated packages containing "orchid" in their name.
117
+ return merged.filter((pkg) => {
118
+ // Strip npm:/git: prefix to get the bare package name
119
+ const bare = pkg.replace(/^(?:npm:|git:(?:github\.com\/[^/]+\/)?)/, "").toLowerCase();
120
+ // Exact match on bare name, or scoped exact match (@scope/orchid)
121
+ return bare !== "@pi-agents/orchid" && !bare.endsWith("/orchid");
122
+ });
123
+ }
124
+
125
+ /**
126
+ * Filter out excluded extensions from a package list.
127
+ *
128
+ * @param packages - Full list of package specifiers
129
+ * @param exclusions - Package specifiers to exclude (exact match)
130
+ * @returns Filtered list with excluded packages removed
131
+ */
132
+ export function filterExcludedExtensions(packages: string[], exclusions: string[]): string[] {
133
+ if (!exclusions || exclusions.length === 0) return packages;
134
+ const excludeSet = new Set(exclusions);
135
+ return packages.filter((pkg) => !excludeSet.has(pkg));
136
+ }