@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
package/dist/storage.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { existsSync, lstatSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { isAbsolute, join, relative, resolve, sep } from "node:path";
4
+ /** Development/test override for the user-owned global Forge root. */
5
+ export const GLOBAL_FORGE_DIR_ENV = "PI_FORGE_GLOBAL_DIR";
4
6
  export function promptStacksDir(cwd) {
5
7
  return join(cwd, ".pi", "forge", "prompt-stacks");
6
8
  }
@@ -16,15 +18,7 @@ export function isInsideAgentProfileStorage(cwd, filePath) {
16
18
  export function isSafeAgentProfileMutationPath(cwd, filePath) {
17
19
  if (!isInsideAgentProfileStorage(cwd, filePath))
18
20
  return false;
19
- const root = resolve(cwd);
20
- const target = resolve(filePath);
21
- let current = root;
22
- for (const segment of relative(root, target).split(sep)) {
23
- current = join(current, segment);
24
- if (existsSync(current) && lstatSync(current).isSymbolicLink())
25
- return false;
26
- }
27
- return true;
21
+ return pathTraversesNoSymlink(cwd, filePath);
28
22
  }
29
23
  export function forgeDir(cwd) {
30
24
  return join(cwd, ".pi", "forge");
@@ -33,11 +27,28 @@ export function forgeExtensionsDir(cwd) {
33
27
  return join(forgeDir(cwd), "extensions");
34
28
  }
35
29
  export function globalForgeDir() {
36
- return join(homedir(), ".pi", "forge");
30
+ return process.env[GLOBAL_FORGE_DIR_ENV] ?? join(homedir(), ".pi", "forge");
31
+ }
32
+ export function globalPromptStacksDir() {
33
+ return join(globalForgeDir(), "prompt-stacks");
34
+ }
35
+ export function globalAgentProfilesDir() {
36
+ return join(globalForgeDir(), "agent-profiles");
37
+ }
38
+ export function globalAgentProfilePath(id) {
39
+ return join(globalAgentProfilesDir(), `${id}.json`);
37
40
  }
38
41
  export function globalForgeExtensionsDir() {
39
42
  return join(globalForgeDir(), "extensions");
40
43
  }
44
+ export function isInsideGlobalAgentProfileStorage(filePath) {
45
+ return isInsideDir(globalAgentProfilesDir(), filePath);
46
+ }
47
+ export function isSafeGlobalAgentProfileMutationPath(filePath) {
48
+ if (!isInsideGlobalAgentProfileStorage(filePath))
49
+ return false;
50
+ return pathTraversesNoSymlink(globalForgeDir(), filePath);
51
+ }
41
52
  export function legacyPromptStacksDir(cwd) {
42
53
  return join(cwd, ".pi", "prompt-stacks");
43
54
  }
@@ -50,10 +61,34 @@ export function promptStackPath(cwd, id) {
50
61
  export function isInsidePromptStackStorage(cwd, filePath) {
51
62
  return promptStackReadDirs(cwd).some((dir) => isInsideDir(dir, filePath));
52
63
  }
64
+ export function isSafePromptStackMutationPath(cwd, filePath) {
65
+ if (!isInsidePromptStackStorage(cwd, filePath))
66
+ return false;
67
+ return pathTraversesNoSymlink(cwd, filePath);
68
+ }
69
+ export function isInsideGlobalPromptStackStorage(filePath) {
70
+ return isInsideDir(globalPromptStacksDir(), filePath);
71
+ }
72
+ export function isSafeGlobalPromptStackMutationPath(filePath) {
73
+ if (!isInsideGlobalPromptStackStorage(filePath))
74
+ return false;
75
+ return pathTraversesNoSymlink(globalForgeDir(), filePath);
76
+ }
53
77
  function isInsideDir(rootDir, filePath) {
54
78
  const root = resolve(rootDir);
55
79
  const target = resolve(filePath);
56
80
  const rel = relative(root, target);
57
81
  return !!rel && !rel.startsWith("..") && !isAbsolute(rel);
58
82
  }
83
+ function pathTraversesNoSymlink(root, filePath) {
84
+ const resolvedRoot = resolve(root);
85
+ const target = resolve(filePath);
86
+ let current = resolvedRoot;
87
+ for (const segment of relative(resolvedRoot, target).split(sep)) {
88
+ current = join(current, segment);
89
+ if (existsSync(current) && lstatSync(current).isSymbolicLink())
90
+ return false;
91
+ }
92
+ return true;
93
+ }
59
94
  //# sourceMappingURL=storage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { AgentProfile } from "../agent-profile.ts";
2
+ import type { PromptStack } from "../types.ts";
3
+ /**
4
+ * Forge-owned canonical JSON + `sha256:v1` fingerprints.
5
+ *
6
+ * Vendored from @zihanw/pi-subagent-runtime's canonical implementation so the
7
+ * main package carries no runtime dependency. The algorithm is byte-for-byte
8
+ * identical (key-sorted plain objects, undefined properties omitted, finite
9
+ * numbers only, -0 normalized, no cycles/sparse arrays/non-plain objects), so
10
+ * fingerprints the host issues into profile snapshots stay comparable with
11
+ * values the optional package recomputes through the runtime. Golden vectors
12
+ * are pinned in tests/subagent-host.test.ts.
13
+ *
14
+ * The host never computes conversation/execution fingerprints; those are
15
+ * issued by the runtime during plan sealing in the optional package.
16
+ */
17
+ export declare const SUBAGENT_FINGERPRINT_PREFIX: "sha256:v1:";
18
+ export type SubagentFingerprint = `${typeof SUBAGENT_FINGERPRINT_PREFIX}${string}`;
19
+ export declare function canonicalSubagentJson(value: unknown): string;
20
+ export declare function subagentFingerprint(value: unknown): SubagentFingerprint;
21
+ /** Host-owned source provenance: profile and prompt-stack content fingerprints. */
22
+ export declare function subagentSourceProfileFingerprint(profile: AgentProfile): SubagentFingerprint;
23
+ export declare function subagentPromptStackFingerprint(stack: PromptStack): SubagentFingerprint;
24
+ //# sourceMappingURL=fingerprints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprints.d.ts","sourceRoot":"","sources":["../../src/subagent/fingerprints.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,2BAA2B,EAAG,YAAqB,CAAC;AACjE,MAAM,MAAM,mBAAmB,GAAG,GAAG,OAAO,2BAA2B,GAAG,MAAM,EAAE,CAAC;AAEnF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE5D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAKvE;AAED,mFAAmF;AACnF,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,YAAY,GAAG,mBAAmB,CAE3F;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAEtF"}
@@ -0,0 +1,81 @@
1
+ import { createHash } from "node:crypto";
2
+ /**
3
+ * Forge-owned canonical JSON + `sha256:v1` fingerprints.
4
+ *
5
+ * Vendored from @zihanw/pi-subagent-runtime's canonical implementation so the
6
+ * main package carries no runtime dependency. The algorithm is byte-for-byte
7
+ * identical (key-sorted plain objects, undefined properties omitted, finite
8
+ * numbers only, -0 normalized, no cycles/sparse arrays/non-plain objects), so
9
+ * fingerprints the host issues into profile snapshots stay comparable with
10
+ * values the optional package recomputes through the runtime. Golden vectors
11
+ * are pinned in tests/subagent-host.test.ts.
12
+ *
13
+ * The host never computes conversation/execution fingerprints; those are
14
+ * issued by the runtime during plan sealing in the optional package.
15
+ */
16
+ export const SUBAGENT_FINGERPRINT_PREFIX = "sha256:v1:";
17
+ export function canonicalSubagentJson(value) {
18
+ return canonicalize(value, "$", new Set());
19
+ }
20
+ export function subagentFingerprint(value) {
21
+ const digest = createHash("sha256")
22
+ .update(canonicalSubagentJson(value))
23
+ .digest("hex");
24
+ return `${SUBAGENT_FINGERPRINT_PREFIX}${digest}`;
25
+ }
26
+ /** Host-owned source provenance: profile and prompt-stack content fingerprints. */
27
+ export function subagentSourceProfileFingerprint(profile) {
28
+ return subagentFingerprint(profile);
29
+ }
30
+ export function subagentPromptStackFingerprint(stack) {
31
+ return subagentFingerprint(stack);
32
+ }
33
+ function canonicalize(value, path, ancestors) {
34
+ if (value === null)
35
+ return "null";
36
+ if (typeof value === "string" || typeof value === "boolean") {
37
+ return JSON.stringify(value);
38
+ }
39
+ if (typeof value === "number") {
40
+ if (!Number.isFinite(value)) {
41
+ throw new TypeError(`Cannot fingerprint non-finite number at ${path}.`);
42
+ }
43
+ return JSON.stringify(Object.is(value, -0) ? 0 : value);
44
+ }
45
+ if (typeof value !== "object" || value === undefined) {
46
+ throw new TypeError(`Cannot fingerprint ${typeof value} at ${path}.`);
47
+ }
48
+ if (ancestors.has(value)) {
49
+ throw new TypeError(`Cannot fingerprint cyclic value at ${path}.`);
50
+ }
51
+ ancestors.add(value);
52
+ try {
53
+ if (Array.isArray(value)) {
54
+ const items = [];
55
+ for (let index = 0; index < value.length; index += 1) {
56
+ if (!Object.hasOwn(value, index)) {
57
+ throw new TypeError(`Cannot fingerprint sparse array item at ${path}[${index}].`);
58
+ }
59
+ items.push(canonicalize(value[index], `${path}[${index}]`, ancestors));
60
+ }
61
+ return `[${items.join(",")}]`;
62
+ }
63
+ const prototype = Object.getPrototypeOf(value);
64
+ if (prototype !== Object.prototype && prototype !== null) {
65
+ throw new TypeError(`Cannot fingerprint non-plain object at ${path}.`);
66
+ }
67
+ const record = value;
68
+ const keys = Object.keys(record)
69
+ .filter((key) => record[key] !== undefined)
70
+ .sort();
71
+ const properties = keys.map((key) => {
72
+ const property = canonicalize(record[key], `${path}.${key}`, ancestors);
73
+ return `${JSON.stringify(key)}:${property}`;
74
+ });
75
+ return `{${properties.join(",")}}`;
76
+ }
77
+ finally {
78
+ ancestors.delete(value);
79
+ }
80
+ }
81
+ //# sourceMappingURL=fingerprints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprints.js","sourceRoot":"","sources":["../../src/subagent/fingerprints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,296 @@
1
+ import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
2
+ import type { SubagentFingerprint } from "./fingerprints.ts";
3
+ /**
4
+ * Cross-extension Forge host port v1 over the Pi event bus.
5
+ *
6
+ * This is the in-process RPC contract used by the optional subagent package to
7
+ * discover the active main pi-forge host and invoke its three minimal
8
+ * operations (discovery, profile listing, and prompt preparation). Messages
9
+ * are plain, recursively validated, JSON-compatible data only — no functions,
10
+ * live contexts, or internal registries cross the bus. The port itself is not
11
+ * a trust boundary.
12
+ *
13
+ * Ownership: the main pi-forge host owns profiles, stacks, and prompt
14
+ * compilation. The optional package sends resource selectors + task + backend
15
+ * facts and receives immutable preparation artifacts back.
16
+ */
17
+ export declare const FORGE_HOST_PORT_VERSION = 1;
18
+ export declare const FORGE_HOST_PORT_NAMESPACE = "@zihanw/pi-forge/host/v1";
19
+ export declare const FORGE_HOST_PORT_OPERATIONS: readonly ["listProfiles", "resolveProfile", "prepare"];
20
+ export type ForgeHostPortOperation = (typeof FORGE_HOST_PORT_OPERATIONS)[number];
21
+ export declare const FORGE_HOST_CHANNEL: {
22
+ readonly discover: "@zihanw/pi-forge/host/v1/discover";
23
+ readonly available: "@zihanw/pi-forge/host/v1/available";
24
+ readonly request: "@zihanw/pi-forge/host/v1/request";
25
+ readonly reply: "@zihanw/pi-forge/host/v1/reply";
26
+ readonly unavailable: "@zihanw/pi-forge/host/v1/unavailable";
27
+ };
28
+ export interface ForgeHostTransport {
29
+ emit(channel: string, data: unknown): void;
30
+ on(channel: string, handler: (data: unknown) => void): () => void;
31
+ }
32
+ export type ForgeHostWireMessage = {
33
+ type: "discover";
34
+ protocolVersion: number;
35
+ minVersion: number;
36
+ maxVersion: number;
37
+ clientId: string;
38
+ } | {
39
+ type: "available";
40
+ hostId: string;
41
+ protocolVersion: number;
42
+ minVersion: number;
43
+ maxVersion: number;
44
+ capabilities: string[];
45
+ generation: number;
46
+ } | {
47
+ type: "request";
48
+ requestId: string;
49
+ hostId: string;
50
+ generation: number;
51
+ operation: string;
52
+ payload: unknown;
53
+ } | {
54
+ type: "reply";
55
+ requestId: string;
56
+ hostId: string;
57
+ generation: number;
58
+ ok: boolean;
59
+ data?: unknown;
60
+ error?: string;
61
+ } | {
62
+ type: "unavailable";
63
+ hostId: string;
64
+ generation: number;
65
+ };
66
+ export type ForgeHostPortResult = {
67
+ ok: true;
68
+ data: unknown;
69
+ } | {
70
+ ok: false;
71
+ error: string;
72
+ };
73
+ export interface ForgeHostOptions {
74
+ hostId?: string;
75
+ capabilities?: readonly string[];
76
+ minVersion?: number;
77
+ maxVersion?: number;
78
+ /** Operation handler; must never throw across the bus. */
79
+ handle(operation: string, payload: unknown): ForgeHostPortResult;
80
+ }
81
+ export interface ForgeHostConnection {
82
+ hostId: string;
83
+ protocolVersion: number;
84
+ capabilities: readonly string[];
85
+ generation: number;
86
+ }
87
+ export interface ForgeProfileSummary {
88
+ profileId: string;
89
+ scope: "project" | "global";
90
+ name?: string;
91
+ description?: string;
92
+ autoActivate?: boolean;
93
+ model: {
94
+ provider: string;
95
+ id: string;
96
+ };
97
+ thinkingLevel: string;
98
+ promptStack: string | null;
99
+ usable: boolean;
100
+ diagnostics: Array<{
101
+ level: string;
102
+ message: string;
103
+ field?: string;
104
+ }>;
105
+ }
106
+ export interface ForgeListProfilesResponse {
107
+ profiles: ForgeProfileSummary[];
108
+ }
109
+ /**
110
+ * Wire diagnostic shape for delegation resolution and preparation.
111
+ * Structurally compatible with the optional package's `SubagentDiagnostic`.
112
+ */
113
+ export interface ForgeDelegationDiagnostic {
114
+ level: "error" | "warning" | "info";
115
+ code: string;
116
+ message: string;
117
+ path?: string;
118
+ }
119
+ /** Host-compiled delegation message as carried over the wire (text-only). */
120
+ export interface ForgeDelegationMessage {
121
+ role: "user" | "assistant" | "custom";
122
+ content: Array<{
123
+ type: "text";
124
+ text: string;
125
+ }>;
126
+ protectedTask?: boolean;
127
+ source?: "prompt-stack" | "delegated-task";
128
+ }
129
+ export type ForgePromptDependencyKind = "macro" | "slot";
130
+ export interface ForgePromptDependency {
131
+ kind: ForgePromptDependencyKind;
132
+ name: string;
133
+ identity: string;
134
+ source?: string;
135
+ }
136
+ /**
137
+ * Minimal structural mirror of the host-owned agent profile carried over the
138
+ * wire. The host owns the schema: at runtime extra fields may pass through for
139
+ * forward compatibility, but consumers must only rely on the fields below.
140
+ */
141
+ export interface ForgeWireAgentProfile {
142
+ schemaVersion: 1;
143
+ type: string;
144
+ id: string;
145
+ name?: string;
146
+ description?: string;
147
+ autoActivate?: boolean;
148
+ model: {
149
+ provider: string;
150
+ id: string;
151
+ };
152
+ thinkingLevel: ThinkingLevel;
153
+ promptStack: string | null;
154
+ }
155
+ /**
156
+ * Minimal structural mirror of the host-owned prompt stack carried over the
157
+ * wire. Same forward-compat rule as ForgeWireAgentProfile.
158
+ */
159
+ export interface ForgeWirePromptStack {
160
+ id: string;
161
+ tools?: {
162
+ allow?: string[];
163
+ deny?: never;
164
+ } | {
165
+ allow?: never;
166
+ deny?: string[];
167
+ };
168
+ }
169
+ /**
170
+ * Immutable host-owned profile snapshot artifact returned by `resolveProfile`
171
+ * and embedded in `prepare` responses. The wire schema version is shared with
172
+ * the optional package's `AgentProfileSnapshot` by design.
173
+ */
174
+ export interface ForgeProfileSnapshot {
175
+ schemaVersion: 1;
176
+ /** Canonical scoped selector of the resolved profile (`project:<id>` or `global:<id>`). */
177
+ profileId: string;
178
+ profile: ForgeWireAgentProfile;
179
+ /** Canonical scoped selector of the resolved prompt stack, or null. */
180
+ promptStackId: string | null;
181
+ promptStack: ForgeWirePromptStack | null;
182
+ dependencies: ForgePromptDependency[];
183
+ profileFingerprint: SubagentFingerprint;
184
+ promptStackFingerprint: SubagentFingerprint | null;
185
+ }
186
+ export interface ForgeResolveProfileRequest {
187
+ profile: string;
188
+ }
189
+ export interface ForgeResolveProfileResponse {
190
+ /** Immutable host-owned AgentProfileSnapshot artifact (profile + stack + fingerprints). */
191
+ snapshot: ForgeProfileSnapshot;
192
+ }
193
+ /**
194
+ * Prompt-compilation access facts only — what Forge's tool negotiation reads.
195
+ * This intentionally is NOT the runtime `AgentRequest.access`; the optional
196
+ * package projects its own runtime access request onto these three facts.
197
+ */
198
+ export interface ForgePromptAccessFacts {
199
+ level: "none" | "read-only" | "workspace-write";
200
+ network: "deny" | "allow";
201
+ allowProcess: boolean;
202
+ }
203
+ export interface ForgeBackendTool {
204
+ id: string;
205
+ name?: string;
206
+ effects?: string[];
207
+ }
208
+ export interface ForgeBackendFacts {
209
+ model: {
210
+ provider: string;
211
+ id: string;
212
+ };
213
+ thinkingLevel: string;
214
+ toolCatalog: ForgeBackendTool[];
215
+ }
216
+ export interface ForgePrepareRequest {
217
+ profile: string;
218
+ task: {
219
+ text: string;
220
+ };
221
+ access: ForgePromptAccessFacts;
222
+ backend: ForgeBackendFacts;
223
+ }
224
+ export interface ForgePrepareResponse {
225
+ profileId: string;
226
+ model: {
227
+ provider: string;
228
+ id: string;
229
+ };
230
+ thinkingLevel: string;
231
+ systemPrompt: string;
232
+ messages: ForgeDelegationMessage[];
233
+ effectiveToolIds: string[];
234
+ effectiveToolNames: string[];
235
+ diagnostics: ForgeDelegationDiagnostic[];
236
+ profileSnapshot: ForgeProfileSnapshot;
237
+ preparedAt: string;
238
+ }
239
+ export declare class ForgeHostPortError extends Error {
240
+ readonly code: "timeout" | "duplicate" | "unavailable" | "protocol" | "invalid";
241
+ constructor(code: ForgeHostPortError["code"], message: string);
242
+ }
243
+ export type ValidationResult<T = unknown> = {
244
+ ok: true;
245
+ data: T;
246
+ } | {
247
+ ok: false;
248
+ error: string;
249
+ };
250
+ export declare function validateListProfilesRequest(value: unknown): ValidationResult<Record<string, never>>;
251
+ export declare function validateListProfilesResponse(value: unknown): ValidationResult<ForgeListProfilesResponse>;
252
+ export declare function validateResolveProfileRequest(value: unknown): ValidationResult<ForgeResolveProfileRequest>;
253
+ export declare function validateResolveProfileResponse(value: unknown): ValidationResult<ForgeResolveProfileResponse>;
254
+ export declare function validatePrepareRequest(value: unknown): ValidationResult<ForgePrepareRequest>;
255
+ export declare function validatePrepareResponse(value: unknown): ValidationResult<ForgePrepareResponse>;
256
+ export declare class ForgeHost {
257
+ private readonly transport;
258
+ private readonly options;
259
+ readonly hostId: string;
260
+ private generationId;
261
+ private started;
262
+ private unsubscribers;
263
+ constructor(transport: ForgeHostTransport, options: ForgeHostOptions);
264
+ get generation(): number;
265
+ get isLive(): boolean;
266
+ private availableMessage;
267
+ start(): void;
268
+ stop(): void;
269
+ private onDiscover;
270
+ private onRequest;
271
+ }
272
+ export interface ForgeHostClientOptions {
273
+ clientId?: string;
274
+ defaultTimeoutMs?: number;
275
+ /** How long after the first compatible host reply to keep collecting others before deciding. */
276
+ discoverSettleMs?: number;
277
+ }
278
+ export declare class ForgeHostClient {
279
+ private readonly transport;
280
+ readonly clientId: string;
281
+ private readonly defaultTimeoutMs;
282
+ private readonly discoverSettleMs;
283
+ private connectionUnsubscribe?;
284
+ private unavailableHandlers;
285
+ private activeConnection?;
286
+ constructor(transport: ForgeHostTransport, options?: ForgeHostClientOptions);
287
+ onUnavailable(handler: () => void): () => void;
288
+ private teardownPersistentListener;
289
+ private onUnavailableMessage;
290
+ discover(timeoutMs?: number): Promise<ForgeHostConnection>;
291
+ connect(connection: ForgeHostConnection): ForgeHostConnection;
292
+ request(connection: ForgeHostConnection, operation: string, payload: unknown, timeoutMs?: number): Promise<ForgeHostPortResult>;
293
+ disconnect(): void;
294
+ get subscriptionCount(): number;
295
+ }
296
+ //# sourceMappingURL=host-port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-port.d.ts","sourceRoot":"","sources":["../../src/subagent/host-port.ts"],"names":[],"mappings":"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"}