@narumitw/pi-subagents 2.0.5 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +152 -50
  2. package/dist/chunks/{auto-transport-SY2VHUFH.ts → auto-transport-FUUKFDIG.ts} +6 -6
  3. package/dist/chunks/{capability-grant-CGEWOEKE.ts → capability-grant-PR72SWWS.ts} +4 -4
  4. package/dist/chunks/{chunk-DPPVEQAM.ts → chunk-4AQSF7AS.ts} +1 -1
  5. package/dist/chunks/chunk-4AQSF7AS.ts.map +7 -0
  6. package/dist/chunks/chunk-6H6TBBED.ts +108 -0
  7. package/dist/chunks/chunk-6H6TBBED.ts.map +7 -0
  8. package/dist/chunks/{chunk-DSOOH73Y.ts → chunk-7AAJEUSL.ts} +3 -3
  9. package/dist/chunks/{chunk-DSOOH73Y.ts.map → chunk-7AAJEUSL.ts.map} +2 -2
  10. package/dist/chunks/{chunk-7QPPBBXZ.ts → chunk-D4CR7T73.ts} +21 -3
  11. package/dist/chunks/chunk-D4CR7T73.ts.map +7 -0
  12. package/dist/chunks/{chunk-434NII74.ts → chunk-DIHBUR2E.ts} +54 -8
  13. package/dist/chunks/chunk-DIHBUR2E.ts.map +7 -0
  14. package/dist/chunks/{chunk-NIF42QMF.ts → chunk-FEVPWRMU.ts} +7 -4
  15. package/dist/chunks/chunk-FEVPWRMU.ts.map +7 -0
  16. package/dist/chunks/{chunk-YBUWBRF7.ts → chunk-FXI45N3J.ts} +5 -5
  17. package/dist/chunks/{chunk-S2IWVK3J.ts → chunk-ILEQ27AL.ts} +3 -2
  18. package/dist/chunks/chunk-ILEQ27AL.ts.map +7 -0
  19. package/dist/chunks/{chunk-DQMN4OYM.ts → chunk-ITVWPNU4.ts} +12 -106
  20. package/dist/chunks/chunk-ITVWPNU4.ts.map +7 -0
  21. package/dist/chunks/{chunk-QDVGH2X7.ts → chunk-IWC32VPY.ts} +2 -1
  22. package/dist/chunks/{chunk-QDVGH2X7.ts.map → chunk-IWC32VPY.ts.map} +2 -2
  23. package/dist/chunks/{chunk-I2FAK44T.ts → chunk-JSZIP73U.ts} +48 -10
  24. package/dist/chunks/chunk-JSZIP73U.ts.map +7 -0
  25. package/dist/chunks/{chunk-ZHTNCZIA.ts → chunk-JU6LUNLP.ts} +2 -2
  26. package/dist/chunks/{chunk-PSK43Y6A.ts → chunk-LASD73CM.ts} +2 -2
  27. package/dist/chunks/{chunk-C4L6P266.ts → chunk-LEOYDZI3.ts} +1 -1
  28. package/dist/chunks/{chunk-C4L6P266.ts.map → chunk-LEOYDZI3.ts.map} +2 -2
  29. package/dist/chunks/{chunk-H3BFJ7HJ.ts → chunk-LL4LP2T7.ts} +5 -5
  30. package/dist/chunks/chunk-N2T5IN4X.ts +18 -0
  31. package/dist/chunks/chunk-N2T5IN4X.ts.map +7 -0
  32. package/dist/chunks/{chunk-G3RSMSXJ.ts → chunk-NTRPLF46.ts} +1 -1
  33. package/dist/chunks/chunk-NTRPLF46.ts.map +7 -0
  34. package/dist/chunks/{chunk-CBP76ARQ.ts → chunk-PABJJYP6.ts} +174 -47
  35. package/dist/chunks/chunk-PABJJYP6.ts.map +7 -0
  36. package/dist/chunks/{chunk-EFBPISNT.ts → chunk-PBZMBTNJ.ts} +104 -103
  37. package/dist/chunks/chunk-PBZMBTNJ.ts.map +7 -0
  38. package/dist/chunks/{chunk-SCZ33MYW.ts → chunk-PGLSFLYW.ts} +2 -2
  39. package/dist/chunks/{chunk-O4VO6JUJ.ts → chunk-TM2R67J3.ts} +3 -3
  40. package/dist/chunks/{chunk-QBORTI4W.ts → chunk-TMZRHIIK.ts} +32 -3
  41. package/dist/chunks/chunk-TMZRHIIK.ts.map +7 -0
  42. package/dist/chunks/chunk-TZ34IQ3M.ts +59 -0
  43. package/dist/chunks/chunk-TZ34IQ3M.ts.map +7 -0
  44. package/dist/chunks/chunk-VBDGNNLM.ts +214 -0
  45. package/dist/chunks/chunk-VBDGNNLM.ts.map +7 -0
  46. package/dist/chunks/{chunk-7OBINKFM.ts → chunk-VDG7LTYE.ts} +11 -11
  47. package/dist/chunks/chunk-VDG7LTYE.ts.map +7 -0
  48. package/dist/chunks/{chunk-AEUYS7JC.ts → chunk-X4NMONPE.ts} +1 -1
  49. package/dist/chunks/chunk-X4NMONPE.ts.map +7 -0
  50. package/dist/chunks/{chunk-HKC4ES4B.ts → chunk-YPJEN6NU.ts} +2 -2
  51. package/dist/chunks/{completion-delivery-YPOWSSV3.ts → completion-delivery-JVLNQRWX.ts} +5 -4
  52. package/dist/chunks/{config-status-J4GPWP46.ts → config-status-FKGDECZ3.ts} +7 -6
  53. package/dist/chunks/{config-ui-2YUCUEBM.ts → config-ui-DDKERQHI.ts} +297 -231
  54. package/dist/chunks/config-ui-DDKERQHI.ts.map +7 -0
  55. package/dist/chunks/{consult-IV7UBNQQ.ts → consult-PQ6PRAKC.ts} +14 -13
  56. package/dist/chunks/consult-PQ6PRAKC.ts.map +7 -0
  57. package/dist/chunks/{create-stateful-transport-ZP3IXNV3.ts → create-stateful-transport-JWC2EFYL.ts} +6 -6
  58. package/dist/chunks/{delegation-contract-WJPT4FVS.ts → delegation-contract-LA56I5DT.ts} +2 -2
  59. package/dist/chunks/{discovery-K25T3SH4.ts → discovery-MIFB2U4Y.ts} +3 -3
  60. package/dist/chunks/{execution-LA7HN5YF.ts → execution-Q2JZLKJA.ts} +19 -16
  61. package/dist/chunks/execution-Q2JZLKJA.ts.map +7 -0
  62. package/dist/chunks/{in-process-transport-4RF3J6XK.ts → in-process-transport-HJ6TZXC3.ts} +9 -9
  63. package/dist/chunks/{inspect-XV2QALMR.ts → inspect-UH2TKH6E.ts} +25 -10
  64. package/dist/chunks/inspect-UH2TKH6E.ts.map +7 -0
  65. package/dist/chunks/{persistence-VSGXAW4P.ts → persistence-XHPJBZL7.ts} +11 -7
  66. package/dist/chunks/persistence-XHPJBZL7.ts.map +7 -0
  67. package/dist/chunks/{registry-E6XPJB7L.ts → registry-XDXPECWF.ts} +136 -15
  68. package/dist/chunks/registry-XDXPECWF.ts.map +7 -0
  69. package/dist/chunks/{retained-semantic-state-7WXSGRJU.ts → retained-semantic-state-GM75FZGE.ts} +3 -3
  70. package/dist/chunks/{rpc-transport-NEHBHWX4.ts → rpc-transport-7R7DVCEB.ts} +12 -16
  71. package/dist/chunks/rpc-transport-7R7DVCEB.ts.map +7 -0
  72. package/dist/chunks/{spawn-idempotency-QGHO2WKC.ts → spawn-idempotency-BNHOSMZW.ts} +2 -2
  73. package/dist/chunks/{subprocess-transport-NSHOGDC4.ts → subprocess-transport-VHZJRBTW.ts} +15 -14
  74. package/dist/chunks/subprocess-transport-VHZJRBTW.ts.map +7 -0
  75. package/dist/chunks/usage-recording-store-CW3EH2SZ.ts +164 -0
  76. package/dist/chunks/usage-recording-store-CW3EH2SZ.ts.map +7 -0
  77. package/dist/index.ts +427 -30
  78. package/dist/index.ts.map +3 -3
  79. package/docs/async-runtime-protocol.md +69 -0
  80. package/docs/implementation-notes/pi-subagents-capability-matrix.md +62 -0
  81. package/docs/implementation-notes/pi-subagents-current-direction.md +99 -0
  82. package/docs/implementation-notes/pi-subagents-rpc-v1.md +153 -0
  83. package/docs/pi-subagents-diagrams.md +183 -0
  84. package/package.json +9 -8
  85. package/src/agents/types.ts +2 -0
  86. package/src/async-subagent-benchmark.ts +532 -0
  87. package/src/completion-delivery.ts +71 -4
  88. package/src/completion-render.ts +1 -0
  89. package/src/completion-requirement.ts +308 -0
  90. package/src/config-registration.ts +5 -5
  91. package/src/config-status.ts +66 -70
  92. package/src/config-ui.ts +244 -150
  93. package/src/consult-resources.ts +1 -1
  94. package/src/consult.ts +3 -8
  95. package/src/delegation-contract.ts +55 -9
  96. package/src/execution-plan.ts +1 -1
  97. package/src/execution-ui.ts +40 -29
  98. package/src/execution.ts +2 -3
  99. package/src/inspect.ts +24 -1
  100. package/src/orchestration-metrics.ts +1 -1
  101. package/src/panel-execution.ts +2 -3
  102. package/src/panel-failure.ts +1 -1
  103. package/src/panel-render.ts +1 -1
  104. package/src/parallel-limit-ui.ts +6 -5
  105. package/src/params.ts +2 -1
  106. package/src/persistence.ts +9 -0
  107. package/src/process-control.ts +43 -0
  108. package/src/registry-types.ts +5 -0
  109. package/src/registry.ts +162 -18
  110. package/src/render.ts +2 -1
  111. package/src/rpc-transport.ts +1 -1
  112. package/src/runner-outcome.ts +1 -1
  113. package/src/runner-result.ts +1 -1
  114. package/src/runner-types.ts +102 -0
  115. package/src/runner.ts +11 -192
  116. package/src/settings/inspection.ts +27 -0
  117. package/src/settings/schema.ts +9 -0
  118. package/src/settings-reader.ts +7 -0
  119. package/src/settings.ts +20 -0
  120. package/src/spawn-idempotency.ts +5 -0
  121. package/src/stateful-agent-view.ts +15 -19
  122. package/src/stateful-guidance.ts +14 -4
  123. package/src/stateful-limit-ui.ts +23 -20
  124. package/src/stateful-limits.ts +10 -10
  125. package/src/stateful-registration.ts +126 -9
  126. package/src/stateful-render.ts +27 -2
  127. package/src/subagent-details.ts +43 -0
  128. package/src/subagents-extension.ts +66 -8
  129. package/src/subagents.ts +2 -0
  130. package/src/subprocess-transport.ts +2 -1
  131. package/src/supervision.ts +2 -1
  132. package/src/timeout-finalization.ts +1 -1
  133. package/src/tool-schema-compatibility.ts +73 -0
  134. package/src/transport-types.ts +6 -0
  135. package/src/transport-ui.ts +18 -46
  136. package/src/usage-recording-config.ts +13 -0
  137. package/src/usage-recording-store.ts +183 -0
  138. package/src/usage-recording.ts +478 -0
  139. package/src/verification-harness.ts +1 -1
  140. package/src/workflow-ui.ts +17 -9
  141. package/dist/chunks/chunk-434NII74.ts.map +0 -7
  142. package/dist/chunks/chunk-7OBINKFM.ts.map +0 -7
  143. package/dist/chunks/chunk-7QPPBBXZ.ts.map +0 -7
  144. package/dist/chunks/chunk-AEUYS7JC.ts.map +0 -7
  145. package/dist/chunks/chunk-CBP76ARQ.ts.map +0 -7
  146. package/dist/chunks/chunk-DPPVEQAM.ts.map +0 -7
  147. package/dist/chunks/chunk-DQMN4OYM.ts.map +0 -7
  148. package/dist/chunks/chunk-EFBPISNT.ts.map +0 -7
  149. package/dist/chunks/chunk-G3RSMSXJ.ts.map +0 -7
  150. package/dist/chunks/chunk-I2FAK44T.ts.map +0 -7
  151. package/dist/chunks/chunk-NIF42QMF.ts.map +0 -7
  152. package/dist/chunks/chunk-QBORTI4W.ts.map +0 -7
  153. package/dist/chunks/chunk-S2IWVK3J.ts.map +0 -7
  154. package/dist/chunks/config-ui-2YUCUEBM.ts.map +0 -7
  155. package/dist/chunks/consult-IV7UBNQQ.ts.map +0 -7
  156. package/dist/chunks/execution-LA7HN5YF.ts.map +0 -7
  157. package/dist/chunks/inspect-XV2QALMR.ts.map +0 -7
  158. package/dist/chunks/persistence-VSGXAW4P.ts.map +0 -7
  159. package/dist/chunks/registry-E6XPJB7L.ts.map +0 -7
  160. package/dist/chunks/rpc-transport-NEHBHWX4.ts.map +0 -7
  161. package/dist/chunks/subprocess-transport-NSHOGDC4.ts.map +0 -7
  162. /package/dist/chunks/{auto-transport-SY2VHUFH.ts.map → auto-transport-FUUKFDIG.ts.map} +0 -0
  163. /package/dist/chunks/{capability-grant-CGEWOEKE.ts.map → capability-grant-PR72SWWS.ts.map} +0 -0
  164. /package/dist/chunks/{chunk-YBUWBRF7.ts.map → chunk-FXI45N3J.ts.map} +0 -0
  165. /package/dist/chunks/{chunk-ZHTNCZIA.ts.map → chunk-JU6LUNLP.ts.map} +0 -0
  166. /package/dist/chunks/{chunk-PSK43Y6A.ts.map → chunk-LASD73CM.ts.map} +0 -0
  167. /package/dist/chunks/{chunk-H3BFJ7HJ.ts.map → chunk-LL4LP2T7.ts.map} +0 -0
  168. /package/dist/chunks/{chunk-SCZ33MYW.ts.map → chunk-PGLSFLYW.ts.map} +0 -0
  169. /package/dist/chunks/{chunk-O4VO6JUJ.ts.map → chunk-TM2R67J3.ts.map} +0 -0
  170. /package/dist/chunks/{chunk-HKC4ES4B.ts.map → chunk-YPJEN6NU.ts.map} +0 -0
  171. /package/dist/chunks/{completion-delivery-YPOWSSV3.ts.map → completion-delivery-JVLNQRWX.ts.map} +0 -0
  172. /package/dist/chunks/{config-status-J4GPWP46.ts.map → config-status-FKGDECZ3.ts.map} +0 -0
  173. /package/dist/chunks/{create-stateful-transport-ZP3IXNV3.ts.map → create-stateful-transport-JWC2EFYL.ts.map} +0 -0
  174. /package/dist/chunks/{delegation-contract-WJPT4FVS.ts.map → delegation-contract-LA56I5DT.ts.map} +0 -0
  175. /package/dist/chunks/{discovery-K25T3SH4.ts.map → discovery-MIFB2U4Y.ts.map} +0 -0
  176. /package/dist/chunks/{in-process-transport-4RF3J6XK.ts.map → in-process-transport-HJ6TZXC3.ts.map} +0 -0
  177. /package/dist/chunks/{retained-semantic-state-7WXSGRJU.ts.map → retained-semantic-state-GM75FZGE.ts.map} +0 -0
  178. /package/dist/chunks/{spawn-idempotency-QGHO2WKC.ts.map → spawn-idempotency-BNHOSMZW.ts.map} +0 -0
@@ -5,7 +5,10 @@ import {
5
5
  } from "./chunk-KMGKCEO4.ts";
6
6
  import {
7
7
  updateStatefulLimitSetting
8
- } from "./chunk-7QPPBBXZ.ts";
8
+ } from "./chunk-D4CR7T73.ts";
9
+ import {
10
+ USAGE_RECORDING_RETENTION_DAYS
11
+ } from "./chunk-N2T5IN4X.ts";
9
12
  import {
10
13
  inspectBlockingParallelLimitSettings,
11
14
  inspectCompletionDeliverySettings,
@@ -13,14 +16,15 @@ import {
13
16
  inspectCwdPolicySettings,
14
17
  inspectDelegationWorkflowSettings,
15
18
  inspectStatefulLimitSettings,
16
- inspectStatefulTransportSettings
17
- } from "./chunk-QBORTI4W.ts";
19
+ inspectStatefulTransportSettings,
20
+ inspectUsageRecordingSettings
21
+ } from "./chunk-TMZRHIIK.ts";
18
22
  import {
19
23
  STATEFUL_LIMIT_DEFINITIONS,
20
24
  isValidStatefulLimit,
21
25
  resolveStatefulLimits,
22
26
  statefulLimitDefinition
23
- } from "./chunk-7OBINKFM.ts";
27
+ } from "./chunk-VDG7LTYE.ts";
24
28
  import {
25
29
  safeTerminalLine
26
30
  } from "./chunk-SWGQLFSD.ts";
@@ -31,10 +35,10 @@ function statefulLimitListScreen(runtime) {
31
35
  const current = runtime.getRuntimeStatus().limits;
32
36
  return {
33
37
  kind: "actions",
34
- title: "Detached Agent Limits",
38
+ title: "Background Agent Limits",
35
39
  lines: [
36
- "These limits apply after /reload or the next Pi session.",
37
- "Reloading can interrupt retained detached work.",
40
+ "These advanced limits apply after /reload or the next Pi session.",
41
+ "Reloading can interrupt subagents saved for follow-up.",
38
42
  ...inspected.error ? [
39
43
  `Settings cannot be edited: ${safeTerminalLine(inspected.error)}`,
40
44
  `Repair ${safeTerminalLine(inspected.path)} and retry.`
@@ -46,7 +50,7 @@ function statefulLimitListScreen(runtime) {
46
50
  return {
47
51
  id: definition.field,
48
52
  label: definition.label,
49
- description: `Current ${current[definition.field]} \xB7 configured ${configured?.value ?? "unavailable"} (${configured?.source ?? "unknown"})`,
53
+ description: `Current: ${current[definition.field]} \xB7 after reload: ${configured?.value ?? "unavailable"} (${configured?.source ?? "unknown"})`,
50
54
  action: "pick-stateful-limit"
51
55
  };
52
56
  }) : [],
@@ -65,7 +69,7 @@ function statefulLimitInputScreen(field, runtime) {
65
69
  lines: [
66
70
  definition.description,
67
71
  `Current session: ${runtime.getRuntimeStatus().limits[field]}`,
68
- `Configured after reload: ${configured?.value ?? "unavailable"} (${configured?.source ?? "unknown"})`,
72
+ `After reload: ${configured?.value ?? "unavailable"} (${configured?.source ?? "unknown"})`,
69
73
  `Allowed: whole numbers ${definition.minimum === 0 ? "0 or greater" : "1 or greater"}`,
70
74
  `Read from: ${safeTerminalLine(inspected.path)}`,
71
75
  ...inspected.writePath !== inspected.path ? [`Saves to: ${safeTerminalLine(inspected.writePath)}`] : []
@@ -102,9 +106,9 @@ async function applyStatefulLimitSetting(field, value, ctx, runtime, options) {
102
106
  const confirmed = await ctx.ui.confirm(
103
107
  `Lower ${statefulLimitDefinition(field).label}?`,
104
108
  [
105
- `This configured value would omit ${affectedBefore.length} currently retained agent record${affectedBefore.length === 1 ? "" : "s"} from projected recovery after reload.`,
106
- "No agent is closed now, and this menu will not reload Pi.",
107
- "A later state rewrite can make omitted records unavailable for recovery."
109
+ `After reload, this value could exclude ${affectedBefore.length} saved subagent record${affectedBefore.length === 1 ? "" : "s"} from recovery.`,
110
+ "No subagent is removed now, and this menu will not reload Pi.",
111
+ "A later state save can make excluded records unavailable for recovery."
108
112
  ].join("\n\n"),
109
113
  { signal: options.signal }
110
114
  );
@@ -115,7 +119,10 @@ async function applyStatefulLimitSetting(field, value, ctx, runtime, options) {
115
119
  [field]: next
116
120
  });
117
121
  if (!sameIds(affectedBefore, affectedAfter)) {
118
- ctx.ui.notify("Detached agents changed while confirming; review the limit again.", "warning");
122
+ ctx.ui.notify(
123
+ "Current subagents changed while confirming; review the limit again.",
124
+ "warning"
125
+ );
119
126
  return { kind: "rejected" };
120
127
  }
121
128
  }
@@ -125,7 +132,7 @@ async function applyStatefulLimitSetting(field, value, ctx, runtime, options) {
125
132
  } catch (error) {
126
133
  if (options.isCurrent() && !options.signal.aborted) {
127
134
  ctx.ui.notify(
128
- `Detached limit was not saved; the previous setting is unchanged: ${formatError(error)}`,
135
+ `Background-agent limit was not saved; the previous setting is unchanged: ${formatError(error)}`,
129
136
  "error"
130
137
  );
131
138
  }
@@ -133,18 +140,18 @@ async function applyStatefulLimitSetting(field, value, ctx, runtime, options) {
133
140
  }
134
141
  if (options.signal.aborted || !options.isCurrent()) return { kind: "close" };
135
142
  ctx.ui.notify(
136
- `Saved ${statefulLimitDefinition(field).label.toLowerCase()}: ${next}. Applies after /reload; clear retained agents before reloading if their work must not be interrupted.`,
143
+ `Saved ${statefulLimitDefinition(field).label.toLowerCase()}: ${next}. Applies after /reload; clear current subagents first if their work must not be interrupted.`,
137
144
  "info"
138
145
  );
139
146
  return { kind: "back" };
140
147
  }
141
148
  function formatDetachedLimitSummary(status) {
142
149
  return [
143
- `${status.limits.maxAgents} retained`,
144
- `${status.limits.maxActiveTurns} active turns`,
145
- `${status.limits.maxChildrenPerAgent} children`,
146
- `depth ${status.limits.maxDepth}`,
147
- `${status.limits.maxStoredAgents} stored`
150
+ `${status.limits.maxAgents} saved`,
151
+ `${status.limits.maxActiveTurns} working at once`,
152
+ `${status.limits.maxChildrenPerAgent} children each`,
153
+ `${status.limits.maxDepth} nested levels`,
154
+ `${status.limits.maxStoredAgents} stored records`
148
155
  ].join(" \xB7 ");
149
156
  }
150
157
  function formatConfiguredDetachedLimitDivergence(status, values) {
@@ -152,18 +159,12 @@ function formatConfiguredDetachedLimitDivergence(status, values) {
152
159
  const configured = values[definition.field].value;
153
160
  return configured === status.limits[definition.field] ? [] : [`${definition.label.toLowerCase()} ${configured}`];
154
161
  });
155
- return changed.length > 0 ? `Configured after reload: ${changed.join(" \xB7 ")}` : void 0;
156
- }
157
- function formatConfiguredDetachedLimits(values) {
158
- return STATEFUL_LIMIT_DEFINITIONS.map((definition) => {
159
- const snapshot = values[definition.field];
160
- return `${definition.label.toLowerCase()} ${snapshot.value} (${snapshot.source})`;
161
- }).join(" \xB7 ");
162
+ return changed.length > 0 ? `After /reload: ${changed.join(" \xB7 ")}` : void 0;
162
163
  }
163
164
  function formatEmptyStatefulRuntime(status) {
164
- if (!status.enabled) return "Stateful subagents are disabled in user settings.";
165
- if (!status.initialized) return "Stateful subagents are not initialized for this session.";
166
- return "No current-session subagents.";
165
+ if (!status.enabled) return "Background subagents are disabled in How subagents run.";
166
+ if (!status.initialized) return "Background subagents have not started in this session.";
167
+ return "No subagents are working or saved for follow-up in this session.";
167
168
  }
168
169
  function parseStatefulLimit(field, value) {
169
170
  const normalized = value?.trim() ?? "";
@@ -209,7 +210,7 @@ function formatError(error) {
209
210
  async function showWorkflowPreview(ctx, current, next, requiresReload, signal) {
210
211
  const changes = workflowEffects(current, next);
211
212
  return ctx.ui.confirm(
212
- requiresReload ? "Save delegation change and reload?" : "Save delegation change?",
213
+ requiresReload ? "Save how subagents run and reload?" : "Save how subagents run?",
213
214
  [
214
215
  `Current: ${workflowLabel(current)}`,
215
216
  `New: ${workflowLabel(next)}`,
@@ -226,27 +227,33 @@ async function showWorkflowPreview(ctx, current, next, requiresReload, signal) {
226
227
  function workflowLabel(value) {
227
228
  switch (value) {
228
229
  case "all":
229
- return "All delegation methods";
230
+ return "Background plus compatibility methods (async + sync)";
230
231
  case "async-only":
231
- return "Async only";
232
+ return "Keep Pi available (async)";
232
233
  case "blocking-only":
233
- return "Blocking only";
234
+ return "Compatibility blocking methods (sync)";
234
235
  case "disabled":
235
- return "Delegation disabled";
236
+ return "Subagents disabled";
236
237
  }
237
238
  }
238
239
  function workflowEffects(current, next) {
239
240
  const blockingEnabled = (value) => value === "all" || value === "blocking-only";
240
241
  const asyncEnabled = (value) => value === "all" || value === "async-only";
242
+ const awaitEnabled = (value) => blockingEnabled(value) && asyncEnabled(value);
241
243
  const effects = [];
242
244
  if (blockingEnabled(current) !== blockingEnabled(next)) {
243
245
  effects.push(
244
- blockingEnabled(next) ? "Add blocking `subagent` and read-only `subagent_consult`" : "Remove blocking `subagent` and read-only `subagent_consult`"
246
+ blockingEnabled(next) ? "Allow deprecated blocking `subagent` and supported read-only `subagent_consult`" : "Remove deprecated blocking `subagent` and supported read-only `subagent_consult`"
245
247
  );
246
248
  }
247
249
  if (asyncEnabled(current) !== asyncEnabled(next)) {
248
250
  effects.push(
249
- asyncEnabled(next) ? "Add async `subagent_spawn`, `subagent_send`, `subagent_manage`, and `subagent_mailbox`" : "Remove async `subagent_spawn`, `subagent_send`, `subagent_manage`, and `subagent_mailbox`"
251
+ asyncEnabled(next) ? "Allow background tools: `subagent_spawn`, `subagent_send`, `subagent_manage`, and `subagent_mailbox`" : "Remove background tools: `subagent_spawn`, `subagent_send`, `subagent_manage`, and `subagent_mailbox`"
252
+ );
253
+ }
254
+ if (awaitEnabled(current) !== awaitEnabled(next)) {
255
+ effects.push(
256
+ awaitEnabled(next) ? "Allow the blocking retained-agent join: `subagent_await`" : "Remove the blocking retained-agent join: `subagent_await`"
250
257
  );
251
258
  }
252
259
  return effects;
@@ -269,57 +276,43 @@ function statusLines(runtime) {
269
276
  const snapshot = inspectCompletionDeliverySettings();
270
277
  return formatStatus(runtime.getRuntimeStatus(), snapshot, runtime).split("\n");
271
278
  }
272
- function helpLines(runtime) {
273
- const snapshot = inspectCompletionDeliverySettings();
274
- const cwdPolicy = inspectCwdPolicySettings();
275
- const parallelLimit = inspectBlockingParallelLimitSettings();
276
- const detachedLimits = inspectStatefulLimitSettings();
277
- const transport = inspectStatefulTransportSettings();
279
+ function helpLines(_runtime) {
278
280
  return [
279
- "/subagents \u2014 choose delegation workflow, manage current agents, and configure agent tools",
280
- "/subagents settings \u2014 configure target locations, trusted resources, and async completion",
281
- "/subagents status \u2014 show current-session and user-setting values",
282
- "/subagents help \u2014 show this help",
283
- "Target policies control startup directories and resources, not filesystem access or sandboxing.",
284
- "Manage saved folder trust with Pi /trust and restart Pi after changing it.",
285
- `Runtime consultation target: ${consultationCwdLabel(runtime.getConsultationCwdPolicy())}`,
286
- `Configured consultation target: ${consultationCwdLabel(cwdPolicy.consultation.value)} (${cwdPolicy.consultation.source})`,
287
- `Runtime delegation target: ${delegationCwdLabel(runtime.getDelegationCwdPolicy())}`,
288
- `Configured delegation target: ${delegationCwdLabel(cwdPolicy.delegation.value)} (${cwdPolicy.delegation.source})`,
289
- `Maximum parallel workers: ${runtime.getMaxParallelTasks()} per blocking call`,
290
- `Configured parallel limit: ${parallelLimit.value} (${parallelLimit.source})`,
291
- `Detached limits: ${formatDetachedLimitSummary(runtime.getRuntimeStatus())}`,
292
- `Configured transport: ${transport.value} (${transport.source})`,
293
- ...detachedLimits.values ? [`Configured detached limits: ${formatConfiguredDetachedLimits(detachedLimits.values)}`] : ["Configured detached limits: unavailable; repair user settings"],
294
- "Detached limits and transport apply after /reload; clear retained agents first if their work must not be interrupted.",
295
- `User settings: ${safeTerminalLine(snapshot.path)}`
281
+ "Start here",
282
+ " 1. Open How subagents run.",
283
+ " 2. Choose the workflow that matches the tools and blocking behavior you need.",
284
+ " 3. Open Completion and privacy if Pi must use background results in the current answer.",
285
+ "The blocking subagent tool is deprecated and remains available only in compatibility workflows.",
286
+ "subagent_consult and subagent_await remain supported.",
287
+ "Current subagents shows work in progress and subagents saved for follow-up.",
288
+ "Settings",
289
+ " Folders and trusted resources \u2014 choose where subagents start and what consultations load.",
290
+ " Completion and privacy \u2014 choose what Pi does when work finishes and whether usage is recorded.",
291
+ " Agent defaults \u2014 choose tools, model, thinking effort, and time limit for each subagent.",
292
+ " Advanced runtime settings \u2014 optional transport and capacity controls.",
293
+ "Changes are saved immediately.",
294
+ "Transport and background-agent limits apply after /reload.",
295
+ "Commands",
296
+ " /subagents \u2014 open the manager",
297
+ " /subagents settings \u2014 open Settings",
298
+ " /subagents status \u2014 show detailed diagnostics",
299
+ " /subagents help \u2014 show this help",
300
+ "Safety",
301
+ "Folder choices control starting locations and loaded resources; they do not sandbox files, commands, or network access.",
302
+ "Manage saved folder trust with Pi /trust, then restart Pi."
296
303
  ];
297
304
  }
298
305
  function formatManagerSummary(runtime, status, configured) {
299
306
  const current = currentWorkflow(runtime, status);
300
- const cwdPolicy = inspectCwdPolicySettings();
301
- const consult = inspectConsultResourceSettings();
302
307
  const detachedLimits = inspectStatefulLimitSettings();
303
- const transport = inspectStatefulTransportSettings();
304
308
  const detachedDivergence = detachedLimits.values ? formatConfiguredDetachedLimitDivergence(status, detachedLimits.values) : void 0;
305
309
  return [
306
- `Delegation: ${workflowLabel(current)}`,
307
- `Completion: ${completionLabel(status.completionDelivery)}`,
308
- `Consult target: ${consultationCwdLabel(runtime.getConsultationCwdPolicy())}`,
309
- `Delegation target: ${delegationCwdLabel(runtime.getDelegationCwdPolicy())}`,
310
- `Consult resources: ${consultResourceLabel(runtime.getConsultResourcePolicy())}`,
311
- `Parallel workers: max ${runtime.getMaxParallelTasks()} per blocking call`,
312
- `Detached limits: ${formatDetachedLimitSummary(status)}`,
313
- `Transport: ${status.transport}`,
314
- `Configured transport: ${transport.value} \xB7 ${transport.source}`,
315
- `Configured consult target: ${consultationCwdLabel(cwdPolicy.consultation.value)} \xB7 ${cwdPolicy.consultation.source}`,
316
- `Configured delegation target: ${delegationCwdLabel(cwdPolicy.delegation.value)} \xB7 ${cwdPolicy.delegation.source}`,
317
- `Configured consult resources: ${consultResourceLabel(consult.value)} \xB7 ${consult.source}`,
318
- `Settings: ${safeTerminalLine(cwdPolicy.path)}`,
319
- `Agents: ${status.activeAgents} active \xB7 ${status.retainedAgents} retained`,
320
- ...detachedDivergence ? [detachedDivergence] : [],
310
+ `How subagents run: ${workflowLabel(current)}`,
311
+ `Subagents: ${status.activeAgents} working \xB7 ${status.retainedAgents} saved for follow-up`,
312
+ `When work finishes: ${completionLabel(status.completionDelivery)}`,
321
313
  ...configured.value !== current ? [`Configured after reload: ${workflowLabel(configured.value)}`] : [],
322
- ...configured.error || detachedLimits.error ? ["Settings need repair; open Advanced settings for details."] : []
314
+ ...detachedDivergence ? [detachedDivergence] : [],
315
+ ...configured.error || detachedLimits.error ? ["Action needed: Repair user settings. Open Diagnostics for details."] : []
323
316
  ].join("\n");
324
317
  }
325
318
  function formatStatus(status, snapshot, runtime) {
@@ -329,27 +322,33 @@ function formatStatus(status, snapshot, runtime) {
329
322
  const parallelLimit = inspectBlockingParallelLimitSettings();
330
323
  const detachedLimits = inspectStatefulLimitSettings();
331
324
  const transport = inspectStatefulTransportSettings();
325
+ const usageRecording = inspectUsageRecordingSettings();
332
326
  const current = runtime ? currentWorkflow(runtime, status) : configuredWorkflow.value;
327
+ const usageStatus = runtime?.getUsageRecordingStatus?.();
333
328
  return [
334
- "Current session",
335
- ` Delegation: ${workflowLabel(current)}`,
336
- ` Async runtime: ${status.initialized ? "initialized" : status.enabled ? "not initialized" : "disabled"}`,
329
+ "Current Session",
330
+ ` How subagents run: ${workflowLabel(current)}`,
331
+ ` Background runtime: ${status.initialized ? "initialized" : status.enabled ? "not initialized" : "disabled"}`,
337
332
  ` Transport: ${status.transport}`,
338
333
  ` Configured transport: ${transport.value} (${transport.source})`,
339
- ` Completion: ${completionLabel(status.completionDelivery)}`,
340
- ` Consultation target: ${consultationCwdLabel(runtime?.getConsultationCwdPolicy() ?? cwdPolicy.consultation.value)}`,
341
- ` Delegation target: ${delegationCwdLabel(runtime?.getDelegationCwdPolicy() ?? cwdPolicy.delegation.value)}`,
342
- ` Consultation resources: ${consultResourceLabel(runtime?.getConsultResourcePolicy() ?? consult.value)}`,
343
- ` Maximum parallel workers: ${runtime?.getMaxParallelTasks() ?? parallelLimit.value} per blocking call`,
344
- ` Detached limits: ${formatDetachedLimitSummary(status)}`,
345
- ` Agents: ${status.activeAgents} active, ${status.retainedAgents} retained`,
346
- "User settings",
347
- ` Delegation source: ${configuredWorkflow.source}`,
348
- ` Configured delegation: ${workflowLabel(configuredWorkflow.value)}`,
334
+ ` When work finishes: ${completionLabel(status.completionDelivery)}`,
335
+ ` Read-only consultation folders: ${consultationCwdLabel(runtime?.getConsultationCwdPolicy() ?? cwdPolicy.consultation.value)}`,
336
+ ` Subagent folders: ${delegationCwdLabel(runtime?.getDelegationCwdPolicy() ?? cwdPolicy.delegation.value)}`,
337
+ ` Read-only consultation resources: ${consultResourceLabel(runtime?.getConsultResourcePolicy() ?? consult.value)}`,
338
+ ` Blocking worker limit: ${runtime?.getMaxParallelTasks() ?? parallelLimit.value} per request`,
339
+ ` Background-agent limits: ${formatDetachedLimitSummary(status)}`,
340
+ ` Subagents: ${status.activeAgents} working, ${status.retainedAgents} saved for follow-up`,
341
+ ` Local usage recording: ${usageStatus?.enabled ? "enabled" : "disabled"}`,
342
+ ` Recorded events this session: ${usageStatus?.recordedEvents ?? 0}`,
343
+ ` Usage retention: ${usageStatus?.retentionDays ?? USAGE_RECORDING_RETENTION_DAYS} days`,
344
+ ` Usage path: ${safeTerminalLine(usageStatus?.path ?? "unavailable")}`,
345
+ "User Settings",
346
+ ` Workflow source: ${configuredWorkflow.source}`,
347
+ ` Configured workflow: ${workflowLabel(configuredWorkflow.value)}`,
349
348
  ` Completion source: ${snapshot.source}`,
350
349
  ` Configured completion: ${completionLabel(snapshot.value)}`,
351
- ` Configured parallel limit: ${parallelLimit.value}`,
352
- ` Parallel limit source: ${parallelLimit.source}`,
350
+ ` Configured blocking worker limit: ${parallelLimit.value}`,
351
+ ` Blocking worker limit source: ${parallelLimit.source}`,
353
352
  ...detachedLimits.values ? STATEFUL_LIMIT_DEFINITIONS.map((definition) => {
354
353
  const configured = detachedLimits.values?.[definition.field];
355
354
  return ` Configured ${definition.label.toLowerCase()}: ${configured?.value} (${configured?.source})`;
@@ -360,9 +359,11 @@ function formatStatus(status, snapshot, runtime) {
360
359
  ` Delegation target source: ${cwdPolicy.delegation.source}`,
361
360
  ` Configured consultation resources: ${consultResourceLabel(consult.value)}`,
362
361
  ` Consultation resource source: ${consult.source}`,
362
+ ` Configured usage recording: ${usageRecording.enabled ? "enabled" : "disabled"}`,
363
+ ` Usage recording source: ${usageRecording.source}`,
363
364
  ` Path: ${safeTerminalLine(snapshot.path)}`,
364
- configuredWorkflow.error || snapshot.error || cwdPolicy.error || parallelLimit.error || detachedLimits.error || transport.error ? ` Warning: ${safeTerminalLine(configuredWorkflow.error ?? snapshot.error ?? cwdPolicy.error ?? parallelLimit.error ?? detachedLimits.error ?? transport.error ?? "invalid settings")}` : " Warning: none",
365
- configuredWorkflow.value !== current ? "Configured delegation differs from this session. Run /reload to apply it." : "Manual file changes require /reload."
365
+ configuredWorkflow.error || snapshot.error || cwdPolicy.error || parallelLimit.error || detachedLimits.error || transport.error || usageRecording.error ? ` Warning: ${safeTerminalLine(configuredWorkflow.error ?? snapshot.error ?? cwdPolicy.error ?? parallelLimit.error ?? detachedLimits.error ?? transport.error ?? usageRecording.error ?? "invalid settings")}` : " Warning: none",
366
+ configuredWorkflow.value !== current ? "The configured workflow differs from this session. Run /reload to apply it." : "Manual file changes require /reload."
366
367
  ].join("\n");
367
368
  }
368
369
  function currentWorkflow(runtime, status) {
@@ -373,19 +374,19 @@ function currentWorkflow(runtime, status) {
373
374
  return "disabled";
374
375
  }
375
376
  function completionLabel(value) {
376
- return value === "auto-resume" ? "Resume automatically when finished" : "Wait until my next turn";
377
+ return value === "auto-resume" ? "Continue automatically when work finishes" : "Wait for my next message";
377
378
  }
378
379
  function consultationCwdLabel(value) {
379
- return value === "current-workspace" ? "Current workspace only" : "Anywhere \xB7 untrusted targets inherit nothing";
380
+ return value === "current-workspace" ? "This workspace only" : "Any folder \xB7 no project resources when untrusted";
380
381
  }
381
382
  function delegationCwdLabel(value) {
382
383
  switch (value) {
383
384
  case "trusted-targets":
384
- return "Current or saved-trusted folders";
385
+ return "This workspace or saved-trusted folders";
385
386
  case "current-workspace":
386
- return "Current workspace only";
387
+ return "This workspace only";
387
388
  case "anywhere":
388
- return "Anywhere \xB7 normal Pi permissions";
389
+ return "Any folder Pi can access";
389
390
  }
390
391
  }
391
392
  function consultResourceLabel(value) {
@@ -393,7 +394,7 @@ function consultResourceLabel(value) {
393
394
  case "project-context":
394
395
  return "Project context only";
395
396
  case "none":
396
- return "No inherited resources";
397
+ return "No project resources";
397
398
  case "all":
398
399
  return "All trusted resources";
399
400
  }
@@ -418,4 +419,4 @@ export {
418
419
  delegationCwdLabel,
419
420
  consultResourceLabel
420
421
  };
421
- //# sourceMappingURL=chunk-EFBPISNT.ts.map
422
+ //# sourceMappingURL=chunk-PBZMBTNJ.ts.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/stateful-limit-ui.ts", "../../src/workflow-ui.ts", "../../src/config-status.ts"],
4
+ "sourcesContent": ["import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { projectAgentRecords } from \"./agent-projection.js\";\nimport type { ManagedAgent } from \"./registry.js\";\nimport { safeTerminalLine as safeTerminalText } from \"./safe-text.js\";\nimport { inspectStatefulLimitSettings, updateStatefulLimitSetting } from \"./settings.js\";\nimport type { StatefulSubagentRuntimeStatus } from \"./stateful.js\";\nimport {\n\tisValidStatefulLimit,\n\tresolveStatefulLimits,\n\tSTATEFUL_LIMIT_DEFINITIONS,\n\ttype StatefulLimitField,\n\ttype StatefulLimits,\n\tstatefulLimitDefinition,\n} from \"./stateful-limits.js\";\n\nexport interface StatefulLimitRuntime {\n\tgetRuntimeStatus(): StatefulSubagentRuntimeStatus;\n\tlistAgents(includeClosed?: boolean): ManagedAgent[];\n}\n\nexport interface StatefulLimitApplyOptions {\n\tsignal: AbortSignal;\n\tisCurrent(): boolean;\n}\n\nexport function statefulLimitListScreen(runtime: StatefulLimitRuntime) {\n\tconst inspected = inspectStatefulLimitSettings();\n\tconst current = runtime.getRuntimeStatus().limits;\n\treturn {\n\t\tkind: \"actions\" as const,\n\t\ttitle: \"Background Agent Limits\",\n\t\tlines: [\n\t\t\t\"These advanced limits apply after /reload or the next Pi session.\",\n\t\t\t\"Reloading can interrupt subagents saved for follow-up.\",\n\t\t\t...(inspected.error\n\t\t\t\t? [\n\t\t\t\t\t\t`Settings cannot be edited: ${safeTerminalText(inspected.error)}`,\n\t\t\t\t\t\t`Repair ${safeTerminalText(inspected.path)} and retry.`,\n\t\t\t\t\t]\n\t\t\t\t: []),\n\t\t],\n\t\titems: [\n\t\t\t...(inspected.values\n\t\t\t\t? STATEFUL_LIMIT_DEFINITIONS.map((definition) => {\n\t\t\t\t\t\tconst configured = inspected.values?.[definition.field];\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: definition.field,\n\t\t\t\t\t\t\tlabel: definition.label,\n\t\t\t\t\t\t\tdescription: `Current: ${current[definition.field]} \u00B7 after reload: ${configured?.value ?? \"unavailable\"} (${configured?.source ?? \"unknown\"})`,\n\t\t\t\t\t\t\taction: \"pick-stateful-limit\" as const,\n\t\t\t\t\t\t};\n\t\t\t\t\t})\n\t\t\t\t: []),\n\t\t\t{ id: \"back\", label: \"Back\", action: \"back\" as const },\n\t\t],\n\t\thint: \"back\" as const,\n\t};\n}\n\nexport function statefulLimitInputScreen(field: StatefulLimitField, runtime: StatefulLimitRuntime) {\n\tconst definition = statefulLimitDefinition(field);\n\tconst inspected = inspectStatefulLimitSettings();\n\tconst configured = inspected.values?.[field];\n\treturn {\n\t\tkind: \"input\" as const,\n\t\ttitle: definition.label,\n\t\tlines: [\n\t\t\tdefinition.description,\n\t\t\t`Current session: ${runtime.getRuntimeStatus().limits[field]}`,\n\t\t\t`After reload: ${configured?.value ?? \"unavailable\"} (${configured?.source ?? \"unknown\"})`,\n\t\t\t`Allowed: whole numbers ${definition.minimum === 0 ? \"0 or greater\" : \"1 or greater\"}`,\n\t\t\t`Read from: ${safeTerminalText(inspected.path)}`,\n\t\t\t...(inspected.writePath !== inspected.path\n\t\t\t\t? [`Saves to: ${safeTerminalText(inspected.writePath)}`]\n\t\t\t\t: []),\n\t\t],\n\t\tplaceholder: \"Enter a whole number\",\n\t\taction: \"set-stateful-limit\" as const,\n\t\thint: \"back\" as const,\n\t};\n}\n\nexport async function applyStatefulLimitSetting(\n\tfield: StatefulLimitField,\n\tvalue: string | undefined,\n\tctx: ExtensionCommandContext,\n\truntime: StatefulLimitRuntime,\n\toptions: StatefulLimitApplyOptions,\n) {\n\tconst next = parseStatefulLimit(field, value);\n\tif (next === undefined) {\n\t\tnotifyValidationError(field, ctx);\n\t\treturn { kind: \"rejected\" as const };\n\t}\n\tconst inspected = inspectStatefulLimitSettings();\n\tif (inspected.error || !inspected.values) {\n\t\tif (options.isCurrent() && !options.signal.aborted) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Subagent settings cannot be edited: ${safeTerminalText(inspected.error ?? \"settings are unavailable\")}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t}\n\t\treturn { kind: \"rejected\" as const };\n\t}\n\tconst expected = configuredValues(inspected.values);\n\tif (next === expected[field]) return { kind: \"back\" as const };\n\n\tconst beforeAgents = runtime.listAgents();\n\tconst affectedBefore = projectedRemovedAgentIds(beforeAgents, expected, {\n\t\t...expected,\n\t\t[field]: next,\n\t});\n\tif (affectedBefore.length > 0) {\n\t\tconst confirmed = await ctx.ui.confirm(\n\t\t\t`Lower ${statefulLimitDefinition(field).label}?`,\n\t\t\t[\n\t\t\t\t`After reload, this value could exclude ${affectedBefore.length} saved subagent record${affectedBefore.length === 1 ? \"\" : \"s\"} from recovery.`,\n\t\t\t\t\"No subagent is removed now, and this menu will not reload Pi.\",\n\t\t\t\t\"A later state save can make excluded records unavailable for recovery.\",\n\t\t\t].join(\"\\n\\n\"),\n\t\t\t{ signal: options.signal },\n\t\t);\n\t\tif (options.signal.aborted || !options.isCurrent()) return { kind: \"close\" as const };\n\t\tif (!confirmed) return { kind: \"rejected\" as const };\n\t\tconst affectedAfter = projectedRemovedAgentIds(runtime.listAgents(), expected, {\n\t\t\t...expected,\n\t\t\t[field]: next,\n\t\t});\n\t\tif (!sameIds(affectedBefore, affectedAfter)) {\n\t\t\tctx.ui.notify(\n\t\t\t\t\"Current subagents changed while confirming; review the limit again.\",\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t\treturn { kind: \"rejected\" as const };\n\t\t}\n\t}\n\n\tif (options.signal.aborted || !options.isCurrent()) return { kind: \"close\" as const };\n\ttry {\n\t\tupdateStatefulLimitSetting(field, next, expected);\n\t} catch (error) {\n\t\tif (options.isCurrent() && !options.signal.aborted) {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Background-agent limit was not saved; the previous setting is unchanged: ${formatError(error)}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t}\n\t\treturn { kind: \"rejected\" as const };\n\t}\n\tif (options.signal.aborted || !options.isCurrent()) return { kind: \"close\" as const };\n\tctx.ui.notify(\n\t\t`Saved ${statefulLimitDefinition(field).label.toLowerCase()}: ${next}. Applies after /reload; clear current subagents first if their work must not be interrupted.`,\n\t\t\"info\",\n\t);\n\treturn { kind: \"back\" as const };\n}\n\nexport function formatDetachedLimitSummary(status: StatefulSubagentRuntimeStatus): string {\n\treturn [\n\t\t`${status.limits.maxAgents} saved`,\n\t\t`${status.limits.maxActiveTurns} working at once`,\n\t\t`${status.limits.maxChildrenPerAgent} children each`,\n\t\t`${status.limits.maxDepth} nested levels`,\n\t\t`${status.limits.maxStoredAgents} stored records`,\n\t].join(\" \u00B7 \");\n}\n\nexport function formatConfiguredDetachedLimitDivergence(\n\tstatus: StatefulSubagentRuntimeStatus,\n\tvalues: NonNullable<ReturnType<typeof inspectStatefulLimitSettings>[\"values\"]>,\n): string | undefined {\n\tconst changed = STATEFUL_LIMIT_DEFINITIONS.flatMap((definition) => {\n\t\tconst configured = values[definition.field].value;\n\t\treturn configured === status.limits[definition.field]\n\t\t\t? []\n\t\t\t: [`${definition.label.toLowerCase()} ${configured}`];\n\t});\n\treturn changed.length > 0 ? `After /reload: ${changed.join(\" \u00B7 \")}` : undefined;\n}\n\nexport function formatConfiguredDetachedLimits(\n\tvalues: NonNullable<ReturnType<typeof inspectStatefulLimitSettings>[\"values\"]>,\n): string {\n\treturn STATEFUL_LIMIT_DEFINITIONS.map((definition) => {\n\t\tconst snapshot = values[definition.field];\n\t\treturn `${definition.label.toLowerCase()} ${snapshot.value} (${snapshot.source})`;\n\t}).join(\" \u00B7 \");\n}\n\nexport function formatEmptyStatefulRuntime(status: StatefulSubagentRuntimeStatus): string {\n\tif (!status.enabled) return \"Background subagents are disabled in How subagents run.\";\n\tif (!status.initialized) return \"Background subagents have not started in this session.\";\n\treturn \"No subagents are working or saved for follow-up in this session.\";\n}\n\nfunction parseStatefulLimit(\n\tfield: StatefulLimitField,\n\tvalue: string | undefined,\n): number | undefined {\n\tconst normalized = value?.trim() ?? \"\";\n\tif (!/^\\d+$/u.test(normalized)) return undefined;\n\tconst parsed = Number(normalized);\n\treturn isValidStatefulLimit(field, parsed) ? parsed : undefined;\n}\n\nfunction notifyValidationError(field: StatefulLimitField, ctx: ExtensionCommandContext): void {\n\tconst definition = statefulLimitDefinition(field);\n\tctx.ui.notify(\n\t\t`${definition.label} must be a safe whole number ${definition.minimum === 0 ? \"0 or greater\" : \"1 or greater\"}.`,\n\t\t\"warning\",\n\t);\n}\n\nfunction configuredValues(\n\tvalues: NonNullable<ReturnType<typeof inspectStatefulLimitSettings>[\"values\"]>,\n): StatefulLimits {\n\treturn resolveStatefulLimits(\n\t\tObject.fromEntries(Object.entries(values).map(([field, snapshot]) => [field, snapshot.value])),\n\t);\n}\n\nfunction projectedRemovedAgentIds(\n\tagents: readonly ManagedAgent[],\n\tcurrent: StatefulLimits,\n\tnext: StatefulLimits,\n): string[] {\n\tconst restorable = agents.filter(\n\t\t(agent) => agent.state !== \"closed\" && agent.workspaceMode !== \"worktree\",\n\t);\n\tconst before = projectForReload(restorable, current);\n\tconst afterIds = new Set(projectForReload(restorable, next).map((agent) => agent.id));\n\treturn before.filter((agent) => !afterIds.has(agent.id)).map((agent) => agent.id);\n}\n\nfunction projectForReload(agents: readonly ManagedAgent[], limits: StatefulLimits): ManagedAgent[] {\n\tconst stored = projectAgentRecords(agents, { maxAgents: limits.maxStoredAgents });\n\treturn projectAgentRecords(stored, {\n\t\tmaxAgents: limits.maxAgents,\n\t\tmaxDepth: limits.maxDepth,\n\t});\n}\n\nfunction sameIds(left: readonly string[], right: readonly string[]): boolean {\n\treturn left.length === right.length && left.every((id, index) => id === right[index]);\n}\n\nfunction formatError(error: unknown): string {\n\treturn safeTerminalText(error instanceof Error ? error.message : String(error));\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { DelegationWorkflow } from \"./settings/inspection.js\";\n\nexport async function showWorkflowPreview(\n\tctx: ExtensionCommandContext,\n\tcurrent: DelegationWorkflow,\n\tnext: DelegationWorkflow,\n\trequiresReload: boolean,\n\tsignal: AbortSignal,\n): Promise<boolean> {\n\tconst changes = workflowEffects(current, next);\n\treturn ctx.ui.confirm(\n\t\trequiresReload ? \"Save how subagents run and reload?\" : \"Save how subagents run?\",\n\t\t[\n\t\t\t`Current: ${workflowLabel(current)}`,\n\t\t\t`New: ${workflowLabel(next)}`,\n\t\t\t\"\",\n\t\t\t\"Effect:\",\n\t\t\t...(changes.length > 0 ? changes : [\"Keep the current registered tools\"]).map(\n\t\t\t\t(effect) => `- ${effect}`,\n\t\t\t),\n\t\t\t`- ${requiresReload ? \"Reload the extension to apply this tool surface\" : \"No reload is needed because the active tools already match\"}`,\n\t\t].join(\"\\n\"),\n\t\t{ signal },\n\t);\n}\n\nexport function workflowLabel(value: DelegationWorkflow): string {\n\tswitch (value) {\n\t\tcase \"all\":\n\t\t\treturn \"Background plus compatibility methods (async + sync)\";\n\t\tcase \"async-only\":\n\t\t\treturn \"Keep Pi available (async)\";\n\t\tcase \"blocking-only\":\n\t\t\treturn \"Compatibility blocking methods (sync)\";\n\t\tcase \"disabled\":\n\t\t\treturn \"Subagents disabled\";\n\t}\n}\n\nfunction workflowEffects(current: DelegationWorkflow, next: DelegationWorkflow): string[] {\n\tconst blockingEnabled = (value: DelegationWorkflow) =>\n\t\tvalue === \"all\" || value === \"blocking-only\";\n\tconst asyncEnabled = (value: DelegationWorkflow) => value === \"all\" || value === \"async-only\";\n\tconst awaitEnabled = (value: DelegationWorkflow) => blockingEnabled(value) && asyncEnabled(value);\n\tconst effects: string[] = [];\n\tif (blockingEnabled(current) !== blockingEnabled(next)) {\n\t\teffects.push(\n\t\t\tblockingEnabled(next)\n\t\t\t\t? \"Allow deprecated blocking `subagent` and supported read-only `subagent_consult`\"\n\t\t\t\t: \"Remove deprecated blocking `subagent` and supported read-only `subagent_consult`\",\n\t\t);\n\t}\n\tif (asyncEnabled(current) !== asyncEnabled(next)) {\n\t\teffects.push(\n\t\t\tasyncEnabled(next)\n\t\t\t\t? \"Allow background tools: `subagent_spawn`, `subagent_send`, `subagent_manage`, and `subagent_mailbox`\"\n\t\t\t\t: \"Remove background tools: `subagent_spawn`, `subagent_send`, `subagent_manage`, and `subagent_mailbox`\",\n\t\t);\n\t}\n\tif (awaitEnabled(current) !== awaitEnabled(next)) {\n\t\teffects.push(\n\t\t\tawaitEnabled(next)\n\t\t\t\t? \"Allow the blocking retained-agent join: `subagent_await`\"\n\t\t\t\t: \"Remove the blocking retained-agent join: `subagent_await`\",\n\t\t);\n\t}\n\treturn effects;\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type {\n\tCompletionDelivery,\n\tConsultationCwdPolicy,\n\tConsultResourcePolicy,\n\tDelegationCwdPolicy,\n} from \"./agents/types.js\";\nimport type { SubagentSettingsRuntime } from \"./config-ui.js\";\nimport { safeTerminalLine as safeTerminalText } from \"./safe-text.js\";\nimport type { DelegationWorkflow } from \"./settings/inspection.js\";\nimport {\n\tinspectBlockingParallelLimitSettings,\n\tinspectCompletionDeliverySettings,\n\tinspectConsultResourceSettings,\n\tinspectCwdPolicySettings,\n\tinspectDelegationWorkflowSettings,\n\tinspectStatefulLimitSettings,\n\tinspectStatefulTransportSettings,\n\tinspectUsageRecordingSettings,\n} from \"./settings.js\";\nimport type { StatefulSubagentRuntimeStatus } from \"./stateful.js\";\nimport {\n\tformatConfiguredDetachedLimitDivergence,\n\tformatDetachedLimitSummary,\n} from \"./stateful-limit-ui.js\";\nimport { STATEFUL_LIMIT_DEFINITIONS } from \"./stateful-limits.js\";\nimport { USAGE_RECORDING_RETENTION_DAYS } from \"./usage-recording-config.js\";\nimport { workflowLabel } from \"./workflow-ui.js\";\n\nexport function showSubagentStatus(\n\tctx: ExtensionCommandContext,\n\truntime: SubagentSettingsRuntime,\n): void {\n\tif (ctx.mode !== \"tui\" && !ctx.hasUI) return;\n\tconst snapshot = inspectCompletionDeliverySettings();\n\tctx.ui.notify(\n\t\tformatStatus(runtime.getRuntimeStatus(), snapshot, runtime),\n\t\tsnapshot.error ? \"warning\" : \"info\",\n\t);\n}\n\nexport function showSubagentHelp(\n\tctx: ExtensionCommandContext,\n\truntime: SubagentSettingsRuntime,\n): void {\n\tif (ctx.mode !== \"tui\" && !ctx.hasUI) return;\n\tctx.ui.notify(helpLines(runtime).join(\"\\n\"), \"info\");\n}\n\nexport function statusLines(runtime: SubagentSettingsRuntime): string[] {\n\tconst snapshot = inspectCompletionDeliverySettings();\n\treturn formatStatus(runtime.getRuntimeStatus(), snapshot, runtime).split(\"\\n\");\n}\n\nexport function helpLines(_runtime: SubagentSettingsRuntime): string[] {\n\treturn [\n\t\t\"Start here\",\n\t\t\" 1. Open How subagents run.\",\n\t\t\" 2. Choose the workflow that matches the tools and blocking behavior you need.\",\n\t\t\" 3. Open Completion and privacy if Pi must use background results in the current answer.\",\n\t\t\"The blocking subagent tool is deprecated and remains available only in compatibility workflows.\",\n\t\t\"subagent_consult and subagent_await remain supported.\",\n\t\t\"Current subagents shows work in progress and subagents saved for follow-up.\",\n\t\t\"Settings\",\n\t\t\" Folders and trusted resources \u2014 choose where subagents start and what consultations load.\",\n\t\t\" Completion and privacy \u2014 choose what Pi does when work finishes and whether usage is recorded.\",\n\t\t\" Agent defaults \u2014 choose tools, model, thinking effort, and time limit for each subagent.\",\n\t\t\" Advanced runtime settings \u2014 optional transport and capacity controls.\",\n\t\t\"Changes are saved immediately.\",\n\t\t\"Transport and background-agent limits apply after /reload.\",\n\t\t\"Commands\",\n\t\t\" /subagents \u2014 open the manager\",\n\t\t\" /subagents settings \u2014 open Settings\",\n\t\t\" /subagents status \u2014 show detailed diagnostics\",\n\t\t\" /subagents help \u2014 show this help\",\n\t\t\"Safety\",\n\t\t\"Folder choices control starting locations and loaded resources; they do not sandbox files, commands, or network access.\",\n\t\t\"Manage saved folder trust with Pi /trust, then restart Pi.\",\n\t];\n}\n\nexport function formatManagerSummary(\n\truntime: SubagentSettingsRuntime,\n\tstatus: StatefulSubagentRuntimeStatus,\n\tconfigured: ReturnType<typeof inspectDelegationWorkflowSettings>,\n): string {\n\tconst current = currentWorkflow(runtime, status);\n\tconst detachedLimits = inspectStatefulLimitSettings();\n\tconst detachedDivergence = detachedLimits.values\n\t\t? formatConfiguredDetachedLimitDivergence(status, detachedLimits.values)\n\t\t: undefined;\n\treturn [\n\t\t`How subagents run: ${workflowLabel(current)}`,\n\t\t`Subagents: ${status.activeAgents} working \u00B7 ${status.retainedAgents} saved for follow-up`,\n\t\t`When work finishes: ${completionLabel(status.completionDelivery)}`,\n\t\t...(configured.value !== current\n\t\t\t? [`Configured after reload: ${workflowLabel(configured.value)}`]\n\t\t\t: []),\n\t\t...(detachedDivergence ? [detachedDivergence] : []),\n\t\t...(configured.error || detachedLimits.error\n\t\t\t? [\"Action needed: Repair user settings. Open Diagnostics for details.\"]\n\t\t\t: []),\n\t].join(\"\\n\");\n}\n\nfunction formatStatus(\n\tstatus: StatefulSubagentRuntimeStatus,\n\tsnapshot: ReturnType<typeof inspectCompletionDeliverySettings>,\n\truntime?: SubagentSettingsRuntime,\n): string {\n\tconst configuredWorkflow = inspectDelegationWorkflowSettings();\n\tconst consult = inspectConsultResourceSettings();\n\tconst cwdPolicy = inspectCwdPolicySettings();\n\tconst parallelLimit = inspectBlockingParallelLimitSettings();\n\tconst detachedLimits = inspectStatefulLimitSettings();\n\tconst transport = inspectStatefulTransportSettings();\n\tconst usageRecording = inspectUsageRecordingSettings();\n\tconst current = runtime ? currentWorkflow(runtime, status) : configuredWorkflow.value;\n\tconst usageStatus = runtime?.getUsageRecordingStatus?.();\n\treturn [\n\t\t\"Current Session\",\n\t\t` How subagents run: ${workflowLabel(current)}`,\n\t\t` Background runtime: ${status.initialized ? \"initialized\" : status.enabled ? \"not initialized\" : \"disabled\"}`,\n\t\t` Transport: ${status.transport}`,\n\t\t` Configured transport: ${transport.value} (${transport.source})`,\n\t\t` When work finishes: ${completionLabel(status.completionDelivery)}`,\n\t\t` Read-only consultation folders: ${consultationCwdLabel(runtime?.getConsultationCwdPolicy() ?? cwdPolicy.consultation.value)}`,\n\t\t` Subagent folders: ${delegationCwdLabel(runtime?.getDelegationCwdPolicy() ?? cwdPolicy.delegation.value)}`,\n\t\t` Read-only consultation resources: ${consultResourceLabel(runtime?.getConsultResourcePolicy() ?? consult.value)}`,\n\t\t` Blocking worker limit: ${runtime?.getMaxParallelTasks() ?? parallelLimit.value} per request`,\n\t\t` Background-agent limits: ${formatDetachedLimitSummary(status)}`,\n\t\t` Subagents: ${status.activeAgents} working, ${status.retainedAgents} saved for follow-up`,\n\t\t` Local usage recording: ${usageStatus?.enabled ? \"enabled\" : \"disabled\"}`,\n\t\t` Recorded events this session: ${usageStatus?.recordedEvents ?? 0}`,\n\t\t` Usage retention: ${usageStatus?.retentionDays ?? USAGE_RECORDING_RETENTION_DAYS} days`,\n\t\t` Usage path: ${safeTerminalText(usageStatus?.path ?? \"unavailable\")}`,\n\t\t\"User Settings\",\n\t\t` Workflow source: ${configuredWorkflow.source}`,\n\t\t` Configured workflow: ${workflowLabel(configuredWorkflow.value)}`,\n\t\t` Completion source: ${snapshot.source}`,\n\t\t` Configured completion: ${completionLabel(snapshot.value)}`,\n\t\t` Configured blocking worker limit: ${parallelLimit.value}`,\n\t\t` Blocking worker limit source: ${parallelLimit.source}`,\n\t\t...(detachedLimits.values\n\t\t\t? STATEFUL_LIMIT_DEFINITIONS.map((definition) => {\n\t\t\t\t\tconst configured = detachedLimits.values?.[definition.field];\n\t\t\t\t\treturn ` Configured ${definition.label.toLowerCase()}: ${configured?.value} (${configured?.source})`;\n\t\t\t\t})\n\t\t\t: [\" Configured detached limits: unavailable\"]),\n\t\t` Configured consultation target: ${consultationCwdLabel(cwdPolicy.consultation.value)}`,\n\t\t` Consultation target source: ${cwdPolicy.consultation.source}`,\n\t\t` Configured delegation target: ${delegationCwdLabel(cwdPolicy.delegation.value)}`,\n\t\t` Delegation target source: ${cwdPolicy.delegation.source}`,\n\t\t` Configured consultation resources: ${consultResourceLabel(consult.value)}`,\n\t\t` Consultation resource source: ${consult.source}`,\n\t\t` Configured usage recording: ${usageRecording.enabled ? \"enabled\" : \"disabled\"}`,\n\t\t` Usage recording source: ${usageRecording.source}`,\n\t\t` Path: ${safeTerminalText(snapshot.path)}`,\n\t\tconfiguredWorkflow.error ||\n\t\tsnapshot.error ||\n\t\tcwdPolicy.error ||\n\t\tparallelLimit.error ||\n\t\tdetachedLimits.error ||\n\t\ttransport.error ||\n\t\tusageRecording.error\n\t\t\t? ` Warning: ${safeTerminalText(configuredWorkflow.error ?? snapshot.error ?? cwdPolicy.error ?? parallelLimit.error ?? detachedLimits.error ?? transport.error ?? usageRecording.error ?? \"invalid settings\")}`\n\t\t\t: \" Warning: none\",\n\t\tconfiguredWorkflow.value !== current\n\t\t\t? \"The configured workflow differs from this session. Run /reload to apply it.\"\n\t\t\t: \"Manual file changes require /reload.\",\n\t].join(\"\\n\");\n}\n\nexport function currentWorkflow(\n\truntime: SubagentSettingsRuntime,\n\tstatus: StatefulSubagentRuntimeStatus,\n): DelegationWorkflow {\n\tconst blocking = runtime.getBlockingEnabled();\n\tif (blocking && status.enabled) return \"all\";\n\tif (status.enabled) return \"async-only\";\n\tif (blocking) return \"blocking-only\";\n\treturn \"disabled\";\n}\n\nexport function completionLabel(value: CompletionDelivery): string {\n\treturn value === \"auto-resume\"\n\t\t? \"Continue automatically when work finishes\"\n\t\t: \"Wait for my next message\";\n}\n\nexport function consultationCwdLabel(value: ConsultationCwdPolicy): string {\n\treturn value === \"current-workspace\"\n\t\t? \"This workspace only\"\n\t\t: \"Any folder \u00B7 no project resources when untrusted\";\n}\n\nexport function delegationCwdLabel(value: DelegationCwdPolicy): string {\n\tswitch (value) {\n\t\tcase \"trusted-targets\":\n\t\t\treturn \"This workspace or saved-trusted folders\";\n\t\tcase \"current-workspace\":\n\t\t\treturn \"This workspace only\";\n\t\tcase \"anywhere\":\n\t\t\treturn \"Any folder Pi can access\";\n\t}\n}\n\nexport function consultResourceLabel(value: ConsultResourcePolicy): string {\n\tswitch (value) {\n\t\tcase \"project-context\":\n\t\t\treturn \"Project context only\";\n\t\tcase \"none\":\n\t\t\treturn \"No project resources\";\n\t\tcase \"all\":\n\t\t\treturn \"All trusted resources\";\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-RSUXZD6S.ts";
6
6
  import {
7
7
  appendDelegationContract
8
- } from "./chunk-I2FAK44T.ts";
8
+ } from "./chunk-JSZIP73U.ts";
9
9
  import {
10
10
  DEFAULT_MAX_CONTEXT_BYTES,
11
11
  redactPrivateText,
@@ -49,4 +49,4 @@ export {
49
49
  buildStatefulTurnPrompt,
50
50
  resolveStatefulTurnTimeout
51
51
  };
52
- //# sourceMappingURL=chunk-SCZ33MYW.ts.map
52
+ //# sourceMappingURL=chunk-PGLSFLYW.ts.map
@@ -2,10 +2,10 @@
2
2
  // @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
3
3
  import {
4
4
  discoverAgents
5
- } from "./chunk-PSK43Y6A.ts";
5
+ } from "./chunk-LASD73CM.ts";
6
6
  import {
7
7
  readSubagentSettings
8
- } from "./chunk-QBORTI4W.ts";
8
+ } from "./chunk-TMZRHIIK.ts";
9
9
  import {
10
10
  safeTerminalLine
11
11
  } from "./chunk-SWGQLFSD.ts";
@@ -49,4 +49,4 @@ export {
49
49
  isWriteCapable,
50
50
  confirmProjectAgent
51
51
  };
52
- //# sourceMappingURL=chunk-O4VO6JUJ.ts.map
52
+ //# sourceMappingURL=chunk-TM2R67J3.ts.map
@@ -4,13 +4,13 @@ import {
4
4
  STATEFUL_LIMIT_FIELDS,
5
5
  isValidStatefulLimit,
6
6
  resolveStatefulLimits
7
- } from "./chunk-7OBINKFM.ts";
7
+ } from "./chunk-VDG7LTYE.ts";
8
8
  import {
9
9
  CONSULTATION_CWD_POLICIES,
10
10
  CONSULT_RESOURCE_POLICIES,
11
11
  DELEGATION_CWD_POLICIES,
12
12
  isThinkingLevel
13
- } from "./chunk-DPPVEQAM.ts";
13
+ } from "./chunk-4AQSF7AS.ts";
14
14
  import {
15
15
  DEFAULT_MAX_PARALLEL_TASKS,
16
16
  MAX_CONFIGURABLE_PARALLEL_TASKS,
@@ -153,6 +153,15 @@ function normalizeSubagentSettings(value) {
153
153
  }
154
154
  settings.cwdPolicy = cwdPolicy;
155
155
  }
156
+ if (hasOwn(value, "usageRecording")) {
157
+ if (!isPlainObject(value.usageRecording)) return void 0;
158
+ const usageRecording = {};
159
+ if (hasOwn(value.usageRecording, "enabled")) {
160
+ if (typeof value.usageRecording.enabled !== "boolean") return void 0;
161
+ usageRecording.enabled = value.usageRecording.enabled;
162
+ }
163
+ settings.usageRecording = usageRecording;
164
+ }
156
165
  return settings;
157
166
  }
158
167
 
@@ -178,6 +187,22 @@ function buildSubagentSettingsSnapshot(inspected) {
178
187
  ...inspected.error ? { error: inspected.error } : {}
179
188
  };
180
189
  }
190
+ function buildUsageRecordingSettingsSnapshot(inspected) {
191
+ if (!inspected.raw || !inspected.settings) {
192
+ return {
193
+ path: inspected.path,
194
+ enabled: false,
195
+ source: "default",
196
+ ...inspected.error ? { error: inspected.error } : {}
197
+ };
198
+ }
199
+ const explicit = isPlainObject(inspected.raw.usageRecording) && hasOwn(inspected.raw.usageRecording, "enabled");
200
+ return {
201
+ path: inspected.path,
202
+ enabled: inspected.settings.usageRecording?.enabled === true,
203
+ source: explicit ? "user settings" : "default"
204
+ };
205
+ }
181
206
  function buildConsultResourceSettingsSnapshot(inspected) {
182
207
  if (!inspected.raw || !inspected.settings) {
183
208
  return {
@@ -405,6 +430,9 @@ function inspectDelegationWorkflowSettings() {
405
430
  function inspectCompletionDeliverySettings() {
406
431
  return buildCompletionDeliverySettingsSnapshot(inspectSubagentSettingsDocument());
407
432
  }
433
+ function inspectUsageRecordingSettings() {
434
+ return buildUsageRecordingSettingsSnapshot(inspectSubagentSettingsDocument());
435
+ }
408
436
  function inspectStatefulTransportSettings() {
409
437
  return buildStatefulTransportSettingsSnapshot(inspectSubagentSettingsDocument());
410
438
  }
@@ -460,9 +488,10 @@ export {
460
488
  inspectCwdPolicySettings,
461
489
  inspectDelegationWorkflowSettings,
462
490
  inspectCompletionDeliverySettings,
491
+ inspectUsageRecordingSettings,
463
492
  inspectStatefulTransportSettings,
464
493
  inspectBlockingParallelLimitSettings,
465
494
  inspectStatefulLimitSettings,
466
495
  pathEntryExists
467
496
  };
468
- //# sourceMappingURL=chunk-QBORTI4W.ts.map
497
+ //# sourceMappingURL=chunk-TMZRHIIK.ts.map