@tea-agent/loop-agent 0.43.0-next.10 → 0.43.0-next.12

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 (101) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/build-stamp.json +3 -3
  3. package/dist/commands/client-recovery.js +20 -55
  4. package/dist/executors/dag-pi-executor.js +27 -6
  5. package/dist/executors/shell-executor.js +3 -2
  6. package/dist/shared/pi-context-pressure/extension.js +26 -16
  7. package/dist/shared/pi-provider-recovery.js +182 -0
  8. package/dist/shared/pi-retry-settings.js +40 -0
  9. package/dist/worker/console/chat/browser-policy.js +6 -36
  10. package/dist/worker/console/chat/browser-routes.js +3 -11
  11. package/dist/worker/console/chat/pi-runtime/custom-tools/goal-tools.js +2 -1
  12. package/dist/worker/console/chat/pi-runtime.js +11 -12
  13. package/dist/worker/console/chat/routes.js +1 -5
  14. package/dist/worker/console/chat/session-mode-view.js +5 -4
  15. package/dist/worker/console/chat/session-mode.js +11 -10
  16. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-D_fNbWc_.js → abnfDiagram-N423BO3Z-BEg5712w.js} +1 -1
  17. package/dist/worker/console/static/assets/{arc-_HuqLW6m.js → arc-CkQvaBGZ.js} +1 -1
  18. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-Djy2qY1m.js → architectureDiagram-T3A2C74G-BrdwFNJ7.js} +1 -1
  19. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-bB-1TSyY.js → blockDiagram-VBNYF7ZC-M_LjP2kx.js} +1 -1
  20. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-C5Hmghrz.js → c4Diagram-5PPSVZJV-Bwr5Dtjc.js} +1 -1
  21. package/dist/worker/console/static/assets/channel-CKmyKgY-.js +1 -0
  22. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-Duyl39oy.js → chunk-2GRJ4B5K-CDc44stW.js} +1 -1
  23. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-x6mdnSyf.js → chunk-2Q5K7J3B-DZELwsTt.js} +1 -1
  24. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-WlBuFj7W.js → chunk-5RXB4S5H-D7YI6SWX.js} +1 -1
  25. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-CTF429HX.js → chunk-5VM5RSS4-Bc46bEyj.js} +1 -1
  26. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-Dwd6r-SF.js → chunk-6Q2QTUOP-Bj4vc-Dp.js} +1 -1
  27. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-C-Br82D1.js → chunk-GF5L2VYU-DRi-0nDX.js} +1 -1
  28. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-CuGp0DeE.js → chunk-JWPE2WC7-Dr-wFY60.js} +1 -1
  29. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-CJhFX6Lh.js → chunk-KBJHAD2P-CqIHE_D7.js} +1 -1
  30. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DpGOa_jT.js → chunk-RYQCIY6F-C-Dl8wzk.js} +1 -1
  31. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-DXJaTynd.js → chunk-XXDRQBXY-CV4Mydz3.js} +1 -1
  32. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-D8Wc3jJP.js +1 -0
  33. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-D8Wc3jJP.js +1 -0
  34. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-CRBZWjE4.js → cose-bilkent-JH36ORCC-C3MamSMJ.js} +1 -1
  35. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BdXcxtlb.js → cynefin-VYW2F7L2-zo_Jy2sf.js} +1 -1
  36. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-07UKsOts.js → cynefinDiagram-MW4NZA55-BB2PN1AG.js} +1 -1
  37. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-D38p9__S.js → dagre-VZM6K2ZE-BimYueoi.js} +1 -1
  38. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-nSiBNNjH.js → diagram-7IWD3JNH-Di1ObJRS.js} +1 -1
  39. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-BFOTot5D.js → diagram-B4RE2ZJO-C83l-IJx.js} +1 -1
  40. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-DypKaZ6k.js → diagram-LBJQPF4R-B3S3fOpm.js} +1 -1
  41. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-B6yoOQeW.js → diagram-Q27KOJAE-urW_Zhe7.js} +1 -1
  42. package/dist/worker/console/static/assets/{diagram-UB23O5K3-BHYS6viX.js → diagram-UB23O5K3-nvIbCwF6.js} +1 -1
  43. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-D2VD5Snj.js → ebnfDiagram-BXEA7PRR-DG6O3KpP.js} +1 -1
  44. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-E98mWxN1.js → erDiagram-JOGREHBK-DpXdtdsj.js} +1 -1
  45. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-CT1zxhqP.js → flowDiagram-UKHOOZJN-DvXWHrND.js} +1 -1
  46. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-6GcngNcy.js → ganttDiagram-PKOTCBZU-6F7SbvUS.js} +1 -1
  47. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-DCL6NvKe.js → gitGraphDiagram-DS77QQ5N-D1tZnFec.js} +1 -1
  48. package/dist/worker/console/static/assets/{index-24jp3aBh.js → index-CWarwRqc.js} +94 -94
  49. package/dist/worker/console/static/assets/{index-CY6y6I8M.css → index-SAANIK8g.css} +1 -1
  50. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-C0627e-9.js → infoDiagram-6WML65LV-HN4qwJ2M.js} +1 -1
  51. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-C_u3P6Ik.js → ishikawaDiagram-WSZJBQD7-OJ4qwDRo.js} +1 -1
  52. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-DPDPv9HL.js → journeyDiagram-NVQOT4AX-CJZ6giQk.js} +1 -1
  53. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-D3OHdWiO.js → kanban-definition-27J2QSJJ-co60m19S.js} +1 -1
  54. package/dist/worker/console/static/assets/{linear-DI88zD7n.js → linear-D1KeFqZY.js} +1 -1
  55. package/dist/worker/console/static/assets/{mermaid.core-p2l8IrWY.js → mermaid.core-i7dDGqov.js} +5 -5
  56. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-B1bAX-oS.js → mindmap-definition-FAOFIHXS-1SkQxBh1.js} +1 -1
  57. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-DwOnWxdD.js → pegDiagram-VL7TDLO6-B10dhI-Y.js} +1 -1
  58. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-xRkTXnJC.js → pieDiagram-7S7Q4E2Y-CiUKUo6j.js} +1 -1
  59. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-_9UC5Zio.js → quadrantDiagram-CIZ2JOQS-C5vH4LXZ.js} +1 -1
  60. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-CgEUirWJ.js → railroadDiagram-AXF67PYL-5nlWOCEj.js} +1 -1
  61. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-Czbpwiyz.js → requirementDiagram-LRYGKXZP-CILd6QS3.js} +1 -1
  62. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-_j7_KiqY.js → sankeyDiagram-W5VNT64P-Dfp18ZO2.js} +1 -1
  63. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-BNJa6Hyi.js → sequenceDiagram-SI44F4Z6-B9pkswBi.js} +1 -1
  64. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-DedpKtOc.js → sizeCapture-X5ZJPWSS-C1-eSgx4.js} +1 -1
  65. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-BBvthr7c.js → stateDiagram-OKZ733FA-COJsOoAF.js} +1 -1
  66. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-Bpfb0q5s.js +1 -0
  67. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-Ds7umgEM.js → swimlanes-SLNWSIFB-Dv5NXJUM.js} +2 -2
  68. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BEwGGabW.js +8 -0
  69. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CKa-p1nF.js → timeline-definition-Z64GVDOM-DRdrZ7eR.js} +1 -1
  70. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-LoUNR56o.js → vennDiagram-T6HMQDX7-0-2TlwCj.js} +1 -1
  71. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-Bqbl6ym7.js → wardleyDiagram-T6FBY63Y-3-o3q92P.js} +1 -1
  72. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-B8dUg4lf.js → xychartDiagram-ELKLHX3M-DSgOgdUi.js} +1 -1
  73. package/dist/worker/console/static/index.html +2 -2
  74. package/dist/worker/console/static-src/operator-chat/composer-session-ledger.js +192 -0
  75. package/dist/worker/console/static-src/operator-chat/pending-user-message.js +9 -1
  76. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +78 -35
  77. package/dist/worker/console/static-src/operator-chat/useChatStream.js +145 -70
  78. package/dist/worker/console/static-src/operator-chat/useComposer.js +182 -69
  79. package/dist/workflows/dag/frontend-closeout.js +1 -1
  80. package/dist/workflows/dag/frontend-prewrite-gate.js +3 -3
  81. package/dist/workflows/dag/frontend-review-context.js +2 -1
  82. package/dist/workflows/dag/frontend-review-scopes.js +2 -2
  83. package/dist/workflows/dag/frontend-verification-trace.js +1 -1
  84. package/dist/workflows/dag/init-hybrid.js +51 -159
  85. package/docs/architecture/runtime-boundaries.md +3 -3
  86. package/docs/templates/frontend-implementation-dag.json +9 -8
  87. package/package.json +1 -1
  88. package/skills/frontend-bounded-implement/SKILL.md +3 -3
  89. package/skills/frontend-bounded-implement/references/code-standards.md +3 -3
  90. package/skills/frontend-contract/references/contract-protocol.md +3 -1
  91. package/skills/frontend-design-review/SKILL.md +12 -7
  92. package/skills/frontend-design-review/references/review-checklist.md +7 -7
  93. package/skills/frontend-plan/SKILL.md +12 -0
  94. package/skills/frontend-plan/references/decision-contract.md +25 -19
  95. package/skills/frontend-review/SKILL.md +12 -18
  96. package/skills/frontend-review/references/review-findings.md +24 -43
  97. package/dist/worker/console/static/assets/channel-C0A6UEIa.js +0 -1
  98. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-DzguNppy.js +0 -1
  99. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-DzguNppy.js +0 -1
  100. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BABVQnfM.js +0 -1
  101. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-D0qsLaxR.js +0 -8
@@ -3,9 +3,10 @@
3
3
  * endpoint the panel uses to explain an iframe refusal (X-Frame-Options /
4
4
  * CSP frame-ancestors are exactly the signals the browser enforces when it
5
5
  * refuses to embed a site). The probe is display-only (headers back to the
6
- * caller), restricted to http(s) non-loopback URLs, with a hard timeout.
6
+ * caller), restricted to http(s) URLs, with a hard timeout. Local addresses
7
+ * are allowed — the panel routinely browses local dev servers.
7
8
  */
8
- import { embeddabilityOf, extractFrameAncestors, isLoopbackHostname, } from "./browser-policy.js";
9
+ import { embeddabilityOf, extractFrameAncestors, } from "./browser-policy.js";
9
10
  function workspaceIdOf(req) {
10
11
  try {
11
12
  return new URL(req.url ?? "/", "http://localhost").searchParams.get("workspaceId") ?? undefined;
@@ -69,15 +70,6 @@ export async function handleBrowserRequest(req, res, deps, pathname) {
69
70
  });
70
71
  return true;
71
72
  }
72
- // Mirror the address-bar policy: loopback stays unreachable from
73
- // the panel, so probing it would leak nothing the panel could use.
74
- if (isLoopbackHostname(parsed.hostname)) {
75
- sendJson(res, 400, {
76
- ok: false,
77
- error: { code: "LOOPBACK_REFUSED", message: "local addresses are not probed" },
78
- });
79
- return true;
80
- }
81
73
  const controller = new AbortController();
82
74
  const timer = setTimeout(() => controller.abort(), 8000);
83
75
  try {
@@ -1,5 +1,6 @@
1
1
  /**
2
- * Session-bound Goal tools (workflow-mode only).
2
+ * Session-bound Goal tools (shared by workflow and Pi modes since
3
+ * 2026-09-10; see exec-plan 2026-09-10-console-chat-goal-for-pi-mode).
3
4
  * create_goal still requires a consumed model-create grant from the registry.
4
5
  */
5
6
  const GET_GOAL_DESCRIPTION = "Read the current session's durable cross-turn Goal, including revision, status, round limit, and whether this Console process is authorized to continue it.";
@@ -33,10 +33,11 @@ import { parseProviderError, } from "./provider-error.js";
33
33
  import { projectCompactSnapshot, } from "./chat-event-store.js";
34
34
  import { extractUsageSample } from "./usage.js";
35
35
  import { OPERATOR_CHAT_ALLOWED_TOOLS, authorizeOperatorChatTool, assertNoWriteToolInList, } from "./tools.js";
36
- import { authorizeChatSessionTool, DEFAULT_CONSOLE_CHAT_SESSION_MODE, chatActiveToolBaseline, composeChatSystemPrompt, composeChatSystemPromptParts, computeChatActiveToolNames, shouldInjectGoalContinuation, shouldLoadWorkflowBusinessTools, } from "./session-mode.js";
36
+ import { authorizeChatSessionTool, DEFAULT_CONSOLE_CHAT_SESSION_MODE, chatActiveToolBaseline, composeChatSystemPrompt, composeChatSystemPromptParts, computeChatActiveToolNames, shouldLoadWorkflowBusinessTools, } from "./session-mode.js";
37
37
  import { buildAgentCustomTool, ExploreOrchestrator, } from "./subagents/index.js";
38
38
  import { createOperatorChatResourceLoader, } from "./resource-loader.js";
39
39
  import { applySkillAutoInvocationPreferences, loadResourcePreferences, } from "./resource-preferences-store.js";
40
+ import { applyProcessRetryOverride, } from "../../../shared/pi-retry-settings.js";
40
41
  import { applyProcessCompactionOverride, createCompactionController, createContextPressureExtension, createSiftBridgeState, housekeepSiftStash, isConsoleSiftEnabled, parseCompactionPolicy, parseSiftBridgeConfig, projectPromptPressure, deriveEffectiveWindow, projectSafeTelemetry, emptyContextPressureCounters, } from "../../../shared/pi-context-pressure/index.js";
41
42
  import { incrementCounter as incrementPressureCounter } from "../../../shared/pi-context-pressure/telemetry.js";
42
43
  import { resolveDefaultChatModel, resolveLowChatModel, } from "./model-resolver.js";
@@ -482,7 +483,6 @@ export class ConsolePiRuntime {
482
483
  const inheritedFactories = Array.isArray(base.extensionFactories)
483
484
  ? base.extensionFactories
484
485
  : [];
485
- const sessionMode = this.sessionModeOf(sessionId);
486
486
  const todoContextExtension = sessionId && this.options.todoRegistry
487
487
  ? createTodoCompactionContextExtension({
488
488
  sessionId,
@@ -492,9 +492,7 @@ export class ConsolePiRuntime {
492
492
  const pressureExtension = sessionId
493
493
  ? this.createContextPressureInlineExtension(sessionId)
494
494
  : undefined;
495
- const goalContextExtension = sessionId &&
496
- this.options.goalRegistry &&
497
- shouldInjectGoalContinuation(sessionMode)
495
+ const goalContextExtension = sessionId && this.options.goalRegistry
498
496
  ? createGoalCompactionContextExtension({
499
497
  sessionId,
500
498
  registry: this.options.goalRegistry,
@@ -580,9 +578,11 @@ export class ConsolePiRuntime {
580
578
  policy,
581
579
  controller: this.getCompactionController(sessionId),
582
580
  sift,
581
+ normalizeTransientProviderErrors: true,
583
582
  });
584
583
  }
585
- applySessionCompactionOverride(sessionId, services, session) {
584
+ applySessionRecoveryOverrides(sessionId, services, session) {
585
+ applyProcessRetryOverride(services?.settingsManager);
586
586
  const manager = services?.settingsManager;
587
587
  const window = session?.getSessionStats?.()?.contextUsage?.contextWindow;
588
588
  applyProcessCompactionOverride(manager, {
@@ -600,7 +600,7 @@ export class ConsolePiRuntime {
600
600
  const window = stats?.contextUsage?.contextWindow;
601
601
  const tokens = stats?.contextUsage?.tokens;
602
602
  if (typeof window === "number" && window > 0) {
603
- this.applySessionCompactionOverride(sessionId, this.serviceScopes.get(sessionId) ?? {}, session);
603
+ this.applySessionRecoveryOverrides(sessionId, this.serviceScopes.get(sessionId) ?? {}, session);
604
604
  }
605
605
  const projection = projectPromptPressure({
606
606
  currentContextTokens: tokens,
@@ -905,7 +905,7 @@ export class ConsolePiRuntime {
905
905
  }
906
906
  await bindSessionExtensions(session);
907
907
  pinOperatorChatTools(session, init.sessionMode);
908
- this.applySessionCompactionOverride(init.sessionId, services, session);
908
+ this.applySessionRecoveryOverrides(init.sessionId, services, session);
909
909
  return {
910
910
  session,
911
911
  modelRuntime,
@@ -985,7 +985,7 @@ export class ConsolePiRuntime {
985
985
  sessionMode,
986
986
  })
987
987
  : undefined;
988
- const goalTools = loadWorkflowTools && this.options.goalRegistry
988
+ const goalTools = this.options.goalRegistry
989
989
  ? await buildGoalTools({ sessionId, registry: this.options.goalRegistry })
990
990
  : [];
991
991
  const terminalTools = this.options.terminalRegistry
@@ -1380,7 +1380,7 @@ export class ConsolePiRuntime {
1380
1380
  await session.reload();
1381
1381
  const services = this.serviceScopes.get(sessionId);
1382
1382
  if (services)
1383
- this.applySessionCompactionOverride(sessionId, services, session);
1383
+ this.applySessionRecoveryOverrides(sessionId, services, session);
1384
1384
  await this.refreshModelConfiguration(sessionId, "force");
1385
1385
  pinOperatorChatTools(session, this.sessionModeOf(sessionId));
1386
1386
  }
@@ -1819,8 +1819,7 @@ export class ConsolePiRuntime {
1819
1819
  if (options?.turnId && this.options.todoRegistry) {
1820
1820
  this.options.todoRegistry.startTurn(sessionId, options.turnId);
1821
1821
  }
1822
- if (this.options.goalRegistry &&
1823
- shouldInjectGoalContinuation(this.sessionModeOf(sessionId))) {
1822
+ if (this.options.goalRegistry) {
1824
1823
  this.options.goalRegistry.startTurn(sessionId, text);
1825
1824
  }
1826
1825
  // AC-FIX-002: if Stop already fired before readiness, never start model work.
@@ -1327,7 +1327,7 @@ export async function handleChatGoal(req, res, deps, sessionId) {
1327
1327
  });
1328
1328
  return;
1329
1329
  }
1330
- if (!(await requireWorkflowSession(res, deps, sessionId)))
1330
+ if (!(await requireChatSession(res, deps, sessionId)))
1331
1331
  return;
1332
1332
  if (req.method === "GET") {
1333
1333
  sendJson(res, 200, { ok: true, goal: registry.get(sessionId) });
@@ -2256,10 +2256,6 @@ export async function driveGoalRound(deps, sessionId) {
2256
2256
  registry.disarm(sessionId);
2257
2257
  return "idle";
2258
2258
  }
2259
- if (!isWorkflowSessionMode(readStoredSessionMode(record.sessionMode))) {
2260
- registry.disarm(sessionId);
2261
- return "idle";
2262
- }
2263
2259
  const runtimeFacts = deps.runtime.getSessionBusyFacts(sessionId);
2264
2260
  const operationStore = deps.runtime.actionContext?.operations;
2265
2261
  const linkedOperationIds = linkedOperationIdsForGoal(deps.events.snapshot(sessionId));
@@ -27,21 +27,22 @@ export const SESSION_MODE_COPY = {
27
27
  description: "保留压缩与 Explore,直接协作编码",
28
28
  createLabel: "新建 Pi 会话",
29
29
  bannerTitle: "Pi",
30
- bannerBody: "保留 Console 压缩与 Explore,直接协作编码。不注入工作流业务指令、业务工具或 Goal 驱动。",
30
+ bannerBody: "保留 Console 压缩、Explore 与持续目标,直接协作编码。不注入工作流业务指令与业务工具。",
31
31
  landingTitle: "开始一段 Pi 协作",
32
- landingBody: "Pi 模式保留压缩、Explore、认证与 SDD 接入,取消工作流业务注入。适合有人监督的直接编码与调试。",
32
+ landingBody: "Pi 模式保留压缩、Explore、持续目标、认证与 SDD 接入,取消工作流业务注入。适合有人监督的直接编码与调试。",
33
33
  emptyTitle: "直接协作编码",
34
34
  emptyBody: "会话已就绪。输入框上方可切换工作区或模式。使用 Pi 工具读写仓库;Explore 负责只读深挖。本会话不加载任务 / DAG 工作流工具。",
35
35
  },
36
36
  };
37
37
  /** Slash actions that only exist in workflow sessions. Browser-safe: pure
38
- * string constants, no runtime/tool policy imports. */
38
+ * string constants, no runtime/tool policy imports. `/goal` was moved to
39
+ * shared on 2026-09-10 (exec-plan 2026-09-10-console-chat-goal-for-pi-mode);
40
+ * interview/panel navigation remain workflow-only. */
39
41
  export const WORKFLOW_EXCLUSIVE_SLASH_ACTIONS = Object.freeze([
40
42
  "focus-panel:task",
41
43
  "focus-panel:contract",
42
44
  "focus-panel:dag",
43
45
  "focus:interview",
44
- "goal",
45
46
  ]);
46
47
  export function isWorkflowExclusiveSlashAction(action) {
47
48
  return WORKFLOW_EXCLUSIVE_SLASH_ACTIONS.includes(action);
@@ -74,7 +74,8 @@ export const PI_CHAT_SYSTEM_PROMPT_BASE = [
74
74
  "Use read/write/edit/bash/grep/find/ls to inspect and change the workspace. apply_patch, full-tools, shell and coding-chat are denied.",
75
75
  "Agent (Explore) is a built-in read-only subagent for path-uncertain codebase search. Do not use it for a known single-file read. Prefer safe-read/safe-grep for secret-safe probes.",
76
76
  "ask_user_question pauses for a real user answer. todo_write tracks the current work and is restored after compression; it is not a workflow auto-continue signal. The persistent terminal tool is available.",
77
- "This session keeps Console compression (L0/L1/L2, sift, strict checkpoint) and existing Aimax / SDD access. Do not create tasks, run DAGs, drive Goals, or start requirement interviews from this session.",
77
+ "Goal tools (get_goal / create_goal / update_goal) track the session's durable cross-turn objective. Create a Goal only when the user explicitly asks to start one; iterate in bounded rounds until complete or blocked.",
78
+ "This session keeps Console compression (L0/L1/L2, sift, strict checkpoint) and existing Aimax / SDD access. Do not create tasks, run DAGs, or start requirement interviews from this session.",
78
79
  "Obey repository AGENTS.md, skills and extensions when they apply. Choosing Pi mode is not extra write authorization and does not bypass Console access control or output scrubbing.",
79
80
  ].join("\n");
80
81
  export const CHAT_SAFE_EXPLORE_TOOL_IDS = Object.freeze([
@@ -87,7 +88,11 @@ export const PI_CHAT_GENERIC_HELPER_TOOLS = Object.freeze([
87
88
  "ask_user_question",
88
89
  "todo_write",
89
90
  ]);
90
- export const PI_CHAT_WORKFLOW_TOOL_IDS = Object.freeze([
91
+ /** Durable cross-turn Goal tools. Shared by both session modes since
92
+ * 2026-09-10 (exec-plan 2026-09-10-console-chat-goal-for-pi-mode); they are
93
+ * NOT workflow business tools and are registered whenever a GoalRegistry
94
+ * is present. */
95
+ export const GOAL_TOOL_IDS = Object.freeze([
91
96
  "get_goal",
92
97
  "create_goal",
93
98
  "update_goal",
@@ -102,7 +107,6 @@ const CHAT_EXTENSION_DENIED_TOOL_IDS = new Set([
102
107
  "shell",
103
108
  ].map((name) => name.toLowerCase()));
104
109
  const WORKFLOW_OPERATOR_TOOL_IDS = new Set(OPERATOR_CHAT_ALLOWED_TOOLS.map((name) => name.toLowerCase()));
105
- const PI_GOAL_TOOL_IDS = new Set(PI_CHAT_WORKFLOW_TOOL_IDS.map((name) => name.toLowerCase()));
106
110
  export function workflowActiveToolBaseline() {
107
111
  return [
108
112
  ...OPERATOR_CHAT_ALLOWED_TOOLS,
@@ -117,6 +121,7 @@ export function piActiveToolBaseline() {
117
121
  ...CHAT_SAFE_EXPLORE_TOOL_IDS,
118
122
  ...OPERATOR_CHAT_BUILTIN_CUSTOM_TOOLS,
119
123
  ...PI_CHAT_GENERIC_HELPER_TOOLS,
124
+ ...GOAL_TOOL_IDS,
120
125
  ];
121
126
  }
122
127
  export function chatActiveToolBaseline(sessionMode) {
@@ -126,7 +131,8 @@ export function chatActiveToolBaseline(sessionMode) {
126
131
  }
127
132
  /**
128
133
  * Gate 2 pin: mode baseline plus user/project extension tools. Pi mode must
129
- * not re-add operator actions or Goal tools via the extras pass.
134
+ * not re-add operator actions via the extras pass (Goal tools are shared and
135
+ * part of the Pi baseline since 2026-09-10).
130
136
  */
131
137
  export function computeChatActiveToolNames(session, sessionMode) {
132
138
  const baseline = chatActiveToolBaseline(sessionMode);
@@ -145,8 +151,6 @@ export function computeChatActiveToolNames(session, sessionMode) {
145
151
  continue;
146
152
  if (sessionMode === "pi" && WORKFLOW_OPERATOR_TOOL_IDS.has(lower))
147
153
  continue;
148
- if (sessionMode === "pi" && PI_GOAL_TOOL_IDS.has(lower))
149
- continue;
150
154
  extras.push(name);
151
155
  }
152
156
  return extras.length > 0 ? [...baseline, ...extras] : baseline;
@@ -172,7 +176,7 @@ export function authorizeChatSessionTool(toolId, sessionMode) {
172
176
  };
173
177
  }
174
178
  const lower = id.toLowerCase();
175
- if (WORKFLOW_OPERATOR_TOOL_IDS.has(lower) || PI_GOAL_TOOL_IDS.has(lower)) {
179
+ if (WORKFLOW_OPERATOR_TOOL_IDS.has(lower)) {
176
180
  return {
177
181
  ok: false,
178
182
  code: "tool-denied",
@@ -207,9 +211,6 @@ export { WORKFLOW_EXCLUSIVE_SLASH_ACTIONS, isWorkflowExclusiveSlashAction, } fro
207
211
  export function shouldLoadWorkflowBusinessTools(sessionMode) {
208
212
  return sessionMode === "workflow";
209
213
  }
210
- export function shouldInjectGoalContinuation(sessionMode) {
211
- return sessionMode === "workflow";
212
- }
213
214
  export function shouldAcceptOperatorSnapshot(sessionMode) {
214
215
  return sessionMode === "workflow";
215
216
  }
@@ -1 +1 @@
1
- import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-Dwd6r-SF.js";import{p as f}from"./chunk-JWPE2WC7-CuGp0DeE.js";import{_ as n,l as o}from"./mermaid.core-p2l8IrWY.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-BdXcxtlb.js";import"./index-24jp3aBh.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},B={parser:R,db:a,renderer:u,styles:p};export{B as diagram};
1
+ import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-Bj4vc-Dp.js";import{p as f}from"./chunk-JWPE2WC7-Dr-wFY60.js";import{_ as n,l as o}from"./mermaid.core-i7dDGqov.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-zo_Jy2sf.js";import"./index-CWarwRqc.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},B={parser:R,db:a,renderer:u,styles:p};export{B as diagram};
@@ -1 +1 @@
1
- import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-p2l8IrWY.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
1
+ import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-i7dDGqov.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};