@ashx-j/lunr 0.1.7 → 0.2.1

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 (111) hide show
  1. package/dist/builtin-extensions/lunr-todos.d.ts +7 -6
  2. package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
  3. package/dist/builtin-extensions/lunr-todos.js +24 -11
  4. package/dist/builtin-extensions/lunr-todos.js.map +1 -1
  5. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  6. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +9 -5
  7. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  8. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  9. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +31 -3
  10. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  11. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts +1 -0
  12. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  13. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +14 -4
  14. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  15. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  16. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +4 -3
  17. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  18. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  19. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +12 -1
  20. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +3 -0
  22. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  23. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +8 -0
  25. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  26. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +22 -2
  27. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  28. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  29. package/dist/builtin-extensions/pi-web-access/index.js +38 -230
  30. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  31. package/dist/builtin-extensions/pi-web-access/render-search-chrome.d.ts +35 -0
  32. package/dist/builtin-extensions/pi-web-access/render-search-chrome.d.ts.map +1 -0
  33. package/dist/builtin-extensions/pi-web-access/render-search-chrome.js +93 -0
  34. package/dist/builtin-extensions/pi-web-access/render-search-chrome.js.map +1 -0
  35. package/dist/catalog/models.json +1 -1
  36. package/dist/catalog/providers/amazon-bedrock.json +1 -1
  37. package/dist/catalog/providers/cloudflare-workers-ai.json +1 -1
  38. package/dist/catalog/providers/huggingface.json +1 -1
  39. package/dist/catalog/providers/opencode-go.json +1 -1
  40. package/dist/catalog/providers/opencode.json +1 -1
  41. package/dist/catalog/providers/openrouter.json +1 -1
  42. package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
  43. package/dist/catalog/publication.json +3 -3
  44. package/dist/core/context-breakdown.d.ts +21 -1
  45. package/dist/core/context-breakdown.d.ts.map +1 -1
  46. package/dist/core/context-breakdown.js +58 -2
  47. package/dist/core/context-breakdown.js.map +1 -1
  48. package/dist/core/permission-mode-control.d.ts +27 -0
  49. package/dist/core/permission-mode-control.d.ts.map +1 -0
  50. package/dist/core/permission-mode-control.js +39 -0
  51. package/dist/core/permission-mode-control.js.map +1 -0
  52. package/dist/core/settings-manager.d.ts.map +1 -1
  53. package/dist/core/settings-manager.js.map +1 -1
  54. package/dist/core/slash-commands.d.ts.map +1 -1
  55. package/dist/core/slash-commands.js +0 -1
  56. package/dist/core/slash-commands.js.map +1 -1
  57. package/dist/core/tools/read.d.ts.map +1 -1
  58. package/dist/core/tools/read.js +14 -20
  59. package/dist/core/tools/read.js.map +1 -1
  60. package/dist/core/tools/render-utils.d.ts +2 -0
  61. package/dist/core/tools/render-utils.d.ts.map +1 -1
  62. package/dist/core/tools/render-utils.js +10 -0
  63. package/dist/core/tools/render-utils.js.map +1 -1
  64. package/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  65. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  66. package/dist/modes/interactive/components/assistant-message.js +1 -0
  67. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  68. package/dist/modes/interactive/components/context-view.d.ts.map +1 -1
  69. package/dist/modes/interactive/components/context-view.js +3 -1
  70. package/dist/modes/interactive/components/context-view.js.map +1 -1
  71. package/dist/modes/interactive/components/plan-message.d.ts +17 -0
  72. package/dist/modes/interactive/components/plan-message.d.ts.map +1 -0
  73. package/dist/modes/interactive/components/plan-message.js +43 -0
  74. package/dist/modes/interactive/components/plan-message.js.map +1 -0
  75. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  76. package/dist/modes/interactive/components/settings-selector.js +1 -1
  77. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  78. package/dist/modes/interactive/components/tool-execution.d.ts +3 -0
  79. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  80. package/dist/modes/interactive/components/tool-execution.js +18 -2
  81. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  82. package/dist/modes/interactive/components/usage-view.d.ts +4 -25
  83. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  84. package/dist/modes/interactive/components/usage-view.js +17 -69
  85. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  86. package/dist/modes/interactive/components/user-message.d.ts +1 -0
  87. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  88. package/dist/modes/interactive/components/user-message.js +1 -0
  89. package/dist/modes/interactive/components/user-message.js.map +1 -1
  90. package/dist/modes/interactive/interactive-mode.d.ts +17 -6
  91. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  92. package/dist/modes/interactive/interactive-mode.js +200 -120
  93. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  94. package/dist/modes/interactive/smooth-streaming.d.ts +39 -6
  95. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  96. package/dist/modes/interactive/smooth-streaming.js +160 -73
  97. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  98. package/dist/utils/clipboard-image.d.ts.map +1 -1
  99. package/dist/utils/clipboard-image.js +7 -3
  100. package/dist/utils/clipboard-image.js.map +1 -1
  101. package/docs/terminal-setup.md +13 -0
  102. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  103. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  104. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  105. package/examples/extensions/gondolin/package-lock.json +2 -2
  106. package/examples/extensions/gondolin/package.json +1 -1
  107. package/examples/extensions/sandbox/package-lock.json +2 -2
  108. package/examples/extensions/sandbox/package.json +1 -1
  109. package/examples/extensions/with-deps/package-lock.json +2 -2
  110. package/examples/extensions/with-deps/package.json +1 -1
  111. package/package.json +4 -4
@@ -5,6 +5,7 @@ import { assistantUsageTokens, checkpointGoalActiveTime, formatDuration, formatT
5
5
  import { clearLegacyPersistedGoal, serializeGoalState, } from "./persistence.js";
6
6
  import { buildContinuePrompt } from "./prompts.js";
7
7
  import { DEFAULT_GOAL_SETTINGS } from "./settings.js";
8
+ import { enterGoalAuto, leaveGoalAuto } from "../../../core/permission-mode-control.js";
8
9
  export const STATUS_KEY = "goal";
9
10
  export const GOAL_STATE_ENTRY_TYPE = "goal-state";
10
11
  export const GOAL_COMPLETE_TOOL = "goal_complete";
@@ -133,8 +134,15 @@ export class GoalRuntime {
133
134
  hasContinuationWorkForGoal(goalId) {
134
135
  return (this.continuationIntent?.goalId === goalId || this.continuationDelivery?.goalId === goalId);
135
136
  }
137
+ syncGoalPermissionMode(goal) {
138
+ if (goal?.status === "active")
139
+ enterGoalAuto();
140
+ else
141
+ leaveGoalAuto();
142
+ }
136
143
  updateStatus(ctx, goal) {
137
144
  this.clearCompletionStatusTimer();
145
+ this.syncGoalPermissionMode(goal);
138
146
  ctx.ui.setStatus(STATUS_KEY, formatStatus(goal));
139
147
  // lunr: refresh the footer every 30s while a goal is active so the elapsed time ticks
140
148
  this.clearStatusRefreshTimer();
@@ -305,6 +313,7 @@ export class GoalRuntime {
305
313
  }
306
314
  clearActiveGoal(ctx) {
307
315
  this.clearStatusRefreshTimer(); // lunr: stop the footer refresh when the goal is cleared
316
+ this.syncGoalPermissionMode(undefined);
308
317
  this.cancelContinuationWork();
309
318
  this.clearGoalRecovery();
310
319
  this.clearBudgetWrapUp();
@@ -454,6 +463,7 @@ export class GoalRuntime {
454
463
  showCompletionStatus(ctx) {
455
464
  this.clearCompletionStatusTimer();
456
465
  this.clearStatusRefreshTimer(); // lunr: stop the footer refresh on completion
466
+ this.syncGoalPermissionMode(undefined);
457
467
  // lunr: enriched footer status format
458
468
  ctx.ui.setStatus(STATUS_KEY, "goal ✓ complete");
459
469
  this.completionStatusTimer = setTimeout(() => {
@@ -541,7 +551,7 @@ export function editedGoalStatus(status) {
541
551
  export function incrementGoal(goal) {
542
552
  return { ...goal, iteration: goal.iteration + 1, updatedAt: Date.now() };
543
553
  }
544
- // lunr: enriched footer status — `goal ● active · 3m · 2 turns` (rendered by ashxj-tui)
554
+ // lunr: footer status — active is just `goal` (elapsed/turns stay on paused)
545
555
  export function formatStatus(goal) {
546
556
  if (!goal)
547
557
  return undefined;
@@ -558,10 +568,10 @@ export function formatStatus(goal) {
558
568
  return "goal usage-limited";
559
569
  if (goal.status === "budget_limited")
560
570
  return `goal budget ${formatBudget(goal)}`;
561
- const status = `goal active · ${formatGoalElapsed(goal)} · ${formatGoalTurns(goal)}`;
571
+ // lunr: active (and budget-suffixed active) display text is exactly `goal`
562
572
  if (goal.tokenBudget !== undefined)
563
- return `${status} · ${formatBudget(goal)}`;
564
- return status;
573
+ return `goal · ${formatBudget(goal)}`;
574
+ return "goal";
565
575
  }
566
576
  // lunr: live elapsed = accumulated active time + the in-progress active segment
567
577
  function goalElapsedSeconds(goal) {
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../../src/builtin-extensions/narumiruna-pi-goal/src/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { randomUUID } from \"node:crypto\";\nimport {\n\tisContextOverflow,\n\ttype AssistantMessage as PiAssistantMessage,\n\ttype Usage,\n} from \"@ashx-j/lunr-ai\";\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport {\n\tassistantUsageTokens,\n\tcheckpointGoalActiveTime,\n\tformatDuration,\n\tformatTokenCount,\n\tnonNegativeFiniteNumber,\n\tupdateGoalUsage,\n} from \"./accounting.js\";\nimport {\n\ttype ActiveGoal,\n\tclearLegacyPersistedGoal,\n\ttype PendingQueueAction,\n\tserializeGoalState,\n} from \"./persistence.js\";\nimport { buildContinuePrompt, type GoalStatus } from \"./prompts.js\";\nimport { DEFAULT_GOAL_SETTINGS, type GoalSettings } from \"./settings.js\";\n\nexport type AgentStopReason = \"stop\" | \"length\" | \"toolUse\" | \"error\" | \"aborted\";\n\nexport interface ContinuationTicket {\n\tgoalId: string;\n\titeration: number;\n\tmarker: string;\n\tprompt: string;\n}\n\nexport interface BudgetWrapUp {\n\tgoalId: string;\n\tdelivered: boolean;\n}\n\nexport type GoalRecoveryKind = \"provider_retry\" | \"compaction_retry\";\n\nexport interface GoalRecovery {\n\tgoalId: string;\n\tkind: GoalRecoveryKind;\n}\n\nexport interface AssistantMessageLike {\n\trole: \"assistant\";\n\tstopReason?: AgentStopReason;\n\terrorMessage?: string;\n\tcontent?: PiAssistantMessage[\"content\"];\n\tapi?: PiAssistantMessage[\"api\"];\n\tprovider?: PiAssistantMessage[\"provider\"];\n\tmodel?: string;\n\tusage?: Usage;\n\ttimestamp?: number;\n}\n\nexport interface StatusContext {\n\tcwd: string;\n\tui: {\n\t\tconfirm: (title: string, message: string) => Promise<boolean>;\n\t\tnotify: (message: string, level?: \"info\" | \"warning\" | \"error\") => void;\n\t\tsetStatus: (key: string, value: string | undefined) => void;\n\t};\n\tisIdle?: () => boolean;\n\thasPendingMessages?: () => boolean;\n\tabort?: () => void;\n\tsessionManager?: unknown;\n}\n\nexport interface GoalToolVisibilitySnapshot {\n\tactiveTools: string[];\n\tgoalToolsUnlocked: boolean;\n\tgoalToolsHiddenByPolicy: string[];\n}\n\nexport const STATUS_KEY = \"goal\";\nexport const GOAL_STATE_ENTRY_TYPE = \"goal-state\";\nexport const GOAL_COMPLETE_TOOL = \"goal_complete\";\nexport const GOAL_BLOCKED_TOOL = \"goal_blocked\";\nexport const GOAL_TOOL_NAMES = [GOAL_COMPLETE_TOOL, GOAL_BLOCKED_TOOL] as const;\n\nconst MAX_CANCELLED_CONTINUATION_PROMPTS = 20;\nconst MAX_PENDING_GOAL_PROMPTS = 20;\nconst GOAL_PROMPT_MARKER_PREFIX = \"pi-goal-prompt:\";\nconst CONTINUATION_MARKER_PREFIX = \"pi-goal-continuation:\";\nconst BUDGET_WRAP_UP_MESSAGE_TYPE = \"goal-budget-wrap-up\";\nconst BUDGET_WRAP_UP_PROMPT =\n\t\"The active /goal token budget is exhausted. Stop substantive work and do not call substantive tools. Summarize progress, verified results, remaining work, and blockers concisely. Treat completion as unproven. Do not call goal_complete unless authoritative, requirement-by-requirement evidence already proves every requirement is complete. Weak, indirect, or missing evidence is not enough. Budget exhaustion is not completion.\";\nconst CONTRADICTORY_COMPLETION_PATTERNS = [\n\t/(?<!could\\s)\\bnot\\s+(?:yet\\s+)?(?:complete|completed|done|finished)\\b/i,\n\t/\\bstill\\s+(?:incomplete|failing|failing\\s+tests?|fails?)\\b/i,\n\t/\\btests?\\s+(?:still\\s+)?fail(?:ing)?\\b/i,\n] as const;\nconst USAGE_LIMIT_GOAL_ERROR_PATTERNS = [\n\t/usage[_\\s-]*(?:limit|cap)|chatgpt.{0,32}usage/i,\n\t/quota.{0,32}(?:reached|exceeded|exhausted|depleted)|(?:reached|exceeded|exhausted|depleted).{0,32}quota/i,\n\t/insufficient[_\\s-]*(?:quota|credits?)|out of credits|out of budget|available balance|payment required/i,\n\t/(?:credit|balance).{0,32}(?:low|exhausted|depleted)|billing/i,\n] as const;\nconst NON_RETRYABLE_GOAL_ERROR_RE =\n\t/multi-auth rotation failed|credentials tried|unauthori[sz]ed|invalid api key/i;\n// Pi 0.79 does not export its assistant-error retry classifier. Keep this\n// compatibility mirror aligned with Pi's public retry utility in newer versions.\nconst RETRYABLE_GOAL_ERROR_PATTERNS = [\n\t/overloaded|rate.?limit|too many requests|\\b(?:429|500|502|503|504)\\b|service.?unavailable|server.?error|internal.?error/i,\n\t/provider.?returned.?error|you can retry your request|try your request again|please retry your request/i,\n\t/network.?error|connection.?(?:error|refused|lost)|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up/i,\n\t/timed? out|timeout|terminated|websocket.?(?:closed|error)|ended without|stream ended before message_stop|http2 request did not get a response|retry delay/i,\n\t/context[_\\s-]*length[_\\s-]*exceeded|input exceeds the context window/i,\n] as const;\n\n// One instance belongs to one extension factory. It owns all mutable session state\n// and the cross-cutting invariants used by command and lifecycle orchestration.\nexport class GoalRuntime {\n\tsettings: GoalSettings = DEFAULT_GOAL_SETTINGS;\n\tactiveGoal?: ActiveGoal;\n\tqueuedGoals: ActiveGoal[] = [];\n\tpendingQueueAction?: PendingQueueAction;\n\tqueueFrozen = false;\n\tcompletionStatusTimer?: NodeJS.Timeout;\n\t// lunr: 30s footer refresh timer so the goal indicator's elapsed minutes tick while active\n\tstatusRefreshTimer?: NodeJS.Timeout;\n\tstatusRefreshCtx?: StatusContext;\n\tcontinuationIntent?: ContinuationTicket;\n\tcontinuationDelivery?: ContinuationTicket;\n\tgoalRecovery?: GoalRecovery;\n\tbudgetWrapUp?: BudgetWrapUp;\n\t/** `null` marks a run that must not be charged to the active goal. */\n\tagentRunGoalId?: string | null;\n\tstaleGoalToolCallsBlocked = false;\n\t/** Once true, goal tools stay in the active set for this runtime (prompt-cache stable). */\n\tgoalToolsUnlocked = false;\n\t/** Exact lazy goal tools this runtime removed and may restore on a mode change. */\n\tgoalToolsHiddenByPolicy = new Set<string>();\n\tpendingGoalPromptMarkers = new Map<string, string>();\n\tcancelledContinuationMarkers = new Set<string>();\n\n\treadonly pi: ExtensionAPI;\n\n\tconstructor(pi: ExtensionAPI) {\n\t\tthis.pi = pi;\n\t}\n\n\tcanRecordGoalUsage() {\n\t\treturn (\n\t\t\tthis.agentRunGoalId !== null &&\n\t\t\t!(\n\t\t\t\tthis.pendingQueueAction?.kind === \"prioritize\" &&\n\t\t\t\tthis.pendingQueueAction.displacedUsageFinalized === true\n\t\t\t)\n\t\t);\n\t}\n\n\thasActiveBudgetWrapUp() {\n\t\treturn (\n\t\t\tthis.activeGoal?.status === \"budget_limited\" &&\n\t\t\tthis.budgetWrapUp?.goalId === this.activeGoal.id &&\n\t\t\tthis.budgetWrapUp.delivered\n\t\t);\n\t}\n\n\thasActiveGoalRecovery() {\n\t\treturn Boolean(this.activeGoal && this.goalRecovery?.goalId === this.activeGoal.id);\n\t}\n\n\trecordGoalUsage(\n\t\tgoal: ActiveGoal,\n\t\tctx: StatusContext,\n\t\tcheckpointActiveTime = goal.status === \"active\",\n\t) {\n\t\tif (!this.canRecordGoalUsage()) return false;\n\t\tupdateGoalUsage(goal, ctx, checkpointActiveTime);\n\t\treturn true;\n\t}\n\n\trequestContinuation(goal: ActiveGoal) {\n\t\tif (this.hasContinuationWorkForGoal(goal.id)) return false;\n\t\tconst marker = continuationMarker(goal);\n\t\tthis.continuationIntent = {\n\t\t\tgoalId: goal.id,\n\t\t\titeration: goal.iteration,\n\t\t\tmarker,\n\t\t\tprompt: buildContinuePrompt(goal, marker),\n\t\t};\n\t\treturn true;\n\t}\n\n\tdispatchContinuationIfSettled(ctx: StatusContext) {\n\t\tconst intent = this.continuationIntent;\n\t\tif (!intent) return false;\n\t\tif (this.activeGoal?.status === \"active\" && !this.goalToolsAvailable()) {\n\t\t\tthis.pauseGoalForUnavailableTools(ctx);\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\t!this.activeGoal ||\n\t\t\tthis.activeGoal.id !== intent.goalId ||\n\t\t\tthis.activeGoal.status !== \"active\"\n\t\t) {\n\t\t\tthis.continuationIntent = undefined;\n\t\t\treturn false;\n\t\t}\n\t\tif (ctx.isIdle?.() !== true || hasPendingMessages(ctx)) return false;\n\n\t\tthis.continuationIntent = undefined;\n\t\tthis.continuationDelivery = intent;\n\t\ttry {\n\t\t\tthis.pi.sendUserMessage(intent.prompt, { deliverAs: \"followUp\" });\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tif (this.continuationDelivery?.marker === intent.marker) {\n\t\t\t\tthis.continuationDelivery = undefined;\n\t\t\t}\n\t\t\tif (this.activeGoal?.id === intent.goalId && this.activeGoal.status === \"active\") {\n\t\t\t\tthis.continuationIntent = intent;\n\t\t\t}\n\t\t\tctx.ui.notify(`Goal prompt failed: ${formatError(error)}`, \"error\");\n\t\t\treturn false;\n\t\t}\n\t}\n\n\thasContinuationWorkForGoal(goalId: string) {\n\t\treturn (\n\t\t\tthis.continuationIntent?.goalId === goalId || this.continuationDelivery?.goalId === goalId\n\t\t);\n\t}\n\n\tupdateStatus(ctx: StatusContext, goal: ActiveGoal) {\n\t\tthis.clearCompletionStatusTimer();\n\t\tctx.ui.setStatus(STATUS_KEY, formatStatus(goal));\n\t\t// lunr: refresh the footer every 30s while a goal is active so the elapsed time ticks\n\t\tthis.clearStatusRefreshTimer();\n\t\tif (goal.status === \"active\") {\n\t\t\tthis.statusRefreshCtx = ctx;\n\t\t\tthis.statusRefreshTimer = setInterval(() => {\n\t\t\t\tconst currentGoal = this.activeGoal;\n\t\t\t\tconst refreshCtx = this.statusRefreshCtx;\n\t\t\t\tif (!currentGoal || currentGoal.status !== \"active\" || !refreshCtx) {\n\t\t\t\t\tthis.clearStatusRefreshTimer();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\trefreshCtx.ui.setStatus(STATUS_KEY, formatStatus(currentGoal));\n\t\t\t\t} catch {\n\t\t\t\t\t// The captured ctx may be stale after session replacement or reload.\n\t\t\t\t\tthis.clearStatusRefreshTimer();\n\t\t\t\t}\n\t\t\t}, 30_000);\n\t\t\tthis.statusRefreshTimer.unref?.();\n\t\t}\n\t}\n\n\t// lunr: paired with the status refresh interval started in updateStatus()\n\tclearStatusRefreshTimer() {\n\t\tif (!this.statusRefreshTimer) return;\n\t\tclearInterval(this.statusRefreshTimer);\n\t\tthis.statusRefreshTimer = undefined;\n\t\tthis.statusRefreshCtx = undefined;\n\t}\n\n\tblockStaleGoalToolCalls() {\n\t\tthis.staleGoalToolCallsBlocked = true;\n\t}\n\n\tclearStaleGoalToolCallBlock() {\n\t\tthis.staleGoalToolCallsBlocked = false;\n\t}\n\n\tclearGoalRecovery() {\n\t\tthis.goalRecovery = undefined;\n\t}\n\n\tclearBudgetWrapUp() {\n\t\tthis.budgetWrapUp = undefined;\n\t}\n\n\tkeepBudgetWrapUpMessage(message: unknown) {\n\t\tif (!message || typeof message !== \"object\") return true;\n\t\tconst candidate = message as {\n\t\t\trole?: unknown;\n\t\t\tcustomType?: unknown;\n\t\t\tdetails?: { goalId?: unknown };\n\t\t};\n\t\tif (candidate.role !== \"custom\" || candidate.customType !== BUDGET_WRAP_UP_MESSAGE_TYPE) {\n\t\t\treturn true;\n\t\t}\n\t\treturn (\n\t\t\ttypeof candidate.details?.goalId === \"string\" &&\n\t\t\tcandidate.details.goalId === this.budgetWrapUp?.goalId &&\n\t\t\tcandidate.details.goalId === this.activeGoal?.id\n\t\t);\n\t}\n\n\tqueueBudgetWrapUp(ctx: StatusContext, goal: ActiveGoal) {\n\t\tif (!this.budgetWrapUp || this.budgetWrapUp.goalId !== goal.id) {\n\t\t\tthis.budgetWrapUp = { goalId: goal.id, delivered: false };\n\t\t}\n\t\tif (this.budgetWrapUp.delivered) return true;\n\t\tthis.budgetWrapUp.delivered = true;\n\t\ttry {\n\t\t\tthis.pi.sendMessage(\n\t\t\t\t{\n\t\t\t\t\tcustomType: BUDGET_WRAP_UP_MESSAGE_TYPE,\n\t\t\t\t\tcontent: BUDGET_WRAP_UP_PROMPT,\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tdetails: { goalId: goal.id },\n\t\t\t\t},\n\t\t\t\t{ deliverAs: \"steer\" },\n\t\t\t);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tthis.budgetWrapUp.delivered = false;\n\t\t\tctx.ui.notify(`Goal budget wrap-up failed: ${formatError(error)}`, \"error\");\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tlimitActiveGoalForBudget(ctx: StatusContext, sendWrapUp: boolean) {\n\t\tconst goal = this.activeGoal;\n\t\tif (\n\t\t\tgoal?.status !== \"active\" ||\n\t\t\tgoal.tokenBudget === undefined ||\n\t\t\tgoal.tokensUsed < goal.tokenBudget\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.cancelContinuationWork();\n\t\tthis.clearGoalRecoveryForGoal(goal.id);\n\t\tthis.clearBudgetWrapUp();\n\t\tthis.activeGoal = transitionGoal(goal, \"budget_limited\");\n\t\tthis.persistGoal(this.activeGoal);\n\t\tthis.updateStatus(ctx, this.activeGoal);\n\t\tctx.ui.notify(`Goal token budget reached: ${formatBudget(this.activeGoal)}`, \"warning\");\n\t\tif (sendWrapUp) this.queueBudgetWrapUp(ctx, this.activeGoal);\n\t\treturn true;\n\t}\n\n\tclearGoalRecoveryForGoal(goalId: string) {\n\t\tif (this.goalRecovery?.goalId === goalId) this.goalRecovery = undefined;\n\t}\n\n\tisPiOwnedCompactionRetry(event: unknown, goalId: string) {\n\t\tconst compaction = event as { reason?: unknown; willRetry?: unknown };\n\t\tif (compaction.willRetry === true) return true;\n\t\treturn (\n\t\t\tthis.goalRecovery?.goalId === goalId &&\n\t\t\tthis.goalRecovery.kind === \"compaction_retry\" &&\n\t\t\t(compaction.reason === undefined || compaction.reason === \"overflow\")\n\t\t);\n\t}\n\n\tclearContinuationTracking() {\n\t\tthis.continuationIntent = undefined;\n\t\tthis.continuationDelivery = undefined;\n\t\tthis.cancelledContinuationMarkers.clear();\n\t}\n\n\tclearPendingGoalPrompts() {\n\t\tthis.pendingGoalPromptMarkers.clear();\n\t}\n\n\tasync sendOwnedGoalPrompt(ctx: StatusContext, goalId: string, prompt: string) {\n\t\tconst pending = this.rememberPendingGoalPrompt(goalId, prompt);\n\t\tconst sent = await sendPrompt(this.pi, ctx, pending.prompt);\n\t\tif (!sent) this.pendingGoalPromptMarkers.delete(pending.marker);\n\t\treturn sent;\n\t}\n\n\tcancelContinuationWork() {\n\t\tif (this.continuationDelivery) {\n\t\t\tthis.rememberCancelledContinuationMarker(this.continuationDelivery.marker);\n\t\t}\n\t\tthis.continuationIntent = undefined;\n\t\tthis.continuationDelivery = undefined;\n\t}\n\n\tconsumeCancelledContinuationPrompt(prompt: string) {\n\t\tconst marker = extractContinuationMarker(prompt);\n\t\treturn marker ? this.cancelledContinuationMarkers.delete(marker) : false;\n\t}\n\n\tconsumeStaleOwnedGoalPrompt(prompt: string) {\n\t\tconst marker = extractGoalPromptMarker(prompt);\n\t\tif (!marker) return false;\n\t\tconst goalId = this.pendingGoalPromptMarkers.get(marker);\n\t\tif (!goalId) return false;\n\t\tif (\n\t\t\t!this.queueFrozen &&\n\t\t\t!this.pendingQueueAction &&\n\t\t\tthis.activeGoal?.id === goalId &&\n\t\t\tthis.activeGoal.status === \"active\"\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.pendingGoalPromptMarkers.delete(marker);\n\t\treturn true;\n\t}\n\n\tmarkContinuationStarted(prompt: string) {\n\t\tconst marker = extractContinuationMarker(prompt);\n\t\tif (!marker) {\n\t\t\t// A user, retry, or another extension started newer work. Cancel both an\n\t\t\t// unsent intent and a delivery that may have lost the non-atomic idle race;\n\t\t\t// the newer work's agent_end will record a fresh intent.\n\t\t\tthis.cancelContinuationWork();\n\t\t\treturn undefined;\n\t\t}\n\t\tif (this.continuationDelivery?.marker === marker) this.continuationDelivery = undefined;\n\t\treturn marker.split(\":\", 1)[0];\n\t}\n\n\tpersistGoal(goal: ActiveGoal) {\n\t\tthis.pi.appendEntry(\n\t\t\tGOAL_STATE_ENTRY_TYPE,\n\t\t\tserializeGoalState(goal, this.queuedGoals, this.pendingQueueAction),\n\t\t);\n\t}\n\n\tclearPersistedGoal(cwd: string) {\n\t\tthis.pi.appendEntry(GOAL_STATE_ENTRY_TYPE, serializeGoalState(undefined, [], undefined));\n\t\tclearLegacyPersistedGoal(cwd);\n\t}\n\n\tclearActiveGoal(ctx: StatusContext) {\n\t\tthis.clearStatusRefreshTimer(); // lunr: stop the footer refresh when the goal is cleared\n\t\tthis.cancelContinuationWork();\n\t\tthis.clearGoalRecovery();\n\t\tthis.clearBudgetWrapUp();\n\t\tthis.clearStaleGoalToolCallBlock();\n\t\tthis.activeGoal = undefined;\n\t\tthis.queuedGoals = [];\n\t\tthis.pendingQueueAction = undefined;\n\t\tthis.queueFrozen = false;\n\t\tthis.clearPersistedGoal(ctx.cwd);\n\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\t// Do not clear goalToolsUnlocked: after first activation, keep tools visible\n\t\t// for the rest of this extension runtime to avoid repeated goal-tool schema\n\t\t// churn within the same runtime.\n\t}\n\n\tisGoalToolName(name: string) {\n\t\treturn (GOAL_TOOL_NAMES as readonly string[]).includes(name);\n\t}\n\n\tgoalToolsAvailable() {\n\t\tconst active = new Set(this.pi.getActiveTools());\n\t\treturn GOAL_TOOL_NAMES.every((name) => active.has(name));\n\t}\n\n\thideGoalToolsIfLocked() {\n\t\tif (this.goalToolsUnlocked) return;\n\t\tconst active = this.pi.getActiveTools();\n\t\tconst hidden = active.filter((name) => this.isGoalToolName(name));\n\t\tif (hidden.length === 0) return;\n\t\t// lunr: do not mutate the active tool list (Anthropic tools sit at the\n\t\t// front of the cache prefix). Locked goal tools stay registered; the\n\t\t// tool_call gate rejects them until a /goal is activated.\n\t\tfor (const name of hidden) this.goalToolsHiddenByPolicy.add(name);\n\t}\n\n\trestoreGoalToolsHiddenByPolicy() {\n\t\t// lunr: flags only — the tool list is never rewritten at runtime.\n\t\tthis.goalToolsHiddenByPolicy.clear();\n\t}\n\n\tassertGoalToolsAvailable() {\n\t\tif (this.goalToolsAvailable()) return;\n\t\tthrow new Error(\n\t\t\t\"goal_complete and goal_blocked are unavailable; include them in the active tool allowlist or leave the restrictive tool mode first.\",\n\t\t);\n\t}\n\n\tensureGoalToolsVisible() {\n\t\t// lunr: never add/remove tools mid-session. Assert they were already\n\t\t// registered at session start so the wire bytes stay stable.\n\t\tthis.assertGoalToolsAvailable();\n\t}\n\n\tprepareGoalToolsForActivation(ctx: StatusContext) {\n\t\tif (this.settings.toolVisibility === \"after-first-goal\") {\n\t\t\tif (!this.goalToolsAvailable() && ctx.isIdle?.() !== true) {\n\t\t\t\tthrow new Error(\"wait until Pi is idle before revealing the goal tools\");\n\t\t\t}\n\t\t\tthis.revealGoalTools();\n\t\t\treturn;\n\t\t}\n\t\tthis.assertGoalToolsAvailable();\n\t}\n\n\t/** Mark lazy tools permanently desired for this runtime and make them active now. */\n\trevealGoalTools() {\n\t\tconst wasUnlocked = this.goalToolsUnlocked;\n\t\ttry {\n\t\t\tthis.ensureGoalToolsVisible();\n\t\t\tthis.goalToolsUnlocked = true;\n\t\t\tthis.goalToolsHiddenByPolicy.clear();\n\t\t} catch (error) {\n\t\t\tthis.goalToolsUnlocked = wasUnlocked;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tsnapshotGoalToolVisibility(): GoalToolVisibilitySnapshot {\n\t\treturn {\n\t\t\tactiveTools: this.pi.getActiveTools(),\n\t\t\tgoalToolsUnlocked: this.goalToolsUnlocked,\n\t\t\tgoalToolsHiddenByPolicy: [...this.goalToolsHiddenByPolicy],\n\t\t};\n\t}\n\n\t/**\n\t * lunr: reactivate a stopped (usage_limited / paused / blocked / budget_limited)\n\t * goal back to active WITHOUT sending a prompt. Shared by the /goal resume\n\t * command and the auto-resume hook (cron wake-up). Returns the reactivated goal\n\t * or undefined if reactivation was rejected (tools unavailable, budget reached).\n\t * Consumes resumeAfter so a single schedule only fires once.\n\t */\n\treactivateGoalForResume(ctx: StatusContext): ActiveGoal | undefined {\n\t\tif (!this.activeGoal) return undefined;\n\t\tif (!isResumableGoalStatus(this.activeGoal.status)) return undefined;\n\t\tif (\n\t\t\tthis.activeGoal.tokenBudget !== undefined &&\n\t\t\tthis.activeGoal.tokensUsed >= this.activeGoal.tokenBudget\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\ttry {\n\t\t\tthis.prepareGoalToolsForActivation(ctx);\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(`Cannot resume /goal: ${formatError(error)}`, \"error\");\n\t\t\treturn undefined;\n\t\t}\n\t\tthis.cancelContinuationWork();\n\t\tthis.clearGoalRecovery();\n\t\tthis.clearBudgetWrapUp();\n\t\tthis.clearStaleGoalToolCallBlock();\n\t\tconst next = transitionGoal(nextGoalInstance(this.activeGoal), \"active\");\n\t\tthis.activeGoal = { ...next, resumeAfter: undefined };\n\t\tthis.persistGoal(this.activeGoal);\n\t\tthis.updateStatus(ctx, this.activeGoal);\n\t\tif (this.activeGoal.status !== \"active\") return undefined;\n\t\treturn this.activeGoal;\n\t}\n\n\trestoreGoalToolVisibility(snapshot: GoalToolVisibilitySnapshot) {\n\t\t// lunr: restore unlock/hidden flags only — never rewrite the tool list.\n\t\tthis.goalToolsUnlocked = snapshot.goalToolsUnlocked;\n\t\tthis.goalToolsHiddenByPolicy.clear();\n\t\tfor (const name of snapshot.goalToolsHiddenByPolicy) {\n\t\t\tthis.goalToolsHiddenByPolicy.add(name);\n\t\t}\n\t}\n\n\tareGoalToolsLocked() {\n\t\treturn !this.goalToolsUnlocked && this.settings.toolVisibility === \"after-first-goal\";\n\t}\n\n\tpauseGoalForUnavailableTools(ctx: StatusContext, abortTurn = true, recordUsage = true) {\n\t\tconst goal = this.activeGoal;\n\t\tif (goal?.status !== \"active\") return false;\n\t\tif (recordUsage) this.recordGoalUsage(goal, ctx);\n\t\tthis.cancelContinuationWork();\n\t\tthis.clearGoalRecoveryForGoal(goal.id);\n\t\tthis.clearBudgetWrapUp();\n\t\tif (abortTurn) {\n\t\t\tthis.blockStaleGoalToolCalls();\n\t\t\tabortCurrentTurn(ctx);\n\t\t} else {\n\t\t\tthis.clearStaleGoalToolCallBlock();\n\t\t}\n\t\tthis.activeGoal = transitionGoal(goal, \"paused\");\n\t\tthis.persistGoal(this.activeGoal);\n\t\tthis.updateStatus(ctx, this.activeGoal);\n\t\tctx.ui.notify(\n\t\t\t\"Goal tools are unavailable, so the active goal was paused. Restore the tools and run /goal resume.\",\n\t\t\t\"warning\",\n\t\t);\n\t\treturn true;\n\t}\n\n\tshowCompletionStatus(ctx: StatusContext) {\n\t\tthis.clearCompletionStatusTimer();\n\t\tthis.clearStatusRefreshTimer(); // lunr: stop the footer refresh on completion\n\t\t// lunr: enriched footer status format\n\t\tctx.ui.setStatus(STATUS_KEY, \"goal ✓ complete\");\n\t\tthis.completionStatusTimer = setTimeout(() => {\n\t\t\tthis.completionStatusTimer = undefined;\n\t\t\ttry {\n\t\t\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\t\t} catch {\n\t\t\t\t// The completion status is best-effort; the captured ctx may be stale after\n\t\t\t\t// session replacement or reload before this timer fires.\n\t\t\t}\n\t\t}, 8_000);\n\t}\n\n\tclearCompletionStatusTimer() {\n\t\tif (!this.completionStatusTimer) return;\n\t\tclearTimeout(this.completionStatusTimer);\n\t\tthis.completionStatusTimer = undefined;\n\t}\n\n\tprivate rememberPendingGoalPrompt(goalId: string, prompt: string) {\n\t\tconst marker = randomUUID();\n\t\tthis.pendingGoalPromptMarkers.set(marker, goalId);\n\t\tif (this.pendingGoalPromptMarkers.size > MAX_PENDING_GOAL_PROMPTS) {\n\t\t\tconst oldest = this.pendingGoalPromptMarkers.keys().next().value;\n\t\t\tif (oldest) this.pendingGoalPromptMarkers.delete(oldest);\n\t\t}\n\t\treturn { marker, prompt: `${prompt}\\n\\n<!-- ${GOAL_PROMPT_MARKER_PREFIX}${marker} -->` };\n\t}\n\n\tprivate consumePendingGoalPrompt(prompt: string) {\n\t\tconst marker = extractGoalPromptMarker(prompt);\n\t\tif (!marker) return undefined;\n\t\tconst goalId = this.pendingGoalPromptMarkers.get(marker);\n\t\tthis.pendingGoalPromptMarkers.delete(marker);\n\t\treturn goalId;\n\t}\n\n\tconsumeOwnedGoalPrompt(prompt: string) {\n\t\treturn this.consumePendingGoalPrompt(prompt);\n\t}\n\n\tprivate rememberCancelledContinuationMarker(marker: string) {\n\t\tthis.cancelledContinuationMarkers.add(marker);\n\t\tif (this.cancelledContinuationMarkers.size <= MAX_CANCELLED_CONTINUATION_PROMPTS) return;\n\t\tconst oldest = this.cancelledContinuationMarkers.values().next().value;\n\t\tif (oldest) this.cancelledContinuationMarkers.delete(oldest);\n\t}\n}\n\nexport function createGoal(\n\ttext: string,\n\ttokenBudget: number | undefined,\n\tbaselineTokens: number,\n): ActiveGoal {\n\tconst now = Date.now();\n\treturn {\n\t\tid: randomUUID(),\n\t\ttext,\n\t\tstatus: \"active\",\n\t\tstartedAt: now,\n\t\tupdatedAt: now,\n\t\titeration: 0,\n\t\ttokenBudget,\n\t\ttokensUsed: 0,\n\t\ttimeUsedSeconds: 0,\n\t\tbaselineTokens,\n\t\tactiveStartedAt: now,\n\t};\n}\n\nexport function transitionGoal(goal: ActiveGoal, requestedStatus: GoalStatus): ActiveGoal {\n\tconst now = Date.now();\n\tconst status =\n\t\trequestedStatus === \"active\" &&\n\t\tgoal.tokenBudget !== undefined &&\n\t\tgoal.tokensUsed >= goal.tokenBudget\n\t\t\t? \"budget_limited\"\n\t\t\t: requestedStatus;\n\tconst next = { ...goal, status, updatedAt: now };\n\tcheckpointGoalActiveTime(next, now, status === \"active\");\n\treturn next;\n}\n\nexport function nextGoalInstance(goal: ActiveGoal): ActiveGoal {\n\treturn { ...goal, id: randomUUID(), updatedAt: Date.now() };\n}\n\nexport function editedGoalStatus(status: GoalStatus): GoalStatus {\n\tif (status === \"paused\" || status === \"blocked\" || status === \"usage_limited\") return status;\n\treturn \"active\";\n}\n\nexport function incrementGoal(goal: ActiveGoal): ActiveGoal {\n\treturn { ...goal, iteration: goal.iteration + 1, updatedAt: Date.now() };\n}\n\n// lunr: enriched footer status — `goal ● active · 3m · 2 turns` (rendered by ashxj-tui)\nexport function formatStatus(goal: ActiveGoal | undefined) {\n\tif (!goal) return undefined;\n\tif (goal.status === \"complete\") return \"goal ✓ complete\";\n\tif (goal.status === \"queued\") return \"goal queued\";\n\tif (goal.status === \"paused\") {\n\t\treturn `goal ◌ paused · ${formatGoalElapsed(goal)} · ${formatGoalTurns(goal)}`;\n\t}\n\tif (goal.status === \"blocked\") return \"goal ✗ blocked\";\n\tif (goal.status === \"usage_limited\") return \"goal usage-limited\";\n\tif (goal.status === \"budget_limited\") return `goal budget ${formatBudget(goal)}`;\n\tconst status = `goal ● active · ${formatGoalElapsed(goal)} · ${formatGoalTurns(goal)}`;\n\tif (goal.tokenBudget !== undefined) return `${status} · ${formatBudget(goal)}`;\n\treturn status;\n}\n\n// lunr: live elapsed = accumulated active time + the in-progress active segment\nfunction goalElapsedSeconds(goal: ActiveGoal) {\n\tlet seconds = nonNegativeFiniteNumber(goal.timeUsedSeconds);\n\tif (typeof goal.activeStartedAt === \"number\" && Number.isFinite(goal.activeStartedAt)) {\n\t\tseconds += Math.max(0, Date.now() - goal.activeStartedAt) / 1000;\n\t}\n\treturn seconds;\n}\n\n// lunr: footer elapsed format — `Xm` under 1h, `XhYm` after\nfunction formatGoalElapsed(goal: ActiveGoal) {\n\tconst totalMinutes = Math.floor(goalElapsedSeconds(goal) / 60);\n\tif (totalMinutes < 60) return `${totalMinutes}m`;\n\treturn `${Math.floor(totalMinutes / 60)}h${totalMinutes % 60}m`;\n}\n\n// lunr: footer turn count, singular at 1\nfunction formatGoalTurns(goal: ActiveGoal) {\n\treturn goal.iteration === 1 ? \"1 turn\" : `${goal.iteration} turns`;\n}\n\nexport function formatBudget(goal: ActiveGoal) {\n\treturn `${formatTokenCount(goal.tokensUsed)}/${formatTokenCount(goal.tokenBudget ?? 0)}`;\n}\n\nexport function goalSummary(\n\tgoal: ActiveGoal,\n\tqueuedGoals: readonly ActiveGoal[] = [],\n\texperimentalGoals = false,\n\tqueueFrozen = false,\n) {\n\tconst summary = [\n\t\t`Goal: ${goal.text}`,\n\t\t`Status: ${queueFrozen ? \"queue off\" : goal.status}`,\n\t\t`Iteration: ${goal.iteration}`,\n\t\t`Active elapsed: ${formatDuration(goal.timeUsedSeconds)}`,\n\t\t`Tokens: ${goal.tokenBudget === undefined ? formatTokenCount(goal.tokensUsed) : formatBudget(goal)}`,\n\t];\n\tif (experimentalGoals || queuedGoals.length > 0 || queueFrozen) {\n\t\tsummary.push(\n\t\t\t`Goals (${queuedGoals.length + 1}):`,\n\t\t\t...[goal, ...queuedGoals].map(\n\t\t\t\t(queuedGoal, index) => `${index + 1}. [${queuedGoal.status}] ${queuedGoal.text}`,\n\t\t\t),\n\t\t);\n\t}\n\tif (queueFrozen) {\n\t\tsummary.push(\n\t\t\t\"Queue is frozen. Re-enable experimental.goals and run /reload, or use /goal clear.\",\n\t\t\t\"Commands: /goal, /goal clear\",\n\t\t);\n\t} else {\n\t\tsummary.push(`Commands: ${goalCommandHint(goal.status, experimentalGoals)}`);\n\t}\n\treturn summary.join(\"\\n\");\n}\n\nexport function hasPendingMessages(ctx: StatusContext) {\n\treturn ctx.hasPendingMessages?.() ?? false;\n}\n\nexport function abortCurrentTurn(ctx: StatusContext) {\n\ttry {\n\t\tctx.abort?.();\n\t} catch {\n\t\t// Best effort: stale goal guards still prevent follow-on tool calls.\n\t}\n}\n\nexport function blocksStaleGoalToolCalls(status: GoalStatus) {\n\treturn status === \"paused\" || status === \"blocked\" || status === \"usage_limited\";\n}\n\nexport function isResumableGoalStatus(status: GoalStatus) {\n\treturn blocksStaleGoalToolCalls(status) || status === \"budget_limited\";\n}\n\nexport function stoppedStatusLabel(status: GoalStatus) {\n\tif (status === \"usage_limited\") return \"usage-limited\";\n\tif (status === \"budget_limited\") return \"budget-limited\";\n\treturn status;\n}\n\nexport function isContradictoryCompletionSummary(summary: string) {\n\treturn CONTRADICTORY_COMPLETION_PATTERNS.some((pattern) => pattern.test(summary));\n}\n\nexport function goalIdRejectionReason(goal: ActiveGoal, requestedGoalId: string) {\n\tif (!requestedGoalId) return \"missing goal_id\";\n\tif (requestedGoalId !== goal.id) return \"goal_id does not match the active goal\";\n\treturn undefined;\n}\n\nexport function isUsageLimitedGoalInterruption(assistant: AssistantMessageLike) {\n\tconst errorMessage = assistant.errorMessage;\n\treturn (\n\t\tassistant.stopReason === \"error\" &&\n\t\ttypeof errorMessage === \"string\" &&\n\t\tUSAGE_LIMIT_GOAL_ERROR_PATTERNS.some((pattern) => pattern.test(errorMessage))\n\t);\n}\n\nexport function isRetryableGoalInterruption(assistant: AssistantMessageLike) {\n\tif (assistant.stopReason !== \"error\") return false;\n\tif (!assistant.errorMessage) return false;\n\tif (\n\t\tisUsageLimitedGoalInterruption(assistant) ||\n\t\tNON_RETRYABLE_GOAL_ERROR_RE.test(assistant.errorMessage)\n\t) {\n\t\treturn false;\n\t}\n\treturn (\n\t\tisGoalContextOverflow(assistant) ||\n\t\tRETRYABLE_GOAL_ERROR_PATTERNS.some((pattern) => pattern.test(assistant.errorMessage ?? \"\"))\n\t);\n}\n\nexport function isGoalContextOverflow(assistant: AssistantMessageLike) {\n\treturn isContextOverflow(toPiAssistantMessage(assistant));\n}\n\n/**\n * lunr: best-effort extraction of a usage-limit reset time from a provider error\n * message. Returns an absolute epoch ms to resume after, or undefined. Handles\n * relative delays (\"reset in 2h\", \"try again in 30m\", \"available in 3600s\") and\n * ISO-8601 timestamps. Most provider errors omit this, so undefined is the norm.\n */\nconst USAGE_RESET_TIME_PATTERNS = [\n\t/reset(?:s|ting)?\\s*(?:in|after|at)?\\s*(\\d+)\\s*s(ec)?/i,\n\t/reset(?:s|ting)?\\s*(?:in|after|at)?\\s*(\\d+)\\s*m(in)?/i,\n\t/reset(?:s|ting)?\\s*(?:in|after|at)?\\s*(\\d+)\\s*h(our|r)?/i,\n\t/(?:retry|try(?:\\s+again)?|available)\\s+(?:in|after|at)\\s*(\\d+)\\s*s(ec)?/i,\n\t/(?:retry|try(?:\\s+again)?|available)\\s+(?:in|after|at)\\s*(\\d+)\\s*m(in)?/i,\n\t/(?:retry|try(?:\\s+again)?|available)\\s+(?:in|after|at)\\s*(\\d+)\\s*h(our|r)?/i,\n] as const;\n\nexport function parseUsageResetTimeMs(errorMessage: string | undefined): number | undefined {\n\tif (!errorMessage) return undefined;\n\tconst now = Date.now();\n\tfor (const pattern of USAGE_RESET_TIME_PATTERNS) {\n\t\tconst match = errorMessage.match(pattern);\n\t\tif (!match) continue;\n\t\tconst value = Number.parseInt(match[1] ?? \"\", 10);\n\t\tif (!Number.isFinite(value) || value <= 0) continue;\n\t\tconst unit = pattern.source.includes(\"\\\\s*h\") ? 3600_000 : pattern.source.includes(\"\\\\s*m\") ? 60_000 : 1_000;\n\t\treturn now + value * unit;\n\t}\n\t// ISO-8601 timestamp fallback (e.g. \"reset at 2026-08-01T09:00:00Z\").\n\tconst isoMatch = errorMessage.match(/(?:reset|available).{0,12}(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?(?:Z|[+-]\\d{2}:?\\d{2})?)/i);\n\tif (isoMatch?.[1]) {\n\t\tconst parsed = Date.parse(isoMatch[1]);\n\t\tif (Number.isFinite(parsed) && parsed > now) return parsed;\n\t}\n\treturn undefined;\n}\n\nexport function findFinalAssistantMessage(messages: unknown[]): AssistantMessageLike | undefined {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst message = messages[i];\n\t\tif (!message || typeof message !== \"object\") continue;\n\t\tconst candidate = message as Record<string, unknown>;\n\t\tif (candidate.role !== \"assistant\") continue;\n\t\tconst assistant: AssistantMessageLike = {\n\t\t\trole: \"assistant\",\n\t\t\tstopReason: isAgentStopReason(candidate.stopReason) ? candidate.stopReason : undefined,\n\t\t\terrorMessage: typeof candidate.errorMessage === \"string\" ? candidate.errorMessage : undefined,\n\t\t};\n\t\tif (Array.isArray(candidate.content)) {\n\t\t\tassistant.content = candidate.content as PiAssistantMessage[\"content\"];\n\t\t}\n\t\tif (typeof candidate.api === \"string\") assistant.api = candidate.api;\n\t\tif (typeof candidate.provider === \"string\") assistant.provider = candidate.provider;\n\t\tif (typeof candidate.model === \"string\") assistant.model = candidate.model;\n\t\tif (typeof candidate.timestamp === \"number\") assistant.timestamp = candidate.timestamp;\n\t\tconst usage = normalizeUsage(candidate.usage);\n\t\tif (usage) assistant.usage = usage;\n\t\treturn assistant;\n\t}\n\treturn undefined;\n}\n\nexport function formatError(error: unknown) {\n\treturn truncateNotification(error instanceof Error ? error.message : String(error));\n}\n\nexport function truncateNotification(value: string) {\n\treturn value.length > 160 ? `${value.slice(0, 157)}...` : value;\n}\n\nasync function sendPrompt(pi: ExtensionAPI, ctx: StatusContext, prompt: string) {\n\ttry {\n\t\tawait pi.sendUserMessage(prompt, { deliverAs: \"followUp\" });\n\t\treturn true;\n\t} catch (error) {\n\t\tctx.ui.notify(`Goal prompt failed: ${formatError(error)}`, \"error\");\n\t\treturn false;\n\t}\n}\n\nfunction goalCommandHint(status: GoalStatus, experimentalGoals = false) {\n\tconst queueCommands = experimentalGoals\n\t\t? \", /goal add <objective>, /goal prioritize <objective>, /goal drop-last, /goal skip\"\n\t\t: \"\";\n\tif (status === \"active\") {\n\t\treturn `/goal edit <objective>, /goal pause, /goal clear${queueCommands}`;\n\t}\n\tif (isResumableGoalStatus(status)) {\n\t\treturn `/goal edit <objective>, /goal resume, /goal clear${queueCommands}`;\n\t}\n\treturn `/goal edit <objective>, /goal clear${queueCommands}`;\n}\n\nfunction toPiAssistantMessage(assistant: AssistantMessageLike): PiAssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: assistant.content ?? [],\n\t\tapi: assistant.api ?? \"openai-responses\",\n\t\tprovider: assistant.provider ?? \"unknown\",\n\t\tmodel: assistant.model ?? \"unknown\",\n\t\tusage: assistant.usage ?? zeroUsage(),\n\t\tstopReason: assistant.stopReason ?? \"error\",\n\t\terrorMessage: assistant.errorMessage,\n\t\ttimestamp: assistant.timestamp ?? Date.now(),\n\t};\n}\n\nfunction zeroUsage(): Usage {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotal: 0,\n\t\t},\n\t};\n}\n\nfunction continuationMarker(goal: ActiveGoal) {\n\treturn `${goal.id}:${goal.iteration}:${randomUUID()}`;\n}\n\nfunction escapeRegExpText(value: string) {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst GOAL_PROMPT_MARKER_PATTERN = new RegExp(\n\t`<!--\\\\s*${escapeRegExpText(GOAL_PROMPT_MARKER_PREFIX)}([^\\\\s>]+)\\\\s*-->`,\n);\nconst CONTINUATION_MARKER_PATTERN = new RegExp(\n\t`<!--\\\\s*${escapeRegExpText(CONTINUATION_MARKER_PREFIX)}([^\\\\s>]+)\\\\s*-->`,\n);\n\nfunction extractGoalPromptMarker(prompt: string) {\n\treturn GOAL_PROMPT_MARKER_PATTERN.exec(prompt)?.[1];\n}\n\nfunction extractContinuationMarker(prompt: string) {\n\treturn CONTINUATION_MARKER_PATTERN.exec(prompt)?.[1];\n}\n\nfunction isAgentStopReason(value: unknown): value is AgentStopReason {\n\treturn [\"stop\", \"length\", \"toolUse\", \"error\", \"aborted\"].includes(String(value));\n}\n\nfunction normalizeUsage(value: unknown): Usage | undefined {\n\tif (!value || typeof value !== \"object\") return undefined;\n\tconst usage = value as Partial<Usage>;\n\tif (typeof usage.input !== \"number\" || typeof usage.output !== \"number\") return undefined;\n\treturn {\n\t\tinput: nonNegativeFiniteNumber(usage.input),\n\t\toutput: nonNegativeFiniteNumber(usage.output),\n\t\tcacheRead: nonNegativeFiniteNumber(usage.cacheRead),\n\t\tcacheWrite: nonNegativeFiniteNumber(usage.cacheWrite),\n\t\ttotalTokens: assistantUsageTokens(usage),\n\t\tcost: {\n\t\t\tinput: usage.cost?.input ?? 0,\n\t\t\toutput: usage.cost?.output ?? 0,\n\t\t\tcacheRead: usage.cost?.cacheRead ?? 0,\n\t\t\tcacheWrite: usage.cost?.cacheWrite ?? 0,\n\t\t\ttotal: usage.cost?.total ?? 0,\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../../src/builtin-extensions/narumiruna-pi-goal/src/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { randomUUID } from \"node:crypto\";\nimport {\n\tisContextOverflow,\n\ttype AssistantMessage as PiAssistantMessage,\n\ttype Usage,\n} from \"@ashx-j/lunr-ai\";\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport {\n\tassistantUsageTokens,\n\tcheckpointGoalActiveTime,\n\tformatDuration,\n\tformatTokenCount,\n\tnonNegativeFiniteNumber,\n\tupdateGoalUsage,\n} from \"./accounting.js\";\nimport {\n\ttype ActiveGoal,\n\tclearLegacyPersistedGoal,\n\ttype PendingQueueAction,\n\tserializeGoalState,\n} from \"./persistence.js\";\nimport { buildContinuePrompt, type GoalStatus } from \"./prompts.js\";\nimport { DEFAULT_GOAL_SETTINGS, type GoalSettings } from \"./settings.js\";\nimport { enterGoalAuto, leaveGoalAuto } from \"../../../core/permission-mode-control.js\";\n\nexport type AgentStopReason = \"stop\" | \"length\" | \"toolUse\" | \"error\" | \"aborted\";\n\nexport interface ContinuationTicket {\n\tgoalId: string;\n\titeration: number;\n\tmarker: string;\n\tprompt: string;\n}\n\nexport interface BudgetWrapUp {\n\tgoalId: string;\n\tdelivered: boolean;\n}\n\nexport type GoalRecoveryKind = \"provider_retry\" | \"compaction_retry\";\n\nexport interface GoalRecovery {\n\tgoalId: string;\n\tkind: GoalRecoveryKind;\n}\n\nexport interface AssistantMessageLike {\n\trole: \"assistant\";\n\tstopReason?: AgentStopReason;\n\terrorMessage?: string;\n\tcontent?: PiAssistantMessage[\"content\"];\n\tapi?: PiAssistantMessage[\"api\"];\n\tprovider?: PiAssistantMessage[\"provider\"];\n\tmodel?: string;\n\tusage?: Usage;\n\ttimestamp?: number;\n}\n\nexport interface StatusContext {\n\tcwd: string;\n\tui: {\n\t\tconfirm: (title: string, message: string) => Promise<boolean>;\n\t\tnotify: (message: string, level?: \"info\" | \"warning\" | \"error\") => void;\n\t\tsetStatus: (key: string, value: string | undefined) => void;\n\t};\n\tisIdle?: () => boolean;\n\thasPendingMessages?: () => boolean;\n\tabort?: () => void;\n\tsessionManager?: unknown;\n}\n\nexport interface GoalToolVisibilitySnapshot {\n\tactiveTools: string[];\n\tgoalToolsUnlocked: boolean;\n\tgoalToolsHiddenByPolicy: string[];\n}\n\nexport const STATUS_KEY = \"goal\";\nexport const GOAL_STATE_ENTRY_TYPE = \"goal-state\";\nexport const GOAL_COMPLETE_TOOL = \"goal_complete\";\nexport const GOAL_BLOCKED_TOOL = \"goal_blocked\";\nexport const GOAL_TOOL_NAMES = [GOAL_COMPLETE_TOOL, GOAL_BLOCKED_TOOL] as const;\n\nconst MAX_CANCELLED_CONTINUATION_PROMPTS = 20;\nconst MAX_PENDING_GOAL_PROMPTS = 20;\nconst GOAL_PROMPT_MARKER_PREFIX = \"pi-goal-prompt:\";\nconst CONTINUATION_MARKER_PREFIX = \"pi-goal-continuation:\";\nconst BUDGET_WRAP_UP_MESSAGE_TYPE = \"goal-budget-wrap-up\";\nconst BUDGET_WRAP_UP_PROMPT =\n\t\"The active /goal token budget is exhausted. Stop substantive work and do not call substantive tools. Summarize progress, verified results, remaining work, and blockers concisely. Treat completion as unproven. Do not call goal_complete unless authoritative, requirement-by-requirement evidence already proves every requirement is complete. Weak, indirect, or missing evidence is not enough. Budget exhaustion is not completion.\";\nconst CONTRADICTORY_COMPLETION_PATTERNS = [\n\t/(?<!could\\s)\\bnot\\s+(?:yet\\s+)?(?:complete|completed|done|finished)\\b/i,\n\t/\\bstill\\s+(?:incomplete|failing|failing\\s+tests?|fails?)\\b/i,\n\t/\\btests?\\s+(?:still\\s+)?fail(?:ing)?\\b/i,\n] as const;\nconst USAGE_LIMIT_GOAL_ERROR_PATTERNS = [\n\t/usage[_\\s-]*(?:limit|cap)|chatgpt.{0,32}usage/i,\n\t/quota.{0,32}(?:reached|exceeded|exhausted|depleted)|(?:reached|exceeded|exhausted|depleted).{0,32}quota/i,\n\t/insufficient[_\\s-]*(?:quota|credits?)|out of credits|out of budget|available balance|payment required/i,\n\t/(?:credit|balance).{0,32}(?:low|exhausted|depleted)|billing/i,\n] as const;\nconst NON_RETRYABLE_GOAL_ERROR_RE =\n\t/multi-auth rotation failed|credentials tried|unauthori[sz]ed|invalid api key/i;\n// Pi 0.79 does not export its assistant-error retry classifier. Keep this\n// compatibility mirror aligned with Pi's public retry utility in newer versions.\nconst RETRYABLE_GOAL_ERROR_PATTERNS = [\n\t/overloaded|rate.?limit|too many requests|\\b(?:429|500|502|503|504)\\b|service.?unavailable|server.?error|internal.?error/i,\n\t/provider.?returned.?error|you can retry your request|try your request again|please retry your request/i,\n\t/network.?error|connection.?(?:error|refused|lost)|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up/i,\n\t/timed? out|timeout|terminated|websocket.?(?:closed|error)|ended without|stream ended before message_stop|http2 request did not get a response|retry delay/i,\n\t/context[_\\s-]*length[_\\s-]*exceeded|input exceeds the context window/i,\n] as const;\n\n// One instance belongs to one extension factory. It owns all mutable session state\n// and the cross-cutting invariants used by command and lifecycle orchestration.\nexport class GoalRuntime {\n\tsettings: GoalSettings = DEFAULT_GOAL_SETTINGS;\n\tactiveGoal?: ActiveGoal;\n\tqueuedGoals: ActiveGoal[] = [];\n\tpendingQueueAction?: PendingQueueAction;\n\tqueueFrozen = false;\n\tcompletionStatusTimer?: NodeJS.Timeout;\n\t// lunr: 30s footer refresh timer so the goal indicator's elapsed minutes tick while active\n\tstatusRefreshTimer?: NodeJS.Timeout;\n\tstatusRefreshCtx?: StatusContext;\n\tcontinuationIntent?: ContinuationTicket;\n\tcontinuationDelivery?: ContinuationTicket;\n\tgoalRecovery?: GoalRecovery;\n\tbudgetWrapUp?: BudgetWrapUp;\n\t/** `null` marks a run that must not be charged to the active goal. */\n\tagentRunGoalId?: string | null;\n\tstaleGoalToolCallsBlocked = false;\n\t/** Once true, goal tools stay in the active set for this runtime (prompt-cache stable). */\n\tgoalToolsUnlocked = false;\n\t/** Exact lazy goal tools this runtime removed and may restore on a mode change. */\n\tgoalToolsHiddenByPolicy = new Set<string>();\n\tpendingGoalPromptMarkers = new Map<string, string>();\n\tcancelledContinuationMarkers = new Set<string>();\n\n\treadonly pi: ExtensionAPI;\n\n\tconstructor(pi: ExtensionAPI) {\n\t\tthis.pi = pi;\n\t}\n\n\tcanRecordGoalUsage() {\n\t\treturn (\n\t\t\tthis.agentRunGoalId !== null &&\n\t\t\t!(\n\t\t\t\tthis.pendingQueueAction?.kind === \"prioritize\" &&\n\t\t\t\tthis.pendingQueueAction.displacedUsageFinalized === true\n\t\t\t)\n\t\t);\n\t}\n\n\thasActiveBudgetWrapUp() {\n\t\treturn (\n\t\t\tthis.activeGoal?.status === \"budget_limited\" &&\n\t\t\tthis.budgetWrapUp?.goalId === this.activeGoal.id &&\n\t\t\tthis.budgetWrapUp.delivered\n\t\t);\n\t}\n\n\thasActiveGoalRecovery() {\n\t\treturn Boolean(this.activeGoal && this.goalRecovery?.goalId === this.activeGoal.id);\n\t}\n\n\trecordGoalUsage(\n\t\tgoal: ActiveGoal,\n\t\tctx: StatusContext,\n\t\tcheckpointActiveTime = goal.status === \"active\",\n\t) {\n\t\tif (!this.canRecordGoalUsage()) return false;\n\t\tupdateGoalUsage(goal, ctx, checkpointActiveTime);\n\t\treturn true;\n\t}\n\n\trequestContinuation(goal: ActiveGoal) {\n\t\tif (this.hasContinuationWorkForGoal(goal.id)) return false;\n\t\tconst marker = continuationMarker(goal);\n\t\tthis.continuationIntent = {\n\t\t\tgoalId: goal.id,\n\t\t\titeration: goal.iteration,\n\t\t\tmarker,\n\t\t\tprompt: buildContinuePrompt(goal, marker),\n\t\t};\n\t\treturn true;\n\t}\n\n\tdispatchContinuationIfSettled(ctx: StatusContext) {\n\t\tconst intent = this.continuationIntent;\n\t\tif (!intent) return false;\n\t\tif (this.activeGoal?.status === \"active\" && !this.goalToolsAvailable()) {\n\t\t\tthis.pauseGoalForUnavailableTools(ctx);\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\t!this.activeGoal ||\n\t\t\tthis.activeGoal.id !== intent.goalId ||\n\t\t\tthis.activeGoal.status !== \"active\"\n\t\t) {\n\t\t\tthis.continuationIntent = undefined;\n\t\t\treturn false;\n\t\t}\n\t\tif (ctx.isIdle?.() !== true || hasPendingMessages(ctx)) return false;\n\n\t\tthis.continuationIntent = undefined;\n\t\tthis.continuationDelivery = intent;\n\t\ttry {\n\t\t\tthis.pi.sendUserMessage(intent.prompt, { deliverAs: \"followUp\" });\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tif (this.continuationDelivery?.marker === intent.marker) {\n\t\t\t\tthis.continuationDelivery = undefined;\n\t\t\t}\n\t\t\tif (this.activeGoal?.id === intent.goalId && this.activeGoal.status === \"active\") {\n\t\t\t\tthis.continuationIntent = intent;\n\t\t\t}\n\t\t\tctx.ui.notify(`Goal prompt failed: ${formatError(error)}`, \"error\");\n\t\t\treturn false;\n\t\t}\n\t}\n\n\thasContinuationWorkForGoal(goalId: string) {\n\t\treturn (\n\t\t\tthis.continuationIntent?.goalId === goalId || this.continuationDelivery?.goalId === goalId\n\t\t);\n\t}\n\n\tsyncGoalPermissionMode(goal?: ActiveGoal) {\n\t\tif (goal?.status === \"active\") enterGoalAuto();\n\t\telse leaveGoalAuto();\n\t}\n\n\tupdateStatus(ctx: StatusContext, goal: ActiveGoal) {\n\t\tthis.clearCompletionStatusTimer();\n\t\tthis.syncGoalPermissionMode(goal);\n\t\tctx.ui.setStatus(STATUS_KEY, formatStatus(goal));\n\t\t// lunr: refresh the footer every 30s while a goal is active so the elapsed time ticks\n\t\tthis.clearStatusRefreshTimer();\n\t\tif (goal.status === \"active\") {\n\t\t\tthis.statusRefreshCtx = ctx;\n\t\t\tthis.statusRefreshTimer = setInterval(() => {\n\t\t\t\tconst currentGoal = this.activeGoal;\n\t\t\t\tconst refreshCtx = this.statusRefreshCtx;\n\t\t\t\tif (!currentGoal || currentGoal.status !== \"active\" || !refreshCtx) {\n\t\t\t\t\tthis.clearStatusRefreshTimer();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\trefreshCtx.ui.setStatus(STATUS_KEY, formatStatus(currentGoal));\n\t\t\t\t} catch {\n\t\t\t\t\t// The captured ctx may be stale after session replacement or reload.\n\t\t\t\t\tthis.clearStatusRefreshTimer();\n\t\t\t\t}\n\t\t\t}, 30_000);\n\t\t\tthis.statusRefreshTimer.unref?.();\n\t\t}\n\t}\n\n\t// lunr: paired with the status refresh interval started in updateStatus()\n\tclearStatusRefreshTimer() {\n\t\tif (!this.statusRefreshTimer) return;\n\t\tclearInterval(this.statusRefreshTimer);\n\t\tthis.statusRefreshTimer = undefined;\n\t\tthis.statusRefreshCtx = undefined;\n\t}\n\n\tblockStaleGoalToolCalls() {\n\t\tthis.staleGoalToolCallsBlocked = true;\n\t}\n\n\tclearStaleGoalToolCallBlock() {\n\t\tthis.staleGoalToolCallsBlocked = false;\n\t}\n\n\tclearGoalRecovery() {\n\t\tthis.goalRecovery = undefined;\n\t}\n\n\tclearBudgetWrapUp() {\n\t\tthis.budgetWrapUp = undefined;\n\t}\n\n\tkeepBudgetWrapUpMessage(message: unknown) {\n\t\tif (!message || typeof message !== \"object\") return true;\n\t\tconst candidate = message as {\n\t\t\trole?: unknown;\n\t\t\tcustomType?: unknown;\n\t\t\tdetails?: { goalId?: unknown };\n\t\t};\n\t\tif (candidate.role !== \"custom\" || candidate.customType !== BUDGET_WRAP_UP_MESSAGE_TYPE) {\n\t\t\treturn true;\n\t\t}\n\t\treturn (\n\t\t\ttypeof candidate.details?.goalId === \"string\" &&\n\t\t\tcandidate.details.goalId === this.budgetWrapUp?.goalId &&\n\t\t\tcandidate.details.goalId === this.activeGoal?.id\n\t\t);\n\t}\n\n\tqueueBudgetWrapUp(ctx: StatusContext, goal: ActiveGoal) {\n\t\tif (!this.budgetWrapUp || this.budgetWrapUp.goalId !== goal.id) {\n\t\t\tthis.budgetWrapUp = { goalId: goal.id, delivered: false };\n\t\t}\n\t\tif (this.budgetWrapUp.delivered) return true;\n\t\tthis.budgetWrapUp.delivered = true;\n\t\ttry {\n\t\t\tthis.pi.sendMessage(\n\t\t\t\t{\n\t\t\t\t\tcustomType: BUDGET_WRAP_UP_MESSAGE_TYPE,\n\t\t\t\t\tcontent: BUDGET_WRAP_UP_PROMPT,\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tdetails: { goalId: goal.id },\n\t\t\t\t},\n\t\t\t\t{ deliverAs: \"steer\" },\n\t\t\t);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tthis.budgetWrapUp.delivered = false;\n\t\t\tctx.ui.notify(`Goal budget wrap-up failed: ${formatError(error)}`, \"error\");\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tlimitActiveGoalForBudget(ctx: StatusContext, sendWrapUp: boolean) {\n\t\tconst goal = this.activeGoal;\n\t\tif (\n\t\t\tgoal?.status !== \"active\" ||\n\t\t\tgoal.tokenBudget === undefined ||\n\t\t\tgoal.tokensUsed < goal.tokenBudget\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.cancelContinuationWork();\n\t\tthis.clearGoalRecoveryForGoal(goal.id);\n\t\tthis.clearBudgetWrapUp();\n\t\tthis.activeGoal = transitionGoal(goal, \"budget_limited\");\n\t\tthis.persistGoal(this.activeGoal);\n\t\tthis.updateStatus(ctx, this.activeGoal);\n\t\tctx.ui.notify(`Goal token budget reached: ${formatBudget(this.activeGoal)}`, \"warning\");\n\t\tif (sendWrapUp) this.queueBudgetWrapUp(ctx, this.activeGoal);\n\t\treturn true;\n\t}\n\n\tclearGoalRecoveryForGoal(goalId: string) {\n\t\tif (this.goalRecovery?.goalId === goalId) this.goalRecovery = undefined;\n\t}\n\n\tisPiOwnedCompactionRetry(event: unknown, goalId: string) {\n\t\tconst compaction = event as { reason?: unknown; willRetry?: unknown };\n\t\tif (compaction.willRetry === true) return true;\n\t\treturn (\n\t\t\tthis.goalRecovery?.goalId === goalId &&\n\t\t\tthis.goalRecovery.kind === \"compaction_retry\" &&\n\t\t\t(compaction.reason === undefined || compaction.reason === \"overflow\")\n\t\t);\n\t}\n\n\tclearContinuationTracking() {\n\t\tthis.continuationIntent = undefined;\n\t\tthis.continuationDelivery = undefined;\n\t\tthis.cancelledContinuationMarkers.clear();\n\t}\n\n\tclearPendingGoalPrompts() {\n\t\tthis.pendingGoalPromptMarkers.clear();\n\t}\n\n\tasync sendOwnedGoalPrompt(ctx: StatusContext, goalId: string, prompt: string) {\n\t\tconst pending = this.rememberPendingGoalPrompt(goalId, prompt);\n\t\tconst sent = await sendPrompt(this.pi, ctx, pending.prompt);\n\t\tif (!sent) this.pendingGoalPromptMarkers.delete(pending.marker);\n\t\treturn sent;\n\t}\n\n\tcancelContinuationWork() {\n\t\tif (this.continuationDelivery) {\n\t\t\tthis.rememberCancelledContinuationMarker(this.continuationDelivery.marker);\n\t\t}\n\t\tthis.continuationIntent = undefined;\n\t\tthis.continuationDelivery = undefined;\n\t}\n\n\tconsumeCancelledContinuationPrompt(prompt: string) {\n\t\tconst marker = extractContinuationMarker(prompt);\n\t\treturn marker ? this.cancelledContinuationMarkers.delete(marker) : false;\n\t}\n\n\tconsumeStaleOwnedGoalPrompt(prompt: string) {\n\t\tconst marker = extractGoalPromptMarker(prompt);\n\t\tif (!marker) return false;\n\t\tconst goalId = this.pendingGoalPromptMarkers.get(marker);\n\t\tif (!goalId) return false;\n\t\tif (\n\t\t\t!this.queueFrozen &&\n\t\t\t!this.pendingQueueAction &&\n\t\t\tthis.activeGoal?.id === goalId &&\n\t\t\tthis.activeGoal.status === \"active\"\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.pendingGoalPromptMarkers.delete(marker);\n\t\treturn true;\n\t}\n\n\tmarkContinuationStarted(prompt: string) {\n\t\tconst marker = extractContinuationMarker(prompt);\n\t\tif (!marker) {\n\t\t\t// A user, retry, or another extension started newer work. Cancel both an\n\t\t\t// unsent intent and a delivery that may have lost the non-atomic idle race;\n\t\t\t// the newer work's agent_end will record a fresh intent.\n\t\t\tthis.cancelContinuationWork();\n\t\t\treturn undefined;\n\t\t}\n\t\tif (this.continuationDelivery?.marker === marker) this.continuationDelivery = undefined;\n\t\treturn marker.split(\":\", 1)[0];\n\t}\n\n\tpersistGoal(goal: ActiveGoal) {\n\t\tthis.pi.appendEntry(\n\t\t\tGOAL_STATE_ENTRY_TYPE,\n\t\t\tserializeGoalState(goal, this.queuedGoals, this.pendingQueueAction),\n\t\t);\n\t}\n\n\tclearPersistedGoal(cwd: string) {\n\t\tthis.pi.appendEntry(GOAL_STATE_ENTRY_TYPE, serializeGoalState(undefined, [], undefined));\n\t\tclearLegacyPersistedGoal(cwd);\n\t}\n\n\tclearActiveGoal(ctx: StatusContext) {\n\t\tthis.clearStatusRefreshTimer(); // lunr: stop the footer refresh when the goal is cleared\n\t\tthis.syncGoalPermissionMode(undefined);\n\t\tthis.cancelContinuationWork();\n\t\tthis.clearGoalRecovery();\n\t\tthis.clearBudgetWrapUp();\n\t\tthis.clearStaleGoalToolCallBlock();\n\t\tthis.activeGoal = undefined;\n\t\tthis.queuedGoals = [];\n\t\tthis.pendingQueueAction = undefined;\n\t\tthis.queueFrozen = false;\n\t\tthis.clearPersistedGoal(ctx.cwd);\n\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\t// Do not clear goalToolsUnlocked: after first activation, keep tools visible\n\t\t// for the rest of this extension runtime to avoid repeated goal-tool schema\n\t\t// churn within the same runtime.\n\t}\n\n\tisGoalToolName(name: string) {\n\t\treturn (GOAL_TOOL_NAMES as readonly string[]).includes(name);\n\t}\n\n\tgoalToolsAvailable() {\n\t\tconst active = new Set(this.pi.getActiveTools());\n\t\treturn GOAL_TOOL_NAMES.every((name) => active.has(name));\n\t}\n\n\thideGoalToolsIfLocked() {\n\t\tif (this.goalToolsUnlocked) return;\n\t\tconst active = this.pi.getActiveTools();\n\t\tconst hidden = active.filter((name) => this.isGoalToolName(name));\n\t\tif (hidden.length === 0) return;\n\t\t// lunr: do not mutate the active tool list (Anthropic tools sit at the\n\t\t// front of the cache prefix). Locked goal tools stay registered; the\n\t\t// tool_call gate rejects them until a /goal is activated.\n\t\tfor (const name of hidden) this.goalToolsHiddenByPolicy.add(name);\n\t}\n\n\trestoreGoalToolsHiddenByPolicy() {\n\t\t// lunr: flags only — the tool list is never rewritten at runtime.\n\t\tthis.goalToolsHiddenByPolicy.clear();\n\t}\n\n\tassertGoalToolsAvailable() {\n\t\tif (this.goalToolsAvailable()) return;\n\t\tthrow new Error(\n\t\t\t\"goal_complete and goal_blocked are unavailable; include them in the active tool allowlist or leave the restrictive tool mode first.\",\n\t\t);\n\t}\n\n\tensureGoalToolsVisible() {\n\t\t// lunr: never add/remove tools mid-session. Assert they were already\n\t\t// registered at session start so the wire bytes stay stable.\n\t\tthis.assertGoalToolsAvailable();\n\t}\n\n\tprepareGoalToolsForActivation(ctx: StatusContext) {\n\t\tif (this.settings.toolVisibility === \"after-first-goal\") {\n\t\t\tif (!this.goalToolsAvailable() && ctx.isIdle?.() !== true) {\n\t\t\t\tthrow new Error(\"wait until Pi is idle before revealing the goal tools\");\n\t\t\t}\n\t\t\tthis.revealGoalTools();\n\t\t\treturn;\n\t\t}\n\t\tthis.assertGoalToolsAvailable();\n\t}\n\n\t/** Mark lazy tools permanently desired for this runtime and make them active now. */\n\trevealGoalTools() {\n\t\tconst wasUnlocked = this.goalToolsUnlocked;\n\t\ttry {\n\t\t\tthis.ensureGoalToolsVisible();\n\t\t\tthis.goalToolsUnlocked = true;\n\t\t\tthis.goalToolsHiddenByPolicy.clear();\n\t\t} catch (error) {\n\t\t\tthis.goalToolsUnlocked = wasUnlocked;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tsnapshotGoalToolVisibility(): GoalToolVisibilitySnapshot {\n\t\treturn {\n\t\t\tactiveTools: this.pi.getActiveTools(),\n\t\t\tgoalToolsUnlocked: this.goalToolsUnlocked,\n\t\t\tgoalToolsHiddenByPolicy: [...this.goalToolsHiddenByPolicy],\n\t\t};\n\t}\n\n\t/**\n\t * lunr: reactivate a stopped (usage_limited / paused / blocked / budget_limited)\n\t * goal back to active WITHOUT sending a prompt. Shared by the /goal resume\n\t * command and the auto-resume hook (cron wake-up). Returns the reactivated goal\n\t * or undefined if reactivation was rejected (tools unavailable, budget reached).\n\t * Consumes resumeAfter so a single schedule only fires once.\n\t */\n\treactivateGoalForResume(ctx: StatusContext): ActiveGoal | undefined {\n\t\tif (!this.activeGoal) return undefined;\n\t\tif (!isResumableGoalStatus(this.activeGoal.status)) return undefined;\n\t\tif (\n\t\t\tthis.activeGoal.tokenBudget !== undefined &&\n\t\t\tthis.activeGoal.tokensUsed >= this.activeGoal.tokenBudget\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\ttry {\n\t\t\tthis.prepareGoalToolsForActivation(ctx);\n\t\t} catch (error) {\n\t\t\tctx.ui.notify(`Cannot resume /goal: ${formatError(error)}`, \"error\");\n\t\t\treturn undefined;\n\t\t}\n\t\tthis.cancelContinuationWork();\n\t\tthis.clearGoalRecovery();\n\t\tthis.clearBudgetWrapUp();\n\t\tthis.clearStaleGoalToolCallBlock();\n\t\tconst next = transitionGoal(nextGoalInstance(this.activeGoal), \"active\");\n\t\tthis.activeGoal = { ...next, resumeAfter: undefined };\n\t\tthis.persistGoal(this.activeGoal);\n\t\tthis.updateStatus(ctx, this.activeGoal);\n\t\tif (this.activeGoal.status !== \"active\") return undefined;\n\t\treturn this.activeGoal;\n\t}\n\n\trestoreGoalToolVisibility(snapshot: GoalToolVisibilitySnapshot) {\n\t\t// lunr: restore unlock/hidden flags only — never rewrite the tool list.\n\t\tthis.goalToolsUnlocked = snapshot.goalToolsUnlocked;\n\t\tthis.goalToolsHiddenByPolicy.clear();\n\t\tfor (const name of snapshot.goalToolsHiddenByPolicy) {\n\t\t\tthis.goalToolsHiddenByPolicy.add(name);\n\t\t}\n\t}\n\n\tareGoalToolsLocked() {\n\t\treturn !this.goalToolsUnlocked && this.settings.toolVisibility === \"after-first-goal\";\n\t}\n\n\tpauseGoalForUnavailableTools(ctx: StatusContext, abortTurn = true, recordUsage = true) {\n\t\tconst goal = this.activeGoal;\n\t\tif (goal?.status !== \"active\") return false;\n\t\tif (recordUsage) this.recordGoalUsage(goal, ctx);\n\t\tthis.cancelContinuationWork();\n\t\tthis.clearGoalRecoveryForGoal(goal.id);\n\t\tthis.clearBudgetWrapUp();\n\t\tif (abortTurn) {\n\t\t\tthis.blockStaleGoalToolCalls();\n\t\t\tabortCurrentTurn(ctx);\n\t\t} else {\n\t\t\tthis.clearStaleGoalToolCallBlock();\n\t\t}\n\t\tthis.activeGoal = transitionGoal(goal, \"paused\");\n\t\tthis.persistGoal(this.activeGoal);\n\t\tthis.updateStatus(ctx, this.activeGoal);\n\t\tctx.ui.notify(\n\t\t\t\"Goal tools are unavailable, so the active goal was paused. Restore the tools and run /goal resume.\",\n\t\t\t\"warning\",\n\t\t);\n\t\treturn true;\n\t}\n\n\tshowCompletionStatus(ctx: StatusContext) {\n\t\tthis.clearCompletionStatusTimer();\n\t\tthis.clearStatusRefreshTimer(); // lunr: stop the footer refresh on completion\n\t\tthis.syncGoalPermissionMode(undefined);\n\t\t// lunr: enriched footer status format\n\t\tctx.ui.setStatus(STATUS_KEY, \"goal ✓ complete\");\n\t\tthis.completionStatusTimer = setTimeout(() => {\n\t\t\tthis.completionStatusTimer = undefined;\n\t\t\ttry {\n\t\t\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\t\t} catch {\n\t\t\t\t// The completion status is best-effort; the captured ctx may be stale after\n\t\t\t\t// session replacement or reload before this timer fires.\n\t\t\t}\n\t\t}, 8_000);\n\t}\n\n\tclearCompletionStatusTimer() {\n\t\tif (!this.completionStatusTimer) return;\n\t\tclearTimeout(this.completionStatusTimer);\n\t\tthis.completionStatusTimer = undefined;\n\t}\n\n\tprivate rememberPendingGoalPrompt(goalId: string, prompt: string) {\n\t\tconst marker = randomUUID();\n\t\tthis.pendingGoalPromptMarkers.set(marker, goalId);\n\t\tif (this.pendingGoalPromptMarkers.size > MAX_PENDING_GOAL_PROMPTS) {\n\t\t\tconst oldest = this.pendingGoalPromptMarkers.keys().next().value;\n\t\t\tif (oldest) this.pendingGoalPromptMarkers.delete(oldest);\n\t\t}\n\t\treturn { marker, prompt: `${prompt}\\n\\n<!-- ${GOAL_PROMPT_MARKER_PREFIX}${marker} -->` };\n\t}\n\n\tprivate consumePendingGoalPrompt(prompt: string) {\n\t\tconst marker = extractGoalPromptMarker(prompt);\n\t\tif (!marker) return undefined;\n\t\tconst goalId = this.pendingGoalPromptMarkers.get(marker);\n\t\tthis.pendingGoalPromptMarkers.delete(marker);\n\t\treturn goalId;\n\t}\n\n\tconsumeOwnedGoalPrompt(prompt: string) {\n\t\treturn this.consumePendingGoalPrompt(prompt);\n\t}\n\n\tprivate rememberCancelledContinuationMarker(marker: string) {\n\t\tthis.cancelledContinuationMarkers.add(marker);\n\t\tif (this.cancelledContinuationMarkers.size <= MAX_CANCELLED_CONTINUATION_PROMPTS) return;\n\t\tconst oldest = this.cancelledContinuationMarkers.values().next().value;\n\t\tif (oldest) this.cancelledContinuationMarkers.delete(oldest);\n\t}\n}\n\nexport function createGoal(\n\ttext: string,\n\ttokenBudget: number | undefined,\n\tbaselineTokens: number,\n): ActiveGoal {\n\tconst now = Date.now();\n\treturn {\n\t\tid: randomUUID(),\n\t\ttext,\n\t\tstatus: \"active\",\n\t\tstartedAt: now,\n\t\tupdatedAt: now,\n\t\titeration: 0,\n\t\ttokenBudget,\n\t\ttokensUsed: 0,\n\t\ttimeUsedSeconds: 0,\n\t\tbaselineTokens,\n\t\tactiveStartedAt: now,\n\t};\n}\n\nexport function transitionGoal(goal: ActiveGoal, requestedStatus: GoalStatus): ActiveGoal {\n\tconst now = Date.now();\n\tconst status =\n\t\trequestedStatus === \"active\" &&\n\t\tgoal.tokenBudget !== undefined &&\n\t\tgoal.tokensUsed >= goal.tokenBudget\n\t\t\t? \"budget_limited\"\n\t\t\t: requestedStatus;\n\tconst next = { ...goal, status, updatedAt: now };\n\tcheckpointGoalActiveTime(next, now, status === \"active\");\n\treturn next;\n}\n\nexport function nextGoalInstance(goal: ActiveGoal): ActiveGoal {\n\treturn { ...goal, id: randomUUID(), updatedAt: Date.now() };\n}\n\nexport function editedGoalStatus(status: GoalStatus): GoalStatus {\n\tif (status === \"paused\" || status === \"blocked\" || status === \"usage_limited\") return status;\n\treturn \"active\";\n}\n\nexport function incrementGoal(goal: ActiveGoal): ActiveGoal {\n\treturn { ...goal, iteration: goal.iteration + 1, updatedAt: Date.now() };\n}\n\n// lunr: footer status — active is just `goal` (elapsed/turns stay on paused)\nexport function formatStatus(goal: ActiveGoal | undefined) {\n\tif (!goal) return undefined;\n\tif (goal.status === \"complete\") return \"goal ✓ complete\";\n\tif (goal.status === \"queued\") return \"goal queued\";\n\tif (goal.status === \"paused\") {\n\t\treturn `goal ◌ paused · ${formatGoalElapsed(goal)} · ${formatGoalTurns(goal)}`;\n\t}\n\tif (goal.status === \"blocked\") return \"goal ✗ blocked\";\n\tif (goal.status === \"usage_limited\") return \"goal usage-limited\";\n\tif (goal.status === \"budget_limited\") return `goal budget ${formatBudget(goal)}`;\n\t// lunr: active (and budget-suffixed active) display text is exactly `goal`\n\tif (goal.tokenBudget !== undefined) return `goal · ${formatBudget(goal)}`;\n\treturn \"goal\";\n}\n\n// lunr: live elapsed = accumulated active time + the in-progress active segment\nfunction goalElapsedSeconds(goal: ActiveGoal) {\n\tlet seconds = nonNegativeFiniteNumber(goal.timeUsedSeconds);\n\tif (typeof goal.activeStartedAt === \"number\" && Number.isFinite(goal.activeStartedAt)) {\n\t\tseconds += Math.max(0, Date.now() - goal.activeStartedAt) / 1000;\n\t}\n\treturn seconds;\n}\n\n// lunr: footer elapsed format — `Xm` under 1h, `XhYm` after\nfunction formatGoalElapsed(goal: ActiveGoal) {\n\tconst totalMinutes = Math.floor(goalElapsedSeconds(goal) / 60);\n\tif (totalMinutes < 60) return `${totalMinutes}m`;\n\treturn `${Math.floor(totalMinutes / 60)}h${totalMinutes % 60}m`;\n}\n\n// lunr: footer turn count, singular at 1\nfunction formatGoalTurns(goal: ActiveGoal) {\n\treturn goal.iteration === 1 ? \"1 turn\" : `${goal.iteration} turns`;\n}\n\nexport function formatBudget(goal: ActiveGoal) {\n\treturn `${formatTokenCount(goal.tokensUsed)}/${formatTokenCount(goal.tokenBudget ?? 0)}`;\n}\n\nexport function goalSummary(\n\tgoal: ActiveGoal,\n\tqueuedGoals: readonly ActiveGoal[] = [],\n\texperimentalGoals = false,\n\tqueueFrozen = false,\n) {\n\tconst summary = [\n\t\t`Goal: ${goal.text}`,\n\t\t`Status: ${queueFrozen ? \"queue off\" : goal.status}`,\n\t\t`Iteration: ${goal.iteration}`,\n\t\t`Active elapsed: ${formatDuration(goal.timeUsedSeconds)}`,\n\t\t`Tokens: ${goal.tokenBudget === undefined ? formatTokenCount(goal.tokensUsed) : formatBudget(goal)}`,\n\t];\n\tif (experimentalGoals || queuedGoals.length > 0 || queueFrozen) {\n\t\tsummary.push(\n\t\t\t`Goals (${queuedGoals.length + 1}):`,\n\t\t\t...[goal, ...queuedGoals].map(\n\t\t\t\t(queuedGoal, index) => `${index + 1}. [${queuedGoal.status}] ${queuedGoal.text}`,\n\t\t\t),\n\t\t);\n\t}\n\tif (queueFrozen) {\n\t\tsummary.push(\n\t\t\t\"Queue is frozen. Re-enable experimental.goals and run /reload, or use /goal clear.\",\n\t\t\t\"Commands: /goal, /goal clear\",\n\t\t);\n\t} else {\n\t\tsummary.push(`Commands: ${goalCommandHint(goal.status, experimentalGoals)}`);\n\t}\n\treturn summary.join(\"\\n\");\n}\n\nexport function hasPendingMessages(ctx: StatusContext) {\n\treturn ctx.hasPendingMessages?.() ?? false;\n}\n\nexport function abortCurrentTurn(ctx: StatusContext) {\n\ttry {\n\t\tctx.abort?.();\n\t} catch {\n\t\t// Best effort: stale goal guards still prevent follow-on tool calls.\n\t}\n}\n\nexport function blocksStaleGoalToolCalls(status: GoalStatus) {\n\treturn status === \"paused\" || status === \"blocked\" || status === \"usage_limited\";\n}\n\nexport function isResumableGoalStatus(status: GoalStatus) {\n\treturn blocksStaleGoalToolCalls(status) || status === \"budget_limited\";\n}\n\nexport function stoppedStatusLabel(status: GoalStatus) {\n\tif (status === \"usage_limited\") return \"usage-limited\";\n\tif (status === \"budget_limited\") return \"budget-limited\";\n\treturn status;\n}\n\nexport function isContradictoryCompletionSummary(summary: string) {\n\treturn CONTRADICTORY_COMPLETION_PATTERNS.some((pattern) => pattern.test(summary));\n}\n\nexport function goalIdRejectionReason(goal: ActiveGoal, requestedGoalId: string) {\n\tif (!requestedGoalId) return \"missing goal_id\";\n\tif (requestedGoalId !== goal.id) return \"goal_id does not match the active goal\";\n\treturn undefined;\n}\n\nexport function isUsageLimitedGoalInterruption(assistant: AssistantMessageLike) {\n\tconst errorMessage = assistant.errorMessage;\n\treturn (\n\t\tassistant.stopReason === \"error\" &&\n\t\ttypeof errorMessage === \"string\" &&\n\t\tUSAGE_LIMIT_GOAL_ERROR_PATTERNS.some((pattern) => pattern.test(errorMessage))\n\t);\n}\n\nexport function isRetryableGoalInterruption(assistant: AssistantMessageLike) {\n\tif (assistant.stopReason !== \"error\") return false;\n\tif (!assistant.errorMessage) return false;\n\tif (\n\t\tisUsageLimitedGoalInterruption(assistant) ||\n\t\tNON_RETRYABLE_GOAL_ERROR_RE.test(assistant.errorMessage)\n\t) {\n\t\treturn false;\n\t}\n\treturn (\n\t\tisGoalContextOverflow(assistant) ||\n\t\tRETRYABLE_GOAL_ERROR_PATTERNS.some((pattern) => pattern.test(assistant.errorMessage ?? \"\"))\n\t);\n}\n\nexport function isGoalContextOverflow(assistant: AssistantMessageLike) {\n\treturn isContextOverflow(toPiAssistantMessage(assistant));\n}\n\n/**\n * lunr: best-effort extraction of a usage-limit reset time from a provider error\n * message. Returns an absolute epoch ms to resume after, or undefined. Handles\n * relative delays (\"reset in 2h\", \"try again in 30m\", \"available in 3600s\") and\n * ISO-8601 timestamps. Most provider errors omit this, so undefined is the norm.\n */\nconst USAGE_RESET_TIME_PATTERNS = [\n\t/reset(?:s|ting)?\\s*(?:in|after|at)?\\s*(\\d+)\\s*s(ec)?/i,\n\t/reset(?:s|ting)?\\s*(?:in|after|at)?\\s*(\\d+)\\s*m(in)?/i,\n\t/reset(?:s|ting)?\\s*(?:in|after|at)?\\s*(\\d+)\\s*h(our|r)?/i,\n\t/(?:retry|try(?:\\s+again)?|available)\\s+(?:in|after|at)\\s*(\\d+)\\s*s(ec)?/i,\n\t/(?:retry|try(?:\\s+again)?|available)\\s+(?:in|after|at)\\s*(\\d+)\\s*m(in)?/i,\n\t/(?:retry|try(?:\\s+again)?|available)\\s+(?:in|after|at)\\s*(\\d+)\\s*h(our|r)?/i,\n] as const;\n\nexport function parseUsageResetTimeMs(errorMessage: string | undefined): number | undefined {\n\tif (!errorMessage) return undefined;\n\tconst now = Date.now();\n\tfor (const pattern of USAGE_RESET_TIME_PATTERNS) {\n\t\tconst match = errorMessage.match(pattern);\n\t\tif (!match) continue;\n\t\tconst value = Number.parseInt(match[1] ?? \"\", 10);\n\t\tif (!Number.isFinite(value) || value <= 0) continue;\n\t\tconst unit = pattern.source.includes(\"\\\\s*h\") ? 3600_000 : pattern.source.includes(\"\\\\s*m\") ? 60_000 : 1_000;\n\t\treturn now + value * unit;\n\t}\n\t// ISO-8601 timestamp fallback (e.g. \"reset at 2026-08-01T09:00:00Z\").\n\tconst isoMatch = errorMessage.match(/(?:reset|available).{0,12}(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?(?:Z|[+-]\\d{2}:?\\d{2})?)/i);\n\tif (isoMatch?.[1]) {\n\t\tconst parsed = Date.parse(isoMatch[1]);\n\t\tif (Number.isFinite(parsed) && parsed > now) return parsed;\n\t}\n\treturn undefined;\n}\n\nexport function findFinalAssistantMessage(messages: unknown[]): AssistantMessageLike | undefined {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst message = messages[i];\n\t\tif (!message || typeof message !== \"object\") continue;\n\t\tconst candidate = message as Record<string, unknown>;\n\t\tif (candidate.role !== \"assistant\") continue;\n\t\tconst assistant: AssistantMessageLike = {\n\t\t\trole: \"assistant\",\n\t\t\tstopReason: isAgentStopReason(candidate.stopReason) ? candidate.stopReason : undefined,\n\t\t\terrorMessage: typeof candidate.errorMessage === \"string\" ? candidate.errorMessage : undefined,\n\t\t};\n\t\tif (Array.isArray(candidate.content)) {\n\t\t\tassistant.content = candidate.content as PiAssistantMessage[\"content\"];\n\t\t}\n\t\tif (typeof candidate.api === \"string\") assistant.api = candidate.api;\n\t\tif (typeof candidate.provider === \"string\") assistant.provider = candidate.provider;\n\t\tif (typeof candidate.model === \"string\") assistant.model = candidate.model;\n\t\tif (typeof candidate.timestamp === \"number\") assistant.timestamp = candidate.timestamp;\n\t\tconst usage = normalizeUsage(candidate.usage);\n\t\tif (usage) assistant.usage = usage;\n\t\treturn assistant;\n\t}\n\treturn undefined;\n}\n\nexport function formatError(error: unknown) {\n\treturn truncateNotification(error instanceof Error ? error.message : String(error));\n}\n\nexport function truncateNotification(value: string) {\n\treturn value.length > 160 ? `${value.slice(0, 157)}...` : value;\n}\n\nasync function sendPrompt(pi: ExtensionAPI, ctx: StatusContext, prompt: string) {\n\ttry {\n\t\tawait pi.sendUserMessage(prompt, { deliverAs: \"followUp\" });\n\t\treturn true;\n\t} catch (error) {\n\t\tctx.ui.notify(`Goal prompt failed: ${formatError(error)}`, \"error\");\n\t\treturn false;\n\t}\n}\n\nfunction goalCommandHint(status: GoalStatus, experimentalGoals = false) {\n\tconst queueCommands = experimentalGoals\n\t\t? \", /goal add <objective>, /goal prioritize <objective>, /goal drop-last, /goal skip\"\n\t\t: \"\";\n\tif (status === \"active\") {\n\t\treturn `/goal edit <objective>, /goal pause, /goal clear${queueCommands}`;\n\t}\n\tif (isResumableGoalStatus(status)) {\n\t\treturn `/goal edit <objective>, /goal resume, /goal clear${queueCommands}`;\n\t}\n\treturn `/goal edit <objective>, /goal clear${queueCommands}`;\n}\n\nfunction toPiAssistantMessage(assistant: AssistantMessageLike): PiAssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: assistant.content ?? [],\n\t\tapi: assistant.api ?? \"openai-responses\",\n\t\tprovider: assistant.provider ?? \"unknown\",\n\t\tmodel: assistant.model ?? \"unknown\",\n\t\tusage: assistant.usage ?? zeroUsage(),\n\t\tstopReason: assistant.stopReason ?? \"error\",\n\t\terrorMessage: assistant.errorMessage,\n\t\ttimestamp: assistant.timestamp ?? Date.now(),\n\t};\n}\n\nfunction zeroUsage(): Usage {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotal: 0,\n\t\t},\n\t};\n}\n\nfunction continuationMarker(goal: ActiveGoal) {\n\treturn `${goal.id}:${goal.iteration}:${randomUUID()}`;\n}\n\nfunction escapeRegExpText(value: string) {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst GOAL_PROMPT_MARKER_PATTERN = new RegExp(\n\t`<!--\\\\s*${escapeRegExpText(GOAL_PROMPT_MARKER_PREFIX)}([^\\\\s>]+)\\\\s*-->`,\n);\nconst CONTINUATION_MARKER_PATTERN = new RegExp(\n\t`<!--\\\\s*${escapeRegExpText(CONTINUATION_MARKER_PREFIX)}([^\\\\s>]+)\\\\s*-->`,\n);\n\nfunction extractGoalPromptMarker(prompt: string) {\n\treturn GOAL_PROMPT_MARKER_PATTERN.exec(prompt)?.[1];\n}\n\nfunction extractContinuationMarker(prompt: string) {\n\treturn CONTINUATION_MARKER_PATTERN.exec(prompt)?.[1];\n}\n\nfunction isAgentStopReason(value: unknown): value is AgentStopReason {\n\treturn [\"stop\", \"length\", \"toolUse\", \"error\", \"aborted\"].includes(String(value));\n}\n\nfunction normalizeUsage(value: unknown): Usage | undefined {\n\tif (!value || typeof value !== \"object\") return undefined;\n\tconst usage = value as Partial<Usage>;\n\tif (typeof usage.input !== \"number\" || typeof usage.output !== \"number\") return undefined;\n\treturn {\n\t\tinput: nonNegativeFiniteNumber(usage.input),\n\t\toutput: nonNegativeFiniteNumber(usage.output),\n\t\tcacheRead: nonNegativeFiniteNumber(usage.cacheRead),\n\t\tcacheWrite: nonNegativeFiniteNumber(usage.cacheWrite),\n\t\ttotalTokens: assistantUsageTokens(usage),\n\t\tcost: {\n\t\t\tinput: usage.cost?.input ?? 0,\n\t\t\toutput: usage.cost?.output ?? 0,\n\t\t\tcacheRead: usage.cost?.cacheRead ?? 0,\n\t\t\tcacheWrite: usage.cost?.cacheWrite ?? 0,\n\t\t\ttotal: usage.cost?.total ?? 0,\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAW,KAAK,YAAY,EAA8C,MAAM,iCAAiC,CAAC;AAoDzH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA2JzC,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAyaxE","sourcesContent":["// @ts-nocheck\n/**\n * Subagent Tool\n *\n * Full-featured subagent with sync and async modes.\n * - Sync (default): Streams output, renders markdown, tracks usage\n * - Async: Background execution, emits events when done\n *\n * Modes: single (agent + task), parallel (tasks[]), chain (chain[] with {previous})\n * Toggle: async parameter (default: false, configurable via config.json)\n *\n * Config file: ~/.pi/agent/extensions/subagent/config.json\n * { \"asyncByDefault\": true, \"forceTopLevelAsync\": true, \"maxSubagentDepth\": 1, \"intercomBridge\": { \"mode\": \"always\", \"instructionFile\": \"./intercom-bridge.md\" }, \"worktreeSetupHook\": \"./scripts/setup-worktree.mjs\" }\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { AgentToolResult } from \"@ashx-j/lunr-agent\";\nimport { keyText, type ExtensionAPI, type ExtensionContext, type ToolDefinition } from \"@ashx-j/lunr\";\nimport { Box, Container, Spacer, Text, truncateToWidth, visibleWidth, wrapTextWithAnsi, type Component } from \"@ashx-j/lunr-tui\";\nimport { discoverAgents } from \"../agents/agents.ts\";\nimport { cleanupAllArtifactDirs, cleanupOldArtifacts, getArtifactsDir } from \"../shared/artifacts.ts\";\nimport { resolveCurrentSessionId } from \"../shared/session-identity.ts\";\nimport { cleanupOldChainDirs } from \"../shared/settings.ts\";\nimport { clearLegacyResultAnimationTimer, renderSubagentResult, subagentAnimSink } from \"../tui/render.ts\";\nimport { SubagentParams } from \"./schemas.ts\";\nimport { validateChainInput } from \"./chain-validation.ts\";\nimport { createSubagentExecutor, type SubagentParamsLike } from \"../runs/foreground/subagent-executor.ts\";\nimport { createAsyncJobTracker } from \"../runs/background/async-job-tracker.ts\";\nimport { createResultWatcher } from \"../runs/background/result-watcher.ts\";\nimport { createScheduledRunManager } from \"../runs/background/scheduled-runs.ts\";\nimport { registerSlashCommands } from \"../slash/slash-commands.ts\";\nimport { registerPromptTemplateDelegationBridge } from \"../slash/prompt-template-bridge.ts\";\nimport { registerMainWatchdog } from \"../watchdog/register-main.ts\";\nimport { registerSlashSubagentBridge } from \"../slash/slash-bridge.ts\";\nimport { createNativeSupervisorChannel } from \"../intercom/native-supervisor-channel.ts\";\nimport { registerSubagentRpcBridge } from \"./rpc.ts\";\nimport { clearSlashSnapshots, getSlashRenderableSnapshot, resolveSlashMessageDetails, restoreSlashFinalSnapshots, type SlashMessageDetails } from \"../slash/slash-live-state.ts\";\nimport { inspectSubagentStatus } from \"../runs/background/run-status.ts\";\nimport { resolveWaitToolConfig } from \"../runs/background/subagent-wait.ts\";\nimport { registerWaitTool } from \"../runs/background/wait-tool.ts\";\nimport { drainOutstandingWork } from \"../runs/background/auto-drain.ts\";\nimport registerSubagentNotify, { parseSubagentNotifyContent, type SubagentNotifyDetails } from \"../runs/background/notify.ts\";\nimport { formatSteeringNotice, handleSubagentSteeringNotice, SUBAGENT_STEERING_MESSAGE_TYPE, type SubagentSteeringMessageDetails } from \"./steering-notices.ts\";\nimport { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from \"../runs/shared/pi-args.ts\";\nimport { formatDuration, shortenPath } from \"../shared/formatters.ts\";\nimport { loadConfig } from \"./config.ts\";\nimport { buildSubagentToolDescription } from \"./tool-description.ts\";\nimport {\n\ttype Details,\n\ttype SubagentState,\n\tASYNC_DIR,\n\tDEFAULT_ARTIFACT_CONFIG,\n\tRESULTS_DIR,\n\tSLASH_RESULT_TYPE,\n\tSLASH_TEXT_RESULT_TYPE,\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\tSUBAGENT_ASYNC_STARTED_EVENT,\n\tSUBAGENT_CONTROL_EVENT,\n\tSUBAGENT_STEERING_NOTICE_EVENT,\n\tWIDGET_KEY,\n} from \"../shared/types.ts\";\nimport {\n\tclearPendingForegroundControlNotices,\n\tformatSubagentControlNotice,\n\thandleSubagentControlNotice,\n\tSUBAGENT_CONTROL_MESSAGE_TYPE,\n\ttype SubagentControlMessageDetails,\n} from \"./control-notices.ts\";\n\nexport { loadConfig } from \"./config.ts\";\n\n/**\n * Derive subagent session base directory from parent session file.\n * If parent session is ~/.pi/agent/sessions/abc123.jsonl,\n * returns ~/.pi/agent/sessions/abc123/ as the base.\n * Callers add runId to create the actual session root: abc123/{runId}/\n * Falls back to a unique temp directory if no parent session.\n */\nfunction getSubagentSessionRoot(parentSessionFile: string | null): string {\n\tif (parentSessionFile) {\n\t\tconst baseName = path.basename(parentSessionFile, \".jsonl\");\n\t\tconst sessionsDir = path.dirname(parentSessionFile);\n\t\treturn path.join(sessionsDir, baseName);\n\t}\n\treturn fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-session-\"));\n}\n\nfunction expandTilde(p: string): string {\n\treturn p.startsWith(\"~/\") ? path.join(os.homedir(), p.slice(2)) : p;\n}\n\n/**\n * Create a directory and verify it is actually accessible.\n * On Windows with Azure AD/Entra ID, directories created shortly after\n * wake-from-sleep can end up with broken NTFS ACLs (null DACL) when the\n * cloud SID cannot be resolved without network connectivity. This leaves\n * the directory completely inaccessible to the creating user.\n */\nfunction ensureAccessibleDir(dirPath: string): void {\n\tfs.mkdirSync(dirPath, { recursive: true });\n\ttry {\n\t\tfs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n\t} catch {\n\t\ttry {\n\t\t\tfs.rmSync(dirPath, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Best effort: retry mkdir/access even if cleanup fails.\n\t\t}\n\t\tfs.mkdirSync(dirPath, { recursive: true });\n\t\tfs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n\t}\n}\n\nfunction isSlashResultRunning(result: { details?: Details }): boolean {\n\treturn result.details?.progress?.some((entry) => entry.status === \"running\")\n\t\t|| result.details?.results.some((entry) => entry.progress?.status === \"running\")\n\t\t|| false;\n}\n\n// Drives the inline running-indicator braille animation for foreground subagent\n// results. Foreground runs receive progress only on child events, so the glyph\n// (derived from progress fields) would freeze between events. While a result is\n// running we tick a frame counter every 80ms; renderResult registers the\n// running-glyph lines in state.animEntries (via subagentAnimSink) and the timer\n// rewrites just those Text nodes + requests a repaint, instead of invalidate()-ing\n// the whole tool component (a full renderSubagentResult rebuild 12.5x/s made the\n// spinner laggy).\nfunction subagentResultIsRunning(result: { details?: Details }): boolean {\n\treturn result.details?.progress?.some((entry) => entry.status === \"running\")\n\t\t|| result.details?.results.some((entry) => entry.progress?.status === \"running\")\n\t\t|| false;\n}\n\nfunction ensureSubagentResultAnimation(context: { state: Record<string, unknown>; invalidate?: () => void; requestRender?: () => void }): void {\n\tconst state = context.state as {\n\t\tsubagentResultAnimationTimer?: ReturnType<typeof setInterval>;\n\t\tframe?: number;\n\t\tanimEntries?: Array<{ text: Text; line: (frame: number) => string }>;\n\t};\n\tif (state.subagentResultAnimationTimer) return;\n\tif (typeof context.invalidate !== \"function\") return;\n\tif (state.frame === undefined) state.frame = 0;\n\tstate.subagentResultAnimationTimer = setInterval(() => {\n\t\tstate.frame = ((state.frame ?? 0) + 1) % 10;\n\t\ttry {\n\t\t\tconst entries = state.animEntries;\n\t\t\tif (entries?.length && typeof context.requestRender === \"function\") {\n\t\t\t\tfor (const entry of entries) entry.text.setText(entry.line(state.frame ?? 0));\n\t\t\t\tcontext.requestRender();\n\t\t\t} else {\n\t\t\t\tcontext.invalidate();\n\t\t\t}\n\t\t} catch {}\n\t}, 80);\n}\n\nfunction isSlashResultError(result: { details?: Details }): boolean {\n\treturn result.details?.results.some((entry) => entry.exitCode !== 0 && entry.progress?.status !== \"running\") || false;\n}\n\nfunction isStaleExtensionContextError(error: unknown): boolean {\n\treturn error instanceof Error && error.message.includes(\"Extension context no longer active\");\n}\n\nfunction rebuildSlashResultContainer(\n\tcontainer: Container,\n\tresult: AgentToolResult<Details>,\n\toptions: { expanded: boolean },\n\ttheme: ExtensionContext[\"ui\"][\"theme\"],\n): void {\n\tcontainer.clear();\n\tcontainer.addChild(new Spacer(1));\n\tconst boxTheme = isSlashResultRunning(result) ? \"toolPendingBg\" : isSlashResultError(result) ? \"toolErrorBg\" : \"toolSuccessBg\";\n\tconst box = new Box(1, 1, (text: string) => theme.bg(boxTheme, text));\n\tbox.addChild(renderSubagentResult(result, options, theme));\n\tcontainer.addChild(box);\n}\n\nfunction createSlashResultComponent(\n\tdetails: SlashMessageDetails,\n\toptions: { expanded: boolean },\n\ttheme: ExtensionContext[\"ui\"][\"theme\"],\n): Container {\n\tconst container = new Container();\n\tlet lastVersion = -1;\n\tcontainer.render = (width: number): string[] => {\n\t\tconst snapshot = getSlashRenderableSnapshot(details);\n\t\tif (snapshot.version !== lastVersion || isSlashResultRunning(snapshot.result)) {\n\t\t\tlastVersion = snapshot.version;\n\t\t\trebuildSlashResultContainer(container, snapshot.result, options, theme);\n\t\t}\n\t\treturn Container.prototype.render.call(container, width);\n\t};\n\treturn container;\n}\n\nclass SubagentControlNoticeComponent implements Component {\n\tconstructor(\n\t\tprivate readonly details: SubagentControlMessageDetails,\n\t\tprivate readonly theme: ExtensionContext[\"ui\"][\"theme\"],\n\t) {}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst eventLabel = this.details.event.type.replaceAll(\"_\", \" \");\n\t\tif (width < 3) return [truncateToWidth(`Subagent ${eventLabel}`, width)];\n\t\tconst bodyWidth = Math.max(1, width - 2);\n\t\tconst borderChar = \"─\";\n\t\tconst header = ` ⚠ Subagent ${eventLabel}: ${this.details.event.agent} `;\n\t\tconst headerText = truncateToWidth(header, bodyWidth, \"\");\n\t\tconst headerPadding = Math.max(0, bodyWidth - visibleWidth(headerText));\n\t\tconst lines = [this.theme.fg(\"accent\", `╭${headerText}${borderChar.repeat(headerPadding)}╮`)];\n\n\t\tfor (const line of wrapTextWithAnsi(formatSubagentControlNotice(this.details), bodyWidth)) {\n\t\t\tconst text = truncateToWidth(line, bodyWidth, \"\");\n\t\t\tconst padding = Math.max(0, bodyWidth - visibleWidth(text));\n\t\t\tlines.push(this.theme.fg(\"accent\", `│${text}${\" \".repeat(padding)}│`));\n\t\t}\n\t\tlines.push(this.theme.fg(\"accent\", `╰${borderChar.repeat(bodyWidth)}╯`));\n\t\treturn lines;\n\t}\n}\n\nexport default function registerSubagentExtension(pi: ExtensionAPI): void {\n\tif (process.env[SUBAGENT_CHILD_ENV] === \"1\") {\n\t\treturn;\n\t}\n\tconst globalStore = globalThis as Record<string, unknown>;\n\tconst runtimeCleanupStoreKey = \"__piSubagentRuntimeCleanup\";\n\tconst previousRuntimeCleanup = globalStore[runtimeCleanupStoreKey];\n\tif (typeof previousRuntimeCleanup === \"function\") {\n\t\ttry {\n\t\t\tpreviousRuntimeCleanup();\n\t\t} catch {\n\t\t\t// Best effort cleanup for stale timers from an older reload.\n\t\t}\n\t}\n\n\tensureAccessibleDir(RESULTS_DIR);\n\tensureAccessibleDir(ASYNC_DIR);\n\tcleanupOldChainDirs();\n\n\tconst config = loadConfig();\n\tconst waitToolConfig = resolveWaitToolConfig(config.waitTool);\n\tconst asyncByDefault = config.asyncByDefault === true;\n\tconst tempArtifactsDir = getArtifactsDir(null);\n\tcleanupAllArtifactDirs(DEFAULT_ARTIFACT_CONFIG.cleanupDays);\n\n\tconst state: SubagentState = {\n\t\tbaseCwd: \"\",\n\t\tcurrentSessionId: null,\n\t\tsubagentInProgress: false,\n\t\tsubagentSpawns: { sessionId: null, count: 0 },\n\t\tasyncJobs: new Map(),\n\t\tfleetJobs: new Map(),\n\t\tforegroundRuns: new Map(),\n\t\tforegroundControls: new Map(),\n\t\tlastForegroundControlId: null,\n\t\tpendingForegroundControlNotices: new Map(),\n\t\tcleanupTimers: new Map(),\n\t\tlastUiContext: null,\n\t\tpoller: null,\n\t\tcompletionSeen: new Map(),\n\t\twatcher: null,\n\t\twatcherRestartTimer: null,\n\t\tresultFileCoalescer: {\n\t\t\tschedule: () => false,\n\t\t\tclear: () => {},\n\t\t},\n\t};\n\n\tconst supervisorChannel = createNativeSupervisorChannel(pi, state);\n\tconst mainWatchdog = registerMainWatchdog(pi);\n\tconst { startResultWatcher, primeExistingResults, stopResultWatcher } = createResultWatcher(\n\t\tpi,\n\t\tstate,\n\t\tRESULTS_DIR,\n\t\t10 * 60 * 1000,\n\t);\n\tstartResultWatcher();\n\tprimeExistingResults();\n\n\tconst runtimeCleanup = () => {\n\t\tmainWatchdog.dispose();\n\t\tstopResultWatcher();\n\t\tscheduledRunManager.stop();\n\t\tsupervisorChannel.dispose();\n\t\tclearPendingForegroundControlNotices(state);\n\t\tif (state.poller) {\n\t\t\tclearInterval(state.poller);\n\t\t\tstate.poller = null;\n\t\t}\n\t};\n\tglobalStore[runtimeCleanupStoreKey] = runtimeCleanup;\n\n\tconst { ensurePoller, refreshWidget, handleStarted, handleComplete, resetJobs, restoreActiveJobs } = createAsyncJobTracker(pi, state, ASYNC_DIR, {\n\t\twidgetEnabled: config.asyncWidget !== false,\n\t});\n\tlet executorExecute: ((id: string, params: SubagentParamsLike, signal: AbortSignal, onUpdate: ((r: AgentToolResult<Details>) => void) | undefined, ctx: ExtensionContext) => Promise<AgentToolResult<Details>>) | undefined;\n\tconst scheduledRunManager = createScheduledRunManager({\n\t\tconfig,\n\t\tlaunch: (params, ctx, signal) => {\n\t\t\tif (!executorExecute) {\n\t\t\t\treturn Promise.resolve({\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Scheduled subagent launch is unavailable (executor not ready).\" }],\n\t\t\t\t\tisError: true,\n\t\t\t\t\tdetails: { mode: \"management\" as const, results: [] },\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn executorExecute(randomUUID(), params, signal, undefined, ctx);\n\t\t},\n\t});\n\tconst executor = createSubagentExecutor({\n\t\tpi,\n\t\tstate,\n\t\tconfig,\n\t\tasyncByDefault,\n\t\twaitToolEnabled: waitToolConfig.enabled,\n\t\thandleScheduledRunAction: (params, ctx) => scheduledRunManager.handleToolCall(params, ctx),\n\t\twatchdog: mainWatchdog,\n\t\ttempArtifactsDir,\n\t\tgetSubagentSessionRoot,\n\t\texpandTilde,\n\t\tdiscoverAgents,\n\t});\n\texecutorExecute = executor.execute;\n\n\tpi.registerMessageRenderer<SlashMessageDetails>(SLASH_RESULT_TYPE, (message, options, theme) => {\n\t\tconst details = resolveSlashMessageDetails(message.details);\n\t\tif (!details) return undefined;\n\t\treturn createSlashResultComponent(details, options, theme);\n\t});\n\n\tpi.registerMessageRenderer<undefined>(SLASH_TEXT_RESULT_TYPE, (message, _options, _theme) => {\n\t\tconst content = typeof message.content === \"string\"\n\t\t\t? message.content\n\t\t\t: message.content\n\t\t\t\t.filter((entry) => entry.type === \"text\")\n\t\t\t\t.map((entry) => entry.text)\n\t\t\t\t.join(\"\\n\");\n\t\treturn new Text(content, 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentNotifyDetails>(\"subagent-notify\", (message, options, theme) => {\n\t\tconst content = typeof message.content === \"string\" ? message.content : \"\";\n\t\tconst details = (message.details as SubagentNotifyDetails | undefined) ?? parseSubagentNotifyContent(content);\n\t\tif (!details) return new Text(content, 0, 0);\n\t\tconst icon = details.status === \"completed\"\n\t\t\t? theme.fg(\"success\", \"✓\")\n\t\t\t: details.status === \"paused\"\n\t\t\t\t? theme.fg(\"warning\", \"■\")\n\t\t\t\t: theme.fg(\"error\", \"✗\");\n\t\tconst parts: string[] = [];\n\t\tif (details.taskInfo) parts.push(details.taskInfo);\n\t\tif (details.durationMs !== undefined) parts.push(formatDuration(details.durationMs));\n\t\tlet text = `${icon} ${theme.bold(details.agent)} ${theme.fg(\"dim\", details.status)}`;\n\t\tif (parts.length > 0) text += ` ${theme.fg(\"dim\", \"·\")} ${parts.map((part) => theme.fg(\"dim\", part)).join(` ${theme.fg(\"dim\", \"·\")} `)}`;\n\t\tconst trimmedPreview = details.resultPreview.trim();\n\t\tconst previewLines = options.expanded\n\t\t\t? trimmedPreview.split(\"\\n\").filter((line) => line.trim())\n\t\t\t: [trimmedPreview.split(\"\\n\", 1)[0] ?? \"\"].filter((line) => line.trim());\n\t\tfor (const line of previewLines.length > 0 ? previewLines : [\"(no output)\"]) {\n\t\t\ttext += `\\n ${theme.fg(\"dim\", `⎿ ${line}`)}`;\n\t\t}\n\t\tif (!options.expanded && trimmedPreview.includes(\"\\n\")) {\n\t\t\tconst expandKey = keyText(\"app.tools.expand\");\n\t\t\ttext += `\\n ${theme.fg(\"dim\", `${expandKey} full notification`)}`;\n\t\t}\n\t\tif (details.sessionLabel && details.sessionValue) {\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `${details.sessionLabel}: ${shortenPath(details.sessionValue)}`)}`;\n\t\t}\n\t\treturn new Text(text, 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentSteeringMessageDetails>(SUBAGENT_STEERING_MESSAGE_TYPE, (message, _options, theme) => {\n\t\tconst details = message.details as SubagentSteeringMessageDetails | undefined;\n\t\tif (!details) return undefined;\n\t\treturn new Text(theme.fg(details.state === \"recovered\" ? \"warning\" : \"error\", formatSteeringNotice(details)), 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentControlMessageDetails>(SUBAGENT_CONTROL_MESSAGE_TYPE, (message, _options, theme) => {\n\t\tconst details = message.details as SubagentControlMessageDetails | undefined;\n\t\tif (!details?.event) return undefined;\n\t\tconst content = typeof message.content === \"string\" ? message.content : undefined;\n\t\treturn new SubagentControlNoticeComponent({ ...details, noticeText: formatSubagentControlNotice(details, content) }, theme);\n\t});\n\n\tconst executeSubagentCollapsed = (id: string, params: SubagentParamsLike, signal: AbortSignal, onUpdate: ((result: AgentToolResult<Details>) => void) | undefined, ctx: ExtensionContext) => {\n\t\tif (ctx.hasUI) ctx.ui.setToolsExpanded(false);\n\t\treturn executor.execute(id, params, signal, onUpdate, ctx);\n\t};\n\n\tconst slashBridge = registerSlashSubagentBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (id, params, signal, onUpdate, ctx) =>\n\t\t\texecuteSubagentCollapsed(id, params, signal, onUpdate, ctx),\n\t});\n\n\tconst promptTemplateBridge = registerPromptTemplateDelegationBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (requestId, params, signal, ctx, onUpdate) =>\n\t\t\texecuteSubagentCollapsed(requestId, params, signal, onUpdate, ctx),\n\t});\n\n\tconst rpcBridge = registerSubagentRpcBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (id, params, signal, onUpdate, ctx) => executor.execute(id, params, signal, onUpdate, ctx),\n\t});\n\n\tfunction effectiveParallelTaskCount(tasks: Array<{ count?: unknown }> | undefined): number {\n\t\tif (!tasks || tasks.length === 0) return 0;\n\t\treturn tasks.reduce((total, task) => {\n\t\t\tconst count = typeof task.count === \"number\" && Number.isInteger(task.count) && task.count >= 1 ? task.count : 1;\n\t\t\treturn total + count;\n\t\t}, 0);\n\t}\n\n\tconst tool: ToolDefinition<typeof SubagentParams, Details> = {\n\t\tname: \"subagent\",\n\t\tlabel: \"Subagent\",\n\t\tdescription: buildSubagentToolDescription(config),\n\t\tparameters: SubagentParams,\n\t\t// lunr: sequential so multiple subagent calls in one turn run one-at-a-time\n\t\t// instead of tripping the subagentInProgress guard (parallel mode uses the tasks array).\n\t\texecutionMode: \"sequential\",\n\n\t\tprepareArguments(args) {\n\t\t\t// Run friendly chain validation before pi-ai's raw TypeBox schema check\n\t\t\t// so the model sees which property is disallowed, what is allowed, and a\n\t\t\t// valid example instead of `chain.N: must not have additional properties`.\n\t\t\tvalidateChainInput(args);\n\t\t\treturn args as never;\n\t\t},\n\n\t\texecute(id, params, signal, onUpdate, ctx) {\n\t\t\treturn executeSubagentCollapsed(id, params, signal, onUpdate, ctx);\n\t\t},\n\n\t\trenderCall(args, theme) {\n\t\t\tif (args.action) {\n\t\t\t\tconst target = args.agent || args.chainName || \"\";\n\t\t\t\treturn new Text(\n\t\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}${args.action}${target ? ` ${theme.fg(\"accent\", target)}` : \"\"}`,\n\t\t\t\t\t0, 0,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst isParallel = (args.tasks?.length ?? 0) > 0;\n\t\t\tconst parallelCount = effectiveParallelTaskCount(args.tasks as Array<{ count?: unknown }> | undefined);\n\t\t\tconst asyncLabel = args.async === true && args.clarify !== true ? theme.fg(\"warning\", \" [async]\") : \"\";\n\t\t\tif (args.chain?.length)\n\t\t\t\treturn new Text(\n\t\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}chain (${args.chain.length})${asyncLabel}`,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\tif (isParallel)\n\t\t\t\treturn new Text(\n\t\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}parallel (${parallelCount})${asyncLabel}`,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}${theme.fg(\"accent\", args.agent || \"?\")}${asyncLabel}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\n\t\trenderResult(result, options, theme, context) {\n\t\t\t// lunr: hide the `subagent list` result body — the call row already shows\n\t\t\t// the action; the roster stays in the transcript for the model.\n\t\t\tif ((context.args as { action?: string } | undefined)?.action === \"list\") {\n\t\t\t\treturn { render: () => [], invalidate() {} };\n\t\t\t}\n\t\t\tif (subagentResultIsRunning(result)) {\n\t\t\t\tensureSubagentResultAnimation(context);\n\t\t\t} else {\n\t\t\t\tclearLegacyResultAnimationTimer(context);\n\t\t\t}\n\t\t\tconst state = context.state as { frame?: number; animEntries?: Array<{ text: Text; line: (frame: number) => string }> };\n\t\t\t// lunr: collect running-glyph line templates while rendering so the\n\t\t\t// animation timer can rewrite them in place (see ensureSubagentResultAnimation).\n\t\t\tconst entries: Array<{ text: Text; line: (frame: number) => string }> = [];\n\t\t\tstate.animEntries = entries;\n\t\t\tsubagentAnimSink.current = entries;\n\t\t\ttry {\n\t\t\t\treturn renderSubagentResult(result, options, theme, state.frame ?? 0);\n\t\t\t} finally {\n\t\t\t\tsubagentAnimSink.current = null;\n\t\t\t}\n\t\t},\n\n\t};\n\n\tpi.registerTool(tool);\n\n\t// lunr: register a callback so toggling model tiers mid-session rebuilds the subagent\n\t// tool description (adds/removes MODEL TIERS guidance) and refreshes the tool registry.\n\tconst modelTierBridge = (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/model-tiers\")] as\n\t\t| { registerToolDescriptionRefresher?: (refresher: () => void) => void }\n\t\t| undefined;\n\tmodelTierBridge?.registerToolDescriptionRefresher?.(() => {\n\t\ttool.description = buildSubagentToolDescription(config);\n\t\t// pi.runtime is not on ExtensionAPI; registerTool refreshes the live registry.\n\t\tpi.registerTool(tool);\n\t});\n\n\tregisterWaitTool(pi, state, waitToolConfig.enabled);\n\n\tpi.on(\"agent_end\", async (_event, ctx) => {\n\t\tif (ctx.hasUI) return;\n\t\tawait drainOutstandingWork({ state, events: pi.events });\n\t});\n\n\tregisterSlashCommands(pi, state);\n\n\tconst eventUnsubscribeStoreKey = \"__piSubagentEventUnsubscribes\";\n\tconst controlNoticeSeenStoreKey = \"__piSubagentVisibleControlNotices\";\n\tconst previousEventUnsubscribes = globalStore[eventUnsubscribeStoreKey];\n\tif (Array.isArray(previousEventUnsubscribes)) {\n\t\tfor (const unsubscribe of previousEventUnsubscribes) {\n\t\t\tif (typeof unsubscribe !== \"function\") continue;\n\t\t\ttry {\n\t\t\t\tunsubscribe();\n\t\t\t} catch {\n\t\t\t\t// Best effort cleanup for stale handlers from an older reload.\n\t\t\t}\n\t\t}\n\t}\n\tregisterSubagentNotify(pi, state, { batchConfig: config.completionBatch });\n\n\tconst existingVisibleControlNotices = globalStore[controlNoticeSeenStoreKey];\n\tconst visibleControlNotices = existingVisibleControlNotices instanceof Set ? existingVisibleControlNotices as Set<string> : new Set<string>();\n\tglobalStore[controlNoticeSeenStoreKey] = visibleControlNotices;\n\tconst controlEventHandler = (payload: unknown) => {\n\t\thandleSubagentControlNotice({\n\t\t\tpi,\n\t\t\tstate,\n\t\t\tvisibleControlNotices,\n\t\t\tdetails: payload as SubagentControlMessageDetails,\n\t\t});\n\t};\n\tconst steeringNoticeHandler = (payload: unknown) => {\n\t\thandleSubagentSteeringNotice({ pi, state, details: payload as SubagentSteeringMessageDetails });\n\t};\n\tconst eventUnsubscribes = [\n\t\tpi.events.on(SUBAGENT_ASYNC_STARTED_EVENT, handleStarted),\n\t\tpi.events.on(SUBAGENT_ASYNC_COMPLETE_EVENT, handleComplete),\n\t\tpi.events.on(SUBAGENT_CONTROL_EVENT, controlEventHandler),\n\t\tpi.events.on(SUBAGENT_STEERING_NOTICE_EVENT, steeringNoticeHandler),\n\t\trpcBridge.dispose,\n\t];\n\tglobalStore[eventUnsubscribeStoreKey] = eventUnsubscribes;\n\n\tpi.on(\"tool_result\", (event, ctx) => {\n\t\tif (event.toolName !== \"subagent\") return;\n\t\tif (!ctx.hasUI) return;\n\t\tstate.lastUiContext = ctx;\n\t\tif (state.asyncJobs.size > 0) {\n\t\t\trefreshWidget(ctx);\n\t\t\tensurePoller();\n\t\t}\n\t});\n\n\tconst cleanupSessionArtifacts = (ctx: ExtensionContext) => {\n\t\ttry {\n\t\t\tconst sessionFile = ctx.sessionManager.getSessionFile();\n\t\t\tif (sessionFile) {\n\t\t\t\tcleanupOldArtifacts(getArtifactsDir(sessionFile), DEFAULT_ARTIFACT_CONFIG.cleanupDays);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Cleanup failures should not block session lifecycle events.\n\t\t}\n\t};\n\n\tconst resetSessionState = (ctx: ExtensionContext) => {\n\t\tstate.baseCwd = ctx.cwd;\n\t\tstate.currentSessionId = resolveCurrentSessionId(ctx.sessionManager);\n\t\tstate.subagentSpawns = { sessionId: state.currentSessionId, count: 0 };\n\t\t// Set PI_SUBAGENT_PARENT_SESSION for permission-system forwarding.\n\t\t// Only set in the root session (the interactive UI session), not in\n\t\t// child subagent processes — children inherit the parent's value\n\t\t// through the process environment at spawn time and must not overwrite\n\t\t// it with their own session identity.\n\t\tif (!process.env[SUBAGENT_CHILD_ENV]) {\n\t\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\t\tif (sessionId) {\n\t\t\t\tprocess.env[SUBAGENT_PARENT_SESSION_ENV] = sessionId;\n\t\t\t}\n\t\t}\n\t\tstate.lastUiContext = ctx;\n\t\tcleanupSessionArtifacts(ctx);\n\t\tclearPendingForegroundControlNotices(state);\n\t\tresetJobs(ctx);\n\t\trestoreActiveJobs(ctx);\n\t\tscheduledRunManager.bindSession(ctx);\n\t\trestoreSlashFinalSnapshots(ctx.sessionManager.getEntries());\n\t\tprimeExistingResults();\n\t};\n\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tresetSessionState(ctx);\n\t\trpcBridge.emitReady(ctx);\n\t\tsupervisorChannel.start();\n\t});\n\n\tpi.on(\"session_shutdown\", () => {\n\t\tdelete process.env[SUBAGENT_PARENT_SESSION_ENV];\n\t\tfor (const unsubscribe of eventUnsubscribes) {\n\t\t\ttry {\n\t\t\t\tunsubscribe();\n\t\t\t} catch {\n\t\t\t\t// Best effort cleanup during shutdown.\n\t\t\t}\n\t\t}\n\t\tif (globalStore[eventUnsubscribeStoreKey] === eventUnsubscribes) {\n\t\t\tdelete globalStore[eventUnsubscribeStoreKey];\n\t\t}\n\t\tstopResultWatcher();\n\t\tscheduledRunManager.stop();\n\t\tif (state.poller) clearInterval(state.poller);\n\t\tstate.poller = null;\n\t\tclearPendingForegroundControlNotices(state);\n\t\tfor (const timer of state.cleanupTimers.values()) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\tstate.cleanupTimers.clear();\n\t\tstate.asyncJobs.clear();\n\t\tclearSlashSnapshots();\n\t\tslashBridge.cancelAll();\n\t\tslashBridge.dispose();\n\t\tpromptTemplateBridge.cancelAll();\n\t\tpromptTemplateBridge.dispose();\n\t\tsupervisorChannel.dispose();\n\t\tif (globalStore[runtimeCleanupStoreKey] === runtimeCleanup) {\n\t\t\tdelete globalStore[runtimeCleanupStoreKey];\n\t\t}\n\t\ttry {\n\t\t\tif (state.lastUiContext?.hasUI) {\n\t\t\t\tstate.lastUiContext.ui.setWidget(WIDGET_KEY, undefined);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!isStaleExtensionContextError(error)) throw error;\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAW,KAAK,YAAY,EAA8C,MAAM,iCAAiC,CAAC;AAoDzH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA2JzC,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA0axE","sourcesContent":["// @ts-nocheck\n/**\n * Subagent Tool\n *\n * Full-featured subagent with sync and async modes.\n * - Sync (default): Streams output, renders markdown, tracks usage\n * - Async: Background execution, emits events when done\n *\n * Modes: single (agent + task), parallel (tasks[]), chain (chain[] with {previous})\n * Toggle: async parameter (default: false, configurable via config.json)\n *\n * Config file: ~/.pi/agent/extensions/subagent/config.json\n * { \"asyncByDefault\": true, \"forceTopLevelAsync\": true, \"maxSubagentDepth\": 1, \"intercomBridge\": { \"mode\": \"always\", \"instructionFile\": \"./intercom-bridge.md\" }, \"worktreeSetupHook\": \"./scripts/setup-worktree.mjs\" }\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { AgentToolResult } from \"@ashx-j/lunr-agent\";\nimport { keyText, type ExtensionAPI, type ExtensionContext, type ToolDefinition } from \"@ashx-j/lunr\";\nimport { Box, Container, Spacer, Text, truncateToWidth, visibleWidth, wrapTextWithAnsi, type Component } from \"@ashx-j/lunr-tui\";\nimport { discoverAgents } from \"../agents/agents.ts\";\nimport { cleanupAllArtifactDirs, cleanupOldArtifacts, getArtifactsDir } from \"../shared/artifacts.ts\";\nimport { resolveCurrentSessionId } from \"../shared/session-identity.ts\";\nimport { cleanupOldChainDirs } from \"../shared/settings.ts\";\nimport { clearLegacyResultAnimationTimer, renderSubagentResult, subagentAnimSink } from \"../tui/render.ts\";\nimport { SubagentParams } from \"./schemas.ts\";\nimport { validateChainInput } from \"./chain-validation.ts\";\nimport { createSubagentExecutor, type SubagentParamsLike } from \"../runs/foreground/subagent-executor.ts\";\nimport { createAsyncJobTracker } from \"../runs/background/async-job-tracker.ts\";\nimport { createResultWatcher } from \"../runs/background/result-watcher.ts\";\nimport { createScheduledRunManager } from \"../runs/background/scheduled-runs.ts\";\nimport { registerSlashCommands } from \"../slash/slash-commands.ts\";\nimport { registerPromptTemplateDelegationBridge } from \"../slash/prompt-template-bridge.ts\";\nimport { registerMainWatchdog } from \"../watchdog/register-main.ts\";\nimport { registerSlashSubagentBridge } from \"../slash/slash-bridge.ts\";\nimport { createNativeSupervisorChannel } from \"../intercom/native-supervisor-channel.ts\";\nimport { registerSubagentRpcBridge } from \"./rpc.ts\";\nimport { clearSlashSnapshots, getSlashRenderableSnapshot, resolveSlashMessageDetails, restoreSlashFinalSnapshots, type SlashMessageDetails } from \"../slash/slash-live-state.ts\";\nimport { inspectSubagentStatus } from \"../runs/background/run-status.ts\";\nimport { resolveWaitToolConfig } from \"../runs/background/subagent-wait.ts\";\nimport { registerWaitTool } from \"../runs/background/wait-tool.ts\";\nimport { drainOutstandingWork } from \"../runs/background/auto-drain.ts\";\nimport registerSubagentNotify, { parseSubagentNotifyContent, type SubagentNotifyDetails } from \"../runs/background/notify.ts\";\nimport { formatSteeringNotice, handleSubagentSteeringNotice, SUBAGENT_STEERING_MESSAGE_TYPE, type SubagentSteeringMessageDetails } from \"./steering-notices.ts\";\nimport { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from \"../runs/shared/pi-args.ts\";\nimport { formatDuration, shortenPath } from \"../shared/formatters.ts\";\nimport { loadConfig } from \"./config.ts\";\nimport { buildSubagentToolDescription } from \"./tool-description.ts\";\nimport {\n\ttype Details,\n\ttype SubagentState,\n\tASYNC_DIR,\n\tDEFAULT_ARTIFACT_CONFIG,\n\tRESULTS_DIR,\n\tSLASH_RESULT_TYPE,\n\tSLASH_TEXT_RESULT_TYPE,\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\tSUBAGENT_ASYNC_STARTED_EVENT,\n\tSUBAGENT_CONTROL_EVENT,\n\tSUBAGENT_STEERING_NOTICE_EVENT,\n\tWIDGET_KEY,\n} from \"../shared/types.ts\";\nimport {\n\tclearPendingForegroundControlNotices,\n\tformatSubagentControlNotice,\n\thandleSubagentControlNotice,\n\tSUBAGENT_CONTROL_MESSAGE_TYPE,\n\ttype SubagentControlMessageDetails,\n} from \"./control-notices.ts\";\n\nexport { loadConfig } from \"./config.ts\";\n\n/**\n * Derive subagent session base directory from parent session file.\n * If parent session is ~/.pi/agent/sessions/abc123.jsonl,\n * returns ~/.pi/agent/sessions/abc123/ as the base.\n * Callers add runId to create the actual session root: abc123/{runId}/\n * Falls back to a unique temp directory if no parent session.\n */\nfunction getSubagentSessionRoot(parentSessionFile: string | null): string {\n\tif (parentSessionFile) {\n\t\tconst baseName = path.basename(parentSessionFile, \".jsonl\");\n\t\tconst sessionsDir = path.dirname(parentSessionFile);\n\t\treturn path.join(sessionsDir, baseName);\n\t}\n\treturn fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-session-\"));\n}\n\nfunction expandTilde(p: string): string {\n\treturn p.startsWith(\"~/\") ? path.join(os.homedir(), p.slice(2)) : p;\n}\n\n/**\n * Create a directory and verify it is actually accessible.\n * On Windows with Azure AD/Entra ID, directories created shortly after\n * wake-from-sleep can end up with broken NTFS ACLs (null DACL) when the\n * cloud SID cannot be resolved without network connectivity. This leaves\n * the directory completely inaccessible to the creating user.\n */\nfunction ensureAccessibleDir(dirPath: string): void {\n\tfs.mkdirSync(dirPath, { recursive: true });\n\ttry {\n\t\tfs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n\t} catch {\n\t\ttry {\n\t\t\tfs.rmSync(dirPath, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Best effort: retry mkdir/access even if cleanup fails.\n\t\t}\n\t\tfs.mkdirSync(dirPath, { recursive: true });\n\t\tfs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n\t}\n}\n\nfunction isSlashResultRunning(result: { details?: Details }): boolean {\n\treturn result.details?.progress?.some((entry) => entry.status === \"running\")\n\t\t|| result.details?.results.some((entry) => entry.progress?.status === \"running\")\n\t\t|| false;\n}\n\n// Drives the inline running-indicator braille animation for foreground subagent\n// results. Foreground runs receive progress only on child events, so the glyph\n// (derived from progress fields) would freeze between events. While a result is\n// running we tick a frame counter every 80ms; renderResult registers the\n// running-glyph lines in state.animEntries (via subagentAnimSink) and the timer\n// rewrites just those Text nodes + requests a repaint, instead of invalidate()-ing\n// the whole tool component (a full renderSubagentResult rebuild 12.5x/s made the\n// spinner laggy).\nfunction subagentResultIsRunning(result: { details?: Details }): boolean {\n\treturn result.details?.progress?.some((entry) => entry.status === \"running\")\n\t\t|| result.details?.results.some((entry) => entry.progress?.status === \"running\")\n\t\t|| false;\n}\n\nfunction ensureSubagentResultAnimation(context: { state: Record<string, unknown>; invalidate?: () => void; requestRender?: () => void }): void {\n\tconst state = context.state as {\n\t\tsubagentResultAnimationTimer?: ReturnType<typeof setInterval>;\n\t\tframe?: number;\n\t\tanimEntries?: Array<{ text: Text; line: (frame: number) => string }>;\n\t};\n\tif (state.subagentResultAnimationTimer) return;\n\tif (typeof context.invalidate !== \"function\") return;\n\tif (state.frame === undefined) state.frame = 0;\n\tstate.subagentResultAnimationTimer = setInterval(() => {\n\t\tstate.frame = ((state.frame ?? 0) + 1) % 10;\n\t\ttry {\n\t\t\tconst entries = state.animEntries;\n\t\t\tif (entries?.length && typeof context.requestRender === \"function\") {\n\t\t\t\tfor (const entry of entries) entry.text.setText(entry.line(state.frame ?? 0));\n\t\t\t\tcontext.requestRender();\n\t\t\t} else {\n\t\t\t\tcontext.invalidate();\n\t\t\t}\n\t\t} catch {}\n\t}, 80);\n}\n\nfunction isSlashResultError(result: { details?: Details }): boolean {\n\treturn result.details?.results.some((entry) => entry.exitCode !== 0 && entry.progress?.status !== \"running\") || false;\n}\n\nfunction isStaleExtensionContextError(error: unknown): boolean {\n\treturn error instanceof Error && error.message.includes(\"Extension context no longer active\");\n}\n\nfunction rebuildSlashResultContainer(\n\tcontainer: Container,\n\tresult: AgentToolResult<Details>,\n\toptions: { expanded: boolean },\n\ttheme: ExtensionContext[\"ui\"][\"theme\"],\n): void {\n\tcontainer.clear();\n\tcontainer.addChild(new Spacer(1));\n\tconst boxTheme = isSlashResultRunning(result) ? \"toolPendingBg\" : isSlashResultError(result) ? \"toolErrorBg\" : \"toolSuccessBg\";\n\tconst box = new Box(1, 1, (text: string) => theme.bg(boxTheme, text));\n\tbox.addChild(renderSubagentResult(result, options, theme));\n\tcontainer.addChild(box);\n}\n\nfunction createSlashResultComponent(\n\tdetails: SlashMessageDetails,\n\toptions: { expanded: boolean },\n\ttheme: ExtensionContext[\"ui\"][\"theme\"],\n): Container {\n\tconst container = new Container();\n\tlet lastVersion = -1;\n\tcontainer.render = (width: number): string[] => {\n\t\tconst snapshot = getSlashRenderableSnapshot(details);\n\t\tif (snapshot.version !== lastVersion || isSlashResultRunning(snapshot.result)) {\n\t\t\tlastVersion = snapshot.version;\n\t\t\trebuildSlashResultContainer(container, snapshot.result, options, theme);\n\t\t}\n\t\treturn Container.prototype.render.call(container, width);\n\t};\n\treturn container;\n}\n\nclass SubagentControlNoticeComponent implements Component {\n\tconstructor(\n\t\tprivate readonly details: SubagentControlMessageDetails,\n\t\tprivate readonly theme: ExtensionContext[\"ui\"][\"theme\"],\n\t) {}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst eventLabel = this.details.event.type.replaceAll(\"_\", \" \");\n\t\tif (width < 3) return [truncateToWidth(`Subagent ${eventLabel}`, width)];\n\t\tconst bodyWidth = Math.max(1, width - 2);\n\t\tconst borderChar = \"─\";\n\t\tconst header = ` ⚠ Subagent ${eventLabel}: ${this.details.event.agent} `;\n\t\tconst headerText = truncateToWidth(header, bodyWidth, \"\");\n\t\tconst headerPadding = Math.max(0, bodyWidth - visibleWidth(headerText));\n\t\tconst lines = [this.theme.fg(\"accent\", `╭${headerText}${borderChar.repeat(headerPadding)}╮`)];\n\n\t\tfor (const line of wrapTextWithAnsi(formatSubagentControlNotice(this.details), bodyWidth)) {\n\t\t\tconst text = truncateToWidth(line, bodyWidth, \"\");\n\t\t\tconst padding = Math.max(0, bodyWidth - visibleWidth(text));\n\t\t\tlines.push(this.theme.fg(\"accent\", `│${text}${\" \".repeat(padding)}│`));\n\t\t}\n\t\tlines.push(this.theme.fg(\"accent\", `╰${borderChar.repeat(bodyWidth)}╯`));\n\t\treturn lines;\n\t}\n}\n\nexport default function registerSubagentExtension(pi: ExtensionAPI): void {\n\tif (process.env[SUBAGENT_CHILD_ENV] === \"1\") {\n\t\treturn;\n\t}\n\tconst globalStore = globalThis as Record<string, unknown>;\n\tconst runtimeCleanupStoreKey = \"__piSubagentRuntimeCleanup\";\n\tconst previousRuntimeCleanup = globalStore[runtimeCleanupStoreKey];\n\tif (typeof previousRuntimeCleanup === \"function\") {\n\t\ttry {\n\t\t\tpreviousRuntimeCleanup();\n\t\t} catch {\n\t\t\t// Best effort cleanup for stale timers from an older reload.\n\t\t}\n\t}\n\n\tensureAccessibleDir(RESULTS_DIR);\n\tensureAccessibleDir(ASYNC_DIR);\n\tcleanupOldChainDirs();\n\n\tconst config = loadConfig();\n\tconst waitToolConfig = resolveWaitToolConfig(config.waitTool);\n\tconst asyncByDefault = config.asyncByDefault === true;\n\tconst tempArtifactsDir = getArtifactsDir(null);\n\tcleanupAllArtifactDirs(DEFAULT_ARTIFACT_CONFIG.cleanupDays);\n\n\tconst state: SubagentState = {\n\t\tbaseCwd: \"\",\n\t\tcurrentSessionId: null,\n\t\tsubagentInProgress: false,\n\t\tsubagentSpawns: { sessionId: null, count: 0 },\n\t\tasyncJobs: new Map(),\n\t\tfleetJobs: new Map(),\n\t\tforegroundRuns: new Map(),\n\t\tforegroundControls: new Map(),\n\t\tlastForegroundControlId: null,\n\t\tpendingForegroundControlNotices: new Map(),\n\t\tcleanupTimers: new Map(),\n\t\tlastUiContext: null,\n\t\tpoller: null,\n\t\tcompletionSeen: new Map(),\n\t\twatcher: null,\n\t\twatcherRestartTimer: null,\n\t\tresultFileCoalescer: {\n\t\t\tschedule: () => false,\n\t\t\tclear: () => {},\n\t\t},\n\t};\n\n\tconst supervisorChannel = createNativeSupervisorChannel(pi, state);\n\tconst mainWatchdog = registerMainWatchdog(pi);\n\tconst { startResultWatcher, primeExistingResults, stopResultWatcher } = createResultWatcher(\n\t\tpi,\n\t\tstate,\n\t\tRESULTS_DIR,\n\t\t10 * 60 * 1000,\n\t);\n\tstartResultWatcher();\n\tprimeExistingResults();\n\n\tconst runtimeCleanup = () => {\n\t\tmainWatchdog.dispose();\n\t\tstopResultWatcher();\n\t\tscheduledRunManager.stop();\n\t\tsupervisorChannel.dispose();\n\t\tclearPendingForegroundControlNotices(state);\n\t\tif (state.poller) {\n\t\t\tclearInterval(state.poller);\n\t\t\tstate.poller = null;\n\t\t}\n\t};\n\tglobalStore[runtimeCleanupStoreKey] = runtimeCleanup;\n\n\tconst { ensurePoller, refreshWidget, handleStarted, handleComplete, resetJobs, restoreActiveJobs } = createAsyncJobTracker(pi, state, ASYNC_DIR, {\n\t\twidgetEnabled: config.asyncWidget !== false,\n\t});\n\tlet executorExecute: ((id: string, params: SubagentParamsLike, signal: AbortSignal, onUpdate: ((r: AgentToolResult<Details>) => void) | undefined, ctx: ExtensionContext) => Promise<AgentToolResult<Details>>) | undefined;\n\tconst scheduledRunManager = createScheduledRunManager({\n\t\tconfig,\n\t\tlaunch: (params, ctx, signal) => {\n\t\t\tif (!executorExecute) {\n\t\t\t\treturn Promise.resolve({\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Scheduled subagent launch is unavailable (executor not ready).\" }],\n\t\t\t\t\tisError: true,\n\t\t\t\t\tdetails: { mode: \"management\" as const, results: [] },\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn executorExecute(randomUUID(), params, signal, undefined, ctx);\n\t\t},\n\t});\n\tconst executor = createSubagentExecutor({\n\t\tpi,\n\t\tstate,\n\t\tconfig,\n\t\tasyncByDefault,\n\t\twaitToolEnabled: waitToolConfig.enabled,\n\t\thandleScheduledRunAction: (params, ctx) => scheduledRunManager.handleToolCall(params, ctx),\n\t\twatchdog: mainWatchdog,\n\t\ttempArtifactsDir,\n\t\tgetSubagentSessionRoot,\n\t\texpandTilde,\n\t\tdiscoverAgents,\n\t});\n\texecutorExecute = executor.execute;\n\n\tpi.registerMessageRenderer<SlashMessageDetails>(SLASH_RESULT_TYPE, (message, options, theme) => {\n\t\tconst details = resolveSlashMessageDetails(message.details);\n\t\tif (!details) return undefined;\n\t\treturn createSlashResultComponent(details, options, theme);\n\t});\n\n\tpi.registerMessageRenderer<undefined>(SLASH_TEXT_RESULT_TYPE, (message, _options, _theme) => {\n\t\tconst content = typeof message.content === \"string\"\n\t\t\t? message.content\n\t\t\t: message.content\n\t\t\t\t.filter((entry) => entry.type === \"text\")\n\t\t\t\t.map((entry) => entry.text)\n\t\t\t\t.join(\"\\n\");\n\t\treturn new Text(content, 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentNotifyDetails>(\"subagent-notify\", (message, options, theme) => {\n\t\tconst content = typeof message.content === \"string\" ? message.content : \"\";\n\t\tconst details = (message.details as SubagentNotifyDetails | undefined) ?? parseSubagentNotifyContent(content);\n\t\tif (!details) return new Text(content, 0, 0);\n\t\tconst icon = details.status === \"completed\"\n\t\t\t? theme.fg(\"success\", \"✓\")\n\t\t\t: details.status === \"paused\"\n\t\t\t\t? theme.fg(\"warning\", \"■\")\n\t\t\t\t: theme.fg(\"error\", \"✗\");\n\t\tconst parts: string[] = [];\n\t\tif (details.taskInfo) parts.push(details.taskInfo);\n\t\tif (details.durationMs !== undefined) parts.push(formatDuration(details.durationMs));\n\t\tlet text = `${icon} ${theme.bold(details.agent)} ${theme.fg(\"dim\", details.status)}`;\n\t\tif (parts.length > 0) text += ` ${theme.fg(\"dim\", \"·\")} ${parts.map((part) => theme.fg(\"dim\", part)).join(` ${theme.fg(\"dim\", \"·\")} `)}`;\n\t\tconst trimmedPreview = details.resultPreview.trim();\n\t\tconst previewLines = options.expanded\n\t\t\t? trimmedPreview.split(\"\\n\").filter((line) => line.trim())\n\t\t\t: [trimmedPreview.split(\"\\n\", 1)[0] ?? \"\"].filter((line) => line.trim());\n\t\tfor (const line of previewLines.length > 0 ? previewLines : [\"(no output)\"]) {\n\t\t\ttext += `\\n ${theme.fg(\"dim\", `⎿ ${line}`)}`;\n\t\t}\n\t\tif (!options.expanded && trimmedPreview.includes(\"\\n\")) {\n\t\t\tconst expandKey = keyText(\"app.tools.expand\");\n\t\t\ttext += `\\n ${theme.fg(\"dim\", `${expandKey} full notification`)}`;\n\t\t}\n\t\tif (details.sessionLabel && details.sessionValue) {\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `${details.sessionLabel}: ${shortenPath(details.sessionValue)}`)}`;\n\t\t}\n\t\treturn new Text(text, 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentSteeringMessageDetails>(SUBAGENT_STEERING_MESSAGE_TYPE, (message, _options, theme) => {\n\t\tconst details = message.details as SubagentSteeringMessageDetails | undefined;\n\t\tif (!details) return undefined;\n\t\treturn new Text(theme.fg(details.state === \"recovered\" ? \"warning\" : \"error\", formatSteeringNotice(details)), 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentControlMessageDetails>(SUBAGENT_CONTROL_MESSAGE_TYPE, (message, _options, theme) => {\n\t\tconst details = message.details as SubagentControlMessageDetails | undefined;\n\t\tif (!details?.event) return undefined;\n\t\tconst content = typeof message.content === \"string\" ? message.content : undefined;\n\t\treturn new SubagentControlNoticeComponent({ ...details, noticeText: formatSubagentControlNotice(details, content) }, theme);\n\t});\n\n\tconst executeSubagentCollapsed = (id: string, params: SubagentParamsLike, signal: AbortSignal, onUpdate: ((result: AgentToolResult<Details>) => void) | undefined, ctx: ExtensionContext) => {\n\t\tif (ctx.hasUI) ctx.ui.setToolsExpanded(false);\n\t\treturn executor.execute(id, params, signal, onUpdate, ctx);\n\t};\n\n\tconst slashBridge = registerSlashSubagentBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (id, params, signal, onUpdate, ctx) =>\n\t\t\texecuteSubagentCollapsed(id, params, signal, onUpdate, ctx),\n\t});\n\n\tconst promptTemplateBridge = registerPromptTemplateDelegationBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (requestId, params, signal, ctx, onUpdate) =>\n\t\t\texecuteSubagentCollapsed(requestId, params, signal, onUpdate, ctx),\n\t});\n\n\tconst rpcBridge = registerSubagentRpcBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (id, params, signal, onUpdate, ctx) => executor.execute(id, params, signal, onUpdate, ctx),\n\t});\n\n\tfunction effectiveParallelTaskCount(tasks: Array<{ count?: unknown }> | undefined): number {\n\t\tif (!tasks || tasks.length === 0) return 0;\n\t\treturn tasks.reduce((total, task) => {\n\t\t\tconst count = typeof task.count === \"number\" && Number.isInteger(task.count) && task.count >= 1 ? task.count : 1;\n\t\t\treturn total + count;\n\t\t}, 0);\n\t}\n\n\tconst tool: ToolDefinition<typeof SubagentParams, Details> = {\n\t\tname: \"subagent\",\n\t\tlabel: \"Subagent\",\n\t\tdescription: buildSubagentToolDescription(config),\n\t\tparameters: SubagentParams,\n\t\t// lunr: sequential so multiple subagent calls in one turn run one-at-a-time\n\t\t// instead of tripping the subagentInProgress guard (parallel mode uses the tasks array).\n\t\texecutionMode: \"sequential\",\n\n\t\tprepareArguments(args) {\n\t\t\t// Run friendly chain validation before pi-ai's raw TypeBox schema check\n\t\t\t// so the model sees which property is disallowed, what is allowed, and a\n\t\t\t// valid example instead of `chain.N: must not have additional properties`.\n\t\t\tvalidateChainInput(args);\n\t\t\treturn args as never;\n\t\t},\n\n\t\texecute(id, params, signal, onUpdate, ctx) {\n\t\t\treturn executeSubagentCollapsed(id, params, signal, onUpdate, ctx);\n\t\t},\n\n\t\trenderCall(args, theme) {\n\t\t\tif (args.action) {\n\t\t\t\tconst target = args.agent || args.chainName || \"\";\n\t\t\t\treturn new Text(\n\t\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}${args.action}${target ? ` ${theme.fg(\"accent\", target)}` : \"\"}`,\n\t\t\t\t\t0, 0,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst isParallel = (args.tasks?.length ?? 0) > 0;\n\t\t\tconst parallelCount = effectiveParallelTaskCount(args.tasks as Array<{ count?: unknown }> | undefined);\n\t\t\tconst asyncLabel = args.async === true && args.clarify !== true ? theme.fg(\"warning\", \" [async]\") : \"\";\n\t\t\tif (args.chain?.length)\n\t\t\t\treturn new Text(\n\t\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}chain (${args.chain.length})${asyncLabel}`,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\tif (isParallel)\n\t\t\t\treturn new Text(\n\t\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}parallel (${parallelCount})${asyncLabel}`,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}${theme.fg(\"accent\", args.agent || \"?\")}${asyncLabel}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\n\t\trenderResult(result, options, theme, context) {\n\t\t\t// lunr: hide `subagent list` / `subagent models` result bodies — the call\n\t\t\t// row already shows the action; the dump stays in the transcript for the model.\n\t\t\tconst action = (context.args as { action?: string } | undefined)?.action;\n\t\t\tif (action === \"list\" || action === \"models\") {\n\t\t\t\treturn { render: () => [], invalidate() {} };\n\t\t\t}\n\t\t\tif (subagentResultIsRunning(result)) {\n\t\t\t\tensureSubagentResultAnimation(context);\n\t\t\t} else {\n\t\t\t\tclearLegacyResultAnimationTimer(context);\n\t\t\t}\n\t\t\tconst state = context.state as { frame?: number; animEntries?: Array<{ text: Text; line: (frame: number) => string }> };\n\t\t\t// lunr: collect running-glyph line templates while rendering so the\n\t\t\t// animation timer can rewrite them in place (see ensureSubagentResultAnimation).\n\t\t\tconst entries: Array<{ text: Text; line: (frame: number) => string }> = [];\n\t\t\tstate.animEntries = entries;\n\t\t\tsubagentAnimSink.current = entries;\n\t\t\ttry {\n\t\t\t\treturn renderSubagentResult(result, options, theme, state.frame ?? 0);\n\t\t\t} finally {\n\t\t\t\tsubagentAnimSink.current = null;\n\t\t\t}\n\t\t},\n\n\t};\n\n\tpi.registerTool(tool);\n\n\t// lunr: register a callback so toggling model tiers mid-session rebuilds the subagent\n\t// tool description (adds/removes MODEL TIERS guidance) and refreshes the tool registry.\n\tconst modelTierBridge = (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/model-tiers\")] as\n\t\t| { registerToolDescriptionRefresher?: (refresher: () => void) => void }\n\t\t| undefined;\n\tmodelTierBridge?.registerToolDescriptionRefresher?.(() => {\n\t\ttool.description = buildSubagentToolDescription(config);\n\t\t// pi.runtime is not on ExtensionAPI; registerTool refreshes the live registry.\n\t\tpi.registerTool(tool);\n\t});\n\n\tregisterWaitTool(pi, state, waitToolConfig.enabled);\n\n\tpi.on(\"agent_end\", async (_event, ctx) => {\n\t\tif (ctx.hasUI) return;\n\t\tawait drainOutstandingWork({ state, events: pi.events });\n\t});\n\n\tregisterSlashCommands(pi, state);\n\n\tconst eventUnsubscribeStoreKey = \"__piSubagentEventUnsubscribes\";\n\tconst controlNoticeSeenStoreKey = \"__piSubagentVisibleControlNotices\";\n\tconst previousEventUnsubscribes = globalStore[eventUnsubscribeStoreKey];\n\tif (Array.isArray(previousEventUnsubscribes)) {\n\t\tfor (const unsubscribe of previousEventUnsubscribes) {\n\t\t\tif (typeof unsubscribe !== \"function\") continue;\n\t\t\ttry {\n\t\t\t\tunsubscribe();\n\t\t\t} catch {\n\t\t\t\t// Best effort cleanup for stale handlers from an older reload.\n\t\t\t}\n\t\t}\n\t}\n\tregisterSubagentNotify(pi, state, { batchConfig: config.completionBatch });\n\n\tconst existingVisibleControlNotices = globalStore[controlNoticeSeenStoreKey];\n\tconst visibleControlNotices = existingVisibleControlNotices instanceof Set ? existingVisibleControlNotices as Set<string> : new Set<string>();\n\tglobalStore[controlNoticeSeenStoreKey] = visibleControlNotices;\n\tconst controlEventHandler = (payload: unknown) => {\n\t\thandleSubagentControlNotice({\n\t\t\tpi,\n\t\t\tstate,\n\t\t\tvisibleControlNotices,\n\t\t\tdetails: payload as SubagentControlMessageDetails,\n\t\t});\n\t};\n\tconst steeringNoticeHandler = (payload: unknown) => {\n\t\thandleSubagentSteeringNotice({ pi, state, details: payload as SubagentSteeringMessageDetails });\n\t};\n\tconst eventUnsubscribes = [\n\t\tpi.events.on(SUBAGENT_ASYNC_STARTED_EVENT, handleStarted),\n\t\tpi.events.on(SUBAGENT_ASYNC_COMPLETE_EVENT, handleComplete),\n\t\tpi.events.on(SUBAGENT_CONTROL_EVENT, controlEventHandler),\n\t\tpi.events.on(SUBAGENT_STEERING_NOTICE_EVENT, steeringNoticeHandler),\n\t\trpcBridge.dispose,\n\t];\n\tglobalStore[eventUnsubscribeStoreKey] = eventUnsubscribes;\n\n\tpi.on(\"tool_result\", (event, ctx) => {\n\t\tif (event.toolName !== \"subagent\") return;\n\t\tif (!ctx.hasUI) return;\n\t\tstate.lastUiContext = ctx;\n\t\tif (state.asyncJobs.size > 0) {\n\t\t\trefreshWidget(ctx);\n\t\t\tensurePoller();\n\t\t}\n\t});\n\n\tconst cleanupSessionArtifacts = (ctx: ExtensionContext) => {\n\t\ttry {\n\t\t\tconst sessionFile = ctx.sessionManager.getSessionFile();\n\t\t\tif (sessionFile) {\n\t\t\t\tcleanupOldArtifacts(getArtifactsDir(sessionFile), DEFAULT_ARTIFACT_CONFIG.cleanupDays);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Cleanup failures should not block session lifecycle events.\n\t\t}\n\t};\n\n\tconst resetSessionState = (ctx: ExtensionContext) => {\n\t\tstate.baseCwd = ctx.cwd;\n\t\tstate.currentSessionId = resolveCurrentSessionId(ctx.sessionManager);\n\t\tstate.subagentSpawns = { sessionId: state.currentSessionId, count: 0 };\n\t\t// Set PI_SUBAGENT_PARENT_SESSION for permission-system forwarding.\n\t\t// Only set in the root session (the interactive UI session), not in\n\t\t// child subagent processes — children inherit the parent's value\n\t\t// through the process environment at spawn time and must not overwrite\n\t\t// it with their own session identity.\n\t\tif (!process.env[SUBAGENT_CHILD_ENV]) {\n\t\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\t\tif (sessionId) {\n\t\t\t\tprocess.env[SUBAGENT_PARENT_SESSION_ENV] = sessionId;\n\t\t\t}\n\t\t}\n\t\tstate.lastUiContext = ctx;\n\t\tcleanupSessionArtifacts(ctx);\n\t\tclearPendingForegroundControlNotices(state);\n\t\tresetJobs(ctx);\n\t\trestoreActiveJobs(ctx);\n\t\tscheduledRunManager.bindSession(ctx);\n\t\trestoreSlashFinalSnapshots(ctx.sessionManager.getEntries());\n\t\tprimeExistingResults();\n\t};\n\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tresetSessionState(ctx);\n\t\trpcBridge.emitReady(ctx);\n\t\tsupervisorChannel.start();\n\t});\n\n\tpi.on(\"session_shutdown\", () => {\n\t\tdelete process.env[SUBAGENT_PARENT_SESSION_ENV];\n\t\tfor (const unsubscribe of eventUnsubscribes) {\n\t\t\ttry {\n\t\t\t\tunsubscribe();\n\t\t\t} catch {\n\t\t\t\t// Best effort cleanup during shutdown.\n\t\t\t}\n\t\t}\n\t\tif (globalStore[eventUnsubscribeStoreKey] === eventUnsubscribes) {\n\t\t\tdelete globalStore[eventUnsubscribeStoreKey];\n\t\t}\n\t\tstopResultWatcher();\n\t\tscheduledRunManager.stop();\n\t\tif (state.poller) clearInterval(state.poller);\n\t\tstate.poller = null;\n\t\tclearPendingForegroundControlNotices(state);\n\t\tfor (const timer of state.cleanupTimers.values()) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\tstate.cleanupTimers.clear();\n\t\tstate.asyncJobs.clear();\n\t\tclearSlashSnapshots();\n\t\tslashBridge.cancelAll();\n\t\tslashBridge.dispose();\n\t\tpromptTemplateBridge.cancelAll();\n\t\tpromptTemplateBridge.dispose();\n\t\tsupervisorChannel.dispose();\n\t\tif (globalStore[runtimeCleanupStoreKey] === runtimeCleanup) {\n\t\t\tdelete globalStore[runtimeCleanupStoreKey];\n\t\t}\n\t\ttry {\n\t\t\tif (state.lastUiContext?.hasUI) {\n\t\t\t\tstate.lastUiContext.ui.setWidget(WIDGET_KEY, undefined);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!isStaleExtensionContextError(error)) throw error;\n\t\t}\n\t});\n}\n"]}
@@ -401,9 +401,10 @@ export default function registerSubagentExtension(pi) {
401
401
  return new Text(`${theme.fg("toolTitle", theme.bold("subagent "))}${theme.fg("accent", args.agent || "?")}${asyncLabel}`, 0, 0);
402
402
  },
403
403
  renderResult(result, options, theme, context) {
404
- // lunr: hide the `subagent list` result body — the call row already shows
405
- // the action; the roster stays in the transcript for the model.
406
- if (context.args?.action === "list") {
404
+ // lunr: hide `subagent list` / `subagent models` result bodies — the call
405
+ // row already shows the action; the dump stays in the transcript for the model.
406
+ const action = context.args?.action;
407
+ if (action === "list" || action === "models") {
407
408
  return { render: () => [], invalidate() { } };
408
409
  }
409
410
  if (subagentResultIsRunning(result)) {