@piagent/platform 1.34.2 → 1.35.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 +28 -0
- package/README.md +1 -1
- package/README.vi.md +1 -1
- package/docs/command-reference-vietnamese.md +2 -2
- package/docs/distribution-standard.md +6 -6
- package/docs/languages.json +2 -2
- package/docs/operator-manual-vietnamese.md +7 -7
- package/docs/publishing-for-teams.md +2 -0
- package/docs/release-install-policy.md +2 -2
- package/docs/team-onboarding.md +2 -2
- package/docs-site/architecture.html +1 -1
- package/docs-site/benchmark.html +1 -1
- package/docs-site/commands.html +1 -1
- package/docs-site/content/en/index.html +4 -4
- package/docs-site/content/en/whats-new.html +12 -0
- package/docs-site/content/index.html +4 -4
- package/docs-site/content/whats-new.html +12 -0
- package/docs-site/context-engine.html +1 -1
- package/docs-site/ecosystem.html +1 -1
- package/docs-site/en/architecture.html +1 -1
- package/docs-site/en/benchmark.html +1 -1
- package/docs-site/en/commands.html +1 -1
- package/docs-site/en/context-engine.html +1 -1
- package/docs-site/en/ecosystem.html +1 -1
- package/docs-site/en/index.html +5 -5
- package/docs-site/en/mcp-approval.html +1 -1
- package/docs-site/en/mcp-auth.html +1 -1
- package/docs-site/en/mcp-servers.html +1 -1
- package/docs-site/en/mcp.html +1 -1
- package/docs-site/en/permissions.html +1 -1
- package/docs-site/en/profiles.html +1 -1
- package/docs-site/en/quickstart.html +1 -1
- package/docs-site/en/runtime.html +1 -1
- package/docs-site/en/scope.html +1 -1
- package/docs-site/en/security.html +1 -1
- package/docs-site/en/team.html +1 -1
- package/docs-site/en/whats-new.html +13 -1
- package/docs-site/en/windows.html +1 -1
- package/docs-site/en/workflows.html +1 -1
- package/docs-site/index.html +5 -5
- package/docs-site/mcp-approval.html +1 -1
- package/docs-site/mcp-auth.html +1 -1
- package/docs-site/mcp-servers.html +1 -1
- package/docs-site/mcp.html +1 -1
- package/docs-site/permissions.html +1 -1
- package/docs-site/profiles.html +1 -1
- package/docs-site/quickstart.html +1 -1
- package/docs-site/runtime.html +1 -1
- package/docs-site/scope.html +1 -1
- package/docs-site/security.html +1 -1
- package/docs-site/team.html +1 -1
- package/docs-site/whats-new.html +13 -1
- package/docs-site/windows.html +1 -1
- package/docs-site/workflows.html +1 -1
- package/evals/private-holdout-v1/public-exposure.v2.json +2 -2
- package/package.json +1 -1
- package/packages/piagent-core/managed/continuation.mjs +13 -2
- package/packages/piagent-core/managed/request-stream.mjs +42 -7
- package/packages/piagent-core/managed/session.mjs +4 -4
- package/packages/piagent-core/managed/studio-link.mjs +223 -0
- package/packages/piagent-core/package.json +1 -1
- package/packages/piagent-core/runtime/managed-failure.mjs +5 -1
- package/packages/piagent-webui/gateway/gateway-service.ts +5 -1
- package/packages/piagent-webui/gateway/session-operation-watchdog.ts +6 -4
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · EN</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Language">
|
|
35
35
|
<a class="language-option" href="/runtime" hreflang="vi" lang="vi">VI</a>
|
|
36
36
|
<a class="language-option current" href="/en/runtime" hreflang="en" lang="en" aria-current="true">EN</a>
|
package/docs-site/en/scope.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · EN</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Language">
|
|
35
35
|
<a class="language-option" href="/scope" hreflang="vi" lang="vi">VI</a>
|
|
36
36
|
<a class="language-option current" href="/en/scope" hreflang="en" lang="en" aria-current="true">EN</a>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · EN</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Language">
|
|
35
35
|
<a class="language-option" href="/security" hreflang="vi" lang="vi">VI</a>
|
|
36
36
|
<a class="language-option current" href="/en/security" hreflang="en" lang="en" aria-current="true">EN</a>
|
package/docs-site/en/team.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · EN</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Language">
|
|
35
35
|
<a class="language-option" href="/team" hreflang="vi" lang="vi">VI</a>
|
|
36
36
|
<a class="language-option current" href="/en/team" hreflang="en" lang="en" aria-current="true">EN</a>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · EN</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Language">
|
|
35
35
|
<a class="language-option" href="/whats-new" hreflang="vi" lang="vi">VI</a>
|
|
36
36
|
<a class="language-option current" href="/en/whats-new" hreflang="en" lang="en" aria-current="true">EN</a>
|
|
@@ -104,6 +104,18 @@
|
|
|
104
104
|
<h1>1.9.0: ask in plain language, the team's Harness checks</h1>
|
|
105
105
|
<p>The task contract and workflow commands are gone. Company mode asks for checks and a review on its own; Stop, network commands on approval and clearer approval cards.</p>
|
|
106
106
|
</div>
|
|
107
|
+
<section class="section">
|
|
108
|
+
<p class="section-kicker">v1.35.0 · 2026-10-21</p>
|
|
109
|
+
<h2 id="v1-35-0">Long tasks survive a Studio update</h2>
|
|
110
|
+
<p class="section-lead">Leave a task running overnight and let Studio update or restart: Piagent no longer fails and stops, it waits for Studio to answer again and goes on by itself, for as long as it takes (Stop still stops it). Each wait is logged on the machine and reported to Studio (Logs → Mất kết nối) with its cause: a Studio update, a restart, or the machine's network. One dashboard turn can now run up to 24 hours. Needs Studio 0.36.0.</p>
|
|
111
|
+
</section>
|
|
112
|
+
|
|
113
|
+
<section class="section">
|
|
114
|
+
<p class="section-kicker">v1.34.3 · 2026-10-20</p>
|
|
115
|
+
<h2 id="v1-34-3">Agent Watch notifies for company conversations</h2>
|
|
116
|
+
<p class="section-lead">Company conversations wrote their state where Agent Watch does not look, so it never told you when one waited for you or was done. The state now goes to the folder Agent Watch reads.</p>
|
|
117
|
+
</section>
|
|
118
|
+
|
|
107
119
|
<section class="section">
|
|
108
120
|
<p class="section-kicker">v1.34.2 · 2026-10-20</p>
|
|
109
121
|
<h2 id="v1-34-2">Helper outcomes reach Studio</h2>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · EN</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Language">
|
|
35
35
|
<a class="language-option" href="/windows" hreflang="vi" lang="vi">VI</a>
|
|
36
36
|
<a class="language-option current" href="/en/windows" hreflang="en" lang="en" aria-current="true">EN</a>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · EN</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Language">
|
|
35
35
|
<a class="language-option" href="/workflows" hreflang="vi" lang="vi">VI</a>
|
|
36
36
|
<a class="language-option current" href="/en/workflows" hreflang="en" lang="en" aria-current="true">EN</a>
|
package/docs-site/index.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/" hreflang="en" lang="en">EN</a>
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
<main>
|
|
95
95
|
<div class="content-shell" data-article>
|
|
96
96
|
<section class="hero">
|
|
97
|
-
<p class="eyebrow">Piagent 1.
|
|
97
|
+
<p class="eyebrow">Piagent 1.35.0</p>
|
|
98
98
|
<h1>Coding agent cho cả team, kiểm tra từng bước.</h1>
|
|
99
99
|
<p>
|
|
100
100
|
Một dashboard cho Terminal và trình duyệt. Dùng model bằng tài khoản của bạn, hoặc model của công ty qua Agent Watch và Agent Studio. Guard kiểm tra từng tool call; ở chế độ công ty, Harness của team tự yêu cầu chạy check, cho subagent review và báo kết quả ngay dưới câu trả lời.
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
<div class="hero-actions">
|
|
109
109
|
<a class="button primary" href="/quickstart">Bắt đầu</a>
|
|
110
110
|
<a class="button" href="/ecosystem">Hệ sinh thái</a>
|
|
111
|
-
<a class="button" href="/whats-new">Có gì mới trong 1.
|
|
111
|
+
<a class="button" href="/whats-new">Có gì mới trong 1.35.0</a>
|
|
112
112
|
<a class="button" href="/commands">Xem command</a>
|
|
113
113
|
</div>
|
|
114
114
|
</section>
|
|
@@ -184,9 +184,9 @@ piagent-setup</code></pre>
|
|
|
184
184
|
<h2 id="bat-dau-tu-dau">Bắt đầu từ đâu</h2>
|
|
185
185
|
<div class="card-grid">
|
|
186
186
|
<a class="doc-card" href="/whats-new">
|
|
187
|
-
<span class="card-kicker">Bản 1.
|
|
187
|
+
<span class="card-kicker">Bản 1.35.0</span>
|
|
188
188
|
<h3>Có gì mới</h3>
|
|
189
|
-
<p>
|
|
189
|
+
<p>Task dài chạy tiếp được khi Studio cập nhật; ở 1.34: helper báo kết quả, Agent Watch báo khi cần bạn; ở 1.33.0: chạy trên Pi 1.3.0; ở 1.32.1: Bypass được giữ sau khi tải lại, tab đang dùng không còn bị đăng xuất sau 8 giờ; ở 1.32.0: lượt lỗi hoặc bấm Stop được dừng cả ở Studio; ở 1.31.1: <code>memory_ask</code> có ngay sau khi cập nhật; ở 1.31.0: Memory của team đi theo branch và luật của team, có <code>memory_ask</code>; ở 1.30.1: Terminal công ty không còn hiện tên model, mở <code>piagent studio</code> ở thư mục home báo rõ cần vào thư mục dự án; ở 1.30.0: context lớn đi qua mạng chậm, Terminal công ty gọn như dashboard; ở 1.29.0: Terminal công ty có giao diện riêng, dừng lượt không còn làm hỏng cuộc trò chuyện; ở 1.28.3: Agent Watch tự cập nhật không còn làm gián đoạn Terminal công ty; ở 1.28.2: không còn lỗi “binding changed” ngay sau khi cập nhật; ở 1.28.1: Terminal công ty và Pi cá nhân không còn giẫm chân nhau (không nạp Piagent hai lần, dọn cấu hình công ty cũ, cuộc trò chuyện công ty chỉ mở bằng piagent studio); ở 1.28.0: team memory v2; ở 1.27.1: team memory chạy ổn cả khi agent đang gọi model; ở 1.27.0: team memory, agent công ty nhớ quyết định và quy tắc của team trong từng repo; ở 1.26.1: đổi tên cuộc trò chuyện được cả khi lượt đang chạy; ở 1.26.0: lệnh / và phím tắt của Terminal ngay trên dashboard, /undo hoàn tác lượt trước của agent, dev server chạy qua nhiều lượt; ở 1.25.0: thiếu môi trường thì agent xin quyền và chạy được sau khi bạn duyệt (run_on_host ngoài sandbox, start_docker mở Docker ngay trong cuộc trò chuyện); ở 1.24.0: chọn Fast ngay trên trang tạo cuộc trò chuyện công ty, nút Fast đổi màu vàng khi đang bật; ở 1.23.1: câu hỏi của agent luôn nằm cuối cuộc trò chuyện, ngay trên ô nhập, và dễ đọc hơn; ở 1.23.0: nút Fast cho cuộc trò chuyện công ty khi Harness cho phép, tool lỗi được báo về Studio (Logs → Tool lỗi), cuộc trò chuyện mới gửi được tin nhắn đầu sau khi Harness đổi; ở 1.22.1: dashboard không còn quay mãi khi project nằm trên ổ Windows nhìn từ WSL (/mnt/d…) hoặc phiên công ty không trả lời; ở 1.22.0: đính kèm được mọi file code và văn bản (.html, .css, .ts, .py, Dockerfile…); ở 1.21.1: bật Bypass được cả khi lượt đang chạy và được giữ sau khi tải lại; ở 1.21.0: câu hỏi và yêu cầu duyệt hiện từng cái một (main agent trước), thông báo góc phải khi cuộc trò chuyện khác xong hay đang chờ bạn, Studio ghi lại mỗi lần compact; ở 1.20.0: cài package trong sandbox công ty không phải duyệt (npm, PyPI, Go, Maven, Gradle… qua proxy chỉ cho registry); ở 1.19.0: task công ty có checklist được làm đến hết, cuối mỗi lượt báo rõ xong, dừng giữa chừng hay lỗi, Docker trong sandbox công ty, folder chứa nhiều repo; ở 1.18.0: đổi nhánh Git trên dashboard, tự thử lại khi lỗi tạm thời, Claude Haiku 5.5; ở 1.17.0: dashboard hiện nhánh Git của project; ở 1.16.3: dashboard cập nhật xong vẫn tự kiểm tra bản mới; ở 1.16.2: Terminal nói giống dashboard: hỏi cập nhật, /bypass, lỗi và ghi chú Harness bằng tiếng Việt; ở 1.16.1: bản mới được báo bằng dialog và kiểm tra mỗi giờ, tab dashboard không còn mất đăng nhập; ở 1.16.0: Bypass cho cuộc trò chuyện công ty, đổi Harness không làm gián đoạn; ở 1.15.2: cuộc trò chuyện dài tự thu gọn trở lại; ở 1.15.1: Studio thấy mỗi call của model dùng để làm gì, nhiều cuộc trò chuyện trong một folder không nhận nhầm thay đổi của nhau; ở 1.15.0: subagent bị từ chối nói đúng lý do; ở 1.14: cập nhật giữ model bạn đã chọn; ở 1.13: cuộc trò chuyện giữ chỗ đang đọc, chữ của agent có định dạng, Piagent trên Windows qua WSL2: sandbox công ty bằng bubblewrap và Agent Watch cho Windows; ở 1.12: @ chọn file và folder trên máy, skill và command dùng bằng /, nhánh cuộc trò chuyện công ty gửi được tin nhắn.</p>
|
|
190
190
|
</a>
|
|
191
191
|
<a class="doc-card" href="/ecosystem">
|
|
192
192
|
<span class="card-kicker">Get started</span>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/mcp-approval" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/mcp-approval" hreflang="en" lang="en">EN</a>
|
package/docs-site/mcp-auth.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/mcp-auth" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/mcp-auth" hreflang="en" lang="en">EN</a>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/mcp-servers" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/mcp-servers" hreflang="en" lang="en">EN</a>
|
package/docs-site/mcp.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/mcp" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/mcp" hreflang="en" lang="en">EN</a>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/permissions" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/permissions" hreflang="en" lang="en">EN</a>
|
package/docs-site/profiles.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/profiles" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/profiles" hreflang="en" lang="en">EN</a>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/quickstart" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/quickstart" hreflang="en" lang="en">EN</a>
|
package/docs-site/runtime.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/runtime" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/runtime" hreflang="en" lang="en">EN</a>
|
package/docs-site/scope.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/scope" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/scope" hreflang="en" lang="en">EN</a>
|
package/docs-site/security.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/security" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/security" hreflang="en" lang="en">EN</a>
|
package/docs-site/team.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/team" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/team" hreflang="en" lang="en">EN</a>
|
package/docs-site/whats-new.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/whats-new" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/whats-new" hreflang="en" lang="en">EN</a>
|
|
@@ -104,6 +104,18 @@
|
|
|
104
104
|
<h1>Bản 1.9.0: nói việc bằng lời, Harness của team kiểm tra</h1>
|
|
105
105
|
<p>Bỏ task contract và lệnh workflow. Chế độ công ty tự yêu cầu check và review; nút Dừng, lệnh có mạng theo lần duyệt và thẻ duyệt dễ đọc hơn.</p>
|
|
106
106
|
</div>
|
|
107
|
+
<section class="section">
|
|
108
|
+
<p class="section-kicker">v1.35.0 · 2026-10-21</p>
|
|
109
|
+
<h2 id="v1-35-0">Task dài chạy qua được lúc Studio cập nhật</h2>
|
|
110
|
+
<p class="section-lead">Để task chạy qua đêm mà Studio cập nhật hay khởi động lại giữa chừng, Piagent không còn báo lỗi rồi dừng: nó chờ Studio trả lời lại rồi tự làm tiếp, không giới hạn thời gian chờ (Stop vẫn dừng được). Mỗi lần chờ được ghi vào log trên máy và báo về Studio (Logs → Mất kết nối) kèm nguyên nhân: Studio cập nhật, khởi động lại, hay mạng của máy. Một lượt trên dashboard giờ chạy được tới 24 giờ. Cần Studio 0.36.0.</p>
|
|
111
|
+
</section>
|
|
112
|
+
|
|
113
|
+
<section class="section">
|
|
114
|
+
<p class="section-kicker">v1.34.3 · 2026-10-20</p>
|
|
115
|
+
<h2 id="v1-34-3">Agent Watch báo cho cuộc trò chuyện công ty</h2>
|
|
116
|
+
<p class="section-lead">Cuộc trò chuyện công ty ghi trạng thái vào chỗ Agent Watch không đọc, nên Agent Watch không báo khi nó chờ bạn hay đã xong. Giờ trạng thái được ghi vào thư mục Agent Watch đọc.</p>
|
|
117
|
+
</section>
|
|
118
|
+
|
|
107
119
|
<section class="section">
|
|
108
120
|
<p class="section-kicker">v1.34.2 · 2026-10-20</p>
|
|
109
121
|
<h2 id="v1-34-2">Kết quả của helper đến được Studio</h2>
|
package/docs-site/windows.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/windows" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/windows" hreflang="en" lang="en">EN</a>
|
package/docs-site/workflows.html
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<span>Pi Agent Platform</span>
|
|
31
31
|
</a>
|
|
32
32
|
<div class="top-actions">
|
|
33
|
-
<span class="pill"><span class="pill-dot"></span>v1.
|
|
33
|
+
<span class="pill"><span class="pill-dot"></span>v1.35.0 docs · VI</span>
|
|
34
34
|
<nav class="language-switch" aria-label="Ngôn ngữ">
|
|
35
35
|
<a class="language-option current" href="/workflows" hreflang="vi" lang="vi" aria-current="true">VI</a>
|
|
36
36
|
<a class="language-option" href="/en/workflows" hreflang="en" lang="en">EN</a>
|
|
@@ -256,8 +256,8 @@
|
|
|
256
256
|
},
|
|
257
257
|
{
|
|
258
258
|
"path": "tests",
|
|
259
|
-
"fileCount":
|
|
260
|
-
"sha256": "
|
|
259
|
+
"fileCount": 563,
|
|
260
|
+
"sha256": "71ab68e40c06924ba57c7953093068029af4ca6945dc74b567eb3f41d3464fb7"
|
|
261
261
|
}
|
|
262
262
|
],
|
|
263
263
|
"custodianComparisonRules": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { checkpointsOf } from './checkpoints.mjs';
|
|
2
2
|
import { unfinished, planText, currentPlan, workflowPolicy } from './workflow.mjs';
|
|
3
3
|
import { failureCode } from '../runtime/managed-failure.mjs';
|
|
4
|
+
import { resumeMessage } from './studio-link.mjs';
|
|
4
5
|
|
|
5
6
|
// A main agent often ends its turn between the steps of its own checklist
|
|
6
7
|
// ("STEP06 done, STEP07 next"), though the member asked for all of them.
|
|
@@ -97,10 +98,20 @@ export async function memberTurn(self, { manager, prompt, runRound }, text, deli
|
|
|
97
98
|
if (first) result = round.result; else waiting?.resolve(round.result);
|
|
98
99
|
waiting = null;
|
|
99
100
|
const last = self.session.messages.findLast(m => m.role === 'assistant');
|
|
100
|
-
|
|
101
|
+
let stopped = self.stopRequested || last?.stopReason === 'aborted';
|
|
101
102
|
const failure = round.preflight || last?.stopReason === 'error' ? { role: 'main', code: failureCode(last?.errorMessage ?? '') }
|
|
102
103
|
: round.closeFailed ? { role: 'main', code: round.closeFailed } : null;
|
|
103
|
-
|
|
104
|
+
// A round cut because Studio or the way to it stopped answering (an
|
|
105
|
+
// update overnight) goes on once Studio is back, however long that
|
|
106
|
+
// takes; Stop ends the wait (studio-link.mjs).
|
|
107
|
+
let resume = null;
|
|
108
|
+
if (failure && !stopped && !self.queued.length && self.studioLink?.waits(failure.code)) {
|
|
109
|
+
try { const back = await self.studioLink.waitUntilBack({ phase: 'continue', code: failure.code, conversation: manager.getSessionId?.() ?? null }); resume = back && resumeMessage(back, failure.code); }
|
|
110
|
+
catch { /* stopped while waiting */ }
|
|
111
|
+
stopped ||= self.stopRequested;
|
|
112
|
+
if (round.planUpdated) continuation.touched = true;
|
|
113
|
+
}
|
|
114
|
+
const plan = currentPlan(manager), message = resume && !stopped ? resume : continuation.next({ plan, planUpdated: round.planUpdated, changed: round.changed, stopped, failed: !!failure });
|
|
104
115
|
if (self.queued.length) {
|
|
105
116
|
// The member wrote while the round closed: theirs is the next round,
|
|
106
117
|
// a new request (Stop before it applied to the round before).
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// few times. Nothing that reached the model is sent twice.
|
|
7
7
|
import { randomUUID } from 'node:crypto';
|
|
8
8
|
import { setTimeout as sleep } from 'node:timers/promises';
|
|
9
|
-
import { describeFailure, failureCode, failureIsAdmissionRefusal, failureIsBriefRefusal, failureReason, unnamedFailureText } from '../runtime/managed-failure.mjs';
|
|
9
|
+
import { describeFailure, failureCode, failureIsAdmissionRefusal, failureIsBriefRefusal, failureReason, failureText, unnamedFailureText } from '../runtime/managed-failure.mjs';
|
|
10
10
|
import { CLIENT_AGENT } from './client-agent.mjs';
|
|
11
11
|
import { shareGrant, releaseGrant } from './grant-share.mjs';
|
|
12
12
|
import { purposeHeaders } from './call-purpose.mjs';
|
|
@@ -67,11 +67,21 @@ export function wrapRoleStreams(owner, runtime, role, { provider, verifyGrant })
|
|
|
67
67
|
// replaces the role's token and would void a sibling's before
|
|
68
68
|
// Studio admits it. The share is let go once Studio has answered.
|
|
69
69
|
share = shareGrant(owner, role);
|
|
70
|
-
|
|
70
|
+
// Agent Watch could not renew the grant because Studio (or Watch's
|
|
71
|
+
// way to it) is out of reach: wait for Studio, then renew again.
|
|
72
|
+
const link = owner.studioLink, grant = await share.grant.catch(async (error) => {
|
|
73
|
+
const code = failureCode(failureText(error));
|
|
74
|
+
if (!link?.waits(code) || signal?.aborted) throw refused ? Error(refused) : error;
|
|
75
|
+
letGo();
|
|
76
|
+
if (!(await link.waitUntilBack({ phase: 'broker', code, role, conversation: conversationSession(owner), runId: owner.grant?.run_id ?? null, signal }))) throw refused ? Error(refused) : error;
|
|
77
|
+
return null;
|
|
78
|
+
});
|
|
79
|
+
if (!grant) continue;
|
|
71
80
|
verifyGrant(grant, owner.manifest, role);
|
|
72
81
|
if (role === 'main') owner.grant = grant;
|
|
73
82
|
// Tool calls that failed since the last request (tool-failures.mjs).
|
|
74
83
|
void sendToolFailures(owner, grant.token);
|
|
84
|
+
void link?.flush(grant.token);
|
|
75
85
|
const route = owner.routes.get(runtime);
|
|
76
86
|
if (!route || grant.provider_model_id !== route.native || grant.provider !== route.provider || grant.model_id !== route.model_id || model.id !== 'agent-watch-auto') throw Error('managed-route-changed');
|
|
77
87
|
const asked = Date.now();
|
|
@@ -83,7 +93,7 @@ export function wrapRoleStreams(owner, runtime, role, { provider, verifyGrant })
|
|
|
83
93
|
// Studio's id for this request, from its answer's headers: a
|
|
84
94
|
// stream that ends here without an answer is ended there too.
|
|
85
95
|
let studioRequest = null;
|
|
86
|
-
const onResponse = (response, at) => { studioRequest = studioRequestID(response?.headers); return options?.onResponse?.(response, at); };
|
|
96
|
+
const onResponse = (response, at) => { studioRequest = studioRequestID(response?.headers); link?.observe(response?.headers); return options?.onResponse?.(response, at); };
|
|
87
97
|
const stream = original({ ...model, id: route.native }, context, { ...options, apiKey: grant.token, sessionId: conversation ?? grant.role_id, maxRetries: 0, onPayload, onResponse, fetch: (owner.compressedFetch ??= compressedFetch(owner, options?.fetch)),
|
|
88
98
|
headers: { ...withoutCredentials(options?.headers), ...purpose, 'User-Agent': CLIENT_AGENT, 'X-Session-Id': grant.role_id, ...(conversation ? { 'X-Claude-Code-Session-Id': conversation } : {}) } });
|
|
89
99
|
// Whether Studio admitted the request is known at its first event
|
|
@@ -94,8 +104,8 @@ export function wrapRoleStreams(owner, runtime, role, { provider, verifyGrant })
|
|
|
94
104
|
if (opening && event.type === 'start') { opening.push(event); continue; }
|
|
95
105
|
const code = event.type === 'error' ? failureCode(event.error?.errorMessage) : null;
|
|
96
106
|
if (opening && code && !signal?.aborted && (failureIsAdmissionRefusal(code) || failureIsBriefRefusal(code) && brief < BRIEF_ASKS
|
|
97
|
-
|| role === 'main' && code === ACCOUNT_GONE && rebinds < MAX_REBINDS || fast && fastRefusal(code))) { refusal = event.error; break; }
|
|
98
|
-
if (opening) { for (const held of opening) out.push(held); opening = null; wait = capacityWaitEnded(owner, wait, 'admitted'); letGo(); }
|
|
107
|
+
|| role === 'main' && code === ACCOUNT_GONE && rebinds < MAX_REBINDS || fast && fastRefusal(code) || link?.always(code))) { refusal = event.error; break; }
|
|
108
|
+
if (opening) { for (const held of opening) out.push(held); opening = null; wait = capacityWaitEnded(owner, wait, 'admitted'); letGo(); link?.ok(); }
|
|
99
109
|
out.push(event.type === 'error' ? { ...event, ...(signal?.aborted ? { reason: 'aborted' } : {}), error: told(event.error) } : event);
|
|
100
110
|
}
|
|
101
111
|
if (!refusal) {
|
|
@@ -115,6 +125,13 @@ export function wrapRoleStreams(owner, runtime, role, { provider, verifyGrant })
|
|
|
115
125
|
// generation lets Studio bind the conversation to another account.
|
|
116
126
|
// Its prompt cache starts over there once.
|
|
117
127
|
const refusedCode = failureCode(refusal.errorMessage);
|
|
128
|
+
// Studio, its gateway or its connector did not answer before the
|
|
129
|
+
// model did any work: wait for Studio to answer again, then ask again.
|
|
130
|
+
if (link?.always(refusedCode)) {
|
|
131
|
+
wait = capacityWaitEnded(owner, wait, 'ended');
|
|
132
|
+
if (await link.waitUntilBack({ phase: 'model', code: refusedCode, role, conversation: conversationSession(owner), runId: grant.run_id ?? null, signal })) continue;
|
|
133
|
+
out.push({ type: 'error', reason: 'error', error: told(refusal) }); return;
|
|
134
|
+
}
|
|
118
135
|
if (role === 'main' && rebinds < MAX_REBINDS && (refusedCode === ACCOUNT_GONE
|
|
119
136
|
|| refusedCode === ACCOUNT_RESTING && wait && Date.now() - wait.since >= (owner.sessionRebindMs ?? SESSION_REBIND_MS))) {
|
|
120
137
|
owner.conversationGeneration = (owner.conversationGeneration ?? 0) + 1; rebinds += 1;
|
|
@@ -250,9 +267,27 @@ export function companyTurnRetryable(message) {
|
|
|
250
267
|
|
|
251
268
|
// True when the session retries company failures by code. A Pi whose session
|
|
252
269
|
// no longer has the hook keeps retry off rather than retrying by words.
|
|
253
|
-
|
|
270
|
+
// An answer cut because Studio or the way to it stopped answering (an
|
|
271
|
+
// update, a restart, the network) is asked again with no limit on how many
|
|
272
|
+
// times: each time after Studio's heartbeat says it is back (studio-link.mjs).
|
|
273
|
+
// Stop ends the wait. Other passing failures keep their two asks again.
|
|
274
|
+
export function enableCompanyTurnRetry(session, settings, link = null) {
|
|
254
275
|
if (typeof session?._isRetryableError !== 'function') return false;
|
|
255
|
-
|
|
276
|
+
const studio = message => !!link && message?.stopReason === 'error' && link.waits(failureCode(message.errorMessage));
|
|
277
|
+
session._isRetryableError = message => companyTurnRetryable(message) || studio(message);
|
|
256
278
|
settings.applyOverrides({ retry: { enabled: true, ...TURN_RETRY } });
|
|
279
|
+
const prepare = session._prepareRetry;
|
|
280
|
+
if (link && typeof prepare === 'function') session._prepareRetry = async function (message) {
|
|
281
|
+
if (!studio(message)) return prepare.call(this, message);
|
|
282
|
+
// Studio answers here and was not away lately (Agent Watch or Studio's
|
|
283
|
+
// connector failed on a running Studio): Pi's own asks again, as before.
|
|
284
|
+
if (!(await link.needed(failureCode(message.errorMessage)).catch(() => false))) return companyTurnRetryable(message) ? prepare.call(this, message) : false;
|
|
285
|
+
this._retryAttempt = 0; // a wait for Studio is not one of the two asks again
|
|
286
|
+
if (!(await prepare.call(this, message))) return false;
|
|
287
|
+
const controller = new AbortController(); this._retryAbortController = controller;
|
|
288
|
+
try { return !!(await link.waitUntilBack({ phase: 'model', code: failureCode(message.errorMessage), signal: controller.signal })) && !this._agentRunAbortRequested; }
|
|
289
|
+
catch { this._finishCancelledRetry?.(); return false; }
|
|
290
|
+
finally { if (this._retryAbortController === controller) this._retryAbortController = undefined; }
|
|
291
|
+
};
|
|
257
292
|
return true;
|
|
258
293
|
}
|
|
@@ -13,7 +13,7 @@ import { managedThinkingLevels, nearestLevel } from './capabilities.mjs';
|
|
|
13
13
|
import { nativeManagedModel, isVendor, piProvider, studioAPI, studioPath } from './native-catalog.mjs';
|
|
14
14
|
import { fetchOriginTool } from './repository-operation.mjs';
|
|
15
15
|
import { describeFailure, failureCode, failureText } from '../runtime/managed-failure.mjs';
|
|
16
|
-
import { enableCompanyTurnRetry, wrapRoleStreams } from './request-stream.mjs';
|
|
16
|
+
import { enableCompanyTurnRetry, wrapRoleStreams } from './request-stream.mjs'; import { StudioLink } from './studio-link.mjs';
|
|
17
17
|
import { trackToolFailures } from './tool-failures.mjs';
|
|
18
18
|
import { fastServed, fastSetter, fastState, recordFast, restoreFast } from './fast-mode.mjs';
|
|
19
19
|
import { runHelper } from './helper-run.mjs';
|
|
@@ -139,7 +139,7 @@ export class ManagedSession {
|
|
|
139
139
|
const loader = managedResourceLoader(api, { systemPrompt: () => BASE_PROMPT + referencePrompt(self.boundary.userHome) + TEST_PROMPT + servicesPrompt(self.boundary) + webPrompt(helperRoles(manifest)) + helperPrompt(helperRoles(self.manifest)) + workflowPrompt(workflowPolicy(self.manifest), self.checks), agentsFiles,
|
|
140
140
|
skills: self.resources.skills, prompts: self.resources.prompts, ...await inlineExtensions(api, sdk, self.cwd, terminalExtensions) });
|
|
141
141
|
const settings = api.SettingsManager.inMemory({ retry: { enabled: false, provider: { maxRetries: 0 } }, cacheWarming: 'off', enableInstallTelemetry: false, enableAnalytics: false, enableSkillCommands: true });
|
|
142
|
-
const manager = sessionManager ?? api.SessionManager.inMemory(self.cwd); attachMemory(self, manager, agentDir, g => verifyGrant(g, self.manifest, 'main'));
|
|
142
|
+
const manager = sessionManager ?? api.SessionManager.inMemory(self.cwd); attachMemory(self, manager, agentDir, g => verifyGrant(g, self.manifest, 'main')); self.studioLink = new StudioLink({ origin: self.origin, agentDir, notify: event => self.notify(event), ui: () => self.session?.extensionRunner?.getUIContext?.() });
|
|
143
143
|
const scope = scopeOf(self.origin, manifest);
|
|
144
144
|
const prior = manager.getEntries().filter(e => e.type === 'custom' && e.customType === 'agent-watch-scope').at(-1)?.data;
|
|
145
145
|
// Under another member or another Studio a conversation still opens and
|
|
@@ -167,7 +167,7 @@ export class ManagedSession {
|
|
|
167
167
|
self.extensionsResult = result.extensionsResult;
|
|
168
168
|
self.session = result.session;
|
|
169
169
|
self.session.managedExecution = true;
|
|
170
|
-
self.turnRetry = enableCompanyTurnRetry(self.session, settings);
|
|
170
|
+
self.turnRetry = enableCompanyTurnRetry(self.session, settings, self.studioLink);
|
|
171
171
|
// The member's access for this conversation: ask first, or Bypass (permission.mjs).
|
|
172
172
|
self.permission = restorePermission(manager); self.session.managedSetPermission = permissionSetter(self, manager);
|
|
173
173
|
// Fast mode, where the Harness allows it (fast-mode.mjs): off until the member turns it on.
|
|
@@ -199,7 +199,7 @@ export class ManagedSession {
|
|
|
199
199
|
};
|
|
200
200
|
self.review = manager.getEntries().filter(e => e.type === 'custom' && e.customType === 'agent-watch-review').at(-1)?.data ?? null;
|
|
201
201
|
const abort = self.session.abort.bind(self.session);
|
|
202
|
-
self.session.abort = async (...args) => { self.gateAbort?.abort(); if (self.activePrompt) self.stopRequested = true; return abort(...args); };
|
|
202
|
+
self.session.abort = async (...args) => { self.gateAbort?.abort(); self.studioLink?.cancel(); if (self.activePrompt) self.stopRequested = true; return abort(...args); };
|
|
203
203
|
// One member message is one turn, harness rounds included (checks, review,
|
|
204
204
|
// fixes after the answer, rounds that continue an unfinished checklist):
|
|
205
205
|
// listeners hear "settled" once, when it ends.
|