@tt-a1i/openpi 0.4.0 → 0.6.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/README.md +116 -46
- package/SETUP.md +29 -7
- package/THIRD_PARTY_NOTICES.md +16 -0
- package/assets/openpi-launch-card-v1.webp +0 -0
- package/bin/openpi.js +155 -0
- package/extensions/ai-providers/LICENSE.upstream +23 -0
- package/extensions/ai-providers/README.md +59 -0
- package/extensions/ai-providers/antigravity/credentials.ts +52 -0
- package/extensions/ai-providers/antigravity/discovery.ts +130 -0
- package/extensions/ai-providers/antigravity/google-conversion.ts +455 -0
- package/extensions/ai-providers/antigravity/models.ts +84 -0
- package/extensions/ai-providers/antigravity/oauth.ts +700 -0
- package/extensions/ai-providers/antigravity/provider.ts +1116 -0
- package/extensions/ai-providers/antigravity/routing.ts +340 -0
- package/extensions/ai-providers/antigravity/with-resolvers.d.ts +19 -0
- package/extensions/ai-providers/cursor/constants.ts +5 -0
- package/extensions/ai-providers/cursor/credentials.ts +14 -0
- package/extensions/ai-providers/cursor/discovery.ts +291 -0
- package/extensions/ai-providers/cursor/input-images.ts +106 -0
- package/extensions/ai-providers/cursor/models.ts +45 -0
- package/extensions/ai-providers/cursor/oauth.ts +263 -0
- package/extensions/ai-providers/cursor/proto.ts +1064 -0
- package/extensions/ai-providers/cursor/protobuf.ts +1171 -0
- package/extensions/ai-providers/cursor/provider.ts +1175 -0
- package/extensions/ai-providers/cursor/proxy.ts +213 -0
- package/extensions/ai-providers/cursor/with-resolvers.d.ts +12 -0
- package/extensions/ai-providers/index.ts +86 -0
- package/extensions/ai-providers/oauth-adapter.ts +81 -0
- package/extensions/ai-providers/usage.ts +10 -0
- package/extensions/background-terminals/index.ts +38 -3
- package/extensions/background-terminals/src/domain.ts +2 -0
- package/extensions/background-terminals/src/manager.ts +484 -106
- package/extensions/background-terminals/src/output.ts +33 -0
- package/extensions/background-terminals/src/prompt.ts +13 -5
- package/extensions/background-terminals/src/result-delivery.ts +47 -24
- package/extensions/clear-context/index.ts +83 -0
- package/extensions/context-pivot/index.ts +16 -6
- package/extensions/cron/index.ts +68 -27
- package/extensions/cron/schedule.ts +12 -2
- package/extensions/file-mutation-display/render.ts +17 -257
- package/extensions/file-search/src/binaries.ts +57 -41
- package/extensions/git-read/index.ts +1 -3
- package/extensions/model-info/cache-diagnostics.ts +220 -0
- package/extensions/model-info/index.ts +65 -33
- package/extensions/model-info/session-metrics.ts +96 -0
- package/extensions/plan-mode/bash-policy.ts +54 -9
- package/extensions/plan-mode/index.ts +82 -6
- package/extensions/post-edit/index.ts +16 -6
- package/extensions/sessions/git-stats.ts +258 -72
- package/extensions/sessions/index.ts +153 -86
- package/extensions/sessions/preview-cache.ts +104 -0
- package/extensions/sessions/preview-loader.ts +856 -0
- package/extensions/sessions/sessions.ts +43 -4
- package/extensions/setup/index.ts +138 -130
- package/extensions/shared/activity-status.ts +30 -0
- package/extensions/shared/agent-session-page.ts +319 -0
- package/extensions/shared/agent-tool-renderer.ts +218 -0
- package/extensions/shared/agent-transcript.ts +524 -0
- package/extensions/shared/capability-intent.ts +1 -1
- package/extensions/shared/child-session.ts +457 -21
- package/extensions/shared/completion-inbox.ts +193 -0
- package/extensions/shared/result-delivery.ts +34 -0
- package/extensions/shared/setup-config.ts +83 -34
- package/extensions/shared/setup-episode-state.ts +1 -1
- package/extensions/shared/structured-output.ts +154 -0
- package/extensions/shared/terminal-text.ts +110 -23
- package/extensions/shared/text-projection.ts +72 -15
- package/extensions/shared/tool-activity.ts +382 -0
- package/extensions/shared/tool-surface.ts +29 -2
- package/extensions/shared/transcript-viewport.ts +46 -0
- package/extensions/shared/web-observer-registry.ts +390 -0
- package/extensions/shared/worktree.ts +11 -0
- package/extensions/subagents/index.ts +313 -62
- package/extensions/subagents/navigation.ts +34 -5
- package/extensions/subagents/src/backend.ts +12 -1
- package/extensions/subagents/src/backends/pi.ts +450 -70
- package/extensions/subagents/src/domain.ts +21 -1
- package/extensions/subagents/src/manager.ts +39 -2
- package/extensions/subagents/src/prompt.ts +49 -7
- package/extensions/subagents/src/result-artifact.ts +36 -0
- package/extensions/subagents/src/result-delivery.ts +39 -14
- package/extensions/subagents/src/runtime.ts +15 -1
- package/extensions/subagents/src/ui/takeover.ts +73 -257
- package/extensions/subagents/src/ui/transcript.ts +38 -535
- package/extensions/subagents/src/ui/wait-result.ts +103 -15
- package/extensions/suggestions/src/ui.ts +10 -4
- package/extensions/tasks/index.ts +0 -3
- package/extensions/ui-customization/footer.ts +16 -45
- package/extensions/ui-customization/index.ts +0 -4
- package/extensions/user-input-fold/index.ts +42 -6
- package/extensions/web/index.ts +257 -0
- package/extensions/workflows/acceptance.ts +43 -19
- package/extensions/workflows/artifacts.ts +137 -47
- package/extensions/workflows/completion-projection.ts +459 -0
- package/extensions/workflows/coordinator.ts +8 -10
- package/extensions/workflows/dashboard.ts +175 -228
- package/extensions/workflows/handoff.ts +70 -16
- package/extensions/workflows/index.ts +501 -198
- package/extensions/workflows/journal.ts +148 -13
- package/extensions/workflows/model.ts +79 -5
- package/extensions/workflows/navigation.ts +32 -8
- package/extensions/workflows/progress-projection.ts +306 -0
- package/extensions/workflows/prompt.ts +70 -16
- package/extensions/workflows/replay-safety.ts +42 -21
- package/extensions/workflows/result-delivery.ts +214 -76
- package/extensions/workflows/retention.ts +599 -0
- package/extensions/workflows/runner.ts +389 -345
- package/extensions/workflows/sandbox-child.cjs +25 -3
- package/extensions/workflows/sandbox.ts +62 -8
- package/extensions/workflows/serialization.ts +325 -17
- package/extensions/workflows/tool-renderer.ts +22 -0
- package/extensions/workflows/transcript.ts +149 -0
- package/extensions/workspace-cleanup-guard/index.ts +54 -0
- package/extensions/workspace-cleanup-guard/workspace-provenance.ts +563 -0
- package/package.json +34 -14
- package/skills/subagents/REFERENCE.md +190 -0
- package/skills/subagents/SKILL.md +2 -1
- package/skills/workflows/REFERENCE.md +6 -4
- package/skills/workflows/SKILL.md +1 -1
- package/web/adapter/pi-adapter.ts +664 -0
- package/web/host/browser-launcher.ts +20 -0
- package/web/host/pi-coding-agent-entry.ts +162 -0
- package/web/host/static-assets.ts +4 -0
- package/web/host/terminal-status.ts +38 -0
- package/web/host/web-host.ts +1069 -0
- package/web/http-dispatcher.ts +125 -0
- package/web/protocol/types.ts +467 -0
- package/web/runtime/pi-runtime.ts +1206 -0
- package/web/runtime/types.ts +102 -0
- package/web/runtime/web-host-lease.ts +497 -0
- package/web/trace.ts +18 -0
- package/web/ui/app.js +1700 -0
- package/web/ui/index.html +142 -0
- package/web/ui/styles.css +680 -0
- package/web/vite.config.mjs +34 -0
- package/extensions/execution-convergence/active-evidence.ts +0 -129
- package/extensions/execution-convergence/index.ts +0 -442
- package/extensions/execution-convergence/workspace-provenance.ts +0 -338
- package/extensions/setup/intercom-fs-helper.cjs +0 -130
- package/extensions/setup/intercom.ts +0 -603
- package/extensions/subagents/src/backends/stub.ts +0 -303
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { basename, dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
|
|
5
|
+
export const PI_CODING_AGENT_PACKAGE = "@earendil-works/pi-coding-agent";
|
|
6
|
+
export const PI_CODING_AGENT_ENTRY_ENV = "OPENPI_PI_CODING_AGENT_ENTRY";
|
|
7
|
+
const PACKAGE_ROOT_SEARCH_DEPTH = 10;
|
|
8
|
+
|
|
9
|
+
type PackageManifest = {
|
|
10
|
+
name?: unknown;
|
|
11
|
+
main?: unknown;
|
|
12
|
+
exports?: Record<string, { import?: unknown } | string>;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export function findPackageRoot(realPath: string, packageName: string) {
|
|
16
|
+
let dir = dirname(realPath);
|
|
17
|
+
for (let depth = 0; depth < PACKAGE_ROOT_SEARCH_DEPTH; depth++) {
|
|
18
|
+
const manifestPath = join(dir, "package.json");
|
|
19
|
+
if (existsSync(manifestPath)) {
|
|
20
|
+
const manifest = readManifest(manifestPath);
|
|
21
|
+
if (manifest?.name === packageName) return dir;
|
|
22
|
+
}
|
|
23
|
+
const parent = dirname(dir);
|
|
24
|
+
if (parent === dir) break;
|
|
25
|
+
dir = parent;
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function readManifest(manifestPath: string) {
|
|
31
|
+
try {
|
|
32
|
+
return JSON.parse(readFileSync(manifestPath, "utf8")) as PackageManifest;
|
|
33
|
+
} catch {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function officialEntry(root: string | undefined) {
|
|
39
|
+
if (!root) return undefined;
|
|
40
|
+
const manifest = readManifest(join(root, "package.json"));
|
|
41
|
+
const target = manifest?.exports?.["."];
|
|
42
|
+
const relative =
|
|
43
|
+
typeof target === "string"
|
|
44
|
+
? target
|
|
45
|
+
: typeof target?.import === "string"
|
|
46
|
+
? target.import
|
|
47
|
+
: typeof manifest?.main === "string"
|
|
48
|
+
? manifest.main
|
|
49
|
+
: "dist/index.js";
|
|
50
|
+
const entry = join(root, relative);
|
|
51
|
+
try {
|
|
52
|
+
return existsSync(entry) && statSync(entry).isFile()
|
|
53
|
+
? realpathSync(entry)
|
|
54
|
+
: undefined;
|
|
55
|
+
} catch {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function walkFromFile(file: string) {
|
|
61
|
+
try {
|
|
62
|
+
const real = realpathSync(file);
|
|
63
|
+
if (!statSync(real).isFile()) return undefined;
|
|
64
|
+
return officialEntry(findPackageRoot(real, PI_CODING_AGENT_PACKAGE));
|
|
65
|
+
} catch {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function fileFromUrl(fromUrl: string) {
|
|
71
|
+
return fromUrl.startsWith("file:") ? fileURLToPath(fromUrl) : fromUrl;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function nearestPackageRoot(file: string) {
|
|
75
|
+
let dir = dirname(file);
|
|
76
|
+
for (let depth = 0; depth < PACKAGE_ROOT_SEARCH_DEPTH; depth++) {
|
|
77
|
+
if (existsSync(join(dir, "package.json"))) return dir;
|
|
78
|
+
const parent = dirname(dir);
|
|
79
|
+
if (parent === dir) break;
|
|
80
|
+
dir = parent;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function peerAt(nodeModules: string) {
|
|
85
|
+
const root = join(nodeModules, ...PI_CODING_AGENT_PACKAGE.split("/"));
|
|
86
|
+
const manifest = readManifest(join(root, "package.json"));
|
|
87
|
+
return manifest?.name === PI_CODING_AGENT_PACKAGE
|
|
88
|
+
? officialEntry(root)
|
|
89
|
+
: undefined;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function resolveFromInstall(fromUrl: string) {
|
|
93
|
+
let start = fileFromUrl(fromUrl);
|
|
94
|
+
try {
|
|
95
|
+
start = realpathSync(start);
|
|
96
|
+
} catch {
|
|
97
|
+
// Keep the unresolved path when the caller file is a test stub.
|
|
98
|
+
}
|
|
99
|
+
const packageRoot = nearestPackageRoot(start);
|
|
100
|
+
if (!packageRoot) return undefined;
|
|
101
|
+
|
|
102
|
+
const nested = peerAt(join(packageRoot, "node_modules"));
|
|
103
|
+
if (nested) return nested;
|
|
104
|
+
|
|
105
|
+
const parent = dirname(packageRoot);
|
|
106
|
+
const grandparent = dirname(parent);
|
|
107
|
+
const hoistedModules =
|
|
108
|
+
basename(parent).startsWith("@") && basename(grandparent) === "node_modules"
|
|
109
|
+
? grandparent
|
|
110
|
+
: basename(parent) === "node_modules"
|
|
111
|
+
? parent
|
|
112
|
+
: undefined;
|
|
113
|
+
return hoistedModules ? peerAt(hoistedModules) : undefined;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function validatePiCodingAgentEntry(candidate: string | undefined) {
|
|
117
|
+
if (!candidate) return undefined;
|
|
118
|
+
return walkFromFile(candidate);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function missingPiCodingAgentDiagnostic() {
|
|
122
|
+
return [
|
|
123
|
+
`OpenPI Web could not resolve ${PI_CODING_AGENT_PACKAGE} for this process.`,
|
|
124
|
+
"Host resolution uses only the current process argv identity and fail-closes if that path is not the official package.",
|
|
125
|
+
`${PI_CODING_AGENT_ENTRY_ENV} is an explicit standalone handoff, not a host fallback.`,
|
|
126
|
+
`Standalone openpi web uses that handoff when valid, then the installed nested or hoisted peer (npm install ${PI_CODING_AGENT_PACKAGE}).`,
|
|
127
|
+
"From a running Pi session use /web, which hands over the host Pi.",
|
|
128
|
+
"Supported package install is `pi install npm:@tt-a1i/openpi`.",
|
|
129
|
+
].join(" ");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function resolvePiCodingAgentEntry(options?: {
|
|
133
|
+
source?: "host" | "standalone";
|
|
134
|
+
env?: NodeJS.ProcessEnv;
|
|
135
|
+
argv1?: string | undefined;
|
|
136
|
+
fromUrl?: string;
|
|
137
|
+
}) {
|
|
138
|
+
const source = options?.source ?? "host";
|
|
139
|
+
if (source === "standalone") {
|
|
140
|
+
const env = options?.env ?? process.env;
|
|
141
|
+
const handed = validatePiCodingAgentEntry(env[PI_CODING_AGENT_ENTRY_ENV]);
|
|
142
|
+
if (handed) return handed;
|
|
143
|
+
return resolveFromInstall(options?.fromUrl ?? import.meta.url);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const argv1 = options?.argv1 === undefined ? process.argv[1] : options.argv1;
|
|
147
|
+
return argv1 ? walkFromFile(argv1) : undefined;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function resolveStandaloneJitiAliases(options?: {
|
|
151
|
+
env?: NodeJS.ProcessEnv;
|
|
152
|
+
argv1?: string | undefined;
|
|
153
|
+
fromUrl?: string;
|
|
154
|
+
}) {
|
|
155
|
+
const fromUrl = options?.fromUrl ?? import.meta.url;
|
|
156
|
+
const entry = resolvePiCodingAgentEntry({
|
|
157
|
+
...options,
|
|
158
|
+
fromUrl,
|
|
159
|
+
source: "standalone",
|
|
160
|
+
});
|
|
161
|
+
return entry ? { [PI_CODING_AGENT_PACKAGE]: entry } : {};
|
|
162
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
interface WebReadyScreenOptions {
|
|
2
|
+
origin: string;
|
|
3
|
+
url: string;
|
|
4
|
+
opened: boolean;
|
|
5
|
+
color?: boolean;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const ANSI = {
|
|
9
|
+
accent: "\u001b[36m",
|
|
10
|
+
bold: "\u001b[1m",
|
|
11
|
+
dim: "\u001b[2m",
|
|
12
|
+
green: "\u001b[32m",
|
|
13
|
+
reset: "\u001b[0m",
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export function formatWebReadyScreen(options: WebReadyScreenOptions) {
|
|
17
|
+
const color =
|
|
18
|
+
options.color ?? (process.stdout.isTTY === true && !("NO_COLOR" in process.env));
|
|
19
|
+
const paint = (codes: string, text: string) =>
|
|
20
|
+
color ? `${codes}${text}${ANSI.reset}` : text;
|
|
21
|
+
const label = (text: string) => paint(ANSI.dim, text.padEnd(12));
|
|
22
|
+
const rows = [
|
|
23
|
+
"",
|
|
24
|
+
`${paint(`${ANSI.bold}${ANSI.accent}`, "OpenPI Web Workbench")} ${paint(ANSI.green, "ready")}`,
|
|
25
|
+
paint(
|
|
26
|
+
ANSI.dim,
|
|
27
|
+
"Local, authenticated, and isolated from the terminal Pi Session.",
|
|
28
|
+
),
|
|
29
|
+
"",
|
|
30
|
+
`${label("Local")} ${options.origin}`,
|
|
31
|
+
`${label("Workspaces")} choose and switch in the browser`,
|
|
32
|
+
`${label("Sessions")} separate from terminal Pi`,
|
|
33
|
+
`${label("Browser")} ${options.opened ? "opened" : "not opened"}`,
|
|
34
|
+
];
|
|
35
|
+
if (!options.opened) rows.push(`${label("Open")} ${options.url}`);
|
|
36
|
+
rows.push("", `${paint(ANSI.bold, "Ctrl+C")} stop`, "");
|
|
37
|
+
return rows.join("\n");
|
|
38
|
+
}
|