@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.
Files changed (141) hide show
  1. package/README.md +116 -46
  2. package/SETUP.md +29 -7
  3. package/THIRD_PARTY_NOTICES.md +16 -0
  4. package/assets/openpi-launch-card-v1.webp +0 -0
  5. package/bin/openpi.js +155 -0
  6. package/extensions/ai-providers/LICENSE.upstream +23 -0
  7. package/extensions/ai-providers/README.md +59 -0
  8. package/extensions/ai-providers/antigravity/credentials.ts +52 -0
  9. package/extensions/ai-providers/antigravity/discovery.ts +130 -0
  10. package/extensions/ai-providers/antigravity/google-conversion.ts +455 -0
  11. package/extensions/ai-providers/antigravity/models.ts +84 -0
  12. package/extensions/ai-providers/antigravity/oauth.ts +700 -0
  13. package/extensions/ai-providers/antigravity/provider.ts +1116 -0
  14. package/extensions/ai-providers/antigravity/routing.ts +340 -0
  15. package/extensions/ai-providers/antigravity/with-resolvers.d.ts +19 -0
  16. package/extensions/ai-providers/cursor/constants.ts +5 -0
  17. package/extensions/ai-providers/cursor/credentials.ts +14 -0
  18. package/extensions/ai-providers/cursor/discovery.ts +291 -0
  19. package/extensions/ai-providers/cursor/input-images.ts +106 -0
  20. package/extensions/ai-providers/cursor/models.ts +45 -0
  21. package/extensions/ai-providers/cursor/oauth.ts +263 -0
  22. package/extensions/ai-providers/cursor/proto.ts +1064 -0
  23. package/extensions/ai-providers/cursor/protobuf.ts +1171 -0
  24. package/extensions/ai-providers/cursor/provider.ts +1175 -0
  25. package/extensions/ai-providers/cursor/proxy.ts +213 -0
  26. package/extensions/ai-providers/cursor/with-resolvers.d.ts +12 -0
  27. package/extensions/ai-providers/index.ts +86 -0
  28. package/extensions/ai-providers/oauth-adapter.ts +81 -0
  29. package/extensions/ai-providers/usage.ts +10 -0
  30. package/extensions/background-terminals/index.ts +38 -3
  31. package/extensions/background-terminals/src/domain.ts +2 -0
  32. package/extensions/background-terminals/src/manager.ts +484 -106
  33. package/extensions/background-terminals/src/output.ts +33 -0
  34. package/extensions/background-terminals/src/prompt.ts +13 -5
  35. package/extensions/background-terminals/src/result-delivery.ts +47 -24
  36. package/extensions/clear-context/index.ts +83 -0
  37. package/extensions/context-pivot/index.ts +16 -6
  38. package/extensions/cron/index.ts +68 -27
  39. package/extensions/cron/schedule.ts +12 -2
  40. package/extensions/file-mutation-display/render.ts +17 -257
  41. package/extensions/file-search/src/binaries.ts +57 -41
  42. package/extensions/git-read/index.ts +1 -3
  43. package/extensions/model-info/cache-diagnostics.ts +220 -0
  44. package/extensions/model-info/index.ts +65 -33
  45. package/extensions/model-info/session-metrics.ts +96 -0
  46. package/extensions/plan-mode/bash-policy.ts +54 -9
  47. package/extensions/plan-mode/index.ts +82 -6
  48. package/extensions/post-edit/index.ts +16 -6
  49. package/extensions/sessions/git-stats.ts +258 -72
  50. package/extensions/sessions/index.ts +153 -86
  51. package/extensions/sessions/preview-cache.ts +104 -0
  52. package/extensions/sessions/preview-loader.ts +856 -0
  53. package/extensions/sessions/sessions.ts +43 -4
  54. package/extensions/setup/index.ts +138 -130
  55. package/extensions/shared/activity-status.ts +30 -0
  56. package/extensions/shared/agent-session-page.ts +319 -0
  57. package/extensions/shared/agent-tool-renderer.ts +218 -0
  58. package/extensions/shared/agent-transcript.ts +524 -0
  59. package/extensions/shared/capability-intent.ts +1 -1
  60. package/extensions/shared/child-session.ts +457 -21
  61. package/extensions/shared/completion-inbox.ts +193 -0
  62. package/extensions/shared/result-delivery.ts +34 -0
  63. package/extensions/shared/setup-config.ts +83 -34
  64. package/extensions/shared/setup-episode-state.ts +1 -1
  65. package/extensions/shared/structured-output.ts +154 -0
  66. package/extensions/shared/terminal-text.ts +110 -23
  67. package/extensions/shared/text-projection.ts +72 -15
  68. package/extensions/shared/tool-activity.ts +382 -0
  69. package/extensions/shared/tool-surface.ts +29 -2
  70. package/extensions/shared/transcript-viewport.ts +46 -0
  71. package/extensions/shared/web-observer-registry.ts +390 -0
  72. package/extensions/shared/worktree.ts +11 -0
  73. package/extensions/subagents/index.ts +313 -62
  74. package/extensions/subagents/navigation.ts +34 -5
  75. package/extensions/subagents/src/backend.ts +12 -1
  76. package/extensions/subagents/src/backends/pi.ts +450 -70
  77. package/extensions/subagents/src/domain.ts +21 -1
  78. package/extensions/subagents/src/manager.ts +39 -2
  79. package/extensions/subagents/src/prompt.ts +49 -7
  80. package/extensions/subagents/src/result-artifact.ts +36 -0
  81. package/extensions/subagents/src/result-delivery.ts +39 -14
  82. package/extensions/subagents/src/runtime.ts +15 -1
  83. package/extensions/subagents/src/ui/takeover.ts +73 -257
  84. package/extensions/subagents/src/ui/transcript.ts +38 -535
  85. package/extensions/subagents/src/ui/wait-result.ts +103 -15
  86. package/extensions/suggestions/src/ui.ts +10 -4
  87. package/extensions/tasks/index.ts +0 -3
  88. package/extensions/ui-customization/footer.ts +16 -45
  89. package/extensions/ui-customization/index.ts +0 -4
  90. package/extensions/user-input-fold/index.ts +42 -6
  91. package/extensions/web/index.ts +257 -0
  92. package/extensions/workflows/acceptance.ts +43 -19
  93. package/extensions/workflows/artifacts.ts +137 -47
  94. package/extensions/workflows/completion-projection.ts +459 -0
  95. package/extensions/workflows/coordinator.ts +8 -10
  96. package/extensions/workflows/dashboard.ts +175 -228
  97. package/extensions/workflows/handoff.ts +70 -16
  98. package/extensions/workflows/index.ts +501 -198
  99. package/extensions/workflows/journal.ts +148 -13
  100. package/extensions/workflows/model.ts +79 -5
  101. package/extensions/workflows/navigation.ts +32 -8
  102. package/extensions/workflows/progress-projection.ts +306 -0
  103. package/extensions/workflows/prompt.ts +70 -16
  104. package/extensions/workflows/replay-safety.ts +42 -21
  105. package/extensions/workflows/result-delivery.ts +214 -76
  106. package/extensions/workflows/retention.ts +599 -0
  107. package/extensions/workflows/runner.ts +389 -345
  108. package/extensions/workflows/sandbox-child.cjs +25 -3
  109. package/extensions/workflows/sandbox.ts +62 -8
  110. package/extensions/workflows/serialization.ts +325 -17
  111. package/extensions/workflows/tool-renderer.ts +22 -0
  112. package/extensions/workflows/transcript.ts +149 -0
  113. package/extensions/workspace-cleanup-guard/index.ts +54 -0
  114. package/extensions/workspace-cleanup-guard/workspace-provenance.ts +563 -0
  115. package/package.json +34 -14
  116. package/skills/subagents/REFERENCE.md +190 -0
  117. package/skills/subagents/SKILL.md +2 -1
  118. package/skills/workflows/REFERENCE.md +6 -4
  119. package/skills/workflows/SKILL.md +1 -1
  120. package/web/adapter/pi-adapter.ts +664 -0
  121. package/web/host/browser-launcher.ts +20 -0
  122. package/web/host/pi-coding-agent-entry.ts +162 -0
  123. package/web/host/static-assets.ts +4 -0
  124. package/web/host/terminal-status.ts +38 -0
  125. package/web/host/web-host.ts +1069 -0
  126. package/web/http-dispatcher.ts +125 -0
  127. package/web/protocol/types.ts +467 -0
  128. package/web/runtime/pi-runtime.ts +1206 -0
  129. package/web/runtime/types.ts +102 -0
  130. package/web/runtime/web-host-lease.ts +497 -0
  131. package/web/trace.ts +18 -0
  132. package/web/ui/app.js +1700 -0
  133. package/web/ui/index.html +142 -0
  134. package/web/ui/styles.css +680 -0
  135. package/web/vite.config.mjs +34 -0
  136. package/extensions/execution-convergence/active-evidence.ts +0 -129
  137. package/extensions/execution-convergence/index.ts +0 -442
  138. package/extensions/execution-convergence/workspace-provenance.ts +0 -338
  139. package/extensions/setup/intercom-fs-helper.cjs +0 -130
  140. package/extensions/setup/intercom.ts +0 -603
  141. 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,4 @@
1
+ export const MARKED_BROWSER_URL = new URL(
2
+ "./lib/marked.umd.js",
3
+ import.meta.resolve("marked/package.json"),
4
+ );
@@ -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
+ }