@piagent/platform 1.7.1 → 1.8.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 (71) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +2 -2
  3. package/README.vi.md +2 -2
  4. package/docs/command-reference-vietnamese.md +3 -3
  5. package/docs/distribution-standard.md +9 -9
  6. package/docs/languages.json +2 -2
  7. package/docs/model-options.md +20 -15
  8. package/docs/operator-manual-vietnamese.md +10 -10
  9. package/docs/publishing-for-teams.md +1 -0
  10. package/docs/quickstart-vietnamese.md +1 -1
  11. package/docs/release-install-policy.md +15 -11
  12. package/docs/team-onboarding.md +7 -7
  13. package/docs-site/architecture.html +1 -1
  14. package/docs-site/benchmark.html +1 -1
  15. package/docs-site/commands.html +1 -1
  16. package/docs-site/content/en/runtime.html +1 -1
  17. package/docs-site/content/en/whats-new.html +12 -0
  18. package/docs-site/content/runtime.html +2 -2
  19. package/docs-site/content/whats-new.html +12 -0
  20. package/docs-site/context-engine.html +1 -1
  21. package/docs-site/en/architecture.html +1 -1
  22. package/docs-site/en/benchmark.html +1 -1
  23. package/docs-site/en/commands.html +1 -1
  24. package/docs-site/en/context-engine.html +1 -1
  25. package/docs-site/en/index.html +1 -1
  26. package/docs-site/en/mcp-approval.html +1 -1
  27. package/docs-site/en/mcp-auth.html +1 -1
  28. package/docs-site/en/mcp-servers.html +1 -1
  29. package/docs-site/en/mcp.html +1 -1
  30. package/docs-site/en/permissions.html +1 -1
  31. package/docs-site/en/profiles.html +1 -1
  32. package/docs-site/en/quickstart.html +1 -1
  33. package/docs-site/en/runtime.html +2 -2
  34. package/docs-site/en/scope.html +1 -1
  35. package/docs-site/en/security.html +1 -1
  36. package/docs-site/en/team.html +1 -1
  37. package/docs-site/en/whats-new.html +13 -1
  38. package/docs-site/en/workflows.html +1 -1
  39. package/docs-site/index.html +1 -1
  40. package/docs-site/mcp-approval.html +1 -1
  41. package/docs-site/mcp-auth.html +1 -1
  42. package/docs-site/mcp-servers.html +1 -1
  43. package/docs-site/mcp.html +1 -1
  44. package/docs-site/permissions.html +1 -1
  45. package/docs-site/profiles.html +1 -1
  46. package/docs-site/quickstart.html +1 -1
  47. package/docs-site/runtime.html +3 -3
  48. package/docs-site/scope.html +1 -1
  49. package/docs-site/security.html +1 -1
  50. package/docs-site/team.html +1 -1
  51. package/docs-site/whats-new.html +13 -1
  52. package/docs-site/workflows.html +1 -1
  53. package/evals/private-holdout-v1/public-exposure.v2.json +1 -1
  54. package/package.json +3 -3
  55. package/packages/piagent-core/package.json +2 -2
  56. package/packages/piagent-core/runtime/inspection/same-process-bridge-proof.ts +1 -1
  57. package/packages/piagent-core/runtime/inspection/webui-snapshot.ts +1 -1
  58. package/packages/piagent-core/runtime/model/model-route-policy.ts +33 -13
  59. package/packages/piagent-core/runtime/model/model-route-types.ts +10 -6
  60. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-DGk34zJT.js → MarkdownMessage-DMU7Xe_O.js} +1 -1
  61. package/packages/piagent-webui/dist/client/assets/{index-DiKRmCEP.js → index-Cui9AAV_.js} +2 -2
  62. package/packages/piagent-webui/dist/client/index.html +1 -1
  63. package/packages/piagent-webui/gateway/session-inspection-registry.ts +3 -4
  64. package/scripts/configure-model-scope.sh +6 -2
  65. package/scripts/install-global.sh +2 -2
  66. package/scripts/model-route-evaluation-core.ts +1 -0
  67. package/scripts/pi-model-route.mjs +1 -1
  68. package/scripts/setup.sh +2 -2
  69. package/scripts/verify-local.sh +3 -3
  70. package/scripts/verify-release-identity.mjs +1 -1
  71. package/templates/global/settings.json +5 -1
@@ -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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.0 docs · EN</span>
34
34
  <nav class="language-switch" aria-label="Language">
35
35
  <a class="language-option" href="/mcp-approval" hreflang="vi" lang="vi">VI</a>
36
36
  <a class="language-option current" href="/en/mcp-approval" 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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.0 docs · EN</span>
34
34
  <nav class="language-switch" aria-label="Language">
35
35
  <a class="language-option" href="/mcp-auth" hreflang="vi" lang="vi">VI</a>
36
36
  <a class="language-option current" href="/en/mcp-auth" 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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.0 docs · EN</span>
34
34
  <nav class="language-switch" aria-label="Language">
35
35
  <a class="language-option" href="/mcp-servers" hreflang="vi" lang="vi">VI</a>
36
36
  <a class="language-option current" href="/en/mcp-servers" 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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.0 docs · EN</span>
34
34
  <nav class="language-switch" aria-label="Language">
35
35
  <a class="language-option" href="/mcp" hreflang="vi" lang="vi">VI</a>
36
36
  <a class="language-option current" href="/en/mcp" 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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.0 docs · EN</span>
34
34
  <nav class="language-switch" aria-label="Language">
35
35
  <a class="language-option" href="/permissions" hreflang="vi" lang="vi">VI</a>
36
36
  <a class="language-option current" href="/en/permissions" 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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.0 docs · EN</span>
34
34
  <nav class="language-switch" aria-label="Language">
35
35
  <a class="language-option" href="/profiles" hreflang="vi" lang="vi">VI</a>
36
36
  <a class="language-option current" href="/en/profiles" 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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.0 docs · EN</span>
34
34
  <nav class="language-switch" aria-label="Language">
35
35
  <a class="language-option" href="/quickstart" hreflang="vi" lang="vi">VI</a>
36
36
  <a class="language-option current" href="/en/quickstart" 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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -105,7 +105,7 @@
105
105
  <section class="section">
106
106
  <div class="command-grid">
107
107
  <article class="command-card"><header><span>Global setup</span><button class="clip-btn" data-clip="piagent-setup --mcp-preset core --subagents-preset safe">Copy</button></header><pre><code>piagent-setup --mcp-preset core --subagents-preset safe</code></pre></article>
108
- <article class="command-card"><header><span>Full update</span><button class="clip-btn" data-clip="npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.86.1&#10;npm install -g --ignore-scripts @piagent/platform@X.Y.Z&#10;piagent-install --stable --dry-run&#10;piagent-install --stable">Copy</button></header><pre><code>npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.86.1
108
+ <article class="command-card"><header><span>Full update</span><button class="clip-btn" data-clip="npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.87.1&#10;npm install -g --ignore-scripts @piagent/platform@X.Y.Z&#10;piagent-install --stable --dry-run&#10;piagent-install --stable">Copy</button></header><pre><code>npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.87.1
109
109
  npm install -g --ignore-scripts @piagent/platform@X.Y.Z
110
110
  piagent-install --stable --dry-run
111
111
  piagent-install --stable</code></pre></article>
@@ -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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -102,6 +102,18 @@
102
102
  <h1>Safer task flow with less manual coordination</h1>
103
103
  <p>Product stabilization adds runtime truth, trajectories, recovery, helper policy, an activity inspector, and fail-closed completion receipts without breaking existing workflows.</p>
104
104
  </div>
105
+ <section class="section">
106
+ <p class="section-kicker">v1.8.0</p>
107
+ <h2 id="v1-8-0">Astra, Sol, and Luna in Piagent</h2>
108
+ <p class="section-lead">Pi 0.87.1 exposes all three GPT-6 models through the authenticated catalog. New sessions prefer Sol High; parent routing remains opt-in.</p>
109
+ <div class="grid cols-3">
110
+ <article class="card"><h3>Luna</h3><p>Focused, verifiable tasks: the low tier at Medium effort.</p></article>
111
+ <article class="card"><h3>Sol</h3><p>Everyday coding: the medium and high tiers; the new-session default is High when available.</p></article>
112
+ <article class="card"><h3>Astra</h3><p>Broad or ambiguous work: the ultra tier at Extra High. Explicit pins and existing sessions stay intact.</p></article>
113
+ </div>
114
+ <p>The router selects only authenticated models and records a legacy 5.6 fallback. The old 108-session result does not measure GPT-6 performance or token savings.</p>
115
+ </section>
116
+
105
117
  <section class="section">
106
118
  <p class="section-kicker">v1.7.1</p>
107
119
  <h2 id="v1-7-0">Long sessions with clearer context and accounting</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.7.1 docs · EN</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -110,8 +110,8 @@
110
110
  <pre><code>piagent-setup --mcp-preset core --subagents-preset safe</code></pre>
111
111
  </article>
112
112
  <article class="command-card">
113
- <header><span>Full update</span><button class="clip-btn" data-clip="npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.86.1&#10;npm install -g --ignore-scripts @piagent/platform@X.Y.Z&#10;piagent-install --stable --dry-run&#10;piagent-install --stable">Lấy lệnh</button></header>
114
- <pre><code>npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.86.1
113
+ <header><span>Full update</span><button class="clip-btn" data-clip="npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.87.1&#10;npm install -g --ignore-scripts @piagent/platform@X.Y.Z&#10;piagent-install --stable --dry-run&#10;piagent-install --stable">Lấy lệnh</button></header>
114
+ <pre><code>npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.87.1
115
115
  npm install -g --ignore-scripts @piagent/platform@X.Y.Z
116
116
  piagent-install --stable --dry-run
117
117
  piagent-install --stable</code></pre>
@@ -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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -102,6 +102,18 @@
102
102
  <h1>Luồng task an toàn hơn, ít thao tác tay hơn</h1>
103
103
  <p>Product stabilization bổ sung runtime truth, trajectory, recovery, helper policy, activity inspector và completion receipt fail-closed mà không phá workflow cũ.</p>
104
104
  </div>
105
+ <section class="section">
106
+ <p class="section-kicker">v1.8.0</p>
107
+ <h2 id="v1-8-0">Astra, Sol và Luna trong Piagent</h2>
108
+ <p class="section-lead">Pi 0.87.1 đưa ba model GPT-6 vào danh sách đã đăng nhập. Phiên mới ưu tiên Sol High; tier routing vẫn là lựa chọn bật riêng.</p>
109
+ <div class="grid cols-3">
110
+ <article class="card"><h3>Luna</h3><p>Việc gọn, rõ phạm vi và có thể kiểm tra: tier low ở Medium effort.</p></article>
111
+ <article class="card"><h3>Sol</h3><p>Công việc lập trình hằng ngày: tier medium/high; mặc định phiên mới ở High effort khi có quyền dùng.</p></article>
112
+ <article class="card"><h3>Astra</h3><p>Việc rộng hoặc mơ hồ: tier ultra ở Extra High. Model đã pin và phiên cũ được giữ nguyên.</p></article>
113
+ </div>
114
+ <p>Router chỉ chọn model có trong catalog đã đăng nhập; fallback 5.6 được ghi rõ. Kết quả 108 phiên cũ không phải phép đo GPT-6 và bản này không claim tiết kiệm token.</p>
115
+ </section>
116
+
105
117
  <section class="section">
106
118
  <p class="section-kicker">v1.7.1</p>
107
119
  <h2 id="v1-7-0">Phiên dài giữ đúng việc, context và số liệu rõ ràng</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.7.1 docs · VI</span>
33
+ <span class="pill"><span class="pill-dot"></span>v1.8.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>
@@ -257,7 +257,7 @@
257
257
  {
258
258
  "path": "tests",
259
259
  "fileCount": 487,
260
- "sha256": "388a16945d382b23bda4f0af6966716e0612b4ed20d5a2f833819a9e5c8f337d"
260
+ "sha256": "3d59061aef5ac8f4a182ccd0d84433de1bca29f4baadc61a2e1c7a08b704963c"
261
261
  }
262
262
  ],
263
263
  "custodianComparisonRules": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@piagent/platform",
3
- "version": "1.7.1",
3
+ "version": "1.8.0",
4
4
  "license": "MIT",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -119,8 +119,8 @@
119
119
  ]
120
120
  },
121
121
  "peerDependencies": {
122
- "@earendil-works/pi-ai": "0.86.1",
123
- "@earendil-works/pi-coding-agent": "0.86.1",
122
+ "@earendil-works/pi-ai": "0.87.1",
123
+ "@earendil-works/pi-coding-agent": "0.87.1",
124
124
  "typebox": "1.3.27"
125
125
  },
126
126
  "peerDependenciesMeta": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@piagent/core",
3
- "version": "1.7.1",
3
+ "version": "1.8.0",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "license": "MIT",
@@ -33,7 +33,7 @@
33
33
  }
34
34
  },
35
35
  "peerDependencies": {
36
- "@earendil-works/pi-coding-agent": "0.86.1",
36
+ "@earendil-works/pi-coding-agent": "0.87.1",
37
37
  "typebox": "1.3.27"
38
38
  },
39
39
  "peerDependenciesMeta": {
@@ -1,6 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
 
3
- export const PINNED_BRIDGE_HOST_VERSION = "0.86.1" as const;
3
+ export const PINNED_BRIDGE_HOST_VERSION = "0.87.1" as const;
4
4
  export const SAME_PROCESS_BRIDGE_PROOF_VERSION = "piagent-webui-same-process-bridge-v1" as const;
5
5
 
6
6
  const HOST_EVENTS = Object.freeze([
@@ -248,7 +248,7 @@ function capabilities(identity: WebUiIdentity, generatedAt: string, resyncRequir
248
248
  capabilities: {
249
249
  inspect: { status: "available", version: 1, reason: null, sourceViews: ["task", "working-tree", "staged"] },
250
250
  "control.chat": unavailableCapability("chat-control-not-enabled", "The same-session bridge exists, but transcript, queue, server control and browser UX are not enabled"),
251
- "control.lifecycle": unavailableCapability("lifecycle-contract-incomplete", "Pi 0.86.1 lacks semantic Pause and an acknowledged phase-complete Stop contract"),
251
+ "control.lifecycle": unavailableCapability("lifecycle-contract-incomplete", "Pi host lacks semantic Pause and an acknowledged phase-complete Stop contract"),
252
252
  "control.resumeAndContinue": unavailableCapability("compound-control-unavailable", "Resume is unavailable until a durable acknowledged Pause contract exists"),
253
253
  "control.sessionOptions": unavailableCapability("effect-scope-not-productionized", "Model and thinking APIs exist but lifecycle and persistence scope enforcement is not enabled"),
254
254
  attachments: unavailableCapability("attachments-not-implemented", "Attachments are not implemented"),
@@ -4,8 +4,11 @@ import {
4
4
  authenticatedCatalogDigest,
5
5
  CAPABILITY_BANDS,
6
6
  createModelRouteDecision,
7
+ LEGACY_OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION,
8
+ OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION,
7
9
  type CapabilityBand,
8
10
  type ModelRouteDecision,
11
+ type ModelRouteMappingVersion,
9
12
  type ModelSelectionSource,
10
13
  type ParentRoutingMode,
11
14
  type RoutingObjective
@@ -22,33 +25,47 @@ export type ModelRoutePolicyInput = {
22
25
  current: { provider: string | null; modelId: string | null; effort: string | null };
23
26
  freshTaskBoundary: boolean;
24
27
  hostBoundary: ModelRouteHostBoundary;
28
+ mappingVersion?: ModelRouteMappingVersion;
25
29
  };
26
30
 
27
31
  type Candidate = { provider: "openai-codex"; modelId: string; effort: string };
28
32
 
29
- const BAND_CANDIDATES: Record<CapabilityBand, Candidate[]> = {
33
+ const LEGACY_BAND_CANDIDATES: Record<CapabilityBand, Candidate[]> = {
30
34
  low: [{ provider: "openai-codex", modelId: "gpt-5.6-luna", effort: "medium" }],
31
35
  medium: [{ provider: "openai-codex", modelId: "gpt-5.6-terra", effort: "medium" }],
32
36
  high: [{ provider: "openai-codex", modelId: "gpt-5.6-sol", effort: "high" }],
33
37
  ultra: [{ provider: "openai-codex", modelId: "gpt-5.6-sol", effort: "xhigh" }]
34
38
  };
39
+ const BAND_CANDIDATES: Record<CapabilityBand, Candidate[]> = {
40
+ low: [{ provider: "openai-codex", modelId: "gpt-6-luna", effort: "medium" }, ...LEGACY_BAND_CANDIDATES.low],
41
+ medium: [{ provider: "openai-codex", modelId: "gpt-6-sol", effort: "medium" }, ...LEGACY_BAND_CANDIDATES.medium],
42
+ high: [{ provider: "openai-codex", modelId: "gpt-6-sol", effort: "high" }, ...LEGACY_BAND_CANDIDATES.high],
43
+ ultra: [{ provider: "openai-codex", modelId: "gpt-6-astra", effort: "xhigh" }, ...LEGACY_BAND_CANDIDATES.ultra]
44
+ };
35
45
  const BAND_INDEX = new Map(CAPABILITY_BANDS.map((band, index) => [band, index]));
36
46
 
37
- function exactCandidate(catalog: AuthenticatedModelCatalog, band: CapabilityBand): { model: AuthenticatedModelCatalogEntry; effort: string } | undefined {
38
- for (const candidate of BAND_CANDIDATES[band]) {
47
+ function exactCandidate(catalog: AuthenticatedModelCatalog, band: CapabilityBand, mappingVersion: ModelRouteMappingVersion): { model: AuthenticatedModelCatalogEntry; effort: string; legacyFallback: boolean } | undefined {
48
+ const candidates = mappingVersion === LEGACY_OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION ? LEGACY_BAND_CANDIDATES[band] : BAND_CANDIDATES[band];
49
+ for (const [index, candidate] of candidates.entries()) {
39
50
  const model = catalog.models.find((entry) => entry.provider === candidate.provider
40
51
  && entry.modelId === candidate.modelId
41
52
  && (entry.supportedThinkingLevels === null || entry.supportedThinkingLevels.includes(candidate.effort)));
42
- if (model) return { model, effort: candidate.effort };
53
+ if (model) return { model, effort: candidate.effort, legacyFallback: mappingVersion === OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION && index > 0 };
43
54
  }
44
55
  return undefined;
45
56
  }
46
57
 
47
- function currentBand(modelId: string | null): CapabilityBand | undefined {
48
- return modelId === "gpt-5.6-luna" ? "low"
49
- : modelId === "gpt-5.6-terra" ? "medium"
50
- : modelId === "gpt-5.6-sol" ? "high"
51
- : undefined;
58
+ function currentBand(modelId: string | null, effort: string | null): CapabilityBand | undefined {
59
+ if (modelId === "gpt-6-luna" || modelId === "gpt-5.6-luna") return "low";
60
+ if (modelId === "gpt-6-astra") return "ultra";
61
+ if (modelId === "gpt-6-sol") {
62
+ if (effort === "medium") return "medium";
63
+ if (effort === "xhigh" || effort === "max") return "ultra";
64
+ return "high";
65
+ }
66
+ if (modelId === "gpt-5.6-terra") return "medium";
67
+ if (modelId === "gpt-5.6-sol") return "high";
68
+ return undefined;
52
69
  }
53
70
 
54
71
  function maxBand(left: CapabilityBand, right: CapabilityBand): CapabilityBand {
@@ -102,6 +119,7 @@ function downgradeSteps(current: CapabilityBand | undefined, target: CapabilityB
102
119
  }
103
120
 
104
121
  export function routeParentModel(input: ModelRoutePolicyInput): ModelRouteDecision {
122
+ const mappingVersion = input.mappingVersion ?? OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION;
105
123
  const floor = safetyFloor(input.features);
106
124
  const desired = objectiveBand(floor.band, input.objective);
107
125
  const catalogDigest = authenticatedCatalogDigest(input.catalog);
@@ -114,7 +132,8 @@ export function routeParentModel(input: ModelRoutePolicyInput): ModelRouteDecisi
114
132
  currentModelId: input.current.modelId,
115
133
  currentEffort: input.current.effort,
116
134
  selectionSource: input.selectionSource,
117
- catalogDigest
135
+ catalogDigest,
136
+ mappingVersion
118
137
  } as const;
119
138
  if (input.mode === "off") return createModelRouteDecision({
120
139
  ...common, capabilityBand: "abstain", fallbackBand: desired, provider: input.current.provider,
@@ -136,14 +155,15 @@ export function routeParentModel(input: ModelRoutePolicyInput): ModelRouteDecisi
136
155
  confidence: "low", disposition: "unavailable", reasonCodes: ["authenticated-catalog-unavailable", ...floor.reasons],
137
156
  downgradeSteps: 0, enforced: false
138
157
  });
139
- const candidate = exactCandidate(input.catalog, desired);
158
+ const candidate = exactCandidate(input.catalog, desired, mappingVersion);
140
159
  if (!candidate) return createModelRouteDecision({
141
160
  ...common, capabilityBand: "abstain", fallbackBand: desired, provider: null, modelId: null, effort: null,
142
161
  confidence: "low", disposition: "unavailable", reasonCodes: ["preferred-model-or-effort-unavailable", "no-silent-substitution", ...floor.reasons],
143
162
  downgradeSteps: 0, enforced: false
144
163
  });
145
- const reasons = [...floor.reasons, `objective-${input.objective}`, `candidate-${desired}`, "runtime-catalog-match"];
146
- const steps = downgradeSteps(currentBand(input.current.modelId), desired);
164
+ const reasons = [...floor.reasons, `objective-${input.objective}`, `candidate-${desired}`, "runtime-catalog-match",
165
+ ...(candidate.legacyFallback ? ["legacy-model-fallback"] : [])];
166
+ const steps = downgradeSteps(currentBand(input.current.modelId, input.current.effort), desired);
147
167
  if (input.mode === "shadow") return createModelRouteDecision({
148
168
  ...common, capabilityBand: desired, fallbackBand: null, provider: candidate.model.provider, modelId: candidate.model.modelId,
149
169
  effort: candidate.effort, confidence: floor.band === "low" || floor.band === "ultra" ? "high" : "medium",
@@ -4,7 +4,9 @@ import type { AuthenticatedModelCatalog } from "./authenticated-catalog.ts";
4
4
 
5
5
  export const MODEL_ROUTE_DECISION_SCHEMA_VERSION = 1 as const;
6
6
  export const MODEL_ROUTE_POLICY_VERSION = "model-route-v1" as const;
7
- export const OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION = "openai-codex-model-route-map-v1" as const;
7
+ export const LEGACY_OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION = "openai-codex-model-route-map-v1" as const;
8
+ export const OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION = "openai-codex-model-route-map-v2" as const;
9
+ export type ModelRouteMappingVersion = typeof LEGACY_OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION | typeof OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION;
8
10
 
9
11
  export const PARENT_ROUTING_MODES = Object.freeze(["off", "shadow", "recommend", "auto"] as const);
10
12
  export const ROUTING_OBJECTIVES = Object.freeze(["intelligence", "balance", "cost"] as const);
@@ -26,7 +28,7 @@ export type ModelRouteDisposition = "preserved" | "shadowed" | "recommended" | "
26
28
  export type ModelRouteDecision = {
27
29
  schemaVersion: typeof MODEL_ROUTE_DECISION_SCHEMA_VERSION;
28
30
  policyVersion: typeof MODEL_ROUTE_POLICY_VERSION;
29
- mappingVersion: typeof OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION;
31
+ mappingVersion: ModelRouteMappingVersion;
30
32
  featureHash: string;
31
33
  mode: ParentRoutingMode;
32
34
  objective: RoutingObjective;
@@ -88,13 +90,14 @@ export function authenticatedCatalogDigest(catalog: AuthenticatedModelCatalog):
88
90
  }
89
91
 
90
92
  export function createModelRouteDecision(
91
- input: Omit<ModelRouteDecision, "schemaVersion" | "policyVersion" | "mappingVersion" | "decisionDigest">
93
+ input: Omit<ModelRouteDecision, "schemaVersion" | "policyVersion" | "mappingVersion" | "decisionDigest"> & { mappingVersion?: ModelRouteMappingVersion }
92
94
  ): ModelRouteDecision {
95
+ const { mappingVersion = OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION, ...decisionInput } = input;
93
96
  const payload = {
94
97
  schemaVersion: MODEL_ROUTE_DECISION_SCHEMA_VERSION,
95
98
  policyVersion: MODEL_ROUTE_POLICY_VERSION,
96
- mappingVersion: OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION,
97
- ...structuredClone(input)
99
+ mappingVersion,
100
+ ...structuredClone(decisionInput)
98
101
  } satisfies Omit<ModelRouteDecision, "decisionDigest">;
99
102
  return validateModelRouteDecision({ ...payload, decisionDigest: digestPayload(payload) });
100
103
  }
@@ -108,7 +111,8 @@ export function modelRouteDecisionValidationErrors(input: unknown): string[] {
108
111
  ];
109
112
  if (value.schemaVersion !== MODEL_ROUTE_DECISION_SCHEMA_VERSION
110
113
  || value.policyVersion !== MODEL_ROUTE_POLICY_VERSION
111
- || value.mappingVersion !== OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION) errors.push("model route schema/policy/mapping version is invalid");
114
+ || (value.mappingVersion !== LEGACY_OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION
115
+ && value.mappingVersion !== OPENAI_CODEX_MODEL_ROUTE_MAPPING_VERSION)) errors.push("model route schema/policy/mapping version is invalid");
112
116
  if (typeof value.featureHash !== "string" || !HASH.test(value.featureHash)) errors.push("featureHash must be sha256 hex");
113
117
  if (!PARENT_ROUTING_MODES.includes(value.mode as ParentRoutingMode)) errors.push("mode is invalid");
114
118
  if (!ROUTING_OBJECTIVES.includes(value.objective as RoutingObjective)) errors.push("objective is invalid");