@zihanw/pi-forge 0.4.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/CHANGELOG.md +79 -1
  2. package/README.md +12 -11
  3. package/README.zh-CN.md +3 -5
  4. package/SUBAGENT_ADAPTER_CONTRACT.md +3 -1
  5. package/dist/agent-profile.d.ts +18 -62
  6. package/dist/agent-profile.d.ts.map +1 -1
  7. package/dist/agent-profile.js +27 -249
  8. package/dist/agent-profile.js.map +1 -1
  9. package/dist/codecs/agent-profile.d.ts +53 -0
  10. package/dist/codecs/agent-profile.d.ts.map +1 -0
  11. package/dist/codecs/agent-profile.js +176 -0
  12. package/dist/codecs/agent-profile.js.map +1 -0
  13. package/dist/codecs/index.d.ts +5 -0
  14. package/dist/codecs/index.d.ts.map +1 -0
  15. package/dist/codecs/index.js +3 -0
  16. package/dist/codecs/index.js.map +1 -0
  17. package/dist/codecs/prompt-stack.d.ts +18 -0
  18. package/dist/codecs/prompt-stack.d.ts.map +1 -0
  19. package/dist/codecs/prompt-stack.js +479 -0
  20. package/dist/codecs/prompt-stack.js.map +1 -0
  21. package/dist/compile-cycle.d.ts +18 -0
  22. package/dist/compile-cycle.d.ts.map +1 -0
  23. package/dist/compile-cycle.js +13 -0
  24. package/dist/compile-cycle.js.map +1 -0
  25. package/dist/compiler.d.ts +10 -4
  26. package/dist/compiler.d.ts.map +1 -1
  27. package/dist/compiler.js +53 -19
  28. package/dist/compiler.js.map +1 -1
  29. package/dist/context-diff-history.d.ts +61 -0
  30. package/dist/context-diff-history.d.ts.map +1 -0
  31. package/dist/context-diff-history.js +84 -0
  32. package/dist/context-diff-history.js.map +1 -0
  33. package/dist/context-diff-snapshot.d.ts +19 -0
  34. package/dist/context-diff-snapshot.d.ts.map +1 -0
  35. package/dist/context-diff-snapshot.js +146 -0
  36. package/dist/context-diff-snapshot.js.map +1 -0
  37. package/dist/context-diff.d.ts +70 -0
  38. package/dist/context-diff.d.ts.map +1 -0
  39. package/dist/context-diff.js +259 -0
  40. package/dist/context-diff.js.map +1 -0
  41. package/dist/extension-registry.d.ts.map +1 -1
  42. package/dist/extension-registry.js +5 -2
  43. package/dist/extension-registry.js.map +1 -1
  44. package/dist/forge-config.d.ts +0 -105
  45. package/dist/forge-config.d.ts.map +1 -1
  46. package/dist/forge-config.js +1 -313
  47. package/dist/forge-config.js.map +1 -1
  48. package/dist/forge-v1/analyzer.d.ts +3 -0
  49. package/dist/forge-v1/analyzer.d.ts.map +1 -0
  50. package/dist/forge-v1/analyzer.js +50 -0
  51. package/dist/forge-v1/analyzer.js.map +1 -0
  52. package/dist/forge-v1/index.d.ts +6 -0
  53. package/dist/forge-v1/index.d.ts.map +1 -0
  54. package/dist/forge-v1/index.js +13 -0
  55. package/dist/forge-v1/index.js.map +1 -0
  56. package/dist/forge-v1/parser.d.ts +3 -0
  57. package/dist/forge-v1/parser.d.ts.map +1 -0
  58. package/dist/forge-v1/parser.js +186 -0
  59. package/dist/forge-v1/parser.js.map +1 -0
  60. package/dist/forge-v1/renderer.d.ts +9 -0
  61. package/dist/forge-v1/renderer.d.ts.map +1 -0
  62. package/dist/forge-v1/renderer.js +181 -0
  63. package/dist/forge-v1/renderer.js.map +1 -0
  64. package/dist/forge-v1/types.d.ts +87 -0
  65. package/dist/forge-v1/types.d.ts.map +1 -0
  66. package/dist/forge-v1/types.js +4 -0
  67. package/dist/forge-v1/types.js.map +1 -0
  68. package/dist/index.d.ts +12 -12
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +54 -83
  71. package/dist/index.js.map +1 -1
  72. package/dist/lifecycle.d.ts +8 -5
  73. package/dist/lifecycle.d.ts.map +1 -1
  74. package/dist/lifecycle.js +45 -112
  75. package/dist/lifecycle.js.map +1 -1
  76. package/dist/loader.d.ts +5 -8
  77. package/dist/loader.d.ts.map +1 -1
  78. package/dist/loader.js +10 -467
  79. package/dist/loader.js.map +1 -1
  80. package/dist/macro-engine.d.ts +9 -14
  81. package/dist/macro-engine.d.ts.map +1 -1
  82. package/dist/macro-engine.js +5 -238
  83. package/dist/macro-engine.js.map +1 -1
  84. package/dist/payload-capture.d.ts +10 -0
  85. package/dist/payload-capture.d.ts.map +1 -1
  86. package/dist/payload-capture.js +39 -9
  87. package/dist/payload-capture.js.map +1 -1
  88. package/dist/payload-command.d.ts +8 -6
  89. package/dist/payload-command.d.ts.map +1 -1
  90. package/dist/payload-command.js +36 -6
  91. package/dist/payload-command.js.map +1 -1
  92. package/dist/payload-state.d.ts +19 -0
  93. package/dist/payload-state.d.ts.map +1 -0
  94. package/dist/payload-state.js +19 -0
  95. package/dist/payload-state.js.map +1 -0
  96. package/dist/preset-command.d.ts +4 -4
  97. package/dist/preset-command.d.ts.map +1 -1
  98. package/dist/preset-command.js +33 -104
  99. package/dist/preset-command.js.map +1 -1
  100. package/dist/preview.d.ts +4 -4
  101. package/dist/preview.d.ts.map +1 -1
  102. package/dist/preview.js +34 -11
  103. package/dist/preview.js.map +1 -1
  104. package/dist/profile-command.d.ts +2 -2
  105. package/dist/profile-command.d.ts.map +1 -1
  106. package/dist/profile-command.js +15 -14
  107. package/dist/profile-command.js.map +1 -1
  108. package/dist/profile-service.d.ts.map +1 -1
  109. package/dist/profile-service.js +23 -39
  110. package/dist/profile-service.js.map +1 -1
  111. package/dist/prompt-analysis.d.ts +24 -0
  112. package/dist/prompt-analysis.d.ts.map +1 -0
  113. package/dist/prompt-analysis.js +84 -0
  114. package/dist/prompt-analysis.js.map +1 -0
  115. package/dist/prompt-runtime.d.ts +19 -0
  116. package/dist/prompt-runtime.d.ts.map +1 -0
  117. package/dist/prompt-runtime.js +30 -0
  118. package/dist/prompt-runtime.js.map +1 -0
  119. package/dist/regex.js +6 -12
  120. package/dist/regex.js.map +1 -1
  121. package/dist/render-helpers.d.ts +2 -10
  122. package/dist/render-helpers.d.ts.map +1 -1
  123. package/dist/render-helpers.js +3 -53
  124. package/dist/render-helpers.js.map +1 -1
  125. package/dist/repositories/agent-profile.d.ts +36 -0
  126. package/dist/repositories/agent-profile.d.ts.map +1 -0
  127. package/dist/repositories/agent-profile.js +153 -0
  128. package/dist/repositories/agent-profile.js.map +1 -0
  129. package/dist/repositories/index.d.ts +3 -0
  130. package/dist/repositories/index.d.ts.map +1 -0
  131. package/dist/repositories/index.js +3 -0
  132. package/dist/repositories/index.js.map +1 -0
  133. package/dist/repositories/prompt-stack.d.ts +57 -0
  134. package/dist/repositories/prompt-stack.d.ts.map +1 -0
  135. package/dist/repositories/prompt-stack.js +175 -0
  136. package/dist/repositories/prompt-stack.js.map +1 -0
  137. package/dist/runtime/profile-runtime.d.ts +2 -2
  138. package/dist/runtime/profile-runtime.d.ts.map +1 -1
  139. package/dist/runtime/profile-runtime.js +13 -10
  140. package/dist/runtime/profile-runtime.js.map +1 -1
  141. package/dist/runtime/prompt-stack-runtime.d.ts +4 -3
  142. package/dist/runtime/prompt-stack-runtime.d.ts.map +1 -1
  143. package/dist/runtime/prompt-stack-runtime.js +42 -57
  144. package/dist/runtime/prompt-stack-runtime.js.map +1 -1
  145. package/dist/runtime/tool-policy-runtime.d.ts +2 -2
  146. package/dist/runtime/tool-policy-runtime.d.ts.map +1 -1
  147. package/dist/runtime/tool-policy-runtime.js +16 -6
  148. package/dist/runtime/tool-policy-runtime.js.map +1 -1
  149. package/dist/runtime/web-editor-runtime.d.ts +2 -1
  150. package/dist/runtime/web-editor-runtime.d.ts.map +1 -1
  151. package/dist/runtime/web-editor-runtime.js +8 -3
  152. package/dist/runtime/web-editor-runtime.js.map +1 -1
  153. package/dist/session-adapter.d.ts +17 -0
  154. package/dist/session-adapter.d.ts.map +1 -0
  155. package/dist/session-adapter.js +57 -0
  156. package/dist/session-adapter.js.map +1 -0
  157. package/dist/slot-renderers.d.ts +16 -3
  158. package/dist/slot-renderers.d.ts.map +1 -1
  159. package/dist/slot-renderers.js +15 -63
  160. package/dist/slot-renderers.js.map +1 -1
  161. package/dist/stack-migration.d.ts +6 -0
  162. package/dist/stack-migration.d.ts.map +1 -1
  163. package/dist/stack-migration.js +49 -52
  164. package/dist/stack-migration.js.map +1 -1
  165. package/dist/subagent/fingerprints.d.ts +24 -0
  166. package/dist/subagent/fingerprints.d.ts.map +1 -0
  167. package/dist/subagent/fingerprints.js +81 -0
  168. package/dist/subagent/fingerprints.js.map +1 -0
  169. package/dist/subagent/host-port.d.ts +296 -0
  170. package/dist/subagent/host-port.d.ts.map +1 -0
  171. package/dist/subagent/host-port.js +560 -0
  172. package/dist/subagent/host-port.js.map +1 -0
  173. package/dist/subagent/index.d.ts +10 -10
  174. package/dist/subagent/index.d.ts.map +1 -1
  175. package/dist/subagent/index.js +9 -10
  176. package/dist/subagent/index.js.map +1 -1
  177. package/dist/subagent-host.d.ts +99 -18
  178. package/dist/subagent-host.d.ts.map +1 -1
  179. package/dist/subagent-host.js +143 -146
  180. package/dist/subagent-host.js.map +1 -1
  181. package/dist/template-render.d.ts +18 -0
  182. package/dist/template-render.d.ts.map +1 -0
  183. package/dist/template-render.js +232 -0
  184. package/dist/template-render.js.map +1 -0
  185. package/dist/types.d.ts +40 -27
  186. package/dist/types.d.ts.map +1 -1
  187. package/dist/types.js.map +1 -1
  188. package/dist/ui-contribution/contrib-port.d.ts +170 -0
  189. package/dist/ui-contribution/contrib-port.d.ts.map +1 -0
  190. package/dist/ui-contribution/contrib-port.js +640 -0
  191. package/dist/ui-contribution/contrib-port.js.map +1 -0
  192. package/dist/ui-contribution/index.d.ts +3 -0
  193. package/dist/ui-contribution/index.d.ts.map +1 -0
  194. package/dist/ui-contribution/index.js +2 -0
  195. package/dist/ui-contribution/index.js.map +1 -0
  196. package/dist/web-editor/client-script.generated.d.ts.map +1 -1
  197. package/dist/web-editor/client-script.generated.js +1 -1
  198. package/dist/web-editor/client-script.generated.js.map +1 -1
  199. package/dist/web-editor/client-styles.generated.d.ts.map +1 -1
  200. package/dist/web-editor/client-styles.generated.js +1 -1
  201. package/dist/web-editor/client-styles.generated.js.map +1 -1
  202. package/dist/web-editor/contrib-service.d.ts +41 -0
  203. package/dist/web-editor/contrib-service.d.ts.map +1 -0
  204. package/dist/web-editor/contrib-service.js +174 -0
  205. package/dist/web-editor/contrib-service.js.map +1 -0
  206. package/dist/web-editor/line-diff.d.ts +28 -0
  207. package/dist/web-editor/line-diff.d.ts.map +1 -0
  208. package/dist/web-editor/line-diff.js +216 -0
  209. package/dist/web-editor/line-diff.js.map +1 -0
  210. package/dist/web-editor/schema-form.d.ts +63 -0
  211. package/dist/web-editor/schema-form.d.ts.map +1 -0
  212. package/dist/web-editor/schema-form.js +213 -0
  213. package/dist/web-editor/schema-form.js.map +1 -0
  214. package/dist/web-editor/server.d.ts.map +1 -1
  215. package/dist/web-editor/server.js +72 -74
  216. package/dist/web-editor/server.js.map +1 -1
  217. package/dist/web-editor/styles.d.ts.map +1 -1
  218. package/dist/web-editor/styles.js +201 -21
  219. package/dist/web-editor/styles.js.map +1 -1
  220. package/dist/web-editor/types.d.ts +12 -35
  221. package/dist/web-editor/types.d.ts.map +1 -1
  222. package/dist/web-host.d.ts +6 -2
  223. package/dist/web-host.d.ts.map +1 -1
  224. package/dist/web-host.js +33 -103
  225. package/dist/web-host.js.map +1 -1
  226. package/dist/workspace.d.ts +74 -0
  227. package/dist/workspace.d.ts.map +1 -0
  228. package/dist/workspace.js +351 -0
  229. package/dist/workspace.js.map +1 -0
  230. package/docs/README.md +7 -4
  231. package/docs/concepts/agent-profiles.md +1 -1
  232. package/docs/concepts/prompt-stacks.md +5 -5
  233. package/docs/design/0.5.1-plan.md +237 -0
  234. package/docs/design/README.md +21 -3
  235. package/docs/design/architecture-0.5.md +222 -0
  236. package/docs/design/archive/0.5-full-proposal/0.5-consumer-audit.md +62 -0
  237. package/docs/design/archive/0.5-full-proposal/0.5-inventory.md +208 -0
  238. package/docs/design/archive/0.5-full-proposal/0.5-phase0-decision-drafts.md +237 -0
  239. package/docs/design/archive/0.5-full-proposal/README.md +12 -0
  240. package/docs/design/archive/0.5-full-proposal/architecture-0.5.md +423 -0
  241. package/docs/design/archive/0.5-full-proposal/host-discovery-spike.md +103 -0
  242. package/docs/design/archive/0.5-full-proposal/template-language-spike.md +156 -0
  243. package/docs/design/context-diff-plan.md +78 -0
  244. package/docs/design/decision-template.md +33 -0
  245. package/docs/design/roadmap-0.4-archive.md +1 -1
  246. package/docs/design/subagents/interface-design.md +1 -1
  247. package/docs/development/architecture-rules.md +148 -0
  248. package/docs/development/release.md +7 -1
  249. package/docs/development/roadmap.md +37 -5
  250. package/docs/development/scoped-global-profiles-stacks.md +1 -1
  251. package/docs/development/setup.md +6 -4
  252. package/docs/getting-started.md +5 -4
  253. package/docs/guides/custom-macros-and-slots.md +8 -7
  254. package/docs/guides/debugging.md +1 -1
  255. package/docs/guides/delegation.md +18 -22
  256. package/docs/guides/migrating-to-0.5.md +107 -0
  257. package/docs/guides/use-cases.md +7 -11
  258. package/docs/guides/web-editor.md +6 -10
  259. package/docs/reference/commands.md +4 -3
  260. package/docs/reference/configuration.md +17 -18
  261. package/docs/reference/features.md +34 -80
  262. package/docs/reference/macros-and-slots.md +70 -49
  263. package/docs/reference/public-api.md +76 -17
  264. package/docs/reference/stack-schema.md +15 -10
  265. package/docs/reference/subagent-host-port.md +49 -0
  266. package/docs/reference/ui-contribution-port.md +51 -0
  267. package/docs/zh-CN/README.md +3 -3
  268. package/docs/zh-CN/concepts/agent-profiles.md +1 -1
  269. package/docs/zh-CN/concepts/prompt-stacks.md +5 -5
  270. package/docs/zh-CN/getting-started.md +3 -2
  271. package/docs/zh-CN/guides/delegation.md +10 -12
  272. package/docs/zh-CN/guides/migrating-to-0.5.md +92 -0
  273. package/docs/zh-CN/guides/web-editor.md +4 -4
  274. package/docs/zh-CN/reference/commands.md +3 -2
  275. package/examples/custom-system-status-extension/README.md +3 -3
  276. package/examples/custom-system-status-extension/index.ts +2 -1
  277. package/examples/custom-system-status-extension/prompt-stack.json +4 -3
  278. package/examples/default-prompt-stack.json +9 -4
  279. package/examples/image-reader-prompt-stack.json +16 -26
  280. package/examples/reviewer-prompt-stack.json +13 -24
  281. package/package.json +106 -120
  282. package/dist/runtime/subagent-runtime.d.ts +0 -45
  283. package/dist/runtime/subagent-runtime.d.ts.map +0 -1
  284. package/dist/runtime/subagent-runtime.js +0 -343
  285. package/dist/runtime/subagent-runtime.js.map +0 -1
  286. package/dist/runtime-state.d.ts +0 -30
  287. package/dist/runtime-state.d.ts.map +0 -1
  288. package/dist/runtime-state.js +0 -17
  289. package/dist/runtime-state.js.map +0 -1
  290. package/dist/sillytavern-importer/items.d.ts +0 -3
  291. package/dist/sillytavern-importer/items.d.ts.map +0 -1
  292. package/dist/sillytavern-importer/items.js +0 -88
  293. package/dist/sillytavern-importer/items.js.map +0 -1
  294. package/dist/sillytavern-importer/macros.d.ts +0 -15
  295. package/dist/sillytavern-importer/macros.d.ts.map +0 -1
  296. package/dist/sillytavern-importer/macros.js +0 -141
  297. package/dist/sillytavern-importer/macros.js.map +0 -1
  298. package/dist/sillytavern-importer/prompt-order.d.ts +0 -6
  299. package/dist/sillytavern-importer/prompt-order.d.ts.map +0 -1
  300. package/dist/sillytavern-importer/prompt-order.js +0 -38
  301. package/dist/sillytavern-importer/prompt-order.js.map +0 -1
  302. package/dist/sillytavern-importer/regex.d.ts +0 -3
  303. package/dist/sillytavern-importer/regex.d.ts.map +0 -1
  304. package/dist/sillytavern-importer/regex.js +0 -275
  305. package/dist/sillytavern-importer/regex.js.map +0 -1
  306. package/dist/sillytavern-importer/report.d.ts +0 -21
  307. package/dist/sillytavern-importer/report.d.ts.map +0 -1
  308. package/dist/sillytavern-importer/report.js +0 -166
  309. package/dist/sillytavern-importer/report.js.map +0 -1
  310. package/dist/sillytavern-importer/types.d.ts +0 -106
  311. package/dist/sillytavern-importer/types.d.ts.map +0 -1
  312. package/dist/sillytavern-importer/types.js +0 -2
  313. package/dist/sillytavern-importer/types.js.map +0 -1
  314. package/dist/sillytavern-importer.d.ts +0 -5
  315. package/dist/sillytavern-importer.d.ts.map +0 -1
  316. package/dist/sillytavern-importer.js +0 -117
  317. package/dist/sillytavern-importer.js.map +0 -1
  318. package/dist/subagent/canonical.d.ts +0 -22
  319. package/dist/subagent/canonical.d.ts.map +0 -1
  320. package/dist/subagent/canonical.js +0 -24
  321. package/dist/subagent/canonical.js.map +0 -1
  322. package/dist/subagent/context.d.ts +0 -8
  323. package/dist/subagent/context.d.ts.map +0 -1
  324. package/dist/subagent/context.js +0 -125
  325. package/dist/subagent/context.js.map +0 -1
  326. package/dist/subagent/contract.d.ts +0 -10
  327. package/dist/subagent/contract.d.ts.map +0 -1
  328. package/dist/subagent/contract.js +0 -10
  329. package/dist/subagent/contract.js.map +0 -1
  330. package/dist/subagent/plan.d.ts +0 -18
  331. package/dist/subagent/plan.d.ts.map +0 -1
  332. package/dist/subagent/plan.js +0 -157
  333. package/dist/subagent/plan.js.map +0 -1
  334. package/dist/subagent/preflight.d.ts +0 -4
  335. package/dist/subagent/preflight.d.ts.map +0 -1
  336. package/dist/subagent/preflight.js +0 -108
  337. package/dist/subagent/preflight.js.map +0 -1
  338. package/dist/subagent/request.d.ts +0 -4
  339. package/dist/subagent/request.d.ts.map +0 -1
  340. package/dist/subagent/request.js +0 -154
  341. package/dist/subagent/request.js.map +0 -1
  342. package/dist/subagent/response.d.ts +0 -8
  343. package/dist/subagent/response.d.ts.map +0 -1
  344. package/dist/subagent/response.js +0 -155
  345. package/dist/subagent/response.js.map +0 -1
  346. package/dist/subagent/tools.d.ts +0 -4
  347. package/dist/subagent/tools.d.ts.map +0 -1
  348. package/dist/subagent/tools.js +0 -42
  349. package/dist/subagent/tools.js.map +0 -1
  350. package/dist/subagent/types.d.ts +0 -272
  351. package/dist/subagent/types.d.ts.map +0 -1
  352. package/dist/subagent/types.js +0 -3
  353. package/dist/subagent/types.js.map +0 -1
  354. package/dist/subagent/validation.d.ts +0 -35
  355. package/dist/subagent/validation.d.ts.map +0 -1
  356. package/dist/subagent/validation.js +0 -314
  357. package/dist/subagent/validation.js.map +0 -1
  358. package/dist/subagent-command.d.ts +0 -5
  359. package/dist/subagent-command.d.ts.map +0 -1
  360. package/dist/subagent-command.js +0 -249
  361. package/dist/subagent-command.js.map +0 -1
  362. package/dist/subagent-profile-tool.d.ts +0 -49
  363. package/dist/subagent-profile-tool.d.ts.map +0 -1
  364. package/dist/subagent-profile-tool.js +0 -125
  365. package/dist/subagent-profile-tool.js.map +0 -1
  366. package/dist/subagent-tool.d.ts +0 -77
  367. package/dist/subagent-tool.d.ts.map +0 -1
  368. package/dist/subagent-tool.js +0 -559
  369. package/dist/subagent-tool.js.map +0 -1
  370. package/docs/guides/sillytavern-import.md +0 -47
  371. package/docs/reference/subagent-adapter.md +0 -204
  372. package/examples/sillytavern-dm-writer-prompt-stack.json +0 -190
@@ -0,0 +1,351 @@
1
+ import { createResourceCatalog } from "./catalog.js";
2
+ import { hasAgentProfileErrors } from "./agent-profile.js";
3
+ import { readAgentProfilesScoped, readGlobalAgentProfiles } from "./repositories/agent-profile.js";
4
+ import { readGlobalPromptStacks, readPromptStacksScoped } from "./repositories/prompt-stack.js";
5
+ import { chooseDefaultStack, isDisabledPromptStackId } from "./loader.js";
6
+ import { formatResourceKey, parseResourceSelector } from "./resource-identity.js";
7
+ import { createForgeExtensionState, reloadForgeExtensions, unloadForgeExtensions } from "./forge-extensions.js";
8
+ import { validateListProfilesRequest, validatePrepareRequest, validatePrepareResponse, validateResolveProfileRequest, validateResolveProfileResponse, ForgeHost, } from "./subagent/host-port.js";
9
+ import { currentSubagentPromptRegistrationCatalog, prepareForgeDelegation, resolveSubagentHostProfile, } from "./subagent-host.js";
10
+ /**
11
+ * Single owner of the Forge resource graph.
12
+ *
13
+ * Owns one coherent, deep-frozen snapshot containing stacks, profiles, active
14
+ * selection, profile provenance, and extension lifecycle state. All readers
15
+ * (commands, web UI, lifecycle, tool policy, preview, host port) consume
16
+ * `snapshot()` instead of separate mutable bags.
17
+ */
18
+ export class ForgeWorkspace {
19
+ extensionState = createForgeExtensionState();
20
+ current;
21
+ host;
22
+ get snapshotKnown() {
23
+ return this.current !== undefined;
24
+ }
25
+ reload(cwd, options = {}) {
26
+ const trusted = options.trusted !== false;
27
+ const stacks = trusted ? readPromptStacksScoped(cwd) : readGlobalPromptStacks();
28
+ if (this.extensionDiagnostics.length > 0) {
29
+ for (const loaded of stacks)
30
+ loaded.diagnostics.unshift(...this.extensionDiagnostics);
31
+ }
32
+ const profiles = trusted ? readAgentProfilesScoped(cwd) : readGlobalAgentProfiles();
33
+ const active = this.resolveActive(stacks, options);
34
+ const activeStackId = active ? formatResourceKey(active.key) : (options.activeStackId != null && isDisabledPromptStackId(options.activeStackId) ? "none" : null);
35
+ const snapshot = {
36
+ cwd,
37
+ stacks,
38
+ profiles,
39
+ activeStackId,
40
+ active,
41
+ lastAppliedProfile: options.lastAppliedProfile ?? this.current?.lastAppliedProfile,
42
+ extensionDiagnostics: this.extensionDiagnostics,
43
+ extensionPaths: this.extensionPaths,
44
+ capturedAt: new Date().toISOString(),
45
+ };
46
+ this.current = deepFreeze(structuredClone(snapshot));
47
+ return this.current;
48
+ }
49
+ reloadProfiles(cwd, trusted = true) {
50
+ if (!this.current)
51
+ throw new Error("ForgeWorkspace has not been reloaded.");
52
+ const profiles = trusted ? readAgentProfilesScoped(cwd) : readGlobalAgentProfiles();
53
+ return this.publish({
54
+ ...this.current,
55
+ profiles,
56
+ capturedAt: new Date().toISOString(),
57
+ });
58
+ }
59
+ async loadExtensions(cwd) {
60
+ const result = await reloadForgeExtensions(cwd, this.extensionState);
61
+ this.extensionDiagnostics = result.diagnostics;
62
+ this.extensionPaths = result.loadedPaths;
63
+ return result;
64
+ }
65
+ disposeExtensions() {
66
+ const diagnostics = unloadForgeExtensions(this.extensionState);
67
+ this.extensionDiagnostics = diagnostics;
68
+ this.extensionPaths = [];
69
+ return diagnostics;
70
+ }
71
+ setActiveStack(id) {
72
+ if (!this.current)
73
+ return false;
74
+ if (!id || isDisabledPromptStackId(id)) {
75
+ this.publish({
76
+ ...this.current,
77
+ activeStackId: "none",
78
+ active: undefined,
79
+ capturedAt: new Date().toISOString(),
80
+ });
81
+ return true;
82
+ }
83
+ const parsed = parseResourceSelector(id);
84
+ if (!parsed.ok)
85
+ return false;
86
+ const found = createResourceCatalog([...this.current.stacks]).resolveSelector(parsed.selector);
87
+ if (!found)
88
+ return false;
89
+ this.publish({
90
+ ...this.current,
91
+ activeStackId: formatResourceKey(found.key),
92
+ active: found,
93
+ capturedAt: new Date().toISOString(),
94
+ });
95
+ return true;
96
+ }
97
+ setLastAppliedProfile(profile) {
98
+ if (!this.current)
99
+ throw new Error("ForgeWorkspace has not been reloaded.");
100
+ this.publish({
101
+ ...this.current,
102
+ lastAppliedProfile: profile,
103
+ capturedAt: new Date().toISOString(),
104
+ });
105
+ }
106
+ // Read/write view used by profile-service's AgentProfileApplicationState.
107
+ get active() {
108
+ return this.current?.active;
109
+ }
110
+ set active(value) {
111
+ if (!value) {
112
+ this.setActiveStack(undefined);
113
+ return;
114
+ }
115
+ if (!this.current)
116
+ throw new Error("ForgeWorkspace has not been reloaded.");
117
+ this.publish({
118
+ ...this.current,
119
+ activeStackId: formatResourceKey(value.key),
120
+ active: value,
121
+ capturedAt: new Date().toISOString(),
122
+ });
123
+ }
124
+ get lastAppliedProfile() {
125
+ return this.current?.lastAppliedProfile;
126
+ }
127
+ set lastAppliedProfile(value) {
128
+ this.setLastAppliedProfile(value);
129
+ }
130
+ snapshot() {
131
+ if (!this.current)
132
+ throw new Error("ForgeWorkspace has not been reloaded.");
133
+ return this.current;
134
+ }
135
+ /**
136
+ * Register the host port for the current snapshot. Idempotent: the host is
137
+ * only started once the first snapshot exists, so `available` never implies
138
+ * an unloaded workspace. On reload the live host is kept (its generation
139
+ * only changes via dispose).
140
+ */
141
+ startHostPort(transport) {
142
+ if (!this.current)
143
+ throw new Error("ForgeWorkspace must be reloaded before starting the host port.");
144
+ if (this.host?.isLive)
145
+ return this.host;
146
+ const host = new ForgeHost(transport, {
147
+ capabilities: ["listProfiles", "resolveProfile", "prepare"],
148
+ handle: (operation, payload) => this.operate(operation, payload),
149
+ });
150
+ this.host = host;
151
+ host.start();
152
+ return host;
153
+ }
154
+ /** Invoke the minimal-operation surface against the current snapshot. */
155
+ operate(operation, payload) {
156
+ if (operation === "listProfiles")
157
+ return this.listProfiles(payload);
158
+ if (operation === "resolveProfile")
159
+ return this.resolveProfile(payload);
160
+ if (operation === "prepare")
161
+ return this.prepare(payload);
162
+ return { ok: false, error: `Unknown Forge host operation: ${operation}` };
163
+ }
164
+ listProfiles(payload) {
165
+ const validated = validateListProfilesRequest(payload);
166
+ if (!validated.ok)
167
+ return { ok: false, error: validated.error };
168
+ try {
169
+ const snapshot = this.snapshot();
170
+ return {
171
+ ok: true,
172
+ data: {
173
+ profiles: snapshot.profiles.map((loaded) => stripUndefined({
174
+ profileId: loaded.profile.id,
175
+ scope: loaded.scope,
176
+ name: loaded.profile.name,
177
+ description: loaded.profile.description,
178
+ autoActivate: loaded.profile.autoActivate,
179
+ model: { provider: loaded.profile.model.provider, id: loaded.profile.model.id },
180
+ thinkingLevel: loaded.profile.thinkingLevel,
181
+ promptStack: loaded.profile.promptStack,
182
+ usable: !hasAgentProfileErrors(loaded.diagnostics),
183
+ diagnostics: loaded.diagnostics,
184
+ })),
185
+ },
186
+ };
187
+ }
188
+ catch (error) {
189
+ return { ok: false, error: `listProfiles failed: ${error instanceof Error ? error.message : String(error)}` };
190
+ }
191
+ }
192
+ resolveProfile(payload) {
193
+ const validated = validateResolveProfileRequest(payload);
194
+ if (!validated.ok)
195
+ return { ok: false, error: validated.error };
196
+ const request = validated.data;
197
+ try {
198
+ const snapshot = this.resolveProfilePlan(request.profile);
199
+ const response = { snapshot };
200
+ const responseValidated = validateResolveProfileResponse(stripUndefined(response));
201
+ if (!responseValidated.ok)
202
+ return { ok: false, error: responseValidated.error };
203
+ return { ok: true, data: stripUndefined(response) };
204
+ }
205
+ catch (error) {
206
+ return { ok: false, error: `resolveProfile failed: ${error instanceof Error ? error.message : String(error)}` };
207
+ }
208
+ }
209
+ /** Host-owned profile resolution returns the immutable profile snapshot artifact. */
210
+ resolveProfilePlan(profile) {
211
+ const snapshot = this.snapshot();
212
+ const parsed = parseResourceSelector(profile);
213
+ if (!parsed.ok)
214
+ throw new Error(`Invalid profile selector ${profile}: ${parsed.error}`);
215
+ const loaded = createResourceCatalog([...snapshot.profiles]).resolveSelector(parsed.selector);
216
+ if (!loaded)
217
+ throw new Error(`Unknown profile: ${profile}`);
218
+ if (hasAgentProfileErrors(loaded.diagnostics))
219
+ throw new Error(`Profile ${profile} failed loading validation.`);
220
+ const resolved = resolveSubagentHostProfile(loaded, {
221
+ promptStacks: snapshot.stacks,
222
+ registrations: currentSubagentPromptRegistrationCatalog(),
223
+ });
224
+ if (!resolved.snapshot)
225
+ throw new Error(`Profile ${profile} could not be resolved.`);
226
+ return resolved.snapshot;
227
+ }
228
+ prepare(payload) {
229
+ const validated = validatePrepareRequest(payload);
230
+ if (!validated.ok)
231
+ return { ok: false, error: validated.error };
232
+ const request = validated.data;
233
+ let response;
234
+ try {
235
+ response = stripUndefined(this.preparePlan(request));
236
+ }
237
+ catch (error) {
238
+ return { ok: false, error: `Prepare failed: ${error instanceof Error ? error.message : String(error)}` };
239
+ }
240
+ const responseValidated = validatePrepareResponse(response);
241
+ if (!responseValidated.ok)
242
+ return { ok: false, error: responseValidated.error };
243
+ return { ok: true, data: response };
244
+ }
245
+ /** Host owns profile/stack resolution and prompt compilation. */
246
+ preparePlan(request) {
247
+ const snapshot = this.snapshot();
248
+ const parsed = parseResourceSelector(request.profile);
249
+ if (!parsed.ok)
250
+ throw new Error(`Invalid profile selector ${request.profile}: ${parsed.error}`);
251
+ const loaded = createResourceCatalog([...snapshot.profiles]).resolveSelector(parsed.selector);
252
+ if (!loaded)
253
+ throw new Error(`Unknown profile: ${request.profile}`);
254
+ if (hasAgentProfileErrors(loaded.diagnostics))
255
+ throw new Error(`Profile ${request.profile} failed loading validation.`);
256
+ const resolved = resolveSubagentHostProfile(loaded, {
257
+ promptStacks: snapshot.stacks,
258
+ registrations: currentSubagentPromptRegistrationCatalog(),
259
+ });
260
+ if (!resolved.snapshot)
261
+ throw new Error(`Profile ${request.profile} could not be resolved for preparation.`);
262
+ const prepared = prepareForgeDelegation({
263
+ snapshot: resolved.snapshot,
264
+ task: request.task,
265
+ access: request.access,
266
+ backend: request.backend,
267
+ cwd: snapshot.cwd,
268
+ });
269
+ return {
270
+ profileId: request.profile,
271
+ model: { ...request.backend.model },
272
+ thinkingLevel: request.backend.thinkingLevel,
273
+ systemPrompt: prepared.systemPrompt,
274
+ messages: prepared.messages,
275
+ effectiveToolIds: prepared.effectiveToolIds,
276
+ effectiveToolNames: prepared.effectiveToolNames,
277
+ diagnostics: prepared.diagnostics,
278
+ profileSnapshot: resolved.snapshot,
279
+ preparedAt: prepared.preparedAt,
280
+ };
281
+ }
282
+ dispose() {
283
+ this.disposeExtensions();
284
+ if (this.host?.isLive)
285
+ this.host.stop();
286
+ this.host = undefined;
287
+ this.current = undefined;
288
+ }
289
+ resolveActive(stacks, options) {
290
+ if (options.suppressAutoActivate && options.activeStackId == null)
291
+ return undefined;
292
+ if (options.activeStackId != null) {
293
+ if (isDisabledPromptStackId(options.activeStackId))
294
+ return undefined;
295
+ const parsed = parseResourceSelector(options.activeStackId);
296
+ if (parsed.ok) {
297
+ const found = createResourceCatalog([...stacks]).resolveSelector(parsed.selector);
298
+ if (found)
299
+ return found;
300
+ }
301
+ // Persisted selection no longer resolves; fall back to the default stack
302
+ // rather than silently starting with no active stack.
303
+ return chooseDefaultStack([...stacks]);
304
+ }
305
+ return chooseDefaultStack([...stacks]);
306
+ }
307
+ publish(next) {
308
+ this.current = deepFreeze(structuredClone(next));
309
+ return this.current;
310
+ }
311
+ get extensionDiagnostics() {
312
+ return this.extensionDiagnosticsValue;
313
+ }
314
+ set extensionDiagnostics(value) {
315
+ this.extensionDiagnosticsValue = value;
316
+ }
317
+ get extensionPaths() {
318
+ return this.extensionPathsValue;
319
+ }
320
+ set extensionPaths(value) {
321
+ this.extensionPathsValue = value;
322
+ }
323
+ extensionDiagnosticsValue = [];
324
+ extensionPathsValue = [];
325
+ }
326
+ function stripUndefined(value) {
327
+ if (Array.isArray(value))
328
+ return value.map(stripUndefined);
329
+ if (value && typeof value === "object") {
330
+ const result = {};
331
+ for (const [key, item] of Object.entries(value)) {
332
+ if (item === undefined)
333
+ continue;
334
+ result[key] = stripUndefined(item);
335
+ }
336
+ return result;
337
+ }
338
+ return value;
339
+ }
340
+ function deepFreeze(value) {
341
+ const freeze = (current) => {
342
+ if (current === null || typeof current !== "object")
343
+ return;
344
+ for (const key of Object.keys(current))
345
+ freeze(current[key]);
346
+ Object.freeze(current);
347
+ };
348
+ freeze(value);
349
+ return value;
350
+ }
351
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
package/docs/README.md CHANGED
@@ -14,8 +14,8 @@ Use this page as the documentation map. Each subject has one authoritative home;
14
14
 
15
15
  - [Web editor](guides/web-editor.md)
16
16
  - [Prompt-stack patterns and examples](guides/use-cases.md)
17
+ - [Migrating to 0.5](guides/migrating-to-0.5.md)
17
18
  - [Foreground delegation](guides/delegation.md) — experimental; read the security boundary before enabling it.
18
- - [SillyTavern import](guides/sillytavern-import.md)
19
19
  - [Custom macros and slots](guides/custom-macros-and-slots.md)
20
20
  - [Prompt and payload debugging](guides/debugging.md)
21
21
 
@@ -27,15 +27,18 @@ Use this page as the documentation map. Each subject has one authoritative home;
27
27
  - [Configuration](reference/configuration.md)
28
28
  - [Implemented feature inventory](reference/features.md)
29
29
  - [Public API policy](reference/public-api.md)
30
- - [Experimental subagent adapter contract](reference/subagent-adapter.md)
30
+ - [Experimental subagent host port contract](reference/subagent-host-port.md)
31
+ - [Experimental UI contribution port contract](reference/ui-contribution-port.md)
31
32
 
32
33
  ## Development
33
34
 
34
35
  - [Development setup and verification](development/setup.md)
36
+ - [Architecture and development rules](development/architecture-rules.md)
37
+ - [0.5 architecture plan](design/architecture-0.5.md)
35
38
  - [Release process](development/release.md)
36
39
  - [Roadmap](development/roadmap.md)
37
40
  - [Complexity review](development/complexity-review.md)
38
41
 
39
- ## Design archive
42
+ ## Architecture and design
40
43
 
41
- [The design archive](design/README.md) records decisions and completed investigations. It is historical context, not current user guidance. Current behavior is documented in the guides and reference pages above.
44
+ [Architecture and design](design/README.md) contains the active 0.5 plan plus historical decisions and investigations. Current released behavior remains documented in the guides and reference pages above.
@@ -55,6 +55,6 @@ Provenance is branch-scoped status metadata, not ownership. Reload, resume, tree
55
55
 
56
56
  ## Delegation is separate
57
57
 
58
- Ordinary profiles cannot be delegated by default. The trusted project's `.pi/forge/config.json` separately authorizes eligible profile IDs and host-specific backend/timeout choices. Deleting a profile removes its delegation policy so a later same-ID profile cannot inherit authority.
58
+ Ordinary profiles cannot be delegated by default. Delegation authorization is owned by the optional `@zihanw/pi-forge-subagents` package in dedicated files, using canonical `project:<id>` or `global:<id>` keys with per-profile backend/timeout overrides. Bare authorization keys are project-only compatibility aliases regardless of file location. The main package reads no subagent configuration, and deleting a profile does not touch `subagents.json`.
59
59
 
60
60
  Read the [experimental delegation guide](../guides/delegation.md) before enabling it.
@@ -33,7 +33,7 @@ A slot renders current Pi data at that position:
33
33
  }
34
34
  ```
35
35
 
36
- Slots cover conversation history, tools, tool guidance, skills, project context, appended system text, variables, model, date, and working directory. See [macros and slots](../reference/macros-and-slots.md).
36
+ Slots cover conversation history, tools, tool guidance, skills, project context, appended system text, model, date, and working directory. See [macros and slots](../reference/macros-and-slots.md).
37
37
 
38
38
  ## Compilation order
39
39
 
@@ -42,7 +42,7 @@ For each new user turn, pi-forge:
42
42
  1. Orders enabled blocks and slots exactly as written.
43
43
  2. Builds `system` content and applies the stack's `replace`, `append`, or `prepend` mode.
44
44
  3. Inserts synthetic user/assistant messages around the movable `chat-history` slot.
45
- 4. Expands built-in, variable, and trusted custom macros.
45
+ 4. Compiles forge-v1 templates over `runtime.*`, `parameters.*`, and `extensions.*`.
46
46
  5. Applies the stack's tool policy to Pi and filters skills rendered by pi-forge.
47
47
  6. Applies outgoing history/compiled regex rules.
48
48
  7. Optionally applies destructive finalize rules when an assistant message completes.
@@ -64,7 +64,7 @@ Use `replace` when the model-visible skill list must be controlled. With `append
64
64
  1. Long-lived system rules.
65
65
  2. Runtime tools and project context.
66
66
  3. Chat history with `includeLastUserMessage: false`.
67
- 4. A final user block containing `{{lastUserMessage}}`.
67
+ 4. A final user block containing `{{ runtime.lastUserMessage }}`.
68
68
 
69
69
  This preserves prior context while presenting the current request once, in an explicit final position. History can also filter summaries and roles, drop previous tool traffic, strip assistant thinking, and limit recent messages or characters. pi-forge repairs dangling tool-call/result pairs after filtering.
70
70
 
@@ -83,13 +83,13 @@ Stacks may live in the user-global `~/.pi/forge/prompt-stacks/` or the project `
83
83
  - A stack may set `autoActivate: true`; conflicting auto-activation in one scope is invalid and fails closed.
84
84
  - `default.json` has no special filename role anymore; missing `autoActivate` yields a migration warning.
85
85
  - `/preset use none` records an explicit session opt-out.
86
- - Active stack and session variables follow Pi's session-tree branch.
86
+ - Active stack selection follows Pi's session-tree branch.
87
87
  - Restored branch state takes precedence over fresh-session auto-activation.
88
88
  - Project auto-activation candidates take precedence over global ones; an invalid or ambiguous project candidate never falls back to a global stack.
89
89
  - An auto-activated agent profile takes precedence over standalone stack autoload.
90
90
 
91
91
  ## Extensions and transforms
92
92
 
93
- Static, turn, and session variables support nested macros and lazy conditionals. Trusted JavaScript/TypeScript registration modules can add macros and slots without putting executable code in stack JSON. Deterministic regex rules can transform model-bound prompt text or, with an explicit warning, replace finalized assistant transcript text.
93
+ Immutable `parameters` support forge-v1 interpolation and pure filters; tool/slot conditionals use `runtime.tool.*` / `runtime.slot.*` booleans. Trusted JavaScript/TypeScript registration modules can add macros and slots without putting executable code in stack JSON. Deterministic regex rules can transform model-bound prompt text or, with an explicit warning, replace finalized assistant transcript text.
94
94
 
95
95
  See [custom macros and slots](../guides/custom-macros-and-slots.md), [macro reference](../reference/macros-and-slots.md), and [regex schema](../reference/stack-schema.md#regex-transforms).