@zihanw/pi-forge 0.4.0 → 0.5.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 (341) hide show
  1. package/CHANGELOG.md +49 -1
  2. package/README.md +11 -11
  3. package/README.zh-CN.md +4 -6
  4. package/SUBAGENT_ADAPTER_CONTRACT.md +3 -1
  5. package/dist/agent-profile.d.ts +21 -42
  6. package/dist/agent-profile.d.ts.map +1 -1
  7. package/dist/agent-profile.js +82 -194
  8. package/dist/agent-profile.js.map +1 -1
  9. package/dist/catalog.d.ts +27 -0
  10. package/dist/catalog.d.ts.map +1 -0
  11. package/dist/catalog.js +59 -0
  12. package/dist/catalog.js.map +1 -0
  13. package/dist/codecs/agent-profile.d.ts +53 -0
  14. package/dist/codecs/agent-profile.d.ts.map +1 -0
  15. package/dist/codecs/agent-profile.js +176 -0
  16. package/dist/codecs/agent-profile.js.map +1 -0
  17. package/dist/codecs/index.d.ts +5 -0
  18. package/dist/codecs/index.d.ts.map +1 -0
  19. package/dist/codecs/index.js +3 -0
  20. package/dist/codecs/index.js.map +1 -0
  21. package/dist/codecs/prompt-stack.d.ts +18 -0
  22. package/dist/codecs/prompt-stack.d.ts.map +1 -0
  23. package/dist/codecs/prompt-stack.js +479 -0
  24. package/dist/codecs/prompt-stack.js.map +1 -0
  25. package/dist/compile-cycle.d.ts +18 -0
  26. package/dist/compile-cycle.d.ts.map +1 -0
  27. package/dist/compile-cycle.js +13 -0
  28. package/dist/compile-cycle.js.map +1 -0
  29. package/dist/compiler.d.ts +10 -4
  30. package/dist/compiler.d.ts.map +1 -1
  31. package/dist/compiler.js +53 -19
  32. package/dist/compiler.js.map +1 -1
  33. package/dist/extension-registry.d.ts.map +1 -1
  34. package/dist/extension-registry.js +5 -2
  35. package/dist/extension-registry.js.map +1 -1
  36. package/dist/forge-config.d.ts +2 -81
  37. package/dist/forge-config.d.ts.map +1 -1
  38. package/dist/forge-config.js +5 -280
  39. package/dist/forge-config.js.map +1 -1
  40. package/dist/forge-v1/analyzer.d.ts +3 -0
  41. package/dist/forge-v1/analyzer.d.ts.map +1 -0
  42. package/dist/forge-v1/analyzer.js +50 -0
  43. package/dist/forge-v1/analyzer.js.map +1 -0
  44. package/dist/forge-v1/index.d.ts +6 -0
  45. package/dist/forge-v1/index.d.ts.map +1 -0
  46. package/dist/forge-v1/index.js +13 -0
  47. package/dist/forge-v1/index.js.map +1 -0
  48. package/dist/forge-v1/parser.d.ts +3 -0
  49. package/dist/forge-v1/parser.d.ts.map +1 -0
  50. package/dist/forge-v1/parser.js +186 -0
  51. package/dist/forge-v1/parser.js.map +1 -0
  52. package/dist/forge-v1/renderer.d.ts +9 -0
  53. package/dist/forge-v1/renderer.d.ts.map +1 -0
  54. package/dist/forge-v1/renderer.js +181 -0
  55. package/dist/forge-v1/renderer.js.map +1 -0
  56. package/dist/forge-v1/types.d.ts +87 -0
  57. package/dist/forge-v1/types.d.ts.map +1 -0
  58. package/dist/forge-v1/types.js +4 -0
  59. package/dist/forge-v1/types.js.map +1 -0
  60. package/dist/index.d.ts +12 -9
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +49 -59
  63. package/dist/index.js.map +1 -1
  64. package/dist/lifecycle.d.ts +7 -5
  65. package/dist/lifecycle.d.ts.map +1 -1
  66. package/dist/lifecycle.js +44 -110
  67. package/dist/lifecycle.js.map +1 -1
  68. package/dist/loader.d.ts +16 -3
  69. package/dist/loader.d.ts.map +1 -1
  70. package/dist/loader.js +42 -440
  71. package/dist/loader.js.map +1 -1
  72. package/dist/macro-engine.d.ts +9 -14
  73. package/dist/macro-engine.d.ts.map +1 -1
  74. package/dist/macro-engine.js +5 -238
  75. package/dist/macro-engine.js.map +1 -1
  76. package/dist/payload-command.d.ts +6 -6
  77. package/dist/payload-command.d.ts.map +1 -1
  78. package/dist/payload-command.js.map +1 -1
  79. package/dist/payload-state.d.ts +16 -0
  80. package/dist/payload-state.d.ts.map +1 -0
  81. package/dist/payload-state.js +14 -0
  82. package/dist/payload-state.js.map +1 -0
  83. package/dist/preset-command.d.ts +4 -4
  84. package/dist/preset-command.d.ts.map +1 -1
  85. package/dist/preset-command.js +55 -98
  86. package/dist/preset-command.js.map +1 -1
  87. package/dist/preview.d.ts +4 -4
  88. package/dist/preview.d.ts.map +1 -1
  89. package/dist/preview.js +17 -8
  90. package/dist/preview.js.map +1 -1
  91. package/dist/profile-command.d.ts +2 -2
  92. package/dist/profile-command.d.ts.map +1 -1
  93. package/dist/profile-command.js +52 -26
  94. package/dist/profile-command.js.map +1 -1
  95. package/dist/profile-service.d.ts +5 -2
  96. package/dist/profile-service.d.ts.map +1 -1
  97. package/dist/profile-service.js +63 -42
  98. package/dist/profile-service.js.map +1 -1
  99. package/dist/prompt-analysis.d.ts +24 -0
  100. package/dist/prompt-analysis.d.ts.map +1 -0
  101. package/dist/prompt-analysis.js +84 -0
  102. package/dist/prompt-analysis.js.map +1 -0
  103. package/dist/prompt-runtime.d.ts +19 -0
  104. package/dist/prompt-runtime.d.ts.map +1 -0
  105. package/dist/prompt-runtime.js +30 -0
  106. package/dist/prompt-runtime.js.map +1 -0
  107. package/dist/regex.js +6 -12
  108. package/dist/regex.js.map +1 -1
  109. package/dist/render-helpers.d.ts +2 -10
  110. package/dist/render-helpers.d.ts.map +1 -1
  111. package/dist/render-helpers.js +3 -53
  112. package/dist/render-helpers.js.map +1 -1
  113. package/dist/repositories/agent-profile.d.ts +36 -0
  114. package/dist/repositories/agent-profile.d.ts.map +1 -0
  115. package/dist/repositories/agent-profile.js +153 -0
  116. package/dist/repositories/agent-profile.js.map +1 -0
  117. package/dist/repositories/index.d.ts +3 -0
  118. package/dist/repositories/index.d.ts.map +1 -0
  119. package/dist/repositories/index.js +3 -0
  120. package/dist/repositories/index.js.map +1 -0
  121. package/dist/repositories/prompt-stack.d.ts +57 -0
  122. package/dist/repositories/prompt-stack.d.ts.map +1 -0
  123. package/dist/repositories/prompt-stack.js +175 -0
  124. package/dist/repositories/prompt-stack.js.map +1 -0
  125. package/dist/resource-identity.d.ts +33 -0
  126. package/dist/resource-identity.d.ts.map +1 -0
  127. package/dist/resource-identity.js +56 -0
  128. package/dist/resource-identity.js.map +1 -0
  129. package/dist/runtime/profile-runtime.d.ts +2 -2
  130. package/dist/runtime/profile-runtime.d.ts.map +1 -1
  131. package/dist/runtime/profile-runtime.js +18 -10
  132. package/dist/runtime/profile-runtime.js.map +1 -1
  133. package/dist/runtime/prompt-stack-runtime.d.ts +5 -4
  134. package/dist/runtime/prompt-stack-runtime.d.ts.map +1 -1
  135. package/dist/runtime/prompt-stack-runtime.js +47 -52
  136. package/dist/runtime/prompt-stack-runtime.js.map +1 -1
  137. package/dist/runtime/tool-policy-runtime.d.ts +2 -2
  138. package/dist/runtime/tool-policy-runtime.d.ts.map +1 -1
  139. package/dist/runtime/tool-policy-runtime.js +3 -3
  140. package/dist/runtime/tool-policy-runtime.js.map +1 -1
  141. package/dist/session-adapter.d.ts +17 -0
  142. package/dist/session-adapter.d.ts.map +1 -0
  143. package/dist/session-adapter.js +57 -0
  144. package/dist/session-adapter.js.map +1 -0
  145. package/dist/slot-renderers.d.ts +16 -3
  146. package/dist/slot-renderers.d.ts.map +1 -1
  147. package/dist/slot-renderers.js +15 -63
  148. package/dist/slot-renderers.js.map +1 -1
  149. package/dist/stack-migration.d.ts +6 -0
  150. package/dist/stack-migration.d.ts.map +1 -1
  151. package/dist/stack-migration.js +49 -52
  152. package/dist/stack-migration.js.map +1 -1
  153. package/dist/storage.d.ts +10 -0
  154. package/dist/storage.d.ts.map +1 -1
  155. package/dist/storage.js +45 -10
  156. package/dist/storage.js.map +1 -1
  157. package/dist/subagent/fingerprints.d.ts +24 -0
  158. package/dist/subagent/fingerprints.d.ts.map +1 -0
  159. package/dist/subagent/fingerprints.js +81 -0
  160. package/dist/subagent/fingerprints.js.map +1 -0
  161. package/dist/subagent/host-port.d.ts +296 -0
  162. package/dist/subagent/host-port.d.ts.map +1 -0
  163. package/dist/subagent/host-port.js +560 -0
  164. package/dist/subagent/host-port.js.map +1 -0
  165. package/dist/subagent/index.d.ts +10 -10
  166. package/dist/subagent/index.d.ts.map +1 -1
  167. package/dist/subagent/index.js +9 -10
  168. package/dist/subagent/index.js.map +1 -1
  169. package/dist/subagent-host.d.ts +99 -18
  170. package/dist/subagent-host.d.ts.map +1 -1
  171. package/dist/subagent-host.js +185 -162
  172. package/dist/subagent-host.js.map +1 -1
  173. package/dist/template-render.d.ts +18 -0
  174. package/dist/template-render.d.ts.map +1 -0
  175. package/dist/template-render.js +232 -0
  176. package/dist/template-render.js.map +1 -0
  177. package/dist/types.d.ts +43 -27
  178. package/dist/types.d.ts.map +1 -1
  179. package/dist/types.js.map +1 -1
  180. package/dist/web-editor/client-script.generated.d.ts.map +1 -1
  181. package/dist/web-editor/client-script.generated.js +1 -1
  182. package/dist/web-editor/client-script.generated.js.map +1 -1
  183. package/dist/web-editor/client-styles.generated.d.ts.map +1 -1
  184. package/dist/web-editor/client-styles.generated.js +1 -1
  185. package/dist/web-editor/client-styles.generated.js.map +1 -1
  186. package/dist/web-editor/server.d.ts.map +1 -1
  187. package/dist/web-editor/server.js +32 -72
  188. package/dist/web-editor/server.js.map +1 -1
  189. package/dist/web-editor/styles.d.ts.map +1 -1
  190. package/dist/web-editor/styles.js +13 -0
  191. package/dist/web-editor/styles.js.map +1 -1
  192. package/dist/web-editor/types.d.ts +10 -37
  193. package/dist/web-editor/types.d.ts.map +1 -1
  194. package/dist/web-host.d.ts +4 -2
  195. package/dist/web-host.d.ts.map +1 -1
  196. package/dist/web-host.js +110 -138
  197. package/dist/web-host.js.map +1 -1
  198. package/dist/workspace.d.ts +74 -0
  199. package/dist/workspace.d.ts.map +1 -0
  200. package/dist/workspace.js +351 -0
  201. package/dist/workspace.js.map +1 -0
  202. package/docs/README.md +6 -4
  203. package/docs/concepts/agent-profiles.md +2 -2
  204. package/docs/concepts/prompt-stacks.md +12 -7
  205. package/docs/design/README.md +21 -3
  206. package/docs/design/architecture-0.5.md +211 -0
  207. package/docs/design/archive/0.5-full-proposal/0.5-consumer-audit.md +62 -0
  208. package/docs/design/archive/0.5-full-proposal/0.5-inventory.md +208 -0
  209. package/docs/design/archive/0.5-full-proposal/0.5-phase0-decision-drafts.md +237 -0
  210. package/docs/design/archive/0.5-full-proposal/README.md +12 -0
  211. package/docs/design/archive/0.5-full-proposal/architecture-0.5.md +423 -0
  212. package/docs/design/archive/0.5-full-proposal/host-discovery-spike.md +103 -0
  213. package/docs/design/archive/0.5-full-proposal/template-language-spike.md +156 -0
  214. package/docs/design/context-diff-plan.md +72 -0
  215. package/docs/design/decision-template.md +33 -0
  216. package/docs/design/roadmap-0.4-archive.md +1 -1
  217. package/docs/design/subagents/interface-design.md +1 -1
  218. package/docs/development/architecture-rules.md +148 -0
  219. package/docs/development/roadmap.md +39 -13
  220. package/docs/development/scoped-global-profiles-stacks.md +325 -0
  221. package/docs/development/setup.md +6 -4
  222. package/docs/getting-started.md +9 -6
  223. package/docs/guides/custom-macros-and-slots.md +8 -7
  224. package/docs/guides/debugging.md +1 -1
  225. package/docs/guides/delegation.md +25 -21
  226. package/docs/guides/migrating-to-0.5.md +107 -0
  227. package/docs/guides/use-cases.md +7 -11
  228. package/docs/guides/web-editor.md +7 -11
  229. package/docs/reference/commands.md +4 -3
  230. package/docs/reference/configuration.md +18 -17
  231. package/docs/reference/features.md +34 -79
  232. package/docs/reference/macros-and-slots.md +70 -49
  233. package/docs/reference/public-api.md +64 -17
  234. package/docs/reference/stack-schema.md +14 -9
  235. package/docs/reference/subagent-host-port.md +49 -0
  236. package/docs/zh-CN/README.md +3 -3
  237. package/docs/zh-CN/concepts/agent-profiles.md +4 -2
  238. package/docs/zh-CN/concepts/prompt-stacks.md +9 -7
  239. package/docs/zh-CN/getting-started.md +10 -7
  240. package/docs/zh-CN/guides/delegation.md +11 -13
  241. package/docs/zh-CN/guides/migrating-to-0.5.md +92 -0
  242. package/docs/zh-CN/guides/web-editor.md +7 -7
  243. package/docs/zh-CN/reference/commands.md +6 -3
  244. package/examples/custom-system-status-extension/README.md +3 -3
  245. package/examples/custom-system-status-extension/index.ts +2 -1
  246. package/examples/custom-system-status-extension/prompt-stack.json +4 -3
  247. package/examples/default-prompt-stack.json +9 -4
  248. package/examples/image-reader-prompt-stack.json +16 -26
  249. package/examples/reviewer-prompt-stack.json +13 -24
  250. package/package.json +101 -120
  251. package/dist/runtime/subagent-runtime.d.ts +0 -45
  252. package/dist/runtime/subagent-runtime.d.ts.map +0 -1
  253. package/dist/runtime/subagent-runtime.js +0 -335
  254. package/dist/runtime/subagent-runtime.js.map +0 -1
  255. package/dist/runtime-state.d.ts +0 -30
  256. package/dist/runtime-state.d.ts.map +0 -1
  257. package/dist/runtime-state.js +0 -17
  258. package/dist/runtime-state.js.map +0 -1
  259. package/dist/sillytavern-importer/items.d.ts +0 -3
  260. package/dist/sillytavern-importer/items.d.ts.map +0 -1
  261. package/dist/sillytavern-importer/items.js +0 -88
  262. package/dist/sillytavern-importer/items.js.map +0 -1
  263. package/dist/sillytavern-importer/macros.d.ts +0 -15
  264. package/dist/sillytavern-importer/macros.d.ts.map +0 -1
  265. package/dist/sillytavern-importer/macros.js +0 -141
  266. package/dist/sillytavern-importer/macros.js.map +0 -1
  267. package/dist/sillytavern-importer/prompt-order.d.ts +0 -6
  268. package/dist/sillytavern-importer/prompt-order.d.ts.map +0 -1
  269. package/dist/sillytavern-importer/prompt-order.js +0 -38
  270. package/dist/sillytavern-importer/prompt-order.js.map +0 -1
  271. package/dist/sillytavern-importer/regex.d.ts +0 -3
  272. package/dist/sillytavern-importer/regex.d.ts.map +0 -1
  273. package/dist/sillytavern-importer/regex.js +0 -275
  274. package/dist/sillytavern-importer/regex.js.map +0 -1
  275. package/dist/sillytavern-importer/report.d.ts +0 -21
  276. package/dist/sillytavern-importer/report.d.ts.map +0 -1
  277. package/dist/sillytavern-importer/report.js +0 -166
  278. package/dist/sillytavern-importer/report.js.map +0 -1
  279. package/dist/sillytavern-importer/types.d.ts +0 -106
  280. package/dist/sillytavern-importer/types.d.ts.map +0 -1
  281. package/dist/sillytavern-importer/types.js +0 -2
  282. package/dist/sillytavern-importer/types.js.map +0 -1
  283. package/dist/sillytavern-importer.d.ts +0 -5
  284. package/dist/sillytavern-importer.d.ts.map +0 -1
  285. package/dist/sillytavern-importer.js +0 -117
  286. package/dist/sillytavern-importer.js.map +0 -1
  287. package/dist/subagent/canonical.d.ts +0 -22
  288. package/dist/subagent/canonical.d.ts.map +0 -1
  289. package/dist/subagent/canonical.js +0 -24
  290. package/dist/subagent/canonical.js.map +0 -1
  291. package/dist/subagent/context.d.ts +0 -8
  292. package/dist/subagent/context.d.ts.map +0 -1
  293. package/dist/subagent/context.js +0 -125
  294. package/dist/subagent/context.js.map +0 -1
  295. package/dist/subagent/contract.d.ts +0 -10
  296. package/dist/subagent/contract.d.ts.map +0 -1
  297. package/dist/subagent/contract.js +0 -10
  298. package/dist/subagent/contract.js.map +0 -1
  299. package/dist/subagent/plan.d.ts +0 -18
  300. package/dist/subagent/plan.d.ts.map +0 -1
  301. package/dist/subagent/plan.js +0 -157
  302. package/dist/subagent/plan.js.map +0 -1
  303. package/dist/subagent/preflight.d.ts +0 -4
  304. package/dist/subagent/preflight.d.ts.map +0 -1
  305. package/dist/subagent/preflight.js +0 -108
  306. package/dist/subagent/preflight.js.map +0 -1
  307. package/dist/subagent/request.d.ts +0 -4
  308. package/dist/subagent/request.d.ts.map +0 -1
  309. package/dist/subagent/request.js +0 -122
  310. package/dist/subagent/request.js.map +0 -1
  311. package/dist/subagent/response.d.ts +0 -8
  312. package/dist/subagent/response.d.ts.map +0 -1
  313. package/dist/subagent/response.js +0 -155
  314. package/dist/subagent/response.js.map +0 -1
  315. package/dist/subagent/tools.d.ts +0 -4
  316. package/dist/subagent/tools.d.ts.map +0 -1
  317. package/dist/subagent/tools.js +0 -42
  318. package/dist/subagent/tools.js.map +0 -1
  319. package/dist/subagent/types.d.ts +0 -268
  320. package/dist/subagent/types.d.ts.map +0 -1
  321. package/dist/subagent/types.js +0 -3
  322. package/dist/subagent/types.js.map +0 -1
  323. package/dist/subagent/validation.d.ts +0 -35
  324. package/dist/subagent/validation.d.ts.map +0 -1
  325. package/dist/subagent/validation.js +0 -314
  326. package/dist/subagent/validation.js.map +0 -1
  327. package/dist/subagent-command.d.ts +0 -4
  328. package/dist/subagent-command.d.ts.map +0 -1
  329. package/dist/subagent-command.js +0 -246
  330. package/dist/subagent-command.js.map +0 -1
  331. package/dist/subagent-profile-tool.d.ts +0 -49
  332. package/dist/subagent-profile-tool.d.ts.map +0 -1
  333. package/dist/subagent-profile-tool.js +0 -124
  334. package/dist/subagent-profile-tool.js.map +0 -1
  335. package/dist/subagent-tool.d.ts +0 -53
  336. package/dist/subagent-tool.d.ts.map +0 -1
  337. package/dist/subagent-tool.js +0 -456
  338. package/dist/subagent-tool.js.map +0 -1
  339. package/docs/guides/sillytavern-import.md +0 -47
  340. package/docs/reference/subagent-adapter.md +0 -204
  341. package/examples/sillytavern-dm-writer-prompt-stack.json +0 -190
@@ -1,456 +0,0 @@
1
- import { getMarkdownTheme, } from "@earendil-works/pi-coding-agent";
2
- import { Container, Markdown, Spacer, Text } from "@earendil-works/pi-tui";
3
- import { Type } from "typebox";
4
- import { loadForgeSubagentSettings, resolveSubagentProfilePolicy } from "./forge-config.js";
5
- import { sanitizePiSubprocessRunReport, } from "@zihanw/pi-subagent-runtime/backends/subprocess";
6
- import { isRecord } from "@zihanw/pi-subagent-runtime";
7
- const APPROVE = "Approve and run";
8
- const VIEW_FULL_PROMPT = "View full prompt";
9
- const REJECT = "Reject";
10
- const MAX_PROGRESS_ITEMS = 100;
11
- const MAX_APPROVAL_TASK_PREVIEW_CHARS = 48;
12
- const MAX_APPROVAL_EXECUTION_PREVIEW_CHARS = 44;
13
- const MAX_APPROVAL_PATH_PREVIEW_CHARS = 44;
14
- const MAX_APPROVAL_FINGERPRINT_PREVIEW_CHARS = 24;
15
- const ForgeSubagentParameters = Type.Object({
16
- profileId: Type.String({
17
- minLength: 1,
18
- description: "ID of a Pi Forge agent profile explicitly enabled for subagent delegation.",
19
- }),
20
- task: Type.String({
21
- minLength: 1,
22
- description: "The focused task to delegate to the subagent.",
23
- }),
24
- backend: Type.Optional(Type.String({
25
- minLength: 1,
26
- description: "Backend ID to prepare and execute through (see /forge-agent backends). Honored only for interactively approved runs; trusted-project unattended invocation always uses the configured default backend.",
27
- })),
28
- });
29
- export function registerForgeSubagentTool(pi, runtime, profileIds) {
30
- pi.registerTool({
31
- name: "forge_subagent",
32
- label: "Forge Subagent",
33
- description: [
34
- "Delegate one foreground task to a Pi Forge agent profile explicitly enabled in subagents.profiles.",
35
- "Use forge_subagent_profiles first when the user has not already specified a profile ID.",
36
- "Runs require human approval after exact preparation unless the trusted project explicitly enables unattended agent invocation.",
37
- "The child receives only approved read tools, but runs with the invoking user's OS permissions; read-only is not a sandbox.",
38
- "The optional backend parameter selects the execution backend for interactively approved runs; unattended invocation always uses the configured default backend.",
39
- "Use the final report as evidence and do not repeatedly request the same rejected delegation.",
40
- ].join(" "),
41
- parameters: ForgeSubagentParameters,
42
- executionMode: "sequential",
43
- async execute(_toolCallId, params, signal, onUpdate, ctx) {
44
- const settings = loadForgeSubagentSettings(ctx);
45
- const approvalRequired = !settings.allowAgentInvocationWithoutApproval;
46
- const configDiagnostics = settings.warnings.map((message) => ({ level: "warning", code: "host.config", message }));
47
- const baseDetails = {
48
- status: "preparing",
49
- profileId: params.profileId,
50
- task: params.task,
51
- approval: {
52
- required: approvalRequired,
53
- approved: false,
54
- viewedFullPrompt: false,
55
- source: approvalRequired ? "none" : "trusted-project-config",
56
- },
57
- diagnostics: configDiagnostics,
58
- progress: [],
59
- };
60
- const knownProfileIds = profileIds();
61
- const enabledProfileIds = knownProfileIds.filter((profileId) => resolveSubagentProfilePolicy(settings, profileId).enabled);
62
- if (!knownProfileIds.includes(params.profileId)) {
63
- const available = enabledProfileIds.join(", ") || "none";
64
- return toolResult(`Unknown Pi Forge agent profile: ${params.profileId}. Enabled subagent profiles: ${available}.`, { ...baseDetails, status: "failed" }, true);
65
- }
66
- const configuredPolicy = resolveSubagentProfilePolicy(settings, params.profileId);
67
- if (!configuredPolicy.enabled) {
68
- return toolResult(`Pi Forge agent profile "${params.profileId}" is not enabled for subagent delegation. Use forge_subagent_profiles to discover enabled profiles.`, { ...baseDetails, status: "failed" }, true);
69
- }
70
- const configuredBackend = configuredPolicy.backend;
71
- if (!approvalRequired && params.backend && params.backend !== configuredBackend.id) {
72
- return toolResult(`Subagent invocation was not run: unattended invocation is pinned to the configured backend "${configuredBackend.id}". To use "${params.backend}", run interactively or change the trusted subagent configuration.`, {
73
- ...baseDetails,
74
- status: "failed",
75
- approval: { required: false, approved: false, viewedFullPrompt: false, source: "trusted-project-config" },
76
- }, true);
77
- }
78
- const runPolicy = resolveSubagentProfilePolicy(settings, params.profileId, approvalRequired ? params.backend : undefined);
79
- if (approvalRequired && !ctx.hasUI) {
80
- return toolResult("Subagent invocation was not run: interactive human approval is unavailable.", { ...baseDetails, status: "cancelled" });
81
- }
82
- onUpdate?.(toolResult("Preparing the exact subagent prompt; provider transport is still closed.", baseDetails));
83
- let prepared;
84
- try {
85
- const preparation = await runtime.prepare(params.profileId, params.task, ctx, {
86
- backendId: runPolicy.backend.id,
87
- timeoutMs: runPolicy.timeout.milliseconds,
88
- });
89
- if (!preparation.ok) {
90
- const diagnostics = [...configDiagnostics, ...preparation.diagnostics];
91
- return toolResult(`Subagent preparation failed:\n${renderDiagnostics(diagnostics)}`, { ...baseDetails, status: "failed", diagnostics }, true);
92
- }
93
- prepared = preparation.prepared;
94
- const plan = summarizeForgeSubagentPlan(prepared, ctx.cwd);
95
- const preparedDetails = {
96
- ...baseDetails,
97
- status: approvalRequired ? "awaiting-approval" : "prepared",
98
- plan,
99
- diagnostics: [...configDiagnostics, ...prepared.diagnostics],
100
- };
101
- onUpdate?.(toolResult(approvalRequired
102
- ? "The exact plan is ready and awaiting human approval."
103
- : "The exact plan is ready; per-run approval is bypassed by trusted-project configuration.", preparedDetails));
104
- const approval = approvalRequired
105
- ? await requestForgeSubagentApproval(prepared, params.task, ctx, signal)
106
- : { approved: true, viewedFullPrompt: false };
107
- if (!approval.approved) {
108
- await runtime.discard(prepared);
109
- prepared = undefined;
110
- return toolResult("Subagent invocation was rejected by the human before provider transport.", {
111
- ...preparedDetails,
112
- status: "cancelled",
113
- approval: { required: true, approved: false, viewedFullPrompt: approval.viewedFullPrompt, source: "none" },
114
- });
115
- }
116
- const approvedAt = new Date().toISOString();
117
- const progress = [];
118
- const running = {
119
- ...preparedDetails,
120
- status: "running",
121
- approval: {
122
- required: approvalRequired,
123
- approved: true,
124
- viewedFullPrompt: approval.viewedFullPrompt,
125
- source: approvalRequired ? "human" : "trusted-project-config",
126
- executionFingerprint: prepared.plan.executionFingerprint,
127
- approvedAt,
128
- },
129
- progress,
130
- };
131
- const response = await runtime.execute(prepared, ctx, signal, (update) => {
132
- progress.push(structuredClone(update));
133
- if (progress.length > MAX_PROGRESS_ITEMS)
134
- progress.splice(0, progress.length - MAX_PROGRESS_ITEMS);
135
- onUpdate?.(toolResult(truncate(update.message, 2_000), { ...running, progress: [...progress] }));
136
- });
137
- prepared = undefined;
138
- const rawReport = runtime.takeReport?.(response.runId);
139
- const report = rawReport ? sanitizePiSubprocessRunReport(rawReport) : undefined;
140
- const finalDetails = {
141
- ...running,
142
- status: toolStatus(response),
143
- progress: [...progress],
144
- response,
145
- report,
146
- };
147
- return toolResult(renderResponseForModel(response), finalDetails, response.status === "failed");
148
- }
149
- catch (error) {
150
- if (prepared)
151
- await runtime.discard(prepared).catch(() => undefined);
152
- const message = error instanceof Error ? error.message : String(error);
153
- return toolResult(`Subagent invocation failed: ${message}`, { ...baseDetails, status: "failed" }, true);
154
- }
155
- },
156
- renderCall(args, theme) {
157
- const task = truncate(args.task.replace(/\s+/g, " ").trim(), 100);
158
- return new Text(`${theme.fg("toolTitle", theme.bold("forge subagent "))}${theme.fg("accent", args.profileId)}\n${theme.fg("dim", task)}`, 0, 0);
159
- },
160
- renderResult(result, { expanded, isPartial }, theme) {
161
- const details = result.details;
162
- if (!details)
163
- return new Text(textContent(result) || "(no subagent result)", 0, 0);
164
- if (!expanded)
165
- return renderCollapsedResult(result, details, isPartial, theme);
166
- return renderExpandedResult(result, details, theme);
167
- },
168
- });
169
- }
170
- export async function requestForgeSubagentApproval(prepared, task, ctx, signal) {
171
- let viewedFullPrompt = false;
172
- while (!signal?.aborted) {
173
- const choice = await ctx.ui.select(renderApprovalSummary(prepared, task, ctx.cwd), [APPROVE, VIEW_FULL_PROMPT, REJECT], { signal });
174
- if (choice === VIEW_FULL_PROMPT) {
175
- viewedFullPrompt = true;
176
- await ctx.ui.editor(`Subagent approval details: ${prepared.plan.profile.profile.id} (view only; edits are ignored)`, [
177
- renderApprovalDetails(prepared, task, ctx.cwd),
178
- "",
179
- renderFullForgeSubagentPrompt(prepared),
180
- ].join("\n"));
181
- continue;
182
- }
183
- return { approved: choice === APPROVE, viewedFullPrompt };
184
- }
185
- return { approved: false, viewedFullPrompt };
186
- }
187
- export function summarizeForgeSubagentPlan(prepared, cwd) {
188
- const plan = prepared.plan;
189
- return {
190
- backendId: plan.backendId,
191
- profileId: plan.profile.profile.id,
192
- promptStackId: plan.profile.promptStack?.id ?? null,
193
- provider: plan.model.provider,
194
- model: plan.model.id,
195
- thinkingLevel: plan.thinkingLevel,
196
- effectiveToolIds: [...plan.effectiveToolIds],
197
- executionBoundary: plan.access.executionBoundary ?? "isolated",
198
- workingDirectory: cwd,
199
- systemPromptChars: plan.systemPrompt.length,
200
- messageCount: plan.messages.length,
201
- messageRoles: plan.messages.map((message) => message.role),
202
- ...(plan.limits.timeoutMs ? {
203
- timeoutMs: plan.limits.timeoutMs.value,
204
- timeoutEnforcement: plan.limits.timeoutMs.enforcement,
205
- } : {}),
206
- promptRuntimeFingerprint: plan.promptRuntimeFingerprint,
207
- conversationFingerprint: plan.conversationFingerprint,
208
- executionFingerprint: plan.executionFingerprint,
209
- };
210
- }
211
- export function renderApprovalSummary(prepared, task, cwd) {
212
- const plan = prepared.plan;
213
- const summary = summarizeForgeSubagentPlan(prepared, cwd);
214
- const timeout = summary.timeoutMs === undefined
215
- ? "none"
216
- : `${summary.timeoutMs} ms ${summary.timeoutEnforcement ?? "unknown enforcement"}`;
217
- return [
218
- `Run foreground subagent ${oneLinePreview(summary.profileId, MAX_APPROVAL_EXECUTION_PREVIEW_CHARS)}?`,
219
- `Task: ${oneLinePreview(task, MAX_APPROVAL_TASK_PREVIEW_CHARS)}`,
220
- `Backend: ${oneLinePreview(summary.backendId, MAX_APPROVAL_EXECUTION_PREVIEW_CHARS)}`,
221
- `Model: ${oneLinePreview(`${summary.provider}/${summary.model} · thinking ${summary.thinkingLevel}`, MAX_APPROVAL_EXECUTION_PREVIEW_CHARS)}`,
222
- `Stack/tools: ${oneLinePreview(`${summary.promptStackId ?? "none"} · ${toolNames(plan).join(", ") || "none"}`, MAX_APPROVAL_EXECUTION_PREVIEW_CHARS)}`,
223
- `Directory: ${oneLinePreview(summary.workingDirectory, MAX_APPROVAL_PATH_PREVIEW_CHARS)}`,
224
- `Boundary: ${oneLinePreview(summary.executionBoundary, 16)} · ${timeout}`,
225
- `Payload: ${summary.systemPromptChars} system chars + ${summary.messageCount} messages`,
226
- `Execution: ${compactIdentifier(summary.executionFingerprint, MAX_APPROVAL_FINGERPRINT_PREVIEW_CHARS)} (see full prompt)`,
227
- "No OS sandbox; provider gets prompt/files read by agent.",
228
- ].join("\n");
229
- }
230
- export function renderApprovalDetails(prepared, task, cwd) {
231
- const plan = prepared.plan;
232
- const summary = summarizeForgeSubagentPlan(prepared, cwd);
233
- return [
234
- "# Subagent approval details",
235
- "",
236
- "Agent prompt:",
237
- indent(truncate(task, 2_000)),
238
- "",
239
- `Backend: ${summary.backendId}`,
240
- `Provider: ${summary.provider}`,
241
- `Model: ${summary.model}`,
242
- `Thinking: ${summary.thinkingLevel}`,
243
- `Prompt stack: ${summary.promptStackId ?? "none"}`,
244
- `Tools: ${toolNames(plan).join(", ") || "none"}`,
245
- `Working directory: ${summary.workingDirectory}`,
246
- `Boundary: ${summary.executionBoundary} (read-only tool policy; no OS sandbox)`,
247
- ...(summary.timeoutMs === undefined ? [] : [`Timeout: ${summary.timeoutMs} ms (${summary.timeoutEnforcement ?? "unknown enforcement"})`]),
248
- `Full payload: ${summary.systemPromptChars} system chars + ${summary.messageCount} messages`,
249
- `Prompt runtime fingerprint: ${summary.promptRuntimeFingerprint}`,
250
- `Conversation fingerprint: ${summary.conversationFingerprint}`,
251
- `Execution fingerprint: ${summary.executionFingerprint}`,
252
- "",
253
- "The provider receives the compiled prompt and any files the read tools access.",
254
- "The subprocess retains your user permissions even though write/process tools are unavailable.",
255
- ].join("\n");
256
- }
257
- export function renderFullForgeSubagentPrompt(prepared) {
258
- const plan = prepared.plan;
259
- const messages = plan.messages.flatMap((message, index) => [
260
- `## Message ${index + 1}: ${message.role}${message.protectedTask ? " (protected delegated task)" : ""}${message.source ? ` [${message.source}]` : ""}`,
261
- "",
262
- message.content.map((part) => part.type === "text" ? part.text : `[${part.mimeType} media ${part.mediaId}]`).join("\n"),
263
- "",
264
- ]);
265
- return [
266
- `# Exact provider-bound subagent prompt`,
267
- "",
268
- `Backend: ${plan.backendId}`,
269
- `Profile: ${plan.profile.profile.id}`,
270
- `Provider/model: ${plan.model.provider}/${plan.model.id}`,
271
- `Thinking: ${plan.thinkingLevel}`,
272
- `Tools: ${toolNames(plan).join(", ") || "none"}`,
273
- `Timeout: ${plan.limits.timeoutMs ? `${plan.limits.timeoutMs.value} ms (${plan.limits.timeoutMs.enforcement})` : "none"}`,
274
- `Conversation fingerprint: ${plan.conversationFingerprint}`,
275
- `Execution fingerprint: ${plan.executionFingerprint}`,
276
- "",
277
- "## System prompt",
278
- "",
279
- plan.systemPrompt,
280
- "",
281
- ...messages,
282
- ].join("\n");
283
- }
284
- function renderCollapsedResult(result, details, isPartial, theme) {
285
- const icon = details.status === "completed"
286
- ? theme.fg("success", "✓")
287
- : details.status === "failed"
288
- ? theme.fg("error", "✗")
289
- : details.status === "cancelled" || details.status === "timed-out"
290
- ? theme.fg("warning", "○")
291
- : theme.fg("accent", "●");
292
- const lines = [`${icon} ${theme.fg("toolTitle", theme.bold(details.profileId))} ${theme.fg("muted", `[${details.status}${isPartial ? ", live" : ""}]`)}`];
293
- if (details.plan)
294
- lines.push(theme.fg("dim", `${details.plan.provider}/${details.plan.model} · ${details.plan.thinkingLevel} · ${details.plan.executionBoundary}`));
295
- const output = textContent(result);
296
- if (output)
297
- lines.push(theme.fg(details.status === "failed" ? "error" : "toolOutput", truncateLines(output, 8, 2_000)));
298
- if (details.report)
299
- lines.push(theme.fg("dim", usageText(details.report)));
300
- if (details.report && details.report.messages.length > 0)
301
- lines.push(theme.fg("muted", "Ctrl+O to view the full subagent transcript"));
302
- return new Text(lines.join("\n"), 0, 0);
303
- }
304
- function renderExpandedResult(result, details, theme) {
305
- const container = new Container();
306
- container.addChild(new Text(theme.fg("toolTitle", theme.bold(`${details.profileId} [${details.status}]`)), 0, 0));
307
- if (details.plan) {
308
- container.addChild(new Text([
309
- `${theme.fg("muted", "Model:")} ${details.plan.provider}/${details.plan.model} (${details.plan.thinkingLevel})`,
310
- `${theme.fg("muted", "Boundary:")} ${details.plan.executionBoundary}; read-only model tools`,
311
- ...(details.plan.timeoutMs === undefined ? [] : [`${theme.fg("muted", "Timeout:")} ${details.plan.timeoutMs} ms (${details.plan.timeoutEnforcement ?? "unknown"})`]),
312
- `${theme.fg("muted", "Tools:")} ${details.plan.effectiveToolIds.join(", ") || "none"}`,
313
- `${theme.fg("muted", "Fingerprint:")} ${details.plan.executionFingerprint}`,
314
- `${theme.fg("muted", "Approval:")} ${approvalText(details.approval)}`,
315
- ].join("\n"), 0, 0));
316
- }
317
- container.addChild(new Spacer(1));
318
- container.addChild(new Text(theme.fg("muted", "─── Delegated task ───"), 0, 0));
319
- container.addChild(new Text(details.task, 0, 0));
320
- if (details.report?.messages.length) {
321
- container.addChild(new Spacer(1));
322
- const transcriptLabel = details.report.retention.truncated
323
- ? `─── Bounded subagent transcript tail (${details.report.retention.omittedMessages} earlier/oversized message${details.report.retention.omittedMessages === 1 ? "" : "s"} omitted) ───`
324
- : "─── Subagent transcript ───";
325
- container.addChild(new Text(theme.fg("muted", transcriptLabel), 0, 0));
326
- for (const message of details.report.messages)
327
- appendMessage(container, message, theme);
328
- container.addChild(new Spacer(1));
329
- container.addChild(new Text(theme.fg("dim", usageText(details.report)), 0, 0));
330
- if (details.report.stderr.trim()) {
331
- container.addChild(new Spacer(1));
332
- container.addChild(new Text(theme.fg("warning", `stderr:\n${details.report.stderr.trim()}`), 0, 0));
333
- }
334
- }
335
- else {
336
- const output = textContent(result);
337
- if (output) {
338
- container.addChild(new Spacer(1));
339
- container.addChild(new Text(theme.fg("muted", "─── Result ───"), 0, 0));
340
- container.addChild(new Markdown(output, 0, 0, getMarkdownTheme()));
341
- }
342
- }
343
- return container;
344
- }
345
- function appendMessage(container, value, theme) {
346
- if (!isRecord(value))
347
- return;
348
- if (value.role === "assistant" && Array.isArray(value.content)) {
349
- for (const part of value.content) {
350
- if (!isRecord(part))
351
- continue;
352
- if (part.type === "toolCall") {
353
- const name = typeof part.name === "string" ? part.name : "tool";
354
- const args = isRecord(part.arguments) ? JSON.stringify(part.arguments) : "{}";
355
- container.addChild(new Text(`${theme.fg("muted", "→")} ${theme.fg("accent", name)} ${theme.fg("dim", args)}`, 0, 0));
356
- }
357
- else if (part.type === "text" && typeof part.text === "string" && part.text.trim()) {
358
- container.addChild(new Markdown(part.text.trim(), 0, 0, getMarkdownTheme()));
359
- }
360
- }
361
- return;
362
- }
363
- if (value.role === "toolResult") {
364
- const name = typeof value.toolName === "string" ? value.toolName : "tool";
365
- const header = value.isError === true ? theme.fg("error", `← ${name} failed`) : theme.fg("muted", `← ${name}`);
366
- container.addChild(new Text(header, 0, 0));
367
- const content = messageText(value.content);
368
- if (content)
369
- container.addChild(new Text(theme.fg("toolOutput", content), 1, 0));
370
- }
371
- }
372
- function toolResult(text, details, _isError = false) {
373
- return { content: [{ type: "text", text }], details: structuredClone(details) };
374
- }
375
- function renderResponseForModel(response) {
376
- if (response.status === "completed")
377
- return response.output?.text || "Subagent completed without a textual report.";
378
- if (response.status === "failed")
379
- return `Subagent failed (${response.error.code}): ${response.error.message}${response.output?.text ? `\n\nPartial report:\n${response.output.text}` : ""}`;
380
- if (response.status === "cancelled" || response.status === "timed-out")
381
- return `Subagent ${response.status}: ${response.reason}${response.output?.text ? `\n\nPartial report:\n${response.output.text}` : ""}`;
382
- return `Subagent stopped after reaching ${response.reachedLimit}.${response.output?.text ? `\n\nPartial report:\n${response.output.text}` : ""}`;
383
- }
384
- function toolStatus(response) {
385
- if (response.status === "completed")
386
- return "completed";
387
- if (response.status === "failed" || response.status === "limit-reached")
388
- return "failed";
389
- return response.status;
390
- }
391
- function renderDiagnostics(diagnostics) {
392
- return diagnostics.map((item) => `${item.level.toUpperCase()} ${item.code}: ${item.message}`).join("\n") || "No diagnostics.";
393
- }
394
- function toolNames(plan) {
395
- const names = new Map(plan.preflight.toolCatalog.map((tool) => [tool.id, tool.name]));
396
- return plan.effectiveToolIds.map((id) => names.get(id) ?? id);
397
- }
398
- function textContent(result) {
399
- return result.content.filter((part) => part.type === "text").map((part) => part.text).join("\n");
400
- }
401
- function messageText(value) {
402
- if (typeof value === "string")
403
- return value;
404
- if (!Array.isArray(value))
405
- return "";
406
- return value.filter(isRecord).flatMap((part) => {
407
- if (part.type === "text" && typeof part.text === "string")
408
- return [part.text];
409
- if (part.type === "image") {
410
- const mimeType = typeof part.mimeType === "string" ? part.mimeType : "image/unknown";
411
- const encodedBytes = typeof part.encodedBytes === "number" ? `; ${formatBytes(part.encodedBytes)} encoded` : "";
412
- return [`[Image data omitted from retained subagent report: ${mimeType}${encodedBytes}]`];
413
- }
414
- return [];
415
- }).join("\n");
416
- }
417
- function formatBytes(bytes) {
418
- if (bytes < 1024)
419
- return `${bytes} B`;
420
- if (bytes < 1024 * 1024)
421
- return `${(bytes / 1024).toFixed(1)} KiB`;
422
- return `${(bytes / (1024 * 1024)).toFixed(2)} MiB`;
423
- }
424
- function usageText(report) {
425
- const usage = report.usage;
426
- const retention = report.retention.truncated ? ` · ${report.retention.omittedMessages} transcript message${report.retention.omittedMessages === 1 ? "" : "s"} omitted` : "";
427
- return `${usage.turns} turn${usage.turns === 1 ? "" : "s"} · ${usage.input} input · ${usage.output} output · ${usage.totalTokens} total · $${usage.cost.toFixed(4)}${retention}`;
428
- }
429
- function approvalText(approval) {
430
- if (!approval.approved)
431
- return approval.required ? "not approved" : "not executed";
432
- if (approval.source === "trusted-project-config")
433
- return "per-run approval bypassed by trusted-project config";
434
- return `approved${approval.viewedFullPrompt ? " after full-prompt review" : ""}`;
435
- }
436
- function indent(text) {
437
- return text.split("\n").map((line) => ` ${line}`).join("\n");
438
- }
439
- function truncate(text, maxChars) {
440
- return text.length <= maxChars ? text : `${text.slice(0, Math.max(0, maxChars - 3))}...`;
441
- }
442
- function oneLinePreview(text, maxChars) {
443
- return truncate(text.replace(/\s+/g, " ").trim(), maxChars);
444
- }
445
- function compactIdentifier(value, maxChars) {
446
- if (value.length <= maxChars)
447
- return value;
448
- const visibleChars = Math.max(2, maxChars - 3);
449
- const startChars = Math.ceil(visibleChars / 2);
450
- const endChars = Math.floor(visibleChars / 2);
451
- return `${value.slice(0, startChars)}...${value.slice(-endChars)}`;
452
- }
453
- function truncateLines(text, maxLines, maxChars) {
454
- return truncate(text.split("\n").slice(0, maxLines).join("\n"), maxChars);
455
- }
456
- //# sourceMappingURL=subagent-tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent-tool.js","sourceRoot":"","sources":["../src/subagent-tool.ts"],"names":[],"mappings":"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"}
@@ -1,47 +0,0 @@
1
- # Importing SillyTavern presets
2
-
3
- [Documentation](../README.md)
4
-
5
- Import through the command line:
6
-
7
- ```text
8
- /preset import-silly ~/SillyTavern/presets/my-preset.json
9
- ```
10
-
11
- Use `--dry-run` to preview, `--overwrite` to replace protected output, and an optional `character_id` when the preset contains multiple prompt orders. The web editor also accepts SillyTavern JSON and asks which character order to use when necessary.
12
-
13
- Generated stacks go to `.pi/forge/prompt-stacks/<id>.json`; reports go to `.pi/forge/import-reports/<id>.md`. Always read the report before activating the stack.
14
-
15
- ## Converted behavior
16
-
17
- The importer:
18
-
19
- - converts prompt order into ordered stack items;
20
- - maps the chat-history marker to a movable `chat-history` slot;
21
- - detects `{{lastUserMessage}}` and avoids duplicating the latest user turn;
22
- - carries relevant identifiers in `source.sillytavern` metadata;
23
- - maps deterministic `promptOnly` regex scripts to history-stage outgoing rules when their behavior is representable;
24
- - converts full-match replacement syntax and preserves trim strings, depth limits, and supported user/assistant placement.
25
-
26
- ## Report-only behavior
27
-
28
- The following require manual review and are not executed:
29
-
30
- - display-only or mixed prompt/display scripts;
31
- - DOM, browser, CSS, HTML-decoration, or JavaScript behavior;
32
- - unsupported placements or invalid regular expressions;
33
- - markers with no pi-forge equivalent;
34
- - SillyTavern features whose ordering or lifecycle cannot be represented safely.
35
-
36
- pi-forge does not embed arbitrary executable preset code. Unsupported content stays visible in the migration report instead of being silently approximated.
37
-
38
- ## Recommended workflow
39
-
40
- 1. Run a dry import.
41
- 2. Read every warning and omission in the report.
42
- 3. Open the generated stack in `/preset ui`.
43
- 4. Validate it and inspect the full preview.
44
- 5. Compare the history placement and regex rules with the original preset.
45
- 6. Activate it only after the preview matches your intent.
46
-
47
- See [stack schema](../reference/stack-schema.md#regex-transforms) for the supported regex runtime.