@piagent/platform 1.46.2 → 1.47.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 +40 -0
- package/docs/command-reference-vietnamese.md +2 -2
- package/docs/company-dev-commands.md +2 -1
- package/docs/distribution-standard.md +6 -6
- package/docs/mcp-and-tools.md +21 -1
- package/docs/operator-manual-vietnamese.md +7 -7
- package/docs/publishing-for-teams.md +3 -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/assets/search-en.json +1 -1
- package/docs-site/assets/search-vi.json +1 -1
- package/docs-site/benchmark.html +1 -1
- package/docs-site/commands.html +1 -1
- package/docs-site/content/en/mcp.html +8 -0
- package/docs-site/content/mcp.html +8 -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 +15 -15
- 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 +9 -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/update.html +3 -3
- package/docs-site/en/whats-new.html +79 -47
- package/docs-site/en/windows.html +1 -1
- package/docs-site/en/workflows.html +1 -1
- package/docs-site/index.html +15 -15
- 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 +9 -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/releases.json +98 -0
- 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/update.html +3 -3
- package/docs-site/whats-new.html +79 -47
- 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/extensions/piagent-guard.ts +2 -146
- package/packages/piagent-core/managed/command-tools.mjs +17 -3
- package/packages/piagent-core/managed/copies.mjs +14 -4
- package/packages/piagent-core/managed/member-mcp.mjs +71 -0
- package/packages/piagent-core/managed/memory-lessons.mjs +1 -1
- package/packages/piagent-core/managed/resource-loader.mjs +19 -7
- package/packages/piagent-core/managed/sandbox-diagnostic.mjs +4 -0
- package/packages/piagent-core/managed/session.mjs +5 -5
- package/packages/piagent-core/managed/simulator-commands.mjs +117 -0
- package/packages/piagent-core/mcp/mcp-server-catalog.js +18 -1
- package/packages/piagent-core/package.json +1 -1
- package/packages/piagent-core/runtime/managed-failure.mjs +0 -1
- package/packages/piagent-core/runtime/mcp-repository-gate.d.mts +10 -0
- package/packages/piagent-core/runtime/mcp-repository-gate.mjs +150 -0
- package/scripts/claude-model-additions.mjs +8 -1
- package/scripts/configure-model-scope.sh +6 -1
- package/scripts/install-global.sh +10 -4
- package/scripts/personal-pi-config.mjs +5 -2
- package/scripts/pi-models-json.mjs +13 -0
- package/scripts/setup.sh +1 -1
package/docs-site/mcp.html
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<span class="brand-mark"><img src="/assets/piagent-logo.svg" alt="" width="28" height="28" /></span>
|
|
38
38
|
<span class="brand-name"><b>Piagent</b> <span>Platform</span></span>
|
|
39
39
|
</a>
|
|
40
|
-
<a class="version-badge" href="/whats-new" data-docs-version="v1.
|
|
40
|
+
<a class="version-badge" href="/whats-new" data-docs-version="v1.47.0" title="v1.47.0 docs · VI"><span class="dot"></span>v1.47.0</a>
|
|
41
41
|
<nav class="top-nav" aria-label="Tài liệu">
|
|
42
42
|
<a href="/quickstart">Tài liệu</a>
|
|
43
43
|
<a href="/whats-new">Changelog</a>
|
|
@@ -203,6 +203,7 @@
|
|
|
203
203
|
<tr><td><span class="inline-code">web</span></td><td>Context7, Chrome DevTools, Playwright</td><td>FE/web workflow</td></tr>
|
|
204
204
|
<tr><td><span class="inline-code">core</span></td><td>Context7, Chrome DevTools, GitHub</td><td>Baseline mặc định của team</td></tr>
|
|
205
205
|
<tr><td><span class="inline-code">popular</span></td><td>core + Playwright + Figma</td><td>Baseline nhiều team dev dùng</td></tr>
|
|
206
|
+
<tr><td><span class="inline-code">atlassian</span></td><td>Atlassian Rovo (Jira, Confluence Cloud)</td><td>Issue Jira và trang Confluence, đăng nhập bằng tài khoản Atlassian của dev</td></tr>
|
|
206
207
|
<tr><td><span class="inline-code">all</span></td><td>popular + Figma desktop</td><td>Đầy đủ</td></tr>
|
|
207
208
|
</tbody>
|
|
208
209
|
</table>
|
|
@@ -216,6 +217,13 @@
|
|
|
216
217
|
</div>
|
|
217
218
|
</section>
|
|
218
219
|
|
|
220
|
+
<section class="section">
|
|
221
|
+
<h2 id="phien-cong-ty">Trong phiên công ty</h2>
|
|
222
|
+
<p>Phiên công ty (<span class="inline-code">piagent studio</span>, terminal và WebUI công ty) dùng chính các MCP server dev đã cài cho Piagent cá nhân: cùng <span class="inline-code">pi-mcp-adapter</span> trong <span class="inline-code">~/.piagent/agent</span>, cùng config và cùng login. Dev tự thêm server; Studio không quản lý danh sách này.</p>
|
|
223
|
+
<p>Với Jira: <span class="inline-code">piagent-mcp --preset atlassian</span>, rồi đăng nhập một lần bằng <span class="inline-code">/mcp-auth atlassian</span>.</p>
|
|
224
|
+
<p>Hai lớp bảo vệ vẫn giữ: server do repo khai báo chỉ chạy sau khi có người trên máy duyệt, và kết quả từ server tới agent dưới dạng dữ liệu trong vùng rào, không bao giờ là lệnh.</p>
|
|
225
|
+
</section>
|
|
226
|
+
|
|
219
227
|
<section class="section">
|
|
220
228
|
<h2 id="token">Token efficiency</h2>
|
|
221
229
|
<p><span class="inline-code">pi-mcp-adapter</span> đưa mọi server qua một proxy tool duy nhất tên <span class="inline-code">mcp</span>, thay vì nạp toàn bộ tool schema vào context lúc start. Mặc định <span class="inline-code">directTools: false</span>, cộng với <span class="inline-code">outputGuard</span> và <span class="inline-code">idleTimeout</span>.</p>
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<span class="brand-mark"><img src="/assets/piagent-logo.svg" alt="" width="28" height="28" /></span>
|
|
38
38
|
<span class="brand-name"><b>Piagent</b> <span>Platform</span></span>
|
|
39
39
|
</a>
|
|
40
|
-
<a class="version-badge" href="/whats-new" data-docs-version="v1.
|
|
40
|
+
<a class="version-badge" href="/whats-new" data-docs-version="v1.47.0" title="v1.47.0 docs · VI"><span class="dot"></span>v1.47.0</a>
|
|
41
41
|
<nav class="top-nav" aria-label="Tài liệu">
|
|
42
42
|
<a href="/quickstart">Tài liệu</a>
|
|
43
43
|
<a href="/whats-new">Changelog</a>
|
package/docs-site/profiles.html
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<span class="brand-mark"><img src="/assets/piagent-logo.svg" alt="" width="28" height="28" /></span>
|
|
38
38
|
<span class="brand-name"><b>Piagent</b> <span>Platform</span></span>
|
|
39
39
|
</a>
|
|
40
|
-
<a class="version-badge" href="/whats-new" data-docs-version="v1.
|
|
40
|
+
<a class="version-badge" href="/whats-new" data-docs-version="v1.47.0" title="v1.47.0 docs · VI"><span class="dot"></span>v1.47.0</a>
|
|
41
41
|
<nav class="top-nav" aria-label="Tài liệu">
|
|
42
42
|
<a href="/quickstart">Tài liệu</a>
|
|
43
43
|
<a href="/whats-new">Changelog</a>
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<span class="brand-mark"><img src="/assets/piagent-logo.svg" alt="" width="28" height="28" /></span>
|
|
38
38
|
<span class="brand-name"><b>Piagent</b> <span>Platform</span></span>
|
|
39
39
|
</a>
|
|
40
|
-
<a class="version-badge" href="/whats-new" data-docs-version="v1.
|
|
40
|
+
<a class="version-badge" href="/whats-new" data-docs-version="v1.47.0" title="v1.47.0 docs · VI"><span class="dot"></span>v1.47.0</a>
|
|
41
41
|
<nav class="top-nav" aria-label="Tài liệu">
|
|
42
42
|
<a href="/quickstart" aria-current="page">Tài liệu</a>
|
|
43
43
|
<a href="/whats-new">Changelog</a>
|
package/docs-site/releases.json
CHANGED
|
@@ -1,4 +1,102 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "1.47.0",
|
|
4
|
+
"date": "2026-10-29",
|
|
5
|
+
"status": "stable",
|
|
6
|
+
"title": {
|
|
7
|
+
"en": "Company sessions use your MCP servers and drive iOS and Android simulators",
|
|
8
|
+
"vi": "Phiên công ty dùng MCP server của bạn và điều khiển simulator iOS, Android"
|
|
9
|
+
},
|
|
10
|
+
"summary": {
|
|
11
|
+
"en": "Jira, GitHub and every MCP server you set up for Piagent now work in company sessions, and the agent builds, runs, screenshots and tests mobile apps on simulators itself.",
|
|
12
|
+
"vi": "Jira, GitHub và mọi MCP server bạn cài cho Piagent giờ dùng được trong phiên công ty, và agent tự build, chạy, chụp màn hình và test app mobile trên simulator."
|
|
13
|
+
},
|
|
14
|
+
"requires": null,
|
|
15
|
+
"items": [
|
|
16
|
+
{
|
|
17
|
+
"kind": "new",
|
|
18
|
+
"en": "Company sessions load the MCP servers set up for personal Piagent, with the same logins. Repository-defined servers still need approval; results reach the agent as data.",
|
|
19
|
+
"vi": "Phiên công ty nạp các MCP server đã cài cho Piagent cá nhân, dùng chung login. Server do repo khai báo vẫn cần duyệt; kết quả tới agent dưới dạng dữ liệu."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"kind": "new",
|
|
23
|
+
"en": "The atlassian preset adds Jira and Confluence Cloud: piagent-mcp --preset atlassian, then /mcp-auth atlassian with your own Atlassian login.",
|
|
24
|
+
"vi": "Preset atlassian thêm Jira và Confluence Cloud: piagent-mcp --preset atlassian, rồi /mcp-auth atlassian bằng tài khoản Atlassian của bạn."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"kind": "new",
|
|
28
|
+
"en": "run_on_simulator boots simulators, builds, installs and launches apps, runs XCUITest, takes screenshots and reads logs: xcrun simctl, xcodebuild, adb, emulator, gradlew, flutter, expo.",
|
|
29
|
+
"vi": "run_on_simulator boot simulator, build, cài và mở app, chạy XCUITest, chụp màn hình, đọc log: xcrun simctl, xcodebuild, adb, emulator, gradlew, flutter, expo."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"kind": "security",
|
|
33
|
+
"en": "run_on_simulator refuses other programs, ;, &, $( ) and files outside the project. Full access and Bypass run it, but still ask when a command reaches credentials.",
|
|
34
|
+
"vi": "run_on_simulator từ chối chương trình khác, ;, &, $( ) và file ngoài project. Full access và Bypass chạy luôn, nhưng vẫn hỏi khi lệnh đụng tới credentials."
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"version": "1.46.4",
|
|
40
|
+
"date": "2026-10-29",
|
|
41
|
+
"status": "stable",
|
|
42
|
+
"title": {
|
|
43
|
+
"en": "One subagent instead of a refused request; update reads a commented models.json",
|
|
44
|
+
"vi": "Một subagent thay vì bị chặn; bản cập nhật đọc được models.json có comment"
|
|
45
|
+
},
|
|
46
|
+
"summary": {
|
|
47
|
+
"en": "Company sessions no longer loop on a refused subagent call, and the update no longer stops when the Pi model list file has comments.",
|
|
48
|
+
"vi": "Session công ty không còn lặp lại lệnh gọi subagent bị chặn, và bản cập nhật không còn dừng khi file danh sách model của Pi có comment."
|
|
49
|
+
},
|
|
50
|
+
"requires": null,
|
|
51
|
+
"items": [
|
|
52
|
+
{
|
|
53
|
+
"kind": "fixed",
|
|
54
|
+
"en": "An agent asking for 2–3 subagents the member did not ask for was refused, and some models retried until the member stopped the turn. One subagent now runs, and the agent is told why.",
|
|
55
|
+
"vi": "Agent xin 2–3 subagent mà member không yêu cầu từng bị chặn, và một số model gọi lại liên tục đến khi member phải dừng. Giờ một subagent chạy, và agent được báo lý do."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"kind": "fixed",
|
|
59
|
+
"en": "piagent-update failed when models.json had // comments, which Pi allows. It reads the file as Pi does and leaves a commented file unchanged.",
|
|
60
|
+
"vi": "piagent-update lỗi khi models.json có comment //, dù Pi cho phép. Giờ file được đọc như Pi đọc, và file có comment được giữ nguyên."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"kind": "improved",
|
|
64
|
+
"en": "A model-list setup problem no longer stops the whole install: it warns, names the file and gives the command to run again.",
|
|
65
|
+
"vi": "Lỗi khi cấu hình danh sách model không còn làm dừng cả bản cài: bản cài cảnh báo, nêu tên file và lệnh để chạy lại."
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"version": "1.46.3",
|
|
71
|
+
"date": "2026-10-29",
|
|
72
|
+
"status": "unpublished",
|
|
73
|
+
"title": {
|
|
74
|
+
"en": "One subagent instead of a refused request; update reads a commented models.json",
|
|
75
|
+
"vi": "Một subagent thay vì bị chặn; bản cập nhật đọc được models.json có comment"
|
|
76
|
+
},
|
|
77
|
+
"summary": {
|
|
78
|
+
"en": "Tagged but not published: a release title over the page limit failed the release check. Superseded by 1.46.4.",
|
|
79
|
+
"vi": "Đã tag nhưng chưa publish: tiêu đề bản phát hành dài quá giới hạn của trang nên kiểm tra release fail. Thay bằng 1.46.4."
|
|
80
|
+
},
|
|
81
|
+
"requires": null,
|
|
82
|
+
"items": [
|
|
83
|
+
{
|
|
84
|
+
"kind": "fixed",
|
|
85
|
+
"en": "An agent asking for 2–3 subagents the member did not ask for was refused, and some models retried until the member stopped the turn. One subagent now runs, and the agent is told why.",
|
|
86
|
+
"vi": "Agent xin 2–3 subagent mà member không yêu cầu từng bị chặn, và một số model gọi lại liên tục đến khi member phải dừng. Giờ một subagent chạy, và agent được báo lý do."
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"kind": "fixed",
|
|
90
|
+
"en": "piagent-update failed when models.json had // comments, which Pi allows. It reads the file as Pi does and leaves a commented file unchanged.",
|
|
91
|
+
"vi": "piagent-update lỗi khi models.json có comment //, dù Pi cho phép. Giờ file được đọc như Pi đọc, và file có comment được giữ nguyên."
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"kind": "improved",
|
|
95
|
+
"en": "A model-list setup problem no longer stops the whole install: it warns, names the file and gives the command to run again.",
|
|
96
|
+
"vi": "Lỗi khi cấu hình danh sách model không còn làm dừng cả bản cài: bản cài cảnh báo, nêu tên file và lệnh để chạy lại."
|
|
97
|
+
}
|
|
98
|
+
]
|
|
99
|
+
},
|
|
2
100
|
{
|
|
3
101
|
"version": "1.46.2",
|
|
4
102
|
"date": "2026-10-29",
|
package/docs-site/runtime.html
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<span class="brand-mark"><img src="/assets/piagent-logo.svg" alt="" width="28" height="28" /></span>
|
|
38
38
|
<span class="brand-name"><b>Piagent</b> <span>Platform</span></span>
|
|
39
39
|
</a>
|
|
40
|
-
<a class="version-badge" href="/whats-new" data-docs-version="v1.
|
|
40
|
+
<a class="version-badge" href="/whats-new" data-docs-version="v1.47.0" title="v1.47.0 docs · VI"><span class="dot"></span>v1.47.0</a>
|
|
41
41
|
<nav class="top-nav" aria-label="Tài liệu">
|
|
42
42
|
<a href="/quickstart">Tài liệu</a>
|
|
43
43
|
<a href="/whats-new">Changelog</a>
|
package/docs-site/scope.html
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<span class="brand-mark"><img src="/assets/piagent-logo.svg" alt="" width="28" height="28" /></span>
|
|
38
38
|
<span class="brand-name"><b>Piagent</b> <span>Platform</span></span>
|
|
39
39
|
</a>
|
|
40
|
-
<a class="version-badge" href="/whats-new" data-docs-version="v1.
|
|
40
|
+
<a class="version-badge" href="/whats-new" data-docs-version="v1.47.0" title="v1.47.0 docs · VI"><span class="dot"></span>v1.47.0</a>
|
|
41
41
|
<nav class="top-nav" aria-label="Tài liệu">
|
|
42
42
|
<a href="/quickstart">Tài liệu</a>
|
|
43
43
|
<a href="/whats-new">Changelog</a>
|
package/docs-site/security.html
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<span class="brand-mark"><img src="/assets/piagent-logo.svg" alt="" width="28" height="28" /></span>
|
|
38
38
|
<span class="brand-name"><b>Piagent</b> <span>Platform</span></span>
|
|
39
39
|
</a>
|
|
40
|
-
<a class="version-badge" href="/whats-new" data-docs-version="v1.
|
|
40
|
+
<a class="version-badge" href="/whats-new" data-docs-version="v1.47.0" title="v1.47.0 docs · VI"><span class="dot"></span>v1.47.0</a>
|
|
41
41
|
<nav class="top-nav" aria-label="Tài liệu">
|
|
42
42
|
<a href="/quickstart">Tài liệu</a>
|
|
43
43
|
<a href="/whats-new">Changelog</a>
|
package/docs-site/team.html
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<span class="brand-mark"><img src="/assets/piagent-logo.svg" alt="" width="28" height="28" /></span>
|
|
38
38
|
<span class="brand-name"><b>Piagent</b> <span>Platform</span></span>
|
|
39
39
|
</a>
|
|
40
|
-
<a class="version-badge" href="/whats-new" data-docs-version="v1.
|
|
40
|
+
<a class="version-badge" href="/whats-new" data-docs-version="v1.47.0" title="v1.47.0 docs · VI"><span class="dot"></span>v1.47.0</a>
|
|
41
41
|
<nav class="top-nav" aria-label="Tài liệu">
|
|
42
42
|
<a href="/quickstart">Tài liệu</a>
|
|
43
43
|
<a href="/whats-new">Changelog</a>
|
package/docs-site/update.html
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<span class="brand-mark"><img src="/assets/piagent-logo.svg" alt="" width="28" height="28" /></span>
|
|
38
38
|
<span class="brand-name"><b>Piagent</b> <span>Platform</span></span>
|
|
39
39
|
</a>
|
|
40
|
-
<a class="version-badge" href="/whats-new" data-docs-version="v1.
|
|
40
|
+
<a class="version-badge" href="/whats-new" data-docs-version="v1.47.0" title="v1.47.0 docs · VI"><span class="dot"></span>v1.47.0</a>
|
|
41
41
|
<nav class="top-nav" aria-label="Tài liệu">
|
|
42
42
|
<a href="/quickstart">Tài liệu</a>
|
|
43
43
|
<a href="/whats-new">Changelog</a>
|
|
@@ -145,9 +145,9 @@
|
|
|
145
145
|
<h2 id="pin-cho-team">Pin một bản cho cả team</h2>
|
|
146
146
|
<p>Khi rollout cho team, cài đúng bản Pi host và đúng bản platform, rồi chạy installer ở chế độ stable. Bước <code>--dry-run</code> in ra những gì sẽ đổi.</p>
|
|
147
147
|
<div class="command-card">
|
|
148
|
-
<header><span>Cài pin theo bản</span><button class="clip-btn" data-clip="npm install -g --ignore-scripts @earendil-works/pi-coding-agent@1.3.0 npm install -g --ignore-scripts @piagent/platform@1.
|
|
148
|
+
<header><span>Cài pin theo bản</span><button class="clip-btn" data-clip="npm install -g --ignore-scripts @earendil-works/pi-coding-agent@1.3.0 npm install -g --ignore-scripts @piagent/platform@1.47.0 piagent-install --stable --dry-run piagent-install --stable">Lấy lệnh</button></header>
|
|
149
149
|
<pre><code>npm install -g --ignore-scripts @earendil-works/pi-coding-agent@1.3.0
|
|
150
|
-
npm install -g --ignore-scripts @piagent/platform@1.
|
|
150
|
+
npm install -g --ignore-scripts @piagent/platform@1.47.0
|
|
151
151
|
piagent-install --stable --dry-run
|
|
152
152
|
piagent-install --stable</code></pre>
|
|
153
153
|
</div>
|
package/docs-site/whats-new.html
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<span class="brand-mark"><img src="/assets/piagent-logo.svg" alt="" width="28" height="28" /></span>
|
|
38
38
|
<span class="brand-name"><b>Piagent</b> <span>Platform</span></span>
|
|
39
39
|
</a>
|
|
40
|
-
<a class="version-badge" href="/whats-new" data-docs-version="v1.
|
|
40
|
+
<a class="version-badge" href="/whats-new" data-docs-version="v1.47.0" title="v1.47.0 docs · VI"><span class="dot"></span>v1.47.0</a>
|
|
41
41
|
<nav class="top-nav" aria-label="Tài liệu">
|
|
42
42
|
<a href="/quickstart">Tài liệu</a>
|
|
43
43
|
<a href="/whats-new" aria-current="page">Changelog</a>
|
|
@@ -108,7 +108,44 @@
|
|
|
108
108
|
<div class="release-filter" role="toolbar" aria-label="Lọc theo loại thay đổi"><button type="button" data-filter-kind="all" aria-pressed="true">Tất cả</button><button type="button" data-filter-kind="new" aria-pressed="false">Mới</button><button type="button" data-filter-kind="improved" aria-pressed="false">Cải thiện</button><button type="button" data-filter-kind="fixed" aria-pressed="false">Sửa lỗi</button><button type="button" data-filter-kind="security" aria-pressed="false">Bảo mật</button></div>
|
|
109
109
|
<section class="section releases" data-releases>
|
|
110
110
|
<h2 id="latest" class="sr-only">Mới nhất</h2>
|
|
111
|
-
<article class="release latest" id="v1-
|
|
111
|
+
<article class="release latest" id="v1-47-0" data-release>
|
|
112
|
+
<div class="release-meta"><a class="release-version" href="#v1-47-0">v1.47.0</a><time class="release-date" datetime="2026-10-29">29/10/2026</time></div>
|
|
113
|
+
<div class="release-body">
|
|
114
|
+
<h3 data-toc-skip id="v1-47-0-title">Phiên công ty dùng MCP server của bạn và điều khiển simulator iOS, Android</h3>
|
|
115
|
+
<p>Jira, GitHub và mọi MCP server bạn cài cho Piagent giờ dùng được trong phiên công ty, và agent tự build, chạy, chụp màn hình và test app mobile trên simulator.</p>
|
|
116
|
+
<ul class="release-items">
|
|
117
|
+
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Phiên công ty nạp các MCP server đã cài cho Piagent cá nhân, dùng chung login. Server do repo khai báo vẫn cần duyệt; kết quả tới agent dưới dạng dữ liệu.</span></li>
|
|
118
|
+
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Preset atlassian thêm Jira và Confluence Cloud: piagent-mcp --preset atlassian, rồi /mcp-auth atlassian bằng tài khoản Atlassian của bạn.</span></li>
|
|
119
|
+
<li data-kind="new"><span class="kind kind-new">Mới</span><span>run_on_simulator boot simulator, build, cài và mở app, chạy XCUITest, chụp màn hình, đọc log: xcrun simctl, xcodebuild, adb, emulator, gradlew, flutter, expo.</span></li>
|
|
120
|
+
<li data-kind="security"><span class="kind kind-security">Bảo mật</span><span>run_on_simulator từ chối chương trình khác, ;, &, $( ) và file ngoài project. Full access và Bypass chạy luôn, nhưng vẫn hỏi khi lệnh đụng tới credentials.</span></li>
|
|
121
|
+
</ul>
|
|
122
|
+
</div>
|
|
123
|
+
</article>
|
|
124
|
+
<article class="release" id="v1-46-4" data-release>
|
|
125
|
+
<div class="release-meta"><a class="release-version" href="#v1-46-4">v1.46.4</a><time class="release-date" datetime="2026-10-29">29/10/2026</time></div>
|
|
126
|
+
<div class="release-body">
|
|
127
|
+
<h3 data-toc-skip id="v1-46-4-title">Một subagent thay vì bị chặn; bản cập nhật đọc được models.json có comment</h3>
|
|
128
|
+
<p>Session công ty không còn lặp lại lệnh gọi subagent bị chặn, và bản cập nhật không còn dừng khi file danh sách model của Pi có comment.</p>
|
|
129
|
+
<ul class="release-items">
|
|
130
|
+
<li data-kind="improved"><span class="kind kind-improved">Cải thiện</span><span>Lỗi khi cấu hình danh sách model không còn làm dừng cả bản cài: bản cài cảnh báo, nêu tên file và lệnh để chạy lại.</span></li>
|
|
131
|
+
<li data-kind="fixed"><span class="kind kind-fixed">Sửa lỗi</span><span>Agent xin 2–3 subagent mà member không yêu cầu từng bị chặn, và một số model gọi lại liên tục đến khi member phải dừng. Giờ một subagent chạy, và agent được báo lý do.</span></li>
|
|
132
|
+
<li data-kind="fixed"><span class="kind kind-fixed">Sửa lỗi</span><span>piagent-update lỗi khi models.json có comment //, dù Pi cho phép. Giờ file được đọc như Pi đọc, và file có comment được giữ nguyên.</span></li>
|
|
133
|
+
</ul>
|
|
134
|
+
</div>
|
|
135
|
+
</article>
|
|
136
|
+
<article class="release" id="v1-46-3" data-release>
|
|
137
|
+
<div class="release-meta"><a class="release-version" href="#v1-46-3">v1.46.3</a><time class="release-date" datetime="2026-10-29">29/10/2026</time></div>
|
|
138
|
+
<div class="release-body">
|
|
139
|
+
<h3 data-toc-skip id="v1-46-3-title">Một subagent thay vì bị chặn; bản cập nhật đọc được models.json có comment <span class="tag">không phát hành</span></h3>
|
|
140
|
+
<p>Đã tag nhưng chưa publish: tiêu đề bản phát hành dài quá giới hạn của trang nên kiểm tra release fail. Thay bằng 1.46.4.</p>
|
|
141
|
+
<ul class="release-items">
|
|
142
|
+
<li data-kind="improved"><span class="kind kind-improved">Cải thiện</span><span>Lỗi khi cấu hình danh sách model không còn làm dừng cả bản cài: bản cài cảnh báo, nêu tên file và lệnh để chạy lại.</span></li>
|
|
143
|
+
<li data-kind="fixed"><span class="kind kind-fixed">Sửa lỗi</span><span>Agent xin 2–3 subagent mà member không yêu cầu từng bị chặn, và một số model gọi lại liên tục đến khi member phải dừng. Giờ một subagent chạy, và agent được báo lý do.</span></li>
|
|
144
|
+
<li data-kind="fixed"><span class="kind kind-fixed">Sửa lỗi</span><span>piagent-update lỗi khi models.json có comment //, dù Pi cho phép. Giờ file được đọc như Pi đọc, và file có comment được giữ nguyên.</span></li>
|
|
145
|
+
</ul>
|
|
146
|
+
</div>
|
|
147
|
+
</article>
|
|
148
|
+
<article class="release" id="v1-46-2" data-release>
|
|
112
149
|
<div class="release-meta"><a class="release-version" href="#v1-46-2">v1.46.2</a><time class="release-date" datetime="2026-10-29">29/10/2026</time></div>
|
|
113
150
|
<div class="release-body">
|
|
114
151
|
<h3 data-toc-skip id="v1-46-2-title">Tin gửi sau câu trả lời hiện ngay; WebUI hiện chữ dần</h3>
|
|
@@ -381,56 +418,51 @@
|
|
|
381
418
|
</ul>
|
|
382
419
|
</div>
|
|
383
420
|
</article>
|
|
384
|
-
<article class="release" id="v1-41-0" data-release>
|
|
385
|
-
<div class="release-meta"><a class="release-version" href="#v1-41-0">v1.41.0</a><time class="release-date" datetime="2026-10-24">24/10/2026</time></div>
|
|
386
|
-
<div class="release-body">
|
|
387
|
-
<h3 data-toc-skip id="v1-41-0-title">Báo cáo thay đổi giao diện với ảnh trước/sau</h3>
|
|
388
|
-
<p>Skill mới biến task front-end thành báo cáo có ảnh trước/sau được khoanh khung, thay đổi business và logic, kết quả check, hiện ngay trên dashboard.</p>
|
|
389
|
-
<ul class="release-items">
|
|
390
|
-
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Skill <code>fe-change-report</code> chụp trang cũ và mới ở chế độ headless trên cùng dữ liệu, khoanh từng thay đổi bằng khung đỏ đánh số trên cả hai ảnh.</span></li>
|
|
391
|
-
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Agent chạy check của project và toàn bộ E2E headless, ghi rõ lỗi có từ trước, rồi viết lại thay đổi về business, logic và giao diện.</span></li>
|
|
392
|
-
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Tài liệu trên dashboard vẽ <code>reports/fe-change/<slug>/report.json</code> thành báo cáo, có phóng to từng khung, kích thước màn hình khác và toàn màn hình.</span></li>
|
|
393
|
-
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Script dùng Playwright có sẵn của project, không thêm dependency, và xuất một file <code>report.html</code> độc lập, không có script, để gửi cho bất kỳ ai.</span></li>
|
|
394
|
-
<li data-kind="security"><span class="kind kind-security">Bảo mật</span><span>Báo cáo được vẽ từ dữ liệu, không từ file HTML, và chỉ ảnh PNG của nó được trả về, nên dashboard vẫn không hiển thị markup do model tạo.</span></li>
|
|
395
|
-
</ul>
|
|
396
|
-
</div>
|
|
397
|
-
</article>
|
|
398
|
-
<article class="release" id="v1-40-0" data-release>
|
|
399
|
-
<div class="release-meta"><a class="release-version" href="#v1-40-0">v1.40.0</a><time class="release-date" datetime="2026-10-24">24/10/2026</time></div>
|
|
400
|
-
<div class="release-body">
|
|
401
|
-
<h3 data-toc-skip id="v1-40-0-title">Project local cũng được báo cho Studio</h3>
|
|
402
|
-
<p>Cuộc trò chuyện công ty trong thư mục không có remote báo project local cho Studio, mọi lượt chạy đều báo, và member thấy mọi loại cảnh báo project.</p>
|
|
403
|
-
<ul class="release-items">
|
|
404
|
-
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Thư mục không có remote đọc được được báo như project local, theo commit gốc của Git hoặc theo mã băm; đường dẫn không bao giờ rời khỏi máy.</span></li>
|
|
405
|
-
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Key local của project Git giống nhau trên mọi máy có cùng lịch sử, kể cả bản clone và checkout không có remote <code>origin</code>.</span></li>
|
|
406
|
-
<li data-kind="improved"><span class="kind kind-improved">Cải thiện</span><span>Mọi lượt chạy đều báo project, không chỉ lượt đầu của cuộc trò chuyện, nên Studio đếm được từng lần dùng và biết máy nào chưa bao giờ báo.</span></li>
|
|
407
|
-
<li data-kind="improved"><span class="kind kind-improved">Cải thiện</span><span>Member thấy một dòng cho mọi cảnh báo: project của team khác, ngoài danh sách của team, chưa đăng ký cho team, hoặc thư mục không đọc được.</span></li>
|
|
408
|
-
<li data-kind="improved"><span class="kind kind-improved">Cải thiện</span><span>Thư mục chứa nhiều checkout báo từng checkout, tối đa sáu, và project local được gọi theo tên thư mục.</span></li>
|
|
409
|
-
<li data-kind="security"><span class="kind kind-security">Bảo mật</span><span>Ba cảnh báo bảo mật của dependency trong Pi host được chấp nhận tới 2026-11-07: từ chối dịch vụ và lỗi Pi không dùng tới, không lộ dữ liệu.</span></li>
|
|
410
|
-
</ul>
|
|
411
|
-
<p class="release-requires"><strong>Cần:</strong> Agent Studio 0.40.0</p>
|
|
412
|
-
</div>
|
|
413
|
-
</article>
|
|
414
|
-
<article class="release" id="v1-39-0" data-release>
|
|
415
|
-
<div class="release-meta"><a class="release-version" href="#v1-39-0">v1.39.0</a><time class="release-date" datetime="2026-10-23">23/10/2026</time></div>
|
|
416
|
-
<div class="release-body">
|
|
417
|
-
<h3 data-toc-skip id="v1-39-0-title">Cảnh báo khi key của team được dùng ngoài team</h3>
|
|
418
|
-
<p>Studio biết cuộc trò chuyện công ty làm trong repository nào và cảnh báo khi key của team bị dùng ngoài team; dashboard giữ ngôn ngữ và theme màu.</p>
|
|
419
|
-
<ul class="release-items">
|
|
420
|
-
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Cuộc trò chuyện công ty báo cho Studio các repository đang làm, dùng cùng key <code>host/path</code> mà team memory đã gửi.</span></li>
|
|
421
|
-
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Admin thấy cảnh báo trong Logs → "Sai project"; member thấy một dòng nhắc phía trên ô soạn tin và trong <code>piagent studio</code>.</span></li>
|
|
422
|
-
<li data-kind="improved"><span class="kind kind-improved">Cải thiện</span><span>Không có gì bị chặn, và team memory chạy như cũ.</span></li>
|
|
423
|
-
<li data-kind="fixed"><span class="kind kind-fixed">Sửa lỗi</span><span>Dashboard trước đây quay về ngôn ngữ và theme màu mặc định sau mỗi lần khởi động lại; giờ nó giữ cả hai.</span></li>
|
|
424
|
-
</ul>
|
|
425
|
-
<p class="release-requires"><strong>Cần:</strong> Agent Studio 0.39.0</p>
|
|
426
|
-
</div>
|
|
427
|
-
</article>
|
|
428
421
|
</section>
|
|
429
422
|
<section class="section archive">
|
|
430
423
|
<h2 id="archive">Các bản trước</h2>
|
|
431
424
|
<p class="section-lead">Bản cũ hơn, gom theo tháng. Mở một tháng để xem từng thay đổi.</p>
|
|
432
425
|
<details class="release-archive">
|
|
433
|
-
<summary><span>Tháng 10/2026</span><span class="archive-count">
|
|
426
|
+
<summary><span>Tháng 10/2026</span><span class="archive-count">62</span></summary>
|
|
427
|
+
<div class="archive-row" id="v1-41-0">
|
|
428
|
+
<div class="archive-head"><a class="release-version" href="#v1-41-0">v1.41.0</a> <span class="release-date">24/10/2026</span></div>
|
|
429
|
+
<div class="archive-body">
|
|
430
|
+
<p><strong>Báo cáo thay đổi giao diện với ảnh trước/sau</strong> — Skill mới biến task front-end thành báo cáo có ảnh trước/sau được khoanh khung, thay đổi business và logic, kết quả check, hiện ngay trên dashboard.</p>
|
|
431
|
+
<ul class="release-items">
|
|
432
|
+
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Skill <code>fe-change-report</code> chụp trang cũ và mới ở chế độ headless trên cùng dữ liệu, khoanh từng thay đổi bằng khung đỏ đánh số trên cả hai ảnh.</span></li>
|
|
433
|
+
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Agent chạy check của project và toàn bộ E2E headless, ghi rõ lỗi có từ trước, rồi viết lại thay đổi về business, logic và giao diện.</span></li>
|
|
434
|
+
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Tài liệu trên dashboard vẽ <code>reports/fe-change/<slug>/report.json</code> thành báo cáo, có phóng to từng khung, kích thước màn hình khác và toàn màn hình.</span></li>
|
|
435
|
+
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Script dùng Playwright có sẵn của project, không thêm dependency, và xuất một file <code>report.html</code> độc lập, không có script, để gửi cho bất kỳ ai.</span></li>
|
|
436
|
+
<li data-kind="security"><span class="kind kind-security">Bảo mật</span><span>Báo cáo được vẽ từ dữ liệu, không từ file HTML, và chỉ ảnh PNG của nó được trả về, nên dashboard vẫn không hiển thị markup do model tạo.</span></li>
|
|
437
|
+
</ul>
|
|
438
|
+
</div>
|
|
439
|
+
</div>
|
|
440
|
+
<div class="archive-row" id="v1-40-0">
|
|
441
|
+
<div class="archive-head"><a class="release-version" href="#v1-40-0">v1.40.0</a> <span class="release-date">24/10/2026</span></div>
|
|
442
|
+
<div class="archive-body">
|
|
443
|
+
<p><strong>Project local cũng được báo cho Studio</strong> — Cuộc trò chuyện công ty trong thư mục không có remote báo project local cho Studio, mọi lượt chạy đều báo, và member thấy mọi loại cảnh báo project.</p>
|
|
444
|
+
<ul class="release-items">
|
|
445
|
+
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Thư mục không có remote đọc được được báo như project local, theo commit gốc của Git hoặc theo mã băm; đường dẫn không bao giờ rời khỏi máy.</span></li>
|
|
446
|
+
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Key local của project Git giống nhau trên mọi máy có cùng lịch sử, kể cả bản clone và checkout không có remote <code>origin</code>.</span></li>
|
|
447
|
+
<li data-kind="improved"><span class="kind kind-improved">Cải thiện</span><span>Mọi lượt chạy đều báo project, không chỉ lượt đầu của cuộc trò chuyện, nên Studio đếm được từng lần dùng và biết máy nào chưa bao giờ báo.</span></li>
|
|
448
|
+
<li data-kind="improved"><span class="kind kind-improved">Cải thiện</span><span>Member thấy một dòng cho mọi cảnh báo: project của team khác, ngoài danh sách của team, chưa đăng ký cho team, hoặc thư mục không đọc được.</span></li>
|
|
449
|
+
<li data-kind="improved"><span class="kind kind-improved">Cải thiện</span><span>Thư mục chứa nhiều checkout báo từng checkout, tối đa sáu, và project local được gọi theo tên thư mục.</span></li>
|
|
450
|
+
<li data-kind="security"><span class="kind kind-security">Bảo mật</span><span>Ba cảnh báo bảo mật của dependency trong Pi host được chấp nhận tới 2026-11-07: từ chối dịch vụ và lỗi Pi không dùng tới, không lộ dữ liệu.</span></li>
|
|
451
|
+
</ul>
|
|
452
|
+
</div>
|
|
453
|
+
</div>
|
|
454
|
+
<div class="archive-row" id="v1-39-0">
|
|
455
|
+
<div class="archive-head"><a class="release-version" href="#v1-39-0">v1.39.0</a> <span class="release-date">23/10/2026</span></div>
|
|
456
|
+
<div class="archive-body">
|
|
457
|
+
<p><strong>Cảnh báo khi key của team được dùng ngoài team</strong> — Studio biết cuộc trò chuyện công ty làm trong repository nào và cảnh báo khi key của team bị dùng ngoài team; dashboard giữ ngôn ngữ và theme màu.</p>
|
|
458
|
+
<ul class="release-items">
|
|
459
|
+
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Cuộc trò chuyện công ty báo cho Studio các repository đang làm, dùng cùng key <code>host/path</code> mà team memory đã gửi.</span></li>
|
|
460
|
+
<li data-kind="new"><span class="kind kind-new">Mới</span><span>Admin thấy cảnh báo trong Logs → "Sai project"; member thấy một dòng nhắc phía trên ô soạn tin và trong <code>piagent studio</code>.</span></li>
|
|
461
|
+
<li data-kind="improved"><span class="kind kind-improved">Cải thiện</span><span>Không có gì bị chặn, và team memory chạy như cũ.</span></li>
|
|
462
|
+
<li data-kind="fixed"><span class="kind kind-fixed">Sửa lỗi</span><span>Dashboard trước đây quay về ngôn ngữ và theme màu mặc định sau mỗi lần khởi động lại; giờ nó giữ cả hai.</span></li>
|
|
463
|
+
</ul>
|
|
464
|
+
</div>
|
|
465
|
+
</div>
|
|
434
466
|
<div class="archive-row" id="v1-38-2">
|
|
435
467
|
<div class="archive-head"><a class="release-version" href="#v1-38-2">v1.38.2</a> <span class="release-date">23/10/2026</span></div>
|
|
436
468
|
<div class="archive-body">
|
package/docs-site/windows.html
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<span class="brand-mark"><img src="/assets/piagent-logo.svg" alt="" width="28" height="28" /></span>
|
|
38
38
|
<span class="brand-name"><b>Piagent</b> <span>Platform</span></span>
|
|
39
39
|
</a>
|
|
40
|
-
<a class="version-badge" href="/whats-new" data-docs-version="v1.
|
|
40
|
+
<a class="version-badge" href="/whats-new" data-docs-version="v1.47.0" title="v1.47.0 docs · VI"><span class="dot"></span>v1.47.0</a>
|
|
41
41
|
<nav class="top-nav" aria-label="Tài liệu">
|
|
42
42
|
<a href="/quickstart">Tài liệu</a>
|
|
43
43
|
<a href="/whats-new">Changelog</a>
|
package/docs-site/workflows.html
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<span class="brand-mark"><img src="/assets/piagent-logo.svg" alt="" width="28" height="28" /></span>
|
|
38
38
|
<span class="brand-name"><b>Piagent</b> <span>Platform</span></span>
|
|
39
39
|
</a>
|
|
40
|
-
<a class="version-badge" href="/whats-new" data-docs-version="v1.
|
|
40
|
+
<a class="version-badge" href="/whats-new" data-docs-version="v1.47.0" title="v1.47.0 docs · VI"><span class="dot"></span>v1.47.0</a>
|
|
41
41
|
<nav class="top-nav" aria-label="Tài liệu">
|
|
42
42
|
<a href="/quickstart">Tài liệu</a>
|
|
43
43
|
<a href="/whats-new">Changelog</a>
|
|
@@ -256,8 +256,8 @@
|
|
|
256
256
|
},
|
|
257
257
|
{
|
|
258
258
|
"path": "tests",
|
|
259
|
-
"fileCount":
|
|
260
|
-
"sha256": "
|
|
259
|
+
"fileCount": 638,
|
|
260
|
+
"sha256": "74109d76ee46eeb519070b53699a7e582a3705c74030e9ca067242566afbb5df"
|
|
261
261
|
}
|
|
262
262
|
],
|
|
263
263
|
"custodianComparisonRules": {
|
package/package.json
CHANGED
|
@@ -38,15 +38,8 @@ import {
|
|
|
38
38
|
import { detectProfileName } from "./project-shape.js";
|
|
39
39
|
import { evaluateUpdateCheck, isInstalledPlatform, readUpdateCache, startUpdateProbe } from "./update-check.js";
|
|
40
40
|
import { dormantInPersonalPi, personalPiAgentDir } from "./agent-home.js";
|
|
41
|
-
import {
|
|
42
|
-
|
|
43
|
-
collectServers,
|
|
44
|
-
configPathForScope,
|
|
45
|
-
mcpDecisionInputs,
|
|
46
|
-
unverifiableMcpConfig
|
|
47
|
-
} from "../mcp/mcp-config-layers.js";
|
|
48
|
-
import { attributeDirectTool } from "../mcp/mcp-tool-naming.js";
|
|
49
|
-
import { approvalState } from "../mcp/mcp-approval-store.js";
|
|
41
|
+
import { collectServers } from "../mcp/mcp-config-layers.js";
|
|
42
|
+
import { evaluateMcpApproval, mcpApprovalCache } from "../runtime/mcp-repository-gate.mjs";
|
|
50
43
|
import { evaluateServerReadiness, readinessNotice } from "../mcp/mcp-auth-readiness.js";
|
|
51
44
|
import * as mcpActions from "../mcp/mcp-command-actions.js";
|
|
52
45
|
import { buildExtendingProfile, resolveProjectProfileDocument } from "../capabilities/project-profile.js";
|
|
@@ -1789,143 +1782,6 @@ function prepareToolInputForPolicy(
|
|
|
1789
1782
|
};
|
|
1790
1783
|
}
|
|
1791
1784
|
|
|
1792
|
-
// Which MCP server a tool call is addressed to. The adapter exposes one proxy
|
|
1793
|
-
// tool named `mcp` that carries the server in `input.server`, and, under
|
|
1794
|
-
// directTools, one tool per server tool named `<prefix>_<tool>` where the prefix
|
|
1795
|
-
// is derived from the server name. Direct names are matched against the servers
|
|
1796
|
-
// this gate is holding rather than against a fixed pattern, because the prefix
|
|
1797
|
-
// is the server's own name and there is nothing constant to anchor on.
|
|
1798
|
-
function mcpServerFromToolCall(
|
|
1799
|
-
toolName: string,
|
|
1800
|
-
input: Record<string, unknown>,
|
|
1801
|
-
candidates: Iterable<string>
|
|
1802
|
-
): string | undefined {
|
|
1803
|
-
if (normalizeActionToken(toolName) === "mcp") {
|
|
1804
|
-
return typeof input.server === "string" && input.server.trim() ? input.server.trim() : undefined;
|
|
1805
|
-
}
|
|
1806
|
-
return attributeDirectTool(toolName, candidates);
|
|
1807
|
-
}
|
|
1808
|
-
|
|
1809
|
-
// Servers a repository defines are not usable until somebody on this machine has
|
|
1810
|
-
// approved them. This is the enforcement point: the adapter owns the connection
|
|
1811
|
-
// and this extension cannot prevent one being opened, but no tool call reaches an
|
|
1812
|
-
// unapproved server. The residual exposure is the connection itself, which is
|
|
1813
|
-
// worth stating plainly rather than describing this as a full block.
|
|
1814
|
-
//
|
|
1815
|
-
// Recomputed only when one of the files behind the decision changes, because
|
|
1816
|
-
// this runs on every tool call.
|
|
1817
|
-
interface RepositoryMcpGate {
|
|
1818
|
-
blocked: Map<string, { state: string; origin: string }>; serverNames: Set<string>;
|
|
1819
|
-
// Conditions under which no tool call can be checked at all, each with the
|
|
1820
|
-
// sentence to show. These are not "a server is unapproved" — they are "this
|
|
1821
|
-
// repository's config has put the gate in a state where it cannot tell which
|
|
1822
|
-
// server a call belongs to", and the only sound answer to that is to stop.
|
|
1823
|
-
unverifiable: string[];
|
|
1824
|
-
}
|
|
1825
|
-
|
|
1826
|
-
const mcpApprovalCache = new Map<string, { signature: string; gate: RepositoryMcpGate }>();
|
|
1827
|
-
|
|
1828
|
-
function repositoryMcpGate(cwd: string): RepositoryMcpGate {
|
|
1829
|
-
// Repository scopes plus anything an `imports` key drags in from a file the
|
|
1830
|
-
// clone carries. Collecting those here is the whole point: a server the gate
|
|
1831
|
-
// never enumerates is a server it silently permits.
|
|
1832
|
-
const servers = collectServers({ projectPath: cwd, scopes: [...REPOSITORY_SCOPES] });
|
|
1833
|
-
const repositoryFiles = [...REPOSITORY_SCOPES].map((scope) => ({
|
|
1834
|
-
scope,
|
|
1835
|
-
file: configPathForScope(scope, { projectPath: cwd })
|
|
1836
|
-
}));
|
|
1837
|
-
// Every file the decision reads, listed by the module that reads them rather
|
|
1838
|
-
// than restated here. Building this by hand is what went wrong: the scan grew
|
|
1839
|
-
// to read merged settings from all four scopes and to stat import targets
|
|
1840
|
-
// outside the repository, the hand-written list did not, and an already-loaded
|
|
1841
|
-
// guard went on permitting calls after a personal global config had put the
|
|
1842
|
-
// session in the state this gate exists to refuse.
|
|
1843
|
-
const signature = [
|
|
1844
|
-
...servers.map((server) => `${server.origin}:${server.name}:${fileSignature(server.file)}`),
|
|
1845
|
-
...repositoryFiles.map((layer) => `layer:${layer.scope}:${fileSignature(layer.file)}`),
|
|
1846
|
-
...mcpDecisionInputs({ projectPath: cwd }).map((file) => `input:${file}:${fileSignature(file)}`),
|
|
1847
|
-
`store:${fileSignature(path.join(os.homedir(), ".pi", "piagent-mcp-approvals.json"))}`
|
|
1848
|
-
].join("|");
|
|
1849
|
-
const cached = mcpApprovalCache.get(cwd);
|
|
1850
|
-
if (cached?.signature === signature) return cached.gate;
|
|
1851
|
-
|
|
1852
|
-
const blocked = new Map<string, { state: string; origin: string }>();
|
|
1853
|
-
for (const server of servers) {
|
|
1854
|
-
const state = approvalState({ projectPath: cwd, name: server.name, entry: server.entry });
|
|
1855
|
-
if (state.state === "approved") continue;
|
|
1856
|
-
// A name defined more than once keeps its blocking entry: the approved copy
|
|
1857
|
-
// does not vouch for the one nobody has looked at.
|
|
1858
|
-
blocked.set(server.name, { state: state.state, origin: server.origin });
|
|
1859
|
-
}
|
|
1860
|
-
|
|
1861
|
-
// Two things a repository-carried config can do that leave nothing to check.
|
|
1862
|
-
//
|
|
1863
|
-
// It can ask for tools with no prefix, so a direct tool arrives under a bare
|
|
1864
|
-
// name carrying no evidence of its server. Refusing only the proxy there was
|
|
1865
|
-
// not a fix: the proxy is the one form that names its server, so blocking it
|
|
1866
|
-
// and allowing the bare names left the hole exactly where it was.
|
|
1867
|
-
//
|
|
1868
|
-
// It can also import a kind whose config this platform cannot enumerate, and
|
|
1869
|
-
// then the set of servers reaching the session is simply unknown. Blocking the
|
|
1870
|
-
// servers that could be listed says nothing about the ones that could not.
|
|
1871
|
-
//
|
|
1872
|
-
// Both stop every tool call. A repository can make a session refuse to run;
|
|
1873
|
-
// it must not be able to make one run a server nobody approved.
|
|
1874
|
-
// Read from the shared module rather than decided here, so `piagent-mcp
|
|
1875
|
-
// doctor` reports exactly what this refuses. The two disagreeing is how an
|
|
1876
|
-
// operator ends up reading "PASS" while every tool call is being stopped.
|
|
1877
|
-
const unverifiable = unverifiableMcpConfig({ projectPath: cwd }).map((problem) => problem.detail);
|
|
1878
|
-
|
|
1879
|
-
const gate = { blocked, serverNames: new Set(servers.map((server) => server.name)), unverifiable };
|
|
1880
|
-
mcpApprovalCache.set(cwd, { signature, gate });
|
|
1881
|
-
return gate;
|
|
1882
|
-
}
|
|
1883
|
-
|
|
1884
|
-
function fileSignature(file: string): string {
|
|
1885
|
-
try {
|
|
1886
|
-
const stat = fs.statSync(file);
|
|
1887
|
-
return `${stat.mtimeMs}:${stat.size}`;
|
|
1888
|
-
} catch {
|
|
1889
|
-
return "absent";
|
|
1890
|
-
}
|
|
1891
|
-
}
|
|
1892
|
-
|
|
1893
|
-
function evaluateMcpApproval(
|
|
1894
|
-
cwd: string,
|
|
1895
|
-
toolName: string,
|
|
1896
|
-
input: Record<string, unknown>
|
|
1897
|
-
): { block: boolean; reason?: string } {
|
|
1898
|
-
const gate = repositoryMcpGate(cwd);
|
|
1899
|
-
|
|
1900
|
-
// Every tool call, not only the ones that look like MCP. Under either of these
|
|
1901
|
-
// conditions a call cannot be traced to a server, so there is no such thing as
|
|
1902
|
-
// a call this gate can clear.
|
|
1903
|
-
if (gate.unverifiable.length > 0) {
|
|
1904
|
-
return { block: true, reason: `Blocked every tool call: ${gate.unverifiable.join(" ")}` };
|
|
1905
|
-
}
|
|
1906
|
-
|
|
1907
|
-
const server = mcpServerFromToolCall(toolName, input, gate.blocked.keys());
|
|
1908
|
-
if (!server) return { block: false };
|
|
1909
|
-
const record = gate.blocked.get(server);
|
|
1910
|
-
if (!record) return { block: false };
|
|
1911
|
-
const explanation = record.state === "rejected"
|
|
1912
|
-
? "it was rejected for this project"
|
|
1913
|
-
: record.state === "changed"
|
|
1914
|
-
? "its definition changed since it was approved"
|
|
1915
|
-
: record.origin.startsWith("import:")
|
|
1916
|
-
? `this repository imports it from ${record.origin.slice("import:".length)} config and nobody on this machine has approved it here`
|
|
1917
|
-
: "this repository defines it and nobody on this machine has approved it";
|
|
1918
|
-
return {
|
|
1919
|
-
block: true,
|
|
1920
|
-
// Named as commands, because this is read inside a session: the reader can
|
|
1921
|
-
// run these where they already are, without shelling out.
|
|
1922
|
-
reason:
|
|
1923
|
-
`Blocked MCP server ${server}: ${explanation}. ` +
|
|
1924
|
-
`Review it with \`/piagent-mcp get ${server}\`, then \`/piagent-mcp approve ${server}\` to allow it ` +
|
|
1925
|
-
`or \`/piagent-mcp reject ${server}\` to refuse it.`
|
|
1926
|
-
};
|
|
1927
|
-
}
|
|
1928
|
-
|
|
1929
1785
|
// A word whose final path segment glues literal text onto an expansion --
|
|
1930
1786
|
// `.en$(echo v)`, `${D}.env` -- names a file this process cannot know without
|
|
1931
1787
|
// running the substitution. Matching the literal half against the protected
|