@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.
- package/CHANGELOG.md +41 -0
- package/LICENSE +21 -0
- package/README.md +246 -0
- package/agents/AGENTS-MANIFEST.md +42 -0
- package/agents/brain.md +42 -0
- package/agents/context-builder.md +46 -0
- package/agents/delegate.md +12 -0
- package/agents/dev-1.md +42 -0
- package/agents/oracle.md +73 -0
- package/agents/planner.md +55 -0
- package/agents/researcher.md +52 -0
- package/agents/reviewer.md +79 -0
- package/agents/scout.md +50 -0
- package/agents/tester.md +45 -0
- package/agents/worker.md +55 -0
- package/extensions/ralph.ts +1 -0
- package/extensions/reviewer-extension.ts +125 -0
- package/extensions/task-orchestrator.ts +28 -0
- package/package.json +63 -0
- package/prompts/gather-context-and-clarify.md +13 -0
- package/prompts/parallel-cleanup.md +59 -0
- package/prompts/parallel-context-build.md +53 -0
- package/prompts/parallel-handoff-plan.md +59 -0
- package/prompts/parallel-research.md +50 -0
- package/prompts/parallel-review.md +54 -0
- package/prompts/review-loop.md +41 -0
- package/skills/orchid/SKILL.md +214 -0
- package/skills/orchid/orchid-cleanup/SKILL.md +122 -0
- package/skills/orchid/orchid-converge/SKILL.md +124 -0
- package/skills/orchid/orchid-decompose/SKILL.md +201 -0
- package/skills/orchid/orchid-doctor/SKILL.md +162 -0
- package/skills/orchid/orchid-investigate/SKILL.md +102 -0
- package/skills/orchid/orchid-launch/SKILL.md +147 -0
- package/skills/ralph/SKILL.md +73 -0
- package/skills/subagents/pi-subagents/SKILL.md +813 -0
- package/src/index.ts +7 -0
- package/src/orchestrator/abort.ts +534 -0
- package/src/orchestrator/agent-bridge-extension.ts +1020 -0
- package/src/orchestrator/agent-host.ts +954 -0
- package/src/orchestrator/cleanup.ts +776 -0
- package/src/orchestrator/config-loader.ts +1412 -0
- package/src/orchestrator/config-schema.ts +690 -0
- package/src/orchestrator/config.ts +81 -0
- package/src/orchestrator/context-window.ts +66 -0
- package/src/orchestrator/diagnostic-reports.ts +475 -0
- package/src/orchestrator/diagnostics.ts +394 -0
- package/src/orchestrator/discovery.ts +1833 -0
- package/src/orchestrator/engine-worker.ts +415 -0
- package/src/orchestrator/engine.ts +5940 -0
- package/src/orchestrator/execution.ts +3104 -0
- package/src/orchestrator/extension.ts +5934 -0
- package/src/orchestrator/formatting.ts +785 -0
- package/src/orchestrator/git.ts +88 -0
- package/src/orchestrator/index.ts +28 -0
- package/src/orchestrator/lane-runner.ts +1787 -0
- package/src/orchestrator/mailbox.ts +780 -0
- package/src/orchestrator/merge.ts +3414 -0
- package/src/orchestrator/messages.ts +1062 -0
- package/src/orchestrator/migrations.ts +278 -0
- package/src/orchestrator/naming.ts +117 -0
- package/src/orchestrator/path-resolver.ts +275 -0
- package/src/orchestrator/persistence.ts +2625 -0
- package/src/orchestrator/process-registry.ts +452 -0
- package/src/orchestrator/quality-gate.ts +1085 -0
- package/src/orchestrator/resume.ts +3488 -0
- package/src/orchestrator/sessions.ts +57 -0
- package/src/orchestrator/settings-loader.ts +136 -0
- package/src/orchestrator/settings-tui.ts +2208 -0
- package/src/orchestrator/sidecar-telemetry.ts +267 -0
- package/src/orchestrator/supervisor.ts +4548 -0
- package/src/orchestrator/task-executor-core.ts +675 -0
- package/src/orchestrator/tmux-compat.ts +37 -0
- package/src/orchestrator/tool-allowlist-constants.ts +37 -0
- package/src/orchestrator/types.ts +4465 -0
- package/src/orchestrator/verification.ts +547 -0
- package/src/orchestrator/waves.ts +1564 -0
- package/src/orchestrator/workspace.ts +707 -0
- package/src/orchestrator/worktree.ts +2725 -0
- package/src/ralph/index.ts +825 -0
- package/src/subagents/agents/agent-management.ts +648 -0
- package/src/subagents/agents/agent-scope.ts +6 -0
- package/src/subagents/agents/agent-selection.ts +23 -0
- package/src/subagents/agents/agent-serializer.ts +86 -0
- package/src/subagents/agents/agents.ts +832 -0
- package/src/subagents/agents/chain-serializer.ts +137 -0
- package/src/subagents/agents/frontmatter.ts +29 -0
- package/src/subagents/agents/identity.ts +30 -0
- package/src/subagents/agents/skills.ts +632 -0
- package/src/subagents/extension/config.ts +16 -0
- package/src/subagents/extension/control-notices.ts +92 -0
- package/src/subagents/extension/doctor.ts +199 -0
- package/src/subagents/extension/fanout-child.ts +170 -0
- package/src/subagents/extension/index.ts +573 -0
- package/src/subagents/extension/schemas.ts +168 -0
- package/src/subagents/intercom/intercom-bridge.ts +379 -0
- package/src/subagents/intercom/result-intercom.ts +377 -0
- package/src/subagents/runs/background/async-execution.ts +712 -0
- package/src/subagents/runs/background/async-job-tracker.ts +310 -0
- package/src/subagents/runs/background/async-resume.ts +345 -0
- package/src/subagents/runs/background/async-status.ts +325 -0
- package/src/subagents/runs/background/completion-dedupe.ts +63 -0
- package/src/subagents/runs/background/notify.ts +108 -0
- package/src/subagents/runs/background/parallel-groups.ts +45 -0
- package/src/subagents/runs/background/result-watcher.ts +307 -0
- package/src/subagents/runs/background/run-id-resolver.ts +83 -0
- package/src/subagents/runs/background/run-status.ts +269 -0
- package/src/subagents/runs/background/stale-run-reconciler.ts +336 -0
- package/src/subagents/runs/background/subagent-runner.ts +1808 -0
- package/src/subagents/runs/background/top-level-async.ts +13 -0
- package/src/subagents/runs/foreground/chain-clarify.ts +1333 -0
- package/src/subagents/runs/foreground/chain-execution.ts +938 -0
- package/src/subagents/runs/foreground/execution.ts +918 -0
- package/src/subagents/runs/foreground/subagent-executor.ts +2527 -0
- package/src/subagents/runs/shared/completion-guard.ts +147 -0
- package/src/subagents/runs/shared/long-running-guard.ts +175 -0
- package/src/subagents/runs/shared/mcp-direct-tool-allowlist.ts +365 -0
- package/src/subagents/runs/shared/model-fallback.ts +103 -0
- package/src/subagents/runs/shared/nested-events.ts +819 -0
- package/src/subagents/runs/shared/nested-path.ts +52 -0
- package/src/subagents/runs/shared/nested-render.ts +115 -0
- package/src/subagents/runs/shared/parallel-utils.ts +109 -0
- package/src/subagents/runs/shared/pi-args.ts +220 -0
- package/src/subagents/runs/shared/pi-spawn.ts +115 -0
- package/src/subagents/runs/shared/run-history.ts +60 -0
- package/src/subagents/runs/shared/single-output.ts +164 -0
- package/src/subagents/runs/shared/subagent-control.ts +226 -0
- package/src/subagents/runs/shared/subagent-prompt-runtime.ts +170 -0
- package/src/subagents/runs/shared/worktree.ts +577 -0
- package/src/subagents/shared/artifacts.ts +98 -0
- package/src/subagents/shared/atomic-json.ts +16 -0
- package/src/subagents/shared/file-coalescer.ts +40 -0
- package/src/subagents/shared/fork-context.ts +76 -0
- package/src/subagents/shared/formatters.ts +133 -0
- package/src/subagents/shared/jsonl-writer.ts +81 -0
- package/src/subagents/shared/model-info.ts +78 -0
- package/src/subagents/shared/post-exit-stdio-guard.ts +85 -0
- package/src/subagents/shared/session-identity.ts +10 -0
- package/src/subagents/shared/session-tokens.ts +44 -0
- package/src/subagents/shared/settings.ts +397 -0
- package/src/subagents/shared/status-format.ts +49 -0
- package/src/subagents/shared/types.ts +822 -0
- package/src/subagents/shared/utils.ts +450 -0
- package/src/subagents/slash/prompt-template-bridge.ts +397 -0
- package/src/subagents/slash/slash-bridge.ts +174 -0
- package/src/subagents/slash/slash-commands.ts +528 -0
- package/src/subagents/slash/slash-live-state.ts +292 -0
- package/src/subagents/tui/render-helpers.ts +80 -0
- package/src/subagents/tui/render.ts +1358 -0
- package/templates/agents/local/supervisor.md +33 -0
- package/templates/agents/local/task-merger.md +27 -0
- package/templates/agents/local/task-reviewer.md +30 -0
- package/templates/agents/local/task-worker.md +34 -0
- package/templates/agents/supervisor-routing.md +92 -0
- package/templates/agents/supervisor.md +229 -0
- package/templates/agents/task-merger.md +214 -0
- package/templates/agents/task-reviewer.md +260 -0
- package/templates/agents/task-worker-segment.md +44 -0
- package/templates/agents/task-worker.md +557 -0
- package/templates/tasks/CONTEXT.md +30 -0
- package/templates/tasks/EXAMPLE-001-hello-world/PROMPT.md +98 -0
- package/templates/tasks/EXAMPLE-001-hello-world/STATUS.md +73 -0
- package/templates/tasks/EXAMPLE-002-parallel-smoke/PROMPT.md +97 -0
- 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
|
+
}
|